[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