diff options
author | Simon K <jackofspaces@gmail.com> | 2021-02-25 08:28:57 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-02-25 08:28:57 +0000 |
commit | b7f2d7ca61d6169495e5780fffc252daaacd6583 (patch) | |
tree | b19f52b713dd56fbbd15d90cb35c6eac60635281 | |
parent | bbea18d7f9738caa0ef21727137f85b7494c9518 (diff) | |
download | pytest-b7f2d7ca61d6169495e5780fffc252daaacd6583.tar.gz |
Fixed an issue where `getpass.getuser()` contained illegal characters for file directories (#8365)
* retry writing pytest-of dir when invalid chars are in directory name
* add unit tests for getbasetemp() and changelog
* patch _basetemp & _given_basetemp for testing basetemp()
* Tweak changelog for #8317, tidy up comments
-rw-r--r-- | changelog/8317.bugfix.rst | 1 | ||||
-rw-r--r-- | src/_pytest/tmpdir.py | 7 | ||||
-rw-r--r-- | testing/test_tmpdir.py | 12 |
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) |