354 lines
10 KiB
Python
354 lines
10 KiB
Python
|
|
""" tests of rest reporter backend
|
|
"""
|
|
|
|
import py
|
|
from py.__.test.rsession.testing.test_reporter import AbstractTestReporter,\
|
|
DummyChannel
|
|
from py.__.test.rsession import repevent
|
|
from py.__.test.rsession.rest import RestReporter, NoLinkWriter
|
|
from py.__.rest.rst import *
|
|
from py.__.test.rsession.hostmanage import HostInfo
|
|
from py.__.test.rsession.outcome import Outcome
|
|
|
|
class Container(object):
|
|
def __init__(self, **args):
|
|
for arg, val in args.items():
|
|
setattr(self, arg, val)
|
|
|
|
class RestTestReporter(RestReporter):
|
|
def __init__(self, *args, **kwargs):
|
|
if args:
|
|
super(RestReporter, self).__init__(*args, **kwargs)
|
|
|
|
class TestRestUnits(object):
|
|
def setup_method(self, method):
|
|
config = py.test.config._reparse(["some_sub"])
|
|
config.option.verbose = False
|
|
self.config = config
|
|
hosts = [HostInfo('localhost')]
|
|
method.im_func.func_globals['ch'] = DummyChannel(hosts[0])
|
|
method.im_func.func_globals['reporter'] = r = RestReporter(config,
|
|
hosts)
|
|
method.im_func.func_globals['stdout'] = s = py.std.StringIO.StringIO()
|
|
r.out = s # XXX will need to become a real reporter some time perhaps?
|
|
r.linkwriter = NoLinkWriter()
|
|
|
|
def test_report_unknown(self):
|
|
self.config.option.verbose = True
|
|
reporter.report_unknown('foo')
|
|
assert stdout.getvalue() == 'Unknown report\\: foo\n\n'
|
|
self.config.option.verbose = False
|
|
|
|
def test_report_SendItem(self):
|
|
event = repevent.SendItem(item='foo/bar.py', channel=ch)
|
|
reporter.report(event)
|
|
assert stdout.getvalue() == ''
|
|
stdout.seek(0)
|
|
stdout.truncate()
|
|
reporter.config.option.verbose = True
|
|
reporter.report(event)
|
|
assert stdout.getvalue() == ('sending item foo/bar.py to '
|
|
'localhost\n\n')
|
|
|
|
def test_report_HostRSyncing(self):
|
|
event = repevent.HostRSyncing(HostInfo('localhost:/foo/bar'), "a",
|
|
"b")
|
|
reporter.report(event)
|
|
assert stdout.getvalue() == ('::\n\n localhost: RSYNC ==> '
|
|
'/foo/bar\n\n')
|
|
|
|
def test_report_HostRSyncRootReady(self):
|
|
h = HostInfo('localhost')
|
|
reporter.hosts_to_rsync = 1
|
|
reporter.report(repevent.HostGatewayReady(h, ["a"]))
|
|
event = repevent.HostRSyncRootReady(h, "a")
|
|
reporter.report(event)
|
|
assert stdout.getvalue() == '::\n\n localhost: READY\n\n'
|
|
|
|
def test_report_TestStarted(self):
|
|
event = repevent.TestStarted([HostInfo('localhost'),
|
|
HostInfo('foo.com')],
|
|
"aa", ["a", "b"])
|
|
reporter.report(event)
|
|
assert stdout.getvalue() == """\
|
|
===========================================
|
|
Running tests on hosts\: localhost, foo.com
|
|
===========================================
|
|
|
|
"""
|
|
|
|
def test_report_ItemStart(self):
|
|
class FakeModule(py.test.collect.Module):
|
|
def __init__(self, parent):
|
|
self.parent = parent
|
|
self.fspath = py.path.local('.')
|
|
def _tryiter(self):
|
|
return ['test_foo', 'test_bar']
|
|
def listnames(self):
|
|
return ['package', 'foo', 'bar.py']
|
|
|
|
parent = Container(parent=None, fspath=py.path.local('.'))
|
|
event = repevent.ItemStart(item=FakeModule(parent))
|
|
reporter.report(event)
|
|
assert stdout.getvalue() == """\
|
|
Testing module foo/bar.py (2 items)
|
|
-----------------------------------
|
|
|
|
"""
|
|
|
|
def test_print_summary(self):
|
|
reporter.timestart = 10
|
|
reporter.timeend = 20
|
|
reporter.timersync = 15
|
|
reporter.print_summary(10, '', '')
|
|
assert stdout.getvalue() == """\
|
|
10 tests run in 10.00s (rsync\: 5.00)
|
|
-------------------------------------
|
|
|
|
"""
|
|
|
|
def test_ReceivedItemOutcome_PASSED(self):
|
|
outcome = Outcome()
|
|
item = Container(listnames=lambda: ['', 'foo.py', 'bar', '()', 'baz'])
|
|
event = repevent.ReceivedItemOutcome(channel=ch, outcome=outcome, item=item)
|
|
reporter.report(event)
|
|
assert stdout.getvalue() == ('* localhost\\: **PASSED** '
|
|
'foo.py/bar()/baz\n\n')
|
|
|
|
def test_ReceivedItemOutcome_SKIPPED(self):
|
|
outcome = Outcome(skipped="reason")
|
|
item = Container(listnames=lambda: ['', 'foo.py', 'bar', '()', 'baz'])
|
|
event = repevent.ReceivedItemOutcome(channel=ch, outcome=outcome, item=item)
|
|
reporter.report(event)
|
|
assert stdout.getvalue() == ('* localhost\\: **SKIPPED** '
|
|
'foo.py/bar()/baz\n\n')
|
|
|
|
def test_ReceivedItemOutcome_FAILED(self):
|
|
outcome = Outcome(excinfo="xxx")
|
|
item = Container(listnames=lambda: ['', 'foo.py', 'bar', '()', 'baz'])
|
|
event = repevent.ReceivedItemOutcome(channel=ch, outcome=outcome, item=item)
|
|
reporter.report(event)
|
|
assert stdout.getvalue() == """\
|
|
* localhost\: **FAILED** `traceback0`_ foo.py/bar()/baz
|
|
|
|
"""
|
|
|
|
def test_ReceivedItemOutcome_FAILED_stdout(self):
|
|
excinfo = Container(
|
|
typename='FooError',
|
|
value='A foo has occurred',
|
|
traceback=[
|
|
Container(
|
|
path='foo/bar.py',
|
|
lineno=1,
|
|
relline=1,
|
|
source='foo()',
|
|
),
|
|
Container(
|
|
path='foo/baz.py',
|
|
lineno=4,
|
|
relline=1,
|
|
source='raise FooError("A foo has occurred")',
|
|
),
|
|
]
|
|
)
|
|
outcome = Outcome(excinfo=excinfo)
|
|
outcome.stdout = '<printed>'
|
|
outcome.stderr = ''
|
|
parent = Container(parent=None, fspath=py.path.local('.'))
|
|
item = Container(listnames=lambda: ['', 'foo.py', 'bar', '()', 'baz'],
|
|
parent=parent, fspath=py.path.local('foo'))
|
|
event = repevent.ReceivedItemOutcome(channel=ch, outcome=outcome,
|
|
item=item)
|
|
reporter.report(event)
|
|
reporter.timestart = 10
|
|
reporter.timeend = 20
|
|
reporter.timersync = 15
|
|
reporter.print_summary(10, '', '')
|
|
|
|
reporter.print_summary(1, 'skipped', 'failed')
|
|
out = stdout.getvalue()
|
|
assert out.find('<printed>') > -1
|
|
|
|
def test_skips(self):
|
|
class FakeOutcome(Container, repevent.ReceivedItemOutcome):
|
|
pass
|
|
|
|
class FakeTryiter(Container, repevent.SkippedTryiter):
|
|
pass
|
|
|
|
reporter.skips()
|
|
assert stdout.getvalue() == ''
|
|
reporter.skipped_tests_outcome = [
|
|
FakeOutcome(outcome=Container(skipped='problem X'),
|
|
item=Container(listnames=lambda: ['foo', 'bar.py'])),
|
|
FakeTryiter(excinfo=Container(value='problem Y'),
|
|
item=Container(listnames=lambda: ['foo', 'baz.py']))]
|
|
reporter.skips()
|
|
assert stdout.getvalue() == """\
|
|
Reasons for skipped tests\:
|
|
+++++++++++++++++++++++++++
|
|
|
|
* foo/bar.py\: problem X
|
|
|
|
* foo/baz.py\: problem Y
|
|
|
|
"""
|
|
|
|
def test_failures(self):
|
|
class FakeOutcome(Container, repevent.ReceivedItemOutcome):
|
|
pass
|
|
|
|
parent = Container(parent=None, fspath=py.path.local('.'))
|
|
reporter.failed_tests_outcome = [
|
|
FakeOutcome(
|
|
outcome=Container(
|
|
signal=False,
|
|
excinfo=Container(
|
|
typename='FooError',
|
|
value='A foo has occurred',
|
|
traceback=[
|
|
Container(
|
|
path='foo/bar.py',
|
|
lineno=1,
|
|
relline=1,
|
|
source='foo()',
|
|
),
|
|
Container(
|
|
path='foo/baz.py',
|
|
lineno=4,
|
|
relline=1,
|
|
source='raise FooError("A foo has occurred")',
|
|
),
|
|
]
|
|
),
|
|
stdout='',
|
|
stderr='',
|
|
),
|
|
item=Container(
|
|
listnames=lambda: ['package', 'foo', 'bar.py',
|
|
'baz', '()'],
|
|
parent=parent,
|
|
fspath=py.path.local('.'),
|
|
),
|
|
channel=ch,
|
|
),
|
|
]
|
|
reporter.config.option.tbstyle = 'no'
|
|
reporter.failures()
|
|
expected = """\
|
|
Exceptions\:
|
|
++++++++++++
|
|
|
|
foo/bar.py/baz() on localhost
|
|
+++++++++++++++++++++++++++++
|
|
|
|
.. _`traceback0`:
|
|
|
|
|
|
FooError
|
|
++++++++
|
|
|
|
::
|
|
|
|
A foo has occurred
|
|
|
|
"""
|
|
assert stdout.getvalue() == expected
|
|
|
|
reporter.config.option.tbstyle = 'short'
|
|
stdout.seek(0)
|
|
stdout.truncate()
|
|
reporter.failures()
|
|
expected = """\
|
|
Exceptions\:
|
|
++++++++++++
|
|
|
|
foo/bar.py/baz() on localhost
|
|
+++++++++++++++++++++++++++++
|
|
|
|
.. _`traceback0`:
|
|
|
|
|
|
::
|
|
|
|
foo/bar.py line 1
|
|
foo()
|
|
foo/baz.py line 4
|
|
raise FooError("A foo has occurred")
|
|
|
|
FooError
|
|
++++++++
|
|
|
|
::
|
|
|
|
A foo has occurred
|
|
|
|
"""
|
|
assert stdout.getvalue() == expected
|
|
|
|
reporter.config.option.tbstyle = 'long'
|
|
stdout.seek(0)
|
|
stdout.truncate()
|
|
reporter.failures()
|
|
expected = """\
|
|
Exceptions\:
|
|
++++++++++++
|
|
|
|
foo/bar.py/baz() on localhost
|
|
+++++++++++++++++++++++++++++
|
|
|
|
.. _`traceback0`:
|
|
|
|
|
|
+++++++++++++++++
|
|
foo/bar.py line 1
|
|
+++++++++++++++++
|
|
|
|
::
|
|
|
|
foo()
|
|
|
|
+++++++++++++++++
|
|
foo/baz.py line 4
|
|
+++++++++++++++++
|
|
|
|
::
|
|
|
|
raise FooError("A foo has occurred")
|
|
|
|
FooError
|
|
++++++++
|
|
|
|
::
|
|
|
|
A foo has occurred
|
|
|
|
"""
|
|
assert stdout.getvalue() == expected
|
|
|
|
|
|
class TestRestReporter(AbstractTestReporter):
|
|
reporter = RestReporter
|
|
|
|
def test_failed_to_load(self):
|
|
py.test.skip("Not implemented")
|
|
|
|
def test_report_received_item_outcome(self):
|
|
py.test.skip("Relying on exact output matching")
|
|
val = self.report_received_item_outcome()
|
|
expected = """\
|
|
* localhost\: **FAILED** `traceback0`_\n py/test/rsession/testing/test\_slave.py/funcpass
|
|
|
|
* localhost\: **SKIPPED** py/test/rsession/testing/test\_slave.py/funcpass
|
|
|
|
* localhost\: **FAILED** `traceback1`_\n py/test/rsession/testing/test\_slave.py/funcpass
|
|
|
|
* localhost\: **PASSED** py/test/rsession/testing/test\_slave.py/funcpass
|
|
|
|
"""
|
|
print val
|
|
assert val == expected
|
|
|