summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--changelog/8317.bugfix.rst1
-rw-r--r--src/_pytest/tmpdir.py7
-rw-r--r--testing/test_tmpdir.py12
3 files changed, 19 insertions, 1 deletions
diff --git a/changelog/8317.bugfix.rst b/changelog/8317.bugfix.rst
new file mode 100644
index 000000000..7312880a1
--- /dev/null
+++ b/changelog/8317.bugfix.rst
@@ -0,0 +1 @@
+Fixed an issue where illegal directory characters derived from ``getpass.getuser()`` raised an ``OSError``.
diff --git a/src/_pytest/tmpdir.py b/src/_pytest/tmpdir.py
index 29c7e19d7..47729ae5f 100644
--- a/src/_pytest/tmpdir.py
+++ b/src/_pytest/tmpdir.py
@@ -115,7 +115,12 @@ class TempPathFactory:
# use a sub-directory in the temproot to speed-up
# make_numbered_dir() call
rootdir = temproot.joinpath(f"pytest-of-{user}")
- rootdir.mkdir(exist_ok=True)
+ try:
+ rootdir.mkdir(exist_ok=True)
+ except OSError:
+ # getuser() likely returned illegal characters for the platform, use unknown back off mechanism
+ rootdir = temproot.joinpath("pytest-of-unknown")
+ rootdir.mkdir(exist_ok=True)
basetemp = make_numbered_dir_with_cleanup(
prefix="pytest-", root=rootdir, keep=3, lock_timeout=LOCK_TIMEOUT
)
diff --git a/testing/test_tmpdir.py b/testing/test_tmpdir.py
index d123287aa..4dec9c59a 100644
--- a/testing/test_tmpdir.py
+++ b/testing/test_tmpdir.py
@@ -11,6 +11,7 @@ import attr
import pytest
from _pytest import pathlib
from _pytest.config import Config
+from _pytest.monkeypatch import MonkeyPatch
from _pytest.pathlib import cleanup_numbered_dir
from _pytest.pathlib import create_cleanup_lock
from _pytest.pathlib import make_numbered_dir
@@ -445,3 +446,14 @@ def test_basetemp_with_read_only_files(pytester: Pytester) -> None:
# running a second time and ensure we don't crash
result = pytester.runpytest("--basetemp=tmp")
assert result.ret == 0
+
+
+def test_tmp_path_factory_handles_invalid_dir_characters(
+ tmp_path_factory: TempPathFactory, monkeypatch: MonkeyPatch
+) -> None:
+ monkeypatch.setattr("getpass.getuser", lambda: "os/<:*?;>agnostic")
+ # _basetemp / _given_basetemp are cached / set in parallel runs, patch them
+ monkeypatch.setattr(tmp_path_factory, "_basetemp", None)
+ monkeypatch.setattr(tmp_path_factory, "_given_basetemp", None)
+ p = tmp_path_factory.getbasetemp()
+ assert "pytest-of-unknown" in str(p)