From 79fb6ff9c0c2bc0db97a40ce3a81806e376d4807 Mon Sep 17 00:00:00 2001 From: Jeremy Hiatt Date: Wed, 28 Feb 2024 15:11:07 -0800 Subject: [PATCH] testing: Add test to assert path hooks ignored in sys.path --- testing/test_looponfail.py | 39 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/testing/test_looponfail.py b/testing/test_looponfail.py index 92d4384..65a89fb 100644 --- a/testing/test_looponfail.py +++ b/testing/test_looponfail.py @@ -1,3 +1,5 @@ +import pathlib +import tempfile import unittest.mock from typing import List @@ -191,6 +193,43 @@ class TestRemoteControl: control.loop_once() assert control.failures + def test_ignore_sys_path_hook_entry( + self, pytester: pytest.Pytester, monkeypatch: pytest.MonkeyPatch + ) -> None: + # Modifying sys.path as seen by the worker process is a bit tricky, + # because any changes made in the current process do not carry over. + # However, we can leverage the `sitecustomize` behavior to run arbitrary + # code when the subprocess interpreter is starting up. We just need to + # install our module in the search path, which we can accomplish by + # adding a temporary directory to PYTHONPATH. + tmpdir = tempfile.TemporaryDirectory() + with open(pathlib.Path(tmpdir.name) / "sitecustomize.py", "w") as custom: + print( + textwrap.dedent( + """ + import sys + sys.path.append('dummy.__path_hook__') + """ + ), + file=custom, + ) + + monkeypatch.setenv("PYTHONPATH", tmpdir.name, prepend=":") + + item = pytester.getitem( + textwrap.dedent( + """ + def test_func(): + import sys + assert "dummy.__path_hook__" in sys.path + """ + ) + ) + control = RemoteControl(item.config) + control.setup() + topdir, failures = control.runsession()[:2] + assert not failures + class TestLooponFailing: def test_looponfail_from_fail_to_ok(self, pytester: pytest.Pytester) -> None: