summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2009-11-13 16:29:04 +0000
committerAntoine Pitrou <solipsis@pitrou.net>2009-11-13 16:29:04 +0000
commit060cee221b7d24479da93d925607defb2b6e3dd9 (patch)
tree406edb569f120be79a1f057268c511ad2311841e
parent88d1bc448bdc2bab0531a729893532cdf2307b28 (diff)
downloadcpython-git-060cee221b7d24479da93d925607defb2b6e3dd9.tar.gz
Issue #6551: test_zipimport could import and then destroy some modules of
the encodings package, which would make other tests fail further down the road because the internally cached encoders and decoders would point to empty global variables.
-rw-r--r--Lib/test/support.py17
-rw-r--r--Lib/test/test_importhooks.py5
-rw-r--r--Lib/test/test_pkg.py6
-rw-r--r--Misc/NEWS5
4 files changed, 26 insertions, 7 deletions
diff --git a/Lib/test/support.py b/Lib/test/support.py
index 0c69aac6de..7b0241aacc 100644
--- a/Lib/test/support.py
+++ b/Lib/test/support.py
@@ -951,6 +951,23 @@ def run_doctest(module, verbosity=None):
(module.__name__, t))
return f, t
+
+#=======================================================================
+# Support for saving and restoring the imported modules.
+
+def modules_setup():
+ return sys.modules.copy(),
+
+def modules_cleanup(oldmodules):
+ # Encoders/decoders are registered permanently within the internal
+ # codec cache. If we destroy the corresponding modules their
+ # globals will be set to None which will trip up the cached functions.
+ encodings = [(k, v) for k, v in sys.modules.items()
+ if k.startswith('encodings.')]
+ sys.modules.clear()
+ sys.modules.update(encodings)
+ sys.modules.update(oldmodules)
+
#=======================================================================
# Threading support to prevent reporting refleaks when running regrtest.py -R
diff --git a/Lib/test/test_importhooks.py b/Lib/test/test_importhooks.py
index bf2870dbec..1da30b7c77 100644
--- a/Lib/test/test_importhooks.py
+++ b/Lib/test/test_importhooks.py
@@ -143,15 +143,14 @@ class ImportHooksBaseTestCase(unittest.TestCase):
self.meta_path = sys.meta_path[:]
self.path_hooks = sys.path_hooks[:]
sys.path_importer_cache.clear()
- self.modules_before = sys.modules.copy()
+ self.modules_before = support.modules_setup()
def tearDown(self):
sys.path[:] = self.path
sys.meta_path[:] = self.meta_path
sys.path_hooks[:] = self.path_hooks
sys.path_importer_cache.clear()
- sys.modules.clear()
- sys.modules.update(self.modules_before)
+ support.modules_cleanup(*self.modules_before)
class ImportHooksTestCase(ImportHooksBaseTestCase):
diff --git a/Lib/test/test_pkg.py b/Lib/test/test_pkg.py
index 0c568bb3b5..2e293f4fbe 100644
--- a/Lib/test/test_pkg.py
+++ b/Lib/test/test_pkg.py
@@ -48,13 +48,11 @@ class TestPkg(unittest.TestCase):
self.root = None
self.pkgname = None
self.syspath = list(sys.path)
- self.sysmodules = sys.modules.copy()
+ self.modules_before = support.modules_setup()
def tearDown(self):
sys.path[:] = self.syspath
- sys.modules.clear()
- sys.modules.update(self.sysmodules)
- del self.sysmodules
+ support.modules_cleanup(*self.modules_before)
cleanout(self.root)
# delete all modules concerning the tested hiearchy
diff --git a/Misc/NEWS b/Misc/NEWS
index 2d30d504d6..a7b570c461 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -373,6 +373,11 @@ Documentation
Tests
-----
+- Issue #6551: test_zipimport could import and then destroy some modules of
+ the encodings package, which would make other tests fail further down
+ the road because the internally cached encoders and decoders would point
+ to empty global variables.
+
- Issue #7295: Do not use a hardcoded file name in test_tarfile.
- Issue #7270: Add some dedicated unit tests for multi-thread synchronization