def test_rsync_report(
     self,
     pytester: pytest.Pytester,
     source: Path,
     dest: Path,
     workercontroller,
     capsys: pytest.CaptureFixture[str],
     flag: str,
     expects_report: bool,
 ) -> None:
     dir1 = source / "dir1"
     dir1.mkdir()
     args = [
         "--tx",
         "popen//chdir=%s" % dest, "--rsyncdir",
         str(dir1),
         str(source)
     ]
     if flag:
         args.append(flag)
     nodemanager = NodeManager(pytester.parseconfig(*args))
     nodemanager.setup_nodes(None)  # calls .rsync_roots()
     out, _ = capsys.readouterr()
     if expects_report:
         assert "<= pytest/__init__.py" in out
     else:
         assert "<= pytest/__init__.py" not in out
 def test_rsyncignore(self, pytester: pytest.Pytester, source: Path,
                      dest: Path, workercontroller) -> None:
     dir2 = source.joinpath("dir1", "dir2")
     dir2.mkdir(parents=True)
     source.joinpath("dir5", "dir6").mkdir(parents=True)
     source.joinpath("dir5", "dir6", "bogus").touch()
     source.joinpath("dir5", "file").touch()
     dir2.joinpath("hello").touch()
     source.joinpath("foo").mkdir()
     source.joinpath("foo", "bar").touch()
     source.joinpath("bar").mkdir()
     source.joinpath("bar", "foo").touch()
     source.joinpath("tox.ini").write_text(
         textwrap.dedent("""
             [pytest]
             rsyncdirs = dir1 dir5
             rsyncignore = dir1/dir2 dir5/dir6 foo*
             """))
     config = pytester.parseconfig(source)
     config.option.rsyncignore = ["bar"]
     nodemanager = NodeManager(config, ["popen//chdir=%s" % dest])
     nodemanager.setup_nodes(None)  # calls .rsync_roots()
     assert dest.joinpath("dir1").exists()
     assert not dest.joinpath("dir1", "dir2").exists()
     assert dest.joinpath("dir5", "file").exists()
     assert not dest.joinpath("dir6").exists()
     assert not dest.joinpath("foo").exists()
     assert not dest.joinpath("bar").exists()
Beispiel #3
0
 def test_getrsyncdirs(self, pytester: pytest.Pytester) -> None:
     config = pytester.parseconfigure("--rsyncdir=" + str(pytester.path))
     nm = NodeManager(config, specs=[execnet.XSpec("popen")])
     assert not nm._getrsyncdirs()
     nm = NodeManager(config, specs=[execnet.XSpec("popen//chdir=qwe")])
     assert nm.roots
     assert pytester.path in nm.roots
 def test_rsyncignore(self, testdir, mysetup, workercontroller):
     source, dest = mysetup.source, mysetup.dest
     dir2 = source.ensure("dir1", "dir2", dir=1)
     source.ensure("dir5", "dir6", "bogus")
     source.ensure("dir5", "file")
     dir2.ensure("hello")
     source.ensure("foo", "bar")
     source.ensure("bar", "foo")
     source.join("tox.ini").write(
         textwrap.dedent(
             """
         [pytest]
         rsyncdirs = dir1 dir5
         rsyncignore = dir1/dir2 dir5/dir6 foo*
     """
         )
     )
     config = testdir.parseconfig(source)
     config.option.rsyncignore = ["bar"]
     nodemanager = NodeManager(config, ["popen//chdir=%s" % dest])
     nodemanager.setup_nodes(None)  # calls .rsync_roots()
     assert dest.join("dir1").check()
     assert not dest.join("dir1", "dir2").check()
     assert dest.join("dir5", "file").check()
     assert not dest.join("dir6").check()
     assert not dest.join("foo").check()
     assert not dest.join("bar").check()
Beispiel #5
0
 def test_getrsyncdirs(self, testdir):
     config = testdir.parseconfigure('--rsyncdir=' + str(testdir.tmpdir))
     nm = NodeManager(config, specs=[execnet.XSpec("popen")])
     assert not nm._getrsyncdirs()
     nm = NodeManager(config, specs=[execnet.XSpec("popen//chdir=qwe")])
     assert nm.roots
     assert testdir.tmpdir in nm.roots
Beispiel #6
0
 def test_getxspecs(self, pytester: pytest.Pytester) -> None:
     config = pytester.parseconfigure("--tx=popen", "--tx", "ssh=xyz")
     nodemanager = NodeManager(config)
     xspecs = nodemanager._getxspecs()
     assert len(xspecs) == 2
     print(xspecs)
     assert xspecs[0].popen
     assert xspecs[1].ssh == "xyz"
