]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-57684: Update tests for PYTHONSAFEPATH=1 (#92358)
authorVictor Stinner <vstinner@python.org>
Fri, 6 May 2022 01:41:24 +0000 (03:41 +0200)
committerGitHub <noreply@github.com>
Fri, 6 May 2022 01:41:24 +0000 (03:41 +0200)
Fix tests failing with the PYTHONSAFEPATH=1 env var.

Enhance also -P help in Python usage (python --help).

Lib/distutils/tests/test_bdist_rpm.py
Lib/test/test_cmd_line.py
Lib/test/test_cmd_line_script.py
Lib/test/test_pdb.py
Lib/test/test_runpy.py
Lib/unittest/test/test_program.py
Python/initconfig.c
Tools/freeze/test/freeze.py

index f1eb9ba44938284025a4d3f7395852ef10ed8ef3..7eefa7b9cad84ffb94fb41044045b0e311bb4eb0 100644 (file)
@@ -49,6 +49,9 @@ class BuildRpmTestCase(support.TempdirManager,
                      'the rpm command is not found')
     @unittest.skipIf(find_executable('rpmbuild') is None,
                      'the rpmbuild command is not found')
+    # import foo fails with safe path
+    @unittest.skipIf(sys.flags.safe_path,
+                     'PYTHONSAFEPATH changes default sys.path')
     def test_quiet(self):
         # let's create a package
         tmp_dir = self.mkdtemp()
@@ -93,6 +96,9 @@ class BuildRpmTestCase(support.TempdirManager,
                      'the rpm command is not found')
     @unittest.skipIf(find_executable('rpmbuild') is None,
                      'the rpmbuild command is not found')
+    # import foo fails with safe path
+    @unittest.skipIf(sys.flags.safe_path,
+                     'PYTHONSAFEPATH changes default sys.path')
     def test_no_optimize_flag(self):
         # let's create a package that breaks bdist_rpm
         tmp_dir = self.mkdtemp()
index 26506312185cfb4a3b9148d610b8707a9da7b697..5a9e14bbd320071a2e7432b126e53985d67c00e8 100644 (file)
@@ -363,6 +363,8 @@ class CmdLineTest(unittest.TestCase):
         self.assertIn(path1.encode('ascii'), out)
         self.assertIn(path2.encode('ascii'), out)
 
+    @unittest.skipIf(sys.flags.safe_path,
+                     'PYTHONSAFEPATH changes default sys.path')
     def test_empty_PYTHONPATH_issue16309(self):
         # On Posix, it is documented that setting PATH to the
         # empty string is equivalent to not setting PATH at all,
@@ -594,9 +596,10 @@ class CmdLineTest(unittest.TestCase):
             with open(main, "w", encoding="utf-8") as f:
                 f.write("import uuid\n")
                 f.write("print('ok')\n")
+            # Use -E to ignore PYTHONSAFEPATH env var
             self.assertRaises(subprocess.CalledProcessError,
                               subprocess.check_output,
-                              [sys.executable, main], cwd=tmpdir,
+                              [sys.executable, '-E', main], cwd=tmpdir,
                               stderr=subprocess.DEVNULL)
             out = subprocess.check_output([sys.executable, "-I", main],
                                           cwd=tmpdir)
index 9fe748c187060c85d6bddf9f5d1560ffe0137b40..bb433dc1e73a435edb9e9254b0d1dc4f4aad338a 100644 (file)
@@ -116,7 +116,9 @@ class CmdLineTest(unittest.TestCase):
         self.assertIn(printed_file.encode('utf-8'), data)
         self.assertIn(printed_package.encode('utf-8'), data)
         self.assertIn(printed_argv0.encode('utf-8'), data)
-        self.assertIn(printed_path0.encode('utf-8'), data)
+        # PYTHONSAFEPATH=1 changes the default sys.path[0]
+        if not sys.flags.safe_path:
+            self.assertIn(printed_path0.encode('utf-8'), data)
         self.assertIn(printed_cwd.encode('utf-8'), data)
 
     def _check_script(self, script_exec_args, expected_file,
index bfa2cc92d25147f875be5ab13b1c6e23299e79b3..0141b739c25440455e5191ca2384d3e51ecbf4e4 100644 (file)
@@ -1369,6 +1369,8 @@ class PdbTestCase(unittest.TestCase):
     def tearDown(self):
         os_helper.unlink(os_helper.TESTFN)
 
+    @unittest.skipIf(sys.flags.safe_path,
+                     'PYTHONSAFEPATH changes default sys.path')
     def _run_pdb(self, pdb_args, commands):
         self.addCleanup(os_helper.rmtree, '__pycache__')
         cmd = [sys.executable, '-m', 'pdb'] + pdb_args
index 93e1ab556ae929d2a763abdf7d239275516ea84b..6aaa288c14e1d70fb9e67a618b8246f3e9096624 100644 (file)
@@ -781,13 +781,15 @@ class TestExit(unittest.TestCase):
             super().run(*args, **kwargs)
 
     @requires_subprocess()
-    def assertSigInt(self, *args, **kwargs):
-        proc = subprocess.run(*args, **kwargs, text=True, stderr=subprocess.PIPE)
-        self.assertTrue(proc.stderr.endswith("\nKeyboardInterrupt\n"))
+    def assertSigInt(self, cmd, *args, **kwargs):
+        # Use -E to ignore PYTHONSAFEPATH
+        cmd = [sys.executable, '-E', *cmd]
+        proc = subprocess.run(cmd, *args, **kwargs, text=True, stderr=subprocess.PIPE)
+        self.assertTrue(proc.stderr.endswith("\nKeyboardInterrupt\n"), proc.stderr)
         self.assertEqual(proc.returncode, self.EXPECTED_CODE)
 
     def test_pymain_run_file(self):
-        self.assertSigInt([sys.executable, self.ham])
+        self.assertSigInt([self.ham])
 
     def test_pymain_run_file_runpy_run_module(self):
         tmp = self.ham.parent
@@ -800,7 +802,7 @@ class TestExit(unittest.TestCase):
                 """
             )
         )
-        self.assertSigInt([sys.executable, run_module], cwd=tmp)
+        self.assertSigInt([run_module], cwd=tmp)
 
     def test_pymain_run_file_runpy_run_module_as_main(self):
         tmp = self.ham.parent
@@ -813,23 +815,23 @@ class TestExit(unittest.TestCase):
                 """
             )
         )
