[py-svn] r57134 - in py/branch/event/py/test2/rsession: . testing

hpk at codespeak.net hpk at codespeak.net
Sat Aug 9 16:11:04 CEST 2008


Author: hpk
Date: Sat Aug  9 16:11:04 2008
New Revision: 57134

Modified:
   py/branch/event/py/test2/rsession/async.py
   py/branch/event/py/test2/rsession/testing/test_async.py
Log:
more tests, refined exitstatus handling


Modified: py/branch/event/py/test2/rsession/async.py
==============================================================================
--- py/branch/event/py/test2/rsession/async.py	(original)
+++ py/branch/event/py/test2/rsession/async.py	Sat Aug  9 16:11:04 2008
@@ -22,6 +22,12 @@
         and generates test events for reporters. 
     """ 
     MAXITEMSPERHOST = 10
+    EXIT_OK = 0
+    EXIT_TESTSFAILED = 1
+    EXIT_INTERRUPTED = 2
+    EXIT_INTERNALERROR = 3
+    EXIT_NOHOSTS = 4
+    
     def __init__(self, config):
         self.config = config
         self.bus = EventBus()
@@ -54,33 +60,34 @@
         self.sessionfinishes(exitstatus=exitstatus)
 
     def loop(self, colitems):
-        exitstatus = 0 
+        exitstatus = self.EXIT_OK
         try:
-            while self.hosts:
+            while 1:
                 if colitems:
                     self.triggertesting(colitems)
                     colitems = []
                 ev = self.queue.get()
                 self.bus.notify(ev)
                 if isinstance(ev, repevent.HostDown):
-                    self.reschedule_hostdown(ev)
+                    self.handle_hostdown(ev)
                 elif isinstance(ev, repevent.RescheduleItems):
+                    if not self.hosts:
+                        exitstatus = self.EXIT_NOHOSTS
+                        break
                     self.reschedule(ev.colitems)
                 elif isinstance(ev, repevent.ItemTestReport):
                     all_completed = self.processresult(ev)
                     if all_completed:
-                        exit = self.act_on_completed_tests()
-                        if exit is not None:
-                            exitstatus = exit
-                            break
+                        self.act_on_completed_tests()
+                        break
                 elif isinstance(ev, repevent.CollectionReport):
                     if ev.passed:
-                        colitems =  ev.result
+                        colitems = ev.result
         except KeyboardInterrupt:
-            exitstatus = 2
+            exitstatus = self.EXIT_INTERRUPTED
         except:
             self.bus.notify(repevent.InternalException())
-            exitstatus = 3
+            exitstatus = self.EXIT_INTERNALERROR
         return exitstatus
 
     def act_on_completed_tests(self):
@@ -106,8 +113,10 @@
         toremove = ev.colitem
         for host, pending in self.host2pending.items():
             if toremove is not None and toremove in pending:
-               pending.remove(toremove)
-               toremove = None
+                pending.remove(toremove)
+                if ev.failed and self.config.option.exitfirst:
+                    break
+                toremove = None
             if pending:
                 completed = False
                 if toremove is None:
@@ -124,7 +133,7 @@
                 self.queue.put(ev)
         self.sendtestitems(senditems)
 
-    def reschedule_hostdown(self, ev):
+    def handle_hostdown(self, ev):
         pending = self.removehost(ev.host)
         self.reschedule(pending)
 

Modified: py/branch/event/py/test2/rsession/testing/test_async.py
==============================================================================
--- py/branch/event/py/test2/rsession/testing/test_async.py	(original)
+++ py/branch/event/py/test2/rsession/testing/test_async.py	Sat Aug  9 16:11:04 2008
@@ -1,6 +1,7 @@
 from py.__.test2.testing.suptest import InlineCollection
 from py.__.test2.rsession.async import AsyncSession
 from py.__.test2.rsession.hostmanage import Host
+from py.__.test2.runner import basic_collect_report 
 from py.__.test2 import repevent
 import py
 
@@ -15,6 +16,9 @@
     def sendlist(self, items):
         self.sent.append(items)
 
+    def shutdown(self):
+        self._shutdown=True
+
 def dumpqueue(queue):
     while queue.qsize():
         print queue.get()
@@ -28,7 +32,9 @@
         assert not session.hosts
         session.addhost(host)
         assert len(session.hosts) == 1
-        session.removehost(host)
+        session.host2pending[host].append(item)
+        pending = session.removehost(host)
+        assert pending == [item]
         py.test2.raises(Exception, "session.removehost(host)")
 
     def test_processresult(self):
@@ -73,7 +79,23 @@
         assert isinstance(ev, repevent.RescheduleItems)
         assert ev.items == [item]
 
-    def test_reschedule_hostdown(self):
+    def test_keyboardinterrupt(self):
+        item = self.getitem("def test_func(): pass")
+        session = AsyncSession(item._config)
+        def raise_(): raise KeyboardInterrupt()
+        session.queue.get = raise_
+        exitstatus = session.loop([])
+        assert exitstatus == session.EXIT_INTERRUPTED
+
+    def test_internalerror(self):
+        item = self.getitem("def test_func(): pass")
+        session = AsyncSession(item._config)
+        def raise_(): raise ValueError()
+        session.queue.get = raise_
+        exitstatus = session.loop([])
+        assert exitstatus == session.EXIT_INTERNALERROR
+
+    def test_hostdown(self):
         item = self.getitem("def test_func(): pass")
         session = AsyncSession(item._config)
         host1 = Host("localhost")
@@ -83,5 +105,40 @@
         session.queue.put(ev)
         exitstatus = session.loop([item])
         dumpqueue(session.queue)
-        py.test.skip("handle all hosts down")
-        assert exitstatus == 4
+        assert exitstatus == session.EXIT_NOHOSTS
+
+    def test_exit_completed_tests(self):
+        item = self.getitem("def test_func(): pass")
+        session = AsyncSession(item._config)
+        host1 = Host("localhost")
+        host1.node = MockNode()
+        session.addhost(host1)
+        session.triggertesting([item])
+        ev = run(item)
+        session.queue.put(ev)
+        exitstatus = session.loop([]) 
+        dumpqueue(session.queue)
+        assert exitstatus == session.EXIT_OK
+
+    def test_exit_on_first_failing(self):
+        modcol = self.getmodulecol("""
+            def test_fail(): 
+                assert 0
+            def test_pass(): 
+                pass
+        """)
+        modcol._config.option.exitfirst = True
+        session = AsyncSession(modcol._config)
+        host1 = Host("localhost")
+        host1.node = MockNode()
+        session.addhost(host1)
+        items = basic_collect_report(modcol).result
+        session.triggertesting(items)
+        ev1 = run(items[0])
+        ev2 = run(items[1])
+        session.queue.put(ev1)
+        session.queue.put(ev2)
+        exitstatus = session.loop([]) 
+        assert session.queue.qsize() == 1
+        dumpqueue(session.queue)
+        #assert exitstatus == session.EXIT_TESTSFAILED



More information about the pytest-commit mailing list