From 89065d9fc7ad9163fd270a08dface51a0cd8721c Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Fri, 9 Oct 2015 15:09:43 -0700 Subject: 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) --- Lib/test/test_compileall.py | 36 ++++++++++++++++++++++++++++++++---- Misc/NEWS | 3 +++ 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_compileall.py b/Lib/test/test_compileall.py index 2a42238..7b307ed 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 @@ -133,6 +134,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: @@ -159,8 +187,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__') @@ -168,11 +196,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) @@ -180,6 +206,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) @@ -196,6 +223,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 ef39bb4..818934e 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -194,6 +194,9 @@ Library Patch from Łukasz Langa. - Issue #23888: Handle fractional time in cookie expiry. Patch by ssh. +- 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 #23004: mock_open() now reads binary data correctly when the type of read_data is bytes. Initial patch by Aaron Hill. -- cgit v0.12 From 0289155b72a539d55191985ed783c249668b17c4 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 10 Oct 2015 20:26:16 +0300 Subject: Correct Misc/NEWS. --- Misc/NEWS | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index 818934e..b5a70e5 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -194,9 +194,6 @@ Library Patch from Łukasz Langa. - Issue #23888: Handle fractional time in cookie expiry. Patch by ssh. -- 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 #23004: mock_open() now reads binary data correctly when the type of read_data is bytes. Initial patch by Aaron Hill. @@ -600,6 +597,9 @@ IDLE 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 #24751: When running regrtest with the ``-w`` command line option, a test run is no longer marked as a failure if all tests succeed when re-run. -- cgit v0.12