[py-svn] r63202 - in py/trunk/py/test/dist: . testing

hpk at codespeak.net hpk at codespeak.net
Sun Mar 22 02:50:21 CET 2009


Author: hpk
Date: Sun Mar 22 02:50:16 2009
New Revision: 63202

Modified:
   py/trunk/py/test/dist/dsession.py
   py/trunk/py/test/dist/testing/test_dsession.py
Log:
prepare for allowing for items to be sent to multiple hosts


Modified: py/trunk/py/test/dist/dsession.py
==============================================================================
--- py/trunk/py/test/dist/dsession.py	(original)
+++ py/trunk/py/test/dist/dsession.py	Sun Mar 22 02:50:16 2009
@@ -26,8 +26,8 @@
         self.testsfailed = False
 
     def pyevent_itemtestreport(self, event):
-        if event.colitem in self.dsession.item2node:
-            self.dsession.removeitem(event.colitem)
+        if event.colitem in self.dsession.item2nodes:
+            self.dsession.removeitem(event.colitem, event.node)
         if event.failed:
             self.testsfailed = True
 
@@ -59,7 +59,7 @@
     def __init__(self, config):
         self.queue = Queue.Queue()
         self.node2pending = {}
-        self.item2node = {}
+        self.item2nodes = {}
         super(DSession, self).__init__(config=config)
 
     def pytest_configure(self, config):
@@ -106,7 +106,7 @@
 
         # termination conditions
         if ((loopstate.testsfailed and self.config.option.exitfirst) or 
-            (not self.item2node and not colitems and not self.queue.qsize())):
+            (not self.item2nodes and not colitems and not self.queue.qsize())):
             self.triggershutdown()
             loopstate.shuttingdown = True
         elif not self.node2pending:
@@ -166,7 +166,11 @@
             # this happens if we didn't receive a testnodeready event yet
             return []
         for item in pending:
-            del self.item2node[item]
+            l = self.item2nodes[item]
+            l.remove(node)
+            if not l:
+                del self.item2nodes[item]
+
         return pending
 
     def triggertesting(self, colitems):
@@ -195,7 +199,7 @@
                     #assert item not in self.item2node, (
                     #    "sending same item %r to multiple "
                     #    "not implemented" %(item,))
-                    self.item2node[item] = node
+                    self.item2nodes.setdefault(item, []).append(node)
                     self.bus.notify("itemstart", item, node)
                 pending.extend(sending)
                 tosend[:] = tosend[room:]  # update inplace
@@ -205,12 +209,14 @@
             # we have some left, give it to the main loop
             self.queueevent("rescheduleitems", event.RescheduleItems(tosend))
 
-    def removeitem(self, item):
-        if item not in self.item2node:
-            raise AssertionError(item, self.item2node)
-        node = self.item2node.pop(item)
+    def removeitem(self, item, node):
+        if item not in self.item2nodes:
+            raise AssertionError(item, self.item2nodes)
+        nodes = self.item2nodes[item]
+        nodes.remove(node)
+        if not nodes:
+            del self.item2nodes[item]
         self.node2pending[node].remove(item)
-        #self.config.bus.notify("removeitem", item, host.hostid)
 
     def handle_crashitem(self, item, node):
         longrepr = "!!! Node %r crashed during running of test %r" %(node, item)

Modified: py/trunk/py/test/dist/testing/test_dsession.py
==============================================================================
--- py/trunk/py/test/dist/testing/test_dsession.py	(original)
+++ py/trunk/py/test/dist/testing/test_dsession.py	Sun Mar 22 02:50:16 2009
@@ -6,9 +6,11 @@
 
 XSpec = py.execnet.XSpec
 
-def run(item):
+def run(item, node):
     runner = item._getrunner()
-    return runner(item)
+    rep = runner(item)
+    rep.node = node
+    return rep
 
 class MockNode:
     def __init__(self):