Beispiel #7
0
 def test_getxspecs(self, testdir):
     config = testdir.parseconfigure("--tx=popen", "--tx", "ssh=xyz")
     nodemanager = NodeManager(config)
     xspecs = nodemanager._getxspecs()
     assert len(xspecs) == 2
     print(xspecs)
     assert xspecs[0].popen
     assert xspecs[1].ssh == "xyz"
    def pytest_sessionstart(self, session):
        """Creates and starts the nodes.

        The nodes are setup to put their events onto self.queue.  As
        soon as nodes start they will emit the worker_workerready event.
        """
        self.nodemanager = NodeManager(self.config)
        nodes = self.nodemanager.setup_nodes(putevent=self.queue.put)
        self._active_nodes.update(nodes)
        self._session = session
 def test_optimise_popen(self, pytester: pytest.Pytester, source: Path,
                         dest: Path, workercontroller) -> None:
     specs = ["popen"] * 3
     source.joinpath("conftest.py").write_text("rsyncdirs = ['a']")
     source.joinpath("a").mkdir()
     config = pytester.parseconfig(source)
     nodemanager = NodeManager(config, specs)
     nodemanager.setup_nodes(None)  # calls .rysnc_roots()
     for gwspec in nodemanager.specs:
         assert gwspec._samefilesystem()
         assert not gwspec.chdir
Beispiel #10
0
 def test_optimise_popen(self, testdir, mysetup, workercontroller):
     source = mysetup.source
     specs = ["popen"] * 3
     source.join("conftest.py").write("rsyncdirs = ['a']")
     source.ensure("a", dir=1)
     config = testdir.parseconfig(source)
     nodemanager = NodeManager(config, specs)
     nodemanager.setup_nodes(None)  # calls .rysnc_roots()
     for gwspec in nodemanager.specs:
         assert gwspec._samefilesystem()
         assert not gwspec.chdir
 def test_rsync_report(self, testdir, mysetup, workercontroller, capsys,
                       flag, expects_report):
     source, dest = mysetup.source, mysetup.dest
     dir1 = mysetup.source.mkdir("dir1")
     args = "--tx", "popen//chdir=%s" % dest, "--rsyncdir", dir1, source
     if flag:
         args += (flag, )
     nodemanager = NodeManager(testdir.parseconfig(*args))
     nodemanager.setup_nodes(None)  # calls .rsync_roots()
     out, _ = capsys.readouterr()
     if expects_report:
         assert "<= pytest/__init__.py" in out
     else:
         assert "<= pytest/__init__.py" not in out
Beispiel #12
0
    def test_popens_rsync(self, config, mysetup, workercontroller):
        source = mysetup.source
        hm = NodeManager(config, ["popen"] * 2)
        hm.setup_nodes(None)
        assert len(hm.group) == 2
        for gw in hm.group:

            class pseudoexec:
                args = []

                def __init__(self, *args):
                    self.args.extend(args)

                def waitclose(self):
                    pass

            gw.remote_exec = pseudoexec
        notifications = []
        for gw in hm.group:
            hm.rsync(gw,
                     source,
                     notify=lambda *args: notifications.append(args))
        assert not notifications
        hm.teardown_nodes()
        assert not len(hm.group)
        assert "sys.path.insert" in gw.remote_exec.args[0]
Beispiel #13
0
 def test_getrsyncdirs_with_conftest(self, testdir):
     p = py.path.local()
     for bn in 'x y z'.split():
         p.mkdir(bn)
     testdir.makeini("""
         [pytest]
         rsyncdirs= x
     """)
     config = testdir.parseconfigure(testdir.tmpdir, '--rsyncdir=y',
                                     '--rsyncdir=z')
     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
     assert py.path.local('z') in roots
     assert testdir.tmpdir.join('x') in roots
Beispiel #14
0
 def test_getrsyncdirs_with_conftest(self,
                                     pytester: pytest.Pytester) -> None:
     p = Path.cwd()
     for bn in ("x", "y", "z"):
         p.joinpath(bn).mkdir()
     pytester.makeini("""
         [pytest]
         rsyncdirs= x
     """)
     config = pytester.parseconfigure(pytester.path, "--rsyncdir=y",
                                      "--rsyncdir=z")
     nm = NodeManager(config, specs=[execnet.XSpec("popen//chdir=xyz")])
     roots = nm._getrsyncdirs()
     # assert len(roots) == 3 + 1 # pylib
     assert Path("y").resolve() in roots
     assert Path("z").resolve() in roots
     assert pytester.path.joinpath("x") in roots
Beispiel #15
0
 def test_init_rsync_roots(self, testdir, mysetup, workercontroller):
     source, dest = mysetup.source, mysetup.dest
     dir2 = source.ensure("dir1", "dir2", dir=1)
     source.ensure("dir1", "somefile", dir=1)
     dir2.ensure("hello")
     source.ensure("bogusdir", "file")
     source.join("tox.ini").write(
         textwrap.dedent("""
         [pytest]
         rsyncdirs=dir1/dir2
     """))
     config = testdir.parseconfig(source)
     nodemanager = NodeManager(config, ["popen//chdir=%s" % dest])
     nodemanager.setup_nodes(None)  # calls .rsync_roots()
     assert dest.join("dir2").check()
     assert not dest.join("dir1").check()
     assert not dest.join("bogus").check()
 def test_rsync_popen_with_path(self, config, mysetup, workercontroller):
     source, dest = mysetup.source, mysetup.dest
     hm = NodeManager(config, ["popen//chdir=%s" % dest] * 1)
     hm.setup_nodes(None)
     source.ensure("dir1", "dir2", "hello")
     notifications = []
     for gw in hm.group:
         hm.rsync(gw, source, notify=lambda *args: notifications.append(args))
     assert len(notifications) == 1
     assert notifications[0] == ("rsyncrootready", hm.group["gw0"].spec, source)
     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()
Beispiel #17
0
 def test_rsync_same_popen_twice(self, config, mysetup, hookrecorder,
                                 workercontroller):
     source, dest = mysetup.source, mysetup.dest
     hm = NodeManager(config, ["popen//chdir=%s" % dest] * 2)
     hm.roots = []
     hm.setup_nodes(None)
     source.ensure("dir1", "dir2", "hello")
     gw = hm.group[0]
     hm.rsync(gw, source)
     call = hookrecorder.popcall("pytest_xdist_rsyncstart")
     assert call.source == source
     assert len(call.gateways) == 1
     assert call.gateways[0] in hm.group
     call = hookrecorder.popcall("pytest_xdist_rsyncfinish")
 def test_rsync_popen_with_path(self, config, source: Path, dest: Path,
                                workercontroller) -> None:
     hm = NodeManager(config, ["popen//chdir=%s" % dest] * 1)
     hm.setup_nodes(None)
     source.joinpath("dir1", "dir2").mkdir(parents=True)
     source.joinpath("dir1", "dir2", "hello").touch()
     notifications = []
     for gw in hm.group:
         hm.rsync(gw,
                  source,
                  notify=lambda *args: notifications.append(args))
     assert len(notifications) == 1
     assert notifications[0] == ("rsyncrootready", hm.group["gw0"].spec,
                                 source)
     hm.teardown_nodes()
     dest = dest.joinpath(source.name)
     assert dest.joinpath("dir1").exists()
     assert dest.joinpath("dir1", "dir2").exists()
     assert dest.joinpath("dir1", "dir2", "hello").exists()
Beispiel #19
0
 def test_rsync_roots_no_roots(self, testdir, mysetup):
     mysetup.source.ensure("dir1", "file1").write("hello")
     config = testdir.parseconfig(mysetup.source)
     nodemanager = NodeManager(config, ["popen//chdir=%s" % mysetup.dest])
     # assert nodemanager.config.topdir == source == config.topdir
     nodemanager.makegateways()
     nodemanager.rsync_roots()
     p, = nodemanager.gwmanager.multi_exec(
         "import os ; channel.send(os.getcwd())").receive_each()
     p = py.path.local(p)
     print("remote curdir", p)
     assert p == mysetup.dest.join(config.topdir.basename)
     assert p.join("dir1").check()
     assert p.join("dir1", "file1").check()
    def test_popen_makegateway_events(self, config, hookrecorder, workercontroller):
        hm = NodeManager(config, ["popen"] * 2)
        hm.setup_nodes(None)
        call = hookrecorder.popcall("pytest_xdist_setupnodes")
        assert len(call.specs) == 2

        call = hookrecorder.popcall("pytest_xdist_newgateway")
        assert call.gateway.spec == execnet.XSpec("popen")
        assert call.gateway.id == "gw0"
        call = hookrecorder.popcall("pytest_xdist_newgateway")
        assert call.gateway.id == "gw1"
        assert len(hm.group) == 2
        hm.teardown_nodes()
        assert not len(hm.group)
 def test_rsync_roots_no_roots(self, pytester: pytest.Pytester,
                               source: Path, dest: Path) -> None:
     source.joinpath("dir1").mkdir()
     source.joinpath("dir1", "file1").write_text("hello")
     config = pytester.parseconfig(source)
     nodemanager = NodeManager(config, ["popen//chdir=%s" % dest])
     # assert nodemanager.config.topdir == source == config.topdir
     nodemanager.makegateways()  # type: ignore[attr-defined]
     nodemanager.rsync_roots()  # type: ignore[call-arg]
     (p, ) = nodemanager.gwmanager.multi_exec(  # type: ignore[attr-defined]
         "import os ; channel.send(os.getcwd())").receive_each()
     p = Path(p)
     print("remote curdir", p)
     assert p == dest.joinpath(config.rootpath.name)
     assert p.joinpath("dir1").check()
     assert p.joinpath("dir1", "file1").check()
 def test_rsync_same_popen_twice(
     self,
     config,
     source: Path,
     dest: Path,
     hookrecorder,
     workercontroller,
 ) -> None:
     hm = NodeManager(config, ["popen//chdir=%s" % dest] * 2)
     hm.roots = []
     hm.setup_nodes(None)
     source.joinpath("dir1", "dir2").mkdir(parents=True)
     source.joinpath("dir1", "dir2", "hello").touch()
     gw = hm.group[0]
     hm.rsync(gw, source)
     call = hookrecorder.popcall("pytest_xdist_rsyncstart")
     assert call.source == source
     assert len(call.gateways) == 1
     assert call.gateways[0] in hm.group
     call = hookrecorder.popcall("pytest_xdist_rsyncfinish")
