1f254a75176928e1d1228a5d20d49fbe2fe9f290aBrett Cannonfrom .. import abc
29ea8eda127b824f9cffb64deadbb420244a301c2Brett Cannonfrom .. import util
3fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon
49ea8eda127b824f9cffb64deadbb420244a301c2Brett Cannonmachinery = util.import_importlib('importlib.machinery')
59ea8eda127b824f9cffb64deadbb420244a301c2Brett Cannon
628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsawimport errno
7fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannonimport os
823cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannonimport py_compile
9a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannonimport stat
10a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannonimport sys
11a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannonimport tempfile
12fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannonfrom test.support import make_legacy_pyc
1323cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannonimport unittest
1423cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannonimport warnings
1523cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon
1623cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon
179ea8eda127b824f9cffb64deadbb420244a301c2Brett Cannonclass FinderTests(abc.FinderTests):
1823cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon
1923cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon    """For a top-level module, it should just be found directly in the
2023cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon    directory being searched. This is true for a directory with source
2123cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon    [top-level source], bytecode [top-level bc], or both [top-level both].
2223cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon    There is also the possibility that it is a package [top-level package], in
2323cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon    which case there will be a directory with the module name and an
2423cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon    __init__.py file. If there is a directory without an __init__.py an
2523cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon    ImportWarning is returned [empty dir].
2623cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon
2723cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon    For sub-modules and sub-packages, the same happens as above but only use
2823cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon    the tail end of the name [sub module] [sub package] [sub empty].
2923cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon
3023cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon    When there is a conflict between a package and module having the same name
3123cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon    in the same directory, the package wins out [package over module]. This is
3223cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon    so that imports of modules within the package can occur rather than trigger
3323cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon    an import error.
3423cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon
3523cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon    When there is a package and module with the same name, always pick the
3623cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon    package over the module [package over module]. This is so that imports from
3723cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon    the package have the possibility of succeeding.
3823cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon
3923cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon    """
4023cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon
4148fec0539157db38a993ededb32a8f312ec09fb9Nick Coghlan    def get_finder(self, root):
429ea8eda127b824f9cffb64deadbb420244a301c2Brett Cannon        loader_details = [(self.machinery.SourceFileLoader,
439ea8eda127b824f9cffb64deadbb420244a301c2Brett Cannon                            self.machinery.SOURCE_SUFFIXES),
449ea8eda127b824f9cffb64deadbb420244a301c2Brett Cannon                          (self.machinery.SourcelessFileLoader,
459ea8eda127b824f9cffb64deadbb420244a301c2Brett Cannon                            self.machinery.BYTECODE_SUFFIXES)]
469ea8eda127b824f9cffb64deadbb420244a301c2Brett Cannon        return self.machinery.FileFinder(root, *loader_details)
4748fec0539157db38a993ededb32a8f312ec09fb9Nick Coghlan
481500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow    def import_(self, root, module):
491500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow        finder = self.get_finder(root)
501500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow        return self._find(finder, module, loader_only=True)
511500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow
5223cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon    def run_test(self, test, create=None, *, compile_=None, unlink=None):
5323cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon        """Test the finding of 'test' with the creation of modules listed in
5423cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon        'create'.
5523cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon
5623cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon        Any names listed in 'compile_' are byte-compiled. Modules
5723cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon        listed in 'unlink' have their source files deleted.
5823cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon
5923cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon        """
6023cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon        if create is None:
6123cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon            create = {test}
62732ac654c8a3e5f9048a53efaee7380e1775a630Brett Cannon        with util.create_modules(*create) as mapping:
6323cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon            if compile_:
6423cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon                for name in compile_:
6523cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon                    py_compile.compile(mapping[name])
6623cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon            if unlink:
6723cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon                for name in unlink:
6823cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon                    os.unlink(mapping[name])
6928a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw                    try:
7028a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw                        make_legacy_pyc(mapping[name])
7128a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw                    except OSError as error:
7228a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw                        # Some tests do not set compile_=True so the source
7328a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw                        # module will not get compiled and there will be no
7428a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw                        # PEP 3147 pyc file to rename.
7528a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw                        if error.errno != errno.ENOENT:
7628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw                            raise
7723cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon            loader = self.import_(mapping['.root'], test)
78c9c0f201fed21efcf669dbbf5f923eaf0eeb1db9Benjamin Peterson            self.assertTrue(hasattr(loader, 'load_module'))
7923cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon            return loader
8023cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon
8123cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon    def test_module(self):
8223cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon        # [top-level source]
8323cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon        self.run_test('top_level')
8423cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon        # [top-level bc]
8528a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw        self.run_test('top_level', compile_={'top_level'},
8628a691b7fdde1b8abafa4c4a5025e6bfa44f48b9Barry Warsaw                      unlink={'top_level'})
8723cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon        # [top-level both]
8823cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon        self.run_test('top_level', compile_={'top_level'})
8923cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon
9023cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon    # [top-level package]
9123cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon    def test_package(self):
9223cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon        # Source.
9323cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon        self.run_test('pkg', {'pkg.__init__'})
9423cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon        # Bytecode.
9523cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon        self.run_test('pkg', {'pkg.__init__'}, compile_={'pkg.__init__'},
9623cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon                unlink={'pkg.__init__'})
9723cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon        # Both.
9823cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon        self.run_test('pkg', {'pkg.__init__'}, compile_={'pkg.__init__'})
9923cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon
10023cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon    # [sub module]
10123cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon    def test_module_in_package(self):
102732ac654c8a3e5f9048a53efaee7380e1775a630Brett Cannon        with util.create_modules('pkg.__init__', 'pkg.sub') as mapping:
10323cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon            pkg_dir = os.path.dirname(mapping['pkg.__init__'])
10423cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon            loader = self.import_(pkg_dir, 'pkg.sub')
105c9c0f201fed21efcf669dbbf5f923eaf0eeb1db9Benjamin Peterson            self.assertTrue(hasattr(loader, 'load_module'))
10623cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon
10723cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon    # [sub package]
10823cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon    def test_package_in_package(self):
109732ac654c8a3e5f9048a53efaee7380e1775a630Brett Cannon        context = util.create_modules('pkg.__init__', 'pkg.sub.__init__')
11023cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon        with context as mapping:
11123cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon            pkg_dir = os.path.dirname(mapping['pkg.__init__'])
11223cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon            loader = self.import_(pkg_dir, 'pkg.sub')
113c9c0f201fed21efcf669dbbf5f923eaf0eeb1db9Benjamin Peterson            self.assertTrue(hasattr(loader, 'load_module'))
11423cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon
11523cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon    # [package over modules]
11623cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon    def test_package_over_module(self):
11723cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon        name = '_temp'
11823cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon        loader = self.run_test(name, {'{0}.__init__'.format(name), name})
119e51a36922ffcce8c5e45cc88dc95a9d33ead0f11Eric V. Smith        self.assertIn('__init__', loader.get_filename(name))
12023cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon
12123cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon    def test_failure(self):
122732ac654c8a3e5f9048a53efaee7380e1775a630Brett Cannon        with util.create_modules('blah') as mapping:
12323cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon            nothing = self.import_(mapping['.root'], 'sdfsadsadf')
124b10951549b5f49849d44cdbac02c35146d5d05d3Eric V. Smith            self.assertIsNone(nothing)
12523cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon
126d71bed3d76cc90dac24f88197bd37fdc2063330dBrett Cannon    def test_empty_string_for_dir(self):
127d71bed3d76cc90dac24f88197bd37fdc2063330dBrett Cannon        # The empty string from sys.path means to search in the cwd.
1289ea8eda127b824f9cffb64deadbb420244a301c2Brett Cannon        finder = self.machinery.FileFinder('', (self.machinery.SourceFileLoader,
1299ea8eda127b824f9cffb64deadbb420244a301c2Brett Cannon            self.machinery.SOURCE_SUFFIXES))
130d71bed3d76cc90dac24f88197bd37fdc2063330dBrett Cannon        with open('mod.py', 'w') as file:
131d71bed3d76cc90dac24f88197bd37fdc2063330dBrett Cannon            file.write("# test file for importlib")
132d71bed3d76cc90dac24f88197bd37fdc2063330dBrett Cannon        try:
1331500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow            loader = self._find(finder, 'mod', loader_only=True)
134d71bed3d76cc90dac24f88197bd37fdc2063330dBrett Cannon            self.assertTrue(hasattr(loader, 'load_module'))
135d71bed3d76cc90dac24f88197bd37fdc2063330dBrett Cannon        finally:
136d71bed3d76cc90dac24f88197bd37fdc2063330dBrett Cannon            os.unlink('mod.py')
137d71bed3d76cc90dac24f88197bd37fdc2063330dBrett Cannon
138b46a1793a787747d59e735e12471b3a309aa51daBrett Cannon    def test_invalidate_caches(self):
139b46a1793a787747d59e735e12471b3a309aa51daBrett Cannon        # invalidate_caches() should reset the mtime.
1409ea8eda127b824f9cffb64deadbb420244a301c2Brett Cannon        finder = self.machinery.FileFinder('', (self.machinery.SourceFileLoader,
1419ea8eda127b824f9cffb64deadbb420244a301c2Brett Cannon            self.machinery.SOURCE_SUFFIXES))
142b46a1793a787747d59e735e12471b3a309aa51daBrett Cannon        finder._path_mtime = 42
143b46a1793a787747d59e735e12471b3a309aa51daBrett Cannon        finder.invalidate_caches()
144b46a1793a787747d59e735e12471b3a309aa51daBrett Cannon        self.assertEqual(finder._path_mtime, -1)
145b46a1793a787747d59e735e12471b3a309aa51daBrett Cannon
14648fec0539157db38a993ededb32a8f312ec09fb9Nick Coghlan    # Regression test for http://bugs.python.org/issue14846
14748fec0539157db38a993ededb32a8f312ec09fb9Nick Coghlan    def test_dir_removal_handling(self):
14848fec0539157db38a993ededb32a8f312ec09fb9Nick Coghlan        mod = 'mod'
149732ac654c8a3e5f9048a53efaee7380e1775a630Brett Cannon        with util.create_modules(mod) as mapping:
15048fec0539157db38a993ededb32a8f312ec09fb9Nick Coghlan            finder = self.get_finder(mapping['.root'])
1511500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow            found = self._find(finder, 'mod', loader_only=True)
1521500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow            self.assertIsNotNone(found)
1531500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow        found = self._find(finder, 'mod', loader_only=True)
1541500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow        self.assertIsNone(found)
15523cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon
156a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon    @unittest.skipUnless(sys.platform != 'win32',
157a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon            'os.chmod() does not support the needed arguments under Windows')
158a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon    def test_no_read_directory(self):
159a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon        # Issue #16730
160a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon        tempdir = tempfile.TemporaryDirectory()
161a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon        original_mode = os.stat(tempdir.name).st_mode
162a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon        def cleanup(tempdir):
163a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon            """Cleanup function for the temporary directory.
164a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon
165a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon            Since we muck with the permissions, we want to set them back to
166a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon            their original values to make sure the directory can be properly
167a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon            cleaned up.
168a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon
169a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon            """
170a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon            os.chmod(tempdir.name, original_mode)
171a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon            # If this is not explicitly called then the __del__ method is used,
172a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon            # but since already mucking around might as well explicitly clean
173a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon            # up.
174a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon            tempdir.__exit__(None, None, None)
175a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon        self.addCleanup(cleanup, tempdir)
176a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon        os.chmod(tempdir.name, stat.S_IWUSR | stat.S_IXUSR)
177a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon        finder = self.get_finder(tempdir.name)
1781500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow        found = self._find(finder, 'doesnotexist')
1791500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow        self.assertEqual(found, self.NOT_FOUND)
180a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon
181a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon    def test_ignore_file(self):
182a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon        # If a directory got changed to a file from underneath us, then don't
183a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon        # worry about looking for submodules.
184a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon        with tempfile.NamedTemporaryFile() as file_obj:
185a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon            finder = self.get_finder(file_obj.name)
1861500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow            found = self._find(finder, 'doesnotexist')
1871500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow            self.assertEqual(found, self.NOT_FOUND)
1881500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow
189a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon
1902f8c83568ca5850601e92e315c4a1c840e94b1cbBrett Cannonclass FinderTestsPEP451(FinderTests):
1912f8c83568ca5850601e92e315c4a1c840e94b1cbBrett Cannon
1921500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow    NOT_FOUND = None
1931500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow
1941500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow    def _find(self, finder, name, loader_only=False):
1951500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow        spec = finder.find_spec(name)
1961500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow        return spec.loader if spec is not None else spec
1972f8c83568ca5850601e92e315c4a1c840e94b1cbBrett Cannon
1983497c0bf957be33c6794a4548cfa53dbb0f9b5dfEric Snow
1993497c0bf957be33c6794a4548cfa53dbb0f9b5dfEric Snow(Frozen_FinderTestsPEP451,
2003497c0bf957be33c6794a4548cfa53dbb0f9b5dfEric Snow Source_FinderTestsPEP451
2013497c0bf957be33c6794a4548cfa53dbb0f9b5dfEric Snow ) = util.test_both(FinderTestsPEP451, machinery=machinery)
2022f8c83568ca5850601e92e315c4a1c840e94b1cbBrett Cannon
2032f8c83568ca5850601e92e315c4a1c840e94b1cbBrett Cannon
2041500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snowclass FinderTestsPEP420(FinderTests):
2051500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow
2061500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow    NOT_FOUND = (None, [])
2071500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow
2081500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow    def _find(self, finder, name, loader_only=False):
2091500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow        with warnings.catch_warnings():
2101500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow            warnings.simplefilter("ignore", DeprecationWarning)
2111500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow            loader_portions = finder.find_loader(name)
2121500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow            return loader_portions[0] if loader_only else loader_portions
2131500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow
2143497c0bf957be33c6794a4548cfa53dbb0f9b5dfEric Snow
2153497c0bf957be33c6794a4548cfa53dbb0f9b5dfEric Snow(Frozen_FinderTestsPEP420,
2163497c0bf957be33c6794a4548cfa53dbb0f9b5dfEric Snow Source_FinderTestsPEP420
2173497c0bf957be33c6794a4548cfa53dbb0f9b5dfEric Snow ) = util.test_both(FinderTestsPEP420, machinery=machinery)
2181500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow
2191500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow
2202f8c83568ca5850601e92e315c4a1c840e94b1cbBrett Cannonclass FinderTestsPEP302(FinderTests):
2212f8c83568ca5850601e92e315c4a1c840e94b1cbBrett Cannon
2221500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow    NOT_FOUND = None
2231500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow
2241500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow    def _find(self, finder, name, loader_only=False):
2251500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow        with warnings.catch_warnings():
2261500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow            warnings.simplefilter("ignore", DeprecationWarning)
2271500d49c22e1a38d186f2dddfa6ba2c5a6cd7d5eEric Snow            return finder.find_module(name)
2282f8c83568ca5850601e92e315c4a1c840e94b1cbBrett Cannon
229a9976b3e32b612e33dc9f6d8874a88d028de7424Brett Cannon
2303497c0bf957be33c6794a4548cfa53dbb0f9b5dfEric Snow(Frozen_FinderTestsPEP302,
2313497c0bf957be33c6794a4548cfa53dbb0f9b5dfEric Snow Source_FinderTestsPEP302
2323497c0bf957be33c6794a4548cfa53dbb0f9b5dfEric Snow ) = util.test_both(FinderTestsPEP302, machinery=machinery)
23323cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon
23423cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon
23523cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannonif __name__ == '__main__':
2369ea8eda127b824f9cffb64deadbb420244a301c2Brett Cannon    unittest.main()
237