summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 5672a20..18fb391 100644
--- a/Lib/test/support.py
+++ b/Lib/test/support.py
@@ -919,6 +919,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 bf2870d..1da30b7 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 0c568bb..2e293f4 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 e4791cf..fd56e89 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -144,6 +144,11 @@ Extension Modules
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