1"""Test case-sensitivity (PEP 235).""" 2import sys 3 4from test.test_importlib import util 5 6importlib = util.import_importlib('importlib') 7machinery = util.import_importlib('importlib.machinery') 8 9import os 10from test.support import os_helper 11import unittest 12import warnings 13 14 15@util.case_insensitive_tests 16class CaseSensitivityTest(util.CASEOKTestBase): 17 18 """PEP 235 dictates that on case-preserving, case-insensitive file systems 19 that imports are case-sensitive unless the PYTHONCASEOK environment 20 variable is set.""" 21 22 name = 'MoDuLe' 23 assert name != name.lower() 24 25 def finder(self, path): 26 return self.machinery.FileFinder(path, 27 (self.machinery.SourceFileLoader, 28 self.machinery.SOURCE_SUFFIXES), 29 (self.machinery.SourcelessFileLoader, 30 self.machinery.BYTECODE_SUFFIXES)) 31 32 def sensitivity_test(self): 33 """Look for a module with matching and non-matching sensitivity.""" 34 sensitive_pkg = 'sensitive.{0}'.format(self.name) 35 insensitive_pkg = 'insensitive.{0}'.format(self.name.lower()) 36 context = util.create_modules(insensitive_pkg, sensitive_pkg) 37 with context as mapping: 38 sensitive_path = os.path.join(mapping['.root'], 'sensitive') 39 insensitive_path = os.path.join(mapping['.root'], 'insensitive') 40 sensitive_finder = self.finder(sensitive_path) 41 insensitive_finder = self.finder(insensitive_path) 42 return self.find(sensitive_finder), self.find(insensitive_finder) 43 44 @unittest.skipIf(sys.flags.ignore_environment, 'ignore_environment flag was set') 45 def test_sensitive(self): 46 with os_helper.EnvironmentVarGuard() as env: 47 env.unset('PYTHONCASEOK') 48 self.caseok_env_changed(should_exist=False) 49 sensitive, insensitive = self.sensitivity_test() 50 self.assertIsNotNone(sensitive) 51 self.assertIn(self.name, sensitive.get_filename(self.name)) 52 self.assertIsNone(insensitive) 53 54 @unittest.skipIf(sys.flags.ignore_environment, 'ignore_environment flag was set') 55 def test_insensitive(self): 56 with os_helper.EnvironmentVarGuard() as env: 57 env.set('PYTHONCASEOK', '1') 58 self.caseok_env_changed(should_exist=True) 59 sensitive, insensitive = self.sensitivity_test() 60 self.assertIsNotNone(sensitive) 61 self.assertIn(self.name, sensitive.get_filename(self.name)) 62 self.assertIsNotNone(insensitive) 63 self.assertIn(self.name, insensitive.get_filename(self.name)) 64 65 66class CaseSensitivityTestPEP302(CaseSensitivityTest): 67 def find(self, finder): 68 with warnings.catch_warnings(): 69 warnings.simplefilter("ignore", DeprecationWarning) 70 return finder.find_module(self.name) 71 72 73(Frozen_CaseSensitivityTestPEP302, 74 Source_CaseSensitivityTestPEP302 75 ) = util.test_both(CaseSensitivityTestPEP302, importlib=importlib, 76 machinery=machinery) 77 78 79class CaseSensitivityTestPEP451(CaseSensitivityTest): 80 def find(self, finder): 81 found = finder.find_spec(self.name) 82 return found.loader if found is not None else found 83 84 85(Frozen_CaseSensitivityTestPEP451, 86 Source_CaseSensitivityTestPEP451 87 ) = util.test_both(CaseSensitivityTestPEP451, importlib=importlib, 88 machinery=machinery) 89 90 91if __name__ == '__main__': 92 unittest.main() 93