summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_ntpath.py
diff options
context:
space:
mode:
authorSteve Dower <steve.dower@python.org>2019-11-15 17:49:21 (GMT)
committerGitHub <noreply@github.com>2019-11-15 17:49:21 (GMT)
commitabde52cd8e31830bfc06c5803221faae6172104a (patch)
tree32244b8a0ba8ec1899eb1549c151476fd264f867 /Lib/test/test_ntpath.py
parentb22030073b9327a3aeccb69507694bce078192aa (diff)
downloadcpython-abde52cd8e31830bfc06c5803221faae6172104a.zip
cpython-abde52cd8e31830bfc06c5803221faae6172104a.tar.gz
cpython-abde52cd8e31830bfc06c5803221faae6172104a.tar.bz2
bpo-38453: Ensure ntpath.realpath correctly resolves relative paths (GH-16967)
Ensure isabs() is always True for \\?\ prefixed paths Avoid unnecessary usage of readlink() to avoid resolving broken links incorrectly Ensure shutil tests run in test directory
Diffstat (limited to 'Lib/test/test_ntpath.py')
-rw-r--r--Lib/test/test_ntpath.py52
1 files changed, 40 insertions, 12 deletions
diff --git a/Lib/test/test_ntpath.py b/Lib/test/test_ntpath.py
index e0ec441..a84b94c 100644
--- a/Lib/test/test_ntpath.py
+++ b/Lib/test/test_ntpath.py
@@ -286,14 +286,16 @@ class TestNtpath(NtpathTestCase):
ABSTFN + r"\missing")
self.assertPathEqual(ntpath.realpath(r"broken\foo"),
ABSTFN + r"\missing\foo")
+ # bpo-38453: We no longer recursively resolve segments of relative
+ # symlinks that the OS cannot resolve.
self.assertPathEqual(ntpath.realpath(r"broken1"),
- ABSTFN + r"\missing\bar")
+ ABSTFN + r"\broken\bar")
self.assertPathEqual(ntpath.realpath(r"broken1\baz"),
- ABSTFN + r"\missing\bar\baz")
+ ABSTFN + r"\broken\bar\baz")
self.assertPathEqual(ntpath.realpath("broken2"),
- ABSTFN + r"\missing")
+ ABSTFN + r"\self\self\missing")
self.assertPathEqual(ntpath.realpath("broken3"),
- ABSTFN + r"\missing")
+ ABSTFN + r"\subdir\parent\subdir\parent\missing")
self.assertPathEqual(ntpath.realpath("broken4"),
ABSTFN + r"\missing")
self.assertPathEqual(ntpath.realpath("broken5"),
@@ -304,13 +306,13 @@ class TestNtpath(NtpathTestCase):
self.assertPathEqual(ntpath.realpath(rb"broken\foo"),
os.fsencode(ABSTFN + r"\missing\foo"))
self.assertPathEqual(ntpath.realpath(rb"broken1"),
- os.fsencode(ABSTFN + r"\missing\bar"))
+ os.fsencode(ABSTFN + r"\broken\bar"))
self.assertPathEqual(ntpath.realpath(rb"broken1\baz"),
- os.fsencode(ABSTFN + r"\missing\bar\baz"))
+ os.fsencode(ABSTFN + r"\broken\bar\baz"))
self.assertPathEqual(ntpath.realpath(b"broken2"),
- os.fsencode(ABSTFN + r"\missing"))
+ os.fsencode(ABSTFN + r"\self\self\missing"))
self.assertPathEqual(ntpath.realpath(rb"broken3"),
- os.fsencode(ABSTFN + r"\missing"))
+ os.fsencode(ABSTFN + r"\subdir\parent\subdir\parent\missing"))
self.assertPathEqual(ntpath.realpath(b"broken4"),
os.fsencode(ABSTFN + r"\missing"))
self.assertPathEqual(ntpath.realpath(b"broken5"),
@@ -319,8 +321,8 @@ class TestNtpath(NtpathTestCase):
@support.skip_unless_symlink
@unittest.skipUnless(HAVE_GETFINALPATHNAME, 'need _getfinalpathname')
def test_realpath_symlink_loops(self):
- # Bug #930024, return the path unchanged if we get into an infinite
- # symlink loop.
+ # Symlink loops are non-deterministic as to which path is returned, but
+ # it will always be the fully resolved path of one member of the cycle
ABSTFN = ntpath.abspath(support.TESTFN)
self.addCleanup(support.unlink, ABSTFN)
self.addCleanup(support.unlink, ABSTFN + "1")
@@ -332,8 +334,6 @@ class TestNtpath(NtpathTestCase):
os.symlink(ABSTFN, ABSTFN)
self.assertPathEqual(ntpath.realpath(ABSTFN), ABSTFN)
- # cycles are non-deterministic as to which path is returned, but
- # it will always be the fully resolved path of one member of the cycle
os.symlink(ABSTFN + "1", ABSTFN + "2")
os.symlink(ABSTFN + "2", ABSTFN + "1")
expected = (ABSTFN + "1", ABSTFN + "2")
@@ -402,6 +402,34 @@ class TestNtpath(NtpathTestCase):
def test_realpath_nul(self):
tester("ntpath.realpath('NUL')", r'\\.\NUL')
+ @unittest.skipUnless(HAVE_GETFINALPATHNAME, 'need _getfinalpathname')
+ def test_realpath_cwd(self):
+ ABSTFN = ntpath.abspath(support.TESTFN)
+
+ support.unlink(ABSTFN)
+ support.rmtree(ABSTFN)
+ os.mkdir(ABSTFN)
+ self.addCleanup(support.rmtree, ABSTFN)
+
+ test_dir_long = ntpath.join(ABSTFN, "MyVeryLongDirectoryName")
+ test_dir_short = ntpath.join(ABSTFN, "MYVERY~1")
+ test_file_long = ntpath.join(test_dir_long, "file.txt")
+ test_file_short = ntpath.join(test_dir_short, "file.txt")
+
+ os.mkdir(test_dir_long)
+
+ with open(test_file_long, "wb") as f:
+ f.write(b"content")
+
+ self.assertPathEqual(test_file_long, ntpath.realpath(test_file_short))
+
+ with support.change_cwd(test_dir_long):
+ self.assertPathEqual(test_file_long, ntpath.realpath("file.txt"))
+ with support.change_cwd(test_dir_long.lower()):
+ self.assertPathEqual(test_file_long, ntpath.realpath("file.txt"))
+ with support.change_cwd(test_dir_short):
+ self.assertPathEqual(test_file_long, ntpath.realpath("file.txt"))
+
def test_expandvars(self):
with support.EnvironmentVarGuard() as env:
env.clear()