| 
									
										
										
										
											2009-01-18 00:24:28 +00:00
										 |  |  | """Test that sys.modules is used properly by import.""" | 
					
						
							| 
									
										
										
										
											2009-02-01 04:00:05 +00:00
										 |  |  | from .. import util | 
					
						
							| 
									
										
										
										
											2009-02-01 04:28:04 +00:00
										 |  |  | from . import util as import_util | 
					
						
							| 
									
										
										
										
											2009-01-18 00:24:28 +00:00
										 |  |  | import sys | 
					
						
							|  |  |  | from types import MethodType | 
					
						
							|  |  |  | import unittest | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class UseCache(unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     """When it comes to sys.modules, import prefers it over anything else.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Once a name has been resolved, sys.modules is checked to see if it contains | 
					
						
							|  |  |  |     the module desired. If so, then it is returned [use cache]. If it is not | 
					
						
							|  |  |  |     found, then the proper steps are taken to perform the import, but | 
					
						
							|  |  |  |     sys.modules is still used to return the imported module (e.g., not what a | 
					
						
							|  |  |  |     loader returns) [from cache on return]. This also applies to imports of | 
					
						
							|  |  |  |     things contained within a package and thus get assigned as an attribute | 
					
						
							|  |  |  |     [from cache to attribute] or pulled in thanks to a fromlist import | 
					
						
							| 
									
										
										
										
											2009-08-30 03:47:36 +00:00
										 |  |  |     [from cache for fromlist]. But if sys.modules contains None then | 
					
						
							|  |  |  |     ImportError is raised [None in cache]. | 
					
						
							| 
									
										
										
										
											2009-01-18 00:24:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     def test_using_cache(self): | 
					
						
							|  |  |  |         # [use cache] | 
					
						
							|  |  |  |         module_to_use = "some module found!" | 
					
						
							| 
									
										
										
										
											2009-08-30 03:47:36 +00:00
										 |  |  |         with util.uncache(module_to_use): | 
					
						
							|  |  |  |             sys.modules['some_module'] = module_to_use | 
					
						
							|  |  |  |             module = import_util.import_('some_module') | 
					
						
							|  |  |  |             self.assertEqual(id(module_to_use), id(module)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_None_in_cache(self): | 
					
						
							|  |  |  |         #[None in cache] | 
					
						
							|  |  |  |         name = 'using_None' | 
					
						
							|  |  |  |         with util.uncache(name): | 
					
						
							|  |  |  |             sys.modules[name] = None | 
					
						
							|  |  |  |             with self.assertRaises(ImportError): | 
					
						
							|  |  |  |                 import_util.import_(name) | 
					
						
							| 
									
										
										
										
											2009-01-18 00:24:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def create_mock(self, *names, return_=None): | 
					
						
							| 
									
										
										
										
											2009-02-01 04:00:05 +00:00
										 |  |  |         mock = util.mock_modules(*names) | 
					
						
							| 
									
										
										
										
											2009-01-18 00:24:28 +00:00
										 |  |  |         original_load = mock.load_module | 
					
						
							|  |  |  |         def load_module(self, fullname): | 
					
						
							|  |  |  |             original_load(fullname) | 
					
						
							|  |  |  |             return return_ | 
					
						
							|  |  |  |         mock.load_module = MethodType(load_module, mock) | 
					
						
							|  |  |  |         return mock | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # __import__ inconsistent between loaders and built-in import when it comes | 
					
						
							|  |  |  |     #   to when to use the module in sys.modules and when not to. | 
					
						
							| 
									
										
										
										
											2009-02-01 04:28:04 +00:00
										 |  |  |     @import_util.importlib_only | 
					
						
							| 
									
										
										
										
											2009-01-18 00:24:28 +00:00
										 |  |  |     def test_using_cache_after_loader(self): | 
					
						
							|  |  |  |         # [from cache on return] | 
					
						
							|  |  |  |         with self.create_mock('module') as mock: | 
					
						
							| 
									
										
										
										
											2009-02-01 04:00:05 +00:00
										 |  |  |             with util.import_state(meta_path=[mock]): | 
					
						
							| 
									
										
										
										
											2009-02-01 04:28:04 +00:00
										 |  |  |                 module = import_util.import_('module') | 
					
						
							| 
									
										
										
										
											2010-11-20 19:04:17 +00:00
										 |  |  |                 self.assertEqual(id(module), id(sys.modules['module'])) | 
					
						
							| 
									
										
										
										
											2009-01-18 00:24:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # See test_using_cache_after_loader() for reasoning. | 
					
						
							| 
									
										
										
										
											2009-02-01 04:28:04 +00:00
										 |  |  |     @import_util.importlib_only | 
					
						
							| 
									
										
										
										
											2009-01-18 00:24:28 +00:00
										 |  |  |     def test_using_cache_for_assigning_to_attribute(self): | 
					
						
							|  |  |  |         # [from cache to attribute] | 
					
						
							|  |  |  |         with self.create_mock('pkg.__init__', 'pkg.module') as importer: | 
					
						
							| 
									
										
										
										
											2009-02-01 04:00:05 +00:00
										 |  |  |             with util.import_state(meta_path=[importer]): | 
					
						
							| 
									
										
										
										
											2009-02-01 04:28:04 +00:00
										 |  |  |                 module = import_util.import_('pkg.module') | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |                 self.assertTrue(hasattr(module, 'module')) | 
					
						
							|  |  |  |                 self.assertTrue(id(module.module), id(sys.modules['pkg.module'])) | 
					
						
							| 
									
										
										
										
											2009-01-18 00:24:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # See test_using_cache_after_loader() for reasoning. | 
					
						
							| 
									
										
										
										
											2009-02-01 04:28:04 +00:00
										 |  |  |     @import_util.importlib_only | 
					
						
							| 
									
										
										
										
											2009-01-18 00:24:28 +00:00
										 |  |  |     def test_using_cache_for_fromlist(self): | 
					
						
							|  |  |  |         # [from cache for fromlist] | 
					
						
							|  |  |  |         with self.create_mock('pkg.__init__', 'pkg.module') as importer: | 
					
						
							| 
									
										
										
										
											2009-02-01 04:00:05 +00:00
										 |  |  |             with util.import_state(meta_path=[importer]): | 
					
						
							| 
									
										
										
										
											2009-02-01 04:28:04 +00:00
										 |  |  |                 module = import_util.import_('pkg', fromlist=['module']) | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |                 self.assertTrue(hasattr(module, 'module')) | 
					
						
							| 
									
										
										
										
											2010-11-20 19:04:17 +00:00
										 |  |  |                 self.assertEqual(id(module.module), | 
					
						
							|  |  |  |                                  id(sys.modules['pkg.module'])) | 
					
						
							| 
									
										
										
										
											2009-01-18 00:24:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_main(): | 
					
						
							|  |  |  |     from test.support import run_unittest | 
					
						
							|  |  |  |     run_unittest(UseCache) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     test_main() |