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

Python code coverage for Lib/test/test_importhooks.py

#countcontent
1n/aimport sys
2n/aimport imp
3n/aimport os
4n/aimport unittest
5n/afrom test import support
6n/a
7n/a
8n/atest_src = """\
9n/adef get_name():
10n/a return __name__
11n/adef get_file():
12n/a return __file__
13n/a"""
14n/a
15n/aabsimp = "import sub\n"
16n/arelimp = "from . import sub\n"
17n/adeeprelimp = "from .... import sub\n"
18n/afutimp = "from __future__ import absolute_import\n"
19n/a
20n/areload_src = test_src+"""\
21n/areloaded = True
22n/a"""
23n/a
24n/atest_co = compile(test_src, "<???>", "exec")
25n/areload_co = compile(reload_src, "<???>", "exec")
26n/a
27n/atest2_oldabs_co = compile(absimp + test_src, "<???>", "exec")
28n/atest2_newabs_co = compile(futimp + absimp + test_src, "<???>", "exec")
29n/atest2_newrel_co = compile(relimp + test_src, "<???>", "exec")
30n/atest2_deeprel_co = compile(deeprelimp + test_src, "<???>", "exec")
31n/atest2_futrel_co = compile(futimp + relimp + test_src, "<???>", "exec")
32n/a
33n/atest_path = "!!!_test_!!!"
34n/a
35n/a
36n/aclass TestImporter:
37n/a
38n/a modules = {
39n/a "hooktestmodule": (False, test_co),
40n/a "hooktestpackage": (True, test_co),
41n/a "hooktestpackage.sub": (True, test_co),
42n/a "hooktestpackage.sub.subber": (True, test_co),
43n/a "hooktestpackage.oldabs": (False, test2_oldabs_co),
44n/a "hooktestpackage.newabs": (False, test2_newabs_co),
45n/a "hooktestpackage.newrel": (False, test2_newrel_co),
46n/a "hooktestpackage.sub.subber.subest": (True, test2_deeprel_co),
47n/a "hooktestpackage.futrel": (False, test2_futrel_co),
48n/a "sub": (False, test_co),
49n/a "reloadmodule": (False, test_co),
50n/a }
51n/a
52n/a def __init__(self, path=test_path):
53n/a if path != test_path:
54n/a # if our class is on sys.path_hooks, we must raise
55n/a # ImportError for any path item that we can't handle.
56n/a raise ImportError
57n/a self.path = path
58n/a
59n/a def _get__path__(self):
60n/a raise NotImplementedError
61n/a
62n/a def find_module(self, fullname, path=None):
63n/a if fullname in self.modules:
64n/a return self
65n/a else:
66n/a return None
67n/a
68n/a def load_module(self, fullname):
69n/a ispkg, code = self.modules[fullname]
70n/a mod = sys.modules.setdefault(fullname,imp.new_module(fullname))
71n/a mod.__file__ = "<%s>" % self.__class__.__name__
72n/a mod.__loader__ = self
73n/a if ispkg:
74n/a mod.__path__ = self._get__path__()
75n/a exec(code, mod.__dict__)
76n/a return mod
77n/a
78n/a
79n/aclass MetaImporter(TestImporter):
80n/a def _get__path__(self):
81n/a return []
82n/a
83n/aclass PathImporter(TestImporter):
84n/a def _get__path__(self):
85n/a return [self.path]
86n/a
87n/a
88n/aclass ImportBlocker:
89n/a """Place an ImportBlocker instance on sys.meta_path and you
90n/a can be sure the modules you specified can't be imported, even
91n/a if it's a builtin."""
92n/a def __init__(self, *namestoblock):
93n/a self.namestoblock = dict.fromkeys(namestoblock)
94n/a def find_module(self, fullname, path=None):
95n/a if fullname in self.namestoblock:
96n/a return self
97n/a return None
98n/a def load_module(self, fullname):
99n/a raise ImportError("I dare you")
100n/a
101n/a
102n/aclass ImpWrapper:
103n/a
104n/a def __init__(self, path=None):
105n/a if path is not None and not os.path.isdir(path):
106n/a raise ImportError
107n/a self.path = path
108n/a
109n/a def find_module(self, fullname, path=None):
110n/a subname = fullname.split(".")[-1]
111n/a if subname != fullname and self.path is None:
112n/a return None
113n/a if self.path is None:
114n/a path = None
115n/a else:
116n/a path = [self.path]
117n/a try:
118n/a file, filename, stuff = imp.find_module(subname, path)
119n/a except ImportError:
120n/a return None
121n/a return ImpLoader(file, filename, stuff)
122n/a
123n/a
124n/aclass ImpLoader:
125n/a
126n/a def __init__(self, file, filename, stuff):
127n/a self.file = file
128n/a self.filename = filename
129n/a self.stuff = stuff
130n/a
131n/a def load_module(self, fullname):
132n/a mod = imp.load_module(fullname, self.file, self.filename, self.stuff)
133n/a if self.file:
134n/a self.file.close()
135n/a mod.__loader__ = self # for introspection
136n/a return mod
137n/a
138n/a
139n/aclass ImportHooksBaseTestCase(unittest.TestCase):
140n/a
141n/a def setUp(self):
142n/a self.path = sys.path[:]
143n/a self.meta_path = sys.meta_path[:]
144n/a self.path_hooks = sys.path_hooks[:]
145n/a sys.path_importer_cache.clear()
146n/a self.modules_before = support.modules_setup()
147n/a
148n/a def tearDown(self):
149n/a sys.path[:] = self.path
150n/a sys.meta_path[:] = self.meta_path
151n/a sys.path_hooks[:] = self.path_hooks
152n/a sys.path_importer_cache.clear()
153n/a support.modules_cleanup(*self.modules_before)
154n/a
155n/a
156n/aclass ImportHooksTestCase(ImportHooksBaseTestCase):
157n/a
158n/a def doTestImports(self, importer=None):
159n/a import hooktestmodule
160n/a import hooktestpackage
161n/a import hooktestpackage.sub
162n/a import hooktestpackage.sub.subber
163n/a self.assertEqual(hooktestmodule.get_name(),
164n/a "hooktestmodule")
165n/a self.assertEqual(hooktestpackage.get_name(),
166n/a "hooktestpackage")
167n/a self.assertEqual(hooktestpackage.sub.get_name(),
168n/a "hooktestpackage.sub")
169n/a self.assertEqual(hooktestpackage.sub.subber.get_name(),
170n/a "hooktestpackage.sub.subber")
171n/a if importer:
172n/a self.assertEqual(hooktestmodule.__loader__, importer)
173n/a self.assertEqual(hooktestpackage.__loader__, importer)
174n/a self.assertEqual(hooktestpackage.sub.__loader__, importer)
175n/a self.assertEqual(hooktestpackage.sub.subber.__loader__, importer)
176n/a
177n/a TestImporter.modules['reloadmodule'] = (False, test_co)
178n/a import reloadmodule
179n/a self.assertFalse(hasattr(reloadmodule,'reloaded'))
180n/a
181n/a import hooktestpackage.newrel
182n/a self.assertEqual(hooktestpackage.newrel.get_name(),
183n/a "hooktestpackage.newrel")
184n/a self.assertEqual(hooktestpackage.newrel.sub,
185n/a hooktestpackage.sub)
186n/a
187n/a import hooktestpackage.sub.subber.subest as subest
188n/a self.assertEqual(subest.get_name(),
189n/a "hooktestpackage.sub.subber.subest")
190n/a self.assertEqual(subest.sub,
191n/a hooktestpackage.sub)
192n/a
193n/a import hooktestpackage.futrel
194n/a self.assertEqual(hooktestpackage.futrel.get_name(),
195n/a "hooktestpackage.futrel")
196n/a self.assertEqual(hooktestpackage.futrel.sub,
197n/a hooktestpackage.sub)
198n/a
199n/a import sub
200n/a self.assertEqual(sub.get_name(), "sub")
201n/a
202n/a import hooktestpackage.oldabs
203n/a self.assertEqual(hooktestpackage.oldabs.get_name(),
204n/a "hooktestpackage.oldabs")
205n/a self.assertEqual(hooktestpackage.oldabs.sub, sub)
206n/a
207n/a import hooktestpackage.newabs
208n/a self.assertEqual(hooktestpackage.newabs.get_name(),
209n/a "hooktestpackage.newabs")
210n/a self.assertEqual(hooktestpackage.newabs.sub, sub)
211n/a
212n/a def testMetaPath(self):
213n/a i = MetaImporter()
214n/a sys.meta_path.append(i)
215n/a self.doTestImports(i)
216n/a
217n/a def testPathHook(self):
218n/a sys.path_hooks.insert(0, PathImporter)
219n/a sys.path.append(test_path)
220n/a self.doTestImports()
221n/a
222n/a def testBlocker(self):
223n/a mname = "exceptions" # an arbitrary harmless builtin module
224n/a support.unload(mname)
225n/a sys.meta_path.append(ImportBlocker(mname))
226n/a self.assertRaises(ImportError, __import__, mname)
227n/a
228n/a def testImpWrapper(self):
229n/a i = ImpWrapper()
230n/a sys.meta_path.append(i)
231n/a sys.path_hooks.insert(0, ImpWrapper)
232n/a mnames = (
233n/a "colorsys", "urllib.parse", "distutils.core", "sys",
234n/a )
235n/a for mname in mnames:
236n/a parent = mname.split(".")[0]
237n/a for n in list(sys.modules):
238n/a if n.startswith(parent):
239n/a del sys.modules[n]
240n/a for mname in mnames:
241n/a m = __import__(mname, globals(), locals(), ["__dummy__"])
242n/a # to make sure we actually handled the import
243n/a self.assertTrue(hasattr(m, "__loader__"))
244n/a
245n/a
246n/adef test_main():
247n/a support.run_unittest(ImportHooksTestCase)
248n/a
249n/aif __name__ == "__main__":
250n/a test_main()