185 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			185 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Python
		
	
	
	
import os, StringIO
 | 
						|
 | 
						|
import py
 | 
						|
 | 
						|
from py.__.test import resultlog
 | 
						|
from py.__.test.collect import Node, Item, FSCollector
 | 
						|
from py.__.test.event import EventBus
 | 
						|
from py.__.test.event import ItemTestReport, CollectionReport
 | 
						|
from py.__.test.event import InternalException
 | 
						|
from py.__.test.runner import OutcomeRepr
 | 
						|
 | 
						|
 | 
						|
class Fake(object):
 | 
						|
    def __init__(self, **kwds):
 | 
						|
        self.__dict__.update(kwds)
 | 
						|
 | 
						|
 | 
						|
def test_generic_path():
 | 
						|
    p1 = Node('a', config='dummy')
 | 
						|
    assert p1.fspath is None
 | 
						|
    p2 = Node('B', parent=p1)
 | 
						|
    p3 = Node('()', parent = p2)
 | 
						|
    item = Item('c', parent = p3)
 | 
						|
 | 
						|
    res = resultlog.generic_path(item)
 | 
						|
    assert res == 'a.B().c'
 | 
						|
 | 
						|
    p0 = FSCollector('proj/test', config='dummy')
 | 
						|
    p1 = FSCollector('proj/test/a', parent=p0)
 | 
						|
    p2 = Node('B', parent=p1)
 | 
						|
    p3 = Node('()', parent = p2)
 | 
						|
    p4 = Node('c', parent=p3)
 | 
						|
    item = Item('[1]', parent = p4)
 | 
						|
 | 
						|
    res = resultlog.generic_path(item)
 | 
						|
    assert res == 'test/a:B().c[1]'
 | 
						|
 | 
						|
 | 
						|
def make_item(*names):
 | 
						|
    node = None
 | 
						|
    config = "dummy"
 | 
						|
    for name in names[:-1]:
 | 
						|
        if '/' in name:
 | 
						|
            node = FSCollector(name, parent=node, config=config)
 | 
						|
        else:
 | 
						|
            node = Node(name, parent=node, config=config)
 | 
						|
    if names[-1] is None:
 | 
						|
        return node
 | 
						|
    return Item(names[-1], parent=node)
 | 
						|
 | 
						|
