diff --git a/src/xdist/workermanage.py b/src/xdist/workermanage.py index a8a8993..a4c0fb5 100644 --- a/src/xdist/workermanage.py +++ b/src/xdist/workermanage.py @@ -97,17 +97,19 @@ class NodeManager: self.trace("setting up nodes") with ThreadPoolExecutor(max_workers=len(self.specs)) as executor: futs = [ - executor.submit(self.setup_node, spec, putevent) for spec in self.specs + executor.submit(self.setup_node, idx, spec, putevent) for idx, spec in enumerate(self.specs) ] return [f.result() for f in futs] def setup_node( self, + idx: int, spec: execnet.XSpec, putevent: Callable[[tuple[str, dict[str, Any]]], None], ) -> WorkerController: if getattr(spec, "execmodel", None) != "main_thread_only": spec = execnet.XSpec(f"execmodel=main_thread_only//{spec}") + spec = execnet.XSpec(f"{spec}//id=gw{idx}") gw = self.group.makegateway(spec) self.config.hook.pytest_xdist_newgateway(gateway=gw) self.rsync_roots(gw) diff --git a/testing/test_workermanage.py b/testing/test_workermanage.py index b3e8a1c..1de8aac 100644 --- a/testing/test_workermanage.py +++ b/testing/test_workermanage.py @@ -82,11 +82,20 @@ class TestNodeManagerPopen: call = hookrecorder.popcall("pytest_xdist_setupnodes") assert len(call.specs) == 2 - call = hookrecorder.popcall("pytest_xdist_newgateway") - assert call.gateway.spec == execnet.XSpec("execmodel=main_thread_only//popen") - assert call.gateway.id == "gw0" - call = hookrecorder.popcall("pytest_xdist_newgateway") - assert call.gateway.id == "gw1" + # check expected gateways + gw_calls = [ + hookrecorder.popcall("pytest_xdist_newgateway"), + hookrecorder.popcall("pytest_xdist_newgateway"), + ] + ids = {c.gateway.id for c in gw_calls} + assert ids == {"gw0", "gw1"} + + for c in gw_calls: + expected_spec = execnet.XSpec( + f"execmodel=main_thread_only//popen//id={c.gateway.id}" + ) + assert c.gateway.spec == expected_spec + assert len(hm.group) == 2 hm.teardown_nodes() assert not len(hm.group)