test_ok1/py/test/rsession/repevent.py

141 lines
3.6 KiB
Python

""" Reporter classes for showing asynchronous and synchronous status events
"""
import py
import time
def basic_report(msg_type, message):
print msg_type, message
#def report(msg_type, message):
# pass
##def report_error(excinfo):
## if isinstance(excinfo, py.test.Item.Skipped):
## # we need to dispatch this info
## report(Skipped(excinfo))
## else:
## report("itererror", excinfo)
def wrapcall(reporter, func, *args, **kwargs):
reporter(CallStart(func, args, kwargs))
try:
retval = func(*args, **kwargs)
except:
reporter(CallException(func, args, kwargs))
raise
else:
reporter(CallFinish(func, args, kwargs))
return retval
# ----------------------------------------------------------------------
# Reporting Events
# ----------------------------------------------------------------------
class ReportEvent(object):
def __repr__(self):
l = ["%s=%s" %(key, value)
for key, value in self.__dict__.items()]
return "<%s %s>" %(self.__class__.__name__, " ".join(l),)
class SendItem(ReportEvent):
def __init__(self, channel, item):
self.item = item
self.channel = channel
if channel:
self.host = channel.gateway.host
class ReceivedItemOutcome(ReportEvent):
def __init__(self, channel, item, outcome):
self.channel = channel
if channel:
self.host = channel.gateway.host
self.item = item
self.outcome = outcome
class CallEvent(ReportEvent):
def __init__(self, func, args, kwargs):
self.func = func
self.args = args
self.kwargs = kwargs
def __repr__(self):
call = "%s args=%s, kwargs=%s" %(self.func.__name__,
self.args, self.kwargs)
return '<%s %s>' %(self.__class__.__name__, call)
class CallStart(CallEvent):
pass
class CallException(CallEvent):
pass
class CallFinish(CallEvent):
pass
class HostRSyncing(ReportEvent):
def __init__(self, host):
self.host = host
class HostGatewayReady(ReportEvent):
def __init__(self, host, roots):
self.host = host
self.roots = roots
class HostRSyncRootReady(ReportEvent):
def __init__(self, host, root):
self.host = host
self.root = root
class TestStarted(ReportEvent):
def __init__(self, hosts, topdir, roots):
self.hosts = hosts
self.topdir = topdir
self.roots = roots
self.timestart = time.time()
class TestFinished(ReportEvent):
def __init__(self):
self.timeend = time.time()
class Nodes(ReportEvent):
def __init__(self, nodes):
self.nodes = nodes
class SkippedTryiter(ReportEvent):
def __init__(self, excinfo, item):
self.excinfo = excinfo
self.item = item
class FailedTryiter(ReportEvent):
def __init__(self, excinfo, item):
self.excinfo = excinfo
self.item = item
class ItemStart(ReportEvent):
""" This class shows most of the start stuff, like directory, module, class
can be used for containers
"""
def __init__(self, item):
self.item = item
class RsyncFinished(ReportEvent):
def __init__(self):
self.time = time.time()
class ImmediateFailure(ReportEvent):
def __init__(self, item, outcome):
self.item = item
self.outcome = outcome
class PongReceived(ReportEvent):
def __init__(self, hostid, result):
self.hostid = hostid
self.result = result
class InterruptedExecution(ReportEvent):
pass
class CrashedExecution(ReportEvent):
pass