]> granicus.if.org Git - python/commitdiff
Issue 10556: test_zipimport_support implicitly imports too many modules (including...
authorNick Coghlan <ncoghlan@gmail.com>
Tue, 11 Jan 2011 10:05:20 +0000 (10:05 +0000)
committerNick Coghlan <ncoghlan@gmail.com>
Tue, 11 Jan 2011 10:05:20 +0000 (10:05 +0000)
Lib/test/support.py
Lib/test/test_zipimport_support.py

index 152cac9bee32ba23b4a29ea61711ee27cd17136e..3d1d0f11eefc4d9a6b6f3b2fdf3117b7cd847532 100644 (file)
@@ -1199,6 +1199,12 @@ def modules_cleanup(oldmodules):
                  if k.startswith('encodings.')]
     sys.modules.clear()
     sys.modules.update(encodings)
+    # XXX: This kind of problem can affect more than just encodings. In particular
+    # extension modules (such as _ssl) don't cope with releoding properly.
+    # Really, test modules should be cleaning out the test specific modules they
+    # know they added (ala test_runpy) rather than relying on this function (as
+    # test_importhooks and test_pkg do currently).
+    # Implicitly imported *real* modules should be left alone (see issue 10556).
     sys.modules.update(oldmodules)
 
 #=======================================================================
index b935b3f4d23a75e9b36c1f642a3d267dbac9c17e..54ab86466c0042f6ea3719e6c52b23109684bf78 100644 (file)
@@ -13,6 +13,7 @@ import doctest
 import inspect
 import linecache
 import pdb
+import unittest
 from test.script_helper import (spawn_python, kill_python, assert_python_ok,
                                 temp_dir, make_script, make_zip_script)
 
@@ -29,7 +30,6 @@ verbose = test.support.verbose
 
 # Retrieve some helpers from other test cases
 from test import test_doctest, sample_doctest
-from test.test_importhooks import ImportHooksBaseTestCase
 
 
 def _run_object_doctest(obj, module):
@@ -59,17 +59,28 @@ def _run_object_doctest(obj, module):
 
 
 
-class ZipSupportTests(ImportHooksBaseTestCase):
-    # We use the ImportHooksBaseTestCase to restore
+class ZipSupportTests(unittest.TestCase):
+    # This used to use the ImportHooksBaseTestCase to restore
     # the state of the import related information
-    # in the sys module after each test
+    # in the sys module after each test. However, that restores
+    # *too much* information and breaks for the invocation of
+    # of test_doctest. So we do our own thing and leave
+    # sys.modules alone.
     # We also clear the linecache and zipimport cache
     # just to avoid any bogus errors due to name reuse in the tests
     def setUp(self):
         linecache.clearcache()
         zipimport._zip_directory_cache.clear()
-        ImportHooksBaseTestCase.setUp(self)
-
+        self.path = sys.path[:]
+        self.meta_path = sys.meta_path[:]
+        self.path_hooks = sys.path_hooks[:]
+        sys.path_importer_cache.clear()
+
+    def tearDown(self):
+        sys.path[:] = self.path
+        sys.meta_path[:] = self.meta_path
+        sys.path_hooks[:] = self.path_hooks
+        sys.path_importer_cache.clear()
 
     def test_inspect_getsource_issue4223(self):
         test_src = "def foo(): pass\n"