blob: 0efe3ff6569bd794cde07a67b68cc5ea985809de [file] [log] [blame]
Brett Cannonb47243a2003-06-16 21:54:50 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
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 assertIs(self, a, b):
Georg Brandlab91fde2009-08-13 08:51:18 +000029 self.assertTrue(a is b)
Skip Montanaroe809b002000-07-12 00:20:08 +000030
Brett Cannonb47243a2003-06-16 21:54:50 +000031 def test_normcase(self):
32 # Check that normcase() is idempotent
33 p = "FoO/./BaR"
Guido van Rossumf0af3e32008-10-02 18:55:37 +000034 self.assertEqual(p, posixpath.normcase(p))
35
36 p = b"FoO/./BaR"
Brett Cannonb47243a2003-06-16 21:54:50 +000037 self.assertEqual(p, posixpath.normcase(p))
Skip Montanaroe809b002000-07-12 00:20:08 +000038
Brett Cannonb47243a2003-06-16 21:54:50 +000039 self.assertRaises(TypeError, posixpath.normcase)
Skip Montanaroe809b002000-07-12 00:20:08 +000040
Brett Cannonb47243a2003-06-16 21:54:50 +000041 def test_join(self):
Guido van Rossumf0af3e32008-10-02 18:55:37 +000042 self.assertEqual(posixpath.join("/foo", "bar", "/bar", "baz"),
43 "/bar/baz")
Brett Cannonb47243a2003-06-16 21:54:50 +000044 self.assertEqual(posixpath.join("/foo", "bar", "baz"), "/foo/bar/baz")
Guido van Rossumf0af3e32008-10-02 18:55:37 +000045 self.assertEqual(posixpath.join("/foo/", "bar/", "baz/"),
46 "/foo/bar/baz/")
47
48 self.assertEqual(posixpath.join(b"/foo", b"bar", b"/bar", b"baz"),
49 b"/bar/baz")
50 self.assertEqual(posixpath.join(b"/foo", b"bar", b"baz"),
51 b"/foo/bar/baz")
52 self.assertEqual(posixpath.join(b"/foo/", b"bar/", b"baz/"),
53 b"/foo/bar/baz/")
Skip Montanaroe809b002000-07-12 00:20:08 +000054
Brett Cannonb47243a2003-06-16 21:54:50 +000055 self.assertRaises(TypeError, posixpath.join)
Guido van Rossumf0af3e32008-10-02 18:55:37 +000056 self.assertRaises(TypeError, posixpath.join, b"bytes", "str")
57 self.assertRaises(TypeError, posixpath.join, "str", b"bytes")
Skip Montanaroe809b002000-07-12 00:20:08 +000058
Brett Cannonb47243a2003-06-16 21:54:50 +000059 def test_splitdrive(self):
60 self.assertEqual(posixpath.splitdrive("/foo/bar"), ("", "/foo/bar"))
Guido van Rossumf0af3e32008-10-02 18:55:37 +000061 self.assertEqual(posixpath.splitdrive(b"/foo/bar"), (b"", b"/foo/bar"))
Brett Cannonb47243a2003-06-16 21:54:50 +000062
63 self.assertRaises(TypeError, posixpath.splitdrive)
64
65 def test_split(self):
66 self.assertEqual(posixpath.split("/foo/bar"), ("/foo", "bar"))
67 self.assertEqual(posixpath.split("/"), ("/", ""))
68 self.assertEqual(posixpath.split("foo"), ("", "foo"))
69 self.assertEqual(posixpath.split("////foo"), ("////", "foo"))
70 self.assertEqual(posixpath.split("//foo//bar"), ("//foo", "bar"))
71
Guido van Rossumf0af3e32008-10-02 18:55:37 +000072 self.assertEqual(posixpath.split(b"/foo/bar"), (b"/foo", b"bar"))
73 self.assertEqual(posixpath.split(b"/"), (b"/", b""))
74 self.assertEqual(posixpath.split(b"foo"), (b"", b"foo"))
75 self.assertEqual(posixpath.split(b"////foo"), (b"////", b"foo"))
76 self.assertEqual(posixpath.split(b"//foo//bar"), (b"//foo", b"bar"))
77
Brett Cannonb47243a2003-06-16 21:54:50 +000078 self.assertRaises(TypeError, posixpath.split)
79
Guido van Rossumd8faa362007-04-27 19:54:29 +000080 def splitextTest(self, path, filename, ext):
81 self.assertEqual(posixpath.splitext(path), (filename, ext))
82 self.assertEqual(posixpath.splitext("/" + path), ("/" + filename, ext))
Guido van Rossumf0af3e32008-10-02 18:55:37 +000083 self.assertEqual(posixpath.splitext("abc/" + path),
84 ("abc/" + filename, ext))
85 self.assertEqual(posixpath.splitext("abc.def/" + path),
86 ("abc.def/" + filename, ext))
87 self.assertEqual(posixpath.splitext("/abc.def/" + path),
88 ("/abc.def/" + filename, ext))
89 self.assertEqual(posixpath.splitext(path + "/"),
90 (filename + ext + "/", ""))
91
92 path = bytes(path, "ASCII")
93 filename = bytes(filename, "ASCII")
94 ext = bytes(ext, "ASCII")
95
96 self.assertEqual(posixpath.splitext(path), (filename, ext))
97 self.assertEqual(posixpath.splitext(b"/" + path),
98 (b"/" + filename, ext))
99 self.assertEqual(posixpath.splitext(b"abc/" + path),
100 (b"abc/" + filename, ext))
101 self.assertEqual(posixpath.splitext(b"abc.def/" + path),
102 (b"abc.def/" + filename, ext))
103 self.assertEqual(posixpath.splitext(b"/abc.def/" + path),
104 (b"/abc.def/" + filename, ext))
105 self.assertEqual(posixpath.splitext(path + b"/"),
106 (filename + ext + b"/", b""))
Brett Cannonb47243a2003-06-16 21:54:50 +0000107
Guido van Rossumd8faa362007-04-27 19:54:29 +0000108 def test_splitext(self):
109 self.splitextTest("foo.bar", "foo", ".bar")
110 self.splitextTest("foo.boo.bar", "foo.boo", ".bar")
111 self.splitextTest("foo.boo.biff.bar", "foo.boo.biff", ".bar")
112 self.splitextTest(".csh.rc", ".csh", ".rc")
113 self.splitextTest("nodots", "nodots", "")
114 self.splitextTest(".cshrc", ".cshrc", "")
115 self.splitextTest("...manydots", "...manydots", "")
116 self.splitextTest("...manydots.ext", "...manydots", ".ext")
117 self.splitextTest(".", ".", "")
118 self.splitextTest("..", "..", "")
119 self.splitextTest("........", "........", "")
120 self.splitextTest("", "", "")
Brett Cannonb47243a2003-06-16 21:54:50 +0000121 self.assertRaises(TypeError, posixpath.splitext)
122
123 def test_isabs(self):
124 self.assertIs(posixpath.isabs(""), False)
125 self.assertIs(posixpath.isabs("/"), True)
126 self.assertIs(posixpath.isabs("/foo"), True)
127 self.assertIs(posixpath.isabs("/foo/bar"), True)
128 self.assertIs(posixpath.isabs("foo/bar"), False)
129
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000130 self.assertIs(posixpath.isabs(b""), False)
131 self.assertIs(posixpath.isabs(b"/"), True)
132 self.assertIs(posixpath.isabs(b"/foo"), True)
133 self.assertIs(posixpath.isabs(b"/foo/bar"), True)
134 self.assertIs(posixpath.isabs(b"foo/bar"), False)
135
Brett Cannonb47243a2003-06-16 21:54:50 +0000136 self.assertRaises(TypeError, posixpath.isabs)
137
Brett Cannonb47243a2003-06-16 21:54:50 +0000138 def test_basename(self):
139 self.assertEqual(posixpath.basename("/foo/bar"), "bar")
140 self.assertEqual(posixpath.basename("/"), "")
141 self.assertEqual(posixpath.basename("foo"), "foo")
142 self.assertEqual(posixpath.basename("////foo"), "foo")
143 self.assertEqual(posixpath.basename("//foo//bar"), "bar")
144
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000145 self.assertEqual(posixpath.basename(b"/foo/bar"), b"bar")
146 self.assertEqual(posixpath.basename(b"/"), b"")
147 self.assertEqual(posixpath.basename(b"foo"), b"foo")
148 self.assertEqual(posixpath.basename(b"////foo"), b"foo")
149 self.assertEqual(posixpath.basename(b"//foo//bar"), b"bar")
150
Brett Cannonb47243a2003-06-16 21:54:50 +0000151 self.assertRaises(TypeError, posixpath.basename)
152
153 def test_dirname(self):
154 self.assertEqual(posixpath.dirname("/foo/bar"), "/foo")
155 self.assertEqual(posixpath.dirname("/"), "/")
156 self.assertEqual(posixpath.dirname("foo"), "")
157 self.assertEqual(posixpath.dirname("////foo"), "////")
158 self.assertEqual(posixpath.dirname("//foo//bar"), "//foo")
159
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000160 self.assertEqual(posixpath.dirname(b"/foo/bar"), b"/foo")
161 self.assertEqual(posixpath.dirname(b"/"), b"/")
162 self.assertEqual(posixpath.dirname(b"foo"), b"")
163 self.assertEqual(posixpath.dirname(b"////foo"), b"////")
164 self.assertEqual(posixpath.dirname(b"//foo//bar"), b"//foo")
165
Brett Cannonb47243a2003-06-16 21:54:50 +0000166 self.assertRaises(TypeError, posixpath.dirname)
167
168 def test_commonprefix(self):
169 self.assertEqual(
170 posixpath.commonprefix([]),
171 ""
172 )
173 self.assertEqual(
174 posixpath.commonprefix(["/home/swenson/spam", "/home/swen/spam"]),
175 "/home/swen"
176 )
177 self.assertEqual(
178 posixpath.commonprefix(["/home/swen/spam", "/home/swen/eggs"]),
179 "/home/swen/"
180 )
181 self.assertEqual(
182 posixpath.commonprefix(["/home/swen/spam", "/home/swen/spam"]),
183 "/home/swen/spam"
184 )
185
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000186 self.assertEqual(
187 posixpath.commonprefix([b"/home/swenson/spam", b"/home/swen/spam"]),
188 b"/home/swen"
189 )
190 self.assertEqual(
191 posixpath.commonprefix([b"/home/swen/spam", b"/home/swen/eggs"]),
192 b"/home/swen/"
193 )
194 self.assertEqual(
195 posixpath.commonprefix([b"/home/swen/spam", b"/home/swen/spam"]),
196 b"/home/swen/spam"
197 )
198
Guido van Rossum360e4b82007-05-14 22:51:27 +0000199 testlist = ['', 'abc', 'Xbcd', 'Xb', 'XY', 'abcd', 'aXc', 'abd', 'ab', 'aX', 'abcX']
200 for s1 in testlist:
201 for s2 in testlist:
202 p = posixpath.commonprefix([s1, s2])
Georg Brandlab91fde2009-08-13 08:51:18 +0000203 self.assertTrue(s1.startswith(p))
204 self.assertTrue(s2.startswith(p))
Guido van Rossum360e4b82007-05-14 22:51:27 +0000205 if s1 != s2:
206 n = len(p)
207 self.assertNotEqual(s1[n:n+1], s2[n:n+1])
208
Brett Cannonb47243a2003-06-16 21:54:50 +0000209 def test_getsize(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000210 f = open(support.TESTFN, "wb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000211 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000212 f.write(b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000213 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000214 self.assertEqual(posixpath.getsize(support.TESTFN), 3)
Brett Cannonb47243a2003-06-16 21:54:50 +0000215 finally:
216 if not f.closed:
217 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000218
219 def test_time(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000220 f = open(support.TESTFN, "wb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000221 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000222 f.write(b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000223 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000224 f = open(support.TESTFN, "ab")
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000225 f.write(b"bar")
Brett Cannonb47243a2003-06-16 21:54:50 +0000226 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000227 f = open(support.TESTFN, "rb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000228 d = f.read()
229 f.close()
Guido van Rossum98f13752007-07-10 12:07:30 +0000230 self.assertEqual(d, b"foobar")
Brett Cannonb47243a2003-06-16 21:54:50 +0000231
Georg Brandlab91fde2009-08-13 08:51:18 +0000232 self.assertTrue(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000233 posixpath.getctime(support.TESTFN) <=
234 posixpath.getmtime(support.TESTFN)
Brett Cannonb47243a2003-06-16 21:54:50 +0000235 )
236 finally:
237 if not f.closed:
238 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000239
240 def test_islink(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000241 self.assertIs(posixpath.islink(support.TESTFN + "1"), False)
242 f = open(support.TESTFN + "1", "wb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000243 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000244 f.write(b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000245 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000246 self.assertIs(posixpath.islink(support.TESTFN + "1"), False)
Brett Cannonb47243a2003-06-16 21:54:50 +0000247 if hasattr(os, "symlink"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000248 os.symlink(support.TESTFN + "1", support.TESTFN + "2")
249 self.assertIs(posixpath.islink(support.TESTFN + "2"), True)
250 os.remove(support.TESTFN + "1")
251 self.assertIs(posixpath.islink(support.TESTFN + "2"), True)
252 self.assertIs(posixpath.exists(support.TESTFN + "2"), False)
253 self.assertIs(posixpath.lexists(support.TESTFN + "2"), True)
Brett Cannonb47243a2003-06-16 21:54:50 +0000254 finally:
255 if not f.close():
256 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000257
258 self.assertRaises(TypeError, posixpath.islink)
259
260 def test_exists(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000261 self.assertIs(posixpath.exists(support.TESTFN), False)
262 f = open(support.TESTFN, "wb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000263 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000264 f.write(b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000265 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000266 self.assertIs(posixpath.exists(support.TESTFN), True)
267 self.assertIs(posixpath.lexists(support.TESTFN), True)
Brett Cannonb47243a2003-06-16 21:54:50 +0000268 finally:
269 if not f.close():
270 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000271
272 self.assertRaises(TypeError, posixpath.exists)
273
274 def test_isdir(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000275 self.assertIs(posixpath.isdir(support.TESTFN), False)
276 f = open(support.TESTFN, "wb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000277 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000278 f.write(b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000279 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000280 self.assertIs(posixpath.isdir(support.TESTFN), False)
281 os.remove(support.TESTFN)
282 os.mkdir(support.TESTFN)
283 self.assertIs(posixpath.isdir(support.TESTFN), True)
284 os.rmdir(support.TESTFN)
Brett Cannonb47243a2003-06-16 21:54:50 +0000285 finally:
286 if not f.close():
287 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000288
289 self.assertRaises(TypeError, posixpath.isdir)
290
291 def test_isfile(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000292 self.assertIs(posixpath.isfile(support.TESTFN), False)
293 f = open(support.TESTFN, "wb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000294 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000295 f.write(b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000296 f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000297 self.assertIs(posixpath.isfile(support.TESTFN), True)
298 os.remove(support.TESTFN)
299 os.mkdir(support.TESTFN)
300 self.assertIs(posixpath.isfile(support.TESTFN), False)
301 os.rmdir(support.TESTFN)
Brett Cannonb47243a2003-06-16 21:54:50 +0000302 finally:
303 if not f.close():
304 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000305
306 self.assertRaises(TypeError, posixpath.isdir)
307
Guido van Rossumd8faa362007-04-27 19:54:29 +0000308 def test_samefile(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000309 f = open(support.TESTFN + "1", "wb")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000310 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000311 f.write(b"foo")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000312 f.close()
313 self.assertIs(
314 posixpath.samefile(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000315 support.TESTFN + "1",
316 support.TESTFN + "1"
Guido van Rossumd8faa362007-04-27 19:54:29 +0000317 ),
318 True
319 )
320 # If we don't have links, assume that os.stat doesn't return resonable
321 # inode information and thus, that samefile() doesn't work
322 if hasattr(os, "symlink"):
323 os.symlink(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000324 support.TESTFN + "1",
325 support.TESTFN + "2"
Guido van Rossumd8faa362007-04-27 19:54:29 +0000326 )
327 self.assertIs(
328 posixpath.samefile(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000329 support.TESTFN + "1",
330 support.TESTFN + "2"
Guido van Rossumd8faa362007-04-27 19:54:29 +0000331 ),
332 True
333 )
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000334 os.remove(support.TESTFN + "2")
335 f = open(support.TESTFN + "2", "wb")
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000336 f.write(b"bar")
Brett Cannonb47243a2003-06-16 21:54:50 +0000337 f.close()
338 self.assertIs(
339 posixpath.samefile(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000340 support.TESTFN + "1",
341 support.TESTFN + "2"
Guido van Rossumd8faa362007-04-27 19:54:29 +0000342 ),
343 False
344 )
345 finally:
346 if not f.close():
347 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000348
Guido van Rossumd8faa362007-04-27 19:54:29 +0000349 self.assertRaises(TypeError, posixpath.samefile)
Brett Cannonb47243a2003-06-16 21:54:50 +0000350
351 def test_samestat(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000352 f = open(support.TESTFN + "1", "wb")
Brett Cannonb47243a2003-06-16 21:54:50 +0000353 try:
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000354 f.write(b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000355 f.close()
356 self.assertIs(
357 posixpath.samestat(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000358 os.stat(support.TESTFN + "1"),
359 os.stat(support.TESTFN + "1")
Brett Cannonb47243a2003-06-16 21:54:50 +0000360 ),
361 True
362 )
Tim Peters478c1052003-06-29 05:46:54 +0000363 # If we don't have links, assume that os.stat() doesn't return resonable
Brett Cannonb47243a2003-06-16 21:54:50 +0000364 # inode information and thus, that samefile() doesn't work
365 if hasattr(os, "symlink"):
366 if hasattr(os, "symlink"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000367 os.symlink(support.TESTFN + "1", support.TESTFN + "2")
Brett Cannonb47243a2003-06-16 21:54:50 +0000368 self.assertIs(
369 posixpath.samestat(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000370 os.stat(support.TESTFN + "1"),
371 os.stat(support.TESTFN + "2")
Brett Cannonb47243a2003-06-16 21:54:50 +0000372 ),
373 True
374 )
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000375 os.remove(support.TESTFN + "2")
376 f = open(support.TESTFN + "2", "wb")
Guido van Rossum7dcb8442007-08-27 23:26:56 +0000377 f.write(b"bar")
Brett Cannonb47243a2003-06-16 21:54:50 +0000378 f.close()
379 self.assertIs(
380 posixpath.samestat(
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000381 os.stat(support.TESTFN + "1"),
382 os.stat(support.TESTFN + "2")
Brett Cannonb47243a2003-06-16 21:54:50 +0000383 ),
384 False
385 )
386 finally:
387 if not f.close():
388 f.close()
Brett Cannonb47243a2003-06-16 21:54:50 +0000389
390 self.assertRaises(TypeError, posixpath.samestat)
391
392 def test_ismount(self):
393 self.assertIs(posixpath.ismount("/"), True)
394
395 self.assertRaises(TypeError, posixpath.ismount)
396
397 def test_expanduser(self):
398 self.assertEqual(posixpath.expanduser("foo"), "foo")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000399 self.assertEqual(posixpath.expanduser(b"foo"), b"foo")
Brett Cannonb47243a2003-06-16 21:54:50 +0000400 try:
401 import pwd
402 except ImportError:
403 pass
404 else:
Georg Brandlab91fde2009-08-13 08:51:18 +0000405 self.assertTrue(isinstance(posixpath.expanduser("~/"), str))
406 self.assertTrue(isinstance(posixpath.expanduser(b"~/"), bytes))
Neal Norwitz168e73d2003-07-01 03:33:31 +0000407 # if home directory == root directory, this test makes no sense
408 if posixpath.expanduser("~") != '/':
409 self.assertEqual(
410 posixpath.expanduser("~") + "/",
411 posixpath.expanduser("~/")
412 )
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000413 self.assertEqual(
414 posixpath.expanduser(b"~") + b"/",
415 posixpath.expanduser(b"~/")
416 )
Georg Brandlab91fde2009-08-13 08:51:18 +0000417 self.assertTrue(isinstance(posixpath.expanduser("~root/"), str))
418 self.assertTrue(isinstance(posixpath.expanduser("~foo/"), str))
419 self.assertTrue(isinstance(posixpath.expanduser(b"~root/"), bytes))
420 self.assertTrue(isinstance(posixpath.expanduser(b"~foo/"), bytes))
Brett Cannonb47243a2003-06-16 21:54:50 +0000421
Hirokazu Yamamoto71959632009-04-27 01:44:28 +0000422 with support.EnvironmentVarGuard() as env:
Walter Dörwald155374d2009-05-01 19:58:58 +0000423 env['HOME'] = '/'
Walter Dörwaldb525e182009-04-26 21:39:21 +0000424 self.assertEqual(posixpath.expanduser("~"), "/")
Benjamin Petersonef3e4c22009-04-11 19:48:14 +0000425
Brett Cannonb47243a2003-06-16 21:54:50 +0000426 self.assertRaises(TypeError, posixpath.expanduser)
427
428 def test_expandvars(self):
Walter Dörwald155374d2009-05-01 19:58:58 +0000429 with support.EnvironmentVarGuard() as env:
430 env.clear()
431 env["foo"] = "bar"
432 env["{foo"] = "baz1"
433 env["{foo}"] = "baz2"
Brett Cannonb47243a2003-06-16 21:54:50 +0000434 self.assertEqual(posixpath.expandvars("foo"), "foo")
435 self.assertEqual(posixpath.expandvars("$foo bar"), "bar bar")
436 self.assertEqual(posixpath.expandvars("${foo}bar"), "barbar")
437 self.assertEqual(posixpath.expandvars("$[foo]bar"), "$[foo]bar")
438 self.assertEqual(posixpath.expandvars("$bar bar"), "$bar bar")
439 self.assertEqual(posixpath.expandvars("$?bar"), "$?bar")
440 self.assertEqual(posixpath.expandvars("${foo}bar"), "barbar")
441 self.assertEqual(posixpath.expandvars("$foo}bar"), "bar}bar")
442 self.assertEqual(posixpath.expandvars("${foo"), "${foo")
443 self.assertEqual(posixpath.expandvars("${{foo}}"), "baz1}")
Thomas Woutersb2137042007-02-01 18:02:27 +0000444 self.assertEqual(posixpath.expandvars("$foo$foo"), "barbar")
445 self.assertEqual(posixpath.expandvars("$bar$bar"), "$bar$bar")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000446
447 self.assertEqual(posixpath.expandvars(b"foo"), b"foo")
448 self.assertEqual(posixpath.expandvars(b"$foo bar"), b"bar bar")
449 self.assertEqual(posixpath.expandvars(b"${foo}bar"), b"barbar")
450 self.assertEqual(posixpath.expandvars(b"$[foo]bar"), b"$[foo]bar")
451 self.assertEqual(posixpath.expandvars(b"$bar bar"), b"$bar bar")
452 self.assertEqual(posixpath.expandvars(b"$?bar"), b"$?bar")
453 self.assertEqual(posixpath.expandvars(b"${foo}bar"), b"barbar")
454 self.assertEqual(posixpath.expandvars(b"$foo}bar"), b"bar}bar")
455 self.assertEqual(posixpath.expandvars(b"${foo"), b"${foo")
456 self.assertEqual(posixpath.expandvars(b"${{foo}}"), b"baz1}")
457 self.assertEqual(posixpath.expandvars(b"$foo$foo"), b"barbar")
458 self.assertEqual(posixpath.expandvars(b"$bar$bar"), b"$bar$bar")
Walter Dörwald155374d2009-05-01 19:58:58 +0000459 self.assertRaises(TypeError, posixpath.expandvars)
Brett Cannonb47243a2003-06-16 21:54:50 +0000460
461 def test_normpath(self):
462 self.assertEqual(posixpath.normpath(""), ".")
463 self.assertEqual(posixpath.normpath("/"), "/")
464 self.assertEqual(posixpath.normpath("//"), "//")
465 self.assertEqual(posixpath.normpath("///"), "/")
466 self.assertEqual(posixpath.normpath("///foo/.//bar//"), "/foo/bar")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000467 self.assertEqual(posixpath.normpath("///foo/.//bar//.//..//.//baz"),
468 "/foo/baz")
Brett Cannonb47243a2003-06-16 21:54:50 +0000469 self.assertEqual(posixpath.normpath("///..//./foo/.//bar"), "/foo/bar")
470
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000471 self.assertEqual(posixpath.normpath(b""), b".")
472 self.assertEqual(posixpath.normpath(b"/"), b"/")
473 self.assertEqual(posixpath.normpath(b"//"), b"//")
474 self.assertEqual(posixpath.normpath(b"///"), b"/")
475 self.assertEqual(posixpath.normpath(b"///foo/.//bar//"), b"/foo/bar")
476 self.assertEqual(posixpath.normpath(b"///foo/.//bar//.//..//.//baz"),
477 b"/foo/baz")
478 self.assertEqual(posixpath.normpath(b"///..//./foo/.//bar"),
479 b"/foo/bar")
480
Brett Cannonb47243a2003-06-16 21:54:50 +0000481 self.assertRaises(TypeError, posixpath.normpath)
482
483 def test_abspath(self):
Georg Brandlab91fde2009-08-13 08:51:18 +0000484 self.assertTrue("foo" in posixpath.abspath("foo"))
485 self.assertTrue(b"foo" in posixpath.abspath(b"foo"))
Brett Cannonb47243a2003-06-16 21:54:50 +0000486
487 self.assertRaises(TypeError, posixpath.abspath)
488
489 def test_realpath(self):
Georg Brandlab91fde2009-08-13 08:51:18 +0000490 self.assertTrue("foo" in realpath("foo"))
491 self.assertTrue(b"foo" in realpath(b"foo"))
Brett Cannonb47243a2003-06-16 21:54:50 +0000492 self.assertRaises(TypeError, posixpath.realpath)
Tim Petersa45cacf2004-08-20 03:47:14 +0000493
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000494 if hasattr(os, "symlink"):
495 def test_realpath_basic(self):
496 # Basic operation.
497 try:
498 os.symlink(ABSTFN+"1", ABSTFN)
499 self.assertEqual(realpath(ABSTFN), ABSTFN+"1")
500 finally:
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000501 support.unlink(ABSTFN)
Tim Petersa45cacf2004-08-20 03:47:14 +0000502
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000503 def test_realpath_symlink_loops(self):
504 # Bug #930024, return the path unchanged if we get into an infinite
505 # symlink loop.
506 try:
507 old_path = abspath('.')
508 os.symlink(ABSTFN, ABSTFN)
509 self.assertEqual(realpath(ABSTFN), ABSTFN)
510
511 os.symlink(ABSTFN+"1", ABSTFN+"2")
512 os.symlink(ABSTFN+"2", ABSTFN+"1")
513 self.assertEqual(realpath(ABSTFN+"1"), ABSTFN+"1")
514 self.assertEqual(realpath(ABSTFN+"2"), ABSTFN+"2")
515
516 # Test using relative path as well.
517 os.chdir(dirname(ABSTFN))
518 self.assertEqual(realpath(basename(ABSTFN)), ABSTFN)
519 finally:
520 os.chdir(old_path)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000521 support.unlink(ABSTFN)
522 support.unlink(ABSTFN+"1")
523 support.unlink(ABSTFN+"2")
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000524
Tim Petersa45cacf2004-08-20 03:47:14 +0000525 def test_realpath_resolve_parents(self):
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000526 # We also need to resolve any symlinks in the parents of a relative
527 # path passed to realpath. E.g.: current working directory is
528 # /usr/doc with 'doc' being a symlink to /usr/share/doc. We call
529 # realpath("a"). This should return /usr/share/doc/a/.
530 try:
531 old_path = abspath('.')
532 os.mkdir(ABSTFN)
533 os.mkdir(ABSTFN + "/y")
534 os.symlink(ABSTFN + "/y", ABSTFN + "/k")
535
536 os.chdir(ABSTFN + "/k")
537 self.assertEqual(realpath("a"), ABSTFN + "/y/a")
538 finally:
539 os.chdir(old_path)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000540 support.unlink(ABSTFN + "/k")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000541 safe_rmdir(ABSTFN + "/y")
542 safe_rmdir(ABSTFN)
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000543
544 def test_realpath_resolve_before_normalizing(self):
545 # Bug #990669: Symbolic links should be resolved before we
546 # normalize the path. E.g.: if we have directories 'a', 'k' and 'y'
547 # in the following hierarchy:
548 # a/k/y
549 #
550 # and a symbolic link 'link-y' pointing to 'y' in directory 'a',
551 # then realpath("link-y/..") should return 'k', not 'a'.
552 try:
553 old_path = abspath('.')
554 os.mkdir(ABSTFN)
555 os.mkdir(ABSTFN + "/k")
556 os.mkdir(ABSTFN + "/k/y")
557 os.symlink(ABSTFN + "/k/y", ABSTFN + "/link-y")
558
559 # Absolute path.
560 self.assertEqual(realpath(ABSTFN + "/link-y/.."), ABSTFN + "/k")
561 # Relative path.
562 os.chdir(dirname(ABSTFN))
563 self.assertEqual(realpath(basename(ABSTFN) + "/link-y/.."), ABSTFN + "/k")
564 finally:
565 os.chdir(old_path)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000566 support.unlink(ABSTFN + "/link-y")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000567 safe_rmdir(ABSTFN + "/k/y")
568 safe_rmdir(ABSTFN + "/k")
569 safe_rmdir(ABSTFN)
Tim Peters5d36a552005-06-03 22:40:27 +0000570
Georg Brandl268e61c2005-06-03 14:28:50 +0000571 def test_realpath_resolve_first(self):
572 # Bug #1213894: The first component of the path, if not absolute,
573 # must be resolved too.
574
575 try:
576 old_path = abspath('.')
577 os.mkdir(ABSTFN)
578 os.mkdir(ABSTFN + "/k")
579 os.symlink(ABSTFN, ABSTFN + "link")
580 os.chdir(dirname(ABSTFN))
Tim Peters5d36a552005-06-03 22:40:27 +0000581
Georg Brandl268e61c2005-06-03 14:28:50 +0000582 base = basename(ABSTFN)
583 self.assertEqual(realpath(base + "link"), ABSTFN)
584 self.assertEqual(realpath(base + "link/k"), ABSTFN + "/k")
585 finally:
586 os.chdir(old_path)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000587 support.unlink(ABSTFN + "link")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000588 safe_rmdir(ABSTFN + "/k")
589 safe_rmdir(ABSTFN)
Johannes Gijsbers4ec40642004-08-14 15:01:53 +0000590
Guido van Rossumd8faa362007-04-27 19:54:29 +0000591 def test_relpath(self):
592 (real_getcwd, os.getcwd) = (os.getcwd, lambda: r"/home/user/bar")
593 try:
594 curdir = os.path.split(os.getcwd())[-1]
595 self.assertRaises(ValueError, posixpath.relpath, "")
596 self.assertEqual(posixpath.relpath("a"), "a")
597 self.assertEqual(posixpath.relpath(posixpath.abspath("a")), "a")
598 self.assertEqual(posixpath.relpath("a/b"), "a/b")
599 self.assertEqual(posixpath.relpath("../a/b"), "../a/b")
600 self.assertEqual(posixpath.relpath("a", "../b"), "../"+curdir+"/a")
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000601 self.assertEqual(posixpath.relpath("a/b", "../c"),
602 "../"+curdir+"/a/b")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000603 self.assertEqual(posixpath.relpath("a", "b/c"), "../../a")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000604 self.assertEqual(posixpath.relpath("a", "a"), ".")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000605 finally:
606 os.getcwd = real_getcwd
Brett Cannonb47243a2003-06-16 21:54:50 +0000607
Guido van Rossumf0af3e32008-10-02 18:55:37 +0000608 def test_relpath_bytes(self):
609 (real_getcwdb, os.getcwdb) = (os.getcwdb, lambda: br"/home/user/bar")
610 try:
611 curdir = os.path.split(os.getcwdb())[-1]
612 self.assertRaises(ValueError, posixpath.relpath, b"")
613 self.assertEqual(posixpath.relpath(b"a"), b"a")
614 self.assertEqual(posixpath.relpath(posixpath.abspath(b"a")), b"a")
615 self.assertEqual(posixpath.relpath(b"a/b"), b"a/b")
616 self.assertEqual(posixpath.relpath(b"../a/b"), b"../a/b")
617 self.assertEqual(posixpath.relpath(b"a", b"../b"),
618 b"../"+curdir+b"/a")
619 self.assertEqual(posixpath.relpath(b"a/b", b"../c"),
620 b"../"+curdir+b"/a/b")
621 self.assertEqual(posixpath.relpath(b"a", b"b/c"), b"../../a")
622 self.assertEqual(posixpath.relpath(b"a", b"a"), b".")
623
624 self.assertRaises(TypeError, posixpath.relpath, b"bytes", "str")
625 self.assertRaises(TypeError, posixpath.relpath, "str", b"bytes")
626 finally:
627 os.getcwdb = real_getcwdb
628
Brett Cannonb47243a2003-06-16 21:54:50 +0000629def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000630 support.run_unittest(PosixPathTest)
Brett Cannonb47243a2003-06-16 21:54:50 +0000631
632if __name__=="__main__":
633 test_main()