test_imp.py revision 047b7ae56628717160eb75e379e2bfdaa59dfc18
1142685337f2eab63ac85d2e9a284a5eb900cd053Brett Cannontry: 2142685337f2eab63ac85d2e9a284a5eb900cd053Brett Cannon import _thread 3142685337f2eab63ac85d2e9a284a5eb900cd053Brett Cannonexcept ImportError: 4142685337f2eab63ac85d2e9a284a5eb900cd053Brett Cannon _thread = None 5c049952de76cbcd00e490e48445ed7a50d3dc83aBrett Cannonimport importlib 60ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossumimport os 70ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossumimport os.path 828a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsawimport shutil 98a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannonimport sys 10ee8712cda46338d223509cc5751fd36509ad3860Benjamin Petersonfrom test import support 11c049952de76cbcd00e490e48445ed7a50d3dc83aBrett Cannonimport unittest 12c049952de76cbcd00e490e48445ed7a50d3dc83aBrett Cannonimport warnings 13e4f41deccf94ccc798b1eb1f44657ade66669a60Brett Cannonwith warnings.catch_warnings(): 14e4f41deccf94ccc798b1eb1f44657ade66669a60Brett Cannon warnings.simplefilter('ignore', PendingDeprecationWarning) 15e4f41deccf94ccc798b1eb1f44657ade66669a60Brett Cannon import imp 162294c0d4ecd81d01ddf741fff02cc04bd8de0638Neal Norwitz 17130e48199a28239c0574f233c6e20fbe6a41d1cdBrett Cannon 18130e48199a28239c0574f233c6e20fbe6a41d1cdBrett Cannondef requires_load_dynamic(meth): 19130e48199a28239c0574f233c6e20fbe6a41d1cdBrett Cannon """Decorator to skip a test if not running under CPython or lacking 20130e48199a28239c0574f233c6e20fbe6a41d1cdBrett Cannon imp.load_dynamic().""" 21130e48199a28239c0574f233c6e20fbe6a41d1cdBrett Cannon meth = support.cpython_only(meth) 22130e48199a28239c0574f233c6e20fbe6a41d1cdBrett Cannon return unittest.skipIf(not hasattr(imp, 'load_dynamic'), 23130e48199a28239c0574f233c6e20fbe6a41d1cdBrett Cannon 'imp.load_dynamic() required')(meth) 24130e48199a28239c0574f233c6e20fbe6a41d1cdBrett Cannon 25130e48199a28239c0574f233c6e20fbe6a41d1cdBrett Cannon 26142685337f2eab63ac85d2e9a284a5eb900cd053Brett Cannon@unittest.skipIf(_thread is None, '_thread module is required') 2789f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Woutersclass LockTests(unittest.TestCase): 28579bed7300816590eca2855aa3c971d2ee38d6beTim Peters 2989f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters """Very basic test of import lock functions.""" 30579bed7300816590eca2855aa3c971d2ee38d6beTim Peters 3189f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters def verify_lock_state(self, expected): 32c9c0f201fed21efcf669dbbf5f923eaf0eeb1db9Benjamin Peterson self.assertEqual(imp.lock_held(), expected, 3389f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters "expected imp.lock_held() to be %r" % expected) 3489f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters def testLock(self): 3589f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters LOOPS = 50 362294c0d4ecd81d01ddf741fff02cc04bd8de0638Neal Norwitz 3789f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters # The import lock may already be held, e.g. if the test suite is run 3889f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters # via "import test.autotest". 3989f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters lock_held_at_start = imp.lock_held() 4089f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters self.verify_lock_state(lock_held_at_start) 41579bed7300816590eca2855aa3c971d2ee38d6beTim Peters 4289f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters for i in range(LOOPS): 4389f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters imp.acquire_lock() 4489f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters self.verify_lock_state(True) 45579bed7300816590eca2855aa3c971d2ee38d6beTim Peters 4689f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters for i in range(LOOPS): 47579bed7300816590eca2855aa3c971d2ee38d6beTim Peters imp.release_lock() 4889f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters 4989f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters # The original state should be restored now. 5089f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters self.verify_lock_state(lock_held_at_start) 5189f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters 5289f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters if not lock_held_at_start: 5389f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters try: 5489f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters imp.release_lock() 5589f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters except RuntimeError: 5689f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters pass 5789f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters else: 5889f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters self.fail("release_lock() without lock should raise " 5989f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters "RuntimeError") 602294c0d4ecd81d01ddf741fff02cc04bd8de0638Neal Norwitz 61ce3a72aec6eaa0293c397c8d0407f7afe0072b2fGuido van Rossumclass ImportTests(unittest.TestCase): 62e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolsky def setUp(self): 63e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolsky mod = importlib.import_module('test.encoded_modules') 64e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolsky self.test_strings = mod.test_strings 65e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolsky self.test_path = mod.__path__ 66e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolsky 67e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolsky def test_import_encoded_module(self): 68e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolsky for modname, encoding, teststr in self.test_strings: 69e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolsky mod = importlib.import_module('test.encoded_modules.' 70e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolsky 'module_' + modname) 71e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolsky self.assertEqual(teststr, mod.test) 72ce3a72aec6eaa0293c397c8d0407f7afe0072b2fGuido van Rossum 73ce3a72aec6eaa0293c397c8d0407f7afe0072b2fGuido van Rossum def test_find_module_encoding(self): 74e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolsky for mod, encoding, _ in self.test_strings: 75749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon with imp.find_module('module_' + mod, self.test_path)[0] as fd: 76749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertEqual(fd.encoding, encoding) 77ce3a72aec6eaa0293c397c8d0407f7afe0072b2fGuido van Rossum 78fe7c5b5bdf7c21551b56be563fc604f2d4d3c756Victor Stinner path = [os.path.dirname(__file__)] 79dd9a56953e561076b5573d53f6e4fdd7f42b208cBrett Cannon with self.assertRaises(SyntaxError): 80dd9a56953e561076b5573d53f6e4fdd7f42b208cBrett Cannon imp.find_module('badsyntax_pep3120', path) 81fe7c5b5bdf7c21551b56be563fc604f2d4d3c756Victor Stinner 8240d20bcf1fccfe8af2393f1aec88ba18e38d0bc1Guido van Rossum def test_issue1267(self): 83e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolsky for mod, encoding, _ in self.test_strings: 84e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolsky fp, filename, info = imp.find_module('module_' + mod, 85e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolsky self.test_path) 86749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon with fp: 87749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertNotEqual(fp, None) 88749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertEqual(fp.encoding, encoding) 89749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertEqual(fp.tell(), 0) 90749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertEqual(fp.readline(), '# test %s encoding\n' 91749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon % encoding) 9240d20bcf1fccfe8af2393f1aec88ba18e38d0bc1Guido van Rossum 9340d20bcf1fccfe8af2393f1aec88ba18e38d0bc1Guido van Rossum fp, filename, info = imp.find_module("tokenize") 94749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon with fp: 95749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertNotEqual(fp, None) 96749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertEqual(fp.encoding, "utf-8") 97749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertEqual(fp.tell(), 0) 98749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertEqual(fp.readline(), 99749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon '"""Tokenization help for Python programs.\n') 10040d20bcf1fccfe8af2393f1aec88ba18e38d0bc1Guido van Rossum 1018a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannon def test_issue3594(self): 1028a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannon temp_mod_name = 'test_imp_helper' 1038a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannon sys.path.insert(0, '.') 1048a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannon try: 1058a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannon with open(temp_mod_name + '.py', 'w') as file: 1068a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannon file.write("# coding: cp1252\nu = 'test.test_imp'\n") 1078a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannon file, filename, info = imp.find_module(temp_mod_name) 1088a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannon file.close() 109b3aedd48621ed9d33b5f42f946b256bce4a50673Ezio Melotti self.assertEqual(file.encoding, 'cp1252') 1108a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannon finally: 1118a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannon del sys.path[0] 1128a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannon support.unlink(temp_mod_name + '.py') 1138a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannon support.unlink(temp_mod_name + '.pyc') 1148a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannon support.unlink(temp_mod_name + '.pyo') 1158a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannon 1160ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum def test_issue5604(self): 1170ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum # Test cannot cover imp.load_compiled function. 1180ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum # Martin von Loewis note what shared library cannot have non-ascii 1190ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum # character because init_xxx function cannot be compiled 1200ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum # and issue never happens for dynamic modules. 1210ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum # But sources modified to follow generic way for processing pathes. 1220ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum 123435b5318732b3fa8e5a0dd82d3538aa6bc045d8eEzio Melotti # the return encoding could be uppercase or None 124435b5318732b3fa8e5a0dd82d3538aa6bc045d8eEzio Melotti fs_encoding = sys.getfilesystemencoding() 1250ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum 1260ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum # covers utf-8 and Windows ANSI code pages 1270ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum # one non-space symbol from every page 1280ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum # (http://en.wikipedia.org/wiki/Code_page) 1290ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum known_locales = { 1309a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti 'utf-8' : b'\xc3\xa4', 1310ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum 'cp1250' : b'\x8C', 1320ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum 'cp1251' : b'\xc0', 1330ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum 'cp1252' : b'\xc0', 1340ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum 'cp1253' : b'\xc1', 1350ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum 'cp1254' : b'\xc0', 1360ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum 'cp1255' : b'\xe0', 1370ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum 'cp1256' : b'\xe0', 1380ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum 'cp1257' : b'\xc0', 1390ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum 'cp1258' : b'\xc0', 1400ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum } 1410ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum 14221164ce8f1f1c45fa1305fee4851b19405c19a67Florent Xicluna if sys.platform == 'darwin': 14321164ce8f1f1c45fa1305fee4851b19405c19a67Florent Xicluna self.assertEqual(fs_encoding, 'utf-8') 14421164ce8f1f1c45fa1305fee4851b19405c19a67Florent Xicluna # Mac OS X uses the Normal Form D decomposition 14521164ce8f1f1c45fa1305fee4851b19405c19a67Florent Xicluna # http://developer.apple.com/mac/library/qa/qa2001/qa1173.html 14621164ce8f1f1c45fa1305fee4851b19405c19a67Florent Xicluna special_char = b'a\xcc\x88' 14721164ce8f1f1c45fa1305fee4851b19405c19a67Florent Xicluna else: 14821164ce8f1f1c45fa1305fee4851b19405c19a67Florent Xicluna special_char = known_locales.get(fs_encoding) 14921164ce8f1f1c45fa1305fee4851b19405c19a67Florent Xicluna 1509a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti if not special_char: 15176e0d1a6efac2efbb6b9de739d43be827e7ea8ecEzio Melotti self.skipTest("can't run this test with %s as filesystem encoding" 15276e0d1a6efac2efbb6b9de739d43be827e7ea8ecEzio Melotti % fs_encoding) 15376e0d1a6efac2efbb6b9de739d43be827e7ea8ecEzio Melotti decoded_char = special_char.decode(fs_encoding) 1549a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti temp_mod_name = 'test_imp_helper_' + decoded_char 1559a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti test_package_name = 'test_imp_helper_package_' + decoded_char 1569a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti init_file_name = os.path.join(test_package_name, '__init__.py') 1579a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti try: 15841a6b04b1fb5dc58b07abd60598a2932a7b0649cEzio Melotti # if the curdir is not in sys.path the test fails when run with 15941a6b04b1fb5dc58b07abd60598a2932a7b0649cEzio Melotti # ./python ./Lib/test/regrtest.py test_imp 16041a6b04b1fb5dc58b07abd60598a2932a7b0649cEzio Melotti sys.path.insert(0, os.curdir) 1619a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti with open(temp_mod_name + '.py', 'w') as file: 1629a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti file.write('a = 1\n') 1639a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti file, filename, info = imp.find_module(temp_mod_name) 164749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon with file: 165749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertIsNotNone(file) 166749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertTrue(filename[:-3].endswith(temp_mod_name)) 167749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertEqual(info[0], '.py') 1686787a3806ee6a85a6f21ede70c10e15a6df267c4Serhiy Storchaka self.assertEqual(info[1], 'r') 169749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertEqual(info[2], imp.PY_SOURCE) 170749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon 171749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon mod = imp.load_module(temp_mod_name, file, filename, info) 172749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertEqual(mod.a, 1) 1739a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti 174c049952de76cbcd00e490e48445ed7a50d3dc83aBrett Cannon with warnings.catch_warnings(): 175c049952de76cbcd00e490e48445ed7a50d3dc83aBrett Cannon warnings.simplefilter('ignore') 176c049952de76cbcd00e490e48445ed7a50d3dc83aBrett Cannon mod = imp.load_source(temp_mod_name, temp_mod_name + '.py') 177435b5318732b3fa8e5a0dd82d3538aa6bc045d8eEzio Melotti self.assertEqual(mod.a, 1) 1789a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti 179c049952de76cbcd00e490e48445ed7a50d3dc83aBrett Cannon with warnings.catch_warnings(): 180c049952de76cbcd00e490e48445ed7a50d3dc83aBrett Cannon warnings.simplefilter('ignore') 181e5e7a7cbf450f80fa9a88038878b6bd525313f37Ezio Melotti if not sys.dont_write_bytecode: 182e5e7a7cbf450f80fa9a88038878b6bd525313f37Ezio Melotti mod = imp.load_compiled( 183e5e7a7cbf450f80fa9a88038878b6bd525313f37Ezio Melotti temp_mod_name, 184e5e7a7cbf450f80fa9a88038878b6bd525313f37Ezio Melotti imp.cache_from_source(temp_mod_name + '.py')) 185435b5318732b3fa8e5a0dd82d3538aa6bc045d8eEzio Melotti self.assertEqual(mod.a, 1) 1869a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti 1879a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti if not os.path.exists(test_package_name): 1889a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti os.mkdir(test_package_name) 1899a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti with open(init_file_name, 'w') as file: 1909a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti file.write('b = 2\n') 191c049952de76cbcd00e490e48445ed7a50d3dc83aBrett Cannon with warnings.catch_warnings(): 192c049952de76cbcd00e490e48445ed7a50d3dc83aBrett Cannon warnings.simplefilter('ignore') 193c049952de76cbcd00e490e48445ed7a50d3dc83aBrett Cannon package = imp.load_package(test_package_name, test_package_name) 194435b5318732b3fa8e5a0dd82d3538aa6bc045d8eEzio Melotti self.assertEqual(package.b, 2) 1959a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti finally: 19641a6b04b1fb5dc58b07abd60598a2932a7b0649cEzio Melotti del sys.path[0] 197435b5318732b3fa8e5a0dd82d3538aa6bc045d8eEzio Melotti for ext in ('.py', '.pyc', '.pyo'): 198435b5318732b3fa8e5a0dd82d3538aa6bc045d8eEzio Melotti support.unlink(temp_mod_name + ext) 199435b5318732b3fa8e5a0dd82d3538aa6bc045d8eEzio Melotti support.unlink(init_file_name + ext) 2009a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti support.rmtree(test_package_name) 201047b7ae56628717160eb75e379e2bfdaa59dfc18Victor Stinner support.rmtree('__pycache__') 2020ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum 203c68b6aaec8b08caf682ebb7c95f94ddf49a6b66cVictor Stinner def test_issue9319(self): 20411846905d33d696f14a4ae26383104feacdc0f17Antoine Pitrou path = os.path.dirname(__file__) 2057fdd0fe48f3f342273c1d396df142b1d4b9a1a5cVictor Stinner self.assertRaises(SyntaxError, 20611846905d33d696f14a4ae26383104feacdc0f17Antoine Pitrou imp.find_module, "badsyntax_pep3120", [path]) 207c68b6aaec8b08caf682ebb7c95f94ddf49a6b66cVictor Stinner 20891b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan def test_load_from_source(self): 20991b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan # Verify that the imp module can correctly load and find .py files 21091b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan # XXX (ncoghlan): It would be nice to use support.CleanImport 21191b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan # here, but that breaks because the os module registers some 21291b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan # handlers in copy_reg on import. Since CleanImport doesn't 21391b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan # revert that registration, the module is left in a broken 21491b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan # state after reversion. Reinitialising the module contents 21591b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan # and just reverting os.environ to its previous state is an OK 21691b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan # workaround 21791b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan orig_path = os.path 21891b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan orig_getenv = os.getenv 21991b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan with support.EnvironmentVarGuard(): 22091b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan x = imp.find_module("os") 22191b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan self.addCleanup(x[0].close) 22291b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan new_os = imp.load_module("os", *x) 22391b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan self.assertIs(os, new_os) 22491b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan self.assertIs(orig_path, new_os.path) 22591b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan self.assertIsNot(orig_getenv, new_os.getenv) 22691b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan 227130e48199a28239c0574f233c6e20fbe6a41d1cdBrett Cannon @requires_load_dynamic 22891b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan def test_issue15828_load_extensions(self): 22991b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan # Issue 15828 picked up that the adapter between the old imp API 23091b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan # and importlib couldn't handle C extensions 23191b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan example = "_heapq" 23291b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan x = imp.find_module(example) 233848cdfdf97f3671f75aa98438f228e36e7d0a310Brett Cannon file_ = x[0] 234848cdfdf97f3671f75aa98438f228e36e7d0a310Brett Cannon if file_ is not None: 235848cdfdf97f3671f75aa98438f228e36e7d0a310Brett Cannon self.addCleanup(file_.close) 23691b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan mod = imp.load_module(example, *x) 23791b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan self.assertEqual(mod.__name__, example) 23891b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan 239130e48199a28239c0574f233c6e20fbe6a41d1cdBrett Cannon @requires_load_dynamic 2406b2cbeba58aeb0755bdefd02fb51a80ec66d6144Andrew Svetlov def test_issue16421_multiple_modules_in_one_dll(self): 2416b2cbeba58aeb0755bdefd02fb51a80ec66d6144Andrew Svetlov # Issue 16421: loading several modules from the same compiled file fails 2426b2cbeba58aeb0755bdefd02fb51a80ec66d6144Andrew Svetlov m = '_testimportmultiple' 2436b2cbeba58aeb0755bdefd02fb51a80ec66d6144Andrew Svetlov fileobj, pathname, description = imp.find_module(m) 2446b2cbeba58aeb0755bdefd02fb51a80ec66d6144Andrew Svetlov fileobj.close() 2456b2cbeba58aeb0755bdefd02fb51a80ec66d6144Andrew Svetlov mod0 = imp.load_dynamic(m, pathname) 246ef9a43b2c97d91ab3343372d3e310136938ee505Andrew Svetlov mod1 = imp.load_dynamic('_testimportmultiple_foo', pathname) 247ef9a43b2c97d91ab3343372d3e310136938ee505Andrew Svetlov mod2 = imp.load_dynamic('_testimportmultiple_bar', pathname) 2486b2cbeba58aeb0755bdefd02fb51a80ec66d6144Andrew Svetlov self.assertEqual(mod0.__name__, m) 249ef9a43b2c97d91ab3343372d3e310136938ee505Andrew Svetlov self.assertEqual(mod1.__name__, '_testimportmultiple_foo') 250ef9a43b2c97d91ab3343372d3e310136938ee505Andrew Svetlov self.assertEqual(mod2.__name__, '_testimportmultiple_bar') 2516b2cbeba58aeb0755bdefd02fb51a80ec66d6144Andrew Svetlov with self.assertRaises(ImportError): 2526b2cbeba58aeb0755bdefd02fb51a80ec66d6144Andrew Svetlov imp.load_dynamic('nonexistent', pathname) 2536b2cbeba58aeb0755bdefd02fb51a80ec66d6144Andrew Svetlov 254130e48199a28239c0574f233c6e20fbe6a41d1cdBrett Cannon @requires_load_dynamic 255f0434e647aa3e7b82a740be4a820aec951a885acBrett Cannon def test_load_dynamic_ImportError_path(self): 256f0434e647aa3e7b82a740be4a820aec951a885acBrett Cannon # Issue #1559549 added `name` and `path` attributes to ImportError 257f0434e647aa3e7b82a740be4a820aec951a885acBrett Cannon # in order to provide better detail. Issue #10854 implemented those 258f0434e647aa3e7b82a740be4a820aec951a885acBrett Cannon # attributes on import failures of extensions on Windows. 259f0434e647aa3e7b82a740be4a820aec951a885acBrett Cannon path = 'bogus file path' 260f0434e647aa3e7b82a740be4a820aec951a885acBrett Cannon name = 'extension' 261f0434e647aa3e7b82a740be4a820aec951a885acBrett Cannon with self.assertRaises(ImportError) as err: 262f0434e647aa3e7b82a740be4a820aec951a885acBrett Cannon imp.load_dynamic(name, path) 263f0434e647aa3e7b82a740be4a820aec951a885acBrett Cannon self.assertIn(path, err.exception.path) 264f0434e647aa3e7b82a740be4a820aec951a885acBrett Cannon self.assertEqual(name, err.exception.name) 265f0434e647aa3e7b82a740be4a820aec951a885acBrett Cannon 266130e48199a28239c0574f233c6e20fbe6a41d1cdBrett Cannon @requires_load_dynamic 2679d0f772c5115217d55aef76fae33f483f2a98032Brett Cannon def test_load_module_extension_file_is_None(self): 2689d0f772c5115217d55aef76fae33f483f2a98032Brett Cannon # When loading an extension module and the file is None, open one 2699d0f772c5115217d55aef76fae33f483f2a98032Brett Cannon # on the behalf of imp.load_dynamic(). 2709d0f772c5115217d55aef76fae33f483f2a98032Brett Cannon # Issue #15902 2718772b18bc4eeff5475b998ae74c21df56fb234a2Brett Cannon name = '_testimportmultiple' 2729d0f772c5115217d55aef76fae33f483f2a98032Brett Cannon found = imp.find_module(name) 273aa6f688bd4f02b5d50c26cf649172672c1546d12Benjamin Peterson if found[0] is not None: 274aa6f688bd4f02b5d50c26cf649172672c1546d12Benjamin Peterson found[0].close() 2758772b18bc4eeff5475b998ae74c21df56fb234a2Brett Cannon if found[2][2] != imp.C_EXTENSION: 2769fe6d86709b0e769602ff55a6e5a202c440b9d8aZachary Ware self.skipTest("found module doesn't appear to be a C extension") 2779d0f772c5115217d55aef76fae33f483f2a98032Brett Cannon imp.load_module(name, None, *found[1:]) 2789d0f772c5115217d55aef76fae33f483f2a98032Brett Cannon 279997487d5d760a04bc6f5bcb8c881795ddd87e62bBrett Cannon @unittest.skipIf(sys.dont_write_bytecode, 280997487d5d760a04bc6f5bcb8c881795ddd87e62bBrett Cannon "test meaningful only when writing bytecode") 281997487d5d760a04bc6f5bcb8c881795ddd87e62bBrett Cannon def test_bug7732(self): 282bb2c45e7a4101d106bf776cf7217d2f1531e8002Antoine Pitrou with support.temp_cwd(): 283bb2c45e7a4101d106bf776cf7217d2f1531e8002Antoine Pitrou source = support.TESTFN + '.py' 284bb2c45e7a4101d106bf776cf7217d2f1531e8002Antoine Pitrou os.mkdir(source) 285997487d5d760a04bc6f5bcb8c881795ddd87e62bBrett Cannon self.assertRaisesRegex(ImportError, '^No module', 286997487d5d760a04bc6f5bcb8c881795ddd87e62bBrett Cannon imp.find_module, support.TESTFN, ["."]) 287330cc52c99037eaabe0fcfa09f9b099743b0b913Brett Cannon 288a4975a911d17d8baa96570794fa6db19c0676a2aBrett Cannon def test_multiple_calls_to_get_data(self): 289a4975a911d17d8baa96570794fa6db19c0676a2aBrett Cannon # Issue #18755: make sure multiple calls to get_data() can succeed. 290a4975a911d17d8baa96570794fa6db19c0676a2aBrett Cannon loader = imp._LoadSourceCompatibility('imp', imp.__file__, 291a4975a911d17d8baa96570794fa6db19c0676a2aBrett Cannon open(imp.__file__)) 292a4975a911d17d8baa96570794fa6db19c0676a2aBrett Cannon loader.get_data(imp.__file__) # File should be closed 293a4975a911d17d8baa96570794fa6db19c0676a2aBrett Cannon loader.get_data(imp.__file__) # Will need to create a newly opened file 294997487d5d760a04bc6f5bcb8c881795ddd87e62bBrett Cannon 2950ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum 2966ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlanclass ReloadTests(unittest.TestCase): 2976ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan 2986ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan """Very basic tests to make sure that imp.reload() operates just like 2996ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan reload().""" 3006ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan 3016ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan def test_source(self): 30297133720fc38f914a3da927c0edbb1dacdd3ed41Florent Xicluna # XXX (ncoghlan): It would be nice to use test.support.CleanImport 3036ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan # here, but that breaks because the os module registers some 3046ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan # handlers in copy_reg on import. Since CleanImport doesn't 3056ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan # revert that registration, the module is left in a broken 3066ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan # state after reversion. Reinitialising the module contents 3076ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan # and just reverting os.environ to its previous state is an OK 3086ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan # workaround 3096ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan with support.EnvironmentVarGuard(): 3106ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan import os 3116ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan imp.reload(os) 3126ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan 3136ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan def test_extension(self): 3146ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan with support.CleanImport('time'): 3156ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan import time 3166ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan imp.reload(time) 3176ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan 3186ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan def test_builtin(self): 3196ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan with support.CleanImport('marshal'): 3206ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan import marshal 3216ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan imp.reload(marshal) 32213a7a21258f0cd241c2cf1367a954d6742daa2a6Christian Heimes 323056bafe7a663e890594a11eec99c78f742452fffEzio Melotti def test_with_deleted_parent(self): 324056bafe7a663e890594a11eec99c78f742452fffEzio Melotti # see #18681 325056bafe7a663e890594a11eec99c78f742452fffEzio Melotti from html import parser 326b212291b08b8c7beffe8b2dbdd211ded05c84087Serhiy Storchaka html = sys.modules.pop('html') 327b212291b08b8c7beffe8b2dbdd211ded05c84087Serhiy Storchaka def cleanup(): 328b212291b08b8c7beffe8b2dbdd211ded05c84087Serhiy Storchaka sys.modules['html'] = html 329056bafe7a663e890594a11eec99c78f742452fffEzio Melotti self.addCleanup(cleanup) 330056bafe7a663e890594a11eec99c78f742452fffEzio Melotti with self.assertRaisesRegex(ImportError, 'html'): 331056bafe7a663e890594a11eec99c78f742452fffEzio Melotti imp.reload(parser) 332056bafe7a663e890594a11eec99c78f742452fffEzio Melotti 33340d20bcf1fccfe8af2393f1aec88ba18e38d0bc1Guido van Rossum 33428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsawclass PEP3147Tests(unittest.TestCase): 33528a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw """Tests of PEP 3147.""" 33628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 33728a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw tag = imp.get_tag() 33828a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 33919a2f5961ce235e9ca9944069b0f5f21b340de9cBrett Cannon @unittest.skipUnless(sys.implementation.cache_tag is not None, 34019a2f5961ce235e9ca9944069b0f5f21b340de9cBrett Cannon 'requires sys.implementation.cache_tag not be None') 34128a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def test_cache_from_source(self): 34228a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # Given the path to a .py file, return the path to its PEP 3147 34328a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # defined .pyc file (i.e. under __pycache__). 344410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon path = os.path.join('foo', 'bar', 'baz', 'qux.py') 345410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon expect = os.path.join('foo', 'bar', 'baz', '__pycache__', 346410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon 'qux.{}.pyc'.format(self.tag)) 347410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon self.assertEqual(imp.cache_from_source(path, True), expect) 348410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon 34919a2f5961ce235e9ca9944069b0f5f21b340de9cBrett Cannon def test_cache_from_source_no_cache_tag(self): 35019a2f5961ce235e9ca9944069b0f5f21b340de9cBrett Cannon # Non cache tag means NotImplementedError. 35119a2f5961ce235e9ca9944069b0f5f21b340de9cBrett Cannon with support.swap_attr(sys.implementation, 'cache_tag', None): 35219a2f5961ce235e9ca9944069b0f5f21b340de9cBrett Cannon with self.assertRaises(NotImplementedError): 35319a2f5961ce235e9ca9944069b0f5f21b340de9cBrett Cannon imp.cache_from_source('whatever.py') 35419a2f5961ce235e9ca9944069b0f5f21b340de9cBrett Cannon 355410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon def test_cache_from_source_no_dot(self): 356410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon # Directory with a dot, filename without dot. 357410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon path = os.path.join('foo.bar', 'file') 358410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon expect = os.path.join('foo.bar', '__pycache__', 359410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon 'file{}.pyc'.format(self.tag)) 360410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon self.assertEqual(imp.cache_from_source(path, True), expect) 36128a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 36228a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def test_cache_from_source_optimized(self): 36328a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # Given the path to a .py file, return the path to its PEP 3147 36428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # defined .pyo file (i.e. under __pycache__). 365410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon path = os.path.join('foo', 'bar', 'baz', 'qux.py') 366410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon expect = os.path.join('foo', 'bar', 'baz', '__pycache__', 367410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon 'qux.{}.pyo'.format(self.tag)) 368410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon self.assertEqual(imp.cache_from_source(path, False), expect) 36928a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 37028a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def test_cache_from_source_cwd(self): 371410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon path = 'foo.py' 372410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon expect = os.path.join('__pycache__', 'foo.{}.pyc'.format(self.tag)) 373410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon self.assertEqual(imp.cache_from_source(path, True), expect) 37428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 37528a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def test_cache_from_source_override(self): 37628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # When debug_override is not None, it can be any true-ish or false-ish 37728a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # value. 378410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon path = os.path.join('foo', 'bar', 'baz.py') 379410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon partial_expect = os.path.join('foo', 'bar', '__pycache__', 380410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon 'baz.{}.py'.format(self.tag)) 381410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon self.assertEqual(imp.cache_from_source(path, []), partial_expect + 'o') 382410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon self.assertEqual(imp.cache_from_source(path, [17]), 383410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon partial_expect + 'c') 38428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # However if the bool-ishness can't be determined, the exception 38528a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # propagates. 38628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw class Bearish: 38728a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def __bool__(self): raise RuntimeError 388410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon with self.assertRaises(RuntimeError): 389410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon imp.cache_from_source('/foo/bar/baz.py', Bearish()) 39028a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 391410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon @unittest.skipUnless(os.sep == '\\' and os.altsep == '/', 39228a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 'test meaningful only where os.altsep is defined') 39328a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def test_sep_altsep_and_sep_cache_from_source(self): 39428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # Windows path and PEP 3147 where sep is right of altsep. 39528a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw self.assertEqual( 39628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw imp.cache_from_source('\\foo\\bar\\baz/qux.py', True), 397410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon '\\foo\\bar\\baz\\__pycache__\\qux.{}.pyc'.format(self.tag)) 39828a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 39919a2f5961ce235e9ca9944069b0f5f21b340de9cBrett Cannon @unittest.skipUnless(sys.implementation.cache_tag is not None, 40019a2f5961ce235e9ca9944069b0f5f21b340de9cBrett Cannon 'requires sys.implementation.cache_tag to not be ' 40119a2f5961ce235e9ca9944069b0f5f21b340de9cBrett Cannon 'None') 40228a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def test_source_from_cache(self): 40328a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # Given the path to a PEP 3147 defined .pyc file, return the path to 40428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # its source. This tests the good path. 405410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon path = os.path.join('foo', 'bar', 'baz', '__pycache__', 406410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon 'qux.{}.pyc'.format(self.tag)) 407410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon expect = os.path.join('foo', 'bar', 'baz', 'qux.py') 408410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon self.assertEqual(imp.source_from_cache(path), expect) 40928a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 41019a2f5961ce235e9ca9944069b0f5f21b340de9cBrett Cannon def test_source_from_cache_no_cache_tag(self): 41119a2f5961ce235e9ca9944069b0f5f21b340de9cBrett Cannon # If sys.implementation.cache_tag is None, raise NotImplementedError. 41219a2f5961ce235e9ca9944069b0f5f21b340de9cBrett Cannon path = os.path.join('blah', '__pycache__', 'whatever.pyc') 41319a2f5961ce235e9ca9944069b0f5f21b340de9cBrett Cannon with support.swap_attr(sys.implementation, 'cache_tag', None): 41419a2f5961ce235e9ca9944069b0f5f21b340de9cBrett Cannon with self.assertRaises(NotImplementedError): 41519a2f5961ce235e9ca9944069b0f5f21b340de9cBrett Cannon imp.source_from_cache(path) 41619a2f5961ce235e9ca9944069b0f5f21b340de9cBrett Cannon 41728a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def test_source_from_cache_bad_path(self): 41828a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # When the path to a pyc file is not in PEP 3147 format, a ValueError 41928a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # is raised. 42028a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw self.assertRaises( 42128a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw ValueError, imp.source_from_cache, '/foo/bar/bazqux.pyc') 42228a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 42328a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def test_source_from_cache_no_slash(self): 42428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # No slashes at all in path -> ValueError 42528a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw self.assertRaises( 42628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw ValueError, imp.source_from_cache, 'foo.cpython-32.pyc') 42728a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 42828a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def test_source_from_cache_too_few_dots(self): 42928a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # Too few dots in final path component -> ValueError 43028a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw self.assertRaises( 43128a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw ValueError, imp.source_from_cache, '__pycache__/foo.pyc') 43228a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 43328a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def test_source_from_cache_too_many_dots(self): 43428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # Too many dots in final path component -> ValueError 43528a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw self.assertRaises( 43628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw ValueError, imp.source_from_cache, 43728a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw '__pycache__/foo.cpython-32.foo.pyc') 43828a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 43928a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def test_source_from_cache_no__pycache__(self): 44028a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # Another problem with the path -> ValueError 44128a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw self.assertRaises( 44228a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw ValueError, imp.source_from_cache, 44328a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw '/foo/bar/foo.cpython-32.foo.pyc') 44428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 44528a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def test_package___file__(self): 44606e37587ffddc5fb77f93ab2cefafd6cbd326aeeAntoine Pitrou try: 44706e37587ffddc5fb77f93ab2cefafd6cbd326aeeAntoine Pitrou m = __import__('pep3147') 44806e37587ffddc5fb77f93ab2cefafd6cbd326aeeAntoine Pitrou except ImportError: 44906e37587ffddc5fb77f93ab2cefafd6cbd326aeeAntoine Pitrou pass 45006e37587ffddc5fb77f93ab2cefafd6cbd326aeeAntoine Pitrou else: 45106e37587ffddc5fb77f93ab2cefafd6cbd326aeeAntoine Pitrou self.fail("pep3147 module already exists: %r" % (m,)) 45228a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # Test that a package's __file__ points to the right source directory. 45328a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw os.mkdir('pep3147') 45428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw sys.path.insert(0, os.curdir) 45528a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def cleanup(): 45628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw if sys.path[0] == os.curdir: 45728a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw del sys.path[0] 45828a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw shutil.rmtree('pep3147') 45928a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw self.addCleanup(cleanup) 46028a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # Touch the __init__.py file. 461bf816223dfe8f1d36a020b4bc02060b8d1ce7d26Victor Stinner support.create_empty_file('pep3147/__init__.py') 4624f92a68a813c8a4090fd175037c494b498e62587Antoine Pitrou importlib.invalidate_caches() 463abe72d7eb3c5288c35214073e2cb25a61f2174eaAntoine Pitrou expected___file__ = os.sep.join(('.', 'pep3147', '__init__.py')) 46428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw m = __import__('pep3147') 4659a4d7ddb6c09af03953840ff8a2c1215fc6742a7Antoine Pitrou self.assertEqual(m.__file__, expected___file__, (m.__file__, m.__path__, sys.path, sys.path_importer_cache)) 46628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # Ensure we load the pyc file. 467037615e1ef0784f5602393ce5fa6802811ae1559Antoine Pitrou support.unload('pep3147') 46828a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw m = __import__('pep3147') 469037615e1ef0784f5602393ce5fa6802811ae1559Antoine Pitrou support.unload('pep3147') 4709a4d7ddb6c09af03953840ff8a2c1215fc6742a7Antoine Pitrou self.assertEqual(m.__file__, expected___file__, (m.__file__, m.__path__, sys.path, sys.path_importer_cache)) 47128a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 47228a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 4731a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinnerclass NullImporterTests(unittest.TestCase): 47409c449c7de0fea077ceaee5cb04017d6994341e7Victor Stinner @unittest.skipIf(support.TESTFN_UNENCODABLE is None, 4751a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinner "Need an undecodeable filename") 4761a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinner def test_unencodeable(self): 47709c449c7de0fea077ceaee5cb04017d6994341e7Victor Stinner name = support.TESTFN_UNENCODABLE 4781a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinner os.mkdir(name) 4791a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinner try: 4801a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinner self.assertRaises(ImportError, imp.NullImporter, name) 4811a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinner finally: 4821a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinner os.rmdir(name) 4831a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinner 4841a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinner 4852294c0d4ecd81d01ddf741fff02cc04bd8de0638Neal Norwitzif __name__ == "__main__": 48695ea11fa311b1c7e428e47a5c3f21a279d6aa752Brett Cannon unittest.main() 487