From: Michal Nowak Date: Tue, 26 May 2026 16:09:21 +0000 (+0000) Subject: Fix pytest-xdist loadscope splitting on "::" in params X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;h=5f7684537fb8c932a472599a5618d2b0ffb545fe;p=thirdparty%2Fbind9.git Fix pytest-xdist loadscope splitting on "::" in params LoadScopeScheduling._split_scope() uses rsplit("::", 1) to extract the test file scope from a node ID. When parametrized test values contain "::" (IPv6 addresses like "cafe:cafe::cafe" or "::1"), the split lands inside the parameter instead of at the .py:: boundary. This creates spurious scopes that get assigned to different workers, each triggering a full fixture setup (starting named instances). Override _split_scope() in conftest.py to split on ".py::" which is unambiguous. Six tests in synthrecord/tests_synthrecord.py are affected. A verification script is included in util/. Assisted-by: Claude:claude-opus-4-7 (cherry picked from commit 4eb893020e4f285fbc82021a01d49b110d79c30c) --- diff --git a/bin/tests/system/conftest.py b/bin/tests/system/conftest.py index a4400163d63..14ee0ed0540 100644 --- a/bin/tests/system/conftest.py +++ b/bin/tests/system/conftest.py @@ -74,6 +74,30 @@ SYMLINK_REPLACEMENT_RE = Re(r"/tests_(.*)\.py") isctest.check.is_executable(isctest.vars.ALL["PYTHON"], "Python interpreter required") isctest.check.is_executable(isctest.vars.ALL["PERL"], "Perl interpreter required") +# ---- Fix pytest-xdist loadscope for node IDs containing "::" ---------- + +# LoadScopeScheduling._split_scope uses rsplit("::", 1) which breaks when +# test parameters contain "::" (e.g. IPv6 addresses like "cafe:cafe::cafe"). +# This causes tests from the same file to be assigned to different workers, +# each paying the full fixture setup cost. Override to split on ".py::" +# which is unambiguous. +# https://github.com/pytest-dev/pytest-xdist/issues/1335 +try: + from xdist.scheduler.loadscope import LoadScopeScheduling + + # pylint: disable=protected-access + _orig_split_scope = LoadScopeScheduling._split_scope + + def _fixed_split_scope(self, nodeid): + if ".py::" in nodeid: + return nodeid.split(".py::")[0] + ".py" + return _orig_split_scope(self, nodeid) + + LoadScopeScheduling._split_scope = _fixed_split_scope + # pylint: enable=protected-access +except ImportError: + pass + # --------------------------- pytest hooks -------------------------------