Пример #1
0
    def test_addlink(self, tmpdir, debug, verbose, name):
        """
        Tests that:
        1. Symlink directory is created & file is moved there.
        2. Symlink is created.
        3. Symlink is added to bootstrap.
        4. Cache is updated with new target.

        Expected errors:
        - StowError is raised if target does not exist.
        - StowError is raised if target already exists.
        """
        cider = Cider(
            False, debug, verbose,
            cider_dir=str(tmpdir),
            support_dir=str(tmpdir.join(".cache"))
        )
        cider.add_symlink = MagicMock()

        source = os.path.abspath(str(tmpdir.join(random_str(min_length=1))))
        basename = os.path.basename(source)

        stow_dir = os.path.abspath(os.path.join(cider.symlink_dir, name))
        stow = os.path.join(stow_dir, basename)

        # StowError should be raised if source does not exist.
        with pytest.raises(StowError):
            cider.addlink(name, source)

        touch(source)
        cider.addlink(name, source)
        assert os.path.isdir(stow_dir)
        assert os.path.isfile(stow)
        assert os.path.islink(source)
        assert os.path.samefile(
            os.path.realpath(stow), os.path.realpath(source)
        )

        cider.add_symlink.assert_called_with(name, source)
        new_cache = cider._cached_targets()  # pylint:disable=W0212
        assert source in new_cache

        # StowError should be raised if source already exists.
        os.remove(source)
        touch(source)
        with pytest.raises(StowError):
            cider.addlink(source, name)
Пример #2
0
    def test_addlink(self, tmpdir, debug, verbose, name):
        """
        Tests that:
        1. Symlink directory is created & file is moved there.
        2. Symlink is created.
        3. Symlink is added to bootstrap.
        4. Cache is updated with new target.

        Expected errors:
        - StowError is raised if target does not exist.
        - StowError is raised if target already exists.
        """
        cider = Cider(False,
                      debug,
                      verbose,
                      cider_dir=str(tmpdir),
                      support_dir=str(tmpdir.join(".cache")))
        cider.add_symlink = MagicMock()

        source = os.path.abspath(str(tmpdir.join(random_str(min_length=1))))
        basename = os.path.basename(source)

        stow_dir = os.path.abspath(os.path.join(cider.symlink_dir, name))
        stow = os.path.join(stow_dir, basename)

        # StowError should be raised if source does not exist.
        with pytest.raises(StowError):
            cider.addlink(name, source)

        touch(source)
        cider.addlink(name, source)
        assert os.path.isdir(stow_dir)
        assert os.path.isfile(stow)
        assert os.path.islink(source)
        assert os.path.samefile(os.path.realpath(stow),
                                os.path.realpath(source))

        cider.add_symlink.assert_called_with(name, source)
        new_cache = cider._cached_targets()  # pylint:disable=W0212
        assert source in new_cache

        # StowError should be raised if source already exists.
        os.remove(source)
        touch(source)
        with pytest.raises(StowError):
            cider.addlink(source, name)
Пример #3
0
    def test_unlink(self, tmpdir, debug, verbose, name, links):
        """
        Tests that:
        1. Each symlink is moved back to its original location.
        2. Symlinks are removed from bootstrap.
        3. Cache is updated with targets removed.
        4. Symlink directory is removed if empty.

        Expected errors:
        - StowError is raised if no symlink was found.
        - SymlinkError is raised if target already exists.
        """
        cider = Cider(False,
                      debug,
                      verbose,
                      cider_dir=str(tmpdir.join("cider")),
                      support_dir=str(tmpdir.join("cider", ".cache")))
        cider.remove_symlink = MagicMock()

        stow_dir = os.path.abspath(os.path.join(cider.symlink_dir, name))
        os.makedirs(stow_dir)
        for link in links:
            source = os.path.join(stow_dir, link)
            target = str(tmpdir.join(link))
            touch(source)
            os.symlink(source, target)
            cider.add_symlink(name, target)

        cider.unlink(name)

        new_cache = cider._cached_targets()  # pylint:disable=W0212
        for link in links:
            source = os.path.join(stow_dir, link)
            target = str(tmpdir.join(link))
            assert os.path.exists(target)
            assert not os.path.islink(target)
            assert not os.path.exists(source)
            assert target not in new_cache

        cider.remove_symlink.assert_called_with(name)
        assert not os.path.exists(stow_dir)
Пример #4
0
    def test_unlink(self, tmpdir, debug, verbose, name, links):
        """
        Tests that:
        1. Each symlink is moved back to its original location.
        2. Symlinks are removed from bootstrap.
        3. Cache is updated with targets removed.
        4. Symlink directory is removed if empty.

        Expected errors:
        - StowError is raised if no symlink was found.
        - SymlinkError is raised if target already exists.
        """
        cider = Cider(
            False, debug, verbose,
            cider_dir=str(tmpdir.join("cider")),
            support_dir=str(tmpdir.join("cider", ".cache"))
        )
        cider.remove_symlink = MagicMock()

        stow_dir = os.path.abspath(os.path.join(cider.symlink_dir, name))
        os.makedirs(stow_dir)
        for link in links:
            source = os.path.join(stow_dir, link)
            target = str(tmpdir.join(link))
            touch(source)
            os.symlink(source, target)
            cider.add_symlink(name, target)

        cider.unlink(name)

        new_cache = cider._cached_targets()  # pylint:disable=W0212
        for link in links:
            source = os.path.join(stow_dir, link)
            target = str(tmpdir.join(link))
            assert os.path.exists(target)
            assert not os.path.islink(target)
            assert not os.path.exists(source)
            assert target not in new_cache

        cider.remove_symlink.assert_called_with(name)
        assert not os.path.exists(stow_dir)
