blob: da5d174581f0913c76074c55b0cc5eb2968af610 [file] [log] [blame]
Brett Cannonb47243a2003-06-16 21:54:50 +00001import unittest
2from test import test_support
Skip Montanaroe809b002000-07-12 00:20:08 +00003
Brett Cannonb47243a2003-06-16 21:54:50 +00004import posixpath, os
Georg Brandlb86d3fa2010-02-07 12:55:12 +00005from posixpath import realpath, abspath, dirname, basename
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
10ABSTFN = abspath(test_support.TESTFN)
Skip Montanaroe809b002000-07-12 00:20:08 +000011
Collin Winterdbead562007-03-10 02:23:40 +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
Collin Winterdbead562007-03-10 02:23:40 +000020 def setUp(self):
21 self.tearDown()
22
23 def tearDown(self):
24 for suffix in ["", "1", "2"]:
25 test_support.unlink(test_support.TESTFN + suffix)
26 safe_rmdir(test_support.TESTFN + suffix)
Tim Petersea5962f2007-03-12 18:07:52 +000027
Brett Cannonb47243a2003-06-16 21:54:50 +000028 def test_normcase(self):
29 # Check that normcase() is idempotent
30 p = "FoO/./BaR"
31 p = posixpath.normcase(p)
32 self.assertEqual(p, posixpath.normcase(p))
Skip Montanaroe809b002000-07-12 00:20:08 +000033
Brett Cannonb47243a2003-06-16 21:54:50 +000034 self.assertRaises(TypeError, posixpath.normcase)
Skip Montanaroe809b002000-07-12 00:20:08 +000035
Brett Cannonb47243a2003-06-16 21:54:50 +000036 def test_join(self):
37 self.assertEqual(posixpath.join("/foo", "bar", "/bar", "baz"), "/bar/baz")
38 self.assertEqual(posixpath.join("/foo", "bar", "baz"), "/foo/bar/baz")
39 self.assertEqual(posixpath.join("/foo/", "bar/", "baz/"), "/foo/bar/baz/")
Skip Montanaroe809b002000-07-12 00:20:08 +000040
Brett Cannonb47243a2003-06-16 21:54:50 +000041 self.assertRaises(TypeError, posixpath.join)
Skip Montanaroe809b002000-07-12 00:20:08 +000042
Brett Cannonb47243a2003-06-16 21:54:50 +000043 def test_splitdrive(self):
44 self.assertEqual(posixpath.splitdrive("/foo/bar"), ("", "/foo/bar"))
45
46 self.assertRaises(TypeError, posixpath.splitdrive)
47
48 def test_split(self):
49 self.assertEqual(posixpath.split("/foo/bar"), ("/foo", "bar"))
50 self.assertEqual(posixpath.split("/"), ("/", ""))
51 self.assertEqual(posixpath.split("foo"), ("", "foo"))
52 self.assertEqual(posixpath.split("////foo"), ("////", "foo"))
53 self.assertEqual(posixpath.split("//foo//bar"), ("//foo", "bar"))
54
55 self.assertRaises(TypeError, posixpath.split)
56
Martin v. Löwis05c075d2007-03-07 11:04:33 +000057 def splitextTest(self, path, filename, ext):
58 self.assertEqual(posixpath.splitext(path), (filename, ext))
59 self.assertEqual(posixpath.splitext("/" + path), ("/" + filename, ext))
60 self.assertEqual(posixpath.splitext("abc/" + path), ("abc/" + filename, ext))
61 self.assertEqual(posixpath.splitext("abc.def/" + path), ("abc.def/" + filename, ext))
62 self.assertEqual(posixpath.splitext("/abc.def/" + path), ("/abc.def/" + filename, ext))
63 self.assertEqual(posixpath.splitext(path + "/"), (filename + ext + "/", ""))
Brett Cannonb47243a2003-06-16 21:54:50 +000064
Martin v. Löwis05c075d2007-03-07 11:04:33 +000065 def test_splitext(self):
66 self.splitextTest("foo.bar", "foo", ".bar")
67 self.splitextTest("foo.boo.bar", "foo.boo", ".bar")
68 self.splitextTest("foo.boo.biff.bar", "foo.boo.biff", ".bar")
69 self.splitextTest(".csh.rc", ".csh", ".rc")
70 self.splitextTest("nodots", "nodots", "")
71 self.splitextTest(".cshrc", ".cshrc", "")
72 self.splitextTest("...manydots", "...manydots", "")
73 self.splitextTest("...manydots.ext", "...manydots", ".ext")
74 self.splitextTest(".", ".", "")
75 self.splitextTest("..", "..", "")
76 self.splitextTest("........", "........", "")
77 self.splitextTest("", "", "")
Brett Cannonb47243a2003-06-16 21:54:50 +000078 self.assertRaises(TypeError, posixpath.splitext)
79
80 def test_isabs(self):
81 self.assertIs(posixpath.isabs(""), False)
82 self.assertIs(posixpath.isabs("/"), True)
83 self.assertIs(posixpath.isabs("/foo"), True)
84 self.assertIs(posixpath.isabs("/foo/bar"), True)
85 self.assertIs(posixpath.isabs("foo/bar"), False)
86
87 self.assertRaises(TypeError, posixpath.isabs)
88
Brett Cannonb47243a2003-06-16 21:54:50 +000089 def test_basename(self):
90 self.assertEqual(posixpath.basename("/foo/bar"), "bar")
91 self.assertEqual(posixpath.basename("/"), "")
92 self.assertEqual(posixpath.basename("foo"), "foo")
93 self.assertEqual(posixpath.basename("////foo"), "foo")
94 self.assertEqual(posixpath.basename("//foo//bar"), "bar")
95
96 self.assertRaises(TypeError, posixpath.basename)
97
98 def test_dirname(self):
99 self.assertEqual(posixpath.dirname("/foo/bar"), "/foo")
100 self.assertEqual(posixpath.dirname("/"), "/")
101 self.assertEqual(posixpath.dirname("foo"), "")
102 self.assertEqual(posixpath.dirname("////foo"), "////")
103 self.assertEqual(posixpath.dirname("//foo//bar"), "//foo")
104
105 self.assertRaises(TypeError, posixpath.dirname)
106
107 def test_commonprefix(self):
108 self.assertEqual(
109 posixpath.commonprefix([]),
110 ""
111 )
112 self.assertEqual(
113 posixpath.commonprefix(["/home/swenson/spam", "/home/swen/spam"]),
114 "/home/swen"
115 )
116 self.assertEqual(
117 posixpath.commonprefix(["/home/swen/spam", "/home/swen/eggs"]),
118 "/home/swen/"
119 )
120 self.assertEqual(
121 posixpath.commonprefix(["/home/swen/spam", "/home/swen/spam"]),
122 "/home/swen/spam"
123 )
124
Raymond Hettingera74b67e2007-05-11 17:59:59 +0000125 testlist = ['', 'abc', 'Xbcd', 'Xb', 'XY', 'abcd', 'aXc', 'abd', 'ab', 'aX', 'abcX']
126 for s1 in testlist:
127 for s2 in testlist:
128 p = posixpath.commonprefix([s1, s2])
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000129 self.assertTrue(s1.startswith(p))
130 self.assertTrue(s2.startswith(p))
Raymond Hettingera74b67e2007-05-11 17:59:59 +0000131 if s1 != s2:
132 n = len(p)
133 self.assertNotEqual(s1[n:n+1], s2[n:n+1])
134
Brett Cannonb47243a2003-06-16 21:54:50 +0000135 def test_getsize(self):
136 f = open(test_support.TESTFN, "wb")
137 try:
138 f.write("foo")
139 f.close()
140 self.assertEqual(posixpath.getsize(test_support.TESTFN), 3)
141 finally:
142 if not f.closed:
143 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000144
145 def test_time(self):
146 f = open(test_support.TESTFN, "wb")
147 try:
148 f.write("foo")
149 f.close()
150 f = open(test_support.TESTFN, "ab")
151 f.write("bar")
152 f.close()
153 f = open(test_support.TESTFN, "rb")
154 d = f.read()
155 f.close()
156 self.assertEqual(d, "foobar")
157
Ezio Melottie3467d52010-02-20 09:40:07 +0000158 self.assertLessEqual(
159 posixpath.getctime(test_support.TESTFN),
Brett Cannonb47243a2003-06-16 21:54:50 +0000160 posixpath.getmtime(test_support.TESTFN)
161 )
162 finally:
163 if not f.closed:
164 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000165
Tim Petersea5962f2007-03-12 18:07:52 +0000166 def test_islink(self):
Brett Cannonb47243a2003-06-16 21:54:50 +0000167 self.assertIs(posixpath.islink(test_support.TESTFN + "1"), False)
168 f = open(test_support.TESTFN + "1", "wb")
169 try:
170 f.write("foo")
171 f.close()
172 self.assertIs(posixpath.islink(test_support.TESTFN + "1"), False)
173 if hasattr(os, "symlink"):
174 os.symlink(test_support.TESTFN + "1", test_support.TESTFN + "2")
175 self.assertIs(posixpath.islink(test_support.TESTFN + "2"), True)
176 os.remove(test_support.TESTFN + "1")
177 self.assertIs(posixpath.islink(test_support.TESTFN + "2"), True)
178 self.assertIs(posixpath.exists(test_support.TESTFN + "2"), False)
Johannes Gijsbersae882f72004-08-30 10:19:56 +0000179 self.assertIs(posixpath.lexists(test_support.TESTFN + "2"), True)
Brett Cannonb47243a2003-06-16 21:54:50 +0000180 finally:
181 if not f.close():
182 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000183
184 self.assertRaises(TypeError, posixpath.islink)
185
186 def test_exists(self):
187 self.assertIs(posixpath.exists(test_support.TESTFN), False)
188 f = open(test_support.TESTFN, "wb")
189 try:
190 f.write("foo")
191 f.close()
192 self.assertIs(posixpath.exists(test_support.TESTFN), True)
Johannes Gijsbersae882f72004-08-30 10:19:56 +0000193 self.assertIs(posixpath.lexists(test_support.TESTFN), True)
Brett Cannonb47243a2003-06-16 21:54:50 +0000194 finally:
195 if not f.close():
196 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000197
198 self.assertRaises(TypeError, posixpath.exists)
199
200 def test_isdir(self):
201 self.assertIs(posixpath.isdir(test_support.TESTFN), False)
202 f = open(test_support.TESTFN, "wb")
203 try:
204 f.write("foo")
205 f.close()
206 self.assertIs(posixpath.isdir(test_support.TESTFN), False)
207 os.remove(test_support.TESTFN)
208 os.mkdir(test_support.TESTFN)
209 self.assertIs(posixpath.isdir(test_support.TESTFN), True)
210 os.rmdir(test_support.TESTFN)
211 finally:
212 if not f.close():
213 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000214
215 self.assertRaises(TypeError, posixpath.isdir)
216
217 def test_isfile(self):
218 self.assertIs(posixpath.isfile(test_support.TESTFN), False)
219 f = open(test_support.TESTFN, "wb")
220 try:
221 f.write("foo")
222 f.close()
223 self.assertIs(posixpath.isfile(test_support.TESTFN), True)
224 os.remove(test_support.TESTFN)
225 os.mkdir(test_support.TESTFN)
226 self.assertIs(posixpath.isfile(test_support.TESTFN), False)
227 os.rmdir(test_support.TESTFN)
228 finally:
229 if not f.close():
230 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000231
232 self.assertRaises(TypeError, posixpath.isdir)
233
Collin Winterdbead562007-03-10 02:23:40 +0000234 def test_samefile(self):
235 f = open(test_support.TESTFN + "1", "wb")
236 try:
237 f.write("foo")
238 f.close()
239 self.assertIs(
240 posixpath.samefile(
241 test_support.TESTFN + "1",
242 test_support.TESTFN + "1"
243 ),
244 True
245 )
246 # If we don't have links, assume that os.stat doesn't return resonable
247 # inode information and thus, that samefile() doesn't work
248 if hasattr(os, "symlink"):
249 os.symlink(
250 test_support.TESTFN + "1",
251 test_support.TESTFN + "2"
252 )
253 self.assertIs(
254 posixpath.samefile(
255 test_support.TESTFN + "1",
256 test_support.TESTFN + "2"
257 ),
258 True
259 )
260 os.remove(test_support.TESTFN + "2")
261 f = open(test_support.TESTFN + "2", "wb")
262 f.write("bar")
Brett Cannonb47243a2003-06-16 21:54:50 +0000263 f.close()
264 self.assertIs(
265 posixpath.samefile(
266 test_support.TESTFN + "1",
Brett Cannonb47243a2003-06-16 21:54:50 +0000267 test_support.TESTFN + "2"
Collin Winterdbead562007-03-10 02:23:40 +0000268 ),
269 False
270 )
271 finally:
272 if not f.close():
273 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000274
Collin Winterdbead562007-03-10 02:23:40 +0000275 self.assertRaises(TypeError, posixpath.samefile)
Brett Cannonb47243a2003-06-16 21:54:50 +0000276
277 def test_samestat(self):
278 f = open(test_support.TESTFN + "1", "wb")
279 try:
280 f.write("foo")
281 f.close()
282 self.assertIs(
283 posixpath.samestat(
284 os.stat(test_support.TESTFN + "1"),
285 os.stat(test_support.TESTFN + "1")
286 ),
287 True
288 )
Tim Peters478c1052003-06-29 05:46:54 +0000289 # If we don't have links, assume that os.stat() doesn't return resonable
Brett Cannonb47243a2003-06-16 21:54:50 +0000290 # inode information and thus, that samefile() doesn't work
291 if hasattr(os, "symlink"):
292 if hasattr(os, "symlink"):
293 os.symlink(test_support.TESTFN + "1", test_support.TESTFN + "2")
294 self.assertIs(
295 posixpath.samestat(
296 os.stat(test_support.TESTFN + "1"),
297 os.stat(test_support.TESTFN + "2")
298 ),
299 True
300 )
301 os.remove(test_support.TESTFN + "2")
302 f = open(test_support.TESTFN + "2", "wb")
303 f.write("bar")
304 f.close()
305 self.assertIs(
306 posixpath.samestat(
307 os.stat(test_support.TESTFN + "1"),
308 os.stat(test_support.TESTFN + "2")
309 ),
310 False
311 )
312 finally:
313 if not f.close():
314 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000315
316 self.assertRaises(TypeError, posixpath.samestat)
317
318 def test_ismount(self):
319 self.assertIs(posixpath.ismount("/"), True)
320
321 self.assertRaises(TypeError, posixpath.ismount)
322
323 def test_expanduser(self):
324 self.assertEqual(posixpath.expanduser("foo"), "foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000325 try:
326 import pwd
327 except ImportError:
328 pass
329 else:
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000330 self.assertIsInstance(posixpath.expanduser("~/"), basestring)
Neal Norwitz168e73d2003-07-01 03:33:31 +0000331 # if home directory == root directory, this test makes no sense
332 if posixpath.expanduser("~") != '/':
333 self.assertEqual(
334 posixpath.expanduser("~") + "/",
335 posixpath.expanduser("~/")
336 )
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000337 self.assertIsInstance(posixpath.expanduser("~root/"), basestring)
338 self.assertIsInstance(posixpath.expanduser("~foo/"), basestring)
Brett Cannonb47243a2003-06-16 21:54:50 +0000339
Walter Dörwald4b965f62009-04-26 20:51:44 +0000340 with test_support.EnvironmentVarGuard() as env:
Walter Dörwald6733bed2009-05-01 17:35:37 +0000341 env['HOME'] = '/'
Walter Dörwald4b965f62009-04-26 20:51:44 +0000342 self.assertEqual(posixpath.expanduser("~"), "/")
Georg Brandl3f0ef202009-04-05 14:48:49 +0000343
Brett Cannonb47243a2003-06-16 21:54:50 +0000344 self.assertRaises(TypeError, posixpath.expanduser)
345
346 def test_expandvars(self):
Walter Dörwald6733bed2009-05-01 17:35:37 +0000347 with test_support.EnvironmentVarGuard() as env:
348 env.clear()
349 env["foo"] = "bar"
350 env["{foo"] = "baz1"
351 env["{foo}"] = "baz2"
Brett Cannonb47243a2003-06-16 21:54:50 +0000352 self.assertEqual(posixpath.expandvars("foo"), "foo")
353 self.assertEqual(posixpath.expandvars("$foo bar"), "bar bar")
354 self.assertEqual(posixpath.expandvars("${foo}bar"), "barbar")
355 self.assertEqual(posixpath.expandvars("$[foo]bar"), "$[foo]bar")
356 self.assertEqual(posixpath.expandvars("$bar bar"), "$bar bar")
357 self.assertEqual(posixpath.expandvars("$?bar"), "$?bar")
358 self.assertEqual(posixpath.expandvars("${foo}bar"), "barbar")
359 self.assertEqual(posixpath.expandvars("$foo}bar"), "bar}bar")
360 self.assertEqual(posixpath.expandvars("${foo"), "${foo")
361 self.assertEqual(posixpath.expandvars("${{foo}}"), "baz1}")
Sjoerd Mullender33a0a062007-01-16 16:42:38 +0000362 self.assertEqual(posixpath.expandvars("$foo$foo"), "barbar")
363 self.assertEqual(posixpath.expandvars("$bar$bar"), "$bar$bar")
Brett Cannonb47243a2003-06-16 21:54:50 +0000364
365 self.assertRaises(TypeError, posixpath.expandvars)
366
367 def test_normpath(self):
368 self.assertEqual(posixpath.normpath(""), ".")
369 self.assertEqual(posixpath.normpath("/"), "/")
370 self.assertEqual(posixpath.normpath("//"), "//")
371 self.assertEqual(posixpath.normpath("///"), "/")
372 self.assertEqual(posixpath.normpath("///foo/.//bar//"), "/foo/bar")
373 self.assertEqual(posixpath.normpath("///foo/.//bar//.//..//.//baz"), "/foo/baz")
374 self.assertEqual(posixpath.normpath("///..//./foo/.//bar"), "/foo/bar")
375
Ezio Melottib5689de2010-01-12 03:32:05 +0000376 # Issue 5827: Make sure normpath preserves unicode
377 for path in (u'', u'.', u'/', u'\\', u'///foo/.//bar//'):
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000378 self.assertIsInstance(posixpath.normpath(path), unicode,
379 'normpath() returned str instead of unicode')
Ezio Melottib5689de2010-01-12 03:32:05 +0000380
Brett Cannonb47243a2003-06-16 21:54:50 +0000381 self.assertRaises(TypeError, posixpath.normpath)
382
383 def test_abspath(self):
Ezio Melottie3467d52010-02-20 09:40:07 +0000384 self.assertIn("foo", posixpath.abspath("foo"))
Brett Cannonb47243a2003-06-16 21:54:50 +0000385
Ezio Melotti4cc80ca2010-02-20 08:09:39 +0000386 # Issue 3426: check that abspath retuns unicode when the arg is unicode
387 # and str when it's str, with both ASCII and non-ASCII cwds
388 for cwd in (u'cwd', u'\xe7w\xf0'):
389 with test_support.temp_cwd(cwd):
390 for path in ('', 'foo', 'f\xf2\xf2', '/foo', 'C:\\'):
391 self.assertIsInstance(posixpath.abspath(path), str)
392 for upath in (u'', u'fuu', u'f\xf9\xf9', u'/fuu', u'U:\\'):
393 self.assertIsInstance(posixpath.abspath(upath), unicode)
394
Brett Cannonb47243a2003-06-16 21:54:50 +0000395 self.assertRaises(TypeError, posixpath.abspath)
396
397 def test_realpath(self):
Ezio Melottie3467d52010-02-20 09:40:07 +0000398 self.assertIn("foo", realpath("foo"))
Brett Cannonb47243a2003-06-16 21:54:50 +0000399 self.assertRaises(TypeError, posixpath.realpath)
Tim Petersa45cacf2004-08-20 03:47:14 +0000400
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000401 if hasattr(os, "symlink"):
402 def test_realpath_basic(self):
403 # Basic operation.
404 try:
405 os.symlink(ABSTFN+"1", ABSTFN)
406 self.assertEqual(realpath(ABSTFN), ABSTFN+"1")
407 finally:
Collin Winterdbead562007-03-10 02:23:40 +0000408 test_support.unlink(ABSTFN)
Tim Petersa45cacf2004-08-20 03:47:14 +0000409
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000410 def test_realpath_symlink_loops(self):
411 # Bug #930024, return the path unchanged if we get into an infinite
412 # symlink loop.
413 try:
414 old_path = abspath('.')
415 os.symlink(ABSTFN, ABSTFN)
416 self.assertEqual(realpath(ABSTFN), ABSTFN)
417
418 os.symlink(ABSTFN+"1", ABSTFN+"2")
419 os.symlink(ABSTFN+"2", ABSTFN+"1")
420 self.assertEqual(realpath(ABSTFN+"1"), ABSTFN+"1")
421 self.assertEqual(realpath(ABSTFN+"2"), ABSTFN+"2")
422
423 # Test using relative path as well.
424 os.chdir(dirname(ABSTFN))
425 self.assertEqual(realpath(basename(ABSTFN)), ABSTFN)
426 finally:
427 os.chdir(old_path)
Collin Winterdbead562007-03-10 02:23:40 +0000428 test_support.unlink(ABSTFN)
429 test_support.unlink(ABSTFN+"1")
430 test_support.unlink(ABSTFN+"2")
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000431
Tim Petersa45cacf2004-08-20 03:47:14 +0000432 def test_realpath_resolve_parents(self):
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000433 # We also need to resolve any symlinks in the parents of a relative
434 # path passed to realpath. E.g.: current working directory is
435 # /usr/doc with 'doc' being a symlink to /usr/share/doc. We call
436 # realpath("a"). This should return /usr/share/doc/a/.
437 try:
438 old_path = abspath('.')
439 os.mkdir(ABSTFN)
440 os.mkdir(ABSTFN + "/y")
441 os.symlink(ABSTFN + "/y", ABSTFN + "/k")
442
443 os.chdir(ABSTFN + "/k")
444 self.assertEqual(realpath("a"), ABSTFN + "/y/a")
445 finally:
446 os.chdir(old_path)
Collin Winterdbead562007-03-10 02:23:40 +0000447 test_support.unlink(ABSTFN + "/k")
448 safe_rmdir(ABSTFN + "/y")
449 safe_rmdir(ABSTFN)
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000450
451 def test_realpath_resolve_before_normalizing(self):
452 # Bug #990669: Symbolic links should be resolved before we
453 # normalize the path. E.g.: if we have directories 'a', 'k' and 'y'
454 # in the following hierarchy:
455 # a/k/y
456 #
457 # and a symbolic link 'link-y' pointing to 'y' in directory 'a',
458 # then realpath("link-y/..") should return 'k', not 'a'.
459 try:
460 old_path = abspath('.')
461 os.mkdir(ABSTFN)
462 os.mkdir(ABSTFN + "/k")
463 os.mkdir(ABSTFN + "/k/y")
464 os.symlink(ABSTFN + "/k/y", ABSTFN + "/link-y")
465
466 # Absolute path.
467 self.assertEqual(realpath(ABSTFN + "/link-y/.."), ABSTFN + "/k")
468 # Relative path.
469 os.chdir(dirname(ABSTFN))
Ezio Melottie3467d52010-02-20 09:40:07 +0000470 self.assertEqual(realpath(basename(ABSTFN) + "/link-y/.."),
471 ABSTFN + "/k")
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000472 finally:
473 os.chdir(old_path)
Collin Winterdbead562007-03-10 02:23:40 +0000474 test_support.unlink(ABSTFN + "/link-y")
475 safe_rmdir(ABSTFN + "/k/y")
476 safe_rmdir(ABSTFN + "/k")
477 safe_rmdir(ABSTFN)
Tim Peters5d36a552005-06-03 22:40:27 +0000478
Georg Brandl268e61c2005-06-03 14:28:50 +0000479 def test_realpath_resolve_first(self):
480 # Bug #1213894: The first component of the path, if not absolute,
481 # must be resolved too.
482
483 try:
484 old_path = abspath('.')
485 os.mkdir(ABSTFN)
486 os.mkdir(ABSTFN + "/k")
487 os.symlink(ABSTFN, ABSTFN + "link")
488 os.chdir(dirname(ABSTFN))
Tim Peters5d36a552005-06-03 22:40:27 +0000489
Georg Brandl268e61c2005-06-03 14:28:50 +0000490 base = basename(ABSTFN)
491 self.assertEqual(realpath(base + "link"), ABSTFN)
492 self.assertEqual(realpath(base + "link/k"), ABSTFN + "/k")
493 finally:
494 os.chdir(old_path)
Collin Winterdbead562007-03-10 02:23:40 +0000495 test_support.unlink(ABSTFN + "link")
496 safe_rmdir(ABSTFN + "/k")
497 safe_rmdir(ABSTFN)
Brett Cannonb47243a2003-06-16 21:54:50 +0000498
Collin Winter6f187742007-03-16 22:16:08 +0000499 def test_relpath(self):
Collin Winter75c7eb42007-03-23 22:24:39 +0000500 (real_getcwd, os.getcwd) = (os.getcwd, lambda: r"/home/user/bar")
501 try:
502 curdir = os.path.split(os.getcwd())[-1]
503 self.assertRaises(ValueError, posixpath.relpath, "")
504 self.assertEqual(posixpath.relpath("a"), "a")
505 self.assertEqual(posixpath.relpath(posixpath.abspath("a")), "a")
506 self.assertEqual(posixpath.relpath("a/b"), "a/b")
507 self.assertEqual(posixpath.relpath("../a/b"), "../a/b")
508 self.assertEqual(posixpath.relpath("a", "../b"), "../"+curdir+"/a")
509 self.assertEqual(posixpath.relpath("a/b", "../c"), "../"+curdir+"/a/b")
510 self.assertEqual(posixpath.relpath("a", "b/c"), "../../a")
Georg Brandl183a0842008-01-06 14:27:15 +0000511 self.assertEqual(posixpath.relpath("a", "a"), ".")
Collin Winter75c7eb42007-03-23 22:24:39 +0000512 finally:
513 os.getcwd = real_getcwd
Collin Winter6f187742007-03-16 22:16:08 +0000514
Brett Cannonb47243a2003-06-16 21:54:50 +0000515def test_main():
516 test_support.run_unittest(PosixPathTest)
517
518if __name__=="__main__":
519 test_main()