2 new commits in pytest-xdist:
https://bitbucket.org/hpk42/pytest-xdist/changeset/b92fb2f2a998/ changeset: b92fb2f2a998 user: hpk42 date: 2011-12-02 22:03:29 summary: fix issue 93 of pytest - avoid delayed teardowns affected #: 9 files diff -r 247b401a756ad6a0c5f73206b8bb5f0182057783 -r b92fb2f2a998db9de2a881dd7d6cd70e611b685a CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,9 @@ +1.8 +------------------------- + +- fix pytest-issue93 - use the refined pytest-2.2.1 runtestprotocol + interface to perform eager teardowns for test items. + 1.7 ------------------------- diff -r 247b401a756ad6a0c5f73206b8bb5f0182057783 -r b92fb2f2a998db9de2a881dd7d6cd70e611b685a setup.py --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name="pytest-xdist", - version='1.7', + version='1.8.dev1', description='py.test xdist plugin for distributed testing and loop-on-failing modes', long_description=open('README.txt').read(), license='GPLv2 or later', @@ -13,7 +13,7 @@ packages = ['xdist'], entry_points = {'pytest11': ['xdist = xdist.plugin'],}, zip_safe=False, - install_requires = ['execnet>=1.0.8', 'pytest>=2.2.0'], + install_requires = ['execnet>=1.0.8', 'pytest>=2.2.1.dev1'], classifiers=[ 'Development Status :: 5 - Production/Stable', 'Intended Audience :: Developers', diff -r 247b401a756ad6a0c5f73206b8bb5f0182057783 -r b92fb2f2a998db9de2a881dd7d6cd70e611b685a testing/test_dsession.py --- a/testing/test_dsession.py +++ b/testing/test_dsession.py @@ -48,11 +48,11 @@ assert sched.node2collection[node1] == collection assert sched.node2collection[node2] == collection sched.init_distribute() - assert not sched.tests_finished() + assert sched.tests_finished() assert node1.sent == ['ALL'] assert node2.sent == ['ALL'] sched.remove_item(node1, collection[0]) - assert not sched.tests_finished() + assert sched.tests_finished() sched.remove_item(node2, collection[0]) assert sched.tests_finished() @@ -66,7 +66,7 @@ assert sched.collection_is_completed assert sched.node2collection[node1] == collection sched.init_distribute() - assert not sched.tests_finished() + assert sched.tests_finished() crashitem = sched.remove_node(node1) assert crashitem assert sched.tests_finished() @@ -88,7 +88,7 @@ assert sched.node2collection[node1] == collection assert sched.node2collection[node2] == collection sched.init_distribute() - assert not sched.tests_finished() + assert sched.tests_finished() assert len(node1.sent) == 1 assert len(node2.sent) == 1 x = sorted(node1.sent + node2.sent) @@ -109,6 +109,7 @@ sched.addnode_collection(node1, col) sched.addnode_collection(node2, col) sched.init_distribute() + #assert not sched.tests_finished() sent1 = node1.sent sent2 = node2.sent chunkitems = col[:sched.ITEM_CHUNKSIZE] diff -r 247b401a756ad6a0c5f73206b8bb5f0182057783 -r b92fb2f2a998db9de2a881dd7d6cd70e611b685a testing/test_remote.py --- a/testing/test_remote.py +++ b/testing/test_remote.py @@ -138,6 +138,7 @@ ids = ev.kwargs['ids'] assert len(ids) == 1 slave.sendcommand("runtests", ids=ids) + slave.sendcommand("shutdown") ev = slave.popevent("testreport") # setup ev = slave.popevent("testreport") assert ev.name == "testreport" @@ -145,7 +146,6 @@ assert rep.nodeid.endswith("::test_func") assert rep.passed assert rep.when == "call" - slave.sendcommand("shutdown") ev = slave.popevent("slavefinished") assert 'slaveoutput' in ev.kwargs diff -r 247b401a756ad6a0c5f73206b8bb5f0182057783 -r b92fb2f2a998db9de2a881dd7d6cd70e611b685a tox.ini --- a/tox.ini +++ b/tox.ini @@ -21,3 +21,4 @@ [pytest] addopts = -rsfxX +;; hello diff -r 247b401a756ad6a0c5f73206b8bb5f0182057783 -r b92fb2f2a998db9de2a881dd7d6cd70e611b685a xdist/__init__.py --- a/xdist/__init__.py +++ b/xdist/__init__.py @@ -1,2 +1,2 @@ # -__version__ = '1.7' +__version__ = '1.8.dev1' diff -r 247b401a756ad6a0c5f73206b8bb5f0182057783 -r b92fb2f2a998db9de2a881dd7d6cd70e611b685a xdist/dsession.py --- a/xdist/dsession.py +++ b/xdist/dsession.py @@ -24,9 +24,6 @@ def tests_finished(self): if not self.collection_is_completed: return False - for items in self.node2pending.values(): - if items: - return False return True def addnode_collection(self, node, collection): @@ -79,9 +76,9 @@ def tests_finished(self): if not self.collection_is_completed or self.pending: return False - for items in self.node2pending.values(): - if items: - return False + #for items in self.node2pending.values(): + # if items: + # return False return True def addnode_collection(self, node, collection): @@ -107,7 +104,7 @@ pending.append(item) self.item2nodes.setdefault(item, []).append(node) node.send_runtest(item) - #self.log("items waiting for node: %d" %(len(self.pending))) + self.log("items waiting for node: %d" %(len(self.pending))) #self.log("item2pending still executing: %s" %(self.item2nodes,)) #self.log("node2pending: %s" %(self.node2pending,)) diff -r 247b401a756ad6a0c5f73206b8bb5f0182057783 -r b92fb2f2a998db9de2a881dd7d6cd70e611b685a xdist/remote.py --- a/xdist/remote.py +++ b/xdist/remote.py @@ -46,18 +46,26 @@ def pytest_runtestloop(self, session): self.log("entering main loop") + torun = [] while 1: name, kwargs = self.channel.receive() self.log("received command %s(**%s)" % (name, kwargs)) if name == "runtests": ids = kwargs['ids'] for nodeid in ids: - item = self._id2item[nodeid] - self.config.hook.pytest_runtest_protocol(item=item) + torun.append(self._id2item[nodeid]) elif name == "runtests_all": - for item in session.items: - self.config.hook.pytest_runtest_protocol(item=item) - elif name == "shutdown": + torun.extend(session.items) + self.log("items to run: %s" %(len(torun))) + while len(torun) >= 2: + item = torun.pop(0) + nextitem = torun[0] + self.config.hook.pytest_runtest_protocol(item=item, + nextitem=nextitem) + if name == "shutdown": + while torun: + self.config.hook.pytest_runtest_protocol( + item=torun.pop(0), nextitem=None) break return True @@ -118,7 +126,7 @@ config.option.numprocesses = None config.args = args return config - + if __name__ == '__channelexec__': slaveinput,args,option_dict = channel.receive() diff -r 247b401a756ad6a0c5f73206b8bb5f0182057783 -r b92fb2f2a998db9de2a881dd7d6cd70e611b685a xdist/slavemanage.py --- a/xdist/slavemanage.py +++ b/xdist/slavemanage.py @@ -183,7 +183,7 @@ raise ValueError("arg %s not relative to an rsync root" % (arg,)) l.append(splitcode.join(parts)) return l - + class SlaveController(object): ENDMARK = -1 @@ -237,8 +237,11 @@ self.sendcommand("runtests_all",) def shutdown(self): - if not self._down and not self.channel.isclosed(): - self.sendcommand("shutdown") + if not self._down: + try: + self.sendcommand("shutdown") + except IOError: + pass def sendcommand(self, name, **kwargs): """ send a named parametrized command to the other side. """ https://bitbucket.org/hpk42/pytest-xdist/changeset/6d23d5c1326f/ changeset: 6d23d5c1326f user: hpk42 date: 2011-12-02 22:03:58 summary: remove usage of final_logerrors now that we have better teardown information affected #: 6 files diff -r b92fb2f2a998db9de2a881dd7d6cd70e611b685a -r 6d23d5c1326f88b97066e5b1e950cc6950d9ee05 setup.py --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name="pytest-xdist", - version='1.8.dev1', + version='1.8.dev2', description='py.test xdist plugin for distributed testing and loop-on-failing modes', long_description=open('README.txt').read(), license='GPLv2 or later', @@ -13,7 +13,7 @@ packages = ['xdist'], entry_points = {'pytest11': ['xdist = xdist.plugin'],}, zip_safe=False, - install_requires = ['execnet>=1.0.8', 'pytest>=2.2.1.dev1'], + install_requires = ['execnet>=1.0.8', 'pytest>=2.2.1.dev2'], classifiers=[ 'Development Status :: 5 - Production/Stable', 'Intended Audience :: Developers', @@ -27,4 +27,4 @@ 'Programming Language :: Python', 'Programming Language :: Python :: 3', ], -) \ No newline at end of file +) diff -r b92fb2f2a998db9de2a881dd7d6cd70e611b685a -r 6d23d5c1326f88b97066e5b1e950cc6950d9ee05 testing/acceptance_test.py --- a/testing/acceptance_test.py +++ b/testing/acceptance_test.py @@ -314,7 +314,7 @@ @py.test.mark.xfail def test_terminate_on_hangingnode(testdir): p = testdir.makeconftest(""" - def pytest__teardown_final(session): + def pytest_sessionfinishes(session): if session.nodeid == "my": # running on slave import time time.sleep(3) diff -r b92fb2f2a998db9de2a881dd7d6cd70e611b685a -r 6d23d5c1326f88b97066e5b1e950cc6950d9ee05 xdist/__init__.py --- a/xdist/__init__.py +++ b/xdist/__init__.py @@ -1,2 +1,2 @@ # -__version__ = '1.8.dev1' +__version__ = '1.8.dev2' diff -r b92fb2f2a998db9de2a881dd7d6cd70e611b685a -r 6d23d5c1326f88b97066e5b1e950cc6950d9ee05 xdist/dsession.py --- a/xdist/dsession.py +++ b/xdist/dsession.py @@ -284,10 +284,6 @@ self.config.hook.pytest_runtest_logreport(report=rep) self._handlefailures(rep) - def slave_teardownreport(self, node, rep): - rep.node = node - self.config.hook.pytest__teardown_final_logerror(report=rep) - def slave_collectreport(self, node, rep): #self.report_line("collectreport %s: %s" %(rep.id, rep.status)) #rep.node = node diff -r b92fb2f2a998db9de2a881dd7d6cd70e611b685a -r 6d23d5c1326f88b97066e5b1e950cc6950d9ee05 xdist/remote.py --- a/xdist/remote.py +++ b/xdist/remote.py @@ -26,10 +26,6 @@ for line in str(excrepr).split("\n"): self.log("IERROR> " + line) - def pytest__teardown_final_logerror(self, report): - rep = serialize_report(report) - self.sendevent("teardownreport", data=rep) - def pytest_sessionstart(self, session): self.session = session slaveinfo = getinfodict() diff -r b92fb2f2a998db9de2a881dd7d6cd70e611b685a -r 6d23d5c1326f88b97066e5b1e950cc6950d9ee05 xdist/slavemanage.py --- a/xdist/slavemanage.py +++ b/xdist/slavemanage.py @@ -301,5 +301,3 @@ return runner.TestReport(**d) elif name == "collectreport": return runner.CollectReport(**d) - elif name == "teardownreport": - return runner.TeardownErrorReport(**d) Repository URL: https://bitbucket.org/hpk42/pytest-xdist/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. _______________________________________________ py-svn mailing list py-svn@codespeak.net http://codespeak.net/mailman/listinfo/py-svn