changeset: 98624:34bbd537b3e6 branch: 3.5 parent: 98620:d471cf4a73b2 user: Brett Cannon date: Fri Oct 09 15:09:43 2015 -0700 files: Lib/test/test_compileall.py Misc/NEWS description: Issue #25099: Skip relevant tests in test_compileall when an entry on 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. diff -r d471cf4a73b2 -r 34bbd537b3e6 Lib/test/test_compileall.py --- a/Lib/test/test_compileall.py Fri Oct 09 10:19:33 2015 -0400 +++ b/Lib/test/test_compileall.py Fri Oct 09 15:09:43 2015 -0700 @@ -2,6 +2,7 @@ import compileall import importlib.util import os +import pathlib import py_compile import shutil import struct @@ -168,6 +169,33 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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) diff -r d471cf4a73b2 -r 34bbd537b3e6 Misc/NEWS --- a/Misc/NEWS Fri Oct 09 10:19:33 2015 -0400 +++ b/Misc/NEWS Fri Oct 09 15:09:43 2015 -0700 @@ -281,6 +281,9 @@ 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