blob: 7ba95f712d944b686ee62a94fea578512086cb55 [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
Georg Brandl89fad142010-03-14 10:23:39 +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
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_islink(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000140 self.assertIs(posixpath.islink(support.TESTFN + "1"), False)
141 f = open(support.TESTFN + "1", "wb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000142 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000143 f.write(b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000144 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000145 self.assertIs(posixpath.islink(support.TESTFN + "1"), False)
Brett Cannonb47243a2003-06-16 21:54:50 +0000146 if hasattr(os, "symlink"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000147 os.symlink(support.TESTFN + "1", support.TESTFN + "2")
148 self.assertIs(posixpath.islink(support.TESTFN + "2"), True)
149 os.remove(support.TESTFN + "1")
150 self.assertIs(posixpath.islink(support.TESTFN + "2"), True)
151 self.assertIs(posixpath.exists(support.TESTFN + "2"), False)
152 self.assertIs(posixpath.lexists(support.TESTFN + "2"), True)
Brett Cannonb47243a2003-06-16 21:54:50 +0000153 finally:
154 if not f.close():
155 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000156
Guido van Rossumd8faa362007-04-27 19:54:29 +0000157 def test_samefile(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000158 f = open(support.TESTFN + "1", "wb")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000159 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000160 f.write(b"foo")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000161 f.close()
162 self.assertIs(
163 posixpath.samefile(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000164 support.TESTFN + "1",
165 support.TESTFN + "1"
Guido van Rossumd8faa362007-04-27 19:54:29 +0000166 ),
167 True
168 )
169 # If we don't have links, assume that os.stat doesn't return resonable
170 # inode information and thus, that samefile() doesn't work
171 if hasattr(os, "symlink"):
172 os.symlink(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000173 support.TESTFN + "1",
174 support.TESTFN + "2"
Guido van Rossumd8faa362007-04-27 19:54:29 +0000175 )
176 self.assertIs(
177 posixpath.samefile(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000178 support.TESTFN + "1",
179 support.TESTFN + "2"
Guido van Rossumd8faa362007-04-27 19:54:29 +0000180 ),
181 True
182 )
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000183 os.remove(support.TESTFN + "2")
184 f = open(support.TESTFN + "2", "wb")
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000185 f.write(b"bar")
Brett Cannonb47243a2003-06-16 21:54:50 +0000186 f.close()
187 self.assertIs(
188 posixpath.samefile(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000189 support.TESTFN + "1",
190 support.TESTFN + "2"
Guido van Rossumd8faa362007-04-27 19:54:29 +0000191 ),
192 False
193 )
194 finally:
195 if not f.close():
196 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000197
Brett Cannonb47243a2003-06-16 21:54:50 +0000198 def test_samestat(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000199 f = open(support.TESTFN + "1", "wb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000200 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000201 f.write(b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000202 f.close()
203 self.assertIs(
204 posixpath.samestat(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000205 os.stat(support.TESTFN + "1"),
206 os.stat(support.TESTFN + "1")
Brett Cannonb47243a2003-06-16 21:54:50 +0000207 ),
208 True
209 )
Tim Peters478c1052003-06-29 05:46:54 +0000210 # If we don't have links, assume that os.stat() doesn't return resonable
Brett Cannonb47243a2003-06-16 21:54:50 +0000211 # inode information and thus, that samefile() doesn't work
212 if hasattr(os, "symlink"):
213 if hasattr(os, "symlink"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000214 os.symlink(support.TESTFN + "1", support.TESTFN + "2")
Brett Cannonb47243a2003-06-16 21:54:50 +0000215 self.assertIs(
216 posixpath.samestat(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000217 os.stat(support.TESTFN + "1"),
218 os.stat(support.TESTFN + "2")
Brett Cannonb47243a2003-06-16 21:54:50 +0000219 ),
220 True
221 )
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000222 os.remove(support.TESTFN + "2")
223 f = open(support.TESTFN + "2", "wb")
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000224 f.write(b"bar")
Brett Cannonb47243a2003-06-16 21:54:50 +0000225 f.close()
226 self.assertIs(
227 posixpath.samestat(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000228 os.stat(support.TESTFN + "1"),
229 os.stat(support.TESTFN + "2")
Brett Cannonb47243a2003-06-16 21:54:50 +0000230 ),
231 False
232 )
233 finally:
234 if not f.close():
235 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000236
Brett Cannonb47243a2003-06-16 21:54:50 +0000237 def test_ismount(self):
238 self.assertIs(posixpath.ismount("/"), True)
239
Brett Cannonb47243a2003-06-16 21:54:50 +0000240 def test_expanduser(self):
241 self.assertEqual(posixpath.expanduser("foo"), "foo")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000242 self.assertEqual(posixpath.expanduser(b"foo"), b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000243 try:
244 import pwd
245 except ImportError:
246 pass
247 else:
Ezio Melottie9615932010-01-24 19:26:24 +0000248 self.assertIsInstance(posixpath.expanduser("~/"), str)
249 self.assertIsInstance(posixpath.expanduser(b"~/"), bytes)
Neal Norwitz168e73d2003-07-01 03:33:31 +0000250 # if home directory == root directory, this test makes no sense
251 if posixpath.expanduser("~") != '/':
252 self.assertEqual(
253 posixpath.expanduser("~") + "/",
254 posixpath.expanduser("~/")
255 )
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000256 self.assertEqual(
257 posixpath.expanduser(b"~") + b"/",
258 posixpath.expanduser(b"~/")
259 )
Ezio Melottie9615932010-01-24 19:26:24 +0000260 self.assertIsInstance(posixpath.expanduser("~root/"), str)
261 self.assertIsInstance(posixpath.expanduser("~foo/"), str)
262 self.assertIsInstance(posixpath.expanduser(b"~root/"), bytes)
263 self.assertIsInstance(posixpath.expanduser(b"~foo/"), bytes)
Brett Cannonb47243a2003-06-16 21:54:50 +0000264
Hirokazu Yamamoto71959632009-04-27 01:44:28 +0000265 with support.EnvironmentVarGuard() as env:
Walter Dörwald155374d2009-05-01 19:58:58 +0000266 env['HOME'] = '/'
Walter Dörwaldb525e182009-04-26 21:39:21 +0000267 self.assertEqual(posixpath.expanduser("~"), "/")
Benjamin Petersonef3e4c22009-04-11 19:48:14 +0000268
Brett Cannonb47243a2003-06-16 21:54:50 +0000269 def test_normpath(self):
270 self.assertEqual(posixpath.normpath(""), ".")
271 self.assertEqual(posixpath.normpath("/"), "/")
272 self.assertEqual(posixpath.normpath("//"), "//")
273 self.assertEqual(posixpath.normpath("///"), "/")
274 self.assertEqual(posixpath.normpath("///foo/.//bar//"), "/foo/bar")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000275 self.assertEqual(posixpath.normpath("///foo/.//bar//.//..//.//baz"),
276 "/foo/baz")
Brett Cannonb47243a2003-06-16 21:54:50 +0000277 self.assertEqual(posixpath.normpath("///..//./foo/.//bar"), "/foo/bar")
278
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000279 self.assertEqual(posixpath.normpath(b""), b".")
280 self.assertEqual(posixpath.normpath(b"/"), b"/")
281 self.assertEqual(posixpath.normpath(b"//"), b"//")
282 self.assertEqual(posixpath.normpath(b"///"), b"/")
283 self.assertEqual(posixpath.normpath(b"///foo/.//bar//"), b"/foo/bar")
284 self.assertEqual(posixpath.normpath(b"///foo/.//bar//.//..//.//baz"),
285 b"/foo/baz")
286 self.assertEqual(posixpath.normpath(b"///..//./foo/.//bar"),
287 b"/foo/bar")
288
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000289 if hasattr(os, "symlink"):
290 def test_realpath_basic(self):
291 # Basic operation.
292 try:
293 os.symlink(ABSTFN+"1", ABSTFN)
294 self.assertEqual(realpath(ABSTFN), ABSTFN+"1")
295 finally:
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000296 support.unlink(ABSTFN)
Tim Petersa45cacf2004-08-20 03:47:14 +0000297
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000298 def test_realpath_symlink_loops(self):
299 # Bug #930024, return the path unchanged if we get into an infinite
300 # symlink loop.
301 try:
302 old_path = abspath('.')
303 os.symlink(ABSTFN, ABSTFN)
304 self.assertEqual(realpath(ABSTFN), ABSTFN)
305
306 os.symlink(ABSTFN+"1", ABSTFN+"2")
307 os.symlink(ABSTFN+"2", ABSTFN+"1")
308 self.assertEqual(realpath(ABSTFN+"1"), ABSTFN+"1")
309 self.assertEqual(realpath(ABSTFN+"2"), ABSTFN+"2")
310
311 # Test using relative path as well.
312 os.chdir(dirname(ABSTFN))
313 self.assertEqual(realpath(basename(ABSTFN)), ABSTFN)
314 finally:
315 os.chdir(old_path)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000316 support.unlink(ABSTFN)
317 support.unlink(ABSTFN+"1")
318 support.unlink(ABSTFN+"2")
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000319
Tim Petersa45cacf2004-08-20 03:47:14 +0000320 def test_realpath_resolve_parents(self):
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000321 # We also need to resolve any symlinks in the parents of a relative
322 # path passed to realpath. E.g.: current working directory is
323 # /usr/doc with 'doc' being a symlink to /usr/share/doc. We call
324 # realpath("a"). This should return /usr/share/doc/a/.
325 try:
326 old_path = abspath('.')
327 os.mkdir(ABSTFN)
328 os.mkdir(ABSTFN + "/y")
329 os.symlink(ABSTFN + "/y", ABSTFN + "/k")
330
331 os.chdir(ABSTFN + "/k")
332 self.assertEqual(realpath("a"), ABSTFN + "/y/a")
333 finally:
334 os.chdir(old_path)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000335 support.unlink(ABSTFN + "/k")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000336 safe_rmdir(ABSTFN + "/y")
337 safe_rmdir(ABSTFN)
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000338
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")
353
354 # Absolute path.
355 self.assertEqual(realpath(ABSTFN + "/link-y/.."), ABSTFN + "/k")
356 # Relative path.
357 os.chdir(dirname(ABSTFN))
Ezio Melottia11865b2010-02-20 09:47:55 +0000358 self.assertEqual(realpath(basename(ABSTFN) + "/link-y/.."),
359 ABSTFN + "/k")
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000360 finally:
361 os.chdir(old_path)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000362 support.unlink(ABSTFN + "/link-y")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000363 safe_rmdir(ABSTFN + "/k/y")
364 safe_rmdir(ABSTFN + "/k")
365 safe_rmdir(ABSTFN)
Tim Peters5d36a552005-06-03 22:40:27 +0000366
Georg Brandl268e61c2005-06-03 14:28:50 +0000367 def test_realpath_resolve_first(self):
368 # Bug #1213894: The first component of the path, if not absolute,
369 # must be resolved too.
370
371 try:
372 old_path = abspath('.')
373 os.mkdir(ABSTFN)
374 os.mkdir(ABSTFN + "/k")
375 os.symlink(ABSTFN, ABSTFN + "link")
376 os.chdir(dirname(ABSTFN))
Tim Peters5d36a552005-06-03 22:40:27 +0000377
Georg Brandl268e61c2005-06-03 14:28:50 +0000378 base = basename(ABSTFN)
379 self.assertEqual(realpath(base + "link"), ABSTFN)
380 self.assertEqual(realpath(base + "link/k"), ABSTFN + "/k")
381 finally:
382 os.chdir(old_path)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000383 support.unlink(ABSTFN + "link")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000384 safe_rmdir(ABSTFN + "/k")
385 safe_rmdir(ABSTFN)
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000386
Guido van Rossumd8faa362007-04-27 19:54:29 +0000387 def test_relpath(self):
388 (real_getcwd, os.getcwd) = (os.getcwd, lambda: r"/home/user/bar")
389 try:
390 curdir = os.path.split(os.getcwd())[-1]
391 self.assertRaises(ValueError, posixpath.relpath, "")
392 self.assertEqual(posixpath.relpath("a"), "a")
393 self.assertEqual(posixpath.relpath(posixpath.abspath("a")), "a")
394 self.assertEqual(posixpath.relpath("a/b"), "a/b")
395 self.assertEqual(posixpath.relpath("../a/b"), "../a/b")
396 self.assertEqual(posixpath.relpath("a", "../b"), "../"+curdir+"/a")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000397 self.assertEqual(posixpath.relpath("a/b", "../c"),
398 "../"+curdir+"/a/b")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000399 self.assertEqual(posixpath.relpath("a", "b/c"), "../../a")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000400 self.assertEqual(posixpath.relpath("a", "a"), ".")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000401 finally:
402 os.getcwd = real_getcwd
Brett Cannonb47243a2003-06-16 21:54:50 +0000403
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000404 def test_relpath_bytes(self):
405 (real_getcwdb, os.getcwdb) = (os.getcwdb, lambda: br"/home/user/bar")
406 try:
407 curdir = os.path.split(os.getcwdb())[-1]
408 self.assertRaises(ValueError, posixpath.relpath, b"")
409 self.assertEqual(posixpath.relpath(b"a"), b"a")
410 self.assertEqual(posixpath.relpath(posixpath.abspath(b"a")), b"a")
411 self.assertEqual(posixpath.relpath(b"a/b"), b"a/b")
412 self.assertEqual(posixpath.relpath(b"../a/b"), b"../a/b")
413 self.assertEqual(posixpath.relpath(b"a", b"../b"),
414 b"../"+curdir+b"/a")
415 self.assertEqual(posixpath.relpath(b"a/b", b"../c"),
416 b"../"+curdir+b"/a/b")
417 self.assertEqual(posixpath.relpath(b"a", b"b/c"), b"../../a")
418 self.assertEqual(posixpath.relpath(b"a", b"a"), b".")
419
420 self.assertRaises(TypeError, posixpath.relpath, b"bytes", "str")
421 self.assertRaises(TypeError, posixpath.relpath, "str", b"bytes")
422 finally:
423 os.getcwdb = real_getcwdb
424
Florent Xiclunac9c79782010-03-08 12:24:53 +0000425
426class PosixCommonTest(test_genericpath.CommonTest):
427 pathmodule = posixpath
428 attributes = ['relpath', 'samefile', 'sameopenfile', 'samestat']
429
430
Brett Cannonb47243a2003-06-16 21:54:50 +0000431def test_main():
Florent Xiclunac9c79782010-03-08 12:24:53 +0000432 support.run_unittest(PosixPathTest, PosixCommonTest)
433
Brett Cannonb47243a2003-06-16 21:54:50 +0000434
435if __name__=="__main__":
436 test_main()