diff --git a/bin/tests/system/README.md b/bin/tests/system/README.md index 3ebc33dbef..dc5f782779 100644 --- a/bin/tests/system/README.md +++ b/bin/tests/system/README.md @@ -46,16 +46,11 @@ nameserver and is listed in the hints file of the others. To run system tests, make sure you have the following dependencies installed: -- python3 -- pytest +- python3 (3.10 and newer) - perl -- dnspython -- pytest-xdist (for parallel execution) -- python-jinja2 -Individual system tests might also require additional dependencies. If those -are missing, the affected tests will be skipped and should produce a message -specifying what additional prerequisites they expect. +List of required python packages and their versions can be found in +requirements.txt (can be installed with `pip3 install -r requirements.txt`). ### Network Setup diff --git a/bin/tests/system/conftest.py b/bin/tests/system/conftest.py index 8e7c04009d..d26cbd3acc 100644 --- a/bin/tests/system/conftest.py +++ b/bin/tests/system/conftest.py @@ -17,6 +17,7 @@ import shutil import subprocess import tempfile import time +import sys import pytest @@ -29,6 +30,8 @@ from isctest.vars.dirs import SYSTEM_TEST_DIR_GIT_PATH # Silence warnings caused by passing a pytest fixture to another fixture. # pylint: disable=redefined-outer-name +if sys.version_info[1] < 10: + raise RuntimeError("Python 3.10 or newer is required to run system tests.") isctest.log.init_conftest_logger() isctest.log.avoid_duplicated_logs() @@ -355,12 +358,6 @@ def system_test_dir(request, system_test_name, expected_artifacts): assert all(res.outcome == "passed" for res in test_results.values()) return "passed" - def unlink(path): - try: - path.unlink() # missing_ok=True isn't available on Python 3.6 - except FileNotFoundError: - pass - def check_artifacts(source_dir, run_dir): def check_artifacts_recursive(dcmp): def artifact_expected(path, expected): @@ -412,7 +409,7 @@ def system_test_dir(request, system_test_name, expected_artifacts): # Create a convenience symlink with a stable and predictable name module_name = SYMLINK_REPLACEMENT_RE.sub(r"\1", str(request.node.path)) symlink_dst = system_test_root / module_name - unlink(symlink_dst) + symlink_dst.unlink(missing_ok=True) symlink_dst.symlink_to(os.path.relpath(testdir, start=system_test_root)) isctest.log.init_module_logger(system_test_name, testdir) @@ -461,7 +458,7 @@ def system_test_dir(request, system_test_name, expected_artifacts): isctest.log.deinit_module_logger() if not keep: shutil.rmtree(testdir) - unlink(symlink_dst) + symlink_dst.unlink(missing_ok=True) @pytest.fixture(scope="module") diff --git a/configure.ac b/configure.ac index d162ef9feb..df1fb81cf9 100644 --- a/configure.ac +++ b/configure.ac @@ -317,7 +317,7 @@ AM_CONDITIONAL([HAVE_PERL], [test -n "$PERL"]) # # Python is optional, it is used only by some of the system test scripts. # -AM_PATH_PYTHON([3.6], [], [:]) +AM_PATH_PYTHON([3.10], [], [:]) AM_CONDITIONAL([HAVE_PYTHON], [test "$PYTHON" != ":"]) AC_PATH_PROGS([PYTEST], [pytest-3 py.test-3 pytest py.test pytest-pypy], [])