From 88decdbc95d29e73d373469bfbb306f4bb76af0a Mon Sep 17 00:00:00 2001 From: Albert Tugushev Date: Mon, 14 Aug 2023 22:03:28 +0200 Subject: [PATCH 1/2] Fix incompatibility error with --pdb despite using -n0 --- changelog/937.bugfix | 1 + src/xdist/plugin.py | 22 ++++++++++++++++++---- testing/test_plugin.py | 17 +++++++++++++++++ 3 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 changelog/937.bugfix diff --git a/changelog/937.bugfix b/changelog/937.bugfix new file mode 100644 index 00000000..8b868be4 --- /dev/null +++ b/changelog/937.bugfix @@ -0,0 +1 @@ +Fix a bug where plugin would raise an incompatibility error with ``--pdb`` despite using ``-n0``. diff --git a/src/xdist/plugin.py b/src/xdist/plugin.py index 5360b5d5..fd467d30 100644 --- a/src/xdist/plugin.py +++ b/src/xdist/plugin.py @@ -227,7 +227,7 @@ def pytest_configure(config): # Create the distributed session in case we have a valid distribution # mode and test environments. - if config.getoption("dist") != "no" and config.getoption("tx"): + if _is_distribution_mode(config): from xdist.dsession import DSession session = DSession(config) @@ -252,8 +252,19 @@ def pytest_configure(config): config.issue_config_time_warning(warning, 2) +def _is_distribution_mode(config): + """Return `True` if distribution mode is on, `False` otherwise. + + :param config: the `pytest` `config` object + """ + return config.getoption("dist") != "no" and config.getoption("tx") + + @pytest.hookimpl(tryfirst=True) def pytest_cmdline_main(config): + if config.option.distload: + config.option.dist = "load" + usepdb = config.getoption("usepdb", False) # a core option if config.option.numprocesses in ("auto", "logical"): if usepdb: @@ -270,10 +281,13 @@ def pytest_cmdline_main(config): if config.option.maxprocesses: numprocesses = min(numprocesses, config.option.maxprocesses) config.option.tx = ["popen"] * numprocesses - if config.option.distload: - config.option.dist = "load" + + if config.option.numprocesses == 0: + config.option.dist = "no" + config.option.tx = [] + val = config.getvalue - if not val("collectonly") and val("dist") != "no" and usepdb: + if not val("collectonly") and _is_distribution_mode(config) and usepdb: raise pytest.UsageError( "--pdb is incompatible with distributing tests; try using -n0 or -nauto." ) # noqa: E501 diff --git a/testing/test_plugin.py b/testing/test_plugin.py index f42f3cc7..43402f07 100644 --- a/testing/test_plugin.py +++ b/testing/test_plugin.py @@ -48,6 +48,23 @@ def test_dist_options(pytester: pytest.Pytester) -> None: check_options(config) assert config.option.dist == "load" + config = pytester.parseconfigure("--numprocesses", "0") + check_options(config) + assert config.option.dist == "no" + assert config.option.tx == [] + + config = pytester.parseconfigure("--numprocesses", "0", "-d") + check_options(config) + assert config.option.dist == "no" + assert config.option.tx == [] + + config = pytester.parseconfigure( + "--numprocesses", "0", "--dist", "each", "--tx", "2*popen" + ) + check_options(config) + assert config.option.dist == "no" + assert config.option.tx == [] + def test_auto_detect_cpus( pytester: pytest.Pytester, monkeypatch: pytest.MonkeyPatch From 0de61809e273205a52ac6034bed0736ce4adcd05 Mon Sep 17 00:00:00 2001 From: Albert Tugushev Date: Tue, 5 Mar 2024 22:54:14 +0100 Subject: [PATCH 2/2] Address rewiew comments --- testing/test_plugin.py | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/testing/test_plugin.py b/testing/test_plugin.py index 43402f07..4bf514b8 100644 --- a/testing/test_plugin.py +++ b/testing/test_plugin.py @@ -94,17 +94,12 @@ def test_auto_detect_cpus( check_options(config) assert config.getoption("numprocesses") == 99 - config = pytester.parseconfigure("-nauto", "--pdb") - check_options(config) - assert config.getoption("usepdb") - assert config.getoption("numprocesses") == 0 - assert config.getoption("dist") == "no" - - config = pytester.parseconfigure("-nlogical", "--pdb") - check_options(config) - assert config.getoption("usepdb") - assert config.getoption("numprocesses") == 0 - assert config.getoption("dist") == "no" + for numprocesses in (0, "auto", "logical"): + config = pytester.parseconfigure(f"-n{numprocesses}", "--pdb") + check_options(config) + assert config.getoption("usepdb") + assert config.getoption("numprocesses") == 0 + assert config.getoption("dist") == "no" monkeypatch.delattr(os, "sched_getaffinity", raising=False) monkeypatch.setenv("TRAVIS", "true")