]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Fix pytest-xdist loadscope splitting on "::" in params 12137/head
authorMichal Nowak <mnowak@isc.org>
Tue, 26 May 2026 16:09:21 +0000 (16:09 +0000)
committerMichal Nowak <mnowak@isc.org>
Thu, 28 May 2026 16:06:11 +0000 (18:06 +0200)
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)

bin/tests/system/conftest.py

index a4400163d6330ac27d4fcd5b5161c7b8dae33bf6..14ee0ed05405609c7c4a5027c51b3b44ad6a6024 100644 (file)
@@ -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 -------------------------------