test_ok1/py/test/rsession/testing/test_reporter.py

224 lines
7.9 KiB
Python
Raw Normal View History

""" reporter tests.
XXX there are a few disabled reporting tests because
they test for exact formatting as far as i can see.
I think it's rather better to directly invoke a
reporter and pass it some hand-prepared events to see
that running the reporter doesn't break shallowly.
Otherwise, i suppose that some "visual" testing can usually be driven
manually by user-input. And when passing particular events
to a reporter it's also easier to check for one line
instead of having to know the order in which things are printed
etc.
"""
import py, os
#py.test.skip("in progress")
from py.__.test.rsession.rsession import LocalReporter, AbstractSession,\
RemoteReporter
from py.__.test.rsession import repevent
from py.__.test.rsession.outcome import ReprOutcome, Outcome
from py.__.test.rsession.hostmanage import HostInfo
from py.__.test.rsession.box import Box
from py.__.test.rsession.testing.basetest import BasicRsessionTest
import sys
from StringIO import StringIO
class DummyGateway(object):
def __init__(self, host):
self.host = host
class DummyChannel(object):
def __init__(self, host):
self.gateway = DummyGateway(host)
class AbstractTestReporter(BasicRsessionTest):
def prepare_outcomes(self):
# possible outcomes
try:
1/0
except:
exc = py.code.ExceptionInfo()
outcomes = [Outcome(()),
Outcome(skipped=True),
Outcome(excinfo=exc),
Outcome()]
outcomes = [ReprOutcome(outcome.make_repr()) for outcome in outcomes]
outcomes[3].signal = 11
outcomes[0].passed = False
return outcomes
def report_received_item_outcome(self):
item = self.getexample("pass")
outcomes = self.prepare_outcomes()
def boxfun(config, item, outcomes):
hosts = [HostInfo("localhost")]
r = self.reporter(config, hosts)
ch = DummyChannel(hosts[0])
for outcome in outcomes:
r.report(repevent.ReceivedItemOutcome(ch, item, outcome))
cap = py.io.StdCaptureFD()
boxfun(self.config, item, outcomes)
out, err = cap.reset()
assert not err
return out
def _test_module(self):
funcitem = self.getexample("pass")
moditem = self.getmod()
outcomes = self.prepare_outcomes()
def boxfun(config, item, funcitem, outcomes):
hosts = [HostInfo('localhost')]
r = self.reporter(config, hosts)
r.report(repevent.ItemStart(item))
ch = DummyChannel(hosts[0])
for outcome in outcomes:
r.report(repevent.ReceivedItemOutcome(ch, funcitem, outcome))
cap = py.io.StdCaptureFD()
boxfun(self.config, moditem, funcitem, outcomes)
out, err = cap.reset()
assert not err
return out
def _test_full_module(self):
tmpdir = py.test.ensuretemp("repmod")
tmpdir.ensure("__init__.py")
tmpdir.ensure("test_one.py").write(py.code.Source("""
def test_x():
pass
"""))
tmpdir.ensure("test_two.py").write(py.code.Source("""
import py
py.test.skip("reason")
"""))
tmpdir.ensure("test_three.py").write(py.code.Source("""
sadsadsa
"""))
def boxfun():
config = py.test.config._reparse([str(tmpdir)])
rootcol = py.test.collect.Directory(tmpdir)
hosts = [HostInfo('localhost')]
r = self.reporter(config, hosts)
list(rootcol._tryiter(reporterror=lambda x : AbstractSession.reporterror(r.report, x)))
cap = py.io.StdCaptureFD()
boxfun()
out, err = cap.reset()
assert not err
return out
def test_failed_to_load(self):
tmpdir = py.test.ensuretemp("failedtoload")
tmpdir.ensure("__init__.py")
tmpdir.ensure("test_three.py").write(py.code.Source("""
sadsadsa
"""))
def boxfun():
config = py.test.config._reparse([str(tmpdir)])
rootcol = py.test.collect.Directory(tmpdir)
host = HostInfo('localhost')
r = self.reporter(config, [host])
r.report(repevent.TestStarted([host], config.topdir, ["a"]))
r.report(repevent.RsyncFinished())
list(rootcol._tryiter(reporterror=lambda x : AbstractSession.reporterror(r.report, x)))
r.report(repevent.TestFinished())
cap = py.io.StdCaptureFD()
boxfun()
out, err = cap.reset()
assert not err
assert out.find("NameError: name 'sadsadsa' is not defined") != -1
def _test_still_to_go(self):
tmpdir = py.test.ensuretemp("stilltogo")
tmpdir.ensure("__init__.py")
cap = py.io.StdCaptureFD()
config = py.test.config._reparse([str(tmpdir)])
hosts = [HostInfo(i) for i in ["host1", "host2", "host3"]]
r = self.reporter(config, hosts)
r.report(repevent.TestStarted(hosts, config.topdir, ["a", "b", "c"]))
for host in hosts:
r.report(repevent.HostGatewayReady(host, ["a", "b", "c"]))
for host in hosts:
for root in ["a", "b", "c"]:
r.report(repevent.HostRSyncRootReady(host, root))
out, err = cap.reset()
assert not err
expected1 = "Test started, hosts: host1[0], host2[0], host3[0]"
assert out.find(expected1) != -1
for expected in py.code.Source("""
host1[0]: READY (still 2 to go)
host2[0]: READY (still 1 to go)
host3[0]: READY
""").lines:
expected = expected.strip()
assert out.find(expected) != -1
class TestLocalReporter(AbstractTestReporter):
reporter = LocalReporter
def test_report_received_item_outcome(self):
#py.test.skip("XXX rewrite test to not rely on exact formatting")
assert self.report_received_item_outcome() == 'FsF.'
def test_module(self):
#py.test.skip("XXX rewrite test to not rely on exact formatting")
output = self._test_module()
assert output.find("test_one") != -1
assert output.endswith("FsF."), output
def test_full_module(self):
#py.test.skip("XXX rewrite test to not rely on exact formatting")
received = self._test_full_module()
expected = """
repmod/test_one.py[1]
repmod/test_three.py[0] - FAILED TO LOAD MODULE
repmod/test_two.py[0] - skipped (reason)"""
assert received.find(expected) != -1
class TestRemoteReporter(AbstractTestReporter):
reporter = RemoteReporter
def test_still_to_go(self):
self._test_still_to_go()
def test_report_received_item_outcome(self):
py.test.skip("XXX rewrite test to not rely on exact formatting")
val = self.report_received_item_outcome()
expected = """ localhost: FAILED py.test.rsession.testing.test_slave.py funcpass
localhost: SKIPPED py.test.rsession.testing.test_slave.py funcpass
localhost: FAILED py.test.rsession.testing.test_slave.py funcpass
localhost: PASSED py.test.rsession.testing.test_slave.py funcpass
"""
assert val.find(expected) != -1
def test_module(self):
py.test.skip("XXX rewrite test to not rely on exact formatting")
val = self._test_module()
print val
expected = """ localhost: FAILED py.test.rsession.testing.test_slave.py funcpass
localhost: SKIPPED py.test.rsession.testing.test_slave.py funcpass
localhost: FAILED py.test.rsession.testing.test_slave.py funcpass
localhost: PASSED py.test.rsession.testing.test_slave.py funcpass
"""
assert val.find(expected) != -1
def test_full_module(self):
#py.test.skip("XXX rewrite test to not rely on exact formatting")
val = self._test_full_module()
assert val.find('FAILED TO LOAD MODULE: repmod/test_three.py\n'\
'\nSkipped (reason) repmod/test_two.py') != -1