Issue #19718: Add a case-insensitive FS check to test.support to use

in test_pathlib.

Purposefully designed to work from a specified directory in case
multiple file systems are used on the system.
This commit is contained in:
Brett Cannon 2013-11-22 16:14:10 -05:00
parent aa40775817
commit fe77f4ebb5
2 changed files with 21 additions and 3 deletions

View File

@ -76,7 +76,7 @@ __all__ = [
"captured_stdin", "captured_stderr", "captured_stdin", "captured_stderr",
# filesystem # filesystem
"TESTFN", "SAVEDCWD", "unlink", "rmtree", "temp_cwd", "findfile", "TESTFN", "SAVEDCWD", "unlink", "rmtree", "temp_cwd", "findfile",
"create_empty_file", "can_symlink", "create_empty_file", "can_symlink", "fs_is_case_insensitive",
# unittest # unittest
"is_resource_enabled", "requires", "requires_freebsd_version", "is_resource_enabled", "requires", "requires_freebsd_version",
"requires_linux_version", "requires_mac_ver", "check_syntax_error", "requires_linux_version", "requires_mac_ver", "check_syntax_error",
@ -2045,6 +2045,20 @@ def skip_unless_xattr(test):
return test if ok else unittest.skip(msg)(test) return test if ok else unittest.skip(msg)(test)
def fs_is_case_insensitive(directory):
"""Detects if the file system for the specified directory is case-insensitive."""
base_fp, base_path = tempfile.mkstemp(dir=directory)
case_path = base_path.upper()
if case_path == base_path:
case_path = base_path.lower()
try:
return os.path.samefile(base_path, case_path)
except FileNotFoundError:
return False
finally:
os.unlink(base_path)
class SuppressCrashReport: class SuppressCrashReport:
"""Try to prevent a crash report from popping up. """Try to prevent a crash report from popping up.

View File

@ -1623,12 +1623,16 @@ class PosixPathTest(_BasePathTest, unittest.TestCase):
def test_glob(self): def test_glob(self):
P = self.cls P = self.cls
p = P(BASE) p = P(BASE)
self.assertEqual(set(p.glob("FILEa")), set()) given = set(p.glob("FILEa"))
expect = set() if not support.fs_is_case_insensitive(BASE) else given
self.assertEqual(given, expect)
def test_rglob(self): def test_rglob(self):
P = self.cls P = self.cls
p = P(BASE, "dirC") p = P(BASE, "dirC")
self.assertEqual(set(p.rglob("FILEd")), set()) given = set(p.rglob("FILEd"))
expect = set() if not support.fs_is_case_insensitive(BASE) else given
self.assertEqual(given, expect)
@only_nt @only_nt