blob: 40425956616c29d05263089de6d52901e3b37406 [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
Brian Curtind40e6f72010-07-08 21:39:08 +00004import posixpath
5import os
6import sys
Georg Brandl89fad142010-03-14 10:23:39 +00007from posixpath import realpath, abspath, dirname, basename
Johannes Gijsbers4ec40642004-08-14 15:01:53 +00008
9# An absolute path to a temporary filename for testing. We can't rely on TESTFN
10# being an absolute path, so we need this.
11
Benjamin Petersonee8712c2008-05-20 21:35:26 +000012ABSTFN = abspath(support.TESTFN)
Skip Montanaroe809b002000-07-12 00:20:08 +000013
Brian Curtind40e6f72010-07-08 21:39:08 +000014def skip_if_ABSTFN_contains_backslash(test):
15 """
16 On Windows, posixpath.abspath still returns paths with backslashes
17 instead of posix forward slashes. If this is the case, several tests
18 fail, so skip them.
19 """
20 found_backslash = '\\' in ABSTFN
21 msg = "ABSTFN is not a posix path - tests fail"
22 return [test, unittest.skip(msg)(test)][found_backslash]
23
Guido van Rossumd8faa362007-04-27 19:54:29 +000024def safe_rmdir(dirname):
25 try:
26 os.rmdir(dirname)
27 except OSError:
28 pass
29
Brett Cannonb47243a2003-06-16 21:54:50 +000030class PosixPathTest(unittest.TestCase):
Skip Montanaroe809b002000-07-12 00:20:08 +000031
Guido van Rossumd8faa362007-04-27 19:54:29 +000032 def setUp(self):
33 self.tearDown()
34
35 def tearDown(self):
36 for suffix in ["", "1", "2"]:
Benjamin Petersonee8712c2008-05-20 21:35:26 +000037 support.unlink(support.TESTFN + suffix)
38 safe_rmdir(support.TESTFN + suffix)
Guido van Rossumd8faa362007-04-27 19:54:29 +000039
Brett Cannonb47243a2003-06-16 21:54:50 +000040 def test_join(self):
Guido van Rossumf0af3e32008-10-02 18:55:37 +000041 self.assertEqual(posixpath.join("/foo", "bar", "/bar", "baz"),
42 "/bar/baz")
Brett Cannonb47243a2003-06-16 21:54:50 +000043 self.assertEqual(posixpath.join("/foo", "bar", "baz"), "/foo/bar/baz")
Guido van Rossumf0af3e32008-10-02 18:55:37 +000044 self.assertEqual(posixpath.join("/foo/", "bar/", "baz/"),
45 "/foo/bar/baz/")
46
47 self.assertEqual(posixpath.join(b"/foo", b"bar", b"/bar", b"baz"),
48 b"/bar/baz")
49 self.assertEqual(posixpath.join(b"/foo", b"bar", b"baz"),
50 b"/foo/bar/baz")
51 self.assertEqual(posixpath.join(b"/foo/", b"bar/", b"baz/"),
52 b"/foo/bar/baz/")
Skip Montanaroe809b002000-07-12 00:20:08 +000053
Guido van Rossumf0af3e32008-10-02 18:55:37 +000054 self.assertRaises(TypeError, posixpath.join, b"bytes", "str")
55 self.assertRaises(TypeError, posixpath.join, "str", b"bytes")
Skip Montanaroe809b002000-07-12 00:20:08 +000056
Brett Cannonb47243a2003-06-16 21:54:50 +000057 def test_split(self):
58 self.assertEqual(posixpath.split("/foo/bar"), ("/foo", "bar"))
59 self.assertEqual(posixpath.split("/"), ("/", ""))
60 self.assertEqual(posixpath.split("foo"), ("", "foo"))
61 self.assertEqual(posixpath.split("////foo"), ("////", "foo"))
62 self.assertEqual(posixpath.split("//foo//bar"), ("//foo", "bar"))
63
Guido van Rossumf0af3e32008-10-02 18:55:37 +000064 self.assertEqual(posixpath.split(b"/foo/bar"), (b"/foo", b"bar"))
65 self.assertEqual(posixpath.split(b"/"), (b"/", b""))
66 self.assertEqual(posixpath.split(b"foo"), (b"", b"foo"))
67 self.assertEqual(posixpath.split(b"////foo"), (b"////", b"foo"))
68 self.assertEqual(posixpath.split(b"//foo//bar"), (b"//foo", b"bar"))
69
Guido van Rossumd8faa362007-04-27 19:54:29 +000070 def splitextTest(self, path, filename, ext):
71 self.assertEqual(posixpath.splitext(path), (filename, ext))
72 self.assertEqual(posixpath.splitext("/" + path), ("/" + filename, ext))
Guido van Rossumf0af3e32008-10-02 18:55:37 +000073 self.assertEqual(posixpath.splitext("abc/" + path),
74 ("abc/" + filename, ext))
75 self.assertEqual(posixpath.splitext("abc.def/" + path),
76 ("abc.def/" + filename, ext))
77 self.assertEqual(posixpath.splitext("/abc.def/" + path),
78 ("/abc.def/" + filename, ext))
79 self.assertEqual(posixpath.splitext(path + "/"),
80 (filename + ext + "/", ""))
81
82 path = bytes(path, "ASCII")
83 filename = bytes(filename, "ASCII")
84 ext = bytes(ext, "ASCII")
85
86 self.assertEqual(posixpath.splitext(path), (filename, ext))
87 self.assertEqual(posixpath.splitext(b"/" + path),
88 (b"/" + filename, ext))
89 self.assertEqual(posixpath.splitext(b"abc/" + path),
90 (b"abc/" + filename, ext))
91 self.assertEqual(posixpath.splitext(b"abc.def/" + path),
92 (b"abc.def/" + filename, ext))
93 self.assertEqual(posixpath.splitext(b"/abc.def/" + path),
94 (b"/abc.def/" + filename, ext))
95 self.assertEqual(posixpath.splitext(path + b"/"),
96 (filename + ext + b"/", b""))
Brett Cannonb47243a2003-06-16 21:54:50 +000097
Guido van Rossumd8faa362007-04-27 19:54:29 +000098 def test_splitext(self):
99 self.splitextTest("foo.bar", "foo", ".bar")
100 self.splitextTest("foo.boo.bar", "foo.boo", ".bar")
101 self.splitextTest("foo.boo.biff.bar", "foo.boo.biff", ".bar")
102 self.splitextTest(".csh.rc", ".csh", ".rc")
103 self.splitextTest("nodots", "nodots", "")
104 self.splitextTest(".cshrc", ".cshrc", "")
105 self.splitextTest("...manydots", "...manydots", "")
106 self.splitextTest("...manydots.ext", "...manydots", ".ext")
107 self.splitextTest(".", ".", "")
108 self.splitextTest("..", "..", "")
109 self.splitextTest("........", "........", "")
110 self.splitextTest("", "", "")
Brett Cannonb47243a2003-06-16 21:54:50 +0000111
112 def test_isabs(self):
113 self.assertIs(posixpath.isabs(""), False)
114 self.assertIs(posixpath.isabs("/"), True)
115 self.assertIs(posixpath.isabs("/foo"), True)
116 self.assertIs(posixpath.isabs("/foo/bar"), True)
117 self.assertIs(posixpath.isabs("foo/bar"), False)
118
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000119 self.assertIs(posixpath.isabs(b""), False)
120 self.assertIs(posixpath.isabs(b"/"), True)
121 self.assertIs(posixpath.isabs(b"/foo"), True)
122 self.assertIs(posixpath.isabs(b"/foo/bar"), True)
123 self.assertIs(posixpath.isabs(b"foo/bar"), False)
124
Brett Cannonb47243a2003-06-16 21:54:50 +0000125 def test_basename(self):
126 self.assertEqual(posixpath.basename("/foo/bar"), "bar")
127 self.assertEqual(posixpath.basename("/"), "")
128 self.assertEqual(posixpath.basename("foo"), "foo")
129 self.assertEqual(posixpath.basename("////foo"), "foo")
130 self.assertEqual(posixpath.basename("//foo//bar"), "bar")
131
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000132 self.assertEqual(posixpath.basename(b"/foo/bar"), b"bar")
133 self.assertEqual(posixpath.basename(b"/"), b"")
134 self.assertEqual(posixpath.basename(b"foo"), b"foo")
135 self.assertEqual(posixpath.basename(b"////foo"), b"foo")
136 self.assertEqual(posixpath.basename(b"//foo//bar"), b"bar")
137
Brett Cannonb47243a2003-06-16 21:54:50 +0000138 def test_dirname(self):
139 self.assertEqual(posixpath.dirname("/foo/bar"), "/foo")
140 self.assertEqual(posixpath.dirname("/"), "/")
141 self.assertEqual(posixpath.dirname("foo"), "")
142 self.assertEqual(posixpath.dirname("////foo"), "////")
143 self.assertEqual(posixpath.dirname("//foo//bar"), "//foo")
144
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000145 self.assertEqual(posixpath.dirname(b"/foo/bar"), b"/foo")
146 self.assertEqual(posixpath.dirname(b"/"), b"/")
147 self.assertEqual(posixpath.dirname(b"foo"), b"")
148 self.assertEqual(posixpath.dirname(b"////foo"), b"////")
149 self.assertEqual(posixpath.dirname(b"//foo//bar"), b"//foo")
150
Brett Cannonb47243a2003-06-16 21:54:50 +0000151 def test_islink(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000152 self.assertIs(posixpath.islink(support.TESTFN + "1"), False)
153 f = open(support.TESTFN + "1", "wb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000154 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000155 f.write(b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000156 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000157 self.assertIs(posixpath.islink(support.TESTFN + "1"), False)
Brian Curtin52173d42010-12-02 18:29:18 +0000158 if hasattr(os, "symlink"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000159 os.symlink(support.TESTFN + "1", support.TESTFN + "2")
160 self.assertIs(posixpath.islink(support.TESTFN + "2"), True)
161 os.remove(support.TESTFN + "1")
162 self.assertIs(posixpath.islink(support.TESTFN + "2"), True)
163 self.assertIs(posixpath.exists(support.TESTFN + "2"), False)
164 self.assertIs(posixpath.lexists(support.TESTFN + "2"), True)
Brett Cannonb47243a2003-06-16 21:54:50 +0000165 finally:
166 if not f.close():
167 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000168
Brian Curtind40e6f72010-07-08 21:39:08 +0000169 @staticmethod
170 def _create_file(filename):
171 with open(filename, 'wb') as f:
172 f.write(b'foo')
173
Guido van Rossumd8faa362007-04-27 19:54:29 +0000174 def test_samefile(self):
Brian Curtind40e6f72010-07-08 21:39:08 +0000175 test_fn = support.TESTFN + "1"
176 self._create_file(test_fn)
177 self.assertTrue(posixpath.samefile(test_fn, test_fn))
178 self.assertRaises(TypeError, posixpath.samefile)
179
180 @unittest.skipIf(
181 sys.platform.startswith('win'),
182 "posixpath.samefile does not work on links in Windows")
Brian Curtin52173d42010-12-02 18:29:18 +0000183 @unittest.skipUnless(hasattr(os, "symlink"),
184 "Missing symlink implementation")
Brian Curtind40e6f72010-07-08 21:39:08 +0000185 def test_samefile_on_links(self):
186 test_fn1 = support.TESTFN + "1"
187 test_fn2 = support.TESTFN + "2"
188 self._create_file(test_fn1)
189
190 os.symlink(test_fn1, test_fn2)
191 self.assertTrue(posixpath.samefile(test_fn1, test_fn2))
192 os.remove(test_fn2)
193
194 self._create_file(test_fn2)
195 self.assertFalse(posixpath.samefile(test_fn1, test_fn2))
196
Brett Cannonb47243a2003-06-16 21:54:50 +0000197
Brett Cannonb47243a2003-06-16 21:54:50 +0000198 def test_samestat(self):
Brian Curtind40e6f72010-07-08 21:39:08 +0000199 test_fn = support.TESTFN + "1"
200 self._create_file(test_fn)
201 test_fns = [test_fn]*2
202 stats = map(os.stat, test_fns)
203 self.assertTrue(posixpath.samestat(*stats))
204
205 @unittest.skipIf(
206 sys.platform.startswith('win'),
207 "posixpath.samestat does not work on links in Windows")
Brian Curtin52173d42010-12-02 18:29:18 +0000208 @unittest.skipUnless(hasattr(os, "symlink"),
209 "Missing symlink implementation")
Brian Curtind40e6f72010-07-08 21:39:08 +0000210 def test_samestat_on_links(self):
211 test_fn1 = support.TESTFN + "1"
212 test_fn2 = support.TESTFN + "2"
Brian Curtin16633fa2010-07-09 13:54:27 +0000213 self._create_file(test_fn1)
Brian Curtind40e6f72010-07-08 21:39:08 +0000214 test_fns = (test_fn1, test_fn2)
215 os.symlink(*test_fns)
216 stats = map(os.stat, test_fns)
217 self.assertTrue(posixpath.samestat(*stats))
218 os.remove(test_fn2)
219
220 self._create_file(test_fn2)
221 stats = map(os.stat, test_fns)
222 self.assertFalse(posixpath.samestat(*stats))
223
224 self.assertRaises(TypeError, posixpath.samestat)
Brett Cannonb47243a2003-06-16 21:54:50 +0000225
Brett Cannonb47243a2003-06-16 21:54:50 +0000226 def test_ismount(self):
227 self.assertIs(posixpath.ismount("/"), True)
228
Brett Cannonb47243a2003-06-16 21:54:50 +0000229 def test_expanduser(self):
230 self.assertEqual(posixpath.expanduser("foo"), "foo")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000231 self.assertEqual(posixpath.expanduser(b"foo"), b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000232 try:
233 import pwd
234 except ImportError:
235 pass
236 else:
Ezio Melottie9615932010-01-24 19:26:24 +0000237 self.assertIsInstance(posixpath.expanduser("~/"), str)
238 self.assertIsInstance(posixpath.expanduser(b"~/"), bytes)
Neal Norwitz168e73d2003-07-01 03:33:31 +0000239 # if home directory == root directory, this test makes no sense
240 if posixpath.expanduser("~") != '/':
241 self.assertEqual(
242 posixpath.expanduser("~") + "/",
243 posixpath.expanduser("~/")
244 )
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000245 self.assertEqual(
246 posixpath.expanduser(b"~") + b"/",
247 posixpath.expanduser(b"~/")
248 )
Ezio Melottie9615932010-01-24 19:26:24 +0000249 self.assertIsInstance(posixpath.expanduser("~root/"), str)
250 self.assertIsInstance(posixpath.expanduser("~foo/"), str)
251 self.assertIsInstance(posixpath.expanduser(b"~root/"), bytes)
252 self.assertIsInstance(posixpath.expanduser(b"~foo/"), bytes)
Brett Cannonb47243a2003-06-16 21:54:50 +0000253
Hirokazu Yamamoto71959632009-04-27 01:44:28 +0000254 with support.EnvironmentVarGuard() as env:
Walter Dörwald155374d2009-05-01 19:58:58 +0000255 env['HOME'] = '/'
Walter Dörwaldb525e182009-04-26 21:39:21 +0000256 self.assertEqual(posixpath.expanduser("~"), "/")
Benjamin Petersonef3e4c22009-04-11 19:48:14 +0000257
Brett Cannonb47243a2003-06-16 21:54:50 +0000258 def test_normpath(self):
259 self.assertEqual(posixpath.normpath(""), ".")
260 self.assertEqual(posixpath.normpath("/"), "/")
261 self.assertEqual(posixpath.normpath("//"), "//")
262 self.assertEqual(posixpath.normpath("///"), "/")
263 self.assertEqual(posixpath.normpath("///foo/.//bar//"), "/foo/bar")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000264 self.assertEqual(posixpath.normpath("///foo/.//bar//.//..//.//baz"),
265 "/foo/baz")
Brett Cannonb47243a2003-06-16 21:54:50 +0000266 self.assertEqual(posixpath.normpath("///..//./foo/.//bar"), "/foo/bar")
267
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000268 self.assertEqual(posixpath.normpath(b""), b".")
269 self.assertEqual(posixpath.normpath(b"/"), b"/")
270 self.assertEqual(posixpath.normpath(b"//"), b"//")
271 self.assertEqual(posixpath.normpath(b"///"), b"/")
272 self.assertEqual(posixpath.normpath(b"///foo/.//bar//"), b"/foo/bar")
273 self.assertEqual(posixpath.normpath(b"///foo/.//bar//.//..//.//baz"),
274 b"/foo/baz")
275 self.assertEqual(posixpath.normpath(b"///..//./foo/.//bar"),
276 b"/foo/bar")
277
Brian Curtin52173d42010-12-02 18:29:18 +0000278 @unittest.skipUnless(hasattr(os, "symlink"),
279 "Missing symlink implementation")
Brian Curtind40e6f72010-07-08 21:39:08 +0000280 @skip_if_ABSTFN_contains_backslash
281 def test_realpath_basic(self):
282 # Basic operation.
283 try:
284 os.symlink(ABSTFN+"1", ABSTFN)
285 self.assertEqual(realpath(ABSTFN), ABSTFN+"1")
286 finally:
287 support.unlink(ABSTFN)
Tim Petersa45cacf2004-08-20 03:47:14 +0000288
Brian Curtin52173d42010-12-02 18:29:18 +0000289 @unittest.skipUnless(hasattr(os, "symlink"),
290 "Missing symlink implementation")
Brian Curtind40e6f72010-07-08 21:39:08 +0000291 @skip_if_ABSTFN_contains_backslash
292 def test_realpath_symlink_loops(self):
293 # Bug #930024, return the path unchanged if we get into an infinite
294 # symlink loop.
295 try:
296 old_path = abspath('.')
297 os.symlink(ABSTFN, ABSTFN)
298 self.assertEqual(realpath(ABSTFN), ABSTFN)
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000299
Brian Curtind40e6f72010-07-08 21:39:08 +0000300 os.symlink(ABSTFN+"1", ABSTFN+"2")
301 os.symlink(ABSTFN+"2", ABSTFN+"1")
302 self.assertEqual(realpath(ABSTFN+"1"), ABSTFN+"1")
303 self.assertEqual(realpath(ABSTFN+"2"), ABSTFN+"2")
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000304
Brian Curtind40e6f72010-07-08 21:39:08 +0000305 # Test using relative path as well.
306 os.chdir(dirname(ABSTFN))
307 self.assertEqual(realpath(basename(ABSTFN)), ABSTFN)
308 finally:
309 os.chdir(old_path)
310 support.unlink(ABSTFN)
311 support.unlink(ABSTFN+"1")
312 support.unlink(ABSTFN+"2")
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000313
Brian Curtin52173d42010-12-02 18:29:18 +0000314 @unittest.skipUnless(hasattr(os, "symlink"),
315 "Missing symlink implementation")
Brian Curtind40e6f72010-07-08 21:39:08 +0000316 @skip_if_ABSTFN_contains_backslash
317 def test_realpath_resolve_parents(self):
318 # We also need to resolve any symlinks in the parents of a relative
319 # path passed to realpath. E.g.: current working directory is
320 # /usr/doc with 'doc' being a symlink to /usr/share/doc. We call
321 # realpath("a"). This should return /usr/share/doc/a/.
322 try:
323 old_path = abspath('.')
324 os.mkdir(ABSTFN)
325 os.mkdir(ABSTFN + "/y")
326 os.symlink(ABSTFN + "/y", ABSTFN + "/k")
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000327
Brian Curtind40e6f72010-07-08 21:39:08 +0000328 os.chdir(ABSTFN + "/k")
329 self.assertEqual(realpath("a"), ABSTFN + "/y/a")
330 finally:
331 os.chdir(old_path)
332 support.unlink(ABSTFN + "/k")
333 safe_rmdir(ABSTFN + "/y")
334 safe_rmdir(ABSTFN)
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000335
Brian Curtin52173d42010-12-02 18:29:18 +0000336 @unittest.skipUnless(hasattr(os, "symlink"),
337 "Missing symlink implementation")
Brian Curtind40e6f72010-07-08 21:39:08 +0000338 @skip_if_ABSTFN_contains_backslash
339 def test_realpath_resolve_before_normalizing(self):
340 # Bug #990669: Symbolic links should be resolved before we
341 # normalize the path. E.g.: if we have directories 'a', 'k' and 'y'
342 # in the following hierarchy:
343 # a/k/y
344 #
345 # and a symbolic link 'link-y' pointing to 'y' in directory 'a',
346 # then realpath("link-y/..") should return 'k', not 'a'.
347 try:
348 old_path = abspath('.')
349 os.mkdir(ABSTFN)
350 os.mkdir(ABSTFN + "/k")
351 os.mkdir(ABSTFN + "/k/y")
352 os.symlink(ABSTFN + "/k/y", ABSTFN + "/link-y")
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000353
Brian Curtind40e6f72010-07-08 21:39:08 +0000354 # Absolute path.
355 self.assertEqual(realpath(ABSTFN + "/link-y/.."), ABSTFN + "/k")
356 # Relative path.
357 os.chdir(dirname(ABSTFN))
358 self.assertEqual(realpath(basename(ABSTFN) + "/link-y/.."),
359 ABSTFN + "/k")
360 finally:
361 os.chdir(old_path)
362 support.unlink(ABSTFN + "/link-y")
363 safe_rmdir(ABSTFN + "/k/y")
364 safe_rmdir(ABSTFN + "/k")
365 safe_rmdir(ABSTFN)
Tim Peters5d36a552005-06-03 22:40:27 +0000366
Brian Curtin52173d42010-12-02 18:29:18 +0000367 @unittest.skipUnless(hasattr(os, "symlink"),
368 "Missing symlink implementation")
Brian Curtind40e6f72010-07-08 21:39:08 +0000369 @skip_if_ABSTFN_contains_backslash
370 def test_realpath_resolve_first(self):
371 # Bug #1213894: The first component of the path, if not absolute,
372 # must be resolved too.
Georg Brandl268e61c2005-06-03 14:28:50 +0000373
Brian Curtind40e6f72010-07-08 21:39:08 +0000374 try:
375 old_path = abspath('.')
376 os.mkdir(ABSTFN)
377 os.mkdir(ABSTFN + "/k")
378 os.symlink(ABSTFN, ABSTFN + "link")
379 os.chdir(dirname(ABSTFN))
Tim Peters5d36a552005-06-03 22:40:27 +0000380
Brian Curtind40e6f72010-07-08 21:39:08 +0000381 base = basename(ABSTFN)
382 self.assertEqual(realpath(base + "link"), ABSTFN)
383 self.assertEqual(realpath(base + "link/k"), ABSTFN + "/k")
384 finally:
385 os.chdir(old_path)
386 support.unlink(ABSTFN + "link")
387 safe_rmdir(ABSTFN + "/k")
388 safe_rmdir(ABSTFN)
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000389
Guido van Rossumd8faa362007-04-27 19:54:29 +0000390 def test_relpath(self):
391 (real_getcwd, os.getcwd) = (os.getcwd, lambda: r"/home/user/bar")
392 try:
393 curdir = os.path.split(os.getcwd())[-1]
394 self.assertRaises(ValueError, posixpath.relpath, "")
395 self.assertEqual(posixpath.relpath("a"), "a")
396 self.assertEqual(posixpath.relpath(posixpath.abspath("a")), "a")
397 self.assertEqual(posixpath.relpath("a/b"), "a/b")
398 self.assertEqual(posixpath.relpath("../a/b"), "../a/b")
399 self.assertEqual(posixpath.relpath("a", "../b"), "../"+curdir+"/a")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000400 self.assertEqual(posixpath.relpath("a/b", "../c"),
401 "../"+curdir+"/a/b")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000402 self.assertEqual(posixpath.relpath("a", "b/c"), "../../a")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000403 self.assertEqual(posixpath.relpath("a", "a"), ".")
Hirokazu Yamamotob08820a2010-10-18 12:13:18 +0000404 self.assertEqual(posixpath.relpath("/foo/bar/bat", "/x/y/z"), '../../../foo/bar/bat')
405 self.assertEqual(posixpath.relpath("/foo/bar/bat", "/foo/bar"), 'bat')
406 self.assertEqual(posixpath.relpath("/foo/bar/bat", "/"), 'foo/bar/bat')
407 self.assertEqual(posixpath.relpath("/", "/foo/bar/bat"), '../../..')
408 self.assertEqual(posixpath.relpath("/foo/bar/bat", "/x"), '../foo/bar/bat')
409 self.assertEqual(posixpath.relpath("/x", "/foo/bar/bat"), '../../../x')
410 self.assertEqual(posixpath.relpath("/", "/"), '.')
411 self.assertEqual(posixpath.relpath("/a", "/a"), '.')
412 self.assertEqual(posixpath.relpath("/a/b", "/a/b"), '.')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000413 finally:
414 os.getcwd = real_getcwd
Brett Cannonb47243a2003-06-16 21:54:50 +0000415
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000416 def test_relpath_bytes(self):
417 (real_getcwdb, os.getcwdb) = (os.getcwdb, lambda: br"/home/user/bar")
418 try:
419 curdir = os.path.split(os.getcwdb())[-1]
420 self.assertRaises(ValueError, posixpath.relpath, b"")
421 self.assertEqual(posixpath.relpath(b"a"), b"a")
422 self.assertEqual(posixpath.relpath(posixpath.abspath(b"a")), b"a")
423 self.assertEqual(posixpath.relpath(b"a/b"), b"a/b")
424 self.assertEqual(posixpath.relpath(b"../a/b"), b"../a/b")
425 self.assertEqual(posixpath.relpath(b"a", b"../b"),
426 b"../"+curdir+b"/a")
427 self.assertEqual(posixpath.relpath(b"a/b", b"../c"),
428 b"../"+curdir+b"/a/b")
429 self.assertEqual(posixpath.relpath(b"a", b"b/c"), b"../../a")
430 self.assertEqual(posixpath.relpath(b"a", b"a"), b".")
Hirokazu Yamamotob08820a2010-10-18 12:13:18 +0000431 self.assertEqual(posixpath.relpath(b"/foo/bar/bat", b"/x/y/z"), b'../../../foo/bar/bat')
432 self.assertEqual(posixpath.relpath(b"/foo/bar/bat", b"/foo/bar"), b'bat')
433 self.assertEqual(posixpath.relpath(b"/foo/bar/bat", b"/"), b'foo/bar/bat')
434 self.assertEqual(posixpath.relpath(b"/", b"/foo/bar/bat"), b'../../..')
435 self.assertEqual(posixpath.relpath(b"/foo/bar/bat", b"/x"), b'../foo/bar/bat')
436 self.assertEqual(posixpath.relpath(b"/x", b"/foo/bar/bat"), b'../../../x')
437 self.assertEqual(posixpath.relpath(b"/", b"/"), b'.')
438 self.assertEqual(posixpath.relpath(b"/a", b"/a"), b'.')
439 self.assertEqual(posixpath.relpath(b"/a/b", b"/a/b"), b'.')
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000440
441 self.assertRaises(TypeError, posixpath.relpath, b"bytes", "str")
442 self.assertRaises(TypeError, posixpath.relpath, "str", b"bytes")
443 finally:
444 os.getcwdb = real_getcwdb
445
Florent Xiclunac9c79782010-03-08 12:24:53 +0000446
447class PosixCommonTest(test_genericpath.CommonTest):
448 pathmodule = posixpath
449 attributes = ['relpath', 'samefile', 'sameopenfile', 'samestat']
450
451
Brett Cannonb47243a2003-06-16 21:54:50 +0000452def test_main():
Florent Xiclunac9c79782010-03-08 12:24:53 +0000453 support.run_unittest(PosixPathTest, PosixCommonTest)
454
Brett Cannonb47243a2003-06-16 21:54:50 +0000455
456if __name__=="__main__":
457 test_main()