blob: 6bc3c564a58b5b5d3fd3a22a217cc1b45d4909c2 [file] [log] [blame]
Eric Snow3497c0b2014-05-16 11:40:40 -06001from . import util as test_util
Brett Cannonef888022013-06-15 18:39:21 -04002
Eric Snow3497c0b2014-05-16 11:40:40 -06003init = test_util.import_importlib('importlib')
4util = test_util.import_importlib('importlib.util')
5machinery = test_util.import_importlib('importlib.machinery')
Brett Cannon40b22d02013-10-18 10:45:59 -04006
Eric Snowcdf60122013-10-31 22:22:15 -06007import os.path
Brett Cannon2c318a12009-02-07 01:15:27 +00008import sys
Brett Cannon53089c62012-07-04 14:03:40 -04009from test import support
Brett Cannone7387b42013-02-01 14:43:59 -050010import types
Brett Cannon2c318a12009-02-07 01:15:27 +000011import unittest
Eric Snow1500d492014-01-06 20:49:04 -070012import warnings
Brett Cannon23cbd8a2009-01-18 00:24:28 +000013
14
Brett Cannon40b22d02013-10-18 10:45:59 -040015class ImportModuleTests:
Brett Cannon23cbd8a2009-01-18 00:24:28 +000016
17 """Test importlib.import_module."""
18
19 def test_module_import(self):
20 # Test importing a top-level module.
Eric Snow3497c0b2014-05-16 11:40:40 -060021 with test_util.mock_modules('top_level') as mock:
22 with test_util.import_state(meta_path=[mock]):
Brett Cannon40b22d02013-10-18 10:45:59 -040023 module = self.init.import_module('top_level')
Brett Cannon23cbd8a2009-01-18 00:24:28 +000024 self.assertEqual(module.__name__, 'top_level')
25
26 def test_absolute_package_import(self):
27 # Test importing a module from a package with an absolute name.
28 pkg_name = 'pkg'
29 pkg_long_name = '{0}.__init__'.format(pkg_name)
30 name = '{0}.mod'.format(pkg_name)
Eric Snow3497c0b2014-05-16 11:40:40 -060031 with test_util.mock_modules(pkg_long_name, name) as mock:
32 with test_util.import_state(meta_path=[mock]):
Brett Cannon40b22d02013-10-18 10:45:59 -040033 module = self.init.import_module(name)
Brett Cannon23cbd8a2009-01-18 00:24:28 +000034 self.assertEqual(module.__name__, name)
35
Brett Cannonb5f03c62009-03-04 01:02:54 +000036 def test_shallow_relative_package_import(self):
Brett Cannon2cf15852010-07-03 22:03:16 +000037 # Test importing a module from a package through a relative import.
Brett Cannon23cbd8a2009-01-18 00:24:28 +000038 pkg_name = 'pkg'
39 pkg_long_name = '{0}.__init__'.format(pkg_name)
40 module_name = 'mod'
41 absolute_name = '{0}.{1}'.format(pkg_name, module_name)
42 relative_name = '.{0}'.format(module_name)
Eric Snow3497c0b2014-05-16 11:40:40 -060043 with test_util.mock_modules(pkg_long_name, absolute_name) as mock:
44 with test_util.import_state(meta_path=[mock]):
Brett Cannon40b22d02013-10-18 10:45:59 -040045 self.init.import_module(pkg_name)
46 module = self.init.import_module(relative_name, pkg_name)
Brett Cannon23cbd8a2009-01-18 00:24:28 +000047 self.assertEqual(module.__name__, absolute_name)
48
Brett Cannonb5f03c62009-03-04 01:02:54 +000049 def test_deep_relative_package_import(self):
50 modules = ['a.__init__', 'a.b.__init__', 'a.c']
Eric Snow3497c0b2014-05-16 11:40:40 -060051 with test_util.mock_modules(*modules) as mock:
52 with test_util.import_state(meta_path=[mock]):
Brett Cannon40b22d02013-10-18 10:45:59 -040053 self.init.import_module('a')
54 self.init.import_module('a.b')
55 module = self.init.import_module('..c', 'a.b')
Brett Cannonb5f03c62009-03-04 01:02:54 +000056 self.assertEqual(module.__name__, 'a.c')
57
Brett Cannon23cbd8a2009-01-18 00:24:28 +000058 def test_absolute_import_with_package(self):
59 # Test importing a module from a package with an absolute name with
60 # the 'package' argument given.
61 pkg_name = 'pkg'
62 pkg_long_name = '{0}.__init__'.format(pkg_name)
63 name = '{0}.mod'.format(pkg_name)
Eric Snow3497c0b2014-05-16 11:40:40 -060064 with test_util.mock_modules(pkg_long_name, name) as mock:
65 with test_util.import_state(meta_path=[mock]):
Brett Cannon40b22d02013-10-18 10:45:59 -040066 self.init.import_module(pkg_name)
67 module = self.init.import_module(name, pkg_name)
Brett Cannon23cbd8a2009-01-18 00:24:28 +000068 self.assertEqual(module.__name__, name)
69
70 def test_relative_import_wo_package(self):
71 # Relative imports cannot happen without the 'package' argument being
72 # set.
Brett Cannon2153dc02009-08-27 23:49:21 +000073 with self.assertRaises(TypeError):
Brett Cannon40b22d02013-10-18 10:45:59 -040074 self.init.import_module('.support')
Brett Cannon23cbd8a2009-01-18 00:24:28 +000075
76
Meador Inge416f12d2011-12-14 22:23:46 -060077 def test_loaded_once(self):
78 # Issue #13591: Modules should only be loaded once when
79 # initializing the parent package attempts to import the
80 # module currently being imported.
81 b_load_count = 0
82 def load_a():
Brett Cannon40b22d02013-10-18 10:45:59 -040083 self.init.import_module('a.b')
Meador Inge416f12d2011-12-14 22:23:46 -060084 def load_b():
85 nonlocal b_load_count
86 b_load_count += 1
87 code = {'a': load_a, 'a.b': load_b}
88 modules = ['a.__init__', 'a.b']
Eric Snow3497c0b2014-05-16 11:40:40 -060089 with test_util.mock_modules(*modules, module_code=code) as mock:
90 with test_util.import_state(meta_path=[mock]):
Brett Cannon40b22d02013-10-18 10:45:59 -040091 self.init.import_module('a.b')
Meador Inge416f12d2011-12-14 22:23:46 -060092 self.assertEqual(b_load_count, 1)
93
Brett Cannonb46a1792012-02-27 18:15:42 -050094
Eric Snow3497c0b2014-05-16 11:40:40 -060095(Frozen_ImportModuleTests,
96 Source_ImportModuleTests
97 ) = test_util.test_both(ImportModuleTests, init=init)
Brett Cannon40b22d02013-10-18 10:45:59 -040098
99
100class FindLoaderTests:
Brett Cannonee78a2b2012-05-12 17:43:17 -0400101
102 class FakeMetaFinder:
103 @staticmethod
104 def find_module(name, path=None): return name, path
105
106 def test_sys_modules(self):
107 # If a module with __loader__ is in sys.modules, then return it.
108 name = 'some_mod'
Eric Snow3497c0b2014-05-16 11:40:40 -0600109 with test_util.uncache(name):
Brett Cannonef888022013-06-15 18:39:21 -0400110 module = types.ModuleType(name)
Brett Cannonee78a2b2012-05-12 17:43:17 -0400111 loader = 'a loader!'
112 module.__loader__ = loader
113 sys.modules[name] = module
Eric Snow1500d492014-01-06 20:49:04 -0700114 with warnings.catch_warnings():
115 warnings.simplefilter('ignore', DeprecationWarning)
116 found = self.init.find_loader(name)
Brett Cannonee78a2b2012-05-12 17:43:17 -0400117 self.assertEqual(loader, found)
118
119 def test_sys_modules_loader_is_None(self):
120 # If sys.modules[name].__loader__ is None, raise ValueError.
121 name = 'some_mod'
Eric Snow3497c0b2014-05-16 11:40:40 -0600122 with test_util.uncache(name):
Brett Cannonef888022013-06-15 18:39:21 -0400123 module = types.ModuleType(name)
Brett Cannonee78a2b2012-05-12 17:43:17 -0400124 module.__loader__ = None
125 sys.modules[name] = module
126 with self.assertRaises(ValueError):
Eric Snow1500d492014-01-06 20:49:04 -0700127 with warnings.catch_warnings():
128 warnings.simplefilter('ignore', DeprecationWarning)
129 self.init.find_loader(name)
Brett Cannonee78a2b2012-05-12 17:43:17 -0400130
Brett Cannon32799232013-03-13 11:09:08 -0700131 def test_sys_modules_loader_is_not_set(self):
132 # Should raise ValueError
133 # Issue #17099
134 name = 'some_mod'
Eric Snow3497c0b2014-05-16 11:40:40 -0600135 with test_util.uncache(name):
Brett Cannonef888022013-06-15 18:39:21 -0400136 module = types.ModuleType(name)
Brett Cannon32799232013-03-13 11:09:08 -0700137 try:
138 del module.__loader__
139 except AttributeError:
140 pass
141 sys.modules[name] = module
142 with self.assertRaises(ValueError):
Eric Snow1500d492014-01-06 20:49:04 -0700143 with warnings.catch_warnings():
144 warnings.simplefilter('ignore', DeprecationWarning)
145 self.init.find_loader(name)
Brett Cannon32799232013-03-13 11:09:08 -0700146
Brett Cannonee78a2b2012-05-12 17:43:17 -0400147 def test_success(self):
148 # Return the loader found on sys.meta_path.
149 name = 'some_mod'
Eric Snow3497c0b2014-05-16 11:40:40 -0600150 with test_util.uncache(name):
151 with test_util.import_state(meta_path=[self.FakeMetaFinder]):
Eric Snow1500d492014-01-06 20:49:04 -0700152 with warnings.catch_warnings():
153 warnings.simplefilter('ignore', DeprecationWarning)
154 self.assertEqual((name, None), self.init.find_loader(name))
Brett Cannonee78a2b2012-05-12 17:43:17 -0400155
156 def test_success_path(self):
157 # Searching on a path should work.
158 name = 'some_mod'
159 path = 'path to some place'
Eric Snow3497c0b2014-05-16 11:40:40 -0600160 with test_util.uncache(name):
161 with test_util.import_state(meta_path=[self.FakeMetaFinder]):
Eric Snow1500d492014-01-06 20:49:04 -0700162 with warnings.catch_warnings():
163 warnings.simplefilter('ignore', DeprecationWarning)
164 self.assertEqual((name, path),
165 self.init.find_loader(name, path))
Brett Cannonee78a2b2012-05-12 17:43:17 -0400166
167 def test_nothing(self):
168 # None is returned upon failure to find a loader.
Eric Snow1500d492014-01-06 20:49:04 -0700169 with warnings.catch_warnings():
170 warnings.simplefilter('ignore', DeprecationWarning)
171 self.assertIsNone(self.init.find_loader('nevergoingtofindthismodule'))
Brett Cannon40b22d02013-10-18 10:45:59 -0400172
Brett Cannon40b22d02013-10-18 10:45:59 -0400173
Eric Snow3497c0b2014-05-16 11:40:40 -0600174(Frozen_FindLoaderTests,
175 Source_FindLoaderTests
176 ) = test_util.test_both(FindLoaderTests, init=init)
Brett Cannonee78a2b2012-05-12 17:43:17 -0400177
178
Brett Cannon40b22d02013-10-18 10:45:59 -0400179class ReloadTests:
Brett Cannon3fe35e62013-06-14 15:04:26 -0400180
181 """Test module reloading for builtin and extension modules."""
182
183 def test_reload_modules(self):
184 for mod in ('tokenize', 'time', 'marshal'):
185 with self.subTest(module=mod):
186 with support.CleanImport(mod):
Brett Cannon40b22d02013-10-18 10:45:59 -0400187 module = self.init.import_module(mod)
188 self.init.reload(module)
Brett Cannon3fe35e62013-06-14 15:04:26 -0400189
Eric Snow8e455402013-08-14 18:11:09 -0600190 def test_module_replaced(self):
191 def code():
192 import sys
193 module = type(sys)('top_level')
194 module.spam = 3
195 sys.modules['top_level'] = module
Eric Snow3497c0b2014-05-16 11:40:40 -0600196 mock = test_util.mock_modules('top_level',
197 module_code={'top_level': code})
Eric Snow8e455402013-08-14 18:11:09 -0600198 with mock:
Eric Snow3497c0b2014-05-16 11:40:40 -0600199 with test_util.import_state(meta_path=[mock]):
Brett Cannon40b22d02013-10-18 10:45:59 -0400200 module = self.init.import_module('top_level')
201 reloaded = self.init.reload(module)
Eric Snow8e455402013-08-14 18:11:09 -0600202 actual = sys.modules['top_level']
203 self.assertEqual(actual.spam, 3)
204 self.assertEqual(reloaded.spam, 3)
205
Eric Snowcdf60122013-10-31 22:22:15 -0600206 def test_reload_missing_loader(self):
207 with support.CleanImport('types'):
208 import types
209 loader = types.__loader__
210 del types.__loader__
211 reloaded = self.init.reload(types)
212
213 self.assertIs(reloaded, types)
214 self.assertIs(sys.modules['types'], types)
215 self.assertEqual(reloaded.__loader__.path, loader.path)
216
217 def test_reload_loader_replaced(self):
218 with support.CleanImport('types'):
219 import types
220 types.__loader__ = None
221 self.init.invalidate_caches()
222 reloaded = self.init.reload(types)
223
224 self.assertIsNot(reloaded.__loader__, None)
225 self.assertIs(reloaded, types)
226 self.assertIs(sys.modules['types'], types)
227
228 def test_reload_location_changed(self):
229 name = 'spam'
230 with support.temp_cwd(None) as cwd:
Eric Snow3497c0b2014-05-16 11:40:40 -0600231 with test_util.uncache('spam'):
Eric Snowcdf60122013-10-31 22:22:15 -0600232 with support.DirsOnSysPath(cwd):
Eric Snowb523f842013-11-22 09:05:39 -0700233 # Start as a plain module.
Eric Snowcdf60122013-10-31 22:22:15 -0600234 self.init.invalidate_caches()
235 path = os.path.join(cwd, name + '.py')
236 cached = self.util.cache_from_source(path)
237 expected = {'__name__': name,
238 '__package__': '',
239 '__file__': path,
240 '__cached__': cached,
241 '__doc__': None,
Eric Snowcdf60122013-10-31 22:22:15 -0600242 }
243 support.create_empty_file(path)
244 module = self.init.import_module(name)
Eric Snow2f46a0e2014-05-13 12:15:42 -0600245 ns = vars(module).copy()
Eric Snowcdf60122013-10-31 22:22:15 -0600246 loader = ns.pop('__loader__')
Eric Snowb523f842013-11-22 09:05:39 -0700247 spec = ns.pop('__spec__')
Eric Snow2f46a0e2014-05-13 12:15:42 -0600248 ns.pop('__builtins__', None) # An implementation detail.
Eric Snowb523f842013-11-22 09:05:39 -0700249 self.assertEqual(spec.name, name)
250 self.assertEqual(spec.loader, loader)
Eric Snowcdf60122013-10-31 22:22:15 -0600251 self.assertEqual(loader.path, path)
252 self.assertEqual(ns, expected)
253
Eric Snowb523f842013-11-22 09:05:39 -0700254 # Change to a package.
Eric Snowcdf60122013-10-31 22:22:15 -0600255 self.init.invalidate_caches()
256 init_path = os.path.join(cwd, name, '__init__.py')
257 cached = self.util.cache_from_source(init_path)
258 expected = {'__name__': name,
259 '__package__': name,
260 '__file__': init_path,
261 '__cached__': cached,
262 '__path__': [os.path.dirname(init_path)],
263 '__doc__': None,
Eric Snowcdf60122013-10-31 22:22:15 -0600264 }
265 os.mkdir(name)
266 os.rename(path, init_path)
267 reloaded = self.init.reload(module)
Eric Snow2f46a0e2014-05-13 12:15:42 -0600268 ns = vars(reloaded).copy()
Eric Snowcdf60122013-10-31 22:22:15 -0600269 loader = ns.pop('__loader__')
Eric Snowb523f842013-11-22 09:05:39 -0700270 spec = ns.pop('__spec__')
Eric Snow2f46a0e2014-05-13 12:15:42 -0600271 ns.pop('__builtins__', None) # An implementation detail.
Eric Snowb523f842013-11-22 09:05:39 -0700272 self.assertEqual(spec.name, name)
273 self.assertEqual(spec.loader, loader)
Eric Snowcdf60122013-10-31 22:22:15 -0600274 self.assertIs(reloaded, module)
275 self.assertEqual(loader.path, init_path)
Eric Snowb523f842013-11-22 09:05:39 -0700276 self.maxDiff = None
Eric Snowcdf60122013-10-31 22:22:15 -0600277 self.assertEqual(ns, expected)
278
279 def test_reload_namespace_changed(self):
Eric Snowcdf60122013-10-31 22:22:15 -0600280 name = 'spam'
281 with support.temp_cwd(None) as cwd:
Eric Snow3497c0b2014-05-16 11:40:40 -0600282 with test_util.uncache('spam'):
Eric Snowcdf60122013-10-31 22:22:15 -0600283 with support.DirsOnSysPath(cwd):
Eric Snowb523f842013-11-22 09:05:39 -0700284 # Start as a namespace package.
Eric Snowcdf60122013-10-31 22:22:15 -0600285 self.init.invalidate_caches()
286 bad_path = os.path.join(cwd, name, '__init.py')
287 cached = self.util.cache_from_source(bad_path)
288 expected = {'__name__': name,
289 '__package__': name,
290 '__doc__': None,
291 }
292 os.mkdir(name)
293 with open(bad_path, 'w') as init_file:
294 init_file.write('eggs = None')
295 module = self.init.import_module(name)
Eric Snow2f46a0e2014-05-13 12:15:42 -0600296 ns = vars(module).copy()
Eric Snowcdf60122013-10-31 22:22:15 -0600297 loader = ns.pop('__loader__')
298 path = ns.pop('__path__')
Eric Snowb523f842013-11-22 09:05:39 -0700299 spec = ns.pop('__spec__')
Eric Snow2f46a0e2014-05-13 12:15:42 -0600300 ns.pop('__builtins__', None) # An implementation detail.
Eric Snowb523f842013-11-22 09:05:39 -0700301 self.assertEqual(spec.name, name)
302 self.assertIs(spec.loader, None)
303 self.assertIsNot(loader, None)
Eric Snow4ae17f52013-10-31 23:44:31 -0600304 self.assertEqual(set(path),
305 set([os.path.dirname(bad_path)]))
Eric Snowcdf60122013-10-31 22:22:15 -0600306 with self.assertRaises(AttributeError):
307 # a NamespaceLoader
308 loader.path
309 self.assertEqual(ns, expected)
310
Eric Snowb523f842013-11-22 09:05:39 -0700311 # Change to a regular package.
Eric Snowcdf60122013-10-31 22:22:15 -0600312 self.init.invalidate_caches()
313 init_path = os.path.join(cwd, name, '__init__.py')
314 cached = self.util.cache_from_source(init_path)
315 expected = {'__name__': name,
316 '__package__': name,
317 '__file__': init_path,
318 '__cached__': cached,
319 '__path__': [os.path.dirname(init_path)],
320 '__doc__': None,
Eric Snowcdf60122013-10-31 22:22:15 -0600321 'eggs': None,
322 }
323 os.rename(bad_path, init_path)
324 reloaded = self.init.reload(module)
Eric Snow2f46a0e2014-05-13 12:15:42 -0600325 ns = vars(reloaded).copy()
Eric Snowcdf60122013-10-31 22:22:15 -0600326 loader = ns.pop('__loader__')
Eric Snowb523f842013-11-22 09:05:39 -0700327 spec = ns.pop('__spec__')
Eric Snow2f46a0e2014-05-13 12:15:42 -0600328 ns.pop('__builtins__', None) # An implementation detail.
Eric Snowb523f842013-11-22 09:05:39 -0700329 self.assertEqual(spec.name, name)
330 self.assertEqual(spec.loader, loader)
Eric Snowcdf60122013-10-31 22:22:15 -0600331 self.assertIs(reloaded, module)
332 self.assertEqual(loader.path, init_path)
333 self.assertEqual(ns, expected)
334
Eric Snowc1e7c742013-12-09 19:59:10 -0700335 def test_reload_submodule(self):
336 # See #19851.
337 name = 'spam'
338 subname = 'ham'
Eric Snow3497c0b2014-05-16 11:40:40 -0600339 with test_util.temp_module(name, pkg=True) as pkg_dir:
340 fullname, _ = test_util.submodule(name, subname, pkg_dir)
Eric Snowc1e7c742013-12-09 19:59:10 -0700341 ham = self.init.import_module(fullname)
342 reloaded = self.init.reload(ham)
343 self.assertIs(reloaded, ham)
344
Eric Snowcdf60122013-10-31 22:22:15 -0600345
Eric Snow3497c0b2014-05-16 11:40:40 -0600346(Frozen_ReloadTests,
347 Source_ReloadTests
348 ) = test_util.test_both(ReloadTests, init=init, util=util)
Brett Cannon40b22d02013-10-18 10:45:59 -0400349
350
351class InvalidateCacheTests:
Brett Cannonb46a1792012-02-27 18:15:42 -0500352
353 def test_method_called(self):
354 # If defined the method should be called.
355 class InvalidatingNullFinder:
356 def __init__(self, *ignored):
357 self.called = False
358 def find_module(self, *args):
359 return None
360 def invalidate_caches(self):
361 self.called = True
362
363 key = 'gobledeegook'
Brett Cannonf4dc9202012-08-10 12:21:12 -0400364 meta_ins = InvalidatingNullFinder()
365 path_ins = InvalidatingNullFinder()
366 sys.meta_path.insert(0, meta_ins)
Brett Cannonb46a1792012-02-27 18:15:42 -0500367 self.addCleanup(lambda: sys.path_importer_cache.__delitem__(key))
Brett Cannonf4dc9202012-08-10 12:21:12 -0400368 sys.path_importer_cache[key] = path_ins
369 self.addCleanup(lambda: sys.meta_path.remove(meta_ins))
Brett Cannon40b22d02013-10-18 10:45:59 -0400370 self.init.invalidate_caches()
Brett Cannonf4dc9202012-08-10 12:21:12 -0400371 self.assertTrue(meta_ins.called)
372 self.assertTrue(path_ins.called)
Brett Cannonb46a1792012-02-27 18:15:42 -0500373
374 def test_method_lacking(self):
375 # There should be no issues if the method is not defined.
376 key = 'gobbledeegook'
Brett Cannonef888022013-06-15 18:39:21 -0400377 sys.path_importer_cache[key] = None
Brett Cannonb46a1792012-02-27 18:15:42 -0500378 self.addCleanup(lambda: sys.path_importer_cache.__delitem__(key))
Brett Cannon40b22d02013-10-18 10:45:59 -0400379 self.init.invalidate_caches() # Shouldn't trigger an exception.
380
Brett Cannon40b22d02013-10-18 10:45:59 -0400381
Eric Snow3497c0b2014-05-16 11:40:40 -0600382(Frozen_InvalidateCacheTests,
383 Source_InvalidateCacheTests
384 ) = test_util.test_both(InvalidateCacheTests, init=init)
Brett Cannonb46a1792012-02-27 18:15:42 -0500385
386
Brett Cannon8e2f5562012-07-02 14:53:10 -0400387class FrozenImportlibTests(unittest.TestCase):
388
389 def test_no_frozen_importlib(self):
390 # Should be able to import w/o _frozen_importlib being defined.
Brett Cannon40b22d02013-10-18 10:45:59 -0400391 # Can't do an isinstance() check since separate copies of importlib
392 # may have been used for import, so just check the name is not for the
393 # frozen loader.
Eric Snow3497c0b2014-05-16 11:40:40 -0600394 source_init = init['Source']
Brett Cannon40b22d02013-10-18 10:45:59 -0400395 self.assertNotEqual(source_init.__loader__.__class__.__name__,
396 'FrozenImporter')
Brett Cannon8e2f5562012-07-02 14:53:10 -0400397
398
Brett Cannon40b22d02013-10-18 10:45:59 -0400399class StartupTests:
Brett Cannone7387b42013-02-01 14:43:59 -0500400
401 def test_everyone_has___loader__(self):
402 # Issue #17098: all modules should have __loader__ defined.
403 for name, module in sys.modules.items():
404 if isinstance(module, types.ModuleType):
Eric Snowb523f842013-11-22 09:05:39 -0700405 with self.subTest(name=name):
406 self.assertTrue(hasattr(module, '__loader__'),
407 '{!r} lacks a __loader__ attribute'.format(name))
408 if self.machinery.BuiltinImporter.find_module(name):
409 self.assertIsNot(module.__loader__, None)
410 elif self.machinery.FrozenImporter.find_module(name):
411 self.assertIsNot(module.__loader__, None)
412
413 def test_everyone_has___spec__(self):
414 for name, module in sys.modules.items():
415 if isinstance(module, types.ModuleType):
416 with self.subTest(name=name):
417 self.assertTrue(hasattr(module, '__spec__'))
418 if self.machinery.BuiltinImporter.find_module(name):
419 self.assertIsNot(module.__spec__, None)
420 elif self.machinery.FrozenImporter.find_module(name):
421 self.assertIsNot(module.__spec__, None)
Brett Cannon23cbd8a2009-01-18 00:24:28 +0000422
Brett Cannon40b22d02013-10-18 10:45:59 -0400423
Eric Snow3497c0b2014-05-16 11:40:40 -0600424(Frozen_StartupTests,
425 Source_StartupTests
426 ) = test_util.test_both(StartupTests, machinery=machinery)
Brett Cannon40b22d02013-10-18 10:45:59 -0400427
Brett Cannon23cbd8a2009-01-18 00:24:28 +0000428
429if __name__ == '__main__':
Brett Cannonf41fa4f32013-02-01 14:51:43 -0500430 unittest.main()