mirror of
https://github.com/python/cpython.git
synced 2025-10-20 00:13:47 +00:00
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. (grafted from 34bbd537b3e688dfbb6498e9083445a6a72fc4b1)
This commit is contained in:
parent
7b2cfc4465
commit
89065d9fc7
2 changed files with 35 additions and 4 deletions
|
@ -2,6 +2,7 @@
|
|||
import compileall
|
||||
import importlib.util
|
||||
import os
|
||||
import pathlib
|
||||
import py_compile
|
||||
import shutil
|
||||
import struct
|
||||
|
@ -133,6 +134,33 @@ def test_error(self):
|
|||
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:
|
||||
|
@ -159,8 +187,8 @@ def assertNotCompiled(self, fn):
|
|||
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__')
|
||||
|
@ -168,11 +196,9 @@ def setUp(self):
|
|||
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)
|
||||
|
@ -180,6 +206,7 @@ def test_no_args_compiles_path(self):
|
|||
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)
|
||||
|
@ -196,6 +223,7 @@ def test_no_args_respects_force_flag(self):
|
|||
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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue