blob: 2d845a822acda6fce5b25ddac96719a07f5043da [file] [log] [blame]
Brett Cannonb47243a2003-06-16 21:54:50 +00001import unittest
Florent Xiclunac9c79782010-03-08 12:24:53 +00002from test import support, test_genericpath
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_join(self):
Guido van Rossumf0af3e32008-10-02 18:55:37 +000029 self.assertEqual(posixpath.join("/foo", "bar", "/bar", "baz"),
30 "/bar/baz")
Brett Cannonb47243a2003-06-16 21:54:50 +000031 self.assertEqual(posixpath.join("/foo", "bar", "baz"), "/foo/bar/baz")
Guido van Rossumf0af3e32008-10-02 18:55:37 +000032 self.assertEqual(posixpath.join("/foo/", "bar/", "baz/"),
33 "/foo/bar/baz/")
34
35 self.assertEqual(posixpath.join(b"/foo", b"bar", b"/bar", b"baz"),
36 b"/bar/baz")
37 self.assertEqual(posixpath.join(b"/foo", b"bar", b"baz"),
38 b"/foo/bar/baz")
39 self.assertEqual(posixpath.join(b"/foo/", b"bar/", b"baz/"),
40 b"/foo/bar/baz/")
Skip Montanaroe809b002000-07-12 00:20:08 +000041
Guido van Rossumf0af3e32008-10-02 18:55:37 +000042 self.assertRaises(TypeError, posixpath.join, b"bytes", "str")
43 self.assertRaises(TypeError, posixpath.join, "str", b"bytes")
Skip Montanaroe809b002000-07-12 00:20:08 +000044
Brett Cannonb47243a2003-06-16 21:54:50 +000045 def test_split(self):
46 self.assertEqual(posixpath.split("/foo/bar"), ("/foo", "bar"))
47 self.assertEqual(posixpath.split("/"), ("/", ""))
48 self.assertEqual(posixpath.split("foo"), ("", "foo"))
49 self.assertEqual(posixpath.split("////foo"), ("////", "foo"))
50 self.assertEqual(posixpath.split("//foo//bar"), ("//foo", "bar"))
51
Guido van Rossumf0af3e32008-10-02 18:55:37 +000052 self.assertEqual(posixpath.split(b"/foo/bar"), (b"/foo", b"bar"))
53 self.assertEqual(posixpath.split(b"/"), (b"/", b""))
54 self.assertEqual(posixpath.split(b"foo"), (b"", b"foo"))
55 self.assertEqual(posixpath.split(b"////foo"), (b"////", b"foo"))
56 self.assertEqual(posixpath.split(b"//foo//bar"), (b"//foo", b"bar"))
57
Guido van Rossumd8faa362007-04-27 19:54:29 +000058 def splitextTest(self, path, filename, ext):
59 self.assertEqual(posixpath.splitext(path), (filename, ext))
60 self.assertEqual(posixpath.splitext("/" + path), ("/" + filename, ext))
Guido van Rossumf0af3e32008-10-02 18:55:37 +000061 self.assertEqual(posixpath.splitext("abc/" + path),
62 ("abc/" + filename, ext))
63 self.assertEqual(posixpath.splitext("abc.def/" + path),
64 ("abc.def/" + filename, ext))
65 self.assertEqual(posixpath.splitext("/abc.def/" + path),
66 ("/abc.def/" + filename, ext))
67 self.assertEqual(posixpath.splitext(path + "/"),
68 (filename + ext + "/", ""))
69
70 path = bytes(path, "ASCII")
71 filename = bytes(filename, "ASCII")
72 ext = bytes(ext, "ASCII")
73
74 self.assertEqual(posixpath.splitext(path), (filename, ext))
75 self.assertEqual(posixpath.splitext(b"/" + path),
76 (b"/" + filename, ext))
77 self.assertEqual(posixpath.splitext(b"abc/" + path),
78 (b"abc/" + filename, ext))
79 self.assertEqual(posixpath.splitext(b"abc.def/" + path),
80 (b"abc.def/" + filename, ext))
81 self.assertEqual(posixpath.splitext(b"/abc.def/" + path),
82 (b"/abc.def/" + filename, ext))
83 self.assertEqual(posixpath.splitext(path + b"/"),
84 (filename + ext + b"/", b""))
Brett Cannonb47243a2003-06-16 21:54:50 +000085
Guido van Rossumd8faa362007-04-27 19:54:29 +000086 def test_splitext(self):
87 self.splitextTest("foo.bar", "foo", ".bar")
88 self.splitextTest("foo.boo.bar", "foo.boo", ".bar")
89 self.splitextTest("foo.boo.biff.bar", "foo.boo.biff", ".bar")
90 self.splitextTest(".csh.rc", ".csh", ".rc")
91 self.splitextTest("nodots", "nodots", "")
92 self.splitextTest(".cshrc", ".cshrc", "")
93 self.splitextTest("...manydots", "...manydots", "")
94 self.splitextTest("...manydots.ext", "...manydots", ".ext")
95 self.splitextTest(".", ".", "")
96 self.splitextTest("..", "..", "")
97 self.splitextTest("........", "........", "")
98 self.splitextTest("", "", "")
Brett Cannonb47243a2003-06-16 21:54:50 +000099
100 def test_isabs(self):
101 self.assertIs(posixpath.isabs(""), False)
102 self.assertIs(posixpath.isabs("/"), True)
103 self.assertIs(posixpath.isabs("/foo"), True)
104 self.assertIs(posixpath.isabs("/foo/bar"), True)
105 self.assertIs(posixpath.isabs("foo/bar"), False)
106
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000107 self.assertIs(posixpath.isabs(b""), False)
108 self.assertIs(posixpath.isabs(b"/"), True)
109 self.assertIs(posixpath.isabs(b"/foo"), True)
110 self.assertIs(posixpath.isabs(b"/foo/bar"), True)
111 self.assertIs(posixpath.isabs(b"foo/bar"), False)
112
Brett Cannonb47243a2003-06-16 21:54:50 +0000113 def test_basename(self):
114 self.assertEqual(posixpath.basename("/foo/bar"), "bar")
115 self.assertEqual(posixpath.basename("/"), "")
116 self.assertEqual(posixpath.basename("foo"), "foo")
117 self.assertEqual(posixpath.basename("////foo"), "foo")
118 self.assertEqual(posixpath.basename("//foo//bar"), "bar")
119
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000120 self.assertEqual(posixpath.basename(b"/foo/bar"), b"bar")
121 self.assertEqual(posixpath.basename(b"/"), b"")
122 self.assertEqual(posixpath.basename(b"foo"), b"foo")
123 self.assertEqual(posixpath.basename(b"////foo"), b"foo")
124 self.assertEqual(posixpath.basename(b"//foo//bar"), b"bar")
125
Brett Cannonb47243a2003-06-16 21:54:50 +0000126 def test_dirname(self):
127 self.assertEqual(posixpath.dirname("/foo/bar"), "/foo")
128 self.assertEqual(posixpath.dirname("/"), "/")
129 self.assertEqual(posixpath.dirname("foo"), "")
130 self.assertEqual(posixpath.dirname("////foo"), "////")
131 self.assertEqual(posixpath.dirname("//foo//bar"), "//foo")
132
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000133 self.assertEqual(posixpath.dirname(b"/foo/bar"), b"/foo")
134 self.assertEqual(posixpath.dirname(b"/"), b"/")
135 self.assertEqual(posixpath.dirname(b"foo"), b"")
136 self.assertEqual(posixpath.dirname(b"////foo"), b"////")
137 self.assertEqual(posixpath.dirname(b"//foo//bar"), b"//foo")
138
Brett Cannonb47243a2003-06-16 21:54:50 +0000139 def test_commonprefix(self):
140 self.assertEqual(
141 posixpath.commonprefix([]),
142 ""
143 )
144 self.assertEqual(
145 posixpath.commonprefix(["/home/swenson/spam", "/home/swen/spam"]),
146 "/home/swen"
147 )
148 self.assertEqual(
149 posixpath.commonprefix(["/home/swen/spam", "/home/swen/eggs"]),
150 "/home/swen/"
151 )
152 self.assertEqual(
153 posixpath.commonprefix(["/home/swen/spam", "/home/swen/spam"]),
154 "/home/swen/spam"
155 )
156
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000157 self.assertEqual(
158 posixpath.commonprefix([b"/home/swenson/spam", b"/home/swen/spam"]),
159 b"/home/swen"
160 )
161 self.assertEqual(
162 posixpath.commonprefix([b"/home/swen/spam", b"/home/swen/eggs"]),
163 b"/home/swen/"
164 )
165 self.assertEqual(
166 posixpath.commonprefix([b"/home/swen/spam", b"/home/swen/spam"]),
167 b"/home/swen/spam"
168 )
169
Guido van Rossum360e4b82007-05-14 22:51:27 +0000170 testlist = ['', 'abc', 'Xbcd', 'Xb', 'XY', 'abcd', 'aXc', 'abd', 'ab', 'aX', 'abcX']
171 for s1 in testlist:
172 for s2 in testlist:
173 p = posixpath.commonprefix([s1, s2])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000174 self.assertTrue(s1.startswith(p))
175 self.assertTrue(s2.startswith(p))
Guido van Rossum360e4b82007-05-14 22:51:27 +0000176 if s1 != s2:
177 n = len(p)
178 self.assertNotEqual(s1[n:n+1], s2[n:n+1])
179
Brett Cannonb47243a2003-06-16 21:54:50 +0000180 def test_getsize(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000181 f = open(support.TESTFN, "wb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000182 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000183 f.write(b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000184 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000185 self.assertEqual(posixpath.getsize(support.TESTFN), 3)
Brett Cannonb47243a2003-06-16 21:54:50 +0000186 finally:
187 if not f.closed:
188 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000189
190 def test_time(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000191 f = open(support.TESTFN, "wb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000192 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000193 f.write(b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000194 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000195 f = open(support.TESTFN, "ab")
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000196 f.write(b"bar")
Brett Cannonb47243a2003-06-16 21:54:50 +0000197 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000198 f = open(support.TESTFN, "rb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000199 d = f.read()
200 f.close()
Guido van Rossum98f13752007-07-10 12:07:30 +0000201 self.assertEqual(d, b"foobar")
Brett Cannonb47243a2003-06-16 21:54:50 +0000202
Ezio Melottia11865b2010-02-20 09:47:55 +0000203 self.assertLessEqual(
204 posixpath.getctime(support.TESTFN),
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000205 posixpath.getmtime(support.TESTFN)
Brett Cannonb47243a2003-06-16 21:54:50 +0000206 )
207 finally:
208 if not f.closed:
209 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000210
211 def test_islink(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000212 self.assertIs(posixpath.islink(support.TESTFN + "1"), False)
213 f = open(support.TESTFN + "1", "wb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000214 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000215 f.write(b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000216 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000217 self.assertIs(posixpath.islink(support.TESTFN + "1"), False)
Brett Cannonb47243a2003-06-16 21:54:50 +0000218 if hasattr(os, "symlink"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000219 os.symlink(support.TESTFN + "1", support.TESTFN + "2")
220 self.assertIs(posixpath.islink(support.TESTFN + "2"), True)
221 os.remove(support.TESTFN + "1")
222 self.assertIs(posixpath.islink(support.TESTFN + "2"), True)
223 self.assertIs(posixpath.exists(support.TESTFN + "2"), False)
224 self.assertIs(posixpath.lexists(support.TESTFN + "2"), True)
Brett Cannonb47243a2003-06-16 21:54:50 +0000225 finally:
226 if not f.close():
227 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000228
Guido van Rossumd8faa362007-04-27 19:54:29 +0000229 def test_samefile(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000230 f = open(support.TESTFN + "1", "wb")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000231 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000232 f.write(b"foo")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000233 f.close()
234 self.assertIs(
235 posixpath.samefile(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000236 support.TESTFN + "1",
237 support.TESTFN + "1"
Guido van Rossumd8faa362007-04-27 19:54:29 +0000238 ),
239 True
240 )
241 # If we don't have links, assume that os.stat doesn't return resonable
242 # inode information and thus, that samefile() doesn't work
243 if hasattr(os, "symlink"):
244 os.symlink(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000245 support.TESTFN + "1",
246 support.TESTFN + "2"
Guido van Rossumd8faa362007-04-27 19:54:29 +0000247 )
248 self.assertIs(
249 posixpath.samefile(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000250 support.TESTFN + "1",
251 support.TESTFN + "2"
Guido van Rossumd8faa362007-04-27 19:54:29 +0000252 ),
253 True
254 )
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000255 os.remove(support.TESTFN + "2")
256 f = open(support.TESTFN + "2", "wb")
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000257 f.write(b"bar")
Brett Cannonb47243a2003-06-16 21:54:50 +0000258 f.close()
259 self.assertIs(
260 posixpath.samefile(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000261 support.TESTFN + "1",
262 support.TESTFN + "2"
Guido van Rossumd8faa362007-04-27 19:54:29 +0000263 ),
264 False
265 )
266 finally:
267 if not f.close():
268 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000269
Brett Cannonb47243a2003-06-16 21:54:50 +0000270 def test_samestat(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000271 f = open(support.TESTFN + "1", "wb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000272 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000273 f.write(b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000274 f.close()
275 self.assertIs(
276 posixpath.samestat(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000277 os.stat(support.TESTFN + "1"),
278 os.stat(support.TESTFN + "1")
Brett Cannonb47243a2003-06-16 21:54:50 +0000279 ),
280 True
281 )
Tim Peters478c1052003-06-29 05:46:54 +0000282 # If we don't have links, assume that os.stat() doesn't return resonable
Brett Cannonb47243a2003-06-16 21:54:50 +0000283 # inode information and thus, that samefile() doesn't work
284 if hasattr(os, "symlink"):
285 if hasattr(os, "symlink"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000286 os.symlink(support.TESTFN + "1", support.TESTFN + "2")
Brett Cannonb47243a2003-06-16 21:54:50 +0000287 self.assertIs(
288 posixpath.samestat(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000289 os.stat(support.TESTFN + "1"),
290 os.stat(support.TESTFN + "2")
Brett Cannonb47243a2003-06-16 21:54:50 +0000291 ),
292 True
293 )
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000294 os.remove(support.TESTFN + "2")
295 f = open(support.TESTFN + "2", "wb")
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000296 f.write(b"bar")
Brett Cannonb47243a2003-06-16 21:54:50 +0000297 f.close()
298 self.assertIs(
299 posixpath.samestat(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000300 os.stat(support.TESTFN + "1"),
301 os.stat(support.TESTFN + "2")
Brett Cannonb47243a2003-06-16 21:54:50 +0000302 ),
303 False
304 )
305 finally:
306 if not f.close():
307 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000308
Brett Cannonb47243a2003-06-16 21:54:50 +0000309 def test_ismount(self):
310 self.assertIs(posixpath.ismount("/"), True)
311
Brett Cannonb47243a2003-06-16 21:54:50 +0000312 def test_expanduser(self):
313 self.assertEqual(posixpath.expanduser("foo"), "foo")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000314 self.assertEqual(posixpath.expanduser(b"foo"), b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000315 try:
316 import pwd
317 except ImportError:
318 pass
319 else:
Ezio Melottie9615932010-01-24 19:26:24 +0000320 self.assertIsInstance(posixpath.expanduser("~/"), str)
321 self.assertIsInstance(posixpath.expanduser(b"~/"), bytes)
Neal Norwitz168e73d2003-07-01 03:33:31 +0000322 # if home directory == root directory, this test makes no sense
323 if posixpath.expanduser("~") != '/':
324 self.assertEqual(
325 posixpath.expanduser("~") + "/",
326 posixpath.expanduser("~/")
327 )
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000328 self.assertEqual(
329 posixpath.expanduser(b"~") + b"/",
330 posixpath.expanduser(b"~/")
331 )
Ezio Melottie9615932010-01-24 19:26:24 +0000332 self.assertIsInstance(posixpath.expanduser("~root/"), str)
333 self.assertIsInstance(posixpath.expanduser("~foo/"), str)
334 self.assertIsInstance(posixpath.expanduser(b"~root/"), bytes)
335 self.assertIsInstance(posixpath.expanduser(b"~foo/"), bytes)
Brett Cannonb47243a2003-06-16 21:54:50 +0000336
Hirokazu Yamamoto71959632009-04-27 01:44:28 +0000337 with support.EnvironmentVarGuard() as env:
Walter Dörwald155374d2009-05-01 19:58:58 +0000338 env['HOME'] = '/'
Walter Dörwaldb525e182009-04-26 21:39:21 +0000339 self.assertEqual(posixpath.expanduser("~"), "/")
Benjamin Petersonef3e4c22009-04-11 19:48:14 +0000340
Brett Cannonb47243a2003-06-16 21:54:50 +0000341 def test_normpath(self):
342 self.assertEqual(posixpath.normpath(""), ".")
343 self.assertEqual(posixpath.normpath("/"), "/")
344 self.assertEqual(posixpath.normpath("//"), "//")
345 self.assertEqual(posixpath.normpath("///"), "/")
346 self.assertEqual(posixpath.normpath("///foo/.//bar//"), "/foo/bar")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000347 self.assertEqual(posixpath.normpath("///foo/.//bar//.//..//.//baz"),
348 "/foo/baz")
Brett Cannonb47243a2003-06-16 21:54:50 +0000349 self.assertEqual(posixpath.normpath("///..//./foo/.//bar"), "/foo/bar")
350
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000351 self.assertEqual(posixpath.normpath(b""), b".")
352 self.assertEqual(posixpath.normpath(b"/"), b"/")
353 self.assertEqual(posixpath.normpath(b"//"), b"//")
354 self.assertEqual(posixpath.normpath(b"///"), b"/")
355 self.assertEqual(posixpath.normpath(b"///foo/.//bar//"), b"/foo/bar")
356 self.assertEqual(posixpath.normpath(b"///foo/.//bar//.//..//.//baz"),
357 b"/foo/baz")
358 self.assertEqual(posixpath.normpath(b"///..//./foo/.//bar"),
359 b"/foo/bar")
360
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000361 if hasattr(os, "symlink"):
362 def test_realpath_basic(self):
363 # Basic operation.
364 try:
365 os.symlink(ABSTFN+"1", ABSTFN)
366 self.assertEqual(realpath(ABSTFN), ABSTFN+"1")
367 finally:
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000368 support.unlink(ABSTFN)
Tim Petersa45cacf2004-08-20 03:47:14 +0000369
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000370 def test_realpath_symlink_loops(self):
371 # Bug #930024, return the path unchanged if we get into an infinite
372 # symlink loop.
373 try:
374 old_path = abspath('.')
375 os.symlink(ABSTFN, ABSTFN)
376 self.assertEqual(realpath(ABSTFN), ABSTFN)
377
378 os.symlink(ABSTFN+"1", ABSTFN+"2")
379 os.symlink(ABSTFN+"2", ABSTFN+"1")
380 self.assertEqual(realpath(ABSTFN+"1"), ABSTFN+"1")
381 self.assertEqual(realpath(ABSTFN+"2"), ABSTFN+"2")
382
383 # Test using relative path as well.
384 os.chdir(dirname(ABSTFN))
385 self.assertEqual(realpath(basename(ABSTFN)), ABSTFN)
386 finally:
387 os.chdir(old_path)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000388 support.unlink(ABSTFN)
389 support.unlink(ABSTFN+"1")
390 support.unlink(ABSTFN+"2")
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000391
Tim Petersa45cacf2004-08-20 03:47:14 +0000392 def test_realpath_resolve_parents(self):
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000393 # We also need to resolve any symlinks in the parents of a relative
394 # path passed to realpath. E.g.: current working directory is
395 # /usr/doc with 'doc' being a symlink to /usr/share/doc. We call
396 # realpath("a"). This should return /usr/share/doc/a/.
397 try:
398 old_path = abspath('.')
399 os.mkdir(ABSTFN)
400 os.mkdir(ABSTFN + "/y")
401 os.symlink(ABSTFN + "/y", ABSTFN + "/k")
402
403 os.chdir(ABSTFN + "/k")
404 self.assertEqual(realpath("a"), ABSTFN + "/y/a")
405 finally:
406 os.chdir(old_path)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000407 support.unlink(ABSTFN + "/k")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000408 safe_rmdir(ABSTFN + "/y")
409 safe_rmdir(ABSTFN)
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000410
411 def test_realpath_resolve_before_normalizing(self):
412 # Bug #990669: Symbolic links should be resolved before we
413 # normalize the path. E.g.: if we have directories 'a', 'k' and 'y'
414 # in the following hierarchy:
415 # a/k/y
416 #
417 # and a symbolic link 'link-y' pointing to 'y' in directory 'a',
418 # then realpath("link-y/..") should return 'k', not 'a'.
419 try:
420 old_path = abspath('.')
421 os.mkdir(ABSTFN)
422 os.mkdir(ABSTFN + "/k")
423 os.mkdir(ABSTFN + "/k/y")
424 os.symlink(ABSTFN + "/k/y", ABSTFN + "/link-y")
425
426 # Absolute path.
427 self.assertEqual(realpath(ABSTFN + "/link-y/.."), ABSTFN + "/k")
428 # Relative path.
429 os.chdir(dirname(ABSTFN))
Ezio Melottia11865b2010-02-20 09:47:55 +0000430 self.assertEqual(realpath(basename(ABSTFN) + "/link-y/.."),
431 ABSTFN + "/k")
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000432 finally:
433 os.chdir(old_path)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000434 support.unlink(ABSTFN + "/link-y")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000435 safe_rmdir(ABSTFN + "/k/y")
436 safe_rmdir(ABSTFN + "/k")
437 safe_rmdir(ABSTFN)
Tim Peters5d36a552005-06-03 22:40:27 +0000438
Georg Brandl268e61c2005-06-03 14:28:50 +0000439 def test_realpath_resolve_first(self):
440 # Bug #1213894: The first component of the path, if not absolute,
441 # must be resolved too.
442
443 try:
444 old_path = abspath('.')
445 os.mkdir(ABSTFN)
446 os.mkdir(ABSTFN + "/k")
447 os.symlink(ABSTFN, ABSTFN + "link")
448 os.chdir(dirname(ABSTFN))
Tim Peters5d36a552005-06-03 22:40:27 +0000449
Georg Brandl268e61c2005-06-03 14:28:50 +0000450 base = basename(ABSTFN)
451 self.assertEqual(realpath(base + "link"), ABSTFN)
452 self.assertEqual(realpath(base + "link/k"), ABSTFN + "/k")
453 finally:
454 os.chdir(old_path)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000455 support.unlink(ABSTFN + "link")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000456 safe_rmdir(ABSTFN + "/k")
457 safe_rmdir(ABSTFN)
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000458
Guido van Rossumd8faa362007-04-27 19:54:29 +0000459 def test_relpath(self):
460 (real_getcwd, os.getcwd) = (os.getcwd, lambda: r"/home/user/bar")
461 try:
462 curdir = os.path.split(os.getcwd())[-1]
463 self.assertRaises(ValueError, posixpath.relpath, "")
464 self.assertEqual(posixpath.relpath("a"), "a")
465 self.assertEqual(posixpath.relpath(posixpath.abspath("a")), "a")
466 self.assertEqual(posixpath.relpath("a/b"), "a/b")
467 self.assertEqual(posixpath.relpath("../a/b"), "../a/b")
468 self.assertEqual(posixpath.relpath("a", "../b"), "../"+curdir+"/a")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000469 self.assertEqual(posixpath.relpath("a/b", "../c"),
470 "../"+curdir+"/a/b")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000471 self.assertEqual(posixpath.relpath("a", "b/c"), "../../a")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000472 self.assertEqual(posixpath.relpath("a", "a"), ".")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000473 finally:
474 os.getcwd = real_getcwd
Brett Cannonb47243a2003-06-16 21:54:50 +0000475
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000476 def test_relpath_bytes(self):
477 (real_getcwdb, os.getcwdb) = (os.getcwdb, lambda: br"/home/user/bar")
478 try:
479 curdir = os.path.split(os.getcwdb())[-1]
480 self.assertRaises(ValueError, posixpath.relpath, b"")
481 self.assertEqual(posixpath.relpath(b"a"), b"a")
482 self.assertEqual(posixpath.relpath(posixpath.abspath(b"a")), b"a")
483 self.assertEqual(posixpath.relpath(b"a/b"), b"a/b")
484 self.assertEqual(posixpath.relpath(b"../a/b"), b"../a/b")
485 self.assertEqual(posixpath.relpath(b"a", b"../b"),
486 b"../"+curdir+b"/a")
487 self.assertEqual(posixpath.relpath(b"a/b", b"../c"),
488 b"../"+curdir+b"/a/b")
489 self.assertEqual(posixpath.relpath(b"a", b"b/c"), b"../../a")
490 self.assertEqual(posixpath.relpath(b"a", b"a"), b".")
491
492 self.assertRaises(TypeError, posixpath.relpath, b"bytes", "str")
493 self.assertRaises(TypeError, posixpath.relpath, "str", b"bytes")
494 finally:
495 os.getcwdb = real_getcwdb
496
Florent Xiclunac9c79782010-03-08 12:24:53 +0000497
498class PosixCommonTest(test_genericpath.CommonTest):
499 pathmodule = posixpath
500 attributes = ['relpath', 'samefile', 'sameopenfile', 'samestat']
501
502
Brett Cannonb47243a2003-06-16 21:54:50 +0000503def test_main():
Florent Xiclunac9c79782010-03-08 12:24:53 +0000504 support.run_unittest(PosixPathTest, PosixCommonTest)
505
Brett Cannonb47243a2003-06-16 21:54:50 +0000506
507if __name__=="__main__":
508 test_main()