]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Make system tests compatible with pytest 8.0.0+
authorNicki Křížek <nicki@isc.org>
Mon, 27 May 2024 14:10:04 +0000 (16:10 +0200)
committerNicki Křížek <nicki@isc.org>
Thu, 24 Oct 2024 11:57:41 +0000 (13:57 +0200)
The pytest collection mechanism has been overhauled in pytest 8.0.0,
resulting in a different node tree when collecting the tests. Ensure the
paths / names we're using that are derived from the node tree are
consistent across different pytest versions.

Particularly, this has affected the convenience symlink name (which is
supposed to be in the form of e.g. dns64_sh_dns64 for the dns64 module
and tests_sh_dns64.py module) and the test name that's logged at the
start of the test, which is supposed to include the system test
directory relative to the root system test directory as well as the
module name (e.g. dns64/tests_sh_dns64.py).

Related https://github.com/pytest-dev/pytest/issues/7777

(cherry picked from commit 7118cbed984108ba22bd2de4b86ccf4abc9a558d)

bin/tests/system/conftest.py

index da3f638d6a0f6e8ae84f07b262b06d1b1a2b32da..d0f4168dc7d310b9ea92770ff7e78bdc87bb1b2f 100644 (file)
@@ -402,7 +402,7 @@ def system_test_dir(request, env, system_test_name):
     shutil.copytree(system_test_root / system_test_name, testdir)
 
     # Create a convenience symlink with a stable and predictable name
-    module_name = SYMLINK_REPLACEMENT_RE.sub(r"\1", request.node.name)
+    module_name = SYMLINK_REPLACEMENT_RE.sub(r"\1", str(_get_node_path(request.node)))
     symlink_dst = system_test_root / module_name
     unlink(symlink_dst)
     symlink_dst.symlink_to(os.path.relpath(testdir, start=system_test_root))
@@ -495,6 +495,15 @@ def _run_script(
         isctest.log.debug("  exited with %d", returncode)
 
 
+def _get_node_path(node) -> Path:
+    if isinstance(node.parent, pytest.Session):
+        if _pytest_major_ver >= 8:
+            return Path()
+        return Path(node.name)
+    assert node.parent is not None
+    return _get_node_path(node.parent) / node.name
+
+
 @pytest.fixture(scope="module")
 def shell(env, system_test_dir):
     """Function to call a shell script with arguments."""
@@ -594,7 +603,7 @@ def system_test(
             pytest.fail(f"get_core_dumps.sh exited with {exc.returncode}")
 
     os.environ.update(env)  # Ensure pytests have the same env vars as shell tests.
-    isctest.log.info(f"test started: {request.node.name}")
+    isctest.log.info(f"test started: {_get_node_path(request.node)}")
     port = int(env["PORT"])
     isctest.log.info("using port range: <%d, %d>", port, port + PORTS_PER_TEST - 1)