mirror of
https://github.com/python/cpython.git
synced 2025-11-19 18:47:27 +00:00
Issue #23911: Move path-based bootstrap code to a separate frozen module.
This commit is contained in:
parent
6b4c63dea5
commit
32439d6eb6
27 changed files with 6192 additions and 5712 deletions
|
|
@ -1,7 +1,7 @@
|
|||
# We import importlib *ASAP* in order to test #15386
|
||||
import importlib
|
||||
import importlib.util
|
||||
from importlib._bootstrap import _get_sourcefile
|
||||
from importlib._bootstrap_external import _get_sourcefile
|
||||
import builtins
|
||||
import marshal
|
||||
import os
|
||||
|
|
@ -845,19 +845,27 @@ class ImportlibBootstrapTests(unittest.TestCase):
|
|||
self.assertEqual(mod.__package__, 'importlib')
|
||||
self.assertTrue(mod.__file__.endswith('_bootstrap.py'), mod.__file__)
|
||||
|
||||
def test_frozen_importlib_external_is_bootstrap_external(self):
|
||||
from importlib import _bootstrap_external
|
||||
mod = sys.modules['_frozen_importlib_external']
|
||||
self.assertIs(mod, _bootstrap_external)
|
||||
self.assertEqual(mod.__name__, 'importlib._bootstrap_external')
|
||||
self.assertEqual(mod.__package__, 'importlib')
|
||||
self.assertTrue(mod.__file__.endswith('_bootstrap_external.py'), mod.__file__)
|
||||
|
||||
def test_there_can_be_only_one(self):
|
||||
# Issue #15386 revealed a tricky loophole in the bootstrapping
|
||||
# This test is technically redundant, since the bug caused importing
|
||||
# this test module to crash completely, but it helps prove the point
|
||||
from importlib import machinery
|
||||
mod = sys.modules['_frozen_importlib']
|
||||
self.assertIs(machinery.FileFinder, mod.FileFinder)
|
||||
self.assertIs(machinery.ModuleSpec, mod.ModuleSpec)
|
||||
|
||||
|
||||
@cpython_only
|
||||
class GetSourcefileTests(unittest.TestCase):
|
||||
|
||||
"""Test importlib._bootstrap._get_sourcefile() as used by the C API.
|
||||
"""Test importlib._bootstrap_external._get_sourcefile() as used by the C API.
|
||||
|
||||
Because of the peculiarities of the need of this function, the tests are
|
||||
knowingly whitebox tests.
|
||||
|
|
@ -867,7 +875,7 @@ class GetSourcefileTests(unittest.TestCase):
|
|||
def test_get_sourcefile(self):
|
||||
# Given a valid bytecode path, return the path to the corresponding
|
||||
# source file if it exists.
|
||||
with mock.patch('importlib._bootstrap._path_isfile') as _path_isfile:
|
||||
with mock.patch('importlib._bootstrap_external._path_isfile') as _path_isfile:
|
||||
_path_isfile.return_value = True;
|
||||
path = TESTFN + '.pyc'
|
||||
expect = TESTFN + '.py'
|
||||
|
|
@ -876,7 +884,7 @@ class GetSourcefileTests(unittest.TestCase):
|
|||
def test_get_sourcefile_no_source(self):
|
||||
# Given a valid bytecode path without a corresponding source path,
|
||||
# return the original bytecode path.
|
||||
with mock.patch('importlib._bootstrap._path_isfile') as _path_isfile:
|
||||
with mock.patch('importlib._bootstrap_external._path_isfile') as _path_isfile:
|
||||
_path_isfile.return_value = False;
|
||||
path = TESTFN + '.pyc'
|
||||
self.assertEqual(_get_sourcefile(path), path)
|
||||
|
|
@ -1031,7 +1039,7 @@ class ImportTracebackTests(unittest.TestCase):
|
|||
# We simulate a bug in importlib and check that it's not stripped
|
||||
# away from the traceback.
|
||||
self.create_module("foo", "")
|
||||
importlib = sys.modules['_frozen_importlib']
|
||||
importlib = sys.modules['_frozen_importlib_external']
|
||||
if 'load_module' in vars(importlib.SourceLoader):
|
||||
old_exec_module = importlib.SourceLoader.exec_module
|
||||
else:
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
from importlib import _bootstrap
|
||||
from importlib import _bootstrap_external
|
||||
import sys
|
||||
from test import support
|
||||
import unittest
|
||||
|
|
@ -26,7 +26,7 @@ class ExtensionModuleCaseSensitivityTest:
|
|||
def test_case_sensitive(self):
|
||||
with support.EnvironmentVarGuard() as env:
|
||||
env.unset('PYTHONCASEOK')
|
||||
if b'PYTHONCASEOK' in _bootstrap._os.environ:
|
||||
if b'PYTHONCASEOK' in _bootstrap_external._os.environ:
|
||||
self.skipTest('os.environ changes not reflected in '
|
||||
'_os.environ')
|
||||
loader = self.find_module()
|
||||
|
|
@ -35,7 +35,7 @@ class ExtensionModuleCaseSensitivityTest:
|
|||
def test_case_insensitivity(self):
|
||||
with support.EnvironmentVarGuard() as env:
|
||||
env.set('PYTHONCASEOK', '1')
|
||||
if b'PYTHONCASEOK' not in _bootstrap._os.environ:
|
||||
if b'PYTHONCASEOK' not in _bootstrap_external._os.environ:
|
||||
self.skipTest('os.environ changes not reflected in '
|
||||
'_os.environ')
|
||||
loader = self.find_module()
|
||||
|
|
|
|||
|
|
@ -99,7 +99,7 @@ class FinderTests:
|
|||
new_path_importer_cache.pop(None, None)
|
||||
new_path_hooks = [zipimport.zipimporter,
|
||||
self.machinery.FileFinder.path_hook(
|
||||
*self.importlib._bootstrap._get_supported_file_loaders())]
|
||||
*self.importlib._bootstrap_external._get_supported_file_loaders())]
|
||||
missing = object()
|
||||
email = sys.modules.pop('email', missing)
|
||||
try:
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ class CaseSensitivityTest:
|
|||
def test_sensitive(self):
|
||||
with test_support.EnvironmentVarGuard() as env:
|
||||
env.unset('PYTHONCASEOK')
|
||||
if b'PYTHONCASEOK' in self.importlib._bootstrap._os.environ:
|
||||
if b'PYTHONCASEOK' in self.importlib._bootstrap_external._os.environ:
|
||||
self.skipTest('os.environ changes not reflected in '
|
||||
'_os.environ')
|
||||
sensitive, insensitive = self.sensitivity_test()
|
||||
|
|
@ -53,7 +53,7 @@ class CaseSensitivityTest:
|
|||
def test_insensitive(self):
|
||||
with test_support.EnvironmentVarGuard() as env:
|
||||
env.set('PYTHONCASEOK', '1')
|
||||
if b'PYTHONCASEOK' not in self.importlib._bootstrap._os.environ:
|
||||
if b'PYTHONCASEOK' not in self.importlib._bootstrap_external._os.environ:
|
||||
self.skipTest('os.environ changes not reflected in '
|
||||
'_os.environ')
|
||||
sensitive, insensitive = self.sensitivity_test()
|
||||
|
|
|
|||
|
|
@ -355,8 +355,10 @@ class ImportSideEffectTests(unittest.TestCase):
|
|||
stdout, stderr = proc.communicate()
|
||||
self.assertEqual(proc.returncode, 0)
|
||||
os__file__, os__cached__ = stdout.splitlines()[:2]
|
||||
self.assertTrue(os.path.isabs(os__file__))
|
||||
self.assertTrue(os.path.isabs(os__cached__))
|
||||
self.assertTrue(os.path.isabs(os__file__),
|
||||
"expected absolute path, got {}".format(os__file__))
|
||||
self.assertTrue(os.path.isabs(os__cached__),
|
||||
"expected absolute path, got {}".format(os__cached__))
|
||||
|
||||
def test_no_duplicate_paths(self):
|
||||
# No duplicate paths should exist in sys.path
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue