]> granicus.if.org Git - python/commitdiff
Issue #25099: Skip relevant tests in test_compileall when an entry on
authorBrett Cannon <brett@python.org>
Fri, 9 Oct 2015 22:09:43 +0000 (15:09 -0700)
committerBrett Cannon <brett@python.org>
Fri, 9 Oct 2015 22:09:43 +0000 (15:09 -0700)
sys.path has an unwritable __pycache__ directory.

This typically comes up when someone runs the test suite from an
administrative install of Python on Windows where the user does not
have write permissions to the stdlib's directory.

Thanks to Zachary Ware and Matthias Klose for reporting bugs related
to this issue.

Lib/test/test_compileall.py
Misc/NEWS

index 9479776abf7e8f8a072c5abc62c2371aaca6f837..ef2b669356823685d35768cbf816f64338b57113 100644 (file)
@@ -2,6 +2,7 @@ import sys
 import compileall
 import importlib.util
 import os
+import pathlib
 import py_compile
 import shutil
 import struct
@@ -168,6 +169,33 @@ class EncodingTest(unittest.TestCase):
 class CommandLineTests(unittest.TestCase):
     """Test compileall's CLI."""
 
+    @classmethod
+    def setUpClass(cls):
+        for path in filter(os.path.isdir, sys.path):
+            directory_created = False
+            directory = pathlib.Path(path) / '__pycache__'
+            path = directory / 'test.try'
+            try:
+                if not directory.is_dir():
+                    directory.mkdir()
+                    directory_created = True
+                with path.open('w') as file:
+                    file.write('# for test_compileall')
+            except OSError:
+                sys_path_writable = False
+                break
+            finally:
+                support.unlink(str(path))
+                if directory_created:
+                    directory.rmdir()
+        else:
+            sys_path_writable = True
+        cls._sys_path_writable = sys_path_writable
+
+    def _skip_if_sys_path_not_writable(self):
+        if not self._sys_path_writable:
+            raise unittest.SkipTest('not all entries on sys.path are writable')
+
     def _get_run_args(self, args):
         interp_args = ['-S']
         if sys.flags.optimize:
@@ -194,8 +222,8 @@ class CommandLineTests(unittest.TestCase):
         self.assertFalse(os.path.exists(path))
 
     def setUp(self):
-        self.addCleanup(self._cleanup)
         self.directory = tempfile.mkdtemp()
+        self.addCleanup(support.rmtree, self.directory)
         self.pkgdir = os.path.join(self.directory, 'foo')
         os.mkdir(self.pkgdir)
         self.pkgdir_cachedir = os.path.join(self.pkgdir, '__pycache__')
@@ -203,11 +231,9 @@ class CommandLineTests(unittest.TestCase):
         self.initfn = script_helper.make_script(self.pkgdir, '__init__', '')
         self.barfn = script_helper.make_script(self.pkgdir, 'bar', '')
 
-    def _cleanup(self):
-        support.rmtree(self.directory)
-
     def test_no_args_compiles_path(self):
         # Note that -l is implied for the no args case.
+        self._skip_if_sys_path_not_writable()
         bazfn = script_helper.make_script(self.directory, 'baz', '')
         self.assertRunOK(PYTHONPATH=self.directory)
         self.assertCompiled(bazfn)
@@ -215,6 +241,7 @@ class CommandLineTests(unittest.TestCase):
         self.assertNotCompiled(self.barfn)
 
     def test_no_args_respects_force_flag(self):
+        self._skip_if_sys_path_not_writable()
         bazfn = script_helper.make_script(self.directory, 'baz', '')
         self.assertRunOK(PYTHONPATH=self.directory)
         pycpath = importlib.util.cache_from_source(bazfn)
@@ -231,6 +258,7 @@ class CommandLineTests(unittest.TestCase):
         self.assertNotEqual(mtime, mtime2)
 
     def test_no_args_respects_quiet_flag(self):
+        self._skip_if_sys_path_not_writable()
         script_helper.make_script(self.directory, 'baz', '')
         noisy = self.assertRunOK(PYTHONPATH=self.directory)
         self.assertIn(b'Listing ', noisy)
index 8113dd36a68a240ac4d8623460d66157a0527979..be2e1d879e099214f7b8db0a80bd550e20e9df5b 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -281,6 +281,9 @@ Documentation
 Tests
 -----
 
+- Issue #25099: Make test_compileall not fail when a entry on sys.path cannot
+  be written to (commonly seen in administrative installs on Windows).
+
 - Issue #23919: Prevents assert dialogs appearing in the test suite.
 
 - PCbuild\rt.bat now accepts an unlimited number of arguments to pass along