diff --git a/ISSUES.txt b/ISSUES.txt index 930bca0..7fe4579 100644 --- a/ISSUES.txt +++ b/ISSUES.txt @@ -1,3 +1,10 @@ +next release critical +----------------------------------------------- +tag: bug + +miserably fails: --dist=each --tx popen --tx socket=... + + rename / hooks ----------------------------------------------- tag: bug diff --git a/testing/test_plugin.py b/testing/test_plugin.py index 49323b0..dcff7aa 100644 --- a/testing/test_plugin.py +++ b/testing/test_plugin.py @@ -41,9 +41,10 @@ class TestDistOptions: def test_getrsyncdirs(self, testdir): config = testdir.parseconfigure('--rsyncdir=' + str(testdir.tmpdir)) nm = NodeManager(config, specs=[execnet.XSpec("popen")]) - roots = nm._getrsyncdirs() - assert len(roots) == 1 + 1 # pylib - assert testdir.tmpdir in roots + assert not nm._getrsyncdirs() + nm = NodeManager(config, specs=[execnet.XSpec("popen//chdir=qwe")]) + assert nm.roots + assert testdir.tmpdir in nm.roots def test_getrsyncdirs_with_conftest(self, testdir): p = py.path.local() @@ -55,7 +56,7 @@ class TestDistOptions: """) config = testdir.parseconfigure( testdir.tmpdir, '--rsyncdir=y', '--rsyncdir=z') - nm = NodeManager(config, specs=[execnet.XSpec("popen")]) + nm = NodeManager(config, specs=[execnet.XSpec("popen//chdir=xyz")]) roots = nm._getrsyncdirs() #assert len(roots) == 3 + 1 # pylib assert py.path.local('y') in roots diff --git a/testing/test_remote.py b/testing/test_remote.py index 7380d33..60d0a24 100644 --- a/testing/test_remote.py +++ b/testing/test_remote.py @@ -88,6 +88,8 @@ class TestReportSerialization: assert newrep.passed == rep.passed assert newrep.failed == rep.failed assert newrep.skipped == rep.skipped + if newrep.skipped: + assert len(newrep.reprcrash) == 3 assert newrep.outcome == rep.outcome assert newrep.when == rep.when assert newrep.keywords == rep.keywords diff --git a/xdist/dsession.py b/xdist/dsession.py index 18e9747..658c328 100644 --- a/xdist/dsession.py +++ b/xdist/dsession.py @@ -247,10 +247,14 @@ class DSession: def slave_errordown(self, node, error): self.config.hook.pytest_testnodedown(node=node, error=error) - crashitem = self.sched.remove_node(node) - if crashitem: - self.handle_crashitem(crashitem, node) - #self.report_line("item crashed on node: %s" % crashitem) + try: + crashitem = self.sched.remove_node(node) + except KeyError: + pass + else: + if crashitem: + self.handle_crashitem(crashitem, node) + #self.report_line("item crashed on node: %s" % crashitem) if not self.sched.hasnodes(): self.session_finished = True diff --git a/xdist/remote.py b/xdist/remote.py index 5154fda..2f8a8d2 100644 --- a/xdist/remote.py +++ b/xdist/remote.py @@ -121,6 +121,11 @@ def remote_initconfig(option_dict, args): if __name__ == '__channelexec__': slaveinput,args,option_dict = channel.receive() + importpath = os.getcwd() + sys.path.insert(0, importpath) # XXX only for remote situations + os.environ['PYTHONPATH'] = (importpath + os.pathsep + + os.environ.get('PYTHONPATH', '')) + #os.environ['PYTHONPATH'] = importpath import py config = remote_initconfig(option_dict, args) config.slaveinput = slaveinput diff --git a/xdist/slavemanage.py b/xdist/slavemanage.py index 5703da1..3cad188 100644 --- a/xdist/slavemanage.py +++ b/xdist/slavemanage.py @@ -10,8 +10,9 @@ class NodeManager(object): self.config = config if specs is None: specs = self._getxspecs() - self.roots = self._getrsyncdirs() self.gwmanager = GatewayManager(specs, config.hook) + self.specs = self.gwmanager.specs + self.roots = self._getrsyncdirs() self._nodesready = py.std.threading.Event() def trace(self, msg): @@ -34,12 +35,6 @@ class NodeManager(object): # send each rsync root for root in self.roots: self.gwmanager.rsync(root, **options) - else: - XXX # do we want to care for situations without explicit rsyncdirs? - # we transfer our topdir as the root - self.gwmanager.rsync(self.config.topdir, **options) - # and cd into it - self.gwmanager.multi_chdir(self.config.topdir.basename, inplacelocal=False) def makegateways(self): # we change to the topdir sot that @@ -83,8 +78,16 @@ class NodeManager(object): return [execnet.XSpec(x) for x in xspeclist] def _getrsyncdirs(self): + for spec in self.specs: + if not spec.popen or spec.chdir: + break + else: + return [] + import pytest, _pytest + pytestpath = pytest.__file__.rstrip("co") + pytestdir = py.path.local(_pytest.__file__).dirpath() config = self.config - candidates = [py._pydir] + candidates = [py._pydir,pytestpath,pytestdir] candidates += config.option.rsyncdir conftestroots = config.getini("rsyncdirs") if conftestroots: