diff --git a/Lib/test/script_helper.py b/Lib/test/script_helper.py index 4cadcf71967..095895ee50d 100644 --- a/Lib/test/script_helper.py +++ b/Lib/test/script_helper.py @@ -15,11 +15,17 @@ from imp import source_from_cache from test.support import make_legacy_pyc # Executing the interpreter in a subprocess -def _assert_python(expected_success, *args): - cmd_line = [sys.executable, '-E'] +def _assert_python(expected_success, *args, **env_vars): + cmd_line = [sys.executable] + if env_vars: + env = env_vars + else: + env = os.environ + cmd_line.append('-E') cmd_line.extend(args) p = subprocess.Popen(cmd_line, stdin=subprocess.PIPE, - stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout=subprocess.PIPE, stderr=subprocess.PIPE, + env=env) try: out, err = p.communicate() finally: @@ -33,11 +39,19 @@ def _assert_python(expected_success, *args): "stderr follows:\n%s" % (rc, err.decode('ascii', 'ignore'))) return rc, out, err -def assert_python_ok(*args): - return _assert_python(True, *args) +def assert_python_ok(*args, **env_vars): + """ + Assert that running the interpreter with `args` and optional environment + variables `env_vars` is ok and return a (return code, stdout, stderr) tuple. + """ + return _assert_python(True, *args, **env_vars) -def assert_python_failure(*args): - return _assert_python(False, *args) +def assert_python_failure(*args, **env_vars): + """ + Assert that running the interpreter with `args` and optional environment + variables `env_vars` fails and return a (return code, stdout, stderr) tuple. + """ + return _assert_python(False, *args, **env_vars) def spawn_python(*args): cmd_line = [sys.executable, '-E'] diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py index e8f8c9d6269..e1fe7f5bdee 100644 --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -5,18 +5,8 @@ import test.support, unittest import os import sys -from test.script_helper import spawn_python, kill_python, assert_python_ok, assert_python_failure - -# spawn_python normally enforces use of -E to avoid environmental effects -# but one test checks PYTHONPATH behaviour explicitly -# XXX (ncoghlan): Give script_helper.spawn_python an option to switch -# off the -E flag that is normally inserted automatically import subprocess -def _spawn_python_with_env(*args): - cmd_line = [sys.executable] - cmd_line.extend(args) - return subprocess.Popen(cmd_line, stdin=subprocess.PIPE, - stdout=subprocess.PIPE, stderr=subprocess.STDOUT) +from test.script_helper import spawn_python, kill_python, assert_python_ok, assert_python_failure # XXX (ncoghlan): Move to script_helper and make consistent with run_python @@ -217,23 +207,19 @@ class CmdLineTest(unittest.TestCase): self.assertTrue(data.startswith(b'x'), data) def test_large_PYTHONPATH(self): - with test.support.EnvironmentVarGuard() as env: - path1 = "ABCDE" * 100 - path2 = "FGHIJ" * 100 - env['PYTHONPATH'] = path1 + os.pathsep + path2 + path1 = "ABCDE" * 100 + path2 = "FGHIJ" * 100 + path = path1 + os.pathsep + path2 - code = """ -import sys -path = ":".join(sys.path) -path = path.encode("ascii", "backslashreplace") -sys.stdout.buffer.write(path)""" - code = code.strip().splitlines() - code = '; '.join(code) - p = _spawn_python_with_env('-S', '-c', code) - stdout, _ = p.communicate() - p.stdout.close() - self.assertIn(path1.encode('ascii'), stdout) - self.assertIn(path2.encode('ascii'), stdout) + code = """if 1: + import sys + path = ":".join(sys.path) + path = path.encode("ascii", "backslashreplace") + sys.stdout.buffer.write(path)""" + rc, out, err = assert_python_ok('-S', '-c', code, + PYTHONPATH=path) + self.assertIn(path1.encode('ascii'), out) + self.assertIn(path2.encode('ascii'), out) def test_main():