From: Antoine Pitrou Date: Fri, 13 Nov 2009 16:31:51 +0000 (+0000) Subject: Merged revisions 76240 via svnmerge from X-Git-Tag: v3.1.2rc1~347 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ca154091950023d209819484d2d5c51ddcc1e882;p=thirdparty%2FPython%2Fcpython.git Merged revisions 76240 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r76240 | antoine.pitrou | 2009-11-13 17:29:04 +0100 (ven., 13 nov. 2009) | 6 lines 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. ........ --- diff --git a/Lib/test/support.py b/Lib/test/support.py index 5672a20c9a70..18fb3919e2de 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 bf2870dbec5d..1da30b7c7743 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 0c568bb3b55e..2e293f4fbe53 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 e4791cff803b..fd56e89e07b4 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