ยปCore Development>Code coverage>Lib/importlib/test/test_api.py

Python code coverage for Lib/importlib/test/test_api.py

#countcontent
1n/afrom . import util
2n/aimport imp
3n/aimport importlib
4n/afrom importlib import machinery
5n/aimport sys
6n/afrom test import support
7n/aimport unittest
8n/a
9n/a
10n/aclass ImportModuleTests(unittest.TestCase):
11n/a
12n/a """Test importlib.import_module."""
13n/a
14n/a def test_module_import(self):
15n/a # Test importing a top-level module.
16n/a with util.mock_modules('top_level') as mock:
17n/a with util.import_state(meta_path=[mock]):
18n/a module = importlib.import_module('top_level')
19n/a self.assertEqual(module.__name__, 'top_level')
20n/a
21n/a def test_absolute_package_import(self):
22n/a # Test importing a module from a package with an absolute name.
23n/a pkg_name = 'pkg'
24n/a pkg_long_name = '{0}.__init__'.format(pkg_name)
25n/a name = '{0}.mod'.format(pkg_name)
26n/a with util.mock_modules(pkg_long_name, name) as mock:
27n/a with util.import_state(meta_path=[mock]):
28n/a module = importlib.import_module(name)
29n/a self.assertEqual(module.__name__, name)
30n/a
31n/a def test_shallow_relative_package_import(self):
32n/a # Test importing a module from a package through a relative import.
33n/a pkg_name = 'pkg'
34n/a pkg_long_name = '{0}.__init__'.format(pkg_name)
35n/a module_name = 'mod'
36n/a absolute_name = '{0}.{1}'.format(pkg_name, module_name)
37n/a relative_name = '.{0}'.format(module_name)
38n/a with util.mock_modules(pkg_long_name, absolute_name) as mock:
39n/a with util.import_state(meta_path=[mock]):
40n/a importlib.import_module(pkg_name)
41n/a module = importlib.import_module(relative_name, pkg_name)
42n/a self.assertEqual(module.__name__, absolute_name)
43n/a
44n/a def test_deep_relative_package_import(self):
45n/a modules = ['a.__init__', 'a.b.__init__', 'a.c']
46n/a with util.mock_modules(*modules) as mock:
47n/a with util.import_state(meta_path=[mock]):
48n/a importlib.import_module('a')
49n/a importlib.import_module('a.b')
50n/a module = importlib.import_module('..c', 'a.b')
51n/a self.assertEqual(module.__name__, 'a.c')
52n/a
53n/a def test_absolute_import_with_package(self):
54n/a # Test importing a module from a package with an absolute name with
55n/a # the 'package' argument given.
56n/a pkg_name = 'pkg'
57n/a pkg_long_name = '{0}.__init__'.format(pkg_name)
58n/a name = '{0}.mod'.format(pkg_name)
59n/a with util.mock_modules(pkg_long_name, name) as mock:
60n/a with util.import_state(meta_path=[mock]):
61n/a importlib.import_module(pkg_name)
62n/a module = importlib.import_module(name, pkg_name)
63n/a self.assertEqual(module.__name__, name)
64n/a
65n/a def test_relative_import_wo_package(self):
66n/a # Relative imports cannot happen without the 'package' argument being
67n/a # set.
68n/a with self.assertRaises(TypeError):
69n/a importlib.import_module('.support')
70n/a
71n/a
72n/a def test_loaded_once(self):
73n/a # Issue #13591: Modules should only be loaded once when
74n/a # initializing the parent package attempts to import the
75n/a # module currently being imported.
76n/a b_load_count = 0
77n/a def load_a():
78n/a importlib.import_module('a.b')
79n/a def load_b():
80n/a nonlocal b_load_count
81n/a b_load_count += 1
82n/a code = {'a': load_a, 'a.b': load_b}
83n/a modules = ['a.__init__', 'a.b']
84n/a with util.mock_modules(*modules, module_code=code) as mock:
85n/a with util.import_state(meta_path=[mock]):
86n/a importlib.import_module('a.b')
87n/a self.assertEqual(b_load_count, 1)
88n/a
89n/a
90n/aclass FindLoaderTests(unittest.TestCase):
91n/a
92n/a class FakeMetaFinder:
93n/a @staticmethod
94n/a def find_module(name, path=None): return name, path
95n/a
96n/a def test_sys_modules(self):
97n/a # If a module with __loader__ is in sys.modules, then return it.
98n/a name = 'some_mod'
99n/a with util.uncache(name):
100n/a module = imp.new_module(name)
101n/a loader = 'a loader!'
102n/a module.__loader__ = loader
103n/a sys.modules[name] = module
104n/a found = importlib.find_loader(name)
105n/a self.assertEqual(loader, found)
106n/a
107n/a def test_sys_modules_loader_is_None(self):
108n/a # If sys.modules[name].__loader__ is None, raise ValueError.
109n/a name = 'some_mod'
110n/a with util.uncache(name):
111n/a module = imp.new_module(name)
112n/a module.__loader__ = None
113n/a sys.modules[name] = module
114n/a with self.assertRaises(ValueError):
115n/a importlib.find_loader(name)
116n/a
117n/a def test_success(self):
118n/a # Return the loader found on sys.meta_path.
119n/a name = 'some_mod'
120n/a with util.uncache(name):
121n/a with util.import_state(meta_path=[self.FakeMetaFinder]):
122n/a self.assertEqual((name, None), importlib.find_loader(name))
123n/a
124n/a def test_success_path(self):
125n/a # Searching on a path should work.
126n/a name = 'some_mod'
127n/a path = 'path to some place'
128n/a with util.uncache(name):
129n/a with util.import_state(meta_path=[self.FakeMetaFinder]):
130n/a self.assertEqual((name, path),
131n/a importlib.find_loader(name, path))
132n/a
133n/a def test_nothing(self):
134n/a # None is returned upon failure to find a loader.
135n/a self.assertIsNone(importlib.find_loader('nevergoingtofindthismodule'))
136n/a
137n/a
138n/aclass InvalidateCacheTests(unittest.TestCase):
139n/a
140n/a def test_method_called(self):
141n/a # If defined the method should be called.
142n/a class InvalidatingNullFinder:
143n/a def __init__(self, *ignored):
144n/a self.called = False
145n/a def find_module(self, *args):
146n/a return None
147n/a def invalidate_caches(self):
148n/a self.called = True
149n/a
150n/a key = 'gobledeegook'
151n/a ins = InvalidatingNullFinder()
152n/a sys.path_importer_cache[key] = ins
153n/a self.addCleanup(lambda: sys.path_importer_cache.__delitem__(key))
154n/a importlib.invalidate_caches()
155n/a self.assertTrue(ins.called)
156n/a
157n/a def test_method_lacking(self):
158n/a # There should be no issues if the method is not defined.
159n/a key = 'gobbledeegook'
160n/a sys.path_importer_cache[key] = imp.NullImporter('abc')
161n/a self.addCleanup(lambda: sys.path_importer_cache.__delitem__(key))
162n/a importlib.invalidate_caches() # Shouldn't trigger an exception.
163n/a
164n/a
165n/aclass FrozenImportlibTests(unittest.TestCase):
166n/a
167n/a def test_no_frozen_importlib(self):
168n/a # Should be able to import w/o _frozen_importlib being defined.
169n/a module = support.import_fresh_module('importlib', blocked=['_frozen_importlib'])
170n/a self.assertFalse(isinstance(module.__loader__,
171n/a machinery.FrozenImporter))
172n/a
173n/a
174n/adef test_main():
175n/a from test.support import run_unittest
176n/a run_unittest(ImportModuleTests,
177n/a FindLoaderTests,
178n/a InvalidateCacheTests,
179n/a FrozenImportlibTests)
180n/a
181n/a
182n/aif __name__ == '__main__':
183n/a test_main()