test_imp.py revision 7fdd0fe48f3f342273c1d396df142b1d4b9a1a5c
12294c0d4ecd81d01ddf741fff02cc04bd8de0638Neal Norwitzimport imp 20ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossumimport os 30ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossumimport os.path 428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsawimport shutil 58a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannonimport sys 689f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Woutersimport unittest 7ee8712cda46338d223509cc5751fd36509ad3860Benjamin Petersonfrom test import support 8e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolskyimport importlib 92294c0d4ecd81d01ddf741fff02cc04bd8de0638Neal Norwitz 1089f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Woutersclass LockTests(unittest.TestCase): 11579bed7300816590eca2855aa3c971d2ee38d6beTim Peters 1289f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters """Very basic test of import lock functions.""" 13579bed7300816590eca2855aa3c971d2ee38d6beTim Peters 1489f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters def verify_lock_state(self, expected): 15c9c0f201fed21efcf669dbbf5f923eaf0eeb1db9Benjamin Peterson self.assertEqual(imp.lock_held(), expected, 1689f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters "expected imp.lock_held() to be %r" % expected) 1789f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters def testLock(self): 1889f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters LOOPS = 50 192294c0d4ecd81d01ddf741fff02cc04bd8de0638Neal Norwitz 2089f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters # The import lock may already be held, e.g. if the test suite is run 2189f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters # via "import test.autotest". 2289f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters lock_held_at_start = imp.lock_held() 2389f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters self.verify_lock_state(lock_held_at_start) 24579bed7300816590eca2855aa3c971d2ee38d6beTim Peters 2589f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters for i in range(LOOPS): 2689f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters imp.acquire_lock() 2789f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters self.verify_lock_state(True) 28579bed7300816590eca2855aa3c971d2ee38d6beTim Peters 2989f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters for i in range(LOOPS): 30579bed7300816590eca2855aa3c971d2ee38d6beTim Peters imp.release_lock() 3189f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters 3289f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters # The original state should be restored now. 3389f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters self.verify_lock_state(lock_held_at_start) 3489f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters 3589f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters if not lock_held_at_start: 3689f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters try: 3789f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters imp.release_lock() 3889f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters except RuntimeError: 3989f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters pass 4089f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters else: 4189f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters self.fail("release_lock() without lock should raise " 4289f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters "RuntimeError") 432294c0d4ecd81d01ddf741fff02cc04bd8de0638Neal Norwitz 44ce3a72aec6eaa0293c397c8d0407f7afe0072b2fGuido van Rossumclass ImportTests(unittest.TestCase): 45e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolsky def setUp(self): 46e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolsky mod = importlib.import_module('test.encoded_modules') 47e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolsky self.test_strings = mod.test_strings 48e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolsky self.test_path = mod.__path__ 49e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolsky 50e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolsky def test_import_encoded_module(self): 51e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolsky for modname, encoding, teststr in self.test_strings: 52e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolsky mod = importlib.import_module('test.encoded_modules.' 53e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolsky 'module_' + modname) 54e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolsky self.assertEqual(teststr, mod.test) 55ce3a72aec6eaa0293c397c8d0407f7afe0072b2fGuido van Rossum 56ce3a72aec6eaa0293c397c8d0407f7afe0072b2fGuido van Rossum def test_find_module_encoding(self): 57e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolsky for mod, encoding, _ in self.test_strings: 58749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon with imp.find_module('module_' + mod, self.test_path)[0] as fd: 59749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertEqual(fd.encoding, encoding) 60ce3a72aec6eaa0293c397c8d0407f7afe0072b2fGuido van Rossum 6140d20bcf1fccfe8af2393f1aec88ba18e38d0bc1Guido van Rossum def test_issue1267(self): 62e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolsky for mod, encoding, _ in self.test_strings: 63e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolsky fp, filename, info = imp.find_module('module_' + mod, 64e8f583244acd61d7ba43d0f98c06d57c25977039Alexander Belopolsky self.test_path) 65749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon with fp: 66749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertNotEqual(fp, None) 67749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertEqual(fp.encoding, encoding) 68749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertEqual(fp.tell(), 0) 69749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertEqual(fp.readline(), '# test %s encoding\n' 70749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon % encoding) 7140d20bcf1fccfe8af2393f1aec88ba18e38d0bc1Guido van Rossum 7240d20bcf1fccfe8af2393f1aec88ba18e38d0bc1Guido van Rossum fp, filename, info = imp.find_module("tokenize") 73749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon with fp: 74749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertNotEqual(fp, None) 75749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertEqual(fp.encoding, "utf-8") 76749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertEqual(fp.tell(), 0) 77749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertEqual(fp.readline(), 78749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon '"""Tokenization help for Python programs.\n') 7940d20bcf1fccfe8af2393f1aec88ba18e38d0bc1Guido van Rossum 808a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannon def test_issue3594(self): 818a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannon temp_mod_name = 'test_imp_helper' 828a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannon sys.path.insert(0, '.') 838a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannon try: 848a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannon with open(temp_mod_name + '.py', 'w') as file: 858a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannon file.write("# coding: cp1252\nu = 'test.test_imp'\n") 868a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannon file, filename, info = imp.find_module(temp_mod_name) 878a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannon file.close() 88b3aedd48621ed9d33b5f42f946b256bce4a50673Ezio Melotti self.assertEqual(file.encoding, 'cp1252') 898a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannon finally: 908a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannon del sys.path[0] 918a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannon support.unlink(temp_mod_name + '.py') 928a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannon support.unlink(temp_mod_name + '.pyc') 938a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannon support.unlink(temp_mod_name + '.pyo') 948a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannon 950ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum def test_issue5604(self): 960ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum # Test cannot cover imp.load_compiled function. 970ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum # Martin von Loewis note what shared library cannot have non-ascii 980ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum # character because init_xxx function cannot be compiled 990ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum # and issue never happens for dynamic modules. 1000ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum # But sources modified to follow generic way for processing pathes. 1010ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum 102435b5318732b3fa8e5a0dd82d3538aa6bc045d8eEzio Melotti # the return encoding could be uppercase or None 103435b5318732b3fa8e5a0dd82d3538aa6bc045d8eEzio Melotti fs_encoding = sys.getfilesystemencoding() 1040ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum 1050ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum # covers utf-8 and Windows ANSI code pages 1060ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum # one non-space symbol from every page 1070ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum # (http://en.wikipedia.org/wiki/Code_page) 1080ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum known_locales = { 1099a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti 'utf-8' : b'\xc3\xa4', 1100ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum 'cp1250' : b'\x8C', 1110ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum 'cp1251' : b'\xc0', 1120ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum 'cp1252' : b'\xc0', 1130ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum 'cp1253' : b'\xc1', 1140ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum 'cp1254' : b'\xc0', 1150ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum 'cp1255' : b'\xe0', 1160ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum 'cp1256' : b'\xe0', 1170ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum 'cp1257' : b'\xc0', 1180ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum 'cp1258' : b'\xc0', 1190ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum } 1200ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum 12121164ce8f1f1c45fa1305fee4851b19405c19a67Florent Xicluna if sys.platform == 'darwin': 12221164ce8f1f1c45fa1305fee4851b19405c19a67Florent Xicluna self.assertEqual(fs_encoding, 'utf-8') 12321164ce8f1f1c45fa1305fee4851b19405c19a67Florent Xicluna # Mac OS X uses the Normal Form D decomposition 12421164ce8f1f1c45fa1305fee4851b19405c19a67Florent Xicluna # http://developer.apple.com/mac/library/qa/qa2001/qa1173.html 12521164ce8f1f1c45fa1305fee4851b19405c19a67Florent Xicluna special_char = b'a\xcc\x88' 12621164ce8f1f1c45fa1305fee4851b19405c19a67Florent Xicluna else: 12721164ce8f1f1c45fa1305fee4851b19405c19a67Florent Xicluna special_char = known_locales.get(fs_encoding) 12821164ce8f1f1c45fa1305fee4851b19405c19a67Florent Xicluna 1299a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti if not special_char: 13076e0d1a6efac2efbb6b9de739d43be827e7ea8ecEzio Melotti self.skipTest("can't run this test with %s as filesystem encoding" 13176e0d1a6efac2efbb6b9de739d43be827e7ea8ecEzio Melotti % fs_encoding) 13276e0d1a6efac2efbb6b9de739d43be827e7ea8ecEzio Melotti decoded_char = special_char.decode(fs_encoding) 1339a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti temp_mod_name = 'test_imp_helper_' + decoded_char 1349a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti test_package_name = 'test_imp_helper_package_' + decoded_char 1359a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti init_file_name = os.path.join(test_package_name, '__init__.py') 1369a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti try: 13741a6b04b1fb5dc58b07abd60598a2932a7b0649cEzio Melotti # if the curdir is not in sys.path the test fails when run with 13841a6b04b1fb5dc58b07abd60598a2932a7b0649cEzio Melotti # ./python ./Lib/test/regrtest.py test_imp 13941a6b04b1fb5dc58b07abd60598a2932a7b0649cEzio Melotti sys.path.insert(0, os.curdir) 1409a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti with open(temp_mod_name + '.py', 'w') as file: 1419a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti file.write('a = 1\n') 1429a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti file, filename, info = imp.find_module(temp_mod_name) 143749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon with file: 144749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertIsNotNone(file) 145749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertTrue(filename[:-3].endswith(temp_mod_name)) 146749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertEqual(info[0], '.py') 147749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertEqual(info[1], 'U') 148749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertEqual(info[2], imp.PY_SOURCE) 149749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon 150749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon mod = imp.load_module(temp_mod_name, file, filename, info) 151749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon self.assertEqual(mod.a, 1) 1529a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti 1539a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti mod = imp.load_source(temp_mod_name, temp_mod_name + '.py') 154435b5318732b3fa8e5a0dd82d3538aa6bc045d8eEzio Melotti self.assertEqual(mod.a, 1) 1559a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti 15628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw mod = imp.load_compiled( 15728a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw temp_mod_name, imp.cache_from_source(temp_mod_name + '.py')) 158435b5318732b3fa8e5a0dd82d3538aa6bc045d8eEzio Melotti self.assertEqual(mod.a, 1) 1599a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti 1609a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti if not os.path.exists(test_package_name): 1619a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti os.mkdir(test_package_name) 1629a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti with open(init_file_name, 'w') as file: 1639a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti file.write('b = 2\n') 1649a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti package = imp.load_package(test_package_name, test_package_name) 165435b5318732b3fa8e5a0dd82d3538aa6bc045d8eEzio Melotti self.assertEqual(package.b, 2) 1669a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti finally: 16741a6b04b1fb5dc58b07abd60598a2932a7b0649cEzio Melotti del sys.path[0] 168435b5318732b3fa8e5a0dd82d3538aa6bc045d8eEzio Melotti for ext in ('.py', '.pyc', '.pyo'): 169435b5318732b3fa8e5a0dd82d3538aa6bc045d8eEzio Melotti support.unlink(temp_mod_name + ext) 170435b5318732b3fa8e5a0dd82d3538aa6bc045d8eEzio Melotti support.unlink(init_file_name + ext) 1719a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti support.rmtree(test_package_name) 1720ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum 173c68b6aaec8b08caf682ebb7c95f94ddf49a6b66cVictor Stinner def test_issue9319(self): 1747fdd0fe48f3f342273c1d396df142b1d4b9a1a5cVictor Stinner self.assertRaises(SyntaxError, 1757fdd0fe48f3f342273c1d396df142b1d4b9a1a5cVictor Stinner imp.find_module, "test/badsyntax_pep3120") 176c68b6aaec8b08caf682ebb7c95f94ddf49a6b66cVictor Stinner 1770ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum 1786ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlanclass ReloadTests(unittest.TestCase): 1796ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan 1806ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan """Very basic tests to make sure that imp.reload() operates just like 1816ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan reload().""" 1826ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan 1836ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan def test_source(self): 18497133720fc38f914a3da927c0edbb1dacdd3ed41Florent Xicluna # XXX (ncoghlan): It would be nice to use test.support.CleanImport 1856ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan # here, but that breaks because the os module registers some 1866ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan # handlers in copy_reg on import. Since CleanImport doesn't 1876ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan # revert that registration, the module is left in a broken 1886ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan # state after reversion. Reinitialising the module contents 1896ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan # and just reverting os.environ to its previous state is an OK 1906ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan # workaround 1916ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan with support.EnvironmentVarGuard(): 1926ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan import os 1936ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan imp.reload(os) 1946ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan 1956ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan def test_extension(self): 1966ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan with support.CleanImport('time'): 1976ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan import time 1986ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan imp.reload(time) 1996ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan 2006ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan def test_builtin(self): 2016ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan with support.CleanImport('marshal'): 2026ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan import marshal 2036ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan imp.reload(marshal) 20413a7a21258f0cd241c2cf1367a954d6742daa2a6Christian Heimes 20540d20bcf1fccfe8af2393f1aec88ba18e38d0bc1Guido van Rossum 20628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsawclass PEP3147Tests(unittest.TestCase): 20728a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw """Tests of PEP 3147.""" 20828a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 20928a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw tag = imp.get_tag() 21028a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 21128a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def test_cache_from_source(self): 21228a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # Given the path to a .py file, return the path to its PEP 3147 21328a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # defined .pyc file (i.e. under __pycache__). 21428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw self.assertEqual( 21528a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw imp.cache_from_source('/foo/bar/baz/qux.py', True), 21628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw '/foo/bar/baz/__pycache__/qux.{}.pyc'.format(self.tag)) 21728a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 21828a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def test_cache_from_source_optimized(self): 21928a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # Given the path to a .py file, return the path to its PEP 3147 22028a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # defined .pyo file (i.e. under __pycache__). 22128a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw self.assertEqual( 22228a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw imp.cache_from_source('/foo/bar/baz/qux.py', False), 22328a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw '/foo/bar/baz/__pycache__/qux.{}.pyo'.format(self.tag)) 22428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 22528a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def test_cache_from_source_cwd(self): 22628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw self.assertEqual(imp.cache_from_source('foo.py', True), 22728a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw os.sep.join(('__pycache__', 22828a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 'foo.{}.pyc'.format(self.tag)))) 22928a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 23028a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def test_cache_from_source_override(self): 23128a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # When debug_override is not None, it can be any true-ish or false-ish 23228a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # value. 23328a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw self.assertEqual( 23428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw imp.cache_from_source('/foo/bar/baz.py', []), 23528a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw '/foo/bar/__pycache__/baz.{}.pyo'.format(self.tag)) 23628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw self.assertEqual( 23728a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw imp.cache_from_source('/foo/bar/baz.py', [17]), 23828a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw '/foo/bar/__pycache__/baz.{}.pyc'.format(self.tag)) 23928a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # However if the bool-ishness can't be determined, the exception 24028a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # propagates. 24128a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw class Bearish: 24228a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def __bool__(self): raise RuntimeError 24328a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw self.assertRaises( 24428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw RuntimeError, 24528a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw imp.cache_from_source, '/foo/bar/baz.py', Bearish()) 24628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 24728a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw @unittest.skipIf(os.altsep is None, 24828a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 'test meaningful only where os.altsep is defined') 24928a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def test_altsep_cache_from_source(self): 25028a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # Windows path and PEP 3147. 25128a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw self.assertEqual( 25228a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw imp.cache_from_source('\\foo\\bar\\baz\\qux.py', True), 25328a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw '\\foo\\bar\\baz\\__pycache__\\qux.{}.pyc'.format(self.tag)) 25428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 25528a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw @unittest.skipIf(os.altsep is None, 25628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 'test meaningful only where os.altsep is defined') 25728a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def test_altsep_and_sep_cache_from_source(self): 25828a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # Windows path and PEP 3147 where altsep is right of sep. 25928a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw self.assertEqual( 26028a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw imp.cache_from_source('\\foo\\bar/baz\\qux.py', True), 26128a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw '\\foo\\bar/baz\\__pycache__\\qux.{}.pyc'.format(self.tag)) 26228a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 26328a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw @unittest.skipIf(os.altsep is None, 26428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 'test meaningful only where os.altsep is defined') 26528a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def test_sep_altsep_and_sep_cache_from_source(self): 26628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # Windows path and PEP 3147 where sep is right of altsep. 26728a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw self.assertEqual( 26828a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw imp.cache_from_source('\\foo\\bar\\baz/qux.py', True), 26928a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw '\\foo\\bar\\baz/__pycache__/qux.{}.pyc'.format(self.tag)) 27028a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 27128a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def test_source_from_cache(self): 27228a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # Given the path to a PEP 3147 defined .pyc file, return the path to 27328a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # its source. This tests the good path. 27428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw self.assertEqual(imp.source_from_cache( 27528a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw '/foo/bar/baz/__pycache__/qux.{}.pyc'.format(self.tag)), 27628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw '/foo/bar/baz/qux.py') 27728a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 27828a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def test_source_from_cache_bad_path(self): 27928a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # When the path to a pyc file is not in PEP 3147 format, a ValueError 28028a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # is raised. 28128a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw self.assertRaises( 28228a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw ValueError, imp.source_from_cache, '/foo/bar/bazqux.pyc') 28328a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 28428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def test_source_from_cache_no_slash(self): 28528a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # No slashes at all in path -> ValueError 28628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw self.assertRaises( 28728a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw ValueError, imp.source_from_cache, 'foo.cpython-32.pyc') 28828a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 28928a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def test_source_from_cache_too_few_dots(self): 29028a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # Too few dots in final path component -> ValueError 29128a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw self.assertRaises( 29228a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw ValueError, imp.source_from_cache, '__pycache__/foo.pyc') 29328a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 29428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def test_source_from_cache_too_many_dots(self): 29528a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # Too many dots in final path component -> ValueError 29628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw self.assertRaises( 29728a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw ValueError, imp.source_from_cache, 29828a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw '__pycache__/foo.cpython-32.foo.pyc') 29928a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 30028a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def test_source_from_cache_no__pycache__(self): 30128a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # Another problem with the path -> ValueError 30228a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw self.assertRaises( 30328a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw ValueError, imp.source_from_cache, 30428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw '/foo/bar/foo.cpython-32.foo.pyc') 30528a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 30628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def test_package___file__(self): 30728a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # Test that a package's __file__ points to the right source directory. 30828a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw os.mkdir('pep3147') 30928a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw sys.path.insert(0, os.curdir) 31028a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw def cleanup(): 31128a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw if sys.path[0] == os.curdir: 31228a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw del sys.path[0] 31328a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw shutil.rmtree('pep3147') 31428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw self.addCleanup(cleanup) 31528a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # Touch the __init__.py file. 31628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw with open('pep3147/__init__.py', 'w'): 31728a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw pass 31828a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw m = __import__('pep3147') 31928a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw # Ensure we load the pyc file. 32028a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw support.forget('pep3147') 32128a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw m = __import__('pep3147') 32228a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw self.assertEqual(m.__file__, 32328a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw os.sep.join(('.', 'pep3147', '__init__.py'))) 32428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 32528a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw 3261a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinnerclass NullImporterTests(unittest.TestCase): 32709c449c7de0fea077ceaee5cb04017d6994341e7Victor Stinner @unittest.skipIf(support.TESTFN_UNENCODABLE is None, 3281a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinner "Need an undecodeable filename") 3291a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinner def test_unencodeable(self): 33009c449c7de0fea077ceaee5cb04017d6994341e7Victor Stinner name = support.TESTFN_UNENCODABLE 3311a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinner os.mkdir(name) 3321a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinner try: 3331a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinner self.assertRaises(ImportError, imp.NullImporter, name) 3341a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinner finally: 3351a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinner os.rmdir(name) 3361a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinner 3371a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinner 338996acf122dbf8d9aa694a16a32ced065f5805cd2Neal Norwitzdef test_main(): 33936144098e39598526ca981762cd4e7fd13c2412aHirokazu Yamamoto tests = [ 34036144098e39598526ca981762cd4e7fd13c2412aHirokazu Yamamoto ImportTests, 34128a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw PEP3147Tests, 3426ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan ReloadTests, 3431a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinner NullImporterTests, 34428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw ] 34536144098e39598526ca981762cd4e7fd13c2412aHirokazu Yamamoto try: 34636144098e39598526ca981762cd4e7fd13c2412aHirokazu Yamamoto import _thread 34736144098e39598526ca981762cd4e7fd13c2412aHirokazu Yamamoto except ImportError: 34836144098e39598526ca981762cd4e7fd13c2412aHirokazu Yamamoto pass 34936144098e39598526ca981762cd4e7fd13c2412aHirokazu Yamamoto else: 35036144098e39598526ca981762cd4e7fd13c2412aHirokazu Yamamoto tests.append(LockTests) 35136144098e39598526ca981762cd4e7fd13c2412aHirokazu Yamamoto support.run_unittest(*tests) 352996acf122dbf8d9aa694a16a32ced065f5805cd2Neal Norwitz 3532294c0d4ecd81d01ddf741fff02cc04bd8de0638Neal Norwitzif __name__ == "__main__": 354996acf122dbf8d9aa694a16a32ced065f5805cd2Neal Norwitz test_main() 355