Skip to content

Tests failing on some filesystems #67

Open
@PatrikKopkan

Description

@PatrikKopkan

Hello, when I ran tox on my machine I got OSError [Errno 18] Invalid cross-device link at these tests:

  • tests/test_python.py::test_python_versions
  • tests/test_python.py::test_shims_are_kept
  • tests/test_python.py::test_shims_are_removed

I think it is because my system uses different filesystem for /tmp directory, so when setup_pythons function in confest.py makes hard link, it fails. I wanted to ask if this issue is worth fixing.

I can possibly workaround that by editing tox.ini with this option of the pytest --basetemp=mydir.

The output of the test: platform linux -- Python 3.7.2, pytest-4.4.0, py-1.8.0, pluggy-0.9.0 cachedir: .tox/py37/.pytest_cache rootdir: /home/pkopkan/Documents/rpm/python-pythonfinder/work_on_test/pythonfinder-1.2.0, inifile: setup.cfg, testpaths: tests/ plugins: timeout-1.3.3, cov-2.6.1 timeout: 300.0s timeout method: signal timeout func_only: False collected 47 items

tests/test_python.py E.....EE [ 17%]
tests/test_utils.py ....................................... [100%]

==================================== ERRORS ====================================
____________________ ERROR at setup of test_python_versions ____________________

tmpdir = local('/tmp/pytest-of-pkopkan/pytest-4/test_python_versions0')

@pytest.fixture
def special_character_python(tmpdir):
    finder = pythonfinder.Finder(
        global_search=True, system=False, ignore_unsupported=True
    )
    python = finder.find_python_version("2")
    python_name = "{0}+".format(python.name)
    python_folder = tmpdir.mkdir(python_name)
    bin_dir = python_folder.mkdir("bin")
    python_path = bin_dir.join("python")
  os.link(python.path.as_posix(), python_path.strpath)

E OSError: [Errno 18] Invalid cross-device link: '/usr/bin/python2.7' -> '/tmp/pytest-of-pkopkan/pytest-4/test_python_versions0/python2.7+/bin/python'

tests/conftest.py:242: OSError
____________________ ERROR at setup of test_shims_are_kept _____________________

tmpdir = local('/tmp/pytest-of-pkopkan/pytest-4/test_shims_are_kept0')

@pytest.fixture
def setup_pythons(tmpdir):
    runner = click.testing.CliRunner()
    fake_root_path = tmpdir.join("root")
    fake_root_path.mkdir()
    fake_root = fake_root_path.strpath
    with runner.isolated_filesystem(), vistir.contextmanagers.temp_environ():
        home_dir = pythonfinder.utils.normalize_path(os.curdir)
        # This is pip's isolation approach, swipe it for now for time savings
        if sys.platform == "win32":
            home_drive, home_path = os.path.splitdrive(home_dir)
            os.environ.update(
                {
                    "USERPROFILE": home_dir,
                    "HOMEDRIVE": home_drive,
                    "HOMEPATH": home_path,
                }
            )
            for env_var, sub_path in (
                ("APPDATA", "AppData/Roaming"),
                ("LOCALAPPDATA", "AppData/Local"),
            ):
                path = os.path.join(home_dir, *sub_path.split("/"))
                os.environ[env_var] = path
                vistir.path.mkdir_p(path)
        else:
            os.environ["HOME"] = home_dir
            os.environ["XDG_DATA_HOME"] = os.path.join(home_dir, ".local", "share")
            os.environ["XDG_CONFIG_HOME"] = os.path.join(home_dir, ".config")
            os.environ["XDG_CACHE_HOME"] = os.path.join(home_dir, ".cache")
            os.environ["XDG_RUNTIME_DIR"] = os.path.join(home_dir, ".runtime")
            vistir.path.mkdir_p(os.path.join(home_dir, ".cache"))
            vistir.path.mkdir_p(os.path.join(home_dir, ".config"))
            vistir.path.mkdir_p(os.path.join(home_dir, ".local", "share"))
            vistir.path.mkdir_p(os.path.join(fake_root, "usr", "local", "share"))
            vistir.path.mkdir_p(os.path.join(fake_root, "usr", "share"))
            os.environ["XDG_DATA_DIRS"] = ":".join(
                [
                    os.path.join(fake_root, "usr", "local", "share"),
                    os.path.join(fake_root, "usr", "share"),
                ]
            )
        pyenv_dir = os.path.join(home_dir, ".pyenv")
        asdf_dir = os.path.join(home_dir, ".asdf")
        pyenv_shim_dir = os.path.join(pyenv_dir, "shims")
        asdf_shim_dir = os.path.join(asdf_dir, "shims")
        vistir.path.mkdir_p(pyenv_shim_dir)
        vistir.path.mkdir_p(asdf_shim_dir)
        env_path = os.pathsep.join([pyenv_shim_dir, asdf_shim_dir, os.defpath])
        os.environ["PATH"] = env_path
        all_versions = {}
        for python in itertools.chain(
            STACKLESS,
            PYPY,
            PYSTON,
            MINICONDA,
            MICROPYTHON,
            JYTHON,
            ANACONDA,
            IRONPYTHON,
            ACTIVEPYTHON,
            PYTHON,
        ):
            pyenv_bin = os.path.join(pyenv_dir, "versions", python, "bin")
            asdf_bin = os.path.join(asdf_dir, "installs", "python", python, "bin")
            vistir.path.mkdir_p(pyenv_bin)
            vistir.path.mkdir_p(asdf_bin)
            python_version = random.choice(["python3.7m", "python3.6m", "python2.7"])
            all_versions[python] = os.path.join(pyenv_bin, python_version)
            for exe in ["python", python_version, python]:
              os.link(sys.executable, os.path.join(pyenv_bin, exe))