Beispiel #23
0
 def test_popen_rsync_subdir(self, testdir, mysetup, workercontroller):
     source, dest = mysetup.source, mysetup.dest
     dir1 = mysetup.source.mkdir("dir1")
     dir2 = dir1.mkdir("dir2")
     dir2.ensure("hello")
     for rsyncroot in (dir1, source):
         dest.remove()
         nodemanager = NodeManager(
             testdir.parseconfig("--tx", "popen//chdir=%s" % dest,
                                 "--rsyncdir", rsyncroot, source))
         nodemanager.setup_nodes(None)  # calls .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.teardown_nodes()
 def test_popen_rsync_subdir(self, pytester: pytest.Pytester, source: Path,
                             dest: Path, workercontroller) -> None:
     dir1 = source / "dir1"
     dir1.mkdir()
     dir2 = dir1 / "dir2"
     dir2.mkdir()
     dir2.joinpath("hello").touch()
     for rsyncroot in (dir1, source):
         shutil.rmtree(str(dest), ignore_errors=True)
         nodemanager = NodeManager(
             pytester.parseconfig("--tx", "popen//chdir=%s" % dest,
                                  "--rsyncdir", rsyncroot, source))
         nodemanager.setup_nodes(None)  # calls .rsync_roots()
         if rsyncroot == source:
             dest = dest.joinpath("source")
         assert dest.joinpath("dir1").exists()
         assert dest.joinpath("dir1", "dir2").exists()
         assert dest.joinpath("dir1", "dir2", "hello").exists()
         nodemanager.teardown_nodes()
Beispiel #25
0
 def test_xspecs_multiplied(self, testdir):
     config = testdir.parseconfigure("--tx=3*popen", )
     xspecs = NodeManager(config)._getxspecs()
     assert len(xspecs) == 3
     assert xspecs[1].popen
Beispiel #26
0
 def test_getrsyncignore(self, testdir):
     config = testdir.parseconfigure('--rsyncignore=fo*')
     nm = NodeManager(config, specs=[execnet.XSpec("popen//chdir=qwe")])
     assert 'fo*' in nm.rsyncoptions['ignores']
Beispiel #27
0
def test_testrunuid_provided(pytester: pytest.Pytester) -> None:
    config = pytester.parseconfigure("--testrunuid", "test123", "--tx=popen")
    nm = NodeManager(config)
    assert nm.testrunuid == "test123"
Beispiel #28
0
 def test_getrsyncignore(self, pytester: pytest.Pytester) -> None:
     config = pytester.parseconfigure("--rsyncignore=fo*")
     nm = NodeManager(config, specs=[execnet.XSpec("popen//chdir=qwe")])
     assert "fo*" in nm.rsyncoptions["ignores"]
Beispiel #29
0
 def test_xspecs_multiplied(self, pytester: pytest.Pytester) -> None:
     config = pytester.parseconfigure("--tx=3*popen")
     xspecs = NodeManager(config)._getxspecs()
     assert len(xspecs) == 3
     assert xspecs[1].popen
Beispiel #30
0
def test_testrunuid_generated(pytester: pytest.Pytester) -> None:
    config = pytester.parseconfigure("--tx=popen")
    nm = NodeManager(config)
    assert len(nm.testrunuid) == 32