blob: 7de94e70d862e9d53421e66461a55f5250f313fe [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
Benjamin Petersonef3e4c22009-04-11 19:48:14 +0000422 orig_home = os.environ['HOME']
423 os.environ['HOME'] = '/'
424 self.assertEqual(posixpath.expanduser("~"), "/")
425 os.environ['HOME'] = orig_home
426
Brett Cannonb47243a2003-06-16 21:54:50 +0000427 self.assertRaises(TypeError, posixpath.expanduser)
428
429 def test_expandvars(self):
430 oldenv = os.environ.copy()
431 try:
432 os.environ.clear()
433 os.environ["foo"] = "bar"
434 os.environ["{foo"] = "baz1"
435 os.environ["{foo}"] = "baz2"
436 self.assertEqual(posixpath.expandvars("foo"), "foo")
437 self.assertEqual(posixpath.expandvars("$foo bar"), "bar bar")
438 self.assertEqual(posixpath.expandvars("${foo}bar"), "barbar")
439 self.assertEqual(posixpath.expandvars("$[foo]bar"), "$[foo]bar")
440 self.assertEqual(posixpath.expandvars("$bar bar"), "$bar bar")
441 self.assertEqual(posixpath.expandvars("$?bar"), "$?bar")
442 self.assertEqual(posixpath.expandvars("${foo}bar"), "barbar")
443 self.assertEqual(posixpath.expandvars("$foo}bar"), "bar}bar")
444 self.assertEqual(posixpath.expandvars("${foo"), "${foo")
445 self.assertEqual(posixpath.expandvars("${{foo}}"), "baz1}")
Thomas Woutersb2137042007-02-01 18:02:27 +0000446 self.assertEqual(posixpath.expandvars("$foo$foo"), "barbar")
447 self.assertEqual(posixpath.expandvars("$bar$bar"), "$bar$bar")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000448
449 self.assertEqual(posixpath.expandvars(b"foo"), b"foo")
450 self.assertEqual(posixpath.expandvars(b"$foo bar"), b"bar bar")
451 self.assertEqual(posixpath.expandvars(b"${foo}bar"), b"barbar")
452 self.assertEqual(posixpath.expandvars(b"$[foo]bar"), b"$[foo]bar")
453 self.assertEqual(posixpath.expandvars(b"$bar bar"), b"$bar bar")
454 self.assertEqual(posixpath.expandvars(b"$?bar"), b"$?bar")
455 self.assertEqual(posixpath.expandvars(b"${foo}bar"), b"barbar")
456 self.assertEqual(posixpath.expandvars(b"$foo}bar"), b"bar}bar")
457 self.assertEqual(posixpath.expandvars(b"${foo"), b"${foo")
458 self.assertEqual(posixpath.expandvars(b"${{foo}}"), b"baz1}")
459 self.assertEqual(posixpath.expandvars(b"$foo$foo"), b"barbar")
460 self.assertEqual(posixpath.expandvars(b"$bar$bar"), b"$bar$bar")
Brett Cannonb47243a2003-06-16 21:54:50 +0000461 finally:
462 os.environ.clear()
463 os.environ.update(oldenv)
464
465 self.assertRaises(TypeError, posixpath.expandvars)
466
467 def test_normpath(self):
468 self.assertEqual(posixpath.normpath(""), ".")
469 self.assertEqual(posixpath.normpath("/"), "/")
470 self.assertEqual(posixpath.normpath("//"), "//")
471 self.assertEqual(posixpath.normpath("///"), "/")
472 self.assertEqual(posixpath.normpath("///foo/.//bar//"), "/foo/bar")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000473 self.assertEqual(posixpath.normpath("///foo/.//bar//.//..//.//baz"),
474 "/foo/baz")
Brett Cannonb47243a2003-06-16 21:54:50 +0000475 self.assertEqual(posixpath.normpath("///..//./foo/.//bar"), "/foo/bar")
476
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000477 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"///"), b"/")
481 self.assertEqual(posixpath.normpath(b"///foo/.//bar//"), b"/foo/bar")
482 self.assertEqual(posixpath.normpath(b"///foo/.//bar//.//..//.//baz"),
483 b"/foo/baz")
484 self.assertEqual(posixpath.normpath(b"///..//./foo/.//bar"),
485 b"/foo/bar")
486
Brett Cannonb47243a2003-06-16 21:54:50 +0000487 self.assertRaises(TypeError, posixpath.normpath)
488
489 def test_abspath(self):
490 self.assert_("foo" in posixpath.abspath("foo"))
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000491 self.assert_(b"foo" in posixpath.abspath(b"foo"))
Brett Cannonb47243a2003-06-16 21:54:50 +0000492
493 self.assertRaises(TypeError, posixpath.abspath)
494
495 def test_realpath(self):
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000496 self.assert_("foo" in realpath("foo"))
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000497 self.assert_(b"foo" in realpath(b"foo"))
Brett Cannonb47243a2003-06-16 21:54:50 +0000498 self.assertRaises(TypeError, posixpath.realpath)
Tim Petersa45cacf2004-08-20 03:47:14 +0000499
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000500 if hasattr(os, "symlink"):
501 def test_realpath_basic(self):
502 # Basic operation.
503 try:
504 os.symlink(ABSTFN+"1", ABSTFN)
505 self.assertEqual(realpath(ABSTFN), ABSTFN+"1")
506 finally:
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000507 support.unlink(ABSTFN)
Tim Petersa45cacf2004-08-20 03:47:14 +0000508
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000509 def test_realpath_symlink_loops(self):
510 # Bug #930024, return the path unchanged if we get into an infinite
511 # symlink loop.
512 try:
513 old_path = abspath('.')
514 os.symlink(ABSTFN, ABSTFN)
515 self.assertEqual(realpath(ABSTFN), ABSTFN)
516
517 os.symlink(ABSTFN+"1", ABSTFN+"2")
518 os.symlink(ABSTFN+"2", ABSTFN+"1")
519 self.assertEqual(realpath(ABSTFN+"1"), ABSTFN+"1")
520 self.assertEqual(realpath(ABSTFN+"2"), ABSTFN+"2")
521
522 # Test using relative path as well.
523 os.chdir(dirname(ABSTFN))
524 self.assertEqual(realpath(basename(ABSTFN)), ABSTFN)
525 finally:
526 os.chdir(old_path)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000527 support.unlink(ABSTFN)
528 support.unlink(ABSTFN+"1")
529 support.unlink(ABSTFN+"2")
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000530
Tim Petersa45cacf2004-08-20 03:47:14 +0000531 def test_realpath_resolve_parents(self):
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000532 # We also need to resolve any symlinks in the parents of a relative
533 # path passed to realpath. E.g.: current working directory is
534 # /usr/doc with 'doc' being a symlink to /usr/share/doc. We call
535 # realpath("a"). This should return /usr/share/doc/a/.
536 try:
537 old_path = abspath('.')
538 os.mkdir(ABSTFN)
539 os.mkdir(ABSTFN + "/y")
540 os.symlink(ABSTFN + "/y", ABSTFN + "/k")
541
542 os.chdir(ABSTFN + "/k")
543 self.assertEqual(realpath("a"), ABSTFN + "/y/a")
544 finally:
545 os.chdir(old_path)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000546 support.unlink(ABSTFN + "/k")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000547 safe_rmdir(ABSTFN + "/y")
548 safe_rmdir(ABSTFN)
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000549
550 def test_realpath_resolve_before_normalizing(self):
551 # Bug #990669: Symbolic links should be resolved before we
552 # normalize the path. E.g.: if we have directories 'a', 'k' and 'y'
553 # in the following hierarchy:
554 # a/k/y
555 #
556 # and a symbolic link 'link-y' pointing to 'y' in directory 'a',
557 # then realpath("link-y/..") should return 'k', not 'a'.
558 try:
559 old_path = abspath('.')
560 os.mkdir(ABSTFN)
561 os.mkdir(ABSTFN + "/k")
562 os.mkdir(ABSTFN + "/k/y")
563 os.symlink(ABSTFN + "/k/y", ABSTFN + "/link-y")
564
565 # Absolute path.
566 self.assertEqual(realpath(ABSTFN + "/link-y/.."), ABSTFN + "/k")
567 # Relative path.
568 os.chdir(dirname(ABSTFN))
569 self.assertEqual(realpath(basename(ABSTFN) + "/link-y/.."), ABSTFN + "/k")
570 finally:
571 os.chdir(old_path)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000572 support.unlink(ABSTFN + "/link-y")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000573 safe_rmdir(ABSTFN + "/k/y")
574 safe_rmdir(ABSTFN + "/k")
575 safe_rmdir(ABSTFN)
Tim Peters5d36a552005-06-03 22:40:27 +0000576
Georg Brandl268e61c2005-06-03 14:28:50 +0000577 def test_realpath_resolve_first(self):
578 # Bug #1213894: The first component of the path, if not absolute,
579 # must be resolved too.
580
581 try:
582 old_path = abspath('.')
583 os.mkdir(ABSTFN)
584 os.mkdir(ABSTFN + "/k")
585 os.symlink(ABSTFN, ABSTFN + "link")
586 os.chdir(dirname(ABSTFN))
Tim Peters5d36a552005-06-03 22:40:27 +0000587
Georg Brandl268e61c2005-06-03 14:28:50 +0000588 base = basename(ABSTFN)
589 self.assertEqual(realpath(base + "link"), ABSTFN)
590 self.assertEqual(realpath(base + "link/k"), ABSTFN + "/k")
591 finally:
592 os.chdir(old_path)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000593 support.unlink(ABSTFN + "link")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000594 safe_rmdir(ABSTFN + "/k")
595 safe_rmdir(ABSTFN)
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000596
Guido van Rossumd8faa362007-04-27 19:54:29 +0000597 def test_relpath(self):
598 (real_getcwd, os.getcwd) = (os.getcwd, lambda: r"/home/user/bar")
599 try:
600 curdir = os.path.split(os.getcwd())[-1]
601 self.assertRaises(ValueError, posixpath.relpath, "")
602 self.assertEqual(posixpath.relpath("a"), "a")
603 self.assertEqual(posixpath.relpath(posixpath.abspath("a")), "a")
604 self.assertEqual(posixpath.relpath("a/b"), "a/b")
605 self.assertEqual(posixpath.relpath("../a/b"), "../a/b")
606 self.assertEqual(posixpath.relpath("a", "../b"), "../"+curdir+"/a")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000607 self.assertEqual(posixpath.relpath("a/b", "../c"),
608 "../"+curdir+"/a/b")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000609 self.assertEqual(posixpath.relpath("a", "b/c"), "../../a")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000610 self.assertEqual(posixpath.relpath("a", "a"), ".")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000611 finally:
612 os.getcwd = real_getcwd
Brett Cannonb47243a2003-06-16 21:54:50 +0000613
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000614 def test_relpath_bytes(self):
615 (real_getcwdb, os.getcwdb) = (os.getcwdb, lambda: br"/home/user/bar")
616 try:
617 curdir = os.path.split(os.getcwdb())[-1]
618 self.assertRaises(ValueError, posixpath.relpath, b"")
619 self.assertEqual(posixpath.relpath(b"a"), b"a")
620 self.assertEqual(posixpath.relpath(posixpath.abspath(b"a")), b"a")
621 self.assertEqual(posixpath.relpath(b"a/b"), b"a/b")
622 self.assertEqual(posixpath.relpath(b"../a/b"), b"../a/b")
623 self.assertEqual(posixpath.relpath(b"a", b"../b"),
624 b"../"+curdir+b"/a")
625 self.assertEqual(posixpath.relpath(b"a/b", b"../c"),
626 b"../"+curdir+b"/a/b")
627 self.assertEqual(posixpath.relpath(b"a", b"b/c"), b"../../a")
628 self.assertEqual(posixpath.relpath(b"a", b"a"), b".")
629
630 self.assertRaises(TypeError, posixpath.relpath, b"bytes", "str")
631 self.assertRaises(TypeError, posixpath.relpath, "str", b"bytes")
632 finally:
633 os.getcwdb = real_getcwdb
634
Brett Cannonb47243a2003-06-16 21:54:50 +0000635def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000636 support.run_unittest(PosixPathTest)
Brett Cannonb47243a2003-06-16 21:54:50 +0000637
638if __name__=="__main__":
639 test_main()