[py-svn] r63107 - in py/trunk/py/test/dsession: . testing
hpk at codespeak.net
hpk at codespeak.net
Fri Mar 20 03:13:32 CET 2009
Author: hpk
Date: Fri Mar 20 03:13:31 2009
New Revision: 63107
Modified:
py/trunk/py/test/dsession/dsession.py
py/trunk/py/test/dsession/testing/test_dsession.py
Log:
cleanup event handling of dsession
Modified: py/trunk/py/test/dsession/dsession.py
==============================================================================
--- py/trunk/py/test/dsession/dsession.py (original)
+++ py/trunk/py/test/dsession/dsession.py Fri Mar 20 03:13:31 2009
@@ -13,7 +13,8 @@
import Queue
class LoopState(object):
- def __init__(self, colitems):
+ def __init__(self, dsession, colitems):
+ self.dsession = dsession
self.colitems = colitems
self.exitstatus = None
# loopstate.dowork is False after reschedule events
@@ -23,6 +24,30 @@
self.shuttingdown = False
self.testsfailed = False
+ def pyevent_itemtestreport(self, event):
+ if event.colitem in self.dsession.item2host:
+ self.dsession.removeitem(event.colitem)
+ if event.failed:
+ self.testsfailed = True
+
+ def pyevent_collectionreport(self, event):
+ if event.passed:
+ self.colitems.extend(event.result)
+
+ def pyevent_testnodeready(self, event):
+ self.dsession.addhost(event.host)
+
+ def pyevent_testnodedown(self, event):
+ pending = self.dsession.removehost(event.host)
+ if pending:
+ crashitem = pending[0]
+ self.dsession.handle_crashitem(crashitem, event.host)
+ self.colitems.extend(pending[1:])
+
+ def pyevent_rescheduleitems(self, event):
+ self.colitems.extend(event.items)
+ self.dowork = False # avoid busywait
+
class DSession(Session):
"""
Session drives the collection and running of tests
@@ -36,7 +61,6 @@
self.queue = Queue.Queue()
self.host2pending = {}
self.item2host = {}
- self._testsfailed = False
if self.config.getvalue("executable") and \
not self.config.getvalue("numprocesses"):
self.config.option.numprocesses = 1
@@ -83,8 +107,8 @@
if loopstate.shuttingdown:
return self.loop_once_shutdown(loopstate)
colitems = loopstate.colitems
- if loopstate.dowork and loopstate.colitems:
- self.triggertesting(colitems)
+ if loopstate.dowork and colitems:
+ self.triggertesting(loopstate.colitems)
colitems[:] = []
# we use a timeout here so that control-C gets through
while 1:
@@ -94,31 +118,9 @@
except Queue.Empty:
continue
loopstate.dowork = True
-
+
eventname, args, kwargs = eventcall
self.bus.notify(eventname, *args, **kwargs)
- if args:
- ev, = args
- else:
- ev = None
- if eventname == "itemtestreport":
- self.removeitem(ev.colitem)
- if ev.failed:
- loopstate.testsfailed = True
- elif eventname == "collectionreport":
- if ev.passed:
- colitems.extend(ev.result)
- elif eventname == "testnodeready":
- self.addhost(ev.host)
- elif eventname == "testnodedown":
- pending = self.removehost(ev.host)
- if pending:
- crashitem = pending.pop(0)
- self.handle_crashitem(crashitem, ev.host)
- colitems.extend(pending)
- elif eventname == "rescheduleitems":
- colitems.extend(ev.items)
- loopstate.dowork = False # avoid busywait
# termination conditions
if ((loopstate.testsfailed and self.config.option.exitfirst) or
@@ -143,9 +145,14 @@
else:
loopstate.exitstatus = outcome.EXIT_OK
+ def _initloopstate(self, colitems):
+ loopstate = LoopState(self, colitems)
+ self.config.bus.register(loopstate)
+ return loopstate
+
def loop(self, colitems):
try:
- loopstate = LoopState(colitems)
+ loopstate = self._initloopstate(colitems)
loopstate.dowork = False # first receive at least one HostUp events
while 1:
self.loop_once(loopstate)
@@ -157,6 +164,7 @@
except:
self.bus.notify("internalerror", event.InternalException())
exitstatus = outcome.EXIT_INTERNALERROR
+ self.config.bus.unregister(loopstate)
if exitstatus == 0 and self._testsfailed:
exitstatus = outcome.EXIT_TESTSFAILED
return exitstatus
Modified: py/trunk/py/test/dsession/testing/test_dsession.py
==============================================================================
--- py/trunk/py/test/dsession/testing/test_dsession.py (original)
+++ py/trunk/py/test/dsession/testing/test_dsession.py Fri Mar 20 03:13:31 2009
@@ -1,4 +1,4 @@
-from py.__.test.dsession.dsession import DSession, LoopState
+from py.__.test.dsession.dsession import DSession
from py.__.test.dsession.masterslave import maketestnodeready
from py.__.execnet.gwmanage import GatewaySpec
from py.__.test.runner import basic_collect_report
@@ -120,7 +120,7 @@
host1.node = MockNode()
session.addhost(host1)
ev = event.RescheduleItems([item])
- loopstate = LoopState([])
+ loopstate = session._initloopstate([])
session.queueevent("rescheduleitems", ev)
session.loop_once(loopstate)
# check that RescheduleEvents are not immediately
@@ -148,7 +148,7 @@
ev = event.HostDown(host1, None)
session.queueevent("testnodedown", ev)
- loopstate = LoopState([item])
+ loopstate = session._initloopstate([item])
loopstate.dowork = False
session.loop_once(loopstate)
dumpqueue(session.queue)
@@ -178,7 +178,8 @@
ev = event.HostDown(host, None)
session.queueevent("testnodedown", ev)
evrec = EventRecorder(session.bus)
- loopstate = LoopState([])
+ print session.item2host
+ loopstate = session._initloopstate([])
session.loop_once(loopstate)
assert loopstate.colitems == [item2] # do not reschedule crash item
@@ -195,7 +196,7 @@
host1 = GatewaySpec("localhost")
testnodeready = maketestnodeready(host1)
session.queueevent("testnodeready", testnodeready)
- loopstate = LoopState([item])
+ loopstate = session._initloopstate([item])
loopstate.dowork = False
assert len(session.host2pending) == 0
session.loop_once(loopstate)
@@ -207,7 +208,7 @@
evrec = EventRecorder(session.bus)
session.queueevent("NOPevent", 42)
- session.loop_once(LoopState([]))
+ session.loop_once(session._initloopstate([]))
assert evrec.getfirstnamed('NOPevent')
def runthrough(self, item):
@@ -215,7 +216,7 @@
host1 = GatewaySpec("localhost")
host1.node = MockNode()
session.addhost(host1)
- loopstate = LoopState([item])
+ loopstate = session._initloopstate([item])
session.queueevent("NOP")
session.loop_once(loopstate)
@@ -263,7 +264,7 @@
session.queueevent("itemtestreport", ev1) # a failing one
session.queueevent("itemtestreport", ev2)
# now call the loop
- loopstate = LoopState(items)
+ loopstate = session._initloopstate(items)
session.loop_once(loopstate)
assert loopstate.testsfailed
assert loopstate.shuttingdown
@@ -273,7 +274,7 @@
session = DSession(item.config)
host = GatewaySpec("localhost")
session.addhost(host)
- loopstate = LoopState([])
+ loopstate = session._initloopstate([])
loopstate.shuttingdown = True
evrec = EventRecorder(session.bus)
session.queueevent("itemtestreport", run(item))
@@ -322,7 +323,7 @@
session.addhost(host)
session.senditems([item])
session.queueevent("itemtestreport", run(item))
- loopstate = LoopState([])
+ loopstate = session._initloopstate([])
session.loop_once(loopstate)
assert host.node._shutdown is True
assert loopstate.exitstatus is None, "loop did not wait for testnodedown"
@@ -353,7 +354,7 @@
# but we have a collection pending
session.queueevent("collectionreport", colreport)
- loopstate = LoopState([])
+ loopstate = session._initloopstate([])
session.loop_once(loopstate)
assert loopstate.exitstatus is None, "loop did not care for collection report"
assert not loopstate.colitems
More information about the pytest-commit
mailing list