@@ -27,31 +29,31 @@
 class TestDSession:
     def test_add_remove_node(self, testdir):
         item = testdir.getitem("def test_func(): pass")
-        rep = run(item)
-        session = DSession(item.config)
         node = MockNode()
+        rep = run(item, node)
+        session = DSession(item.config)
         assert not session.node2pending
         session.addnode(node)
         assert len(session.node2pending) == 1
         session.senditems([item])
         pending = session.removenode(node)
         assert pending == [item]
-        assert item not in session.item2node
+        assert item not in session.item2nodes
         l = session.removenode(node)
         assert not l 
 
     def test_senditems_removeitems(self, testdir):
         item = testdir.getitem("def test_func(): pass")
-        rep = run(item)
-        session = DSession(item.config)
         node = MockNode()
+        rep = run(item, node)
+        session = DSession(item.config)
         session.addnode(node)
         session.senditems([item])  
         assert session.node2pending[node] == [item]
-        assert session.item2node[item] == node
-        session.removeitem(item)
+        assert session.item2nodes[item] == [node]
+        session.removeitem(item, node)
         assert not session.node2pending[node] 
-        assert not session.item2node
+        assert not session.item2nodes
 
     def test_triggertesting_collect(self, testdir):
         modcol = testdir.getmodulecol("""
@@ -117,7 +119,7 @@
         session.queueevent("anonymous", event.NOP())
         session.loop_once(loopstate)
         assert node.sent == [[item]]
-        session.queueevent("itemtestreport", run(item))
+        session.queueevent("itemtestreport", run(item, node))
         session.loop_once(loopstate)
         assert loopstate.shuttingdown 
         assert not loopstate.testsfailed 
@@ -155,10 +157,10 @@
       
         # have one test pending for a node that goes down 
         session.senditems([item1, item2])
-        node = session.item2node[item1]
+        node = session.item2nodes[item1] [0]
         session.queueevent("testnodedown", node, None)
         evrec = EventRecorder(session.bus)
-        print session.item2node
+        print session.item2nodes
         loopstate = session._initloopstate([])
         session.loop_once(loopstate)
 
@@ -200,7 +202,7 @@
         session.loop_once(loopstate)
 
         assert node.sent == [[item]]
-        ev = run(item)
+        ev = run(item, node)
         session.queueevent("itemtestreport", ev)
         session.loop_once(loopstate)
         assert loopstate.shuttingdown  
@@ -236,8 +238,8 @@
         session.triggertesting(items)
 
         # run tests ourselves and produce reports 
-        ev1 = run(items[0])
-        ev2 = run(items[1])
+        ev1 = run(items[0], node)
+        ev2 = run(items[1], node)
         session.queueevent("itemtestreport", ev1) # a failing one
         session.queueevent("itemtestreport", ev2)
         # now call the loop
@@ -254,7 +256,7 @@
         loopstate = session._initloopstate([])
         loopstate.shuttingdown = True
         evrec = EventRecorder(session.bus)
-        session.queueevent("itemtestreport", run(item))
+        session.queueevent("itemtestreport", run(item, node))
         session.loop_once(loopstate)
         assert not evrec.getfirstnamed("testnodedown")
         session.queueevent("testnodedown", node, None)
@@ -297,7 +299,7 @@
         node = MockNode()
         session.addnode(node)
         session.senditems([item])
-        session.queueevent("itemtestreport", run(item))
+        session.queueevent("itemtestreport", run(item, node))
         loopstate = session._initloopstate([])
         session.loop_once(loopstate)
         assert node._shutdown is True
@@ -322,7 +324,9 @@
         item1, item2 = colreport.result
         session.senditems([item1])
         # node2pending will become empty when the loop sees the report 
-        session.queueevent("itemtestreport", run(item1)) 
+        rep = run(item1, node)
+
+        session.queueevent("itemtestreport", run(item1, node)) 
 
         # but we have a collection pending
         session.queueevent("collectionreport", colreport) 



More information about the pytest-commit mailing list