test_ok1/py/test/event.py

185 lines
5.6 KiB
Python

"""
test collection and execution events
"""
import py
import time
from py.__.test.outcome import Skipped
class BaseEvent(object):
def __repr__(self):
l = ["%s=%s" %(key, value)
for key, value in self.__dict__.items()]
return "<%s %s>" %(self.__class__.__name__, " ".join(l),)
def timestamp():
return time.time()
class NOP(BaseEvent):
pass
# ----------------------------------------------------------------------
# Basic Live Reporting Events
# ----------------------------------------------------------------------
class TestrunStart(BaseEvent):
def __init__(self):
self.timestart = time.time()
class TestrunFinish(BaseEvent):
def __init__(self, exitstatus=0, excinfo=None):
self.exitstatus = exitstatus
if excinfo is None:
self.excrepr = None
else:
self.excrepr = excinfo.getrepr()
self.timeend = time.time()
class InternalException(BaseEvent):
def __init__(self, excinfo=None):
if excinfo is None:
excinfo = py.code.ExceptionInfo()
self.repr = excinfo.getrepr(funcargs=True, showlocals=True)
# ----------------------------------------------------------------------
# Events related to collecting and executing test Items
# ----------------------------------------------------------------------
class ItemStart(BaseEvent):
def __init__(self, item, host=None):
self.item = item
self.host = host
self.time = timestamp()
class Deselected(BaseEvent):
def __init__(self, items):
self.items = items
class BaseReport(BaseEvent):
def toterminal(self, out):
longrepr = self.longrepr
if hasattr(longrepr, 'toterminal'):
longrepr.toterminal(out)
else:
out.line(str(longrepr))
class ItemTestReport(BaseReport):
""" Test Execution Report. """
failed = passed = skipped = False
def __init__(self, colitem, excinfo=None, when=None, outerr=None):
self.colitem = colitem
self.keywords = colitem and colitem.readkeywords()
if not excinfo:
self.passed = True
self.shortrepr = "."
else:
self.when = when
if not isinstance(excinfo, py.code.ExceptionInfo):
self.failed = True
shortrepr = "?"
longrepr = excinfo
elif excinfo.errisinstance(Skipped):
self.skipped = True
shortrepr = "s"
longrepr = self.colitem._repr_failure_py(excinfo, outerr)
else:
self.failed = True
shortrepr = self.colitem.shortfailurerepr
if self.when == "execute":
longrepr = self.colitem.repr_failure(excinfo, outerr)
else: # exception in setup or teardown
longrepr = self.colitem._repr_failure_py(excinfo, outerr)
shortrepr = shortrepr.lower()
self.shortrepr = shortrepr
self.longrepr = longrepr
class CollectionStart(BaseEvent):
def __init__(self, collector):
self.collector = collector
class CollectionReport(BaseReport):
""" Collection Report. """
skipped = failed = passed = False
def __init__(self, colitem, result, excinfo=None, when=None, outerr=None):
self.colitem = colitem
if not excinfo:
self.passed = True
self.result = result
else:
self.when = when
self.outerr = outerr
self.longrepr = self.colitem._repr_failure_py(excinfo, outerr)
if excinfo.errisinstance(Skipped):
self.skipped = True
self.reason = str(excinfo.value)
else:
self.failed = True
def toterminal(self, out):
longrepr = self.longrepr
if hasattr(longrepr, 'toterminal'):
longrepr.toterminal(out)
else:
out.line(str(longrepr))
class LooponfailingInfo(BaseEvent):
def __init__(self, failreports, rootdirs):
self.failreports = failreports
self.rootdirs = rootdirs
# ----------------------------------------------------------------------
# Distributed Testing Events
# ----------------------------------------------------------------------
class RescheduleItems(BaseEvent):
def __init__(self, items):
self.items = items
class HostGatewayReady(BaseEvent):
def __init__(self, host, roots):
self.host = host
self.roots = roots
class HostUp(BaseEvent):
def __init__(self, host, platinfo):
self.host = host
self.platinfo = platinfo
class HostDown(BaseEvent):
def __init__(self, host, error=None):
self.host = host
self.error = error
# ---------------------------------------------------------------------
# Events related to rsyncing
# ---------------------------------------------------------------------
class HostRSyncing(BaseEvent):
def __init__(self, host, root, remotepath, synced):
self.host = host
self.root = root
self.remotepath = remotepath
self.synced = synced
class RsyncFinished(BaseEvent):
def __init__(self):
self.time = timestamp()
class HostRSyncRootReady(BaseEvent):
def __init__(self, host, root):
self.host = host
self.root = root
# make all eventclasses available on BaseEvent so that
# consumers of events can easily filter by
# 'isinstance(event, event.Name)' checks
for name, cls in vars().items():
if hasattr(cls, '__bases__') and issubclass(cls, BaseEvent):
setattr(BaseEvent, name, cls)
#