summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrett Cannon <brett@python.org>2015-10-09 22:09:43 (GMT)
committerBrett Cannon <brett@python.org>2015-10-09 22:09:43 (GMT)
commit65ed75037514eed0b139fc611c76ffd3d4860905 (patch)
tree3fb150ee62fbaf788179f4228eaed09b1858c2b4
parent1a815389cccef2e28e2d27f14e71a1b708cfb20f (diff)
downloadcpython-65ed75037514eed0b139fc611c76ffd3d4860905.zip
cpython-65ed75037514eed0b139fc611c76ffd3d4860905.tar.gz
cpython-65ed75037514eed0b139fc611c76ffd3d4860905.tar.bz2
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.
-rw-r--r--Lib/test/test_compileall.py36
-rw-r--r--Misc/NEWS3
2 files changed, 35 insertions, 4 deletions
diff --git a/Lib/test/test_compileall.py b/Lib/test/test_compileall.py
index 9479776..ef2b669 100644
--- a/Lib/test/test_compileall.py
+++ b/Lib/test/test_compileall.py
@@ -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)
diff --git a/Misc/NEWS b/Misc/NEWS
index 8113dd3..be2e1d8 100644
--- 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