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