class TestResultLog(object):
 | 
						|
 | 
						|
    def test_create(self):
 | 
						|
        bus = EventBus()
 | 
						|
        logfile = object()
 | 
						|
        
 | 
						|
        reslog = resultlog.ResultLog(bus, logfile)
 | 
						|
        assert len(bus._subscribers) == 1
 | 
						|
        assert reslog.logfile is logfile
 | 
						|
 | 
						|
    def test_write_log_entry(self):
 | 
						|
        reslog = resultlog.ResultLog(EventBus(), None)
 | 
						|
 | 
						|
        reslog.logfile = StringIO.StringIO()
 | 
						|
        reslog.write_log_entry('.', 'name', '')  
 | 
						|
        entry = reslog.logfile.getvalue()
 | 
						|
        assert entry[-1] == '\n'        
 | 
						|
        entry_lines = entry.splitlines()
 | 
						|
        assert len(entry_lines) == 1
 | 
						|
        assert entry_lines[0] == '. name'
 | 
						|
 | 
						|
        reslog.logfile = StringIO.StringIO()
 | 
						|
        reslog.write_log_entry('s', 'name', 'Skipped')  
 | 
						|
        entry = reslog.logfile.getvalue()
 | 
						|
        assert entry[-1] == '\n'        
 | 
						|
        entry_lines = entry.splitlines()
 | 
						|
        assert len(entry_lines) == 2
 | 
						|
        assert entry_lines[0] == 's name'
 | 
						|
        assert entry_lines[1] == ' Skipped'
 | 
						|
 | 
						|
        reslog.logfile = StringIO.StringIO()
 | 
						|
        reslog.write_log_entry('s', 'name', 'Skipped\n')  
 | 
						|
        entry = reslog.logfile.getvalue()
 | 
						|
        assert entry[-1] == '\n'        
 | 
						|
        entry_lines = entry.splitlines()
 | 
						|
        assert len(entry_lines) == 2
 | 
						|
        assert entry_lines[0] == 's name'
 | 
						|
        assert entry_lines[1] == ' Skipped'
 | 
						|
 | 
						|
        reslog.logfile = StringIO.StringIO()
 | 
						|
        longrepr = ' tb1\n tb 2\nE tb3\nSome Error'
 | 
						|
        reslog.write_log_entry('F', 'name', longrepr)
 | 
						|
        entry = reslog.logfile.getvalue()
 | 
						|
        assert entry[-1] == '\n'        
 | 
						|
        entry_lines = entry.splitlines()
 | 
						|
        assert len(entry_lines) == 5
 | 
						|
        assert entry_lines[0] == 'F name'
 | 
						|
        assert entry_lines[1:] == [' '+line for line in longrepr.splitlines()]
 | 
						|
    
 | 
						|
    def test_log_outcome(self):
 | 
						|
        reslog = resultlog.ResultLog(EventBus(), StringIO.StringIO())
 | 
						|
 | 
						|
        colitem = make_item('some', 'path', 'a', 'b')
 | 
						|
 | 
						|
        try:
 | 
						|
            raise ValueError
 | 
						|
        except ValueError:
 | 
						|
            the_repr = py.code.ExceptionInfo().getrepr()
 | 
						|
 | 
						|
        outcome=OutcomeRepr('execute', 'F', the_repr)
 | 
						|
        ev = Fake(colitem=colitem, outcome=outcome)
 | 
						|
 | 
						|
        reslog.log_outcome(ev)
 | 
						|
 | 
						|
        entry = reslog.logfile.getvalue()
 | 
						|
        entry_lines = entry.splitlines()
 | 
						|
 | 
						|
        assert entry_lines[0] == 'F some.path.a.b'
 | 
						|
        assert entry_lines[-1][0] == ' '
 | 
						|
        assert 'ValueError' in entry
 | 
						|
 | 
						|
    def test_item_test_passed(self):
 | 
						|
        bus = EventBus()
 | 
						|
        reslog = resultlog.ResultLog(bus, StringIO.StringIO())
 | 
						|
 | 
						|
        colitem = make_item('proj/test', 'proj/test/mod', 'a', 'b')
 | 
						|
 | 
						|
        outcome=OutcomeRepr('execute', '.', '')
 | 
						|
        rep_ev = ItemTestReport(colitem, passed=outcome)
 | 
						|
 | 
						|
        bus.notify(rep_ev)
 | 
						|
 | 
						|
        lines = reslog.logfile.getvalue().splitlines()
 | 
						|
        assert len(lines) == 1
 | 
						|
        line = lines[0]
 | 
						|
        assert line.startswith(". ")
 | 
						|
        assert line[2:] == 'test/mod:a.b'
 | 
						|
 | 
						|
    def test_collection_report(self):
 | 
						|
        bus = EventBus()        
 | 
						|
        reslog = resultlog.ResultLog(bus, None)
 | 
						|
 | 
						|
        reslog.logfile = StringIO.StringIO()
 | 
						|
        colitem = make_item('proj/test', 'proj/test/mod', 'A', None)
 | 
						|
        outcome=OutcomeRepr('execute', '', '')
 | 
						|
        rep_ev = CollectionReport(colitem, object(), passed=outcome)
 | 
						|
 | 
						|
        bus.notify(rep_ev)
 | 
						|
 | 
						|
        entry = reslog.logfile.getvalue()
 | 
						|
        assert not entry
 | 
						|
 | 
						|
        reslog.logfile = StringIO.StringIO()
 | 
						|
        outcome=OutcomeRepr('execute', 'F', 'Some Error')
 | 
						|
        rep_ev = CollectionReport(colitem, object(), failed=outcome)        
 | 
						|
 | 
						|
        bus.notify(rep_ev)
 | 
						|
 | 
						|
        lines = reslog.logfile.getvalue().splitlines()        
 | 
						|
        assert len(lines) == 2
 | 
						|
        assert lines[0] == 'F test/mod:A'
 | 
						|
 | 
						|
    def test_internal_exception(self):
 | 
						|
        # they are produced for example by a teardown failing
 | 
						|
        # at the end of the run
 | 
						|
        bus = EventBus()
 | 
						|
        reslog = resultlog.ResultLog(bus, StringIO.StringIO())        
 | 
						|
 | 
						|
        try:
 | 
						|
            raise ValueError
 | 
						|
        except ValueError:
 | 
						|
            excinfo = py.code.ExceptionInfo()
 | 
						|
 | 
						|
        internal = InternalException(excinfo)
 | 
						|
 | 
						|
        bus.notify(internal)
 | 
						|
 | 
						|
        entry = reslog.logfile.getvalue()
 | 
						|
        entry_lines = entry.splitlines()
 | 
						|
 | 
						|
        assert entry_lines[0].startswith('! ')
 | 
						|
        assert os.path.basename(__file__)[:-1] in entry_lines[0] #.py/.pyc
 | 
						|
        assert entry_lines[-1][0] == ' '
 | 
						|
        assert 'ValueError' in entry  
 |