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
|