11from . import util
22
3- import importlib
4- from importlib import _bootstrap
5- from importlib import machinery
3+ frozen_init , source_init = util . import_importlib ( ' importlib' )
4+ frozen_machinery , source_machinery = util . import_importlib ( 'importlib.machinery' )
5+
66import sys
77from test import support
88import types
99import unittest
1010
1111
12- class ImportModuleTests ( unittest . TestCase ) :
12+ class ImportModuleTests :
1313
1414 """Test importlib.import_module."""
1515
1616 def test_module_import (self ):
1717 # Test importing a top-level module.
1818 with util .mock_modules ('top_level' ) as mock :
1919 with util .import_state (meta_path = [mock ]):
20- module = importlib .import_module ('top_level' )
20+ module = self . init .import_module ('top_level' )
2121 self .assertEqual (module .__name__ , 'top_level' )
2222
2323 def test_absolute_package_import (self ):
@@ -27,7 +27,7 @@ def test_absolute_package_import(self):
2727 name = '{0}.mod' .format (pkg_name )
2828 with util .mock_modules (pkg_long_name , name ) as mock :
2929 with util .import_state (meta_path = [mock ]):
30- module = importlib .import_module (name )
30+ module = self . init .import_module (name )
3131 self .assertEqual (module .__name__ , name )
3232
3333 def test_shallow_relative_package_import (self ):
@@ -39,17 +39,17 @@ def test_shallow_relative_package_import(self):
3939 relative_name = '.{0}' .format (module_name )
4040 with util .mock_modules (pkg_long_name , absolute_name ) as mock :
4141 with util .import_state (meta_path = [mock ]):
42- importlib .import_module (pkg_name )
43- module = importlib .import_module (relative_name , pkg_name )
42+ self . init .import_module (pkg_name )
43+ module = self . init .import_module (relative_name , pkg_name )
4444 self .assertEqual (module .__name__ , absolute_name )
4545
4646 def test_deep_relative_package_import (self ):
4747 modules = ['a.__init__' , 'a.b.__init__' , 'a.c' ]
4848 with util .mock_modules (* modules ) as mock :
4949 with util .import_state (meta_path = [mock ]):
50- importlib .import_module ('a' )
51- importlib .import_module ('a.b' )
52- module = importlib .import_module ('..c' , 'a.b' )
50+ self . init .import_module ('a' )
51+ self . init .import_module ('a.b' )
52+ module = self . init .import_module ('..c' , 'a.b' )
5353 self .assertEqual (module .__name__ , 'a.c' )
5454
5555 def test_absolute_import_with_package (self ):
@@ -60,15 +60,15 @@ def test_absolute_import_with_package(self):
6060 name = '{0}.mod' .format (pkg_name )
6161 with util .mock_modules (pkg_long_name , name ) as mock :
6262 with util .import_state (meta_path = [mock ]):
63- importlib .import_module (pkg_name )
64- module = importlib .import_module (name , pkg_name )
63+ self . init .import_module (pkg_name )
64+ module = self . init .import_module (name , pkg_name )
6565 self .assertEqual (module .__name__ , name )
6666
6767 def test_relative_import_wo_package (self ):
6868 # Relative imports cannot happen without the 'package' argument being
6969 # set.
7070 with self .assertRaises (TypeError ):
71- importlib .import_module ('.support' )
71+ self . init .import_module ('.support' )
7272
7373
7474 def test_loaded_once (self ):
@@ -77,19 +77,25 @@ def test_loaded_once(self):
7777 # module currently being imported.
7878 b_load_count = 0
7979 def load_a ():
80- importlib .import_module ('a.b' )
80+ self . init .import_module ('a.b' )
8181 def load_b ():
8282 nonlocal b_load_count
8383 b_load_count += 1
8484 code = {'a' : load_a , 'a.b' : load_b }
8585 modules = ['a.__init__' , 'a.b' ]
8686 with util .mock_modules (* modules , module_code = code ) as mock :
8787 with util .import_state (meta_path = [mock ]):
88- importlib .import_module ('a.b' )
88+ self . init .import_module ('a.b' )
8989 self .assertEqual (b_load_count , 1 )
9090
91+ class Frozen_ImportModuleTests (ImportModuleTests , unittest .TestCase ):
92+ init = frozen_init
93+
94+ class Source_ImportModuleTests (ImportModuleTests , unittest .TestCase ):
95+ init = source_init
96+
9197
92- class FindLoaderTests ( unittest . TestCase ) :
98+ class FindLoaderTests :
9399
94100 class FakeMetaFinder :
95101 @staticmethod
@@ -103,7 +109,7 @@ def test_sys_modules(self):
103109 loader = 'a loader!'
104110 module .__loader__ = loader
105111 sys .modules [name ] = module
106- found = importlib .find_loader (name )
112+ found = self . init .find_loader (name )
107113 self .assertEqual (loader , found )
108114
109115 def test_sys_modules_loader_is_None (self ):
@@ -114,7 +120,7 @@ def test_sys_modules_loader_is_None(self):
114120 module .__loader__ = None
115121 sys .modules [name ] = module
116122 with self .assertRaises (ValueError ):
117- importlib .find_loader (name )
123+ self . init .find_loader (name )
118124
119125 def test_sys_modules_loader_is_not_set (self ):
120126 # Should raise ValueError
@@ -128,14 +134,14 @@ def test_sys_modules_loader_is_not_set(self):
128134 pass
129135 sys .modules [name ] = module
130136 with self .assertRaises (ValueError ):
131- importlib .find_loader (name )
137+ self . init .find_loader (name )
132138
133139 def test_success (self ):
134140 # Return the loader found on sys.meta_path.
135141 name = 'some_mod'
136142 with util .uncache (name ):
137143 with util .import_state (meta_path = [self .FakeMetaFinder ]):
138- self .assertEqual ((name , None ), importlib .find_loader (name ))
144+ self .assertEqual ((name , None ), self . init .find_loader (name ))
139145
140146 def test_success_path (self ):
141147 # Searching on a path should work.
@@ -144,23 +150,29 @@ def test_success_path(self):
144150 with util .uncache (name ):
145151 with util .import_state (meta_path = [self .FakeMetaFinder ]):
146152 self .assertEqual ((name , path ),
147- importlib .find_loader (name , path ))
153+ self . init .find_loader (name , path ))
148154
149155 def test_nothing (self ):
150156 # None is returned upon failure to find a loader.
151- self .assertIsNone (importlib .find_loader ('nevergoingtofindthismodule' ))
157+ self .assertIsNone (self . init .find_loader ('nevergoingtofindthismodule' ))
152158
159+ class Frozen_FindLoaderTests (FindLoaderTests , unittest .TestCase ):
160+ init = frozen_init
153161
154- class ReloadTests (unittest .TestCase ):
162+ class Source_FindLoaderTests (FindLoaderTests , unittest .TestCase ):
163+ init = source_init
164+
165+
166+ class ReloadTests :
155167
156168 """Test module reloading for builtin and extension modules."""
157169
158170 def test_reload_modules (self ):
159171 for mod in ('tokenize' , 'time' , 'marshal' ):
160172 with self .subTest (module = mod ):
161173 with support .CleanImport (mod ):
162- module = importlib .import_module (mod )
163- importlib .reload (module )
174+ module = self . init .import_module (mod )
175+ self . init .reload (module )
164176
165177 def test_module_replaced (self ):
166178 def code ():
@@ -172,14 +184,20 @@ def code():
172184 module_code = {'top_level' : code })
173185 with mock :
174186 with util .import_state (meta_path = [mock ]):
175- module = importlib .import_module ('top_level' )
176- reloaded = importlib .reload (module )
187+ module = self . init .import_module ('top_level' )
188+ reloaded = self . init .reload (module )
177189 actual = sys .modules ['top_level' ]
178190 self .assertEqual (actual .spam , 3 )
179191 self .assertEqual (reloaded .spam , 3 )
180192
193+ class Frozen_ReloadTests (ReloadTests , unittest .TestCase ):
194+ init = frozen_init
195+
196+ class Source_ReloadTests (ReloadTests , unittest .TestCase ):
197+ init = source_init
181198
182- class InvalidateCacheTests (unittest .TestCase ):
199+
200+ class InvalidateCacheTests :
183201
184202 def test_method_called (self ):
185203 # If defined the method should be called.
@@ -198,7 +216,7 @@ def invalidate_caches(self):
198216 self .addCleanup (lambda : sys .path_importer_cache .__delitem__ (key ))
199217 sys .path_importer_cache [key ] = path_ins
200218 self .addCleanup (lambda : sys .meta_path .remove (meta_ins ))
201- importlib .invalidate_caches ()
219+ self . init .invalidate_caches ()
202220 self .assertTrue (meta_ins .called )
203221 self .assertTrue (path_ins .called )
204222
@@ -207,31 +225,45 @@ def test_method_lacking(self):
207225 key = 'gobbledeegook'
208226 sys .path_importer_cache [key ] = None
209227 self .addCleanup (lambda : sys .path_importer_cache .__delitem__ (key ))
210- importlib .invalidate_caches () # Shouldn't trigger an exception.
228+ self .init .invalidate_caches () # Shouldn't trigger an exception.
229+
230+ class Frozen_InvalidateCacheTests (InvalidateCacheTests , unittest .TestCase ):
231+ init = frozen_init
232+
233+ class Source_InvalidateCacheTests (InvalidateCacheTests , unittest .TestCase ):
234+ init = source_init
211235
212236
213237class FrozenImportlibTests (unittest .TestCase ):
214238
215239 def test_no_frozen_importlib (self ):
216240 # Should be able to import w/o _frozen_importlib being defined.
217- module = support .import_fresh_module ('importlib' , blocked = ['_frozen_importlib' ])
218- self .assertFalse (isinstance (module .__loader__ ,
219- machinery .FrozenImporter ))
241+ # Can't do an isinstance() check since separate copies of importlib
242+ # may have been used for import, so just check the name is not for the
243+ # frozen loader.
244+ self .assertNotEqual (source_init .__loader__ .__class__ .__name__ ,
245+ 'FrozenImporter' )
220246
221247
222- class StartupTests ( unittest . TestCase ) :
248+ class StartupTests :
223249
224250 def test_everyone_has___loader__ (self ):
225251 # Issue #17098: all modules should have __loader__ defined.
226252 for name , module in sys .modules .items ():
227253 if isinstance (module , types .ModuleType ):
228254 self .assertTrue (hasattr (module , '__loader__' ),
229255 '{!r} lacks a __loader__ attribute' .format (name ))
230- if importlib .machinery .BuiltinImporter .find_module (name ):
256+ if self .machinery .BuiltinImporter .find_module (name ):
231257 self .assertIsNot (module .__loader__ , None )
232- elif importlib .machinery .FrozenImporter .find_module (name ):
258+ elif self .machinery .FrozenImporter .find_module (name ):
233259 self .assertIsNot (module .__loader__ , None )
234260
261+ class Frozen_StartupTests (StartupTests , unittest .TestCase ):
262+ machinery = frozen_machinery
263+
264+ class Source_StartupTests (StartupTests , unittest .TestCase ):
265+ machinery = source_machinery
266+
235267
236268if __name__ == '__main__' :
237269 unittest .main ()
0 commit comments