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