[py-svn] pytest-xdist commit f724a1ad7e58: some changes to make remote testing work better - slightly hackish and will remain so until 'tox' is used to create environments and properly set things up.

commits-noreply at bitbucket.org commits-noreply at bitbucket.org
Sat Nov 13 19:47:09 CET 2010


# HG changeset patch -- Bitbucket.org
# Project pytest-xdist
# URL http://bitbucket.org/hpk42/pytest-xdist/overview
# User holger krekel <holger at merlinux.eu>
# Date 1289674021 -3600
# Node ID f724a1ad7e5828e2b7512d5a7413abfe867d2b9c
# Parent  2bda8b5eecd3cc2b9f4eb991826a88f3821ab17b
some changes to make remote testing work better - slightly hackish and will remain so until 'tox' is used to create environments and properly set things up.

--- 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

--- 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
 

--- 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

--- 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

--- 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.gwmanager = GatewayManager(specs, config.hook)
+        self.specs = self.gwmanager.specs
         self.roots = self._getrsyncdirs()
-        self.gwmanager = GatewayManager(specs, config.hook)
         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:

--- 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



More information about the pytest-commit mailing list