Commit 4d5562b4 authored by Meador Inge's avatar Meador Inge

Issue #16826: Don't check for PYTHONCASEOK when using -E.

This commit fixes a regression that sneaked into Python 3.3 where importlib
was not respecting -E when checking for the PYTHONCASEOK environment variable.
parent e8a28510
...@@ -33,6 +33,9 @@ def _make_relax_case(): ...@@ -33,6 +33,9 @@ def _make_relax_case():
if sys.platform.startswith(_CASE_INSENSITIVE_PLATFORMS): if sys.platform.startswith(_CASE_INSENSITIVE_PLATFORMS):
def _relax_case(): def _relax_case():
"""True if filenames must be checked case-insensitively.""" """True if filenames must be checked case-insensitively."""
if sys.flags.ignore_environment:
return False
else:
return b'PYTHONCASEOK' in _os.environ return b'PYTHONCASEOK' in _os.environ
else: else:
def _relax_case(): def _relax_case():
......
...@@ -5,7 +5,8 @@ import unittest ...@@ -5,7 +5,8 @@ import unittest
from importlib import _bootstrap from importlib import _bootstrap
from .. import util from .. import util
from . import util as ext_util from . import util as ext_util
import os
import subprocess
@util.case_insensitive_tests @util.case_insensitive_tests
class ExtensionModuleCaseSensitivityTest(unittest.TestCase): class ExtensionModuleCaseSensitivityTest(unittest.TestCase):
...@@ -29,14 +30,34 @@ class ExtensionModuleCaseSensitivityTest(unittest.TestCase): ...@@ -29,14 +30,34 @@ class ExtensionModuleCaseSensitivityTest(unittest.TestCase):
self.assertIsNone(loader) self.assertIsNone(loader)
def test_case_insensitivity(self): def test_case_insensitivity(self):
with support.EnvironmentVarGuard() as env: find_snippet = """if True:
env.set('PYTHONCASEOK', '1') from importlib import _bootstrap
if b'PYTHONCASEOK' not in _bootstrap._os.environ: import sys
self.skipTest('os.environ changes not reflected in ' finder = _bootstrap.FileFinder('{path}',
'_os.environ') (_bootstrap.ExtensionFileLoader,
loader = self.find_module() _bootstrap.EXTENSION_SUFFIXES))
self.assertTrue(hasattr(loader, 'load_module')) loader = finder.find_module('{bad_name}')
print(str(hasattr(loader, 'load_module')))
""".format(bad_name=ext_util.NAME.upper(), path=ext_util.PATH)
newenv = os.environ.copy()
newenv["PYTHONCASEOK"] = "1"
def check_output(expected, extra_arg=None):
args = [sys.executable]
if extra_arg:
args.append(extra_arg)
args.extend(["-c", find_snippet])
p = subprocess.Popen(args, stdout=subprocess.PIPE, env=newenv)
actual = p.communicate()[0].decode().strip()
self.assertEqual(expected, actual)
self.assertEqual(p.wait(), 0)
# Test with PYTHONCASEOK=1.
check_output("True")
# Test with PYTHONCASEOK=1 ignored because of -E.
check_output("False", "-E")
......
...@@ -8,6 +8,7 @@ import os ...@@ -8,6 +8,7 @@ import os
import sys import sys
from test import support as test_support from test import support as test_support
import unittest import unittest
import subprocess
@util.case_insensitive_tests @util.case_insensitive_tests
...@@ -50,16 +51,62 @@ class CaseSensitivityTest(unittest.TestCase): ...@@ -50,16 +51,62 @@ class CaseSensitivityTest(unittest.TestCase):
self.assertIsNone(insensitive) self.assertIsNone(insensitive)
def test_insensitive(self): def test_insensitive(self):
with test_support.EnvironmentVarGuard() as env: sensitive_pkg = 'sensitive.{0}'.format(self.name)
env.set('PYTHONCASEOK', '1') insensitive_pkg = 'insensitive.{0}'.format(self.name.lower())
if b'PYTHONCASEOK' not in _bootstrap._os.environ: context = source_util.create_modules(insensitive_pkg, sensitive_pkg)
self.skipTest('os.environ changes not reflected in ' with context as mapping:
'_os.environ') sensitive_path = os.path.join(mapping['.root'], 'sensitive')
sensitive, insensitive = self.sensitivity_test() insensitive_path = os.path.join(mapping['.root'], 'insensitive')
self.assertTrue(hasattr(sensitive, 'load_module')) find_snippet = """if True:
self.assertIn(self.name, sensitive.get_filename(self.name)) import sys
self.assertTrue(hasattr(insensitive, 'load_module')) from importlib import machinery
self.assertIn(self.name, insensitive.get_filename(self.name))
def find(path):
f = machinery.FileFinder(path,
(machinery.SourceFileLoader,
machinery.SOURCE_SUFFIXES),
(machinery.SourcelessFileLoader,
machinery.BYTECODE_SUFFIXES))
return f.find_module('{name}')
sensitive = find('{sensitive_path}')
insensitive = find('{insensitive_path}')
print(str(hasattr(sensitive, 'load_module')))
if hasattr(sensitive, 'load_module'):
print(sensitive.get_filename('{name}'))
else:
print('None')
print(str(hasattr(insensitive, 'load_module')))
if hasattr(insensitive, 'load_module'):
print(insensitive.get_filename('{name}'))
else:
print('None')
""".format(sensitive_path=sensitive_path,
insensitive_path=insensitive_path,
name=self.name)
newenv = os.environ.copy()
newenv["PYTHONCASEOK"] = "1"
def check_output(expected, extra_arg=None):
args = [sys.executable]
if extra_arg:
args.append(extra_arg)
args.extend(["-c", find_snippet])
p = subprocess.Popen(args, stdout=subprocess.PIPE,
env=newenv)
actual = p.communicate()[0].decode().split()
self.assertEqual(expected[0], actual[0])
self.assertIn(expected[1], actual[1])
self.assertEqual(expected[2], actual[2])
self.assertIn(expected[3], actual[3])
self.assertEqual(p.wait(), 0)
# Test with PYTHONCASEOK=1.
check_output(["True", self.name, "True", self.name])
# Test with PYTHONCASEOK=1 ignored because of -E.
check_output(["True", self.name, "False", "None"], "-E")
def test_main(): def test_main():
......
...@@ -66,6 +66,8 @@ Core and Builtins ...@@ -66,6 +66,8 @@ Core and Builtins
Library Library
------- -------
- Issue #16826: Don't check for PYTHONCASEOK if interpreter started with -E.
- Issue #18418: After fork(), reinit all threads states, not only active ones. - Issue #18418: After fork(), reinit all threads states, not only active ones.
Patch by A. Jesse Jiryu Davis. Patch by A. Jesse Jiryu Davis.
......
This source diff could not be displayed because it is too large. You can view the blob instead.
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