Commit ac178a7d authored by Brett Cannon's avatar Brett Cannon

Issue #16803: test.test_importlib.test_api now runs under frozen and

source.
parent 9acffd83
from . import util from . import util
import importlib frozen_init, source_init = util.import_importlib('importlib')
from importlib import _bootstrap frozen_machinery, source_machinery = util.import_importlib('importlib.machinery')
from importlib import machinery
import sys import sys
from test import support from test import support
import types import types
import unittest import unittest
class ImportModuleTests(unittest.TestCase): class ImportModuleTests:
"""Test importlib.import_module.""" """Test importlib.import_module."""
...@@ -17,7 +17,7 @@ class ImportModuleTests(unittest.TestCase): ...@@ -17,7 +17,7 @@ class ImportModuleTests(unittest.TestCase):
# Test importing a top-level module. # Test importing a top-level module.
with util.mock_modules('top_level') as mock: with util.mock_modules('top_level') as mock:
with util.import_state(meta_path=[mock]): with util.import_state(meta_path=[mock]):
module = importlib.import_module('top_level') module = self.init.import_module('top_level')
self.assertEqual(module.__name__, 'top_level') self.assertEqual(module.__name__, 'top_level')
def test_absolute_package_import(self): def test_absolute_package_import(self):
...@@ -27,7 +27,7 @@ class ImportModuleTests(unittest.TestCase): ...@@ -27,7 +27,7 @@ class ImportModuleTests(unittest.TestCase):
name = '{0}.mod'.format(pkg_name) name = '{0}.mod'.format(pkg_name)
with util.mock_modules(pkg_long_name, name) as mock: with util.mock_modules(pkg_long_name, name) as mock:
with util.import_state(meta_path=[mock]): with util.import_state(meta_path=[mock]):
module = importlib.import_module(name) module = self.init.import_module(name)
self.assertEqual(module.__name__, name) self.assertEqual(module.__name__, name)
def test_shallow_relative_package_import(self): def test_shallow_relative_package_import(self):
...@@ -39,17 +39,17 @@ class ImportModuleTests(unittest.TestCase): ...@@ -39,17 +39,17 @@ class ImportModuleTests(unittest.TestCase):
relative_name = '.{0}'.format(module_name) relative_name = '.{0}'.format(module_name)
with util.mock_modules(pkg_long_name, absolute_name) as mock: with util.mock_modules(pkg_long_name, absolute_name) as mock:
with util.import_state(meta_path=[mock]): with util.import_state(meta_path=[mock]):
importlib.import_module(pkg_name) self.init.import_module(pkg_name)
module = importlib.import_module(relative_name, pkg_name) module = self.init.import_module(relative_name, pkg_name)
self.assertEqual(module.__name__, absolute_name) self.assertEqual(module.__name__, absolute_name)
def test_deep_relative_package_import(self): def test_deep_relative_package_import(self):
modules = ['a.__init__', 'a.b.__init__', 'a.c'] modules = ['a.__init__', 'a.b.__init__', 'a.c']
with util.mock_modules(*modules) as mock: with util.mock_modules(*modules) as mock:
with util.import_state(meta_path=[mock]): with util.import_state(meta_path=[mock]):
importlib.import_module('a') self.init.import_module('a')
importlib.import_module('a.b') self.init.import_module('a.b')
module = importlib.import_module('..c', 'a.b') module = self.init.import_module('..c', 'a.b')
self.assertEqual(module.__name__, 'a.c') self.assertEqual(module.__name__, 'a.c')
def test_absolute_import_with_package(self): def test_absolute_import_with_package(self):
...@@ -60,15 +60,15 @@ class ImportModuleTests(unittest.TestCase): ...@@ -60,15 +60,15 @@ class ImportModuleTests(unittest.TestCase):
name = '{0}.mod'.format(pkg_name) name = '{0}.mod'.format(pkg_name)
with util.mock_modules(pkg_long_name, name) as mock: with util.mock_modules(pkg_long_name, name) as mock:
with util.import_state(meta_path=[mock]): with util.import_state(meta_path=[mock]):
importlib.import_module(pkg_name) self.init.import_module(pkg_name)
module = importlib.import_module(name, pkg_name) module = self.init.import_module(name, pkg_name)
self.assertEqual(module.__name__, name) self.assertEqual(module.__name__, name)
def test_relative_import_wo_package(self): def test_relative_import_wo_package(self):
# Relative imports cannot happen without the 'package' argument being # Relative imports cannot happen without the 'package' argument being
# set. # set.
with self.assertRaises(TypeError): with self.assertRaises(TypeError):
importlib.import_module('.support') self.init.import_module('.support')
def test_loaded_once(self): def test_loaded_once(self):
...@@ -77,7 +77,7 @@ class ImportModuleTests(unittest.TestCase): ...@@ -77,7 +77,7 @@ class ImportModuleTests(unittest.TestCase):
# module currently being imported. # module currently being imported.
b_load_count = 0 b_load_count = 0
def load_a(): def load_a():
importlib.import_module('a.b') self.init.import_module('a.b')
def load_b(): def load_b():
nonlocal b_load_count nonlocal b_load_count
b_load_count += 1 b_load_count += 1
...@@ -85,11 +85,17 @@ class ImportModuleTests(unittest.TestCase): ...@@ -85,11 +85,17 @@ class ImportModuleTests(unittest.TestCase):
modules = ['a.__init__', 'a.b'] modules = ['a.__init__', 'a.b']
with util.mock_modules(*modules, module_code=code) as mock: with util.mock_modules(*modules, module_code=code) as mock:
with util.import_state(meta_path=[mock]): with util.import_state(meta_path=[mock]):
importlib.import_module('a.b') self.init.import_module('a.b')
self.assertEqual(b_load_count, 1) self.assertEqual(b_load_count, 1)
class Frozen_ImportModuleTests(ImportModuleTests, unittest.TestCase):
init = frozen_init
class Source_ImportModuleTests(ImportModuleTests, unittest.TestCase):
init = source_init
class FindLoaderTests(unittest.TestCase): class FindLoaderTests:
class FakeMetaFinder: class FakeMetaFinder:
@staticmethod @staticmethod
...@@ -103,7 +109,7 @@ class FindLoaderTests(unittest.TestCase): ...@@ -103,7 +109,7 @@ class FindLoaderTests(unittest.TestCase):
loader = 'a loader!' loader = 'a loader!'
module.__loader__ = loader module.__loader__ = loader
sys.modules[name] = module sys.modules[name] = module
found = importlib.find_loader(name) found = self.init.find_loader(name)
self.assertEqual(loader, found) self.assertEqual(loader, found)
def test_sys_modules_loader_is_None(self): def test_sys_modules_loader_is_None(self):
...@@ -114,7 +120,7 @@ class FindLoaderTests(unittest.TestCase): ...@@ -114,7 +120,7 @@ class FindLoaderTests(unittest.TestCase):
module.__loader__ = None module.__loader__ = None
sys.modules[name] = module sys.modules[name] = module
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
importlib.find_loader(name) self.init.find_loader(name)
def test_sys_modules_loader_is_not_set(self): def test_sys_modules_loader_is_not_set(self):
# Should raise ValueError # Should raise ValueError
...@@ -128,14 +134,14 @@ class FindLoaderTests(unittest.TestCase): ...@@ -128,14 +134,14 @@ class FindLoaderTests(unittest.TestCase):
pass pass
sys.modules[name] = module sys.modules[name] = module
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
importlib.find_loader(name) self.init.find_loader(name)
def test_success(self): def test_success(self):
# Return the loader found on sys.meta_path. # Return the loader found on sys.meta_path.
name = 'some_mod' name = 'some_mod'
with util.uncache(name): with util.uncache(name):
with util.import_state(meta_path=[self.FakeMetaFinder]): with util.import_state(meta_path=[self.FakeMetaFinder]):
self.assertEqual((name, None), importlib.find_loader(name)) self.assertEqual((name, None), self.init.find_loader(name))
def test_success_path(self): def test_success_path(self):
# Searching on a path should work. # Searching on a path should work.
...@@ -144,14 +150,20 @@ class FindLoaderTests(unittest.TestCase): ...@@ -144,14 +150,20 @@ class FindLoaderTests(unittest.TestCase):
with util.uncache(name): with util.uncache(name):
with util.import_state(meta_path=[self.FakeMetaFinder]): with util.import_state(meta_path=[self.FakeMetaFinder]):
self.assertEqual((name, path), self.assertEqual((name, path),
importlib.find_loader(name, path)) self.init.find_loader(name, path))
def test_nothing(self): def test_nothing(self):
# None is returned upon failure to find a loader. # None is returned upon failure to find a loader.
self.assertIsNone(importlib.find_loader('nevergoingtofindthismodule')) self.assertIsNone(self.init.find_loader('nevergoingtofindthismodule'))
class Frozen_FindLoaderTests(FindLoaderTests, unittest.TestCase):
init = frozen_init
class ReloadTests(unittest.TestCase): class Source_FindLoaderTests(FindLoaderTests, unittest.TestCase):
init = source_init
class ReloadTests:
"""Test module reloading for builtin and extension modules.""" """Test module reloading for builtin and extension modules."""
...@@ -159,8 +171,8 @@ class ReloadTests(unittest.TestCase): ...@@ -159,8 +171,8 @@ class ReloadTests(unittest.TestCase):
for mod in ('tokenize', 'time', 'marshal'): for mod in ('tokenize', 'time', 'marshal'):
with self.subTest(module=mod): with self.subTest(module=mod):
with support.CleanImport(mod): with support.CleanImport(mod):
module = importlib.import_module(mod) module = self.init.import_module(mod)
importlib.reload(module) self.init.reload(module)
def test_module_replaced(self): def test_module_replaced(self):
def code(): def code():
...@@ -172,14 +184,20 @@ class ReloadTests(unittest.TestCase): ...@@ -172,14 +184,20 @@ class ReloadTests(unittest.TestCase):
module_code={'top_level': code}) module_code={'top_level': code})
with mock: with mock:
with util.import_state(meta_path=[mock]): with util.import_state(meta_path=[mock]):
module = importlib.import_module('top_level') module = self.init.import_module('top_level')
reloaded = importlib.reload(module) reloaded = self.init.reload(module)
actual = sys.modules['top_level'] actual = sys.modules['top_level']
self.assertEqual(actual.spam, 3) self.assertEqual(actual.spam, 3)
self.assertEqual(reloaded.spam, 3) self.assertEqual(reloaded.spam, 3)
class Frozen_ReloadTests(ReloadTests, unittest.TestCase):
init = frozen_init
class Source_ReloadTests(ReloadTests, unittest.TestCase):
init = source_init
class InvalidateCacheTests(unittest.TestCase):
class InvalidateCacheTests:
def test_method_called(self): def test_method_called(self):
# If defined the method should be called. # If defined the method should be called.
...@@ -198,7 +216,7 @@ class InvalidateCacheTests(unittest.TestCase): ...@@ -198,7 +216,7 @@ class InvalidateCacheTests(unittest.TestCase):
self.addCleanup(lambda: sys.path_importer_cache.__delitem__(key)) self.addCleanup(lambda: sys.path_importer_cache.__delitem__(key))
sys.path_importer_cache[key] = path_ins sys.path_importer_cache[key] = path_ins
self.addCleanup(lambda: sys.meta_path.remove(meta_ins)) self.addCleanup(lambda: sys.meta_path.remove(meta_ins))
importlib.invalidate_caches() self.init.invalidate_caches()
self.assertTrue(meta_ins.called) self.assertTrue(meta_ins.called)
self.assertTrue(path_ins.called) self.assertTrue(path_ins.called)
...@@ -207,19 +225,27 @@ class InvalidateCacheTests(unittest.TestCase): ...@@ -207,19 +225,27 @@ class InvalidateCacheTests(unittest.TestCase):
key = 'gobbledeegook' key = 'gobbledeegook'
sys.path_importer_cache[key] = None sys.path_importer_cache[key] = None
self.addCleanup(lambda: sys.path_importer_cache.__delitem__(key)) self.addCleanup(lambda: sys.path_importer_cache.__delitem__(key))
importlib.invalidate_caches() # Shouldn't trigger an exception. self.init.invalidate_caches() # Shouldn't trigger an exception.
class Frozen_InvalidateCacheTests(InvalidateCacheTests, unittest.TestCase):
init = frozen_init
class Source_InvalidateCacheTests(InvalidateCacheTests, unittest.TestCase):
init = source_init
class FrozenImportlibTests(unittest.TestCase): class FrozenImportlibTests(unittest.TestCase):
def test_no_frozen_importlib(self): def test_no_frozen_importlib(self):
# Should be able to import w/o _frozen_importlib being defined. # Should be able to import w/o _frozen_importlib being defined.
module = support.import_fresh_module('importlib', blocked=['_frozen_importlib']) # Can't do an isinstance() check since separate copies of importlib
self.assertFalse(isinstance(module.__loader__, # may have been used for import, so just check the name is not for the
machinery.FrozenImporter)) # frozen loader.
self.assertNotEqual(source_init.__loader__.__class__.__name__,
'FrozenImporter')
class StartupTests(unittest.TestCase): class StartupTests:
def test_everyone_has___loader__(self): def test_everyone_has___loader__(self):
# Issue #17098: all modules should have __loader__ defined. # Issue #17098: all modules should have __loader__ defined.
...@@ -227,11 +253,17 @@ class StartupTests(unittest.TestCase): ...@@ -227,11 +253,17 @@ class StartupTests(unittest.TestCase):
if isinstance(module, types.ModuleType): if isinstance(module, types.ModuleType):
self.assertTrue(hasattr(module, '__loader__'), self.assertTrue(hasattr(module, '__loader__'),
'{!r} lacks a __loader__ attribute'.format(name)) '{!r} lacks a __loader__ attribute'.format(name))
if importlib.machinery.BuiltinImporter.find_module(name): if self.machinery.BuiltinImporter.find_module(name):
self.assertIsNot(module.__loader__, None) self.assertIsNot(module.__loader__, None)
elif importlib.machinery.FrozenImporter.find_module(name): elif self.machinery.FrozenImporter.find_module(name):
self.assertIsNot(module.__loader__, None) self.assertIsNot(module.__loader__, None)
class Frozen_StartupTests(StartupTests, unittest.TestCase):
machinery = frozen_machinery
class Source_StartupTests(StartupTests, unittest.TestCase):
machinery = source_machinery
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment