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