blob: 34b9689dc96d61ac61c64a2157d2b7c99ee5a681 [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 Curtind40e6f72010-07-08 21:39:08 +0000158 if support.can_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")
183 @support.skip_unless_symlink
184 def test_samefile_on_links(self):
185 test_fn1 = support.TESTFN + "1"
186 test_fn2 = support.TESTFN + "2"
187 self._create_file(test_fn1)
188
189 os.symlink(test_fn1, test_fn2)
190 self.assertTrue(posixpath.samefile(test_fn1, test_fn2))
191 os.remove(test_fn2)
192
193 self._create_file(test_fn2)
194 self.assertFalse(posixpath.samefile(test_fn1, test_fn2))
195
Brett Cannonb47243a2003-06-16 21:54:50 +0000196
Brett Cannonb47243a2003-06-16 21:54:50 +0000197 def test_samestat(self):
Brian Curtind40e6f72010-07-08 21:39:08 +0000198 test_fn = support.TESTFN + "1"
199 self._create_file(test_fn)
200 test_fns = [test_fn]*2
201 stats = map(os.stat, test_fns)
202 self.assertTrue(posixpath.samestat(*stats))
203
204 @unittest.skipIf(
205 sys.platform.startswith('win'),
206 "posixpath.samestat does not work on links in Windows")
207 @support.skip_unless_symlink
208 def test_samestat_on_links(self):
209 test_fn1 = support.TESTFN + "1"
210 test_fn2 = support.TESTFN + "2"
211 test_fns = (test_fn1, test_fn2)
212 os.symlink(*test_fns)
213 stats = map(os.stat, test_fns)
214 self.assertTrue(posixpath.samestat(*stats))
215 os.remove(test_fn2)
216
217 self._create_file(test_fn2)
218 stats = map(os.stat, test_fns)
219 self.assertFalse(posixpath.samestat(*stats))
220
221 self.assertRaises(TypeError, posixpath.samestat)
Brett Cannonb47243a2003-06-16 21:54:50 +0000222
Brett Cannonb47243a2003-06-16 21:54:50 +0000223 def test_ismount(self):
224 self.assertIs(posixpath.ismount("/"), True)
225
Brett Cannonb47243a2003-06-16 21:54:50 +0000226 def test_expanduser(self):
227 self.assertEqual(posixpath.expanduser("foo"), "foo")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000228 self.assertEqual(posixpath.expanduser(b"foo"), b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000229 try:
230 import pwd
231 except ImportError:
232 pass
233 else:
Ezio Melottie9615932010-01-24 19:26:24 +0000234 self.assertIsInstance(posixpath.expanduser("~/"), str)
235 self.assertIsInstance(posixpath.expanduser(b"~/"), bytes)
Neal Norwitz168e73d2003-07-01 03:33:31 +0000236 # if home directory == root directory, this test makes no sense
237 if posixpath.expanduser("~") != '/':
238 self.assertEqual(
239 posixpath.expanduser("~") + "/",
240 posixpath.expanduser("~/")
241 )
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000242 self.assertEqual(
243 posixpath.expanduser(b"~") + b"/",
244 posixpath.expanduser(b"~/")
245 )
Ezio Melottie9615932010-01-24 19:26:24 +0000246 self.assertIsInstance(posixpath.expanduser("~root/"), str)
247 self.assertIsInstance(posixpath.expanduser("~foo/"), str)
248 self.assertIsInstance(posixpath.expanduser(b"~root/"), bytes)
249 self.assertIsInstance(posixpath.expanduser(b"~foo/"), bytes)
Brett Cannonb47243a2003-06-16 21:54:50 +0000250
Hirokazu Yamamoto71959632009-04-27 01:44:28 +0000251 with support.EnvironmentVarGuard() as env:
Walter Dörwald155374d2009-05-01 19:58:58 +0000252 env['HOME'] = '/'
Walter Dörwaldb525e182009-04-26 21:39:21 +0000253 self.assertEqual(posixpath.expanduser("~"), "/")
Benjamin Petersonef3e4c22009-04-11 19:48:14 +0000254
Brett Cannonb47243a2003-06-16 21:54:50 +0000255 def test_normpath(self):
256 self.assertEqual(posixpath.normpath(""), ".")
257 self.assertEqual(posixpath.normpath("/"), "/")
258 self.assertEqual(posixpath.normpath("//"), "//")
259 self.assertEqual(posixpath.normpath("///"), "/")
260 self.assertEqual(posixpath.normpath("///foo/.//bar//"), "/foo/bar")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000261 self.assertEqual(posixpath.normpath("///foo/.//bar//.//..//.//baz"),
262 "/foo/baz")
Brett Cannonb47243a2003-06-16 21:54:50 +0000263 self.assertEqual(posixpath.normpath("///..//./foo/.//bar"), "/foo/bar")
264
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000265 self.assertEqual(posixpath.normpath(b""), b".")
266 self.assertEqual(posixpath.normpath(b"/"), b"/")
267 self.assertEqual(posixpath.normpath(b"//"), b"//")
268 self.assertEqual(posixpath.normpath(b"///"), b"/")
269 self.assertEqual(posixpath.normpath(b"///foo/.//bar//"), b"/foo/bar")
270 self.assertEqual(posixpath.normpath(b"///foo/.//bar//.//..//.//baz"),
271 b"/foo/baz")
272 self.assertEqual(posixpath.normpath(b"///..//./foo/.//bar"),
273 b"/foo/bar")
274
Brian Curtind40e6f72010-07-08 21:39:08 +0000275 @support.skip_unless_symlink
276 @skip_if_ABSTFN_contains_backslash
277 def test_realpath_basic(self):
278 # Basic operation.
279 try:
280 os.symlink(ABSTFN+"1", ABSTFN)
281 self.assertEqual(realpath(ABSTFN), ABSTFN+"1")
282 finally:
283 support.unlink(ABSTFN)
Tim Petersa45cacf2004-08-20 03:47:14 +0000284
Brian Curtind40e6f72010-07-08 21:39:08 +0000285 @support.skip_unless_symlink
286 @skip_if_ABSTFN_contains_backslash
287 def test_realpath_symlink_loops(self):
288 # Bug #930024, return the path unchanged if we get into an infinite
289 # symlink loop.
290 try:
291 old_path = abspath('.')
292 os.symlink(ABSTFN, ABSTFN)
293 self.assertEqual(realpath(ABSTFN), ABSTFN)
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000294
Brian Curtind40e6f72010-07-08 21:39:08 +0000295 os.symlink(ABSTFN+"1", ABSTFN+"2")
296 os.symlink(ABSTFN+"2", ABSTFN+"1")
297 self.assertEqual(realpath(ABSTFN+"1"), ABSTFN+"1")
298 self.assertEqual(realpath(ABSTFN+"2"), ABSTFN+"2")
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000299
Brian Curtind40e6f72010-07-08 21:39:08 +0000300 # Test using relative path as well.
301 os.chdir(dirname(ABSTFN))
302 self.assertEqual(realpath(basename(ABSTFN)), ABSTFN)
303 finally:
304 os.chdir(old_path)
305 support.unlink(ABSTFN)
306 support.unlink(ABSTFN+"1")
307 support.unlink(ABSTFN+"2")
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000308
Brian Curtind40e6f72010-07-08 21:39:08 +0000309 @support.skip_unless_symlink
310 @skip_if_ABSTFN_contains_backslash
311 def test_realpath_resolve_parents(self):
312 # We also need to resolve any symlinks in the parents of a relative
313 # path passed to realpath. E.g.: current working directory is
314 # /usr/doc with 'doc' being a symlink to /usr/share/doc. We call
315 # realpath("a"). This should return /usr/share/doc/a/.
316 try:
317 old_path = abspath('.')
318 os.mkdir(ABSTFN)
319 os.mkdir(ABSTFN + "/y")
320 os.symlink(ABSTFN + "/y", ABSTFN + "/k")
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000321
Brian Curtind40e6f72010-07-08 21:39:08 +0000322 os.chdir(ABSTFN + "/k")
323 self.assertEqual(realpath("a"), ABSTFN + "/y/a")
324 finally:
325 os.chdir(old_path)
326 support.unlink(ABSTFN + "/k")
327 safe_rmdir(ABSTFN + "/y")
328 safe_rmdir(ABSTFN)
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000329
Brian Curtind40e6f72010-07-08 21:39:08 +0000330 @support.skip_unless_symlink
331 @skip_if_ABSTFN_contains_backslash
332 def test_realpath_resolve_before_normalizing(self):
333 # Bug #990669: Symbolic links should be resolved before we
334 # normalize the path. E.g.: if we have directories 'a', 'k' and 'y'
335 # in the following hierarchy:
336 # a/k/y
337 #
338 # and a symbolic link 'link-y' pointing to 'y' in directory 'a',
339 # then realpath("link-y/..") should return 'k', not 'a'.
340 try:
341 old_path = abspath('.')
342 os.mkdir(ABSTFN)
343 os.mkdir(ABSTFN + "/k")
344 os.mkdir(ABSTFN + "/k/y")
345 os.symlink(ABSTFN + "/k/y", ABSTFN + "/link-y")
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000346
Brian Curtind40e6f72010-07-08 21:39:08 +0000347 # Absolute path.
348 self.assertEqual(realpath(ABSTFN + "/link-y/.."), ABSTFN + "/k")
349 # Relative path.
350 os.chdir(dirname(ABSTFN))
351 self.assertEqual(realpath(basename(ABSTFN) + "/link-y/.."),
352 ABSTFN + "/k")
353 finally:
354 os.chdir(old_path)
355 support.unlink(ABSTFN + "/link-y")
356 safe_rmdir(ABSTFN + "/k/y")
357 safe_rmdir(ABSTFN + "/k")
358 safe_rmdir(ABSTFN)
Tim Peters5d36a552005-06-03 22:40:27 +0000359
Brian Curtind40e6f72010-07-08 21:39:08 +0000360 @support.skip_unless_symlink
361 @skip_if_ABSTFN_contains_backslash
362 def test_realpath_resolve_first(self):
363 # Bug #1213894: The first component of the path, if not absolute,
364 # must be resolved too.
Georg Brandl268e61c2005-06-03 14:28:50 +0000365
Brian Curtind40e6f72010-07-08 21:39:08 +0000366 try:
367 old_path = abspath('.')
368 os.mkdir(ABSTFN)
369 os.mkdir(ABSTFN + "/k")
370 os.symlink(ABSTFN, ABSTFN + "link")
371 os.chdir(dirname(ABSTFN))
Tim Peters5d36a552005-06-03 22:40:27 +0000372
Brian Curtind40e6f72010-07-08 21:39:08 +0000373 base = basename(ABSTFN)
374 self.assertEqual(realpath(base + "link"), ABSTFN)
375 self.assertEqual(realpath(base + "link/k"), ABSTFN + "/k")
376 finally:
377 os.chdir(old_path)
378 support.unlink(ABSTFN + "link")
379 safe_rmdir(ABSTFN + "/k")
380 safe_rmdir(ABSTFN)
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000381
Guido van Rossumd8faa362007-04-27 19:54:29 +0000382 def test_relpath(self):
383 (real_getcwd, os.getcwd) = (os.getcwd, lambda: r"/home/user/bar")
384 try:
385 curdir = os.path.split(os.getcwd())[-1]
386 self.assertRaises(ValueError, posixpath.relpath, "")
387 self.assertEqual(posixpath.relpath("a"), "a")
388 self.assertEqual(posixpath.relpath(posixpath.abspath("a")), "a")
389 self.assertEqual(posixpath.relpath("a/b"), "a/b")
390 self.assertEqual(posixpath.relpath("../a/b"), "../a/b")
391 self.assertEqual(posixpath.relpath("a", "../b"), "../"+curdir+"/a")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000392 self.assertEqual(posixpath.relpath("a/b", "../c"),
393 "../"+curdir+"/a/b")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000394 self.assertEqual(posixpath.relpath("a", "b/c"), "../../a")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000395 self.assertEqual(posixpath.relpath("a", "a"), ".")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000396 finally:
397 os.getcwd = real_getcwd
Brett Cannonb47243a2003-06-16 21:54:50 +0000398
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000399 def test_relpath_bytes(self):
400 (real_getcwdb, os.getcwdb) = (os.getcwdb, lambda: br"/home/user/bar")
401 try:
402 curdir = os.path.split(os.getcwdb())[-1]
403 self.assertRaises(ValueError, posixpath.relpath, b"")
404 self.assertEqual(posixpath.relpath(b"a"), b"a")
405 self.assertEqual(posixpath.relpath(posixpath.abspath(b"a")), b"a")
406 self.assertEqual(posixpath.relpath(b"a/b"), b"a/b")
407 self.assertEqual(posixpath.relpath(b"../a/b"), b"../a/b")
408 self.assertEqual(posixpath.relpath(b"a", b"../b"),
409 b"../"+curdir+b"/a")
410 self.assertEqual(posixpath.relpath(b"a/b", b"../c"),
411 b"../"+curdir+b"/a/b")
412 self.assertEqual(posixpath.relpath(b"a", b"b/c"), b"../../a")
413 self.assertEqual(posixpath.relpath(b"a", b"a"), b".")
414
415 self.assertRaises(TypeError, posixpath.relpath, b"bytes", "str")
416 self.assertRaises(TypeError, posixpath.relpath, "str", b"bytes")
417 finally:
418 os.getcwdb = real_getcwdb
419
Florent Xiclunac9c79782010-03-08 12:24:53 +0000420
421class PosixCommonTest(test_genericpath.CommonTest):
422 pathmodule = posixpath
423 attributes = ['relpath', 'samefile', 'sameopenfile', 'samestat']
424
425
Brett Cannonb47243a2003-06-16 21:54:50 +0000426def test_main():
Florent Xiclunac9c79782010-03-08 12:24:53 +0000427 support.run_unittest(PosixPathTest, PosixCommonTest)
428
Brett Cannonb47243a2003-06-16 21:54:50 +0000429
430if __name__=="__main__":
431 test_main()