Пример #5
0
    def test_relink(self, tmpdir, debug, verbose, force):
        """
        Tests that:
        1. Target directories are created.
        2. For each source in glob(key), mklink(src, expandtarget(src, target))
           is called.
        3. Previously-cached targets are removed.
        4. Cache is updated with new targets.
        """
        def generate_symlinks():
            srcdir = tmpdir.join(random_str(min_length=1))

            def symkey(directory, key):
                return str(directory.join(key).relto(srcdir))

            def symvalue(directory, value):
                return str(directory.join(value)) + (
                    "/" if value.endswith("/") else ""
                )

            outerdir = srcdir.join(random_str(min_length=1))
            innerdir = outerdir.join(random_str(min_length=1))
            targetdir = tmpdir.join(random_str(min_length=1))

            ext = random_str(min_length=1, max_length=8)
            os.makedirs(str(innerdir))

            for _ in range(random.randint(0, 10)):
                touch(str(innerdir.join("{0}.{1}".format(random_str(), ext))))

            path = str(outerdir.join(random_str(min_length=1)))
            touch(path)

            return {
                symkey(outerdir, "*/*." + ext): symvalue(targetdir, "a/b/c/"),
                symkey(outerdir, "*/*." + ext): symvalue(targetdir, "a/b/c"),
                symkey(outerdir, path): symvalue(targetdir, "a/b/d"),
            }

        cider = Cider(False, debug, verbose, cider_dir=str(tmpdir))
        cider.mklink = MagicMock(return_value=True)

        for srcglob, target in generate_symlinks().items():
            invalid = not isdirname(target) and ("*" in srcglob or
                                                 "?" in srcglob)
            old_targets = cider._cached_targets()  # pylint:disable=W0212
            cider.read_bootstrap = MagicMock(return_value={
                "symlinks": {srcglob: target}
            })

            with pytest.raises(SymlinkError) if invalid else empty():
                new_targets = set(cider.relink(force))
                for src in iglob(srcglob):
                    cider.mklink.assert_called_with(src, cider.expandtarget(
                        src, target
                    ))

                assert os.path.isdir(os.path.dirname(target))
                for dead_target in set(old_targets) - new_targets:
                    assert not os.path.exists(dead_target)

                new_cache = cider._cached_targets()  # pylint:disable=W0212
                assert new_targets == set(new_cache).intersection(new_targets)
Пример #6
0
    def test_relink(self, tmpdir, debug, verbose, force):
        """
        Tests that:
        1. Target directories are created.
        2. For each source in glob(key), mklink(src, expandtarget(src, target))
           is called.
        3. Previously-cached targets are removed.
        4. Cache is updated with new targets.
        """
        def generate_symlinks():
            srcdir = tmpdir.join(random_str(min_length=1))

            def symkey(directory, key):
                return str(directory.join(key).relto(srcdir))

            def symvalue(directory, value):
                return str(directory.join(value)) + ("/" if value.endswith("/")
                                                     else "")

            outerdir = srcdir.join(random_str(min_length=1))
            innerdir = outerdir.join(random_str(min_length=1))
            targetdir = tmpdir.join(random_str(min_length=1))

            ext = random_str(min_length=1, max_length=8)
            os.makedirs(str(innerdir))

            for _ in range(random.randint(0, 10)):
                touch(str(innerdir.join("{0}.{1}".format(random_str(), ext))))

            path = str(outerdir.join(random_str(min_length=1)))
            touch(path)

            return {
                symkey(outerdir, "*/*." + ext): symvalue(targetdir, "a/b/c/"),
                symkey(outerdir, "*/*." + ext): symvalue(targetdir, "a/b/c"),
                symkey(outerdir, path): symvalue(targetdir, "a/b/d"),
            }

        cider = Cider(False,
                      debug,
                      verbose,
                      cider_dir=str(tmpdir),
                      support_dir=str(tmpdir.join(".cache")))
        cider.mklink = MagicMock(return_value=True)

        for srcglob, target in generate_symlinks().items():
            invalid = not isdirname(target) and ("*" in srcglob
                                                 or "?" in srcglob)
            old_targets = cider._cached_targets()  # pylint:disable=W0212
            cider.read_bootstrap = MagicMock(
                return_value={"symlinks": {
                    srcglob: target
                }})

            with pytest.raises(SymlinkError) if invalid else empty():
                new_targets = set(cider.relink(force))
                for src in iglob(srcglob):
                    cider.mklink.assert_called_with(
                        src, cider.expandtarget(src, target))

                assert os.path.isdir(os.path.dirname(target))
                for dead_target in set(old_targets) - new_targets:
                    assert not os.path.exists(dead_target)

                new_cache = cider._cached_targets()  # pylint:disable=W0212
                assert new_targets == set(new_cache) & new_targets