blob: 1b1167a00614b75f4481a26c88c8bae5a4ac6898 [file] [log] [blame]
Brett Cannonb47243a2003-06-16 21:54:50 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Skip Montanaroe809b002000-07-12 00:20:08 +00003
Brett Cannonb47243a2003-06-16 21:54:50 +00004import posixpath, os
Guido van Rossumd8faa362007-04-27 19:54:29 +00005from posixpath import realpath, abspath, join, dirname, basename, relpath
Johannes Gijsbers4ec40642004-08-14 15:01:53 +00006
7# An absolute path to a temporary filename for testing. We can't rely on TESTFN
8# being an absolute path, so we need this.
9
Benjamin Petersonee8712c2008-05-20 21:35:26 +000010ABSTFN = abspath(support.TESTFN)
Skip Montanaroe809b002000-07-12 00:20:08 +000011
Guido van Rossumd8faa362007-04-27 19:54:29 +000012def safe_rmdir(dirname):
13 try:
14 os.rmdir(dirname)
15 except OSError:
16 pass
17
Brett Cannonb47243a2003-06-16 21:54:50 +000018class PosixPathTest(unittest.TestCase):
Skip Montanaroe809b002000-07-12 00:20:08 +000019
Guido van Rossumd8faa362007-04-27 19:54:29 +000020 def setUp(self):
21 self.tearDown()
22
23 def tearDown(self):
24 for suffix in ["", "1", "2"]:
Benjamin Petersonee8712c2008-05-20 21:35:26 +000025 support.unlink(support.TESTFN + suffix)
26 safe_rmdir(support.TESTFN + suffix)
Guido van Rossumd8faa362007-04-27 19:54:29 +000027
Brett Cannonb47243a2003-06-16 21:54:50 +000028 def test_normcase(self):
29 # Check that normcase() is idempotent
30 p = "FoO/./BaR"
Guido van Rossumf0af3e32008-10-02 18:55:37 +000031 self.assertEqual(p, posixpath.normcase(p))
32
33 p = b"FoO/./BaR"
Brett Cannonb47243a2003-06-16 21:54:50 +000034 self.assertEqual(p, posixpath.normcase(p))
Skip Montanaroe809b002000-07-12 00:20:08 +000035
Brett Cannonb47243a2003-06-16 21:54:50 +000036 self.assertRaises(TypeError, posixpath.normcase)
Skip Montanaroe809b002000-07-12 00:20:08 +000037
Brett Cannonb47243a2003-06-16 21:54:50 +000038 def test_join(self):
Guido van Rossumf0af3e32008-10-02 18:55:37 +000039 self.assertEqual(posixpath.join("/foo", "bar", "/bar", "baz"),
40 "/bar/baz")
Brett Cannonb47243a2003-06-16 21:54:50 +000041 self.assertEqual(posixpath.join("/foo", "bar", "baz"), "/foo/bar/baz")
Guido van Rossumf0af3e32008-10-02 18:55:37 +000042 self.assertEqual(posixpath.join("/foo/", "bar/", "baz/"),
43 "/foo/bar/baz/")
44
45 self.assertEqual(posixpath.join(b"/foo", b"bar", b"/bar", b"baz"),
46 b"/bar/baz")
47 self.assertEqual(posixpath.join(b"/foo", b"bar", b"baz"),
48 b"/foo/bar/baz")
49 self.assertEqual(posixpath.join(b"/foo/", b"bar/", b"baz/"),
50 b"/foo/bar/baz/")
Skip Montanaroe809b002000-07-12 00:20:08 +000051
Brett Cannonb47243a2003-06-16 21:54:50 +000052 self.assertRaises(TypeError, posixpath.join)
Guido van Rossumf0af3e32008-10-02 18:55:37 +000053 self.assertRaises(TypeError, posixpath.join, b"bytes", "str")
54 self.assertRaises(TypeError, posixpath.join, "str", b"bytes")
Skip Montanaroe809b002000-07-12 00:20:08 +000055
Brett Cannonb47243a2003-06-16 21:54:50 +000056 def test_splitdrive(self):
57 self.assertEqual(posixpath.splitdrive("/foo/bar"), ("", "/foo/bar"))
Guido van Rossumf0af3e32008-10-02 18:55:37 +000058 self.assertEqual(posixpath.splitdrive(b"/foo/bar"), (b"", b"/foo/bar"))
Brett Cannonb47243a2003-06-16 21:54:50 +000059
60 self.assertRaises(TypeError, posixpath.splitdrive)
61
62 def test_split(self):
63 self.assertEqual(posixpath.split("/foo/bar"), ("/foo", "bar"))
64 self.assertEqual(posixpath.split("/"), ("/", ""))
65 self.assertEqual(posixpath.split("foo"), ("", "foo"))
66 self.assertEqual(posixpath.split("////foo"), ("////", "foo"))
67 self.assertEqual(posixpath.split("//foo//bar"), ("//foo", "bar"))
68
Guido van Rossumf0af3e32008-10-02 18:55:37 +000069 self.assertEqual(posixpath.split(b"/foo/bar"), (b"/foo", b"bar"))
70 self.assertEqual(posixpath.split(b"/"), (b"/", b""))
71 self.assertEqual(posixpath.split(b"foo"), (b"", b"foo"))
72 self.assertEqual(posixpath.split(b"////foo"), (b"////", b"foo"))
73 self.assertEqual(posixpath.split(b"//foo//bar"), (b"//foo", b"bar"))
74
Brett Cannonb47243a2003-06-16 21:54:50 +000075 self.assertRaises(TypeError, posixpath.split)
76
Guido van Rossumd8faa362007-04-27 19:54:29 +000077 def splitextTest(self, path, filename, ext):
78 self.assertEqual(posixpath.splitext(path), (filename, ext))
79 self.assertEqual(posixpath.splitext("/" + path), ("/" + filename, ext))
Guido van Rossumf0af3e32008-10-02 18:55:37 +000080 self.assertEqual(posixpath.splitext("abc/" + path),
81 ("abc/" + filename, ext))
82 self.assertEqual(posixpath.splitext("abc.def/" + path),
83 ("abc.def/" + filename, ext))
84 self.assertEqual(posixpath.splitext("/abc.def/" + path),
85 ("/abc.def/" + filename, ext))
86 self.assertEqual(posixpath.splitext(path + "/"),
87 (filename + ext + "/", ""))
88
89 path = bytes(path, "ASCII")
90 filename = bytes(filename, "ASCII")
91 ext = bytes(ext, "ASCII")
92
93 self.assertEqual(posixpath.splitext(path), (filename, ext))
94 self.assertEqual(posixpath.splitext(b"/" + path),
95 (b"/" + filename, ext))
96 self.assertEqual(posixpath.splitext(b"abc/" + path),
97 (b"abc/" + filename, ext))
98 self.assertEqual(posixpath.splitext(b"abc.def/" + path),
99 (b"abc.def/" + filename, ext))
100 self.assertEqual(posixpath.splitext(b"/abc.def/" + path),
101 (b"/abc.def/" + filename, ext))
102 self.assertEqual(posixpath.splitext(path + b"/"),
103 (filename + ext + b"/", b""))
Brett Cannonb47243a2003-06-16 21:54:50 +0000104
Guido van Rossumd8faa362007-04-27 19:54:29 +0000105 def test_splitext(self):
106 self.splitextTest("foo.bar", "foo", ".bar")
107 self.splitextTest("foo.boo.bar", "foo.boo", ".bar")
108 self.splitextTest("foo.boo.biff.bar", "foo.boo.biff", ".bar")
109 self.splitextTest(".csh.rc", ".csh", ".rc")
110 self.splitextTest("nodots", "nodots", "")
111 self.splitextTest(".cshrc", ".cshrc", "")
112 self.splitextTest("...manydots", "...manydots", "")
113 self.splitextTest("...manydots.ext", "...manydots", ".ext")
114 self.splitextTest(".", ".", "")
115 self.splitextTest("..", "..", "")
116 self.splitextTest("........", "........", "")
117 self.splitextTest("", "", "")
Brett Cannonb47243a2003-06-16 21:54:50 +0000118 self.assertRaises(TypeError, posixpath.splitext)
119
120 def test_isabs(self):
121 self.assertIs(posixpath.isabs(""), False)
122 self.assertIs(posixpath.isabs("/"), True)
123 self.assertIs(posixpath.isabs("/foo"), True)
124 self.assertIs(posixpath.isabs("/foo/bar"), True)
125 self.assertIs(posixpath.isabs("foo/bar"), False)
126
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000127 self.assertIs(posixpath.isabs(b""), False)
128 self.assertIs(posixpath.isabs(b"/"), True)
129 self.assertIs(posixpath.isabs(b"/foo"), True)
130 self.assertIs(posixpath.isabs(b"/foo/bar"), True)
131 self.assertIs(posixpath.isabs(b"foo/bar"), False)
132
Brett Cannonb47243a2003-06-16 21:54:50 +0000133 self.assertRaises(TypeError, posixpath.isabs)
134
Brett Cannonb47243a2003-06-16 21:54:50 +0000135 def test_basename(self):
136 self.assertEqual(posixpath.basename("/foo/bar"), "bar")
137 self.assertEqual(posixpath.basename("/"), "")
138 self.assertEqual(posixpath.basename("foo"), "foo")
139 self.assertEqual(posixpath.basename("////foo"), "foo")
140 self.assertEqual(posixpath.basename("//foo//bar"), "bar")
141
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000142 self.assertEqual(posixpath.basename(b"/foo/bar"), b"bar")
143 self.assertEqual(posixpath.basename(b"/"), b"")
144 self.assertEqual(posixpath.basename(b"foo"), b"foo")
145 self.assertEqual(posixpath.basename(b"////foo"), b"foo")
146 self.assertEqual(posixpath.basename(b"//foo//bar"), b"bar")
147
Brett Cannonb47243a2003-06-16 21:54:50 +0000148 self.assertRaises(TypeError, posixpath.basename)
149
150 def test_dirname(self):
151 self.assertEqual(posixpath.dirname("/foo/bar"), "/foo")
152 self.assertEqual(posixpath.dirname("/"), "/")
153 self.assertEqual(posixpath.dirname("foo"), "")
154 self.assertEqual(posixpath.dirname("////foo"), "////")
155 self.assertEqual(posixpath.dirname("//foo//bar"), "//foo")
156
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000157 self.assertEqual(posixpath.dirname(b"/foo/bar"), b"/foo")
158 self.assertEqual(posixpath.dirname(b"/"), b"/")
159 self.assertEqual(posixpath.dirname(b"foo"), b"")
160 self.assertEqual(posixpath.dirname(b"////foo"), b"////")
161 self.assertEqual(posixpath.dirname(b"//foo//bar"), b"//foo")
162
Brett Cannonb47243a2003-06-16 21:54:50 +0000163 self.assertRaises(TypeError, posixpath.dirname)
164
165 def test_commonprefix(self):
166 self.assertEqual(
167 posixpath.commonprefix([]),
168 ""
169 )
170 self.assertEqual(
171 posixpath.commonprefix(["/home/swenson/spam", "/home/swen/spam"]),
172 "/home/swen"
173 )
174 self.assertEqual(
175 posixpath.commonprefix(["/home/swen/spam", "/home/swen/eggs"]),
176 "/home/swen/"
177 )
178 self.assertEqual(
179 posixpath.commonprefix(["/home/swen/spam", "/home/swen/spam"]),
180 "/home/swen/spam"
181 )
182
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000183 self.assertEqual(
184 posixpath.commonprefix([b"/home/swenson/spam", b"/home/swen/spam"]),
185 b"/home/swen"
186 )
187 self.assertEqual(
188 posixpath.commonprefix([b"/home/swen/spam", b"/home/swen/eggs"]),
189 b"/home/swen/"
190 )
191 self.assertEqual(
192 posixpath.commonprefix([b"/home/swen/spam", b"/home/swen/spam"]),
193 b"/home/swen/spam"
194 )
195
Guido van Rossum360e4b82007-05-14 22:51:27 +0000196 testlist = ['', 'abc', 'Xbcd', 'Xb', 'XY', 'abcd', 'aXc', 'abd', 'ab', 'aX', 'abcX']
197 for s1 in testlist:
198 for s2 in testlist:
199 p = posixpath.commonprefix([s1, s2])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000200 self.assertTrue(s1.startswith(p))
201 self.assertTrue(s2.startswith(p))
Guido van Rossum360e4b82007-05-14 22:51:27 +0000202 if s1 != s2:
203 n = len(p)
204 self.assertNotEqual(s1[n:n+1], s2[n:n+1])
205
Brett Cannonb47243a2003-06-16 21:54:50 +0000206 def test_getsize(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000207 f = open(support.TESTFN, "wb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000208 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000209 f.write(b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000210 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000211 self.assertEqual(posixpath.getsize(support.TESTFN), 3)
Brett Cannonb47243a2003-06-16 21:54:50 +0000212 finally:
213 if not f.closed:
214 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000215
216 def test_time(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000217 f = open(support.TESTFN, "wb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000218 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000219 f.write(b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000220 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000221 f = open(support.TESTFN, "ab")
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000222 f.write(b"bar")
Brett Cannonb47243a2003-06-16 21:54:50 +0000223 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000224 f = open(support.TESTFN, "rb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000225 d = f.read()
226 f.close()
Guido van Rossum98f13752007-07-10 12:07:30 +0000227 self.assertEqual(d, b"foobar")
Brett Cannonb47243a2003-06-16 21:54:50 +0000228
Ezio Melottia11865b2010-02-20 09:47:55 +0000229 self.assertLessEqual(
230 posixpath.getctime(support.TESTFN),
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000231 posixpath.getmtime(support.TESTFN)
Brett Cannonb47243a2003-06-16 21:54:50 +0000232 )
233 finally:
234 if not f.closed:
235 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000236
237 def test_islink(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000238 self.assertIs(posixpath.islink(support.TESTFN + "1"), False)
239 f = open(support.TESTFN + "1", "wb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000240 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000241 f.write(b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000242 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000243 self.assertIs(posixpath.islink(support.TESTFN + "1"), False)
Brett Cannonb47243a2003-06-16 21:54:50 +0000244 if hasattr(os, "symlink"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000245 os.symlink(support.TESTFN + "1", support.TESTFN + "2")
246 self.assertIs(posixpath.islink(support.TESTFN + "2"), True)
247 os.remove(support.TESTFN + "1")
248 self.assertIs(posixpath.islink(support.TESTFN + "2"), True)
249 self.assertIs(posixpath.exists(support.TESTFN + "2"), False)
250 self.assertIs(posixpath.lexists(support.TESTFN + "2"), True)
Brett Cannonb47243a2003-06-16 21:54:50 +0000251 finally:
252 if not f.close():
253 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000254
255 self.assertRaises(TypeError, posixpath.islink)
256
257 def test_exists(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000258 self.assertIs(posixpath.exists(support.TESTFN), False)
259 f = open(support.TESTFN, "wb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000260 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000261 f.write(b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000262 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000263 self.assertIs(posixpath.exists(support.TESTFN), True)
264 self.assertIs(posixpath.lexists(support.TESTFN), True)
Brett Cannonb47243a2003-06-16 21:54:50 +0000265 finally:
266 if not f.close():
267 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000268
269 self.assertRaises(TypeError, posixpath.exists)
270
271 def test_isdir(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000272 self.assertIs(posixpath.isdir(support.TESTFN), False)
273 f = open(support.TESTFN, "wb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000274 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000275 f.write(b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000276 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000277 self.assertIs(posixpath.isdir(support.TESTFN), False)
278 os.remove(support.TESTFN)
279 os.mkdir(support.TESTFN)
280 self.assertIs(posixpath.isdir(support.TESTFN), True)
281 os.rmdir(support.TESTFN)
Brett Cannonb47243a2003-06-16 21:54:50 +0000282 finally:
283 if not f.close():
284 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000285
286 self.assertRaises(TypeError, posixpath.isdir)
287
288 def test_isfile(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000289 self.assertIs(posixpath.isfile(support.TESTFN), False)
290 f = open(support.TESTFN, "wb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000291 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000292 f.write(b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000293 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000294 self.assertIs(posixpath.isfile(support.TESTFN), True)
295 os.remove(support.TESTFN)
296 os.mkdir(support.TESTFN)
297 self.assertIs(posixpath.isfile(support.TESTFN), False)
298 os.rmdir(support.TESTFN)
Brett Cannonb47243a2003-06-16 21:54:50 +0000299 finally:
300 if not f.close():
301 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000302
303 self.assertRaises(TypeError, posixpath.isdir)
304
Guido van Rossumd8faa362007-04-27 19:54:29 +0000305 def test_samefile(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000306 f = open(support.TESTFN + "1", "wb")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000307 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000308 f.write(b"foo")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000309 f.close()
310 self.assertIs(
311 posixpath.samefile(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000312 support.TESTFN + "1",
313 support.TESTFN + "1"
Guido van Rossumd8faa362007-04-27 19:54:29 +0000314 ),
315 True
316 )
317 # If we don't have links, assume that os.stat doesn't return resonable
318 # inode information and thus, that samefile() doesn't work
319 if hasattr(os, "symlink"):
320 os.symlink(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000321 support.TESTFN + "1",
322 support.TESTFN + "2"
Guido van Rossumd8faa362007-04-27 19:54:29 +0000323 )
324 self.assertIs(
325 posixpath.samefile(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000326 support.TESTFN + "1",
327 support.TESTFN + "2"
Guido van Rossumd8faa362007-04-27 19:54:29 +0000328 ),
329 True
330 )
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000331 os.remove(support.TESTFN + "2")
332 f = open(support.TESTFN + "2", "wb")
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000333 f.write(b"bar")
Brett Cannonb47243a2003-06-16 21:54:50 +0000334 f.close()
335 self.assertIs(
336 posixpath.samefile(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000337 support.TESTFN + "1",
338 support.TESTFN + "2"
Guido van Rossumd8faa362007-04-27 19:54:29 +0000339 ),
340 False
341 )
342 finally:
343 if not f.close():
344 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000345
Guido van Rossumd8faa362007-04-27 19:54:29 +0000346 self.assertRaises(TypeError, posixpath.samefile)
Brett Cannonb47243a2003-06-16 21:54:50 +0000347
348 def test_samestat(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000349 f = open(support.TESTFN + "1", "wb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000350 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000351 f.write(b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000352 f.close()
353 self.assertIs(
354 posixpath.samestat(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000355 os.stat(support.TESTFN + "1"),
356 os.stat(support.TESTFN + "1")
Brett Cannonb47243a2003-06-16 21:54:50 +0000357 ),
358 True
359 )
Tim Peters478c1052003-06-29 05:46:54 +0000360 # If we don't have links, assume that os.stat() doesn't return resonable
Brett Cannonb47243a2003-06-16 21:54:50 +0000361 # inode information and thus, that samefile() doesn't work
362 if hasattr(os, "symlink"):
363 if hasattr(os, "symlink"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000364 os.symlink(support.TESTFN + "1", support.TESTFN + "2")
Brett Cannonb47243a2003-06-16 21:54:50 +0000365 self.assertIs(
366 posixpath.samestat(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000367 os.stat(support.TESTFN + "1"),
368 os.stat(support.TESTFN + "2")
Brett Cannonb47243a2003-06-16 21:54:50 +0000369 ),
370 True
371 )
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000372 os.remove(support.TESTFN + "2")
373 f = open(support.TESTFN + "2", "wb")
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000374 f.write(b"bar")
Brett Cannonb47243a2003-06-16 21:54:50 +0000375 f.close()
376 self.assertIs(
377 posixpath.samestat(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000378 os.stat(support.TESTFN + "1"),
379 os.stat(support.TESTFN + "2")
Brett Cannonb47243a2003-06-16 21:54:50 +0000380 ),
381 False
382 )
383 finally:
384 if not f.close():
385 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000386
387 self.assertRaises(TypeError, posixpath.samestat)
388
389 def test_ismount(self):
390 self.assertIs(posixpath.ismount("/"), True)
391
392 self.assertRaises(TypeError, posixpath.ismount)
393
394 def test_expanduser(self):
395 self.assertEqual(posixpath.expanduser("foo"), "foo")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000396 self.assertEqual(posixpath.expanduser(b"foo"), b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000397 try:
398 import pwd
399 except ImportError:
400 pass
401 else:
Ezio Melottie9615932010-01-24 19:26:24 +0000402 self.assertIsInstance(posixpath.expanduser("~/"), str)
403 self.assertIsInstance(posixpath.expanduser(b"~/"), bytes)
Neal Norwitz168e73d2003-07-01 03:33:31 +0000404 # if home directory == root directory, this test makes no sense
405 if posixpath.expanduser("~") != '/':
406 self.assertEqual(
407 posixpath.expanduser("~") + "/",
408 posixpath.expanduser("~/")
409 )
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000410 self.assertEqual(
411 posixpath.expanduser(b"~") + b"/",
412 posixpath.expanduser(b"~/")
413 )
Ezio Melottie9615932010-01-24 19:26:24 +0000414 self.assertIsInstance(posixpath.expanduser("~root/"), str)
415 self.assertIsInstance(posixpath.expanduser("~foo/"), str)
416 self.assertIsInstance(posixpath.expanduser(b"~root/"), bytes)
417 self.assertIsInstance(posixpath.expanduser(b"~foo/"), bytes)
Brett Cannonb47243a2003-06-16 21:54:50 +0000418
Hirokazu Yamamoto71959632009-04-27 01:44:28 +0000419 with support.EnvironmentVarGuard() as env:
Walter Dörwald155374d2009-05-01 19:58:58 +0000420 env['HOME'] = '/'
Walter Dörwaldb525e182009-04-26 21:39:21 +0000421 self.assertEqual(posixpath.expanduser("~"), "/")
Benjamin Petersonef3e4c22009-04-11 19:48:14 +0000422
Brett Cannonb47243a2003-06-16 21:54:50 +0000423 self.assertRaises(TypeError, posixpath.expanduser)
424
425 def test_expandvars(self):
Walter Dörwald155374d2009-05-01 19:58:58 +0000426 with support.EnvironmentVarGuard() as env:
427 env.clear()
428 env["foo"] = "bar"
429 env["{foo"] = "baz1"
430 env["{foo}"] = "baz2"
Brett Cannonb47243a2003-06-16 21:54:50 +0000431 self.assertEqual(posixpath.expandvars("foo"), "foo")
432 self.assertEqual(posixpath.expandvars("$foo bar"), "bar bar")
433 self.assertEqual(posixpath.expandvars("${foo}bar"), "barbar")
434 self.assertEqual(posixpath.expandvars("$[foo]bar"), "$[foo]bar")
435 self.assertEqual(posixpath.expandvars("$bar bar"), "$bar bar")
436 self.assertEqual(posixpath.expandvars("$?bar"), "$?bar")
437 self.assertEqual(posixpath.expandvars("${foo}bar"), "barbar")
438 self.assertEqual(posixpath.expandvars("$foo}bar"), "bar}bar")
439 self.assertEqual(posixpath.expandvars("${foo"), "${foo")
440 self.assertEqual(posixpath.expandvars("${{foo}}"), "baz1}")
Thomas Woutersb2137042007-02-01 18:02:27 +0000441 self.assertEqual(posixpath.expandvars("$foo$foo"), "barbar")
442 self.assertEqual(posixpath.expandvars("$bar$bar"), "$bar$bar")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000443
444 self.assertEqual(posixpath.expandvars(b"foo"), b"foo")
445 self.assertEqual(posixpath.expandvars(b"$foo bar"), b"bar bar")
446 self.assertEqual(posixpath.expandvars(b"${foo}bar"), b"barbar")
447 self.assertEqual(posixpath.expandvars(b"$[foo]bar"), b"$[foo]bar")
448 self.assertEqual(posixpath.expandvars(b"$bar bar"), b"$bar bar")
449 self.assertEqual(posixpath.expandvars(b"$?bar"), b"$?bar")
450 self.assertEqual(posixpath.expandvars(b"${foo}bar"), b"barbar")
451 self.assertEqual(posixpath.expandvars(b"$foo}bar"), b"bar}bar")
452 self.assertEqual(posixpath.expandvars(b"${foo"), b"${foo")
453 self.assertEqual(posixpath.expandvars(b"${{foo}}"), b"baz1}")
454 self.assertEqual(posixpath.expandvars(b"$foo$foo"), b"barbar")
455 self.assertEqual(posixpath.expandvars(b"$bar$bar"), b"$bar$bar")
Walter Dörwald155374d2009-05-01 19:58:58 +0000456 self.assertRaises(TypeError, posixpath.expandvars)
Brett Cannonb47243a2003-06-16 21:54:50 +0000457
458 def test_normpath(self):
459 self.assertEqual(posixpath.normpath(""), ".")
460 self.assertEqual(posixpath.normpath("/"), "/")
461 self.assertEqual(posixpath.normpath("//"), "//")
462 self.assertEqual(posixpath.normpath("///"), "/")
463 self.assertEqual(posixpath.normpath("///foo/.//bar//"), "/foo/bar")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000464 self.assertEqual(posixpath.normpath("///foo/.//bar//.//..//.//baz"),
465 "/foo/baz")
Brett Cannonb47243a2003-06-16 21:54:50 +0000466 self.assertEqual(posixpath.normpath("///..//./foo/.//bar"), "/foo/bar")
467
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000468 self.assertEqual(posixpath.normpath(b""), b".")
469 self.assertEqual(posixpath.normpath(b"/"), b"/")
470 self.assertEqual(posixpath.normpath(b"//"), b"//")
471 self.assertEqual(posixpath.normpath(b"///"), b"/")
472 self.assertEqual(posixpath.normpath(b"///foo/.//bar//"), b"/foo/bar")
473 self.assertEqual(posixpath.normpath(b"///foo/.//bar//.//..//.//baz"),
474 b"/foo/baz")
475 self.assertEqual(posixpath.normpath(b"///..//./foo/.//bar"),
476 b"/foo/bar")
477
Brett Cannonb47243a2003-06-16 21:54:50 +0000478 self.assertRaises(TypeError, posixpath.normpath)
479
480 def test_abspath(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000481 self.assertIn("foo", posixpath.abspath("foo"))
482 self.assertIn(b"foo", posixpath.abspath(b"foo"))
Brett Cannonb47243a2003-06-16 21:54:50 +0000483
484 self.assertRaises(TypeError, posixpath.abspath)
485
486 def test_realpath(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000487 self.assertIn("foo", realpath("foo"))
488 self.assertIn(b"foo", realpath(b"foo"))
Brett Cannonb47243a2003-06-16 21:54:50 +0000489 self.assertRaises(TypeError, posixpath.realpath)
Tim Petersa45cacf2004-08-20 03:47:14 +0000490
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000491 if hasattr(os, "symlink"):
492 def test_realpath_basic(self):
493 # Basic operation.
494 try:
495 os.symlink(ABSTFN+"1", ABSTFN)
496 self.assertEqual(realpath(ABSTFN), ABSTFN+"1")
497 finally:
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000498 support.unlink(ABSTFN)
Tim Petersa45cacf2004-08-20 03:47:14 +0000499
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000500 def test_realpath_symlink_loops(self):
501 # Bug #930024, return the path unchanged if we get into an infinite
502 # symlink loop.
503 try:
504 old_path = abspath('.')
505 os.symlink(ABSTFN, ABSTFN)
506 self.assertEqual(realpath(ABSTFN), ABSTFN)
507
508 os.symlink(ABSTFN+"1", ABSTFN+"2")
509 os.symlink(ABSTFN+"2", ABSTFN+"1")
510 self.assertEqual(realpath(ABSTFN+"1"), ABSTFN+"1")
511 self.assertEqual(realpath(ABSTFN+"2"), ABSTFN+"2")
512
513 # Test using relative path as well.
514 os.chdir(dirname(ABSTFN))
515 self.assertEqual(realpath(basename(ABSTFN)), ABSTFN)
516 finally:
517 os.chdir(old_path)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000518 support.unlink(ABSTFN)
519 support.unlink(ABSTFN+"1")
520 support.unlink(ABSTFN+"2")
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000521
Tim Petersa45cacf2004-08-20 03:47:14 +0000522 def test_realpath_resolve_parents(self):
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000523 # We also need to resolve any symlinks in the parents of a relative
524 # path passed to realpath. E.g.: current working directory is
525 # /usr/doc with 'doc' being a symlink to /usr/share/doc. We call
526 # realpath("a"). This should return /usr/share/doc/a/.
527 try:
528 old_path = abspath('.')
529 os.mkdir(ABSTFN)
530 os.mkdir(ABSTFN + "/y")
531 os.symlink(ABSTFN + "/y", ABSTFN + "/k")
532
533 os.chdir(ABSTFN + "/k")
534 self.assertEqual(realpath("a"), ABSTFN + "/y/a")
535 finally:
536 os.chdir(old_path)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000537 support.unlink(ABSTFN + "/k")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000538 safe_rmdir(ABSTFN + "/y")
539 safe_rmdir(ABSTFN)
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000540
541 def test_realpath_resolve_before_normalizing(self):
542 # Bug #990669: Symbolic links should be resolved before we
543 # normalize the path. E.g.: if we have directories 'a', 'k' and 'y'
544 # in the following hierarchy:
545 # a/k/y
546 #
547 # and a symbolic link 'link-y' pointing to 'y' in directory 'a',
548 # then realpath("link-y/..") should return 'k', not 'a'.
549 try:
550 old_path = abspath('.')
551 os.mkdir(ABSTFN)
552 os.mkdir(ABSTFN + "/k")
553 os.mkdir(ABSTFN + "/k/y")
554 os.symlink(ABSTFN + "/k/y", ABSTFN + "/link-y")
555
556 # Absolute path.
557 self.assertEqual(realpath(ABSTFN + "/link-y/.."), ABSTFN + "/k")
558 # Relative path.
559 os.chdir(dirname(ABSTFN))
Ezio Melottia11865b2010-02-20 09:47:55 +0000560 self.assertEqual(realpath(basename(ABSTFN) + "/link-y/.."),
561 ABSTFN + "/k")
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000562 finally:
563 os.chdir(old_path)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000564 support.unlink(ABSTFN + "/link-y")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000565 safe_rmdir(ABSTFN + "/k/y")
566 safe_rmdir(ABSTFN + "/k")
567 safe_rmdir(ABSTFN)
Tim Peters5d36a552005-06-03 22:40:27 +0000568
Georg Brandl268e61c2005-06-03 14:28:50 +0000569 def test_realpath_resolve_first(self):
570 # Bug #1213894: The first component of the path, if not absolute,
571 # must be resolved too.
572
573 try:
574 old_path = abspath('.')
575 os.mkdir(ABSTFN)
576 os.mkdir(ABSTFN + "/k")
577 os.symlink(ABSTFN, ABSTFN + "link")
578 os.chdir(dirname(ABSTFN))
Tim Peters5d36a552005-06-03 22:40:27 +0000579
Georg Brandl268e61c2005-06-03 14:28:50 +0000580 base = basename(ABSTFN)
581 self.assertEqual(realpath(base + "link"), ABSTFN)
582 self.assertEqual(realpath(base + "link/k"), ABSTFN + "/k")
583 finally:
584 os.chdir(old_path)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000585 support.unlink(ABSTFN + "link")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000586 safe_rmdir(ABSTFN + "/k")
587 safe_rmdir(ABSTFN)
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000588
Guido van Rossumd8faa362007-04-27 19:54:29 +0000589 def test_relpath(self):
590 (real_getcwd, os.getcwd) = (os.getcwd, lambda: r"/home/user/bar")
591 try:
592 curdir = os.path.split(os.getcwd())[-1]
593 self.assertRaises(ValueError, posixpath.relpath, "")
594 self.assertEqual(posixpath.relpath("a"), "a")
595 self.assertEqual(posixpath.relpath(posixpath.abspath("a")), "a")
596 self.assertEqual(posixpath.relpath("a/b"), "a/b")
597 self.assertEqual(posixpath.relpath("../a/b"), "../a/b")
598 self.assertEqual(posixpath.relpath("a", "../b"), "../"+curdir+"/a")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000599 self.assertEqual(posixpath.relpath("a/b", "../c"),
600 "../"+curdir+"/a/b")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000601 self.assertEqual(posixpath.relpath("a", "b/c"), "../../a")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000602 self.assertEqual(posixpath.relpath("a", "a"), ".")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000603 finally:
604 os.getcwd = real_getcwd
Brett Cannonb47243a2003-06-16 21:54:50 +0000605
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000606 def test_relpath_bytes(self):
607 (real_getcwdb, os.getcwdb) = (os.getcwdb, lambda: br"/home/user/bar")
608 try:
609 curdir = os.path.split(os.getcwdb())[-1]
610 self.assertRaises(ValueError, posixpath.relpath, b"")
611 self.assertEqual(posixpath.relpath(b"a"), b"a")
612 self.assertEqual(posixpath.relpath(posixpath.abspath(b"a")), b"a")
613 self.assertEqual(posixpath.relpath(b"a/b"), b"a/b")
614 self.assertEqual(posixpath.relpath(b"../a/b"), b"../a/b")
615 self.assertEqual(posixpath.relpath(b"a", b"../b"),
616 b"../"+curdir+b"/a")
617 self.assertEqual(posixpath.relpath(b"a/b", b"../c"),
618 b"../"+curdir+b"/a/b")
619 self.assertEqual(posixpath.relpath(b"a", b"b/c"), b"../../a")
620 self.assertEqual(posixpath.relpath(b"a", b"a"), b".")
621
622 self.assertRaises(TypeError, posixpath.relpath, b"bytes", "str")
623 self.assertRaises(TypeError, posixpath.relpath, "str", b"bytes")
624 finally:
625 os.getcwdb = real_getcwdb
626
Brett Cannonb47243a2003-06-16 21:54:50 +0000627def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000628 support.run_unittest(PosixPathTest)
Brett Cannonb47243a2003-06-16 21:54:50 +0000629
630if __name__=="__main__":
631 test_main()