1142685337f2eab63ac85d2e9a284a5eb900cd053Brett Cannontry:
2142685337f2eab63ac85d2e9a284a5eb900cd053Brett Cannon    import _thread
3142685337f2eab63ac85d2e9a284a5eb900cd053Brett Cannonexcept ImportError:
4142685337f2eab63ac85d2e9a284a5eb900cd053Brett Cannon    _thread = None
5c049952de76cbcd00e490e48445ed7a50d3dc83aBrett Cannonimport importlib
69d3c61c86a20678d604c96a68bbf4a966877f0b9Nick Coghlanimport importlib.util
70ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossumimport os
80ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossumimport os.path
98a9583ec5c00384514fe9f5045866ad6ebd2be5aBrett Cannonimport sys
10ee8712cda46338d223509cc5751fd36509ad3860Benjamin Petersonfrom test import support
11c049952de76cbcd00e490e48445ed7a50d3dc83aBrett Cannonimport unittest
12c049952de76cbcd00e490e48445ed7a50d3dc83aBrett Cannonimport warnings
13e4f41deccf94ccc798b1eb1f44657ade66669a60Brett Cannonwith warnings.catch_warnings():
14213b4056a64a670587419c8a15a724faeb789221Brett Cannon    warnings.simplefilter('ignore', DeprecationWarning)
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
1150ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum    def test_issue5604(self):
1160ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum        # Test cannot cover imp.load_compiled function.
1170ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum        # Martin von Loewis note what shared library cannot have non-ascii
1180ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum        # character because init_xxx function cannot be compiled
1190ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum        # and issue never happens for dynamic modules.
1200ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum        # But sources modified to follow generic way for processing pathes.
1210ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum
122435b5318732b3fa8e5a0dd82d3538aa6bc045d8eEzio Melotti        # the return encoding could be uppercase or None
123435b5318732b3fa8e5a0dd82d3538aa6bc045d8eEzio Melotti        fs_encoding = sys.getfilesystemencoding()
1240ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum
1250ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum        # covers utf-8 and Windows ANSI code pages
1260ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum        # one non-space symbol from every page
1270ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum        # (http://en.wikipedia.org/wiki/Code_page)
1280ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum        known_locales = {
1299a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti            'utf-8' : b'\xc3\xa4',
1300ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum            'cp1250' : b'\x8C',
1310ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum            'cp1251' : b'\xc0',
1320ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum            'cp1252' : b'\xc0',
1330ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum            'cp1253' : b'\xc1',
1340ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum            'cp1254' : b'\xc0',
1350ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum            'cp1255' : b'\xe0',
1360ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum            'cp1256' : b'\xe0',
1370ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum            'cp1257' : b'\xc0',
1380ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum            'cp1258' : b'\xc0',
1390ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum            }
1400ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum
14121164ce8f1f1c45fa1305fee4851b19405c19a67Florent Xicluna        if sys.platform == 'darwin':
14221164ce8f1f1c45fa1305fee4851b19405c19a67Florent Xicluna            self.assertEqual(fs_encoding, 'utf-8')
14321164ce8f1f1c45fa1305fee4851b19405c19a67Florent Xicluna            # Mac OS X uses the Normal Form D decomposition
14421164ce8f1f1c45fa1305fee4851b19405c19a67Florent Xicluna            # http://developer.apple.com/mac/library/qa/qa2001/qa1173.html
14521164ce8f1f1c45fa1305fee4851b19405c19a67Florent Xicluna            special_char = b'a\xcc\x88'
14621164ce8f1f1c45fa1305fee4851b19405c19a67Florent Xicluna        else:
14721164ce8f1f1c45fa1305fee4851b19405c19a67Florent Xicluna            special_char = known_locales.get(fs_encoding)
14821164ce8f1f1c45fa1305fee4851b19405c19a67Florent Xicluna
1499a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti        if not special_char:
15076e0d1a6efac2efbb6b9de739d43be827e7ea8ecEzio Melotti            self.skipTest("can't run this test with %s as filesystem encoding"
15176e0d1a6efac2efbb6b9de739d43be827e7ea8ecEzio Melotti                          % fs_encoding)
15276e0d1a6efac2efbb6b9de739d43be827e7ea8ecEzio Melotti        decoded_char = special_char.decode(fs_encoding)
1539a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti        temp_mod_name = 'test_imp_helper_' + decoded_char
1549a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti        test_package_name = 'test_imp_helper_package_' + decoded_char
1559a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti        init_file_name = os.path.join(test_package_name, '__init__.py')
1569a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti        try:
15741a6b04b1fb5dc58b07abd60598a2932a7b0649cEzio Melotti            # if the curdir is not in sys.path the test fails when run with
15841a6b04b1fb5dc58b07abd60598a2932a7b0649cEzio Melotti            # ./python ./Lib/test/regrtest.py test_imp
15941a6b04b1fb5dc58b07abd60598a2932a7b0649cEzio Melotti            sys.path.insert(0, os.curdir)
1609a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti            with open(temp_mod_name + '.py', 'w') as file:
1619a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti                file.write('a = 1\n')
1629a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti            file, filename, info = imp.find_module(temp_mod_name)
163749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon            with file:
164749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon                self.assertIsNotNone(file)
165749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon                self.assertTrue(filename[:-3].endswith(temp_mod_name))
166749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon                self.assertEqual(info[0], '.py')
1676787a3806ee6a85a6f21ede70c10e15a6df267c4Serhiy Storchaka                self.assertEqual(info[1], 'r')
168749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon                self.assertEqual(info[2], imp.PY_SOURCE)
169749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon
170749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon                mod = imp.load_module(temp_mod_name, file, filename, info)
171749afa95ce28ffded9c6f75c776dae15cade6ecbBrett Cannon                self.assertEqual(mod.a, 1)
1729a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti
173c049952de76cbcd00e490e48445ed7a50d3dc83aBrett Cannon            with warnings.catch_warnings():
174c049952de76cbcd00e490e48445ed7a50d3dc83aBrett Cannon                warnings.simplefilter('ignore')
175c049952de76cbcd00e490e48445ed7a50d3dc83aBrett Cannon                mod = imp.load_source(temp_mod_name, temp_mod_name + '.py')
176435b5318732b3fa8e5a0dd82d3538aa6bc045d8eEzio Melotti            self.assertEqual(mod.a, 1)
1779a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti
178c049952de76cbcd00e490e48445ed7a50d3dc83aBrett Cannon            with warnings.catch_warnings():
179c049952de76cbcd00e490e48445ed7a50d3dc83aBrett Cannon                warnings.simplefilter('ignore')
180e5e7a7cbf450f80fa9a88038878b6bd525313f37Ezio Melotti                if not sys.dont_write_bytecode:
181e5e7a7cbf450f80fa9a88038878b6bd525313f37Ezio Melotti                    mod = imp.load_compiled(
182e5e7a7cbf450f80fa9a88038878b6bd525313f37Ezio Melotti                        temp_mod_name,
183e5e7a7cbf450f80fa9a88038878b6bd525313f37Ezio Melotti                        imp.cache_from_source(temp_mod_name + '.py'))
184435b5318732b3fa8e5a0dd82d3538aa6bc045d8eEzio Melotti            self.assertEqual(mod.a, 1)
1859a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti
1869a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti            if not os.path.exists(test_package_name):
1879a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti                os.mkdir(test_package_name)
1889a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti            with open(init_file_name, 'w') as file:
1899a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti                file.write('b = 2\n')
190c049952de76cbcd00e490e48445ed7a50d3dc83aBrett Cannon            with warnings.catch_warnings():
191c049952de76cbcd00e490e48445ed7a50d3dc83aBrett Cannon                warnings.simplefilter('ignore')
192c049952de76cbcd00e490e48445ed7a50d3dc83aBrett Cannon                package = imp.load_package(test_package_name, test_package_name)
193435b5318732b3fa8e5a0dd82d3538aa6bc045d8eEzio Melotti            self.assertEqual(package.b, 2)
1949a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti        finally:
19541a6b04b1fb5dc58b07abd60598a2932a7b0649cEzio Melotti            del sys.path[0]
196f299abdafa0f2b6eb7abae274861b19b361c96bcBrett Cannon            for ext in ('.py', '.pyc'):
197435b5318732b3fa8e5a0dd82d3538aa6bc045d8eEzio Melotti                support.unlink(temp_mod_name + ext)
198435b5318732b3fa8e5a0dd82d3538aa6bc045d8eEzio Melotti                support.unlink(init_file_name + ext)
1999a7d5ac9f647bad9e48c98255ab54b71ec366127Ezio Melotti            support.rmtree(test_package_name)
200047b7ae56628717160eb75e379e2bfdaa59dfc18Victor Stinner            support.rmtree('__pycache__')
2010ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum
202c68b6aaec8b08caf682ebb7c95f94ddf49a6b66cVictor Stinner    def test_issue9319(self):
20311846905d33d696f14a4ae26383104feacdc0f17Antoine Pitrou        path = os.path.dirname(__file__)
2047fdd0fe48f3f342273c1d396df142b1d4b9a1a5cVictor Stinner        self.assertRaises(SyntaxError,
20511846905d33d696f14a4ae26383104feacdc0f17Antoine Pitrou                          imp.find_module, "badsyntax_pep3120", [path])
206c68b6aaec8b08caf682ebb7c95f94ddf49a6b66cVictor Stinner
20791b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan    def test_load_from_source(self):
20891b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan        # Verify that the imp module can correctly load and find .py files
20991b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan        # XXX (ncoghlan): It would be nice to use support.CleanImport
21091b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan        # here, but that breaks because the os module registers some
21191b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan        # handlers in copy_reg on import. Since CleanImport doesn't
21291b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan        # revert that registration, the module is left in a broken
21391b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan        # state after reversion. Reinitialising the module contents
21491b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan        # and just reverting os.environ to its previous state is an OK
21591b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan        # workaround
21691b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan        orig_path = os.path
21791b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan        orig_getenv = os.getenv
21891b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan        with support.EnvironmentVarGuard():
21991b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan            x = imp.find_module("os")
22091b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan            self.addCleanup(x[0].close)
22191b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan            new_os = imp.load_module("os", *x)
22291b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan            self.assertIs(os, new_os)
22391b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan            self.assertIs(orig_path, new_os.path)
22491b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan            self.assertIsNot(orig_getenv, new_os.getenv)
22591b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan
226130e48199a28239c0574f233c6e20fbe6a41d1cdBrett Cannon    @requires_load_dynamic
22791b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan    def test_issue15828_load_extensions(self):
22891b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan        # Issue 15828 picked up that the adapter between the old imp API
22991b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan        # and importlib couldn't handle C extensions
23091b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan        example = "_heapq"
23191b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan        x = imp.find_module(example)
232848cdfdf97f3671f75aa98438f228e36e7d0a310Brett Cannon        file_ = x[0]
233848cdfdf97f3671f75aa98438f228e36e7d0a310Brett Cannon        if file_ is not None:
234848cdfdf97f3671f75aa98438f228e36e7d0a310Brett Cannon            self.addCleanup(file_.close)
23591b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan        mod = imp.load_module(example, *x)
23691b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan        self.assertEqual(mod.__name__, example)
23791b9f139bc629e1ba931c60a3301e8062f6f4e6dNick Coghlan
238130e48199a28239c0574f233c6e20fbe6a41d1cdBrett Cannon    @requires_load_dynamic
2396b2cbeba58aeb0755bdefd02fb51a80ec66d6144Andrew Svetlov    def test_issue16421_multiple_modules_in_one_dll(self):
2406b2cbeba58aeb0755bdefd02fb51a80ec66d6144Andrew Svetlov        # Issue 16421: loading several modules from the same compiled file fails
2416b2cbeba58aeb0755bdefd02fb51a80ec66d6144Andrew Svetlov        m = '_testimportmultiple'
2426b2cbeba58aeb0755bdefd02fb51a80ec66d6144Andrew Svetlov        fileobj, pathname, description = imp.find_module(m)
2436b2cbeba58aeb0755bdefd02fb51a80ec66d6144Andrew Svetlov        fileobj.close()
2446b2cbeba58aeb0755bdefd02fb51a80ec66d6144Andrew Svetlov        mod0 = imp.load_dynamic(m, pathname)
245ef9a43b2c97d91ab3343372d3e310136938ee505Andrew Svetlov        mod1 = imp.load_dynamic('_testimportmultiple_foo', pathname)
246ef9a43b2c97d91ab3343372d3e310136938ee505Andrew Svetlov        mod2 = imp.load_dynamic('_testimportmultiple_bar', pathname)
2476b2cbeba58aeb0755bdefd02fb51a80ec66d6144Andrew Svetlov        self.assertEqual(mod0.__name__, m)
248ef9a43b2c97d91ab3343372d3e310136938ee505Andrew Svetlov        self.assertEqual(mod1.__name__, '_testimportmultiple_foo')
249ef9a43b2c97d91ab3343372d3e310136938ee505Andrew Svetlov        self.assertEqual(mod2.__name__, '_testimportmultiple_bar')
2506b2cbeba58aeb0755bdefd02fb51a80ec66d6144Andrew Svetlov        with self.assertRaises(ImportError):
2516b2cbeba58aeb0755bdefd02fb51a80ec66d6144Andrew Svetlov            imp.load_dynamic('nonexistent', pathname)
2526b2cbeba58aeb0755bdefd02fb51a80ec66d6144Andrew Svetlov
253130e48199a28239c0574f233c6e20fbe6a41d1cdBrett Cannon    @requires_load_dynamic
254f0434e647aa3e7b82a740be4a820aec951a885acBrett Cannon    def test_load_dynamic_ImportError_path(self):
255f0434e647aa3e7b82a740be4a820aec951a885acBrett Cannon        # Issue #1559549 added `name` and `path` attributes to ImportError
256f0434e647aa3e7b82a740be4a820aec951a885acBrett Cannon        # in order to provide better detail. Issue #10854 implemented those
257f0434e647aa3e7b82a740be4a820aec951a885acBrett Cannon        # attributes on import failures of extensions on Windows.
258f0434e647aa3e7b82a740be4a820aec951a885acBrett Cannon        path = 'bogus file path'
259f0434e647aa3e7b82a740be4a820aec951a885acBrett Cannon        name = 'extension'
260f0434e647aa3e7b82a740be4a820aec951a885acBrett Cannon        with self.assertRaises(ImportError) as err:
261f0434e647aa3e7b82a740be4a820aec951a885acBrett Cannon            imp.load_dynamic(name, path)
262f0434e647aa3e7b82a740be4a820aec951a885acBrett Cannon        self.assertIn(path, err.exception.path)
263f0434e647aa3e7b82a740be4a820aec951a885acBrett Cannon        self.assertEqual(name, err.exception.name)
264f0434e647aa3e7b82a740be4a820aec951a885acBrett Cannon
265130e48199a28239c0574f233c6e20fbe6a41d1cdBrett Cannon    @requires_load_dynamic
2669d0f772c5115217d55aef76fae33f483f2a98032Brett Cannon    def test_load_module_extension_file_is_None(self):
2679d0f772c5115217d55aef76fae33f483f2a98032Brett Cannon        # When loading an extension module and the file is None, open one
2689d0f772c5115217d55aef76fae33f483f2a98032Brett Cannon        # on the behalf of imp.load_dynamic().
2699d0f772c5115217d55aef76fae33f483f2a98032Brett Cannon        # Issue #15902
2708772b18bc4eeff5475b998ae74c21df56fb234a2Brett Cannon        name = '_testimportmultiple'
2719d0f772c5115217d55aef76fae33f483f2a98032Brett Cannon        found = imp.find_module(name)
272aa6f688bd4f02b5d50c26cf649172672c1546d12Benjamin Peterson        if found[0] is not None:
273aa6f688bd4f02b5d50c26cf649172672c1546d12Benjamin Peterson            found[0].close()
2748772b18bc4eeff5475b998ae74c21df56fb234a2Brett Cannon        if found[2][2] != imp.C_EXTENSION:
2759fe6d86709b0e769602ff55a6e5a202c440b9d8aZachary Ware            self.skipTest("found module doesn't appear to be a C extension")
2769d0f772c5115217d55aef76fae33f483f2a98032Brett Cannon        imp.load_module(name, None, *found[1:])
2779d0f772c5115217d55aef76fae33f483f2a98032Brett Cannon
2789d3c61c86a20678d604c96a68bbf4a966877f0b9Nick Coghlan    @requires_load_dynamic
2799d3c61c86a20678d604c96a68bbf4a966877f0b9Nick Coghlan    def test_issue24748_load_module_skips_sys_modules_check(self):
2809d3c61c86a20678d604c96a68bbf4a966877f0b9Nick Coghlan        name = 'test.imp_dummy'
2819d3c61c86a20678d604c96a68bbf4a966877f0b9Nick Coghlan        try:
2829d3c61c86a20678d604c96a68bbf4a966877f0b9Nick Coghlan            del sys.modules[name]
2839d3c61c86a20678d604c96a68bbf4a966877f0b9Nick Coghlan        except KeyError:
2849d3c61c86a20678d604c96a68bbf4a966877f0b9Nick Coghlan            pass
2859d3c61c86a20678d604c96a68bbf4a966877f0b9Nick Coghlan        try:
2869d3c61c86a20678d604c96a68bbf4a966877f0b9Nick Coghlan            module = importlib.import_module(name)
2879d3c61c86a20678d604c96a68bbf4a966877f0b9Nick Coghlan            spec = importlib.util.find_spec('_testmultiphase')
2889d3c61c86a20678d604c96a68bbf4a966877f0b9Nick Coghlan            module = imp.load_dynamic(name, spec.origin)
2899d3c61c86a20678d604c96a68bbf4a966877f0b9Nick Coghlan            self.assertEqual(module.__name__, name)
2909d3c61c86a20678d604c96a68bbf4a966877f0b9Nick Coghlan            self.assertEqual(module.__spec__.name, name)
2919d3c61c86a20678d604c96a68bbf4a966877f0b9Nick Coghlan            self.assertEqual(module.__spec__.origin, spec.origin)
2929d3c61c86a20678d604c96a68bbf4a966877f0b9Nick Coghlan            self.assertRaises(AttributeError, getattr, module, 'dummy_name')
2939d3c61c86a20678d604c96a68bbf4a966877f0b9Nick Coghlan            self.assertEqual(module.int_const, 1969)
2949d3c61c86a20678d604c96a68bbf4a966877f0b9Nick Coghlan            self.assertIs(sys.modules[name], module)
2959d3c61c86a20678d604c96a68bbf4a966877f0b9Nick Coghlan        finally:
2969d3c61c86a20678d604c96a68bbf4a966877f0b9Nick Coghlan            try:
2979d3c61c86a20678d604c96a68bbf4a966877f0b9Nick Coghlan                del sys.modules[name]
2989d3c61c86a20678d604c96a68bbf4a966877f0b9Nick Coghlan            except KeyError:
2999d3c61c86a20678d604c96a68bbf4a966877f0b9Nick Coghlan                pass
3009d3c61c86a20678d604c96a68bbf4a966877f0b9Nick Coghlan
301997487d5d760a04bc6f5bcb8c881795ddd87e62bBrett Cannon    @unittest.skipIf(sys.dont_write_bytecode,
302997487d5d760a04bc6f5bcb8c881795ddd87e62bBrett Cannon        "test meaningful only when writing bytecode")
303997487d5d760a04bc6f5bcb8c881795ddd87e62bBrett Cannon    def test_bug7732(self):
304bb2c45e7a4101d106bf776cf7217d2f1531e8002Antoine Pitrou        with support.temp_cwd():
305bb2c45e7a4101d106bf776cf7217d2f1531e8002Antoine Pitrou            source = support.TESTFN + '.py'
306bb2c45e7a4101d106bf776cf7217d2f1531e8002Antoine Pitrou            os.mkdir(source)
307997487d5d760a04bc6f5bcb8c881795ddd87e62bBrett Cannon            self.assertRaisesRegex(ImportError, '^No module',
308997487d5d760a04bc6f5bcb8c881795ddd87e62bBrett Cannon                imp.find_module, support.TESTFN, ["."])
309330cc52c99037eaabe0fcfa09f9b099743b0b913Brett Cannon
310a4975a911d17d8baa96570794fa6db19c0676a2aBrett Cannon    def test_multiple_calls_to_get_data(self):
311a4975a911d17d8baa96570794fa6db19c0676a2aBrett Cannon        # Issue #18755: make sure multiple calls to get_data() can succeed.
312a4975a911d17d8baa96570794fa6db19c0676a2aBrett Cannon        loader = imp._LoadSourceCompatibility('imp', imp.__file__,
313a4975a911d17d8baa96570794fa6db19c0676a2aBrett Cannon                                              open(imp.__file__))
314a4975a911d17d8baa96570794fa6db19c0676a2aBrett Cannon        loader.get_data(imp.__file__)  # File should be closed
315a4975a911d17d8baa96570794fa6db19c0676a2aBrett Cannon        loader.get_data(imp.__file__)  # Will need to create a newly opened file
316997487d5d760a04bc6f5bcb8c881795ddd87e62bBrett Cannon
3170ad59d467d06c8c9dce81658f4f278783cb70b9fGuido van Rossum
3186ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlanclass ReloadTests(unittest.TestCase):
3196ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan
3206ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan    """Very basic tests to make sure that imp.reload() operates just like
3216ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan    reload()."""
3226ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan
3236ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan    def test_source(self):
32497133720fc38f914a3da927c0edbb1dacdd3ed41Florent Xicluna        # XXX (ncoghlan): It would be nice to use test.support.CleanImport
3256ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan        # here, but that breaks because the os module registers some
3266ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan        # handlers in copy_reg on import. Since CleanImport doesn't
3276ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan        # revert that registration, the module is left in a broken
3286ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan        # state after reversion. Reinitialising the module contents
3296ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan        # and just reverting os.environ to its previous state is an OK
3306ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan        # workaround
3316ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan        with support.EnvironmentVarGuard():
3326ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan            import os
3336ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan            imp.reload(os)
3346ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan
3356ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan    def test_extension(self):
3366ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan        with support.CleanImport('time'):
3376ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan            import time
3386ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan            imp.reload(time)
3396ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan
3406ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan    def test_builtin(self):
3416ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan        with support.CleanImport('marshal'):
3426ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan            import marshal
3436ead552b47ecc4e7d85a03b3b662c6d46e59bec3Nick Coghlan            imp.reload(marshal)
34413a7a21258f0cd241c2cf1367a954d6742daa2a6Christian Heimes
345056bafe7a663e890594a11eec99c78f742452fffEzio Melotti    def test_with_deleted_parent(self):
346056bafe7a663e890594a11eec99c78f742452fffEzio Melotti        # see #18681
347056bafe7a663e890594a11eec99c78f742452fffEzio Melotti        from html import parser
348b212291b08b8c7beffe8b2dbdd211ded05c84087Serhiy Storchaka        html = sys.modules.pop('html')
349b212291b08b8c7beffe8b2dbdd211ded05c84087Serhiy Storchaka        def cleanup():
350b212291b08b8c7beffe8b2dbdd211ded05c84087Serhiy Storchaka            sys.modules['html'] = html
351056bafe7a663e890594a11eec99c78f742452fffEzio Melotti        self.addCleanup(cleanup)
352056bafe7a663e890594a11eec99c78f742452fffEzio Melotti        with self.assertRaisesRegex(ImportError, 'html'):
353056bafe7a663e890594a11eec99c78f742452fffEzio Melotti            imp.reload(parser)
354056bafe7a663e890594a11eec99c78f742452fffEzio Melotti
35540d20bcf1fccfe8af2393f1aec88ba18e38d0bc1Guido van Rossum
35628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsawclass PEP3147Tests(unittest.TestCase):
35728a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw    """Tests of PEP 3147."""
35828a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw
35928a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw    tag = imp.get_tag()
36028a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw
36119a2f5961ce235e9ca9944069b0f5f21b340de9cBrett Cannon    @unittest.skipUnless(sys.implementation.cache_tag is not None,
36219a2f5961ce235e9ca9944069b0f5f21b340de9cBrett Cannon                         'requires sys.implementation.cache_tag not be None')
36328a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw    def test_cache_from_source(self):
36428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw        # Given the path to a .py file, return the path to its PEP 3147
36528a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw        # defined .pyc file (i.e. under __pycache__).
366410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon        path = os.path.join('foo', 'bar', 'baz', 'qux.py')
367410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon        expect = os.path.join('foo', 'bar', 'baz', '__pycache__',
368410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon                              'qux.{}.pyc'.format(self.tag))
369410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon        self.assertEqual(imp.cache_from_source(path, True), expect)
370410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon
37119a2f5961ce235e9ca9944069b0f5f21b340de9cBrett Cannon    @unittest.skipUnless(sys.implementation.cache_tag is not None,
37219a2f5961ce235e9ca9944069b0f5f21b340de9cBrett Cannon                         'requires sys.implementation.cache_tag to not be '
37319a2f5961ce235e9ca9944069b0f5f21b340de9cBrett Cannon                         'None')
37428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw    def test_source_from_cache(self):
37528a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw        # Given the path to a PEP 3147 defined .pyc file, return the path to
37628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw        # its source.  This tests the good path.
377410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon        path = os.path.join('foo', 'bar', 'baz', '__pycache__',
378410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon                            'qux.{}.pyc'.format(self.tag))
379410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon        expect = os.path.join('foo', 'bar', 'baz', 'qux.py')
380410e88d5fccd85cd2a5ad73c98a8552fa7a0a166Brett Cannon        self.assertEqual(imp.source_from_cache(path), expect)
38128a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw
38228a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw
3831a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinnerclass NullImporterTests(unittest.TestCase):
38409c449c7de0fea077ceaee5cb04017d6994341e7Victor Stinner    @unittest.skipIf(support.TESTFN_UNENCODABLE is None,
3851a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinner                     "Need an undecodeable filename")
3861a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinner    def test_unencodeable(self):
38709c449c7de0fea077ceaee5cb04017d6994341e7Victor Stinner        name = support.TESTFN_UNENCODABLE
3881a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinner        os.mkdir(name)
3891a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinner        try:
3901a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinner            self.assertRaises(ImportError, imp.NullImporter, name)
3911a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinner        finally:
3921a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinner            os.rmdir(name)
3931a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinner
3941a4d12d74681d35a40474790925a8ec9c8069b4eVictor Stinner
3952294c0d4ecd81d01ddf741fff02cc04bd8de0638Neal Norwitzif __name__ == "__main__":
39695ea11fa311b1c7e428e47a5c3f21a279d6aa752Brett Cannon    unittest.main()
397