[py-svn] pytest-xdist commit 05e9a2aa1553: merge nodemanager and gwmanager

commits-noreply at bitbucket.org commits-noreply at bitbucket.org
Mon Nov 22 12:06:38 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 1290423955 -3600
# Node ID 05e9a2aa1553750cb155b5e05e4b7eb3be1c73d7
# Parent  b6a80ccbb4aa962384ce3998a29226f59243821c
merge nodemanager and gwmanager

--- a/setup.py
+++ b/setup.py
@@ -2,7 +2,7 @@ from setuptools import setup
 
 setup(
     name="pytest-xdist",
-    version='1.5a9',
+    version='1.5a10',
     description='py.test xdist plugin for distributed testing and loop-on-failing modes',
     long_description=open('README.txt').read(),
     license='GPLv2 or later',

--- a/xdist/dsession.py
+++ b/xdist/dsession.py
@@ -190,7 +190,7 @@ class DSession:
         return True
 
     def pytest_runtestloop(self):
-        numnodes = len(self.nodemanager.gwmanager.specs)
+        numnodes = len(self.nodemanager.specs)
         dist = self.config.getvalue("dist")
         if dist == "load":
             self.sched = LoadScheduling(numnodes, log=self.log)

--- a/xdist/slavemanage.py
+++ b/xdist/slavemanage.py
@@ -6,15 +6,22 @@ import xdist.remote
 from _pytest import runner # XXX load dynamically
 
 class NodeManager(object):
-    def __init__(self, config, specs=None):
+    EXIT_TIMEOUT = 10
+    def __init__(self, config, specs=None, defaultchdir="pyexecnetcache"):
         self.config = config
+        self._nodesready = py.std.threading.Event()
+        self.trace = self.config.trace.get("nodemanager")
+        self.group = execnet.Group()
         if specs is None:
             specs = self._getxspecs()
-        self.gwmanager = GatewayManager(specs, config.hook)
-        self.specs = self.gwmanager.specs
+        self.specs = []
+        for spec in specs:
+            if not isinstance(spec, execnet.XSpec):
+                spec = execnet.XSpec(spec)
+            if not spec.chdir and not spec.popen:
+                spec.chdir = defaultchdir
+            self.specs.append(spec)
         self.roots = self._getrsyncdirs()
-        self._nodesready = py.std.threading.Event()
-        self.trace = self.config.trace.get("nodemanager")
 
     def config_getignores(self):
         return self.config.getini("rsyncignore")
@@ -32,37 +39,30 @@ class NodeManager(object):
         if self.roots:
             # send each rsync root
             for root in self.roots:
-                self.gwmanager.rsync(root, **options)
+                self.rsync(root, **options)
 
     def makegateways(self):
-        # we change to the topdir sot that
-        # PopenGateways will have their cwd
-        # such that unpickling configs will
-        # pick it up as the right topdir
-        # (for other gateways this chdir is irrelevant)
         self.trace("making gateways")
-        #old = self.config.topdir.chdir()
-        #try:
-        self.gwmanager.makegateways()
-        #finally:
-        #    old.chdir()
+        assert not list(self.group)
+        for spec in self.specs:
+            gw = self.group.makegateway(spec)
+            self.config.hook.pytest_gwmanage_newgateway(gateway=gw)
 
     def setup_nodes(self, putevent):
         self.rsync_roots()
         self.trace("setting up nodes")
-        for gateway in self.gwmanager.group:
+        for gateway in self.group:
             node = SlaveController(self, gateway, self.config, putevent)
             gateway.node = node  # to keep node alive
             node.setup()
             self.trace("started node %r" % node)
 
     def teardown_nodes(self):
-        self.gwmanager.exit()
+        self.group.terminate(self.EXIT_TIMEOUT)
 
     def _getxspecs(self):
-        config = self.config
         xspeclist = []
-        for xspec in config.getvalue("tx"):
+        for xspec in self.config.getvalue("tx"):
             i = xspec.find("*")
             try:
                 num = int(xspec[:i])
@@ -99,28 +99,6 @@ class NodeManager(object):
                 roots.append(root)
         return roots
 
-class GatewayManager:
-    """
-        instantiating, managing and rsyncing to test hosts
-    """
-    EXIT_TIMEOUT = 10
-    def __init__(self, specs, hook, defaultchdir="pyexecnetcache"):
-        self.specs = []
-        self.hook = hook
-        self.group = execnet.Group()
-        for spec in specs:
-            if not isinstance(spec, execnet.XSpec):
-                spec = execnet.XSpec(spec)
-            if not spec.chdir and not spec.popen:
-                spec.chdir = defaultchdir
-            self.specs.append(spec)
-
-    def makegateways(self):
-        assert not list(self.group)
-        for spec in self.specs:
-            gw = self.group.makegateway(spec)
-            self.hook.pytest_gwmanage_newgateway(gateway=gw)
-
     def rsync(self, source, notify=None, verbose=False, ignores=None):
         """ perform rsync to all remote hosts.
         """
@@ -144,19 +122,16 @@ class GatewayManager:
                 seen.add(spec)
                 gateways.append(gateway)
         if seen:
-            self.hook.pytest_gwmanage_rsyncstart(
+            self.config.hook.pytest_gwmanage_rsyncstart(
                 source=source,
                 gateways=gateways,
             )
             rsync.send()
-            self.hook.pytest_gwmanage_rsyncfinish(
+            self.config.hook.pytest_gwmanage_rsyncfinish(
                 source=source,
                 gateways=gateways,
             )
 
-    def exit(self):
-        self.group.terminate(self.EXIT_TIMEOUT)
-
 class HostRSync(execnet.RSync):
     """ RSyncer that filters out common files
     """

--- a/xdist/__init__.py
+++ b/xdist/__init__.py
@@ -1,2 +1,2 @@
 #
-__version__ = '1.5a9'
+__version__ = '1.5a10'

--- a/testing/test_slavemanage.py
+++ b/testing/test_slavemanage.py
@@ -1,15 +1,20 @@
 import py
 import os
 import execnet
-from xdist.slavemanage import GatewayManager, HostRSync
-from xdist.slavemanage import NodeManager
+from xdist.slavemanage import HostRSync, NodeManager
+
+pytest_plugins = "pytester",
 
 def pytest_funcarg__hookrecorder(request):
     _pytest = request.getfuncargvalue('_pytest')
-    hook = request.getfuncargvalue('hook')
-    return _pytest.gethookrecorder(hook)
+    config = request.getfuncargvalue('config')
+    return _pytest.gethookrecorder(config.hook)
 
-def pytest_funcarg__hook(request):
+def pytest_funcarg__config(request):
+    testdir = request.getfuncargvalue("testdir")
+    config = testdir.parseconfig()
+    return config
+
     from xdist import newhooks
     from _pytest.core import HookRelay, PluginManager
     from _pytest import hookspec
@@ -22,20 +27,20 @@ class pytest_funcarg__mysetup:
         self.dest = temp.mkdir("dest")
         request.getfuncargvalue("_pytest")
 
-class TestGatewayManagerPopen:
-    def test_popen_no_default_chdir(self, hook):
-        gm = GatewayManager(["popen"], hook)
+class TestNodeManagerPopen:
+    def test_popen_no_default_chdir(self, config):
+        gm = NodeManager(config, ["popen"])
         assert gm.specs[0].chdir is None
 
-    def test_default_chdir(self, hook):
+    def test_default_chdir(self, config):
         l = ["ssh=noco", "socket=xyz"]
-        for spec in GatewayManager(l, hook).specs:
+        for spec in NodeManager(config, l).specs:
             assert spec.chdir == "pyexecnetcache"
-        for spec in GatewayManager(l, hook, defaultchdir="abc").specs:
+        for spec in NodeManager(config, l, defaultchdir="abc").specs:
             assert spec.chdir == "abc"
 
-    def test_popen_makegateway_events(self, hook, hookrecorder, _pytest):
-        hm = GatewayManager(["popen"] * 2, hook)
+    def test_popen_makegateway_events(self, config, hookrecorder, _pytest):
+        hm = NodeManager(config, ["popen"] * 2)
         hm.makegateways()
         call = hookrecorder.popcall("pytest_gwmanage_newgateway")
         assert call.gateway.spec == execnet.XSpec("popen")
@@ -43,12 +48,12 @@ class TestGatewayManagerPopen:
         call = hookrecorder.popcall("pytest_gwmanage_newgateway")
         assert call.gateway.id == "gw1"
         assert len(hm.group) == 2
-        hm.exit()
+        hm.teardown_nodes()
         assert not len(hm.group)
 
-    def test_popens_rsync(self, hook, mysetup):
+    def test_popens_rsync(self, config, mysetup):
         source = mysetup.source
-        hm = GatewayManager(["popen"] * 2, hook)
+        hm = NodeManager(config, ["popen"] * 2)
         hm.makegateways()
         assert len(hm.group) == 2
         for gw in hm.group:
@@ -62,28 +67,28 @@ class TestGatewayManagerPopen:
         l = []
         hm.rsync(source, notify=lambda *args: l.append(args))
         assert not l
-        hm.exit()
+        hm.teardown_nodes()
         assert not len(hm.group)
         assert "sys.path.insert" in gw.remote_exec.args[0]
 
-    def test_rsync_popen_with_path(self, hook, mysetup):
+    def test_rsync_popen_with_path(self, config, mysetup):
         source, dest = mysetup.source, mysetup.dest
-        hm = GatewayManager(["popen//chdir=%s" %dest] * 1, hook)
+        hm = NodeManager(config, ["popen//chdir=%s" %dest] * 1)
         hm.makegateways()
         source.ensure("dir1", "dir2", "hello")
         l = []
         hm.rsync(source, notify=lambda *args: l.append(args))
         assert len(l) == 1
         assert l[0] == ("rsyncrootready", hm.group['gw0'].spec, source)
-        hm.exit()
+        hm.teardown_nodes()
         dest = dest.join(source.basename)
         assert dest.join("dir1").check()
         assert dest.join("dir1", "dir2").check()
         assert dest.join("dir1", "dir2", 'hello').check()
 
-    def test_rsync_same_popen_twice(self, hook, mysetup, hookrecorder):
+    def test_rsync_same_popen_twice(self, config, mysetup, hookrecorder):
         source, dest = mysetup.source, mysetup.dest
-        hm = GatewayManager(["popen//chdir=%s" %dest] * 2, hook)
+        hm = NodeManager(config, ["popen//chdir=%s" %dest] * 2)
         hm.makegateways()
         source.ensure("dir1", "dir2", "hello")
         hm.rsync(source)
@@ -156,14 +161,13 @@ class TestNodeManager:
                 "--rsyncdir", rsyncroot,
                 source,
             ))
-            #assert nodemanager.config.topdir == source
             nodemanager.rsync_roots()
             if rsyncroot == source:
                 dest = dest.join("source")
             assert dest.join("dir1").check()
             assert dest.join("dir1", "dir2").check()
             assert dest.join("dir1", "dir2", 'hello').check()
-            nodemanager.gwmanager.exit()
+            nodemanager.teardown_nodes()
 
     def test_init_rsync_roots(self, testdir, mysetup):
         source, dest = mysetup.source, mysetup.dest
@@ -209,25 +213,10 @@ class TestNodeManager:
         config = testdir.reparseconfig([source])
         nodemanager = NodeManager(config, specs)
         nodemanager.rsync_roots()
-        for gwspec in nodemanager.gwmanager.specs:
+        for gwspec in nodemanager.specs:
             assert gwspec._samefilesystem()
             assert not gwspec.chdir
 
-    def test_setup_DEBUG(self, mysetup, testdir):
-        source = mysetup.source
-        specs = ["popen"] * 2
-        source.join("conftest.py").write("rsyncdirs = ['a']")
-        source.ensure('a', dir=1)
-        config = testdir.parseconfigure(source, '--debug')
-        assert config.option.debug
-        nodemanager = NodeManager(config, specs)
-        reprec = testdir.getreportrecorder(config).hookrecorder
-        nodemanager.setup_nodes(putevent=[].append)
-        for spec in nodemanager.gwmanager.specs:
-            l = reprec.getcalls("pytest_trace")
-            assert l
-        nodemanager.teardown_nodes()
-
     def test_ssh_setup_nodes(self, specssh, testdir):
         testdir.makepyfile(__init__="", test_x="""
             def test_one():



More information about the pytest-commit mailing list