E OSError: [Errno 18] Invalid cross-device link: '/home/pkopkan/Documents/rpm/python-pythonfinder/work_on_test/pythonfinder-1.2.0/.tox/py37/bin/python' -> '/tmp/tmpgi7vwy2f/.pyenv/versions/stackless-dev/bin/python'

tests/conftest.py:215: OSError
___________________ ERROR at setup of test_shims_are_removed ___________________

tmpdir = local('/tmp/pytest-of-pkopkan/pytest-4/test_shims_are_removed0')

@pytest.fixture
def setup_pythons(tmpdir):
    runner = click.testing.CliRunner()
    fake_root_path = tmpdir.join("root")
    fake_root_path.mkdir()
    fake_root = fake_root_path.strpath
    with runner.isolated_filesystem(), vistir.contextmanagers.temp_environ():
        home_dir = pythonfinder.utils.normalize_path(os.curdir)
        # This is pip's isolation approach, swipe it for now for time savings
        if sys.platform == "win32":
            home_drive, home_path = os.path.splitdrive(home_dir)
            os.environ.update(
                {
                    "USERPROFILE": home_dir,
                    "HOMEDRIVE": home_drive,
                    "HOMEPATH": home_path,
                }
            )
            for env_var, sub_path in (
                ("APPDATA", "AppData/Roaming"),
                ("LOCALAPPDATA", "AppData/Local"),
            ):
                path = os.path.join(home_dir, *sub_path.split("/"))
                os.environ[env_var] = path
                vistir.path.mkdir_p(path)
        else:
            os.environ["HOME"] = home_dir
            os.environ["XDG_DATA_HOME"] = os.path.join(home_dir, ".local", "share")
            os.environ["XDG_CONFIG_HOME"] = os.path.join(home_dir, ".config")
            os.environ["XDG_CACHE_HOME"] = os.path.join(home_dir, ".cache")
            os.environ["XDG_RUNTIME_DIR"] = os.path.join(home_dir, ".runtime")
            vistir.path.mkdir_p(os.path.join(home_dir, ".cache"))
            vistir.path.mkdir_p(os.path.join(home_dir, ".config"))
            vistir.path.mkdir_p(os.path.join(home_dir, ".local", "share"))
            vistir.path.mkdir_p(os.path.join(fake_root, "usr", "local", "share"))
            vistir.path.mkdir_p(os.path.join(fake_root, "usr", "share"))
            os.environ["XDG_DATA_DIRS"] = ":".join(
                [
                    os.path.join(fake_root, "usr", "local", "share"),
                    os.path.join(fake_root, "usr", "share"),
                ]
            )
        pyenv_dir = os.path.join(home_dir, ".pyenv")
        asdf_dir = os.path.join(home_dir, ".asdf")
        pyenv_shim_dir = os.path.join(pyenv_dir, "shims")
        asdf_shim_dir = os.path.join(asdf_dir, "shims")
        vistir.path.mkdir_p(pyenv_shim_dir)
        vistir.path.mkdir_p(asdf_shim_dir)
        env_path = os.pathsep.join([pyenv_shim_dir, asdf_shim_dir, os.defpath])
        os.environ["PATH"] = env_path
        all_versions = {}
        for python in itertools.chain(
            STACKLESS,
            PYPY,
            PYSTON,
            MINICONDA,
            MICROPYTHON,
            JYTHON,
            ANACONDA,
            IRONPYTHON,
            ACTIVEPYTHON,
            PYTHON,
        ):
            pyenv_bin = os.path.join(pyenv_dir, "versions", python, "bin")
            asdf_bin = os.path.join(asdf_dir, "installs", "python", python, "bin")
            vistir.path.mkdir_p(pyenv_bin)
            vistir.path.mkdir_p(asdf_bin)
            python_version = random.choice(["python3.7m", "python3.6m", "python2.7"])
            all_versions[python] = os.path.join(pyenv_bin, python_version)
            for exe in ["python", python_version, python]:
              os.link(sys.executable, os.path.join(pyenv_bin, exe))

E OSError: [Errno 18] Invalid cross-device link: '/home/pkopkan/Documents/rpm/python-pythonfinder/work_on_test/pythonfinder-1.2.0/.tox/py37/bin/python' -> '/tmp/tmpeq3v8sot/.pyenv/versions/stackless-dev/bin/python'

tests/conftest.py:215: OSError
=========================== short test summary info ============================
ERROR tests/test_python.py::test_python_versions
ERROR tests/test_python.py::test_shims_are_kept
ERROR tests/test_python.py::test_shims_are_removed
====================== 44 passed, 3 error in 0.97 seconds ======================
ERROR: InvocationError for command '/home/pkopkan/Documents/rpm/python-pythonfinder/work_on_test/pythonfinder-1.2.0/.tox/py37/bin/coverage run -m pytest' (exited with code 1)
___________________________________ summary ____________________________________
ERROR: py37: commands failed

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestquestionFurther information is requested

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions