1from .. import abc 2from .. import util 3 4machinery = util.import_importlib('importlib.machinery') 5 6import sys 7import types 8import unittest 9import warnings 10 11@unittest.skipIf(util.BUILTINS.good_name is None, 'no reasonable builtin module') 12class LoaderTests(abc.LoaderTests): 13 14 """Test load_module() for built-in modules.""" 15 16 def setUp(self): 17 self.verification = {'__name__': 'errno', '__package__': '', 18 '__loader__': self.machinery.BuiltinImporter} 19 20 def verify(self, module): 21 """Verify that the module matches against what it should have.""" 22 self.assertIsInstance(module, types.ModuleType) 23 for attr, value in self.verification.items(): 24 self.assertEqual(getattr(module, attr), value) 25 self.assertIn(module.__name__, sys.modules) 26 27 def load_module(self, name): 28 with warnings.catch_warnings(): 29 warnings.simplefilter("ignore", DeprecationWarning) 30 return self.machinery.BuiltinImporter.load_module(name) 31 32 def test_module(self): 33 # Common case. 34 with util.uncache(util.BUILTINS.good_name): 35 module = self.load_module(util.BUILTINS.good_name) 36 self.verify(module) 37 38 # Built-in modules cannot be a package. 39 test_package = test_lacking_parent = None 40 41 # No way to force an import failure. 42 test_state_after_failure = None 43 44 def test_module_reuse(self): 45 # Test that the same module is used in a reload. 46 with util.uncache(util.BUILTINS.good_name): 47 module1 = self.load_module(util.BUILTINS.good_name) 48 module2 = self.load_module(util.BUILTINS.good_name) 49 self.assertIs(module1, module2) 50 51 def test_unloadable(self): 52 name = 'dssdsdfff' 53 assert name not in sys.builtin_module_names 54 with self.assertRaises(ImportError) as cm: 55 self.load_module(name) 56 self.assertEqual(cm.exception.name, name) 57 58 def test_already_imported(self): 59 # Using the name of a module already imported but not a built-in should 60 # still fail. 61 module_name = 'builtin_reload_test' 62 assert module_name not in sys.builtin_module_names 63 with util.uncache(module_name): 64 module = types.ModuleType(module_name) 65 sys.modules[module_name] = module 66 with self.assertRaises(ImportError) as cm: 67 self.load_module(module_name) 68 self.assertEqual(cm.exception.name, module_name) 69 70 71(Frozen_LoaderTests, 72 Source_LoaderTests 73 ) = util.test_both(LoaderTests, machinery=machinery) 74 75 76@unittest.skipIf(util.BUILTINS.good_name is None, 'no reasonable builtin module') 77class InspectLoaderTests: 78 79 """Tests for InspectLoader methods for BuiltinImporter.""" 80 81 def test_get_code(self): 82 # There is no code object. 83 result = self.machinery.BuiltinImporter.get_code(util.BUILTINS.good_name) 84 self.assertIsNone(result) 85 86 def test_get_source(self): 87 # There is no source. 88 result = self.machinery.BuiltinImporter.get_source(util.BUILTINS.good_name) 89 self.assertIsNone(result) 90 91 def test_is_package(self): 92 # Cannot be a package. 93 result = self.machinery.BuiltinImporter.is_package(util.BUILTINS.good_name) 94 self.assertFalse(result) 95 96 @unittest.skipIf(util.BUILTINS.bad_name is None, 'all modules are built in') 97 def test_not_builtin(self): 98 # Modules not built-in should raise ImportError. 99 for meth_name in ('get_code', 'get_source', 'is_package'): 100 method = getattr(self.machinery.BuiltinImporter, meth_name) 101 with self.assertRaises(ImportError) as cm: 102 method(util.BUILTINS.bad_name) 103 104 105(Frozen_InspectLoaderTests, 106 Source_InspectLoaderTests 107 ) = util.test_both(InspectLoaderTests, machinery=machinery) 108 109 110if __name__ == '__main__': 111 unittest.main() 112