blob: 6f881f197c4f54d081124181489f383adfa337b0 [file] [log] [blame]
Guido van Rossumead9d8d1999-02-03 17:21:21 +00001import ntpath
Mark Hammond673c6cf2000-08-14 06:21:26 +00002import os
Brian Curtin13a0db52010-09-06 19:46:17 +00003import sys
Victor Stinner1ab6c2d2011-11-15 22:27:41 +01004import unittest
5import warnings
Serhiy Storchakab21d1552018-03-02 11:53:51 +02006from test.support import TestFailed, FakePath
Florent Xiclunac9c79782010-03-08 12:24:53 +00007from test import support, test_genericpath
Brian Curtin62857742010-09-06 17:07:27 +00008from tempfile import TemporaryFile
Guido van Rossumead9d8d1999-02-03 17:21:21 +00009
Steve Dower75e06492019-08-21 13:43:06 -070010
Steve Dower23ad6d02018-02-22 10:39:10 -080011try:
12 import nt
13except ImportError:
14 # Most tests can complete without the nt module,
15 # but for those that require it we import here.
16 nt = None
Guido van Rossumead9d8d1999-02-03 17:21:21 +000017
Steve Dower75e06492019-08-21 13:43:06 -070018try:
19 ntpath._getfinalpathname
20except AttributeError:
21 HAVE_GETFINALPATHNAME = False
22else:
23 HAVE_GETFINALPATHNAME = True
24
Steve Dower7c6130c2019-11-15 16:04:00 -080025try:
26 import ctypes
27except ImportError:
28 HAVE_GETSHORTPATHNAME = False
29else:
30 HAVE_GETSHORTPATHNAME = True
31 def _getshortpathname(path):
32 GSPN = ctypes.WinDLL("kernel32", use_last_error=True).GetShortPathNameW
33 GSPN.argtypes = [ctypes.c_wchar_p, ctypes.c_wchar_p, ctypes.c_uint32]
34 GSPN.restype = ctypes.c_uint32
35 result_len = GSPN(path, None, 0)
36 if not result_len:
37 raise OSError("failed to get short path name 0x{:08X}"
38 .format(ctypes.get_last_error()))
39 result = ctypes.create_unicode_buffer(result_len)
40 result_len = GSPN(path, result, result_len)
41 return result[:result_len]
Steve Dower75e06492019-08-21 13:43:06 -070042
Steve Dower97d79062019-09-10 14:52:48 +010043def _norm(path):
44 if isinstance(path, (bytes, str, os.PathLike)):
45 return ntpath.normcase(os.fsdecode(path))
46 elif hasattr(path, "__iter__"):
47 return tuple(ntpath.normcase(os.fsdecode(p)) for p in path)
48 return path
49
50
Guido van Rossumead9d8d1999-02-03 17:21:21 +000051def tester(fn, wantResult):
Eric S. Raymondfc170b12001-02-09 11:51:27 +000052 fn = fn.replace("\\", "\\\\")
Fred Drake004d5e62000-10-23 17:22:08 +000053 gotResult = eval(fn)
Steve Dower97d79062019-09-10 14:52:48 +010054 if wantResult != gotResult and _norm(wantResult) != _norm(gotResult):
Christian Heimesf6cd9672008-03-26 13:45:42 +000055 raise TestFailed("%s should return: %s but returned: %s" \
56 %(str(fn), str(wantResult), str(gotResult)))
Tim Peters6578dc92002-12-24 18:31:27 +000057
Amaury Forgeot d'Arcc72ef8b2008-10-03 18:38:26 +000058 # then with bytes
59 fn = fn.replace("('", "(b'")
60 fn = fn.replace('("', '(b"')
61 fn = fn.replace("['", "[b'")
62 fn = fn.replace('["', '[b"')
63 fn = fn.replace(", '", ", b'")
64 fn = fn.replace(', "', ', b"')
Serhiy Storchakadbb10192014-02-13 10:13:53 +020065 fn = os.fsencode(fn).decode('latin1')
66 fn = fn.encode('ascii', 'backslashreplace').decode('ascii')
Victor Stinner1ab6c2d2011-11-15 22:27:41 +010067 with warnings.catch_warnings():
68 warnings.simplefilter("ignore", DeprecationWarning)
69 gotResult = eval(fn)
Steve Dower97d79062019-09-10 14:52:48 +010070 if _norm(wantResult) != _norm(gotResult):
Amaury Forgeot d'Arcc72ef8b2008-10-03 18:38:26 +000071 raise TestFailed("%s should return: %s but returned: %s" \
72 %(str(fn), str(wantResult), repr(gotResult)))
Guido van Rossumead9d8d1999-02-03 17:21:21 +000073
Mark Hammond5a607a32009-05-06 08:04:54 +000074
Steve Dower97d79062019-09-10 14:52:48 +010075class NtpathTestCase(unittest.TestCase):
76 def assertPathEqual(self, path1, path2):
77 if path1 == path2 or _norm(path1) == _norm(path2):
78 return
79 self.assertEqual(path1, path2)
80
81 def assertPathIn(self, path, pathset):
82 self.assertIn(_norm(path), _norm(pathset))
83
84
85class TestNtpath(NtpathTestCase):
Christian Heimesf6cd9672008-03-26 13:45:42 +000086 def test_splitext(self):
87 tester('ntpath.splitext("foo.ext")', ('foo', '.ext'))
88 tester('ntpath.splitext("/foo/foo.ext")', ('/foo/foo', '.ext'))
89 tester('ntpath.splitext(".ext")', ('.ext', ''))
90 tester('ntpath.splitext("\\foo.ext\\foo")', ('\\foo.ext\\foo', ''))
91 tester('ntpath.splitext("foo.ext\\")', ('foo.ext\\', ''))
92 tester('ntpath.splitext("")', ('', ''))
93 tester('ntpath.splitext("foo.bar.ext")', ('foo.bar', '.ext'))
94 tester('ntpath.splitext("xx/foo.bar.ext")', ('xx/foo.bar', '.ext'))
95 tester('ntpath.splitext("xx\\foo.bar.ext")', ('xx\\foo.bar', '.ext'))
96 tester('ntpath.splitext("c:a/b\\c.d")', ('c:a/b\\c', '.d'))
Guido van Rossumead9d8d1999-02-03 17:21:21 +000097
Christian Heimesf6cd9672008-03-26 13:45:42 +000098 def test_splitdrive(self):
99 tester('ntpath.splitdrive("c:\\foo\\bar")',
100 ('c:', '\\foo\\bar'))
101 tester('ntpath.splitdrive("c:/foo/bar")',
102 ('c:', '/foo/bar'))
Mark Hammond5a607a32009-05-06 08:04:54 +0000103 tester('ntpath.splitdrive("\\\\conky\\mountpoint\\foo\\bar")',
Christian Heimesf6cd9672008-03-26 13:45:42 +0000104 ('\\\\conky\\mountpoint', '\\foo\\bar'))
Mark Hammond5a607a32009-05-06 08:04:54 +0000105 tester('ntpath.splitdrive("//conky/mountpoint/foo/bar")',
Christian Heimesf6cd9672008-03-26 13:45:42 +0000106 ('//conky/mountpoint', '/foo/bar'))
Mark Hammond5a607a32009-05-06 08:04:54 +0000107 tester('ntpath.splitdrive("\\\\\\conky\\mountpoint\\foo\\bar")',
108 ('', '\\\\\\conky\\mountpoint\\foo\\bar'))
109 tester('ntpath.splitdrive("///conky/mountpoint/foo/bar")',
110 ('', '///conky/mountpoint/foo/bar'))
111 tester('ntpath.splitdrive("\\\\conky\\\\mountpoint\\foo\\bar")',
112 ('', '\\\\conky\\\\mountpoint\\foo\\bar'))
113 tester('ntpath.splitdrive("//conky//mountpoint/foo/bar")',
114 ('', '//conky//mountpoint/foo/bar'))
Serhiy Storchaka3d7e1152013-12-16 14:34:55 +0200115 # Issue #19911: UNC part containing U+0130
116 self.assertEqual(ntpath.splitdrive('//conky/MOUNTPOİNT/foo/bar'),
117 ('//conky/MOUNTPOİNT', '/foo/bar'))
Guido van Rossumead9d8d1999-02-03 17:21:21 +0000118
Christian Heimesf6cd9672008-03-26 13:45:42 +0000119 def test_split(self):
120 tester('ntpath.split("c:\\foo\\bar")', ('c:\\foo', 'bar'))
121 tester('ntpath.split("\\\\conky\\mountpoint\\foo\\bar")',
122 ('\\\\conky\\mountpoint\\foo', 'bar'))
Guido van Rossumead9d8d1999-02-03 17:21:21 +0000123
Christian Heimesf6cd9672008-03-26 13:45:42 +0000124 tester('ntpath.split("c:\\")', ('c:\\', ''))
125 tester('ntpath.split("\\\\conky\\mountpoint\\")',
Mark Hammond5a607a32009-05-06 08:04:54 +0000126 ('\\\\conky\\mountpoint\\', ''))
Guido van Rossumead9d8d1999-02-03 17:21:21 +0000127
Christian Heimesf6cd9672008-03-26 13:45:42 +0000128 tester('ntpath.split("c:/")', ('c:/', ''))
Mark Hammond5a607a32009-05-06 08:04:54 +0000129 tester('ntpath.split("//conky/mountpoint/")', ('//conky/mountpoint/', ''))
Mark Hammond673c6cf2000-08-14 06:21:26 +0000130
Christian Heimesf6cd9672008-03-26 13:45:42 +0000131 def test_isabs(self):
132 tester('ntpath.isabs("c:\\")', 1)
133 tester('ntpath.isabs("\\\\conky\\mountpoint\\")', 1)
134 tester('ntpath.isabs("\\foo")', 1)
135 tester('ntpath.isabs("\\foo\\bar")', 1)
Tim Petersd4f7f602001-07-19 19:11:41 +0000136
Christian Heimesf6cd9672008-03-26 13:45:42 +0000137 def test_commonprefix(self):
138 tester('ntpath.commonprefix(["/home/swenson/spam", "/home/swen/spam"])',
139 "/home/swen")
140 tester('ntpath.commonprefix(["\\home\\swen\\spam", "\\home\\swen\\eggs"])',
141 "\\home\\swen\\")
142 tester('ntpath.commonprefix(["/home/swen/spam", "/home/swen/spam"])',
143 "/home/swen/spam")
Tim Peters6a3e5f12001-11-05 21:25:02 +0000144
Christian Heimesf6cd9672008-03-26 13:45:42 +0000145 def test_join(self):
146 tester('ntpath.join("")', '')
147 tester('ntpath.join("", "", "")', '')
148 tester('ntpath.join("a")', 'a')
149 tester('ntpath.join("/a")', '/a')
150 tester('ntpath.join("\\a")', '\\a')
151 tester('ntpath.join("a:")', 'a:')
Christian Heimesf6cd9672008-03-26 13:45:42 +0000152 tester('ntpath.join("a:", "\\b")', 'a:\\b')
Christian Heimesf6cd9672008-03-26 13:45:42 +0000153 tester('ntpath.join("a", "\\b")', '\\b')
154 tester('ntpath.join("a", "b", "c")', 'a\\b\\c')
155 tester('ntpath.join("a\\", "b", "c")', 'a\\b\\c')
156 tester('ntpath.join("a", "b\\", "c")', 'a\\b\\c')
157 tester('ntpath.join("a", "b", "\\c")', '\\c')
158 tester('ntpath.join("d:\\", "\\pleep")', 'd:\\pleep')
159 tester('ntpath.join("d:\\", "a", "b")', 'd:\\a\\b')
Tim Peters54a14a32001-08-30 22:05:26 +0000160
Christian Heimesf6cd9672008-03-26 13:45:42 +0000161 tester("ntpath.join('', 'a')", 'a')
162 tester("ntpath.join('', '', '', '', 'a')", 'a')
163 tester("ntpath.join('a', '')", 'a\\')
164 tester("ntpath.join('a', '', '', '', '')", 'a\\')
165 tester("ntpath.join('a\\', '')", 'a\\')
166 tester("ntpath.join('a\\', '', '', '', '')", 'a\\')
Serhiy Storchakac369c2c2014-01-27 23:15:14 +0200167 tester("ntpath.join('a/', '')", 'a/')
Tim Peters54a14a32001-08-30 22:05:26 +0000168
Serhiy Storchakac369c2c2014-01-27 23:15:14 +0200169 tester("ntpath.join('a/b', 'x/y')", 'a/b\\x/y')
170 tester("ntpath.join('/a/b', 'x/y')", '/a/b\\x/y')
171 tester("ntpath.join('/a/b/', 'x/y')", '/a/b/x/y')
172 tester("ntpath.join('c:', 'x/y')", 'c:x/y')
173 tester("ntpath.join('c:a/b', 'x/y')", 'c:a/b\\x/y')
174 tester("ntpath.join('c:a/b/', 'x/y')", 'c:a/b/x/y')
175 tester("ntpath.join('c:/', 'x/y')", 'c:/x/y')
176 tester("ntpath.join('c:/a/b', 'x/y')", 'c:/a/b\\x/y')
177 tester("ntpath.join('c:/a/b/', 'x/y')", 'c:/a/b/x/y')
178 tester("ntpath.join('//computer/share', 'x/y')", '//computer/share\\x/y')
179 tester("ntpath.join('//computer/share/', 'x/y')", '//computer/share/x/y')
180 tester("ntpath.join('//computer/share/a/b', 'x/y')", '//computer/share/a/b\\x/y')
Mark Hammond5a607a32009-05-06 08:04:54 +0000181
Serhiy Storchakac369c2c2014-01-27 23:15:14 +0200182 tester("ntpath.join('a/b', '/x/y')", '/x/y')
183 tester("ntpath.join('/a/b', '/x/y')", '/x/y')
184 tester("ntpath.join('c:', '/x/y')", 'c:/x/y')
185 tester("ntpath.join('c:a/b', '/x/y')", 'c:/x/y')
186 tester("ntpath.join('c:/', '/x/y')", 'c:/x/y')
187 tester("ntpath.join('c:/a/b', '/x/y')", 'c:/x/y')
188 tester("ntpath.join('//computer/share', '/x/y')", '//computer/share/x/y')
189 tester("ntpath.join('//computer/share/', '/x/y')", '//computer/share/x/y')
190 tester("ntpath.join('//computer/share/a', '/x/y')", '//computer/share/x/y')
191
192 tester("ntpath.join('c:', 'C:x/y')", 'C:x/y')
193 tester("ntpath.join('c:a/b', 'C:x/y')", 'C:a/b\\x/y')
194 tester("ntpath.join('c:/', 'C:x/y')", 'C:/x/y')
195 tester("ntpath.join('c:/a/b', 'C:x/y')", 'C:/a/b\\x/y')
196
197 for x in ('', 'a/b', '/a/b', 'c:', 'c:a/b', 'c:/', 'c:/a/b',
198 '//computer/share', '//computer/share/', '//computer/share/a/b'):
199 for y in ('d:', 'd:x/y', 'd:/', 'd:/x/y',
200 '//machine/common', '//machine/common/', '//machine/common/x/y'):
201 tester("ntpath.join(%r, %r)" % (x, y), y)
Mark Hammond5a607a32009-05-06 08:04:54 +0000202
203 tester("ntpath.join('\\\\computer\\share\\', 'a', 'b')", '\\\\computer\\share\\a\\b')
204 tester("ntpath.join('\\\\computer\\share', 'a', 'b')", '\\\\computer\\share\\a\\b')
205 tester("ntpath.join('\\\\computer\\share', 'a\\b')", '\\\\computer\\share\\a\\b')
206 tester("ntpath.join('//computer/share/', 'a', 'b')", '//computer/share/a\\b')
207 tester("ntpath.join('//computer/share', 'a', 'b')", '//computer/share\\a\\b')
208 tester("ntpath.join('//computer/share', 'a/b')", '//computer/share\\a/b')
209
Christian Heimesf6cd9672008-03-26 13:45:42 +0000210 def test_normpath(self):
211 tester("ntpath.normpath('A//////././//.//B')", r'A\B')
212 tester("ntpath.normpath('A/./B')", r'A\B')
213 tester("ntpath.normpath('A/foo/../B')", r'A\B')
214 tester("ntpath.normpath('C:A//B')", r'C:A\B')
215 tester("ntpath.normpath('D:A/./B')", r'D:A\B')
216 tester("ntpath.normpath('e:A/foo/../B')", r'e:A\B')
Tim Peters54a14a32001-08-30 22:05:26 +0000217
Christian Heimesf6cd9672008-03-26 13:45:42 +0000218 tester("ntpath.normpath('C:///A//B')", r'C:\A\B')
219 tester("ntpath.normpath('D:///A/./B')", r'D:\A\B')
220 tester("ntpath.normpath('e:///A/foo/../B')", r'e:\A\B')
Thomas Woutersb2137042007-02-01 18:02:27 +0000221
Christian Heimesf6cd9672008-03-26 13:45:42 +0000222 tester("ntpath.normpath('..')", r'..')
223 tester("ntpath.normpath('.')", r'.')
224 tester("ntpath.normpath('')", r'.')
225 tester("ntpath.normpath('/')", '\\')
226 tester("ntpath.normpath('c:/')", 'c:\\')
227 tester("ntpath.normpath('/../.././..')", '\\')
228 tester("ntpath.normpath('c:/../../..')", 'c:\\')
229 tester("ntpath.normpath('../.././..')", r'..\..\..')
230 tester("ntpath.normpath('K:../.././..')", r'K:..\..\..')
231 tester("ntpath.normpath('C:////a/b')", r'C:\a\b')
232 tester("ntpath.normpath('//machine/share//a/b')", r'\\machine\share\a\b')
Fred Drake5e997312002-01-15 03:46:43 +0000233
Georg Brandlcfb68212010-07-31 21:40:15 +0000234 tester("ntpath.normpath('\\\\.\\NUL')", r'\\.\NUL')
235 tester("ntpath.normpath('\\\\?\\D:/XY\\Z')", r'\\?\D:/XY\Z')
236
Steve Dower75e06492019-08-21 13:43:06 -0700237 def test_realpath_curdir(self):
238 expected = ntpath.normpath(os.getcwd())
239 tester("ntpath.realpath('.')", expected)
240 tester("ntpath.realpath('./.')", expected)
241 tester("ntpath.realpath('/'.join(['.'] * 100))", expected)
242 tester("ntpath.realpath('.\\.')", expected)
243 tester("ntpath.realpath('\\'.join(['.'] * 100))", expected)
244
245 def test_realpath_pardir(self):
246 expected = ntpath.normpath(os.getcwd())
247 tester("ntpath.realpath('..')", ntpath.dirname(expected))
248 tester("ntpath.realpath('../..')",
249 ntpath.dirname(ntpath.dirname(expected)))
250 tester("ntpath.realpath('/'.join(['..'] * 50))",
251 ntpath.splitdrive(expected)[0] + '\\')
252 tester("ntpath.realpath('..\\..')",
253 ntpath.dirname(ntpath.dirname(expected)))
254 tester("ntpath.realpath('\\'.join(['..'] * 50))",
255 ntpath.splitdrive(expected)[0] + '\\')
256
257 @support.skip_unless_symlink
258 @unittest.skipUnless(HAVE_GETFINALPATHNAME, 'need _getfinalpathname')
259 def test_realpath_basic(self):
260 ABSTFN = ntpath.abspath(support.TESTFN)
261 open(ABSTFN, "wb").close()
262 self.addCleanup(support.unlink, ABSTFN)
263 self.addCleanup(support.unlink, ABSTFN + "1")
264
265 os.symlink(ABSTFN, ABSTFN + "1")
Steve Dower97d79062019-09-10 14:52:48 +0100266 self.assertPathEqual(ntpath.realpath(ABSTFN + "1"), ABSTFN)
267 self.assertPathEqual(ntpath.realpath(os.fsencode(ABSTFN + "1")),
Steve Dower75e06492019-08-21 13:43:06 -0700268 os.fsencode(ABSTFN))
269
270 @support.skip_unless_symlink
271 @unittest.skipUnless(HAVE_GETFINALPATHNAME, 'need _getfinalpathname')
272 def test_realpath_relative(self):
273 ABSTFN = ntpath.abspath(support.TESTFN)
274 open(ABSTFN, "wb").close()
275 self.addCleanup(support.unlink, ABSTFN)
276 self.addCleanup(support.unlink, ABSTFN + "1")
277
278 os.symlink(ABSTFN, ntpath.relpath(ABSTFN + "1"))
Steve Dower97d79062019-09-10 14:52:48 +0100279 self.assertPathEqual(ntpath.realpath(ABSTFN + "1"), ABSTFN)
Steve Dower75e06492019-08-21 13:43:06 -0700280
281 @support.skip_unless_symlink
282 @unittest.skipUnless(HAVE_GETFINALPATHNAME, 'need _getfinalpathname')
283 def test_realpath_broken_symlinks(self):
284 ABSTFN = ntpath.abspath(support.TESTFN)
285 os.mkdir(ABSTFN)
286 self.addCleanup(support.rmtree, ABSTFN)
287
288 with support.change_cwd(ABSTFN):
289 os.mkdir("subdir")
290 os.chdir("subdir")
291 os.symlink(".", "recursive")
292 os.symlink("..", "parent")
293 os.chdir("..")
294 os.symlink(".", "self")
295 os.symlink("missing", "broken")
296 os.symlink(r"broken\bar", "broken1")
297 os.symlink(r"self\self\broken", "broken2")
298 os.symlink(r"subdir\parent\subdir\parent\broken", "broken3")
299 os.symlink(ABSTFN + r"\broken", "broken4")
300 os.symlink(r"recursive\..\broken", "broken5")
301
Steve Dower97d79062019-09-10 14:52:48 +0100302 self.assertPathEqual(ntpath.realpath("broken"),
303 ABSTFN + r"\missing")
304 self.assertPathEqual(ntpath.realpath(r"broken\foo"),
305 ABSTFN + r"\missing\foo")
Steve Dowerabde52c2019-11-15 09:49:21 -0800306 # bpo-38453: We no longer recursively resolve segments of relative
307 # symlinks that the OS cannot resolve.
Steve Dower97d79062019-09-10 14:52:48 +0100308 self.assertPathEqual(ntpath.realpath(r"broken1"),
Steve Dowerabde52c2019-11-15 09:49:21 -0800309 ABSTFN + r"\broken\bar")
Steve Dower97d79062019-09-10 14:52:48 +0100310 self.assertPathEqual(ntpath.realpath(r"broken1\baz"),
Steve Dowerabde52c2019-11-15 09:49:21 -0800311 ABSTFN + r"\broken\bar\baz")
Steve Dower97d79062019-09-10 14:52:48 +0100312 self.assertPathEqual(ntpath.realpath("broken2"),
Steve Dowerabde52c2019-11-15 09:49:21 -0800313 ABSTFN + r"\self\self\missing")
Steve Dower97d79062019-09-10 14:52:48 +0100314 self.assertPathEqual(ntpath.realpath("broken3"),
Steve Dowerabde52c2019-11-15 09:49:21 -0800315 ABSTFN + r"\subdir\parent\subdir\parent\missing")
Steve Dower97d79062019-09-10 14:52:48 +0100316 self.assertPathEqual(ntpath.realpath("broken4"),
317 ABSTFN + r"\missing")
318 self.assertPathEqual(ntpath.realpath("broken5"),
319 ABSTFN + r"\missing")
Steve Dower75e06492019-08-21 13:43:06 -0700320
Steve Dower97d79062019-09-10 14:52:48 +0100321 self.assertPathEqual(ntpath.realpath(b"broken"),
322 os.fsencode(ABSTFN + r"\missing"))
323 self.assertPathEqual(ntpath.realpath(rb"broken\foo"),
324 os.fsencode(ABSTFN + r"\missing\foo"))
325 self.assertPathEqual(ntpath.realpath(rb"broken1"),
Steve Dowerabde52c2019-11-15 09:49:21 -0800326 os.fsencode(ABSTFN + r"\broken\bar"))
Steve Dower97d79062019-09-10 14:52:48 +0100327 self.assertPathEqual(ntpath.realpath(rb"broken1\baz"),
Steve Dowerabde52c2019-11-15 09:49:21 -0800328 os.fsencode(ABSTFN + r"\broken\bar\baz"))
Steve Dower97d79062019-09-10 14:52:48 +0100329 self.assertPathEqual(ntpath.realpath(b"broken2"),
Steve Dowerabde52c2019-11-15 09:49:21 -0800330 os.fsencode(ABSTFN + r"\self\self\missing"))
Steve Dower97d79062019-09-10 14:52:48 +0100331 self.assertPathEqual(ntpath.realpath(rb"broken3"),
Steve Dowerabde52c2019-11-15 09:49:21 -0800332 os.fsencode(ABSTFN + r"\subdir\parent\subdir\parent\missing"))
Steve Dower97d79062019-09-10 14:52:48 +0100333 self.assertPathEqual(ntpath.realpath(b"broken4"),
334 os.fsencode(ABSTFN + r"\missing"))
335 self.assertPathEqual(ntpath.realpath(b"broken5"),
336 os.fsencode(ABSTFN + r"\missing"))
Steve Dower75e06492019-08-21 13:43:06 -0700337
338 @support.skip_unless_symlink
339 @unittest.skipUnless(HAVE_GETFINALPATHNAME, 'need _getfinalpathname')
340 def test_realpath_symlink_loops(self):
Steve Dowerabde52c2019-11-15 09:49:21 -0800341 # Symlink loops are non-deterministic as to which path is returned, but
342 # it will always be the fully resolved path of one member of the cycle
Steve Dower75e06492019-08-21 13:43:06 -0700343 ABSTFN = ntpath.abspath(support.TESTFN)
344 self.addCleanup(support.unlink, ABSTFN)
345 self.addCleanup(support.unlink, ABSTFN + "1")
346 self.addCleanup(support.unlink, ABSTFN + "2")
347 self.addCleanup(support.unlink, ABSTFN + "y")
348 self.addCleanup(support.unlink, ABSTFN + "c")
349 self.addCleanup(support.unlink, ABSTFN + "a")
350
Steve Dower75e06492019-08-21 13:43:06 -0700351 os.symlink(ABSTFN, ABSTFN)
Steve Dowera0e3d272019-10-03 08:31:03 -0700352 self.assertPathEqual(ntpath.realpath(ABSTFN), ABSTFN)
Steve Dower75e06492019-08-21 13:43:06 -0700353
Steve Dower75e06492019-08-21 13:43:06 -0700354 os.symlink(ABSTFN + "1", ABSTFN + "2")
355 os.symlink(ABSTFN + "2", ABSTFN + "1")
Steve Dowera0e3d272019-10-03 08:31:03 -0700356 expected = (ABSTFN + "1", ABSTFN + "2")
Steve Dower97d79062019-09-10 14:52:48 +0100357 self.assertPathIn(ntpath.realpath(ABSTFN + "1"), expected)
358 self.assertPathIn(ntpath.realpath(ABSTFN + "2"), expected)
Steve Dower75e06492019-08-21 13:43:06 -0700359
Steve Dower97d79062019-09-10 14:52:48 +0100360 self.assertPathIn(ntpath.realpath(ABSTFN + "1\\x"),
361 (ntpath.join(r, "x") for r in expected))
362 self.assertPathEqual(ntpath.realpath(ABSTFN + "1\\.."),
363 ntpath.dirname(ABSTFN))
364 self.assertPathEqual(ntpath.realpath(ABSTFN + "1\\..\\x"),
365 ntpath.dirname(ABSTFN) + "\\x")
Steve Dower75e06492019-08-21 13:43:06 -0700366 os.symlink(ABSTFN + "x", ABSTFN + "y")
Steve Dower97d79062019-09-10 14:52:48 +0100367 self.assertPathEqual(ntpath.realpath(ABSTFN + "1\\..\\"
368 + ntpath.basename(ABSTFN) + "y"),
369 ABSTFN + "x")
370 self.assertPathIn(ntpath.realpath(ABSTFN + "1\\..\\"
371 + ntpath.basename(ABSTFN) + "1"),
372 expected)
Steve Dower75e06492019-08-21 13:43:06 -0700373
374 os.symlink(ntpath.basename(ABSTFN) + "a\\b", ABSTFN + "a")
Steve Dowera0e3d272019-10-03 08:31:03 -0700375 self.assertPathEqual(ntpath.realpath(ABSTFN + "a"), ABSTFN + "a")
Steve Dower75e06492019-08-21 13:43:06 -0700376
377 os.symlink("..\\" + ntpath.basename(ntpath.dirname(ABSTFN))
378 + "\\" + ntpath.basename(ABSTFN) + "c", ABSTFN + "c")
Steve Dowera0e3d272019-10-03 08:31:03 -0700379 self.assertPathEqual(ntpath.realpath(ABSTFN + "c"), ABSTFN + "c")
Steve Dower75e06492019-08-21 13:43:06 -0700380
381 # Test using relative path as well.
Steve Dowera0e3d272019-10-03 08:31:03 -0700382 self.assertPathEqual(ntpath.realpath(ntpath.basename(ABSTFN)), ABSTFN)
Steve Dower75e06492019-08-21 13:43:06 -0700383
384 @support.skip_unless_symlink
385 @unittest.skipUnless(HAVE_GETFINALPATHNAME, 'need _getfinalpathname')
386 def test_realpath_symlink_prefix(self):
387 ABSTFN = ntpath.abspath(support.TESTFN)
388 self.addCleanup(support.unlink, ABSTFN + "3")
389 self.addCleanup(support.unlink, "\\\\?\\" + ABSTFN + "3.")
390 self.addCleanup(support.unlink, ABSTFN + "3link")
391 self.addCleanup(support.unlink, ABSTFN + "3.link")
392
393 with open(ABSTFN + "3", "wb") as f:
394 f.write(b'0')
395 os.symlink(ABSTFN + "3", ABSTFN + "3link")
396
397 with open("\\\\?\\" + ABSTFN + "3.", "wb") as f:
398 f.write(b'1')
399 os.symlink("\\\\?\\" + ABSTFN + "3.", ABSTFN + "3.link")
400
Steve Dower97d79062019-09-10 14:52:48 +0100401 self.assertPathEqual(ntpath.realpath(ABSTFN + "3link"),
402 ABSTFN + "3")
403 self.assertPathEqual(ntpath.realpath(ABSTFN + "3.link"),
404 "\\\\?\\" + ABSTFN + "3.")
Steve Dower75e06492019-08-21 13:43:06 -0700405
406 # Resolved paths should be usable to open target files
407 with open(ntpath.realpath(ABSTFN + "3link"), "rb") as f:
408 self.assertEqual(f.read(), b'0')
409 with open(ntpath.realpath(ABSTFN + "3.link"), "rb") as f:
410 self.assertEqual(f.read(), b'1')
411
412 # When the prefix is included, it is not stripped
Steve Dower97d79062019-09-10 14:52:48 +0100413 self.assertPathEqual(ntpath.realpath("\\\\?\\" + ABSTFN + "3link"),
414 "\\\\?\\" + ABSTFN + "3")
415 self.assertPathEqual(ntpath.realpath("\\\\?\\" + ABSTFN + "3.link"),
416 "\\\\?\\" + ABSTFN + "3.")
Steve Dower75e06492019-08-21 13:43:06 -0700417
Steve Dower92521fe2019-09-11 10:48:36 +0100418 @unittest.skipUnless(HAVE_GETFINALPATHNAME, 'need _getfinalpathname')
419 def test_realpath_nul(self):
420 tester("ntpath.realpath('NUL')", r'\\.\NUL')
421
Steve Dowerabde52c2019-11-15 09:49:21 -0800422 @unittest.skipUnless(HAVE_GETFINALPATHNAME, 'need _getfinalpathname')
Steve Dower7c6130c2019-11-15 16:04:00 -0800423 @unittest.skipUnless(HAVE_GETSHORTPATHNAME, 'need _getshortpathname')
Steve Dowerabde52c2019-11-15 09:49:21 -0800424 def test_realpath_cwd(self):
425 ABSTFN = ntpath.abspath(support.TESTFN)
426
427 support.unlink(ABSTFN)
428 support.rmtree(ABSTFN)
429 os.mkdir(ABSTFN)
430 self.addCleanup(support.rmtree, ABSTFN)
431
432 test_dir_long = ntpath.join(ABSTFN, "MyVeryLongDirectoryName")
Steve Dower7c6130c2019-11-15 16:04:00 -0800433 os.mkdir(test_dir_long)
434
435 test_dir_short = _getshortpathname(test_dir_long)
Steve Dowerabde52c2019-11-15 09:49:21 -0800436 test_file_long = ntpath.join(test_dir_long, "file.txt")
437 test_file_short = ntpath.join(test_dir_short, "file.txt")
438
Steve Dowerabde52c2019-11-15 09:49:21 -0800439 with open(test_file_long, "wb") as f:
440 f.write(b"content")
441
442 self.assertPathEqual(test_file_long, ntpath.realpath(test_file_short))
443
444 with support.change_cwd(test_dir_long):
445 self.assertPathEqual(test_file_long, ntpath.realpath("file.txt"))
446 with support.change_cwd(test_dir_long.lower()):
447 self.assertPathEqual(test_file_long, ntpath.realpath("file.txt"))
448 with support.change_cwd(test_dir_short):
449 self.assertPathEqual(test_file_long, ntpath.realpath("file.txt"))
450
Christian Heimesf6cd9672008-03-26 13:45:42 +0000451 def test_expandvars(self):
Walter Dörwald155374d2009-05-01 19:58:58 +0000452 with support.EnvironmentVarGuard() as env:
453 env.clear()
454 env["foo"] = "bar"
455 env["{foo"] = "baz1"
456 env["{foo}"] = "baz2"
Christian Heimesf6cd9672008-03-26 13:45:42 +0000457 tester('ntpath.expandvars("foo")', "foo")
458 tester('ntpath.expandvars("$foo bar")', "bar bar")
459 tester('ntpath.expandvars("${foo}bar")', "barbar")
460 tester('ntpath.expandvars("$[foo]bar")', "$[foo]bar")
461 tester('ntpath.expandvars("$bar bar")', "$bar bar")
462 tester('ntpath.expandvars("$?bar")', "$?bar")
Christian Heimesf6cd9672008-03-26 13:45:42 +0000463 tester('ntpath.expandvars("$foo}bar")', "bar}bar")
464 tester('ntpath.expandvars("${foo")', "${foo")
465 tester('ntpath.expandvars("${{foo}}")', "baz1}")
466 tester('ntpath.expandvars("$foo$foo")', "barbar")
467 tester('ntpath.expandvars("$bar$bar")', "$bar$bar")
468 tester('ntpath.expandvars("%foo% bar")', "bar bar")
469 tester('ntpath.expandvars("%foo%bar")', "barbar")
470 tester('ntpath.expandvars("%foo%%foo%")', "barbar")
471 tester('ntpath.expandvars("%%foo%%foo%foo%")', "%foo%foobar")
472 tester('ntpath.expandvars("%?bar%")', "%?bar%")
473 tester('ntpath.expandvars("%foo%%bar")', "bar%bar")
474 tester('ntpath.expandvars("\'%foo%\'%bar")', "\'%foo%\'%bar")
Serhiy Storchaka1b87ae02015-03-25 16:40:15 +0200475 tester('ntpath.expandvars("bar\'%foo%")', "bar\'%foo%")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000476
Serhiy Storchakadbb10192014-02-13 10:13:53 +0200477 @unittest.skipUnless(support.FS_NONASCII, 'need support.FS_NONASCII')
478 def test_expandvars_nonascii(self):
479 def check(value, expected):
480 tester('ntpath.expandvars(%r)' % value, expected)
481 with support.EnvironmentVarGuard() as env:
482 env.clear()
483 nonascii = support.FS_NONASCII
484 env['spam'] = nonascii
485 env[nonascii] = 'ham' + nonascii
486 check('$spam bar', '%s bar' % nonascii)
487 check('$%s bar' % nonascii, '$%s bar' % nonascii)
488 check('${spam}bar', '%sbar' % nonascii)
489 check('${%s}bar' % nonascii, 'ham%sbar' % nonascii)
490 check('$spam}bar', '%s}bar' % nonascii)
491 check('$%s}bar' % nonascii, '$%s}bar' % nonascii)
492 check('%spam% bar', '%s bar' % nonascii)
493 check('%{}% bar'.format(nonascii), 'ham%s bar' % nonascii)
494 check('%spam%bar', '%sbar' % nonascii)
495 check('%{}%bar'.format(nonascii), 'ham%sbar' % nonascii)
496
Serhiy Storchakaffc1e6d2014-05-28 18:11:29 +0300497 def test_expanduser(self):
498 tester('ntpath.expanduser("test")', 'test')
499
500 with support.EnvironmentVarGuard() as env:
501 env.clear()
502 tester('ntpath.expanduser("~test")', '~test')
503
504 env['HOMEPATH'] = 'eric\\idle'
505 env['HOMEDRIVE'] = 'C:\\'
506 tester('ntpath.expanduser("~test")', 'C:\\eric\\test')
507 tester('ntpath.expanduser("~")', 'C:\\eric\\idle')
508
509 del env['HOMEDRIVE']
510 tester('ntpath.expanduser("~test")', 'eric\\test')
511 tester('ntpath.expanduser("~")', 'eric\\idle')
512
513 env.clear()
514 env['USERPROFILE'] = 'C:\\eric\\idle'
515 tester('ntpath.expanduser("~test")', 'C:\\eric\\test')
516 tester('ntpath.expanduser("~")', 'C:\\eric\\idle')
Serhiy Storchakaffc1e6d2014-05-28 18:11:29 +0300517 tester('ntpath.expanduser("~test\\foo\\bar")',
Anthony Sottile25ec4a42019-03-12 08:39:57 -0700518 'C:\\eric\\test\\foo\\bar')
Serhiy Storchakaffc1e6d2014-05-28 18:11:29 +0300519 tester('ntpath.expanduser("~test/foo/bar")',
Anthony Sottile25ec4a42019-03-12 08:39:57 -0700520 'C:\\eric\\test/foo/bar')
Serhiy Storchakaffc1e6d2014-05-28 18:11:29 +0300521 tester('ntpath.expanduser("~\\foo\\bar")',
Anthony Sottile25ec4a42019-03-12 08:39:57 -0700522 'C:\\eric\\idle\\foo\\bar')
Serhiy Storchakaffc1e6d2014-05-28 18:11:29 +0300523 tester('ntpath.expanduser("~/foo/bar")',
Anthony Sottile25ec4a42019-03-12 08:39:57 -0700524 'C:\\eric\\idle/foo/bar')
525
526 # bpo-36264: ignore `HOME` when set on windows
527 env.clear()
528 env['HOME'] = 'F:\\'
529 env['USERPROFILE'] = 'C:\\eric\\idle'
530 tester('ntpath.expanduser("~test")', 'C:\\eric\\test')
531 tester('ntpath.expanduser("~")', 'C:\\eric\\idle')
Serhiy Storchakaffc1e6d2014-05-28 18:11:29 +0300532
Steve Dower23ad6d02018-02-22 10:39:10 -0800533 @unittest.skipUnless(nt, "abspath requires 'nt' module")
Christian Heimesf6cd9672008-03-26 13:45:42 +0000534 def test_abspath(self):
Steve Dower23ad6d02018-02-22 10:39:10 -0800535 tester('ntpath.abspath("C:\\")', "C:\\")
Franz Wöllertd2e902e2018-07-29 14:47:09 +0200536 with support.temp_cwd(support.TESTFN) as cwd_dir: # bpo-31047
537 tester('ntpath.abspath("")', cwd_dir)
538 tester('ntpath.abspath(" ")', cwd_dir + "\\ ")
539 tester('ntpath.abspath("?")', cwd_dir + "\\?")
Tim Grahamd03b7752018-10-25 11:26:38 -0400540 drive, _ = ntpath.splitdrive(cwd_dir)
541 tester('ntpath.abspath("/abc/")', drive + "\\abc")
Christian Heimesf6cd9672008-03-26 13:45:42 +0000542
543 def test_relpath(self):
Christian Heimesf6cd9672008-03-26 13:45:42 +0000544 tester('ntpath.relpath("a")', 'a')
Steve Dower75e06492019-08-21 13:43:06 -0700545 tester('ntpath.relpath(ntpath.abspath("a"))', 'a')
Christian Heimesf6cd9672008-03-26 13:45:42 +0000546 tester('ntpath.relpath("a/b")', 'a\\b')
547 tester('ntpath.relpath("../a/b")', '..\\a\\b')
Serhiy Storchaka5106d042015-01-26 10:26:14 +0200548 with support.temp_cwd(support.TESTFN) as cwd_dir:
Steve Dower75e06492019-08-21 13:43:06 -0700549 currentdir = ntpath.basename(cwd_dir)
Serhiy Storchaka5106d042015-01-26 10:26:14 +0200550 tester('ntpath.relpath("a", "../b")', '..\\'+currentdir+'\\a')
551 tester('ntpath.relpath("a/b", "../c")', '..\\'+currentdir+'\\a\\b')
Christian Heimesf6cd9672008-03-26 13:45:42 +0000552 tester('ntpath.relpath("a", "b/c")', '..\\..\\a')
Mark Hammond5a607a32009-05-06 08:04:54 +0000553 tester('ntpath.relpath("c:/foo/bar/bat", "c:/x/y")', '..\\..\\foo\\bar\\bat')
Christian Heimesf6cd9672008-03-26 13:45:42 +0000554 tester('ntpath.relpath("//conky/mountpoint/a", "//conky/mountpoint/b/c")', '..\\..\\a')
555 tester('ntpath.relpath("a", "a")', '.')
Mark Hammond5a607a32009-05-06 08:04:54 +0000556 tester('ntpath.relpath("/foo/bar/bat", "/x/y/z")', '..\\..\\..\\foo\\bar\\bat')
557 tester('ntpath.relpath("/foo/bar/bat", "/foo/bar")', 'bat')
558 tester('ntpath.relpath("/foo/bar/bat", "/")', 'foo\\bar\\bat')
559 tester('ntpath.relpath("/", "/foo/bar/bat")', '..\\..\\..')
560 tester('ntpath.relpath("/foo/bar/bat", "/x")', '..\\foo\\bar\\bat')
561 tester('ntpath.relpath("/x", "/foo/bar/bat")', '..\\..\\..\\x')
562 tester('ntpath.relpath("/", "/")', '.')
563 tester('ntpath.relpath("/a", "/a")', '.')
564 tester('ntpath.relpath("/a/b", "/a/b")', '.')
Hirokazu Yamamotob08820a2010-10-18 12:13:18 +0000565 tester('ntpath.relpath("c:/foo", "C:/FOO")', '.')
Christian Heimesf6cd9672008-03-26 13:45:42 +0000566
Serhiy Storchaka38220932015-03-31 15:31:53 +0300567 def test_commonpath(self):
568 def check(paths, expected):
569 tester(('ntpath.commonpath(%r)' % paths).replace('\\\\', '\\'),
570 expected)
571 def check_error(exc, paths):
572 self.assertRaises(exc, ntpath.commonpath, paths)
573 self.assertRaises(exc, ntpath.commonpath,
574 [os.fsencode(p) for p in paths])
575
576 self.assertRaises(ValueError, ntpath.commonpath, [])
577 check_error(ValueError, ['C:\\Program Files', 'Program Files'])
578 check_error(ValueError, ['C:\\Program Files', 'C:Program Files'])
579 check_error(ValueError, ['\\Program Files', 'Program Files'])
580 check_error(ValueError, ['Program Files', 'C:\\Program Files'])
581 check(['C:\\Program Files'], 'C:\\Program Files')
582 check(['C:\\Program Files', 'C:\\Program Files'], 'C:\\Program Files')
583 check(['C:\\Program Files\\', 'C:\\Program Files'],
584 'C:\\Program Files')
585 check(['C:\\Program Files\\', 'C:\\Program Files\\'],
586 'C:\\Program Files')
587 check(['C:\\\\Program Files', 'C:\\Program Files\\\\'],
588 'C:\\Program Files')
589 check(['C:\\.\\Program Files', 'C:\\Program Files\\.'],
590 'C:\\Program Files')
591 check(['C:\\', 'C:\\bin'], 'C:\\')
592 check(['C:\\Program Files', 'C:\\bin'], 'C:\\')
593 check(['C:\\Program Files', 'C:\\Program Files\\Bar'],
594 'C:\\Program Files')
595 check(['C:\\Program Files\\Foo', 'C:\\Program Files\\Bar'],
596 'C:\\Program Files')
597 check(['C:\\Program Files', 'C:\\Projects'], 'C:\\')
598 check(['C:\\Program Files\\', 'C:\\Projects'], 'C:\\')
599
600 check(['C:\\Program Files\\Foo', 'C:/Program Files/Bar'],
601 'C:\\Program Files')
602 check(['C:\\Program Files\\Foo', 'c:/program files/bar'],
603 'C:\\Program Files')
604 check(['c:/program files/bar', 'C:\\Program Files\\Foo'],
605 'c:\\program files')
606
607 check_error(ValueError, ['C:\\Program Files', 'D:\\Program Files'])
608
609 check(['spam'], 'spam')
610 check(['spam', 'spam'], 'spam')
611 check(['spam', 'alot'], '')
612 check(['and\\jam', 'and\\spam'], 'and')
613 check(['and\\\\jam', 'and\\spam\\\\'], 'and')
614 check(['and\\.\\jam', '.\\and\\spam'], 'and')
615 check(['and\\jam', 'and\\spam', 'alot'], '')
616 check(['and\\jam', 'and\\spam', 'and'], 'and')
617 check(['C:and\\jam', 'C:and\\spam'], 'C:and')
618
619 check([''], '')
620 check(['', 'spam\\alot'], '')
621 check_error(ValueError, ['', '\\spam\\alot'])
622
623 self.assertRaises(TypeError, ntpath.commonpath,
624 [b'C:\\Program Files', 'C:\\Program Files\\Foo'])
625 self.assertRaises(TypeError, ntpath.commonpath,
626 [b'C:\\Program Files', 'Program Files\\Foo'])
627 self.assertRaises(TypeError, ntpath.commonpath,
628 [b'Program Files', 'C:\\Program Files\\Foo'])
629 self.assertRaises(TypeError, ntpath.commonpath,
630 ['C:\\Program Files', b'C:\\Program Files\\Foo'])
631 self.assertRaises(TypeError, ntpath.commonpath,
632 ['C:\\Program Files', b'Program Files\\Foo'])
633 self.assertRaises(TypeError, ntpath.commonpath,
634 ['Program Files', b'C:\\Program Files\\Foo'])
635
Brian Curtin62857742010-09-06 17:07:27 +0000636 def test_sameopenfile(self):
637 with TemporaryFile() as tf1, TemporaryFile() as tf2:
638 # Make sure the same file is really the same
639 self.assertTrue(ntpath.sameopenfile(tf1.fileno(), tf1.fileno()))
640 # Make sure different files are really different
641 self.assertFalse(ntpath.sameopenfile(tf1.fileno(), tf2.fileno()))
Brian Curtin13a0db52010-09-06 19:46:17 +0000642 # Make sure invalid values don't cause issues on win32
643 if sys.platform == "win32":
Hirokazu Yamamoto26253bb2010-12-05 04:16:47 +0000644 with self.assertRaises(OSError):
Brian Curtin13a0db52010-09-06 19:46:17 +0000645 # Invalid file descriptors shouldn't display assert
646 # dialogs (#4804)
647 ntpath.sameopenfile(-1, -1)
Brian Curtin62857742010-09-06 17:07:27 +0000648
Tim Golden6b528062013-08-01 12:44:00 +0100649 def test_ismount(self):
650 self.assertTrue(ntpath.ismount("c:\\"))
651 self.assertTrue(ntpath.ismount("C:\\"))
652 self.assertTrue(ntpath.ismount("c:/"))
653 self.assertTrue(ntpath.ismount("C:/"))
654 self.assertTrue(ntpath.ismount("\\\\.\\c:\\"))
655 self.assertTrue(ntpath.ismount("\\\\.\\C:\\"))
656
657 self.assertTrue(ntpath.ismount(b"c:\\"))
658 self.assertTrue(ntpath.ismount(b"C:\\"))
659 self.assertTrue(ntpath.ismount(b"c:/"))
660 self.assertTrue(ntpath.ismount(b"C:/"))
661 self.assertTrue(ntpath.ismount(b"\\\\.\\c:\\"))
662 self.assertTrue(ntpath.ismount(b"\\\\.\\C:\\"))
663
664 with support.temp_dir() as d:
665 self.assertFalse(ntpath.ismount(d))
666
Tim Goldenb2fcebb2013-08-01 13:58:58 +0100667 if sys.platform == "win32":
668 #
669 # Make sure the current folder isn't the root folder
670 # (or any other volume root). The drive-relative
671 # locations below cannot then refer to mount points
672 #
673 drive, path = ntpath.splitdrive(sys.executable)
Steve Dower75e06492019-08-21 13:43:06 -0700674 with support.change_cwd(ntpath.dirname(sys.executable)):
Tim Goldenb2fcebb2013-08-01 13:58:58 +0100675 self.assertFalse(ntpath.ismount(drive.lower()))
676 self.assertFalse(ntpath.ismount(drive.upper()))
Tim Golden6b528062013-08-01 12:44:00 +0100677
Tim Goldenb2fcebb2013-08-01 13:58:58 +0100678 self.assertTrue(ntpath.ismount("\\\\localhost\\c$"))
679 self.assertTrue(ntpath.ismount("\\\\localhost\\c$\\"))
Tim Golden6b528062013-08-01 12:44:00 +0100680
Tim Goldenb2fcebb2013-08-01 13:58:58 +0100681 self.assertTrue(ntpath.ismount(b"\\\\localhost\\c$"))
682 self.assertTrue(ntpath.ismount(b"\\\\localhost\\c$\\"))
Christian Heimesf6cd9672008-03-26 13:45:42 +0000683
Tim Goldenff64add2018-07-25 14:36:54 +0100684 def assertEqualCI(self, s1, s2):
685 """Assert that two strings are equal ignoring case differences."""
686 self.assertEqual(s1.lower(), s2.lower())
687
Steve Dower23ad6d02018-02-22 10:39:10 -0800688 @unittest.skipUnless(nt, "OS helpers require 'nt' module")
689 def test_nt_helpers(self):
690 # Trivial validation that the helpers do not break, and support both
691 # unicode and bytes (UTF-8) paths
692
Tim Goldenff64add2018-07-25 14:36:54 +0100693 executable = nt._getfinalpathname(sys.executable)
694
695 for path in executable, os.fsencode(executable):
696 volume_path = nt._getvolumepathname(path)
697 path_drive = ntpath.splitdrive(path)[0]
698 volume_path_drive = ntpath.splitdrive(volume_path)[0]
699 self.assertEqualCI(path_drive, volume_path_drive)
Steve Dower23ad6d02018-02-22 10:39:10 -0800700
701 cap, free = nt._getdiskusage(sys.exec_prefix)
702 self.assertGreater(cap, 0)
703 self.assertGreater(free, 0)
704 b_cap, b_free = nt._getdiskusage(sys.exec_prefix.encode())
705 # Free space may change, so only test the capacity is equal
706 self.assertEqual(b_cap, cap)
707 self.assertGreater(b_free, 0)
708
709 for path in [sys.prefix, sys.executable]:
710 final_path = nt._getfinalpathname(path)
711 self.assertIsInstance(final_path, str)
712 self.assertGreater(len(final_path), 0)
713
714 b_final_path = nt._getfinalpathname(path.encode())
715 self.assertIsInstance(b_final_path, bytes)
716 self.assertGreater(len(b_final_path), 0)
717
Ezio Melottid0dfe9a2013-01-10 03:12:50 +0200718class NtCommonTest(test_genericpath.CommonTest, unittest.TestCase):
Florent Xiclunac9c79782010-03-08 12:24:53 +0000719 pathmodule = ntpath
Serhiy Storchaka9ed707e2017-01-13 20:55:05 +0200720 attributes = ['relpath']
Florent Xiclunac9c79782010-03-08 12:24:53 +0000721
722
Steve Dower97d79062019-09-10 14:52:48 +0100723class PathLikeTests(NtpathTestCase):
Brett Cannon3f9183b2016-08-26 14:44:48 -0700724
725 path = ntpath
726
Brett Cannon3f9183b2016-08-26 14:44:48 -0700727 def setUp(self):
Serhiy Storchaka700cfa82020-06-25 17:56:31 +0300728 self.file_name = support.TESTFN
Serhiy Storchakab21d1552018-03-02 11:53:51 +0200729 self.file_path = FakePath(support.TESTFN)
Brett Cannon3f9183b2016-08-26 14:44:48 -0700730 self.addCleanup(support.unlink, self.file_name)
731 with open(self.file_name, 'xb', 0) as file:
732 file.write(b"test_ntpath.PathLikeTests")
733
Steve Dower97d79062019-09-10 14:52:48 +0100734 def _check_function(self, func):
735 self.assertPathEqual(func(self.file_path), func(self.file_name))
Brett Cannon3f9183b2016-08-26 14:44:48 -0700736
737 def test_path_normcase(self):
Steve Dower97d79062019-09-10 14:52:48 +0100738 self._check_function(self.path.normcase)
Brett Cannon3f9183b2016-08-26 14:44:48 -0700739
740 def test_path_isabs(self):
Steve Dower97d79062019-09-10 14:52:48 +0100741 self._check_function(self.path.isabs)
Brett Cannon3f9183b2016-08-26 14:44:48 -0700742
743 def test_path_join(self):
Serhiy Storchakab21d1552018-03-02 11:53:51 +0200744 self.assertEqual(self.path.join('a', FakePath('b'), 'c'),
Brett Cannon3f9183b2016-08-26 14:44:48 -0700745 self.path.join('a', 'b', 'c'))
746
747 def test_path_split(self):
Steve Dower97d79062019-09-10 14:52:48 +0100748 self._check_function(self.path.split)
Brett Cannon3f9183b2016-08-26 14:44:48 -0700749
750 def test_path_splitext(self):
Steve Dower97d79062019-09-10 14:52:48 +0100751 self._check_function(self.path.splitext)
Brett Cannon3f9183b2016-08-26 14:44:48 -0700752
753 def test_path_splitdrive(self):
Steve Dower97d79062019-09-10 14:52:48 +0100754 self._check_function(self.path.splitdrive)
Brett Cannon3f9183b2016-08-26 14:44:48 -0700755
756 def test_path_basename(self):
Steve Dower97d79062019-09-10 14:52:48 +0100757 self._check_function(self.path.basename)
Brett Cannon3f9183b2016-08-26 14:44:48 -0700758
759 def test_path_dirname(self):
Steve Dower97d79062019-09-10 14:52:48 +0100760 self._check_function(self.path.dirname)
Brett Cannon3f9183b2016-08-26 14:44:48 -0700761
762 def test_path_islink(self):
Steve Dower97d79062019-09-10 14:52:48 +0100763 self._check_function(self.path.islink)
Brett Cannon3f9183b2016-08-26 14:44:48 -0700764
765 def test_path_lexists(self):
Steve Dower97d79062019-09-10 14:52:48 +0100766 self._check_function(self.path.lexists)
Brett Cannon3f9183b2016-08-26 14:44:48 -0700767
768 def test_path_ismount(self):
Steve Dower97d79062019-09-10 14:52:48 +0100769 self._check_function(self.path.ismount)
Brett Cannon3f9183b2016-08-26 14:44:48 -0700770
771 def test_path_expanduser(self):
Steve Dower97d79062019-09-10 14:52:48 +0100772 self._check_function(self.path.expanduser)
Brett Cannon3f9183b2016-08-26 14:44:48 -0700773
774 def test_path_expandvars(self):
Steve Dower97d79062019-09-10 14:52:48 +0100775 self._check_function(self.path.expandvars)
Brett Cannon3f9183b2016-08-26 14:44:48 -0700776
777 def test_path_normpath(self):
Steve Dower97d79062019-09-10 14:52:48 +0100778 self._check_function(self.path.normpath)
Brett Cannon3f9183b2016-08-26 14:44:48 -0700779
780 def test_path_abspath(self):
Steve Dower97d79062019-09-10 14:52:48 +0100781 self._check_function(self.path.abspath)
Brett Cannon3f9183b2016-08-26 14:44:48 -0700782
783 def test_path_realpath(self):
Steve Dower97d79062019-09-10 14:52:48 +0100784 self._check_function(self.path.realpath)
Brett Cannon3f9183b2016-08-26 14:44:48 -0700785
786 def test_path_relpath(self):
Steve Dower97d79062019-09-10 14:52:48 +0100787 self._check_function(self.path.relpath)
Brett Cannon3f9183b2016-08-26 14:44:48 -0700788
789 def test_path_commonpath(self):
790 common_path = self.path.commonpath([self.file_path, self.file_name])
Steve Dower97d79062019-09-10 14:52:48 +0100791 self.assertPathEqual(common_path, self.file_name)
Brett Cannon3f9183b2016-08-26 14:44:48 -0700792
793 def test_path_isdir(self):
Steve Dower97d79062019-09-10 14:52:48 +0100794 self._check_function(self.path.isdir)
Brett Cannon3f9183b2016-08-26 14:44:48 -0700795
796
Christian Heimesf6cd9672008-03-26 13:45:42 +0000797if __name__ == "__main__":
798 unittest.main()