Merge pull request #5306 from blueyed/spawn-home

pytester: use temporary HOME with spawn
This commit is contained in:
Daniel Hahler 2019-05-30 20:46:17 +02:00 committed by GitHub
commit 882f3a4cd7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 40 additions and 6 deletions

View File

@ -0,0 +1 @@
pytester's ``testdir.spawn`` uses ``tmpdir`` as HOME/USERPROFILE directory.

View File

@ -508,6 +508,10 @@ class Testdir(object):
# Discard outer pytest options. # Discard outer pytest options.
mp.delenv("PYTEST_ADDOPTS", raising=False) mp.delenv("PYTEST_ADDOPTS", raising=False)
# Environment (updates) for inner runs.
tmphome = str(self.tmpdir)
self._env_run_update = {"HOME": tmphome, "USERPROFILE": tmphome}
def __repr__(self): def __repr__(self):
return "<Testdir %r>" % (self.tmpdir,) return "<Testdir %r>" % (self.tmpdir,)
@ -804,8 +808,8 @@ class Testdir(object):
try: try:
# Do not load user config (during runs only). # Do not load user config (during runs only).
mp_run = MonkeyPatch() mp_run = MonkeyPatch()
mp_run.setenv("HOME", str(self.tmpdir)) for k, v in self._env_run_update.items():
mp_run.setenv("USERPROFILE", str(self.tmpdir)) mp_run.setenv(k, v)
finalizers.append(mp_run.undo) finalizers.append(mp_run.undo)
# When running pytest inline any plugins active in the main test # When running pytest inline any plugins active in the main test
@ -1045,9 +1049,7 @@ class Testdir(object):
env["PYTHONPATH"] = os.pathsep.join( env["PYTHONPATH"] = os.pathsep.join(
filter(None, [os.getcwd(), env.get("PYTHONPATH", "")]) filter(None, [os.getcwd(), env.get("PYTHONPATH", "")])
) )
# Do not load user config. env.update(self._env_run_update)
env["HOME"] = str(self.tmpdir)
env["USERPROFILE"] = env["HOME"]
kw["env"] = env kw["env"] = env
if stdin is Testdir.CLOSE_STDIN: if stdin is Testdir.CLOSE_STDIN:
@ -1233,7 +1235,12 @@ class Testdir(object):
if sys.platform.startswith("freebsd"): if sys.platform.startswith("freebsd"):
pytest.xfail("pexpect does not work reliably on freebsd") pytest.xfail("pexpect does not work reliably on freebsd")
logfile = self.tmpdir.join("spawn.out").open("wb") logfile = self.tmpdir.join("spawn.out").open("wb")
child = pexpect.spawn(cmd, logfile=logfile)
# Do not load user config.
env = os.environ.copy()
env.update(self._env_run_update)
child = pexpect.spawn(cmd, logfile=logfile, env=env)
self.request.addfinalizer(logfile.close) self.request.addfinalizer(logfile.close)
child.timeout = expect_timeout child.timeout = expect_timeout
return child return child

View File

@ -559,3 +559,29 @@ def test_popen_default_stdin_stderr_and_stdin_None(testdir):
assert stdout.splitlines() == [b"", b"stdout"] assert stdout.splitlines() == [b"", b"stdout"]
assert stderr.splitlines() == [b"stderr"] assert stderr.splitlines() == [b"stderr"]
assert proc.returncode == 0 assert proc.returncode == 0
def test_spawn_uses_tmphome(testdir):
import os
tmphome = str(testdir.tmpdir)
# Does use HOME only during run.
assert os.environ.get("HOME") != tmphome
testdir._env_run_update["CUSTOMENV"] = "42"
p1 = testdir.makepyfile(
"""
import os
def test():
assert os.environ["HOME"] == {tmphome!r}
assert os.environ["CUSTOMENV"] == "42"
""".format(
tmphome=tmphome
)
)
child = testdir.spawn_pytest(str(p1))
out = child.read()
assert child.wait() == 0, out.decode("utf8")