Skip to content

Commit

Permalink
fix #5686, mktemp now fails given absolute and non-normalized paths.
Browse files Browse the repository at this point in the history
  • Loading branch information
gftea committed Dec 12, 2019
1 parent 985ac09 commit 226f0c4
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 7 deletions.
1 change: 1 addition & 0 deletions changelog/5686.improvement.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
``tmpdir_factory.mktemp`` now fails when given absolute and non-normalized paths.
9 changes: 9 additions & 0 deletions src/_pytest/tmpdir.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,17 @@ def from_config(cls, config) -> "TempPathFactory":
given_basetemp=config.option.basetemp, trace=config.trace.get("tmpdir")
)

def _ensure_relative_to_basetemp(self, basename: str):
basename = os.path.normpath(basename)
if (self.getbasetemp() / basename).resolve().parent != self.getbasetemp():
raise ValueError(
"{} is not a normalized and relative path".format(basename)
)
return basename

def mktemp(self, basename: str, numbered: bool = True) -> Path:
"""makes a temporary directory managed by the factory"""
basename = self._ensure_relative_to_basetemp(basename)
if not numbered:
p = self.getbasetemp().joinpath(basename)
p.mkdir()
Expand Down
33 changes: 26 additions & 7 deletions testing/test_tmpdir.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,19 +74,38 @@ def test_1(tmpdir):
assert not mytemp.join("hello").check()


def test_basetemp(testdir):
testdata = [
("mypath", True),
("/mypath1", False),
("./mypath1", True),
("../mypath3", False),
("../../mypath4", False),
("mypath5/..", False),
("mypath6/../mypath6", True),
("mypath7/../mypath7/..", False),
]


@pytest.mark.parametrize("basename, is_ok", testdata)
def test_mktemp(testdir, basename, is_ok):
mytemp = testdir.tmpdir.mkdir("mytemp")
p = testdir.makepyfile(
"""
import pytest
def test_1(tmpdir_factory):
tmpdir_factory.mktemp('hello', numbered=False)
"""
def test_abs_path(tmpdir_factory):
tmpdir_factory.mktemp('{}', numbered=False)
""".format(
basename
)
)

result = testdir.runpytest(p, "--basetemp=%s" % mytemp)
assert result.ret == 0
print(mytemp)
assert mytemp.join("hello").check()
if is_ok:
assert result.ret == 0
assert mytemp.join(basename).check()
else:
assert result.ret == 1
result.stdout.fnmatch_lines("*ValueError*")


def test_tmpdir_always_is_realpath(testdir):
Expand Down

0 comments on commit 226f0c4

Please sign in to comment.