diff --git a/news/4842f4c6-2f77-4cc9-b5ee-5f764fd286bb.trivial.rst b/news/4842f4c6-2f77-4cc9-b5ee-5f764fd286bb.trivial.rst new file mode 100644 index 0000000000..e69de29bb2 diff --git a/news/60a24bb6-1a57-4eb6-b302-b62b7a05f40e.trivial.rst b/news/60a24bb6-1a57-4eb6-b302-b62b7a05f40e.trivial.rst new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pyproject.toml b/pyproject.toml index fe6b39913d..08a97f63f4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -62,7 +62,7 @@ test = [ "pytest-subket", "scripttest", "setuptools", - "virtualenv >= 20.0", + "virtualenv >= 20.0.28", "werkzeug", "tomli-w", "proxy.py", diff --git a/tests/lib/test_lib.py b/tests/lib/test_lib.py index d2b06c19fd..71db687c20 100644 --- a/tests/lib/test_lib.py +++ b/tests/lib/test_lib.py @@ -1,6 +1,7 @@ """Test the test support.""" import filecmp +import logging import pathlib import re import sys @@ -18,6 +19,7 @@ create_basic_wheel_for_package, create_test_package_with_setup, ) +from tests.lib.venv import VirtualEnvironment @contextmanager @@ -33,6 +35,19 @@ def assert_error_startswith( assert str(err.value).startswith(expected_start), f"full message: {err.value}" +def test_virtualenv_creation_preserves_logging(tmp_path: pathlib.Path) -> None: + logger = logging.getLogger() + level = logger.level + handlers = logger.handlers[:] + try: + VirtualEnvironment(tmp_path / "venv") + assert logger.level == level + assert logger.handlers == handlers + finally: + logger.setLevel(level) + logger.handlers[:] = handlers + + def test_tmp_dir_exists_in_env(script: PipTestEnvironment) -> None: """ Test that $TMPDIR == env.temp_path and path exists and env.assert_no_temp() diff --git a/tests/lib/venv.py b/tests/lib/venv.py index a5d8704b23..ab7df511f8 100644 --- a/tests/lib/venv.py +++ b/tests/lib/venv.py @@ -73,6 +73,7 @@ def _create(self, clear: bool = False) -> None: "--no-setuptools", os.fspath(self.location), ], + setup_logging=False, ) elif self._venv_type == "venv": builder = _venv.EnvBuilder() diff --git a/tests/unit/test_base_command.py b/tests/unit/test_base_command.py index 10cefd2d5f..5c180fc091 100644 --- a/tests/unit/test_base_command.py +++ b/tests/unit/test_base_command.py @@ -26,6 +26,15 @@ from pip._internal.utils.temp_dir import TempDirectory +@pytest.fixture(autouse=True) +def restore_logging_level() -> Iterator[None]: + """Restore the root level after a command configures logging.""" + logger = logging.getLogger() + level = logger.level + yield + logger.setLevel(level) + + @pytest.fixture def fixed_time() -> Iterator[None]: # Patch time so logs contain a constant timestamp. time.time_ns is used by diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index 01a337e403..e3ac677fc3 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -286,11 +286,11 @@ def test_rmtree_skips_nonexistent_directory() -> None: class Failer: def __init__(self, duration: int = 1) -> None: - self.succeed_after = time.time() + duration + self.succeed_after = time.perf_counter() + duration def call(self, *args: Any, **kw: Any) -> None: - """Fail with OSError self.max_fails times""" - if time.time() < self.succeed_after: + """Fail until the retry fixture's deadline.""" + if time.perf_counter() < self.succeed_after: raise OSError("Failed")