-        self.assertSigInt([sys.executable, run_module_as_main], cwd=tmp)
+        self.assertSigInt([run_module_as_main], cwd=tmp)
 
     def test_pymain_run_command_run_module(self):
         self.assertSigInt(
-            [sys.executable, "-c", "import runpy; runpy.run_module('ham')"],
+            ["-c", "import runpy; runpy.run_module('ham')"],
             cwd=self.ham.parent,
         )
 
     def test_pymain_run_command(self):
-        self.assertSigInt([sys.executable, "-c", "import ham"], cwd=self.ham.parent)
+        self.assertSigInt(["-c", "import ham"], cwd=self.ham.parent)
 
     def test_pymain_run_stdin(self):
-        self.assertSigInt([sys.executable], input="import ham", cwd=self.ham.parent)
+        self.assertSigInt([], input="import ham", cwd=self.ham.parent)
 
     def test_pymain_run_module(self):
         ham = self.ham
-        self.assertSigInt([sys.executable, "-m", ham.stem], cwd=ham.parent)
+        self.assertSigInt(["-m", ham.stem], cwd=ham.parent)
 
 
 if __name__ == "__main__":
index 126497aa56656d33b6597a234fbebe81eb4f6624..26a8550af8fdd23ddd474d6c6a8d78a4ca9cffb0 100644 (file)
@@ -454,7 +454,9 @@ class TestCommandLineArgs(unittest.TestCase):
 
     def testSelectedTestNamesFunctionalTest(self):
         def run_unittest(args):
-            p = subprocess.Popen([sys.executable, '-m', 'unittest'] + args,
+            # Use -E to ignore PYTHONSAFEPATH env var
+            cmd = [sys.executable, '-E', '-m', 'unittest'] + args
+            p = subprocess.Popen(cmd,
                 stdout=subprocess.DEVNULL, stderr=subprocess.PIPE, cwd=os.path.dirname(__file__))
             with p:
                 _, stderr = p.communicate()
index 265c7ca8e8f765e93be9917b0a52052ab66ff82f..a623973f953734276f09854feeda9b7a3fd88717 100644 (file)
@@ -49,7 +49,7 @@ static const char usage_2[] = "\
          .pyc extension; also PYTHONOPTIMIZE=x\n\
 -OO    : do -O changes and also discard docstrings; add .opt-2 before\n\
          .pyc extension\n\
--P     : don't add sys.path[0]\n\
+-P     : don't prepend a potentially unsafe path to sys.path\n\
 -q     : don't print version and copyright messages on interactive startup\n\
 -s     : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\
 -S     : don't imply 'import site' on initialization\n\
index abedac03f91b04de8be6a51e327f77b83b5fe588..ddbfd7fc9c2f4125ed181543a1c956b489a3bd72 100644 (file)
@@ -172,7 +172,8 @@ def freeze(python, scriptfile, outdir):
 
     print(f'freezing {scriptfile}...')
     os.makedirs(outdir, exist_ok=True)
-    _run_quiet([python, FREEZE, '-o', outdir, scriptfile], outdir)
+    # Use -E to ignore PYTHONSAFEPATH
+    _run_quiet([python, '-E', FREEZE, '-o', outdir, scriptfile], outdir)
     _run_quiet([MAKE, '-C', os.path.dirname(scriptfile)])
 
     name = os.path.basename(scriptfile).rpartition('.')[0]