Kaydet (Commit) 4106f61c authored tarafından Brett Cannon's avatar Brett Cannon

Merge for #27083

...@@ -21,16 +21,22 @@ work. One should use importlib as the public-facing version of this module. ...@@ -21,16 +21,22 @@ work. One should use importlib as the public-facing version of this module.
# anything specified at the class level. # anything specified at the class level.
# Bootstrap-related code ###################################################### # Bootstrap-related code ######################################################
_CASE_INSENSITIVE_PLATFORMS_STR_KEY = 'win',
_CASE_INSENSITIVE_PLATFORMS = 'win', 'cygwin', 'darwin' _CASE_INSENSITIVE_PLATFORMS_BYTES_KEY = 'cygwin', 'darwin'
_CASE_INSENSITIVE_PLATFORMS = (_CASE_INSENSITIVE_PLATFORMS_BYTES_KEY
+ _CASE_INSENSITIVE_PLATFORMS_STR_KEY)
def _make_relax_case(): def _make_relax_case():
if sys.platform.startswith(_CASE_INSENSITIVE_PLATFORMS): if sys.platform.startswith(_CASE_INSENSITIVE_PLATFORMS):
if sys.platform.startswith(_CASE_INSENSITIVE_PLATFORMS_STR_KEY):
key = 'PYTHONCASEOK'
else:
key = b'PYTHONCASEOK'
def _relax_case(): def _relax_case():
"""True if filenames must be checked case-insensitively.""" """True if filenames must be checked case-insensitively."""
return (b'PYTHONCASEOK' in _os.environ return key in _os.environ
or 'PYTHONCASEOK' in _os.environ)
else: else:
def _relax_case(): def _relax_case():
"""True if filenames must be checked case-insensitively.""" """True if filenames must be checked case-insensitively."""
......
...@@ -4,12 +4,13 @@ import unittest ...@@ -4,12 +4,13 @@ import unittest
from .. import util from .. import util
importlib = util.import_importlib('importlib')
machinery = util.import_importlib('importlib.machinery') machinery = util.import_importlib('importlib.machinery')
@unittest.skipIf(util.EXTENSIONS.filename is None, '_testcapi not available') @unittest.skipIf(util.EXTENSIONS.filename is None, '_testcapi not available')
@util.case_insensitive_tests @util.case_insensitive_tests
class ExtensionModuleCaseSensitivityTest: class ExtensionModuleCaseSensitivityTest(util.CASEOKTestBase):
def find_module(self): def find_module(self):
good_name = util.EXTENSIONS.name good_name = util.EXTENSIONS.name
...@@ -23,25 +24,22 @@ class ExtensionModuleCaseSensitivityTest: ...@@ -23,25 +24,22 @@ class ExtensionModuleCaseSensitivityTest:
def test_case_sensitive(self): def test_case_sensitive(self):
with support.EnvironmentVarGuard() as env: with support.EnvironmentVarGuard() as env:
env.unset('PYTHONCASEOK') env.unset('PYTHONCASEOK')
if b'PYTHONCASEOK' in _bootstrap_external._os.environ: self.caseok_env_changed(should_exist=False)
self.skipTest('os.environ changes not reflected in '
'_os.environ')
loader = self.find_module() loader = self.find_module()
self.assertIsNone(loader) self.assertIsNone(loader)
def test_case_insensitivity(self): def test_case_insensitivity(self):
with support.EnvironmentVarGuard() as env: with support.EnvironmentVarGuard() as env:
env.set('PYTHONCASEOK', '1') env.set('PYTHONCASEOK', '1')
if b'PYTHONCASEOK' not in _bootstrap_external._os.environ: self.caseok_env_changed(should_exist=True)
self.skipTest('os.environ changes not reflected in '
'_os.environ')
loader = self.find_module() loader = self.find_module()
self.assertTrue(hasattr(loader, 'load_module')) self.assertTrue(hasattr(loader, 'load_module'))
(Frozen_ExtensionCaseSensitivity, (Frozen_ExtensionCaseSensitivity,
Source_ExtensionCaseSensitivity Source_ExtensionCaseSensitivity
) = util.test_both(ExtensionModuleCaseSensitivityTest, machinery=machinery) ) = util.test_both(ExtensionModuleCaseSensitivityTest, importlib=importlib,
machinery=machinery)
if __name__ == '__main__': if __name__ == '__main__':
......
...@@ -10,7 +10,7 @@ import unittest ...@@ -10,7 +10,7 @@ import unittest
@util.case_insensitive_tests @util.case_insensitive_tests
class CaseSensitivityTest: class CaseSensitivityTest(util.CASEOKTestBase):
"""PEP 235 dictates that on case-preserving, case-insensitive file systems """PEP 235 dictates that on case-preserving, case-insensitive file systems
that imports are case-sensitive unless the PYTHONCASEOK environment that imports are case-sensitive unless the PYTHONCASEOK environment
...@@ -38,17 +38,10 @@ class CaseSensitivityTest: ...@@ -38,17 +38,10 @@ class CaseSensitivityTest:
insensitive_finder = self.finder(insensitive_path) insensitive_finder = self.finder(insensitive_path)
return self.find(sensitive_finder), self.find(insensitive_finder) return self.find(sensitive_finder), self.find(insensitive_finder)
def env_changed(self, *, should_exist):
possibilities = b'PYTHONCASEOK', 'PYTHONCASEOK'
if any(x in self.importlib._bootstrap_external._os.environ
for x in possibilities) == should_exist:
self.skipTest('os.environ changes not reflected in '
'_os.environ')
def test_sensitive(self): def test_sensitive(self):
with test_support.EnvironmentVarGuard() as env: with test_support.EnvironmentVarGuard() as env:
env.unset('PYTHONCASEOK') env.unset('PYTHONCASEOK')
self.env_changed(should_exist=False) self.caseok_env_changed(should_exist=False)
sensitive, insensitive = self.sensitivity_test() sensitive, insensitive = self.sensitivity_test()
self.assertIsNotNone(sensitive) self.assertIsNotNone(sensitive)
self.assertIn(self.name, sensitive.get_filename(self.name)) self.assertIn(self.name, sensitive.get_filename(self.name))
...@@ -57,7 +50,7 @@ class CaseSensitivityTest: ...@@ -57,7 +50,7 @@ class CaseSensitivityTest:
def test_insensitive(self): def test_insensitive(self):
with test_support.EnvironmentVarGuard() as env: with test_support.EnvironmentVarGuard() as env:
env.set('PYTHONCASEOK', '1') env.set('PYTHONCASEOK', '1')
self.env_changed(should_exist=True) self.caseok_env_changed(should_exist=True)
sensitive, insensitive = self.sensitivity_test() sensitive, insensitive = self.sensitivity_test()
self.assertIsNotNone(sensitive) self.assertIsNotNone(sensitive)
self.assertIn(self.name, sensitive.get_filename(self.name)) self.assertIn(self.name, sensitive.get_filename(self.name))
......
...@@ -377,3 +377,12 @@ def mock_path_hook(*entries, importer): ...@@ -377,3 +377,12 @@ def mock_path_hook(*entries, importer):
raise ImportError raise ImportError
return importer return importer
return hook return hook
class CASEOKTestBase:
def caseok_env_changed(self, *, should_exist):
possibilities = b'PYTHONCASEOK', 'PYTHONCASEOK'
if any(x in self.importlib._bootstrap_external._os.environ
for x in possibilities) != should_exist:
self.skipTest('os.environ changes not reflected in _os.environ')
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment