diff options
author | Steve Dower <steve.dower@python.org> | 2019-09-10 14:17:42 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-09-10 14:17:42 (GMT) |
commit | 0d7e6a6d2d9e564d670efb6e3705598846de188d (patch) | |
tree | c22afd5510b7f44cb018f23ef3bd8acf087743fb | |
parent | d94b762ce824e97c441f9231f0e69ef8f59beeab (diff) | |
download | cpython-0d7e6a6d2d9e564d670efb6e3705598846de188d.zip cpython-0d7e6a6d2d9e564d670efb6e3705598846de188d.tar.gz cpython-0d7e6a6d2d9e564d670efb6e3705598846de188d.tar.bz2 |
bpo-38087: Fix case sensitivity in test_pathlib and test_ntpath (GH-15850)
-rw-r--r-- | Lib/test/test_ntpath.py | 71 | ||||
-rw-r--r-- | Lib/test/test_pathlib.py | 37 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Windows/2019-09-10-14-21-40.bpo-38087.--eIib.rst | 1 |
3 files changed, 64 insertions, 45 deletions
diff --git a/Lib/test/test_ntpath.py b/Lib/test/test_ntpath.py index 52ddc18..89b0d53 100644 --- a/Lib/test/test_ntpath.py +++ b/Lib/test/test_ntpath.py @@ -14,10 +14,19 @@ except ImportError: # but for those that require it we import here. nt = None + +def _norm(path): + if isinstance(path, (bytes, str, os.PathLike)): + return ntpath.normcase(os.fsdecode(path)) + elif hasattr(path, "__iter__"): + return tuple(ntpath.normcase(os.fsdecode(p)) for p in path) + return path + + def tester(fn, wantResult): fn = fn.replace("\\", "\\\\") gotResult = eval(fn) - if wantResult != gotResult: + if wantResult != gotResult and _norm(wantResult) != _norm(gotResult): raise TestFailed("%s should return: %s but returned: %s" \ %(str(fn), str(wantResult), str(gotResult))) @@ -33,16 +42,22 @@ def tester(fn, wantResult): with warnings.catch_warnings(): warnings.simplefilter("ignore", DeprecationWarning) gotResult = eval(fn) - if isinstance(wantResult, str): - wantResult = os.fsencode(wantResult) - elif isinstance(wantResult, tuple): - wantResult = tuple(os.fsencode(r) for r in wantResult) - if wantResult != gotResult: + if _norm(wantResult) != _norm(gotResult): raise TestFailed("%s should return: %s but returned: %s" \ %(str(fn), str(wantResult), repr(gotResult))) -class TestNtpath(unittest.TestCase): +class NtpathTestCase(unittest.TestCase): + def assertPathEqual(self, path1, path2): + if path1 == path2 or _norm(path1) == _norm(path2): + return + self.assertEqual(path1, path2) + + def assertPathIn(self, path, pathset): + self.assertIn(_norm(path), _norm(pathset)) + + +class TestNtpath(NtpathTestCase): def test_splitext(self): tester('ntpath.splitext("foo.ext")', ('foo', '.ext')) tester('ntpath.splitext("/foo/foo.ext")', ('/foo/foo', '.ext')) @@ -459,7 +474,7 @@ class NtCommonTest(test_genericpath.CommonTest, unittest.TestCase): attributes = ['relpath'] -class PathLikeTests(unittest.TestCase): +class PathLikeTests(NtpathTestCase): path = ntpath @@ -470,67 +485,67 @@ class PathLikeTests(unittest.TestCase): with open(self.file_name, 'xb', 0) as file: file.write(b"test_ntpath.PathLikeTests") - def assertPathEqual(self, func): - self.assertEqual(func(self.file_path), func(self.file_name)) + def _check_function(self, func): + self.assertPathEqual(func(self.file_path), func(self.file_name)) def test_path_normcase(self): - self.assertPathEqual(self.path.normcase) + self._check_function(self.path.normcase) def test_path_isabs(self): - self.assertPathEqual(self.path.isabs) + self._check_function(self.path.isabs) def test_path_join(self): self.assertEqual(self.path.join('a', FakePath('b'), 'c'), self.path.join('a', 'b', 'c')) def test_path_split(self): - self.assertPathEqual(self.path.split) + self._check_function(self.path.split) def test_path_splitext(self): - self.assertPathEqual(self.path.splitext) + self._check_function(self.path.splitext) def test_path_splitdrive(self): - self.assertPathEqual(self.path.splitdrive) + self._check_function(self.path.splitdrive) def test_path_basename(self): - self.assertPathEqual(self.path.basename) + self._check_function(self.path.basename) def test_path_dirname(self): - self.assertPathEqual(self.path.dirname) + self._check_function(self.path.dirname) def test_path_islink(self): - self.assertPathEqual(self.path.islink) + self._check_function(self.path.islink) def test_path_lexists(self): - self.assertPathEqual(self.path.lexists) + self._check_function(self.path.lexists) def test_path_ismount(self): - self.assertPathEqual(self.path.ismount) + self._check_function(self.path.ismount) def test_path_expanduser(self): - self.assertPathEqual(self.path.expanduser) + self._check_function(self.path.expanduser) def test_path_expandvars(self): - self.assertPathEqual(self.path.expandvars) + self._check_function(self.path.expandvars) def test_path_normpath(self): - self.assertPathEqual(self.path.normpath) + self._check_function(self.path.normpath) def test_path_abspath(self): - self.assertPathEqual(self.path.abspath) + self._check_function(self.path.abspath) def test_path_realpath(self): - self.assertPathEqual(self.path.realpath) + self._check_function(self.path.realpath) def test_path_relpath(self): - self.assertPathEqual(self.path.relpath) + self._check_function(self.path.relpath) def test_path_commonpath(self): common_path = self.path.commonpath([self.file_path, self.file_name]) - self.assertEqual(common_path, self.file_name) + self.assertPathEqual(common_path, self.file_name) def test_path_isdir(self): - self.assertPathEqual(self.path.isdir) + self._check_function(self.path.isdir) if __name__ == "__main__": diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index f7ed1d1..9c82c64 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -1271,10 +1271,13 @@ class _BasePathTest(object): func(*args, **kwargs) self.assertEqual(cm.exception.errno, errno.ENOENT) + def assertEqualNormCase(self, path_a, path_b): + self.assertEqual(os.path.normcase(path_a), os.path.normcase(path_b)) + def _test_cwd(self, p): q = self.cls(os.getcwd()) self.assertEqual(p, q) - self.assertEqual(str(p), str(q)) + self.assertEqualNormCase(str(p), str(q)) self.assertIs(type(p), type(q)) self.assertTrue(p.is_absolute()) @@ -1285,7 +1288,7 @@ class _BasePathTest(object): def _test_home(self, p): q = self.cls(os.path.expanduser('~')) self.assertEqual(p, q) - self.assertEqual(str(p), str(q)) + self.assertEqualNormCase(str(p), str(q)) self.assertIs(type(p), type(q)) self.assertTrue(p.is_absolute()) @@ -1491,15 +1494,15 @@ class _BasePathTest(object): p.resolve(strict=True) self.assertEqual(cm.exception.errno, errno.ENOENT) # Non-strict - self.assertEqual(str(p.resolve(strict=False)), - os.path.join(BASE, 'foo')) + self.assertEqualNormCase(str(p.resolve(strict=False)), + os.path.join(BASE, 'foo')) p = P(BASE, 'foo', 'in', 'spam') - self.assertEqual(str(p.resolve(strict=False)), - os.path.join(BASE, 'foo', 'in', 'spam')) + self.assertEqualNormCase(str(p.resolve(strict=False)), + os.path.join(BASE, 'foo', 'in', 'spam')) p = P(BASE, '..', 'foo', 'in', 'spam') - self.assertEqual(str(p.resolve(strict=False)), - os.path.abspath(os.path.join('foo', 'in', 'spam'))) - # These are all relative symlinks + self.assertEqualNormCase(str(p.resolve(strict=False)), + os.path.abspath(os.path.join('foo', 'in', 'spam'))) + # These are all relative symlinks. p = P(BASE, 'dirB', 'fileB') self._check_resolve_relative(p, p) p = P(BASE, 'linkA') @@ -1996,16 +1999,16 @@ class _BasePathTest(object): # Resolve absolute paths p = (P / 'link0').resolve() self.assertEqual(p, P) - self.assertEqual(str(p), BASE) + self.assertEqualNormCase(str(p), BASE) p = (P / 'link1').resolve() self.assertEqual(p, P) - self.assertEqual(str(p), BASE) + self.assertEqualNormCase(str(p), BASE) p = (P / 'link2').resolve() self.assertEqual(p, P) - self.assertEqual(str(p), BASE) + self.assertEqualNormCase(str(p), BASE) p = (P / 'link3').resolve() self.assertEqual(p, P) - self.assertEqual(str(p), BASE) + self.assertEqualNormCase(str(p), BASE) # Resolve relative paths old_path = os.getcwd() @@ -2013,16 +2016,16 @@ class _BasePathTest(object): try: p = self.cls('link0').resolve() self.assertEqual(p, P) - self.assertEqual(str(p), BASE) + self.assertEqualNormCase(str(p), BASE) p = self.cls('link1').resolve() self.assertEqual(p, P) - self.assertEqual(str(p), BASE) + self.assertEqualNormCase(str(p), BASE) p = self.cls('link2').resolve() self.assertEqual(p, P) - self.assertEqual(str(p), BASE) + self.assertEqualNormCase(str(p), BASE) p = self.cls('link3').resolve() self.assertEqual(p, P) - self.assertEqual(str(p), BASE) + self.assertEqualNormCase(str(p), BASE) finally: os.chdir(old_path) diff --git a/Misc/NEWS.d/next/Windows/2019-09-10-14-21-40.bpo-38087.--eIib.rst b/Misc/NEWS.d/next/Windows/2019-09-10-14-21-40.bpo-38087.--eIib.rst new file mode 100644 index 0000000..ca625cc --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-09-10-14-21-40.bpo-38087.--eIib.rst @@ -0,0 +1 @@ +Fix case sensitivity in test_pathlib and test_ntpath. |