blob: 3676e9f5ae14ec61752434dd35d70ccb645efe75 [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
422 self.assertRaises(TypeError, posixpath.expanduser)
423
424 def test_expandvars(self):
425 oldenv = os.environ.copy()
426 try:
427 os.environ.clear()
428 os.environ["foo"] = "bar"
429 os.environ["{foo"] = "baz1"
430 os.environ["{foo}"] = "baz2"
431 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")
Brett Cannonb47243a2003-06-16 21:54:50 +0000456 finally:
457 os.environ.clear()
458 os.environ.update(oldenv)
459
460 self.assertRaises(TypeError, posixpath.expandvars)
461
462 def test_normpath(self):
463 self.assertEqual(posixpath.normpath(""), ".")
464 self.assertEqual(posixpath.normpath("/"), "/")
465 self.assertEqual(posixpath.normpath("//"), "//")
466 self.assertEqual(posixpath.normpath("///"), "/")
467 self.assertEqual(posixpath.normpath("///foo/.//bar//"), "/foo/bar")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000468 self.assertEqual(posixpath.normpath("///foo/.//bar//.//..//.//baz"),
469 "/foo/baz")
Brett Cannonb47243a2003-06-16 21:54:50 +0000470 self.assertEqual(posixpath.normpath("///..//./foo/.//bar"), "/foo/bar")
471
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000472 self.assertEqual(posixpath.normpath(b""), b".")
473 self.assertEqual(posixpath.normpath(b"/"), b"/")
474 self.assertEqual(posixpath.normpath(b"//"), b"//")
475 self.assertEqual(posixpath.normpath(b"///"), b"/")
476 self.assertEqual(posixpath.normpath(b"///foo/.//bar//"), b"/foo/bar")
477 self.assertEqual(posixpath.normpath(b"///foo/.//bar//.//..//.//baz"),
478 b"/foo/baz")
479 self.assertEqual(posixpath.normpath(b"///..//./foo/.//bar"),
480 b"/foo/bar")
481
Brett Cannonb47243a2003-06-16 21:54:50 +0000482 self.assertRaises(TypeError, posixpath.normpath)
483
484 def test_abspath(self):
485 self.assert_("foo" in posixpath.abspath("foo"))
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000486 self.assert_(b"foo" in posixpath.abspath(b"foo"))
Brett Cannonb47243a2003-06-16 21:54:50 +0000487
488 self.assertRaises(TypeError, posixpath.abspath)
489
490 def test_realpath(self):
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000491 self.assert_("foo" in realpath("foo"))
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000492 self.assert_(b"foo" in realpath(b"foo"))
Brett Cannonb47243a2003-06-16 21:54:50 +0000493 self.assertRaises(TypeError, posixpath.realpath)
Tim Petersa45cacf2004-08-20 03:47:14 +0000494
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000495 if hasattr(os, "symlink"):
496 def test_realpath_basic(self):
497 # Basic operation.
498 try:
499 os.symlink(ABSTFN+"1", ABSTFN)
500 self.assertEqual(realpath(ABSTFN), ABSTFN+"1")
501 finally:
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000502 support.unlink(ABSTFN)
Tim Petersa45cacf2004-08-20 03:47:14 +0000503
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000504 def test_realpath_symlink_loops(self):
505 # Bug #930024, return the path unchanged if we get into an infinite
506 # symlink loop.
507 try:
508 old_path = abspath('.')
509 os.symlink(ABSTFN, ABSTFN)
510 self.assertEqual(realpath(ABSTFN), ABSTFN)
511
512 os.symlink(ABSTFN+"1", ABSTFN+"2")
513 os.symlink(ABSTFN+"2", ABSTFN+"1")
514 self.assertEqual(realpath(ABSTFN+"1"), ABSTFN+"1")
515 self.assertEqual(realpath(ABSTFN+"2"), ABSTFN+"2")
516
517 # Test using relative path as well.
518 os.chdir(dirname(ABSTFN))
519 self.assertEqual(realpath(basename(ABSTFN)), ABSTFN)
520 finally:
521 os.chdir(old_path)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000522 support.unlink(ABSTFN)
523 support.unlink(ABSTFN+"1")
524 support.unlink(ABSTFN+"2")
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000525
Tim Petersa45cacf2004-08-20 03:47:14 +0000526 def test_realpath_resolve_parents(self):
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000527 # We also need to resolve any symlinks in the parents of a relative
528 # path passed to realpath. E.g.: current working directory is
529 # /usr/doc with 'doc' being a symlink to /usr/share/doc. We call
530 # realpath("a"). This should return /usr/share/doc/a/.
531 try:
532 old_path = abspath('.')
533 os.mkdir(ABSTFN)
534 os.mkdir(ABSTFN + "/y")
535 os.symlink(ABSTFN + "/y", ABSTFN + "/k")
536
537 os.chdir(ABSTFN + "/k")
538 self.assertEqual(realpath("a"), ABSTFN + "/y/a")
539 finally:
540 os.chdir(old_path)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000541 support.unlink(ABSTFN + "/k")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000542 safe_rmdir(ABSTFN + "/y")
543 safe_rmdir(ABSTFN)
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000544
545 def test_realpath_resolve_before_normalizing(self):
546 # Bug #990669: Symbolic links should be resolved before we
547 # normalize the path. E.g.: if we have directories 'a', 'k' and 'y'
548 # in the following hierarchy:
549 # a/k/y
550 #
551 # and a symbolic link 'link-y' pointing to 'y' in directory 'a',
552 # then realpath("link-y/..") should return 'k', not 'a'.
553 try:
554 old_path = abspath('.')
555 os.mkdir(ABSTFN)
556 os.mkdir(ABSTFN + "/k")
557 os.mkdir(ABSTFN + "/k/y")
558 os.symlink(ABSTFN + "/k/y", ABSTFN + "/link-y")
559
560 # Absolute path.
561 self.assertEqual(realpath(ABSTFN + "/link-y/.."), ABSTFN + "/k")
562 # Relative path.
563 os.chdir(dirname(ABSTFN))
564 self.assertEqual(realpath(basename(ABSTFN) + "/link-y/.."), ABSTFN + "/k")
565 finally:
566 os.chdir(old_path)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000567 support.unlink(ABSTFN + "/link-y")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000568 safe_rmdir(ABSTFN + "/k/y")
569 safe_rmdir(ABSTFN + "/k")
570 safe_rmdir(ABSTFN)
Tim Peters5d36a552005-06-03 22:40:27 +0000571
Georg Brandl268e61c2005-06-03 14:28:50 +0000572 def test_realpath_resolve_first(self):
573 # Bug #1213894: The first component of the path, if not absolute,
574 # must be resolved too.
575
576 try:
577 old_path = abspath('.')
578 os.mkdir(ABSTFN)
579 os.mkdir(ABSTFN + "/k")
580 os.symlink(ABSTFN, ABSTFN + "link")
581 os.chdir(dirname(ABSTFN))
Tim Peters5d36a552005-06-03 22:40:27 +0000582
Georg Brandl268e61c2005-06-03 14:28:50 +0000583 base = basename(ABSTFN)
584 self.assertEqual(realpath(base + "link"), ABSTFN)
585 self.assertEqual(realpath(base + "link/k"), ABSTFN + "/k")
586 finally:
587 os.chdir(old_path)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000588 support.unlink(ABSTFN + "link")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000589 safe_rmdir(ABSTFN + "/k")
590 safe_rmdir(ABSTFN)
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000591
Guido van Rossumd8faa362007-04-27 19:54:29 +0000592 def test_relpath(self):
593 (real_getcwd, os.getcwd) = (os.getcwd, lambda: r"/home/user/bar")
594 try:
595 curdir = os.path.split(os.getcwd())[-1]
596 self.assertRaises(ValueError, posixpath.relpath, "")
597 self.assertEqual(posixpath.relpath("a"), "a")
598 self.assertEqual(posixpath.relpath(posixpath.abspath("a")), "a")
599 self.assertEqual(posixpath.relpath("a/b"), "a/b")
600 self.assertEqual(posixpath.relpath("../a/b"), "../a/b")
601 self.assertEqual(posixpath.relpath("a", "../b"), "../"+curdir+"/a")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000602 self.assertEqual(posixpath.relpath("a/b", "../c"),
603 "../"+curdir+"/a/b")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000604 self.assertEqual(posixpath.relpath("a", "b/c"), "../../a")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000605 self.assertEqual(posixpath.relpath("a", "a"), ".")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000606 finally:
607 os.getcwd = real_getcwd
Brett Cannonb47243a2003-06-16 21:54:50 +0000608
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000609 def test_relpath_bytes(self):
610 (real_getcwdb, os.getcwdb) = (os.getcwdb, lambda: br"/home/user/bar")
611 try:
612 curdir = os.path.split(os.getcwdb())[-1]
613 self.assertRaises(ValueError, posixpath.relpath, b"")
614 self.assertEqual(posixpath.relpath(b"a"), b"a")
615 self.assertEqual(posixpath.relpath(posixpath.abspath(b"a")), b"a")
616 self.assertEqual(posixpath.relpath(b"a/b"), b"a/b")
617 self.assertEqual(posixpath.relpath(b"../a/b"), b"../a/b")
618 self.assertEqual(posixpath.relpath(b"a", b"../b"),
619 b"../"+curdir+b"/a")
620 self.assertEqual(posixpath.relpath(b"a/b", b"../c"),
621 b"../"+curdir+b"/a/b")
622 self.assertEqual(posixpath.relpath(b"a", b"b/c"), b"../../a")
623 self.assertEqual(posixpath.relpath(b"a", b"a"), b".")
624
625 self.assertRaises(TypeError, posixpath.relpath, b"bytes", "str")
626 self.assertRaises(TypeError, posixpath.relpath, "str", b"bytes")
627 finally:
628 os.getcwdb = real_getcwdb
629
Brett Cannonb47243a2003-06-16 21:54:50 +0000630def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000631 support.run_unittest(PosixPathTest)
Brett Cannonb47243a2003-06-16 21:54:50 +0000632
633if __name__=="__main__":
634 test_main()