blob: 17be3d2c63e1854904b608c070dad89f0bfca257 [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 assertIs(self, a, b):
29 self.assert_(a is b)
Skip Montanaroe809b002000-07-12 00:20:08 +000030
Brett Cannonb47243a2003-06-16 21:54:50 +000031 def test_normcase(self):
32 # Check that normcase() is idempotent
33 p = "FoO/./BaR"
Guido van Rossumf0af3e32008-10-02 18:55:37 +000034 self.assertEqual(p, posixpath.normcase(p))
35
36 p = b"FoO/./BaR"
Brett Cannonb47243a2003-06-16 21:54:50 +000037 self.assertEqual(p, posixpath.normcase(p))
Skip Montanaroe809b002000-07-12 00:20:08 +000038
Brett Cannonb47243a2003-06-16 21:54:50 +000039 self.assertRaises(TypeError, posixpath.normcase)
Skip Montanaroe809b002000-07-12 00:20:08 +000040
Brett Cannonb47243a2003-06-16 21:54:50 +000041 def test_join(self):
Guido van Rossumf0af3e32008-10-02 18:55:37 +000042 self.assertEqual(posixpath.join("/foo", "bar", "/bar", "baz"),
43 "/bar/baz")
Brett Cannonb47243a2003-06-16 21:54:50 +000044 self.assertEqual(posixpath.join("/foo", "bar", "baz"), "/foo/bar/baz")
Guido van Rossumf0af3e32008-10-02 18:55:37 +000045 self.assertEqual(posixpath.join("/foo/", "bar/", "baz/"),
46 "/foo/bar/baz/")
47
48 self.assertEqual(posixpath.join(b"/foo", b"bar", b"/bar", b"baz"),
49 b"/bar/baz")
50 self.assertEqual(posixpath.join(b"/foo", b"bar", b"baz"),
51 b"/foo/bar/baz")
52 self.assertEqual(posixpath.join(b"/foo/", b"bar/", b"baz/"),
53 b"/foo/bar/baz/")
Skip Montanaroe809b002000-07-12 00:20:08 +000054
Brett Cannonb47243a2003-06-16 21:54:50 +000055 self.assertRaises(TypeError, posixpath.join)
Guido van Rossumf0af3e32008-10-02 18:55:37 +000056 self.assertRaises(TypeError, posixpath.join, b"bytes", "str")
57 self.assertRaises(TypeError, posixpath.join, "str", b"bytes")
Skip Montanaroe809b002000-07-12 00:20:08 +000058
Brett Cannonb47243a2003-06-16 21:54:50 +000059 def test_splitdrive(self):
60 self.assertEqual(posixpath.splitdrive("/foo/bar"), ("", "/foo/bar"))
Guido van Rossumf0af3e32008-10-02 18:55:37 +000061 self.assertEqual(posixpath.splitdrive(b"/foo/bar"), (b"", b"/foo/bar"))
Brett Cannonb47243a2003-06-16 21:54:50 +000062
63 self.assertRaises(TypeError, posixpath.splitdrive)
64
65 def test_split(self):
66 self.assertEqual(posixpath.split("/foo/bar"), ("/foo", "bar"))
67 self.assertEqual(posixpath.split("/"), ("/", ""))
68 self.assertEqual(posixpath.split("foo"), ("", "foo"))
69 self.assertEqual(posixpath.split("////foo"), ("////", "foo"))
70 self.assertEqual(posixpath.split("//foo//bar"), ("//foo", "bar"))
71
Guido van Rossumf0af3e32008-10-02 18:55:37 +000072 self.assertEqual(posixpath.split(b"/foo/bar"), (b"/foo", b"bar"))
73 self.assertEqual(posixpath.split(b"/"), (b"/", b""))
74 self.assertEqual(posixpath.split(b"foo"), (b"", b"foo"))
75 self.assertEqual(posixpath.split(b"////foo"), (b"////", b"foo"))
76 self.assertEqual(posixpath.split(b"//foo//bar"), (b"//foo", b"bar"))
77
Brett Cannonb47243a2003-06-16 21:54:50 +000078 self.assertRaises(TypeError, posixpath.split)
79
Guido van Rossumd8faa362007-04-27 19:54:29 +000080 def splitextTest(self, path, filename, ext):
81 self.assertEqual(posixpath.splitext(path), (filename, ext))
82 self.assertEqual(posixpath.splitext("/" + path), ("/" + filename, ext))
Guido van Rossumf0af3e32008-10-02 18:55:37 +000083 self.assertEqual(posixpath.splitext("abc/" + path),
84 ("abc/" + filename, ext))
85 self.assertEqual(posixpath.splitext("abc.def/" + path),
86 ("abc.def/" + filename, ext))
87 self.assertEqual(posixpath.splitext("/abc.def/" + path),
88 ("/abc.def/" + filename, ext))
89 self.assertEqual(posixpath.splitext(path + "/"),
90 (filename + ext + "/", ""))
91
92 path = bytes(path, "ASCII")
93 filename = bytes(filename, "ASCII")
94 ext = bytes(ext, "ASCII")
95
96 self.assertEqual(posixpath.splitext(path), (filename, ext))
97 self.assertEqual(posixpath.splitext(b"/" + path),
98 (b"/" + filename, ext))
99 self.assertEqual(posixpath.splitext(b"abc/" + path),
100 (b"abc/" + filename, ext))
101 self.assertEqual(posixpath.splitext(b"abc.def/" + path),
102 (b"abc.def/" + filename, ext))
103 self.assertEqual(posixpath.splitext(b"/abc.def/" + path),
104 (b"/abc.def/" + filename, ext))
105 self.assertEqual(posixpath.splitext(path + b"/"),
106 (filename + ext + b"/", b""))
Brett Cannonb47243a2003-06-16 21:54:50 +0000107
Guido van Rossumd8faa362007-04-27 19:54:29 +0000108 def test_splitext(self):
109 self.splitextTest("foo.bar", "foo", ".bar")
110 self.splitextTest("foo.boo.bar", "foo.boo", ".bar")
111 self.splitextTest("foo.boo.biff.bar", "foo.boo.biff", ".bar")
112 self.splitextTest(".csh.rc", ".csh", ".rc")
113 self.splitextTest("nodots", "nodots", "")
114 self.splitextTest(".cshrc", ".cshrc", "")
115 self.splitextTest("...manydots", "...manydots", "")
116 self.splitextTest("...manydots.ext", "...manydots", ".ext")
117 self.splitextTest(".", ".", "")
118 self.splitextTest("..", "..", "")
119 self.splitextTest("........", "........", "")
120 self.splitextTest("", "", "")
Brett Cannonb47243a2003-06-16 21:54:50 +0000121 self.assertRaises(TypeError, posixpath.splitext)
122
123 def test_isabs(self):
124 self.assertIs(posixpath.isabs(""), False)
125 self.assertIs(posixpath.isabs("/"), True)
126 self.assertIs(posixpath.isabs("/foo"), True)
127 self.assertIs(posixpath.isabs("/foo/bar"), True)
128 self.assertIs(posixpath.isabs("foo/bar"), False)
129
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000130 self.assertIs(posixpath.isabs(b""), False)
131 self.assertIs(posixpath.isabs(b"/"), True)
132 self.assertIs(posixpath.isabs(b"/foo"), True)
133 self.assertIs(posixpath.isabs(b"/foo/bar"), True)
134 self.assertIs(posixpath.isabs(b"foo/bar"), False)
135
Brett Cannonb47243a2003-06-16 21:54:50 +0000136 self.assertRaises(TypeError, posixpath.isabs)
137
Brett Cannonb47243a2003-06-16 21:54:50 +0000138 def test_basename(self):
139 self.assertEqual(posixpath.basename("/foo/bar"), "bar")
140 self.assertEqual(posixpath.basename("/"), "")
141 self.assertEqual(posixpath.basename("foo"), "foo")
142 self.assertEqual(posixpath.basename("////foo"), "foo")
143 self.assertEqual(posixpath.basename("//foo//bar"), "bar")
144
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000145 self.assertEqual(posixpath.basename(b"/foo/bar"), b"bar")
146 self.assertEqual(posixpath.basename(b"/"), b"")
147 self.assertEqual(posixpath.basename(b"foo"), b"foo")
148 self.assertEqual(posixpath.basename(b"////foo"), b"foo")
149 self.assertEqual(posixpath.basename(b"//foo//bar"), b"bar")
150
Brett Cannonb47243a2003-06-16 21:54:50 +0000151 self.assertRaises(TypeError, posixpath.basename)
152
153 def test_dirname(self):
154 self.assertEqual(posixpath.dirname("/foo/bar"), "/foo")
155 self.assertEqual(posixpath.dirname("/"), "/")
156 self.assertEqual(posixpath.dirname("foo"), "")
157 self.assertEqual(posixpath.dirname("////foo"), "////")
158 self.assertEqual(posixpath.dirname("//foo//bar"), "//foo")
159
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000160 self.assertEqual(posixpath.dirname(b"/foo/bar"), b"/foo")
161 self.assertEqual(posixpath.dirname(b"/"), b"/")
162 self.assertEqual(posixpath.dirname(b"foo"), b"")
163 self.assertEqual(posixpath.dirname(b"////foo"), b"////")
164 self.assertEqual(posixpath.dirname(b"//foo//bar"), b"//foo")
165
Brett Cannonb47243a2003-06-16 21:54:50 +0000166 self.assertRaises(TypeError, posixpath.dirname)
167
168 def test_commonprefix(self):
169 self.assertEqual(
170 posixpath.commonprefix([]),
171 ""
172 )
173 self.assertEqual(
174 posixpath.commonprefix(["/home/swenson/spam", "/home/swen/spam"]),
175 "/home/swen"
176 )
177 self.assertEqual(
178 posixpath.commonprefix(["/home/swen/spam", "/home/swen/eggs"]),
179 "/home/swen/"
180 )
181 self.assertEqual(
182 posixpath.commonprefix(["/home/swen/spam", "/home/swen/spam"]),
183 "/home/swen/spam"
184 )
185
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000186 self.assertEqual(
187 posixpath.commonprefix([b"/home/swenson/spam", b"/home/swen/spam"]),
188 b"/home/swen"
189 )
190 self.assertEqual(
191 posixpath.commonprefix([b"/home/swen/spam", b"/home/swen/eggs"]),
192 b"/home/swen/"
193 )
194 self.assertEqual(
195 posixpath.commonprefix([b"/home/swen/spam", b"/home/swen/spam"]),
196 b"/home/swen/spam"
197 )
198
Guido van Rossum360e4b82007-05-14 22:51:27 +0000199 testlist = ['', 'abc', 'Xbcd', 'Xb', 'XY', 'abcd', 'aXc', 'abd', 'ab', 'aX', 'abcX']
200 for s1 in testlist:
201 for s2 in testlist:
202 p = posixpath.commonprefix([s1, s2])
203 self.assert_(s1.startswith(p))
204 self.assert_(s2.startswith(p))
205 if s1 != s2:
206 n = len(p)
207 self.assertNotEqual(s1[n:n+1], s2[n:n+1])
208
Brett Cannonb47243a2003-06-16 21:54:50 +0000209 def test_getsize(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000210 f = open(support.TESTFN, "wb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000211 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000212 f.write(b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000213 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000214 self.assertEqual(posixpath.getsize(support.TESTFN), 3)
Brett Cannonb47243a2003-06-16 21:54:50 +0000215 finally:
216 if not f.closed:
217 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000218
219 def test_time(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000220 f = open(support.TESTFN, "wb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000221 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000222 f.write(b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000223 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000224 f = open(support.TESTFN, "ab")
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000225 f.write(b"bar")
Brett Cannonb47243a2003-06-16 21:54:50 +0000226 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000227 f = open(support.TESTFN, "rb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000228 d = f.read()
229 f.close()
Guido van Rossum98f13752007-07-10 12:07:30 +0000230 self.assertEqual(d, b"foobar")
Brett Cannonb47243a2003-06-16 21:54:50 +0000231
232 self.assert_(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000233 posixpath.getctime(support.TESTFN) <=
234 posixpath.getmtime(support.TESTFN)
Brett Cannonb47243a2003-06-16 21:54:50 +0000235 )
236 finally:
237 if not f.closed:
238 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000239
240 def test_islink(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000241 self.assertIs(posixpath.islink(support.TESTFN + "1"), False)
242 f = open(support.TESTFN + "1", "wb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000243 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000244 f.write(b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000245 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000246 self.assertIs(posixpath.islink(support.TESTFN + "1"), False)
Brett Cannonb47243a2003-06-16 21:54:50 +0000247 if hasattr(os, "symlink"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000248 os.symlink(support.TESTFN + "1", support.TESTFN + "2")
249 self.assertIs(posixpath.islink(support.TESTFN + "2"), True)
250 os.remove(support.TESTFN + "1")
251 self.assertIs(posixpath.islink(support.TESTFN + "2"), True)
252 self.assertIs(posixpath.exists(support.TESTFN + "2"), False)
253 self.assertIs(posixpath.lexists(support.TESTFN + "2"), True)
Brett Cannonb47243a2003-06-16 21:54:50 +0000254 finally:
255 if not f.close():
256 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000257
258 self.assertRaises(TypeError, posixpath.islink)
259
260 def test_exists(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000261 self.assertIs(posixpath.exists(support.TESTFN), False)
262 f = open(support.TESTFN, "wb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000263 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000264 f.write(b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000265 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000266 self.assertIs(posixpath.exists(support.TESTFN), True)
267 self.assertIs(posixpath.lexists(support.TESTFN), True)
Brett Cannonb47243a2003-06-16 21:54:50 +0000268 finally:
269 if not f.close():
270 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000271
272 self.assertRaises(TypeError, posixpath.exists)
273
274 def test_isdir(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000275 self.assertIs(posixpath.isdir(support.TESTFN), False)
276 f = open(support.TESTFN, "wb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000277 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000278 f.write(b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000279 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000280 self.assertIs(posixpath.isdir(support.TESTFN), False)
281 os.remove(support.TESTFN)
282 os.mkdir(support.TESTFN)
283 self.assertIs(posixpath.isdir(support.TESTFN), True)
284 os.rmdir(support.TESTFN)
Brett Cannonb47243a2003-06-16 21:54:50 +0000285 finally:
286 if not f.close():
287 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000288
289 self.assertRaises(TypeError, posixpath.isdir)
290
291 def test_isfile(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000292 self.assertIs(posixpath.isfile(support.TESTFN), False)
293 f = open(support.TESTFN, "wb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000294 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000295 f.write(b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000296 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000297 self.assertIs(posixpath.isfile(support.TESTFN), True)
298 os.remove(support.TESTFN)
299 os.mkdir(support.TESTFN)
300 self.assertIs(posixpath.isfile(support.TESTFN), False)
301 os.rmdir(support.TESTFN)
Brett Cannonb47243a2003-06-16 21:54:50 +0000302 finally:
303 if not f.close():
304 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000305
306 self.assertRaises(TypeError, posixpath.isdir)
307
Guido van Rossumd8faa362007-04-27 19:54:29 +0000308 def test_samefile(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000309 f = open(support.TESTFN + "1", "wb")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000310 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000311 f.write(b"foo")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000312 f.close()
313 self.assertIs(
314 posixpath.samefile(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000315 support.TESTFN + "1",
316 support.TESTFN + "1"
Guido van Rossumd8faa362007-04-27 19:54:29 +0000317 ),
318 True
319 )
320 # If we don't have links, assume that os.stat doesn't return resonable
321 # inode information and thus, that samefile() doesn't work
322 if hasattr(os, "symlink"):
323 os.symlink(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000324 support.TESTFN + "1",
325 support.TESTFN + "2"
Guido van Rossumd8faa362007-04-27 19:54:29 +0000326 )
327 self.assertIs(
328 posixpath.samefile(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000329 support.TESTFN + "1",
330 support.TESTFN + "2"
Guido van Rossumd8faa362007-04-27 19:54:29 +0000331 ),
332 True
333 )
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000334 os.remove(support.TESTFN + "2")
335 f = open(support.TESTFN + "2", "wb")
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000336 f.write(b"bar")
Brett Cannonb47243a2003-06-16 21:54:50 +0000337 f.close()
338 self.assertIs(
339 posixpath.samefile(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000340 support.TESTFN + "1",
341 support.TESTFN + "2"
Guido van Rossumd8faa362007-04-27 19:54:29 +0000342 ),
343 False
344 )
345 finally:
346 if not f.close():
347 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000348
Guido van Rossumd8faa362007-04-27 19:54:29 +0000349 self.assertRaises(TypeError, posixpath.samefile)
Brett Cannonb47243a2003-06-16 21:54:50 +0000350
351 def test_samestat(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000352 f = open(support.TESTFN + "1", "wb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000353 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000354 f.write(b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000355 f.close()
356 self.assertIs(
357 posixpath.samestat(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000358 os.stat(support.TESTFN + "1"),
359 os.stat(support.TESTFN + "1")
Brett Cannonb47243a2003-06-16 21:54:50 +0000360 ),
361 True
362 )
Tim Peters478c1052003-06-29 05:46:54 +0000363 # If we don't have links, assume that os.stat() doesn't return resonable
Brett Cannonb47243a2003-06-16 21:54:50 +0000364 # inode information and thus, that samefile() doesn't work
365 if hasattr(os, "symlink"):
366 if hasattr(os, "symlink"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000367 os.symlink(support.TESTFN + "1", support.TESTFN + "2")
Brett Cannonb47243a2003-06-16 21:54:50 +0000368 self.assertIs(
369 posixpath.samestat(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000370 os.stat(support.TESTFN + "1"),
371 os.stat(support.TESTFN + "2")
Brett Cannonb47243a2003-06-16 21:54:50 +0000372 ),
373 True
374 )
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000375 os.remove(support.TESTFN + "2")
376 f = open(support.TESTFN + "2", "wb")
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000377 f.write(b"bar")
Brett Cannonb47243a2003-06-16 21:54:50 +0000378 f.close()
379 self.assertIs(
380 posixpath.samestat(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000381 os.stat(support.TESTFN + "1"),
382 os.stat(support.TESTFN + "2")
Brett Cannonb47243a2003-06-16 21:54:50 +0000383 ),
384 False
385 )
386 finally:
387 if not f.close():
388 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000389
390 self.assertRaises(TypeError, posixpath.samestat)
391
392 def test_ismount(self):
393 self.assertIs(posixpath.ismount("/"), True)
394
395 self.assertRaises(TypeError, posixpath.ismount)
396
397 def test_expanduser(self):
398 self.assertEqual(posixpath.expanduser("foo"), "foo")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000399 self.assertEqual(posixpath.expanduser(b"foo"), b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000400 try:
401 import pwd
402 except ImportError:
403 pass
404 else:
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000405 self.assert_(isinstance(posixpath.expanduser("~/"), str))
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000406 self.assert_(isinstance(posixpath.expanduser(b"~/"), bytes))
Neal Norwitz168e73d2003-07-01 03:33:31 +0000407 # if home directory == root directory, this test makes no sense
408 if posixpath.expanduser("~") != '/':
409 self.assertEqual(
410 posixpath.expanduser("~") + "/",
411 posixpath.expanduser("~/")
412 )
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000413 self.assertEqual(
414 posixpath.expanduser(b"~") + b"/",
415 posixpath.expanduser(b"~/")
416 )
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000417 self.assert_(isinstance(posixpath.expanduser("~root/"), str))
418 self.assert_(isinstance(posixpath.expanduser("~foo/"), str))
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000419 self.assert_(isinstance(posixpath.expanduser(b"~root/"), bytes))
420 self.assert_(isinstance(posixpath.expanduser(b"~foo/"), bytes))
Brett Cannonb47243a2003-06-16 21:54:50 +0000421
Walter Dörwaldb525e182009-04-26 21:39:21 +0000422 with test_support.EnvironmentVarGuard() as env:
423 env.set('HOME', '/')
424 self.assertEqual(posixpath.expanduser("~"), "/")
Benjamin Petersonef3e4c22009-04-11 19:48:14 +0000425
Brett Cannonb47243a2003-06-16 21:54:50 +0000426 self.assertRaises(TypeError, posixpath.expanduser)
427
428 def test_expandvars(self):
429 oldenv = os.environ.copy()
430 try:
431 os.environ.clear()
432 os.environ["foo"] = "bar"
433 os.environ["{foo"] = "baz1"
434 os.environ["{foo}"] = "baz2"
435 self.assertEqual(posixpath.expandvars("foo"), "foo")
436 self.assertEqual(posixpath.expandvars("$foo bar"), "bar bar")
437 self.assertEqual(posixpath.expandvars("${foo}bar"), "barbar")
438 self.assertEqual(posixpath.expandvars("$[foo]bar"), "$[foo]bar")
439 self.assertEqual(posixpath.expandvars("$bar bar"), "$bar bar")
440 self.assertEqual(posixpath.expandvars("$?bar"), "$?bar")
441 self.assertEqual(posixpath.expandvars("${foo}bar"), "barbar")
442 self.assertEqual(posixpath.expandvars("$foo}bar"), "bar}bar")
443 self.assertEqual(posixpath.expandvars("${foo"), "${foo")
444 self.assertEqual(posixpath.expandvars("${{foo}}"), "baz1}")
Thomas Woutersb2137042007-02-01 18:02:27 +0000445 self.assertEqual(posixpath.expandvars("$foo$foo"), "barbar")
446 self.assertEqual(posixpath.expandvars("$bar$bar"), "$bar$bar")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000447
448 self.assertEqual(posixpath.expandvars(b"foo"), b"foo")
449 self.assertEqual(posixpath.expandvars(b"$foo bar"), b"bar bar")
450 self.assertEqual(posixpath.expandvars(b"${foo}bar"), b"barbar")
451 self.assertEqual(posixpath.expandvars(b"$[foo]bar"), b"$[foo]bar")
452 self.assertEqual(posixpath.expandvars(b"$bar bar"), b"$bar bar")
453 self.assertEqual(posixpath.expandvars(b"$?bar"), b"$?bar")
454 self.assertEqual(posixpath.expandvars(b"${foo}bar"), b"barbar")
455 self.assertEqual(posixpath.expandvars(b"$foo}bar"), b"bar}bar")
456 self.assertEqual(posixpath.expandvars(b"${foo"), b"${foo")
457 self.assertEqual(posixpath.expandvars(b"${{foo}}"), b"baz1}")
458 self.assertEqual(posixpath.expandvars(b"$foo$foo"), b"barbar")
459 self.assertEqual(posixpath.expandvars(b"$bar$bar"), b"$bar$bar")
Brett Cannonb47243a2003-06-16 21:54:50 +0000460 finally:
461 os.environ.clear()
462 os.environ.update(oldenv)
463
464 self.assertRaises(TypeError, posixpath.expandvars)
465
466 def test_normpath(self):
467 self.assertEqual(posixpath.normpath(""), ".")
468 self.assertEqual(posixpath.normpath("/"), "/")
469 self.assertEqual(posixpath.normpath("//"), "//")
470 self.assertEqual(posixpath.normpath("///"), "/")
471 self.assertEqual(posixpath.normpath("///foo/.//bar//"), "/foo/bar")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000472 self.assertEqual(posixpath.normpath("///foo/.//bar//.//..//.//baz"),
473 "/foo/baz")
Brett Cannonb47243a2003-06-16 21:54:50 +0000474 self.assertEqual(posixpath.normpath("///..//./foo/.//bar"), "/foo/bar")
475
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000476 self.assertEqual(posixpath.normpath(b""), b".")
477 self.assertEqual(posixpath.normpath(b"/"), b"/")
478 self.assertEqual(posixpath.normpath(b"//"), b"//")
479 self.assertEqual(posixpath.normpath(b"///"), b"/")
480 self.assertEqual(posixpath.normpath(b"///foo/.//bar//"), b"/foo/bar")
481 self.assertEqual(posixpath.normpath(b"///foo/.//bar//.//..//.//baz"),
482 b"/foo/baz")
483 self.assertEqual(posixpath.normpath(b"///..//./foo/.//bar"),
484 b"/foo/bar")
485
Brett Cannonb47243a2003-06-16 21:54:50 +0000486 self.assertRaises(TypeError, posixpath.normpath)
487
488 def test_abspath(self):
489 self.assert_("foo" in posixpath.abspath("foo"))
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000490 self.assert_(b"foo" in posixpath.abspath(b"foo"))
Brett Cannonb47243a2003-06-16 21:54:50 +0000491
492 self.assertRaises(TypeError, posixpath.abspath)
493
494 def test_realpath(self):
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000495 self.assert_("foo" in realpath("foo"))
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000496 self.assert_(b"foo" in realpath(b"foo"))
Brett Cannonb47243a2003-06-16 21:54:50 +0000497 self.assertRaises(TypeError, posixpath.realpath)
Tim Petersa45cacf2004-08-20 03:47:14 +0000498
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000499 if hasattr(os, "symlink"):
500 def test_realpath_basic(self):
501 # Basic operation.
502 try:
503 os.symlink(ABSTFN+"1", ABSTFN)
504 self.assertEqual(realpath(ABSTFN), ABSTFN+"1")
505 finally:
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000506 support.unlink(ABSTFN)
Tim Petersa45cacf2004-08-20 03:47:14 +0000507
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000508 def test_realpath_symlink_loops(self):
509 # Bug #930024, return the path unchanged if we get into an infinite
510 # symlink loop.
511 try:
512 old_path = abspath('.')
513 os.symlink(ABSTFN, ABSTFN)
514 self.assertEqual(realpath(ABSTFN), ABSTFN)
515
516 os.symlink(ABSTFN+"1", ABSTFN+"2")
517 os.symlink(ABSTFN+"2", ABSTFN+"1")
518 self.assertEqual(realpath(ABSTFN+"1"), ABSTFN+"1")
519 self.assertEqual(realpath(ABSTFN+"2"), ABSTFN+"2")
520
521 # Test using relative path as well.
522 os.chdir(dirname(ABSTFN))
523 self.assertEqual(realpath(basename(ABSTFN)), ABSTFN)
524 finally:
525 os.chdir(old_path)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000526 support.unlink(ABSTFN)
527 support.unlink(ABSTFN+"1")
528 support.unlink(ABSTFN+"2")
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000529
Tim Petersa45cacf2004-08-20 03:47:14 +0000530 def test_realpath_resolve_parents(self):
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000531 # We also need to resolve any symlinks in the parents of a relative
532 # path passed to realpath. E.g.: current working directory is
533 # /usr/doc with 'doc' being a symlink to /usr/share/doc. We call
534 # realpath("a"). This should return /usr/share/doc/a/.
535 try:
536 old_path = abspath('.')
537 os.mkdir(ABSTFN)
538 os.mkdir(ABSTFN + "/y")
539 os.symlink(ABSTFN + "/y", ABSTFN + "/k")
540
541 os.chdir(ABSTFN + "/k")
542 self.assertEqual(realpath("a"), ABSTFN + "/y/a")
543 finally:
544 os.chdir(old_path)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000545 support.unlink(ABSTFN + "/k")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000546 safe_rmdir(ABSTFN + "/y")
547 safe_rmdir(ABSTFN)
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000548
549 def test_realpath_resolve_before_normalizing(self):
550 # Bug #990669: Symbolic links should be resolved before we
551 # normalize the path. E.g.: if we have directories 'a', 'k' and 'y'
552 # in the following hierarchy:
553 # a/k/y
554 #
555 # and a symbolic link 'link-y' pointing to 'y' in directory 'a',
556 # then realpath("link-y/..") should return 'k', not 'a'.
557 try:
558 old_path = abspath('.')
559 os.mkdir(ABSTFN)
560 os.mkdir(ABSTFN + "/k")
561 os.mkdir(ABSTFN + "/k/y")
562 os.symlink(ABSTFN + "/k/y", ABSTFN + "/link-y")
563
564 # Absolute path.
565 self.assertEqual(realpath(ABSTFN + "/link-y/.."), ABSTFN + "/k")
566 # Relative path.
567 os.chdir(dirname(ABSTFN))
568 self.assertEqual(realpath(basename(ABSTFN) + "/link-y/.."), ABSTFN + "/k")
569 finally:
570 os.chdir(old_path)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000571 support.unlink(ABSTFN + "/link-y")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000572 safe_rmdir(ABSTFN + "/k/y")
573 safe_rmdir(ABSTFN + "/k")
574 safe_rmdir(ABSTFN)
Tim Peters5d36a552005-06-03 22:40:27 +0000575
Georg Brandl268e61c2005-06-03 14:28:50 +0000576 def test_realpath_resolve_first(self):
577 # Bug #1213894: The first component of the path, if not absolute,
578 # must be resolved too.
579
580 try:
581 old_path = abspath('.')
582 os.mkdir(ABSTFN)
583 os.mkdir(ABSTFN + "/k")
584 os.symlink(ABSTFN, ABSTFN + "link")
585 os.chdir(dirname(ABSTFN))
Tim Peters5d36a552005-06-03 22:40:27 +0000586
Georg Brandl268e61c2005-06-03 14:28:50 +0000587 base = basename(ABSTFN)
588 self.assertEqual(realpath(base + "link"), ABSTFN)
589 self.assertEqual(realpath(base + "link/k"), ABSTFN + "/k")
590 finally:
591 os.chdir(old_path)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000592 support.unlink(ABSTFN + "link")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000593 safe_rmdir(ABSTFN + "/k")
594 safe_rmdir(ABSTFN)
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000595
Guido van Rossumd8faa362007-04-27 19:54:29 +0000596 def test_relpath(self):
597 (real_getcwd, os.getcwd) = (os.getcwd, lambda: r"/home/user/bar")
598 try:
599 curdir = os.path.split(os.getcwd())[-1]
600 self.assertRaises(ValueError, posixpath.relpath, "")
601 self.assertEqual(posixpath.relpath("a"), "a")
602 self.assertEqual(posixpath.relpath(posixpath.abspath("a")), "a")
603 self.assertEqual(posixpath.relpath("a/b"), "a/b")
604 self.assertEqual(posixpath.relpath("../a/b"), "../a/b")
605 self.assertEqual(posixpath.relpath("a", "../b"), "../"+curdir+"/a")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000606 self.assertEqual(posixpath.relpath("a/b", "../c"),
607 "../"+curdir+"/a/b")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000608 self.assertEqual(posixpath.relpath("a", "b/c"), "../../a")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000609 self.assertEqual(posixpath.relpath("a", "a"), ".")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000610 finally:
611 os.getcwd = real_getcwd
Brett Cannonb47243a2003-06-16 21:54:50 +0000612
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000613 def test_relpath_bytes(self):
614 (real_getcwdb, os.getcwdb) = (os.getcwdb, lambda: br"/home/user/bar")
615 try:
616 curdir = os.path.split(os.getcwdb())[-1]
617 self.assertRaises(ValueError, posixpath.relpath, b"")
618 self.assertEqual(posixpath.relpath(b"a"), b"a")
619 self.assertEqual(posixpath.relpath(posixpath.abspath(b"a")), b"a")
620 self.assertEqual(posixpath.relpath(b"a/b"), b"a/b")
621 self.assertEqual(posixpath.relpath(b"../a/b"), b"../a/b")
622 self.assertEqual(posixpath.relpath(b"a", b"../b"),
623 b"../"+curdir+b"/a")
624 self.assertEqual(posixpath.relpath(b"a/b", b"../c"),
625 b"../"+curdir+b"/a/b")
626 self.assertEqual(posixpath.relpath(b"a", b"b/c"), b"../../a")
627 self.assertEqual(posixpath.relpath(b"a", b"a"), b".")
628
629 self.assertRaises(TypeError, posixpath.relpath, b"bytes", "str")
630 self.assertRaises(TypeError, posixpath.relpath, "str", b"bytes")
631 finally:
632 os.getcwdb = real_getcwdb
633
Brett Cannonb47243a2003-06-16 21:54:50 +0000634def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000635 support.run_unittest(PosixPathTest)
Brett Cannonb47243a2003-06-16 21:54:50 +0000636
637if __name__=="__main__":
638 test_main()