blob: dba50e02d94d037b7d9b81eb15107fd011f2a55d [file] [log] [blame]
Neal Norwitze241ce82003-02-17 18:17:05 +00001"Test posix functions"
2
Benjamin Petersonee8712c2008-05-20 21:35:26 +00003from test import support
Antoine Pitrou346cbd32017-05-27 17:50:54 +02004from test.support.script_helper import assert_python_ok
Xavier de Gaye3a4e9892016-12-13 10:00:01 +01005android_not_root = support.android_not_root
R. David Murrayeb3615d2009-04-22 02:24:39 +00006
7# Skip these tests if there is no posix module.
8posix = support.import_module('posix')
Neal Norwitze241ce82003-02-17 18:17:05 +00009
Antoine Pitroub7572f02009-12-02 20:46:48 +000010import errno
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +000011import sys
Neal Norwitze241ce82003-02-17 18:17:05 +000012import time
13import os
Charles-François Nataliab2d58e2012-04-17 19:48:35 +020014import platform
Christian Heimesd5e2b6f2008-03-19 21:50:51 +000015import pwd
Benjamin Peterson052a02b2010-08-17 01:27:09 +000016import stat
Ned Deilyba2eab22011-07-26 13:53:55 -070017import tempfile
Neal Norwitze241ce82003-02-17 18:17:05 +000018import unittest
19import warnings
R. David Murraya21e4ca2009-03-31 23:16:50 +000020
Ned Deilyba2eab22011-07-26 13:53:55 -070021_DUMMY_SYMLINK = os.path.join(tempfile.gettempdir(),
22 support.TESTFN + '-dummy-symlink')
Neal Norwitze241ce82003-02-17 18:17:05 +000023
24class PosixTester(unittest.TestCase):
25
26 def setUp(self):
27 # create empty file
Benjamin Petersonee8712c2008-05-20 21:35:26 +000028 fp = open(support.TESTFN, 'w+')
Neal Norwitze241ce82003-02-17 18:17:05 +000029 fp.close()
Ned Deily3eb67d52011-06-28 00:00:28 -070030 self.teardown_files = [ support.TESTFN ]
Brett Cannonc8d502e2010-03-20 21:53:28 +000031 self._warnings_manager = support.check_warnings()
32 self._warnings_manager.__enter__()
33 warnings.filterwarnings('ignore', '.* potential security risk .*',
34 RuntimeWarning)
Neal Norwitze241ce82003-02-17 18:17:05 +000035
36 def tearDown(self):
Ned Deily3eb67d52011-06-28 00:00:28 -070037 for teardown_file in self.teardown_files:
38 support.unlink(teardown_file)
Brett Cannonc8d502e2010-03-20 21:53:28 +000039 self._warnings_manager.__exit__(None, None, None)
Neal Norwitze241ce82003-02-17 18:17:05 +000040
41 def testNoArgFunctions(self):
42 # test posix functions which take no arguments and have
43 # no side-effects which we need to cleanup (e.g., fork, wait, abort)
Guido van Rossumf0af3e32008-10-02 18:55:37 +000044 NO_ARG_FUNCTIONS = [ "ctermid", "getcwd", "getcwdb", "uname",
Guido van Rossum687b9c02007-10-25 23:18:51 +000045 "times", "getloadavg",
Neal Norwitze241ce82003-02-17 18:17:05 +000046 "getegid", "geteuid", "getgid", "getgroups",
Ross Lagerwall7807c352011-03-17 20:20:30 +020047 "getpid", "getpgrp", "getppid", "getuid", "sync",
Neal Norwitze241ce82003-02-17 18:17:05 +000048 ]
Neal Norwitz71b13e82003-02-23 22:12:24 +000049
Neal Norwitze241ce82003-02-17 18:17:05 +000050 for name in NO_ARG_FUNCTIONS:
51 posix_func = getattr(posix, name, None)
52 if posix_func is not None:
53 posix_func()
Neal Norwitz2ff51a82003-02-17 22:40:31 +000054 self.assertRaises(TypeError, posix_func, 1)
Neal Norwitze241ce82003-02-17 18:17:05 +000055
Serhiy Storchaka43767632013-11-03 21:31:38 +020056 @unittest.skipUnless(hasattr(posix, 'getresuid'),
57 'test needs posix.getresuid()')
58 def test_getresuid(self):
59 user_ids = posix.getresuid()
60 self.assertEqual(len(user_ids), 3)
61 for val in user_ids:
62 self.assertGreaterEqual(val, 0)
Martin v. Löwis7aed61a2009-11-27 14:09:49 +000063
Serhiy Storchaka43767632013-11-03 21:31:38 +020064 @unittest.skipUnless(hasattr(posix, 'getresgid'),
65 'test needs posix.getresgid()')
66 def test_getresgid(self):
67 group_ids = posix.getresgid()
68 self.assertEqual(len(group_ids), 3)
69 for val in group_ids:
70 self.assertGreaterEqual(val, 0)
Martin v. Löwis7aed61a2009-11-27 14:09:49 +000071
Serhiy Storchaka43767632013-11-03 21:31:38 +020072 @unittest.skipUnless(hasattr(posix, 'setresuid'),
73 'test needs posix.setresuid()')
74 def test_setresuid(self):
75 current_user_ids = posix.getresuid()
76 self.assertIsNone(posix.setresuid(*current_user_ids))
77 # -1 means don't change that value.
78 self.assertIsNone(posix.setresuid(-1, -1, -1))
Martin v. Löwis7aed61a2009-11-27 14:09:49 +000079
Serhiy Storchaka43767632013-11-03 21:31:38 +020080 @unittest.skipUnless(hasattr(posix, 'setresuid'),
81 'test needs posix.setresuid()')
82 def test_setresuid_exception(self):
83 # Don't do this test if someone is silly enough to run us as root.
84 current_user_ids = posix.getresuid()
85 if 0 not in current_user_ids:
86 new_user_ids = (current_user_ids[0]+1, -1, -1)
87 self.assertRaises(OSError, posix.setresuid, *new_user_ids)
Martin v. Löwis7aed61a2009-11-27 14:09:49 +000088
Serhiy Storchaka43767632013-11-03 21:31:38 +020089 @unittest.skipUnless(hasattr(posix, 'setresgid'),
90 'test needs posix.setresgid()')
91 def test_setresgid(self):
92 current_group_ids = posix.getresgid()
93 self.assertIsNone(posix.setresgid(*current_group_ids))
94 # -1 means don't change that value.
95 self.assertIsNone(posix.setresgid(-1, -1, -1))
Martin v. Löwis7aed61a2009-11-27 14:09:49 +000096
Serhiy Storchaka43767632013-11-03 21:31:38 +020097 @unittest.skipUnless(hasattr(posix, 'setresgid'),
98 'test needs posix.setresgid()')
99 def test_setresgid_exception(self):
100 # Don't do this test if someone is silly enough to run us as root.
101 current_group_ids = posix.getresgid()
102 if 0 not in current_group_ids:
103 new_group_ids = (current_group_ids[0]+1, -1, -1)
104 self.assertRaises(OSError, posix.setresgid, *new_group_ids)
Martin v. Löwis7aed61a2009-11-27 14:09:49 +0000105
Antoine Pitroub7572f02009-12-02 20:46:48 +0000106 @unittest.skipUnless(hasattr(posix, 'initgroups'),
107 "test needs os.initgroups()")
108 def test_initgroups(self):
109 # It takes a string and an integer; check that it raises a TypeError
110 # for other argument lists.
111 self.assertRaises(TypeError, posix.initgroups)
112 self.assertRaises(TypeError, posix.initgroups, None)
113 self.assertRaises(TypeError, posix.initgroups, 3, "foo")
114 self.assertRaises(TypeError, posix.initgroups, "foo", 3, object())
115
116 # If a non-privileged user invokes it, it should fail with OSError
117 # EPERM.
118 if os.getuid() != 0:
Charles-François Natalie8a255a2012-05-02 20:01:38 +0200119 try:
120 name = pwd.getpwuid(posix.getuid()).pw_name
121 except KeyError:
122 # the current UID may not have a pwd entry
123 raise unittest.SkipTest("need a pwd entry")
Antoine Pitroub7572f02009-12-02 20:46:48 +0000124 try:
125 posix.initgroups(name, 13)
126 except OSError as e:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000127 self.assertEqual(e.errno, errno.EPERM)
Antoine Pitroub7572f02009-12-02 20:46:48 +0000128 else:
129 self.fail("Expected OSError to be raised by initgroups")
130
Serhiy Storchaka43767632013-11-03 21:31:38 +0200131 @unittest.skipUnless(hasattr(posix, 'statvfs'),
132 'test needs posix.statvfs()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000133 def test_statvfs(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200134 self.assertTrue(posix.statvfs(os.curdir))
Neal Norwitze241ce82003-02-17 18:17:05 +0000135
Serhiy Storchaka43767632013-11-03 21:31:38 +0200136 @unittest.skipUnless(hasattr(posix, 'fstatvfs'),
137 'test needs posix.fstatvfs()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000138 def test_fstatvfs(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200139 fp = open(support.TESTFN)
140 try:
141 self.assertTrue(posix.fstatvfs(fp.fileno()))
142 self.assertTrue(posix.statvfs(fp.fileno()))
143 finally:
144 fp.close()
Neal Norwitze241ce82003-02-17 18:17:05 +0000145
Serhiy Storchaka43767632013-11-03 21:31:38 +0200146 @unittest.skipUnless(hasattr(posix, 'ftruncate'),
147 'test needs posix.ftruncate()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000148 def test_ftruncate(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200149 fp = open(support.TESTFN, 'w+')
150 try:
151 # we need to have some data to truncate
152 fp.write('test')
153 fp.flush()
154 posix.ftruncate(fp.fileno(), 0)
155 finally:
156 fp.close()
Neal Norwitze241ce82003-02-17 18:17:05 +0000157
Ross Lagerwall7807c352011-03-17 20:20:30 +0200158 @unittest.skipUnless(hasattr(posix, 'truncate'), "test needs posix.truncate()")
159 def test_truncate(self):
160 with open(support.TESTFN, 'w') as fp:
161 fp.write('test')
162 fp.flush()
163 posix.truncate(support.TESTFN, 0)
164
Larry Hastings9cf065c2012-06-22 16:30:09 -0700165 @unittest.skipUnless(getattr(os, 'execve', None) in os.supports_fd, "test needs execve() to support the fd parameter")
Ross Lagerwall7807c352011-03-17 20:20:30 +0200166 @unittest.skipUnless(hasattr(os, 'fork'), "test needs os.fork()")
Ross Lagerwalldedf6cf2011-03-20 18:27:05 +0200167 @unittest.skipUnless(hasattr(os, 'waitpid'), "test needs os.waitpid()")
Ross Lagerwall7807c352011-03-17 20:20:30 +0200168 def test_fexecve(self):
169 fp = os.open(sys.executable, os.O_RDONLY)
170 try:
171 pid = os.fork()
172 if pid == 0:
173 os.chdir(os.path.split(sys.executable)[0])
Larry Hastings9cf065c2012-06-22 16:30:09 -0700174 posix.execve(fp, [sys.executable, '-c', 'pass'], os.environ)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200175 else:
Ross Lagerwalldedf6cf2011-03-20 18:27:05 +0200176 self.assertEqual(os.waitpid(pid, 0), (pid, 0))
Ross Lagerwall7807c352011-03-17 20:20:30 +0200177 finally:
178 os.close(fp)
179
180 @unittest.skipUnless(hasattr(posix, 'waitid'), "test needs posix.waitid()")
181 @unittest.skipUnless(hasattr(os, 'fork'), "test needs os.fork()")
182 def test_waitid(self):
183 pid = os.fork()
184 if pid == 0:
185 os.chdir(os.path.split(sys.executable)[0])
186 posix.execve(sys.executable, [sys.executable, '-c', 'pass'], os.environ)
187 else:
188 res = posix.waitid(posix.P_PID, pid, posix.WEXITED)
189 self.assertEqual(pid, res.si_pid)
190
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200191 @unittest.skipUnless(hasattr(os, 'fork'), "test needs os.fork()")
Gregory P. Smith163468a2017-05-29 10:03:41 -0700192 def test_register_at_fork(self):
193 with self.assertRaises(TypeError, msg="Positional args not allowed"):
194 os.register_at_fork(lambda: None)
195 with self.assertRaises(TypeError, msg="Args must be callable"):
196 os.register_at_fork(before=2)
197 with self.assertRaises(TypeError, msg="Args must be callable"):
198 os.register_at_fork(after_in_child="three")
199 with self.assertRaises(TypeError, msg="Args must be callable"):
200 os.register_at_fork(after_in_parent=b"Five")
201 with self.assertRaises(TypeError, msg="Args must not be None"):
202 os.register_at_fork(before=None)
203 with self.assertRaises(TypeError, msg="Args must not be None"):
204 os.register_at_fork(after_in_child=None)
205 with self.assertRaises(TypeError, msg="Args must not be None"):
206 os.register_at_fork(after_in_parent=None)
207 with self.assertRaises(TypeError, msg="Invalid arg was allowed"):
208 # Ensure a combination of valid and invalid is an error.
209 os.register_at_fork(before=None, after_in_parent=lambda: 3)
210 with self.assertRaises(TypeError, msg="Invalid arg was allowed"):
211 # Ensure a combination of valid and invalid is an error.
212 os.register_at_fork(before=lambda: None, after_in_child='')
213 # We test actual registrations in their own process so as not to
214 # pollute this one. There is no way to unregister for cleanup.
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200215 code = """if 1:
216 import os
217
218 r, w = os.pipe()
219 fin_r, fin_w = os.pipe()
220
Gregory P. Smith163468a2017-05-29 10:03:41 -0700221 os.register_at_fork(before=lambda: os.write(w, b'A'))
222 os.register_at_fork(after_in_parent=lambda: os.write(w, b'C'))
223 os.register_at_fork(after_in_child=lambda: os.write(w, b'E'))
224 os.register_at_fork(before=lambda: os.write(w, b'B'),
225 after_in_parent=lambda: os.write(w, b'D'),
226 after_in_child=lambda: os.write(w, b'F'))
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200227
228 pid = os.fork()
229 if pid == 0:
230 # At this point, after-forkers have already been executed
231 os.close(w)
232 # Wait for parent to tell us to exit
233 os.read(fin_r, 1)
234 os._exit(0)
235 else:
236 try:
237 os.close(w)
238 with open(r, "rb") as f:
239 data = f.read()
240 assert len(data) == 6, data
241 # Check before-fork callbacks
242 assert data[:2] == b'BA', data
243 # Check after-fork callbacks
244 assert sorted(data[2:]) == list(b'CDEF'), data
245 assert data.index(b'C') < data.index(b'D'), data
246 assert data.index(b'E') < data.index(b'F'), data
247 finally:
248 os.write(fin_w, b'!')
249 """
250 assert_python_ok('-c', code)
251
Ross Lagerwall7807c352011-03-17 20:20:30 +0200252 @unittest.skipUnless(hasattr(posix, 'lockf'), "test needs posix.lockf()")
253 def test_lockf(self):
254 fd = os.open(support.TESTFN, os.O_WRONLY | os.O_CREAT)
255 try:
256 os.write(fd, b'test')
257 os.lseek(fd, 0, os.SEEK_SET)
258 posix.lockf(fd, posix.F_LOCK, 4)
259 # section is locked
260 posix.lockf(fd, posix.F_ULOCK, 4)
261 finally:
262 os.close(fd)
263
264 @unittest.skipUnless(hasattr(posix, 'pread'), "test needs posix.pread()")
265 def test_pread(self):
266 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
267 try:
268 os.write(fd, b'test')
269 os.lseek(fd, 0, os.SEEK_SET)
270 self.assertEqual(b'es', posix.pread(fd, 2, 1))
Florent Xiclunae41f0de2011-11-11 19:39:25 +0100271 # the first pread() shouldn't disturb the file offset
Ross Lagerwall7807c352011-03-17 20:20:30 +0200272 self.assertEqual(b'te', posix.read(fd, 2))
273 finally:
274 os.close(fd)
275
276 @unittest.skipUnless(hasattr(posix, 'pwrite'), "test needs posix.pwrite()")
277 def test_pwrite(self):
278 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
279 try:
280 os.write(fd, b'test')
281 os.lseek(fd, 0, os.SEEK_SET)
282 posix.pwrite(fd, b'xx', 1)
283 self.assertEqual(b'txxt', posix.read(fd, 4))
284 finally:
285 os.close(fd)
286
287 @unittest.skipUnless(hasattr(posix, 'posix_fallocate'),
288 "test needs posix.posix_fallocate()")
289 def test_posix_fallocate(self):
290 fd = os.open(support.TESTFN, os.O_WRONLY | os.O_CREAT)
291 try:
292 posix.posix_fallocate(fd, 0, 10)
293 except OSError as inst:
294 # issue10812, ZFS doesn't appear to support posix_fallocate,
295 # so skip Solaris-based since they are likely to have ZFS.
296 if inst.errno != errno.EINVAL or not sys.platform.startswith("sunos"):
297 raise
298 finally:
299 os.close(fd)
300
Коренберг Маркd4b93e22017-08-14 18:55:16 +0500301 # issue31106 - posix_fallocate() does not set error in errno.
302 @unittest.skipUnless(hasattr(posix, 'posix_fallocate'),
303 "test needs posix.posix_fallocate()")
304 def test_posix_fallocate_errno(self):
305 try:
306 posix.posix_fallocate(-42, 0, 10)
307 except OSError as inst:
308 if inst.errno != errno.EBADF:
309 raise
310
Ross Lagerwall7807c352011-03-17 20:20:30 +0200311 @unittest.skipUnless(hasattr(posix, 'posix_fadvise'),
312 "test needs posix.posix_fadvise()")
313 def test_posix_fadvise(self):
314 fd = os.open(support.TESTFN, os.O_RDONLY)
315 try:
316 posix.posix_fadvise(fd, 0, 0, posix.POSIX_FADV_WILLNEED)
317 finally:
318 os.close(fd)
319
Коренберг Маркd4b93e22017-08-14 18:55:16 +0500320 @unittest.skipUnless(hasattr(posix, 'posix_fadvise'),
321 "test needs posix.posix_fadvise()")
322 def test_posix_fadvise_errno(self):
323 try:
324 posix.posix_fadvise(-42, 0, 0, posix.POSIX_FADV_WILLNEED)
325 except OSError as inst:
326 if inst.errno != errno.EBADF:
327 raise
328
Larry Hastings9cf065c2012-06-22 16:30:09 -0700329 @unittest.skipUnless(os.utime in os.supports_fd, "test needs fd support in os.utime")
330 def test_utime_with_fd(self):
Ross Lagerwall7807c352011-03-17 20:20:30 +0200331 now = time.time()
332 fd = os.open(support.TESTFN, os.O_RDONLY)
333 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700334 posix.utime(fd)
335 posix.utime(fd, None)
336 self.assertRaises(TypeError, posix.utime, fd, (None, None))
337 self.assertRaises(TypeError, posix.utime, fd, (now, None))
338 self.assertRaises(TypeError, posix.utime, fd, (None, now))
339 posix.utime(fd, (int(now), int(now)))
340 posix.utime(fd, (now, now))
341 self.assertRaises(ValueError, posix.utime, fd, (now, now), ns=(now, now))
342 self.assertRaises(ValueError, posix.utime, fd, (now, 0), ns=(None, None))
343 self.assertRaises(ValueError, posix.utime, fd, (None, None), ns=(now, 0))
344 posix.utime(fd, (int(now), int((now - int(now)) * 1e9)))
345 posix.utime(fd, ns=(int(now), int((now - int(now)) * 1e9)))
346
Ross Lagerwall7807c352011-03-17 20:20:30 +0200347 finally:
348 os.close(fd)
349
Larry Hastings9cf065c2012-06-22 16:30:09 -0700350 @unittest.skipUnless(os.utime in os.supports_follow_symlinks, "test needs follow_symlinks support in os.utime")
351 def test_utime_nofollow_symlinks(self):
Ross Lagerwall7807c352011-03-17 20:20:30 +0200352 now = time.time()
Larry Hastings9cf065c2012-06-22 16:30:09 -0700353 posix.utime(support.TESTFN, None, follow_symlinks=False)
354 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None), follow_symlinks=False)
355 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None), follow_symlinks=False)
356 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now), follow_symlinks=False)
357 posix.utime(support.TESTFN, (int(now), int(now)), follow_symlinks=False)
358 posix.utime(support.TESTFN, (now, now), follow_symlinks=False)
359 posix.utime(support.TESTFN, follow_symlinks=False)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200360
361 @unittest.skipUnless(hasattr(posix, 'writev'), "test needs posix.writev()")
362 def test_writev(self):
363 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
364 try:
Victor Stinner57ddf782014-01-08 15:21:28 +0100365 n = os.writev(fd, (b'test1', b'tt2', b't3'))
366 self.assertEqual(n, 10)
367
Ross Lagerwall7807c352011-03-17 20:20:30 +0200368 os.lseek(fd, 0, os.SEEK_SET)
369 self.assertEqual(b'test1tt2t3', posix.read(fd, 10))
Victor Stinner57ddf782014-01-08 15:21:28 +0100370
371 # Issue #20113: empty list of buffers should not crash
Victor Stinnercd5ca6a2014-01-08 16:01:31 +0100372 try:
373 size = posix.writev(fd, [])
374 except OSError:
375 # writev(fd, []) raises OSError(22, "Invalid argument")
376 # on OpenIndiana
377 pass
378 else:
379 self.assertEqual(size, 0)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200380 finally:
381 os.close(fd)
382
383 @unittest.skipUnless(hasattr(posix, 'readv'), "test needs posix.readv()")
384 def test_readv(self):
385 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
386 try:
387 os.write(fd, b'test1tt2t3')
388 os.lseek(fd, 0, os.SEEK_SET)
389 buf = [bytearray(i) for i in [5, 3, 2]]
390 self.assertEqual(posix.readv(fd, buf), 10)
391 self.assertEqual([b'test1', b'tt2', b't3'], [bytes(i) for i in buf])
Victor Stinner57ddf782014-01-08 15:21:28 +0100392
393 # Issue #20113: empty list of buffers should not crash
Victor Stinnercd5ca6a2014-01-08 16:01:31 +0100394 try:
395 size = posix.readv(fd, [])
396 except OSError:
397 # readv(fd, []) raises OSError(22, "Invalid argument")
398 # on OpenIndiana
399 pass
400 else:
401 self.assertEqual(size, 0)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200402 finally:
403 os.close(fd)
404
Serhiy Storchaka43767632013-11-03 21:31:38 +0200405 @unittest.skipUnless(hasattr(posix, 'dup'),
406 'test needs posix.dup()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000407 def test_dup(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200408 fp = open(support.TESTFN)
409 try:
410 fd = posix.dup(fp.fileno())
411 self.assertIsInstance(fd, int)
412 os.close(fd)
413 finally:
414 fp.close()
Neal Norwitze241ce82003-02-17 18:17:05 +0000415
Serhiy Storchaka43767632013-11-03 21:31:38 +0200416 @unittest.skipUnless(hasattr(posix, 'confstr'),
417 'test needs posix.confstr()')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000418 def test_confstr(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200419 self.assertRaises(ValueError, posix.confstr, "CS_garbage")
420 self.assertEqual(len(posix.confstr("CS_PATH")) > 0, True)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000421
Serhiy Storchaka43767632013-11-03 21:31:38 +0200422 @unittest.skipUnless(hasattr(posix, 'dup2'),
423 'test needs posix.dup2()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000424 def test_dup2(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200425 fp1 = open(support.TESTFN)
426 fp2 = open(support.TESTFN)
427 try:
428 posix.dup2(fp1.fileno(), fp2.fileno())
429 finally:
430 fp1.close()
431 fp2.close()
Neal Norwitze241ce82003-02-17 18:17:05 +0000432
Charles-François Natali1e045b12011-05-22 20:42:32 +0200433 @unittest.skipUnless(hasattr(os, 'O_CLOEXEC'), "needs os.O_CLOEXEC")
Charles-François Natali239bb962011-06-03 12:55:15 +0200434 @support.requires_linux_version(2, 6, 23)
Charles-François Natali1e045b12011-05-22 20:42:32 +0200435 def test_oscloexec(self):
436 fd = os.open(support.TESTFN, os.O_RDONLY|os.O_CLOEXEC)
437 self.addCleanup(os.close, fd)
Victor Stinner1db9e7b2014-07-29 22:32:47 +0200438 self.assertFalse(os.get_inheritable(fd))
Charles-François Natali1e045b12011-05-22 20:42:32 +0200439
Serhiy Storchaka43767632013-11-03 21:31:38 +0200440 @unittest.skipUnless(hasattr(posix, 'O_EXLOCK'),
441 'test needs posix.O_EXLOCK')
Skip Montanaro98470002005-06-17 01:14:49 +0000442 def test_osexlock(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200443 fd = os.open(support.TESTFN,
444 os.O_WRONLY|os.O_EXLOCK|os.O_CREAT)
445 self.assertRaises(OSError, os.open, support.TESTFN,
446 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
447 os.close(fd)
448
449 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000450 fd = os.open(support.TESTFN,
Serhiy Storchaka43767632013-11-03 21:31:38 +0200451 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000452 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000453 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
454 os.close(fd)
455
Serhiy Storchaka43767632013-11-03 21:31:38 +0200456 @unittest.skipUnless(hasattr(posix, 'O_SHLOCK'),
457 'test needs posix.O_SHLOCK')
Skip Montanaro98470002005-06-17 01:14:49 +0000458 def test_osshlock(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200459 fd1 = os.open(support.TESTFN,
460 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
461 fd2 = os.open(support.TESTFN,
462 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
463 os.close(fd2)
464 os.close(fd1)
465
466 if hasattr(posix, "O_EXLOCK"):
467 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000468 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Serhiy Storchaka43767632013-11-03 21:31:38 +0200469 self.assertRaises(OSError, os.open, support.TESTFN,
470 os.O_RDONLY|os.O_EXLOCK|os.O_NONBLOCK)
471 os.close(fd)
Skip Montanaro98470002005-06-17 01:14:49 +0000472
Serhiy Storchaka43767632013-11-03 21:31:38 +0200473 @unittest.skipUnless(hasattr(posix, 'fstat'),
474 'test needs posix.fstat()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000475 def test_fstat(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200476 fp = open(support.TESTFN)
477 try:
478 self.assertTrue(posix.fstat(fp.fileno()))
479 self.assertTrue(posix.stat(fp.fileno()))
Serhiy Storchakaa2ad5c32013-01-07 23:13:46 +0200480
Serhiy Storchaka43767632013-11-03 21:31:38 +0200481 self.assertRaisesRegex(TypeError,
Brett Cannon3f9183b2016-08-26 14:44:48 -0700482 'should be string, bytes, os.PathLike or integer, not',
Serhiy Storchaka43767632013-11-03 21:31:38 +0200483 posix.stat, float(fp.fileno()))
484 finally:
485 fp.close()
Neal Norwitze241ce82003-02-17 18:17:05 +0000486
Serhiy Storchaka43767632013-11-03 21:31:38 +0200487 @unittest.skipUnless(hasattr(posix, 'stat'),
488 'test needs posix.stat()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000489 def test_stat(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200490 self.assertTrue(posix.stat(support.TESTFN))
491 self.assertTrue(posix.stat(os.fsencode(support.TESTFN)))
Serhiy Storchakaa2ad5c32013-01-07 23:13:46 +0200492
Serhiy Storchakad73c3182016-08-06 23:22:08 +0300493 self.assertWarnsRegex(DeprecationWarning,
Brett Cannon3f9183b2016-08-26 14:44:48 -0700494 'should be string, bytes, os.PathLike or integer, not',
Serhiy Storchakad73c3182016-08-06 23:22:08 +0300495 posix.stat, bytearray(os.fsencode(support.TESTFN)))
Serhiy Storchaka43767632013-11-03 21:31:38 +0200496 self.assertRaisesRegex(TypeError,
Brett Cannon3f9183b2016-08-26 14:44:48 -0700497 'should be string, bytes, os.PathLike or integer, not',
Serhiy Storchaka43767632013-11-03 21:31:38 +0200498 posix.stat, None)
499 self.assertRaisesRegex(TypeError,
Brett Cannon3f9183b2016-08-26 14:44:48 -0700500 'should be string, bytes, os.PathLike or integer, not',
Serhiy Storchaka43767632013-11-03 21:31:38 +0200501 posix.stat, list(support.TESTFN))
502 self.assertRaisesRegex(TypeError,
Brett Cannon3f9183b2016-08-26 14:44:48 -0700503 'should be string, bytes, os.PathLike or integer, not',
Serhiy Storchaka43767632013-11-03 21:31:38 +0200504 posix.stat, list(os.fsencode(support.TESTFN)))
Neal Norwitze241ce82003-02-17 18:17:05 +0000505
Benjamin Peterson052a02b2010-08-17 01:27:09 +0000506 @unittest.skipUnless(hasattr(posix, 'mkfifo'), "don't have mkfifo()")
Xavier de Gaye3a4e9892016-12-13 10:00:01 +0100507 @unittest.skipIf(android_not_root, "mkfifo not allowed, non root user")
Benjamin Peterson052a02b2010-08-17 01:27:09 +0000508 def test_mkfifo(self):
509 support.unlink(support.TESTFN)
510 posix.mkfifo(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR)
511 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
512
513 @unittest.skipUnless(hasattr(posix, 'mknod') and hasattr(stat, 'S_IFIFO'),
514 "don't have mknod()/S_IFIFO")
Xavier de Gaye3a4e9892016-12-13 10:00:01 +0100515 @unittest.skipIf(android_not_root, "mknod not allowed, non root user")
Benjamin Peterson052a02b2010-08-17 01:27:09 +0000516 def test_mknod(self):
517 # Test using mknod() to create a FIFO (the only use specified
518 # by POSIX).
519 support.unlink(support.TESTFN)
520 mode = stat.S_IFIFO | stat.S_IRUSR | stat.S_IWUSR
521 try:
522 posix.mknod(support.TESTFN, mode, 0)
523 except OSError as e:
524 # Some old systems don't allow unprivileged users to use
525 # mknod(), or only support creating device nodes.
526 self.assertIn(e.errno, (errno.EPERM, errno.EINVAL))
527 else:
528 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
529
Martin Panterbf19d162015-09-09 01:01:13 +0000530 # Keyword arguments are also supported
531 support.unlink(support.TESTFN)
532 try:
533 posix.mknod(path=support.TESTFN, mode=mode, device=0,
534 dir_fd=None)
535 except OSError as e:
536 self.assertIn(e.errno, (errno.EPERM, errno.EINVAL))
537
Serhiy Storchaka16b2e4f2015-04-20 09:22:13 +0300538 @unittest.skipUnless(hasattr(posix, 'stat'), 'test needs posix.stat()')
539 @unittest.skipUnless(hasattr(posix, 'makedev'), 'test needs posix.makedev()')
540 def test_makedev(self):
541 st = posix.stat(support.TESTFN)
542 dev = st.st_dev
543 self.assertIsInstance(dev, int)
544 self.assertGreaterEqual(dev, 0)
545
546 major = posix.major(dev)
547 self.assertIsInstance(major, int)
548 self.assertGreaterEqual(major, 0)
549 self.assertEqual(posix.major(dev), major)
550 self.assertRaises(TypeError, posix.major, float(dev))
551 self.assertRaises(TypeError, posix.major)
552 self.assertRaises((ValueError, OverflowError), posix.major, -1)
553
554 minor = posix.minor(dev)
555 self.assertIsInstance(minor, int)
556 self.assertGreaterEqual(minor, 0)
557 self.assertEqual(posix.minor(dev), minor)
558 self.assertRaises(TypeError, posix.minor, float(dev))
559 self.assertRaises(TypeError, posix.minor)
560 self.assertRaises((ValueError, OverflowError), posix.minor, -1)
561
Victor Stinner12953ff2017-07-27 16:55:54 +0200562 if sys.platform.startswith('freebsd') and dev >= 0x1_0000_0000:
563 self.skipTest("bpo-31044: on FreeBSD CURRENT, minor() truncates "
564 "64-bit dev to 32-bit")
565
Serhiy Storchaka16b2e4f2015-04-20 09:22:13 +0300566 self.assertEqual(posix.makedev(major, minor), dev)
567 self.assertRaises(TypeError, posix.makedev, float(major), minor)
568 self.assertRaises(TypeError, posix.makedev, major, float(minor))
569 self.assertRaises(TypeError, posix.makedev, major)
570 self.assertRaises(TypeError, posix.makedev)
571
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200572 def _test_all_chown_common(self, chown_func, first_param, stat_func):
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000573 """Common code for chown, fchown and lchown tests."""
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200574 def check_stat(uid, gid):
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200575 if stat_func is not None:
576 stat = stat_func(first_param)
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200577 self.assertEqual(stat.st_uid, uid)
578 self.assertEqual(stat.st_gid, gid)
579 uid = os.getuid()
580 gid = os.getgid()
Charles-François Nataliab2d58e2012-04-17 19:48:35 +0200581 # test a successful chown call
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200582 chown_func(first_param, uid, gid)
583 check_stat(uid, gid)
584 chown_func(first_param, -1, gid)
585 check_stat(uid, gid)
586 chown_func(first_param, uid, -1)
587 check_stat(uid, gid)
Charles-François Nataliab2d58e2012-04-17 19:48:35 +0200588
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200589 if uid == 0:
590 # Try an amusingly large uid/gid to make sure we handle
591 # large unsigned values. (chown lets you use any
592 # uid/gid you like, even if they aren't defined.)
593 #
594 # This problem keeps coming up:
595 # http://bugs.python.org/issue1747858
596 # http://bugs.python.org/issue4591
597 # http://bugs.python.org/issue15301
598 # Hopefully the fix in 4591 fixes it for good!
599 #
600 # This part of the test only runs when run as root.
601 # Only scary people run their tests as root.
602
603 big_value = 2**31
604 chown_func(first_param, big_value, big_value)
605 check_stat(big_value, big_value)
606 chown_func(first_param, -1, -1)
607 check_stat(big_value, big_value)
608 chown_func(first_param, uid, gid)
609 check_stat(uid, gid)
Charles-François Nataliab2d58e2012-04-17 19:48:35 +0200610 elif platform.system() in ('HP-UX', 'SunOS'):
611 # HP-UX and Solaris can allow a non-root user to chown() to root
612 # (issue #5113)
613 raise unittest.SkipTest("Skipping because of non-standard chown() "
614 "behavior")
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000615 else:
616 # non-root cannot chown to root, raises OSError
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200617 self.assertRaises(OSError, chown_func, first_param, 0, 0)
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200618 check_stat(uid, gid)
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200619 self.assertRaises(OSError, chown_func, first_param, 0, -1)
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200620 check_stat(uid, gid)
Serhiy Storchakaa2964b32013-02-21 14:34:36 +0200621 if 0 not in os.getgroups():
Serhiy Storchakab3d62ce2013-02-20 19:48:22 +0200622 self.assertRaises(OSError, chown_func, first_param, -1, 0)
623 check_stat(uid, gid)
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200624 # test illegal types
625 for t in str, float:
626 self.assertRaises(TypeError, chown_func, first_param, t(uid), gid)
627 check_stat(uid, gid)
628 self.assertRaises(TypeError, chown_func, first_param, uid, t(gid))
629 check_stat(uid, gid)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000630
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000631 @unittest.skipUnless(hasattr(posix, 'chown'), "test needs os.chown()")
632 def test_chown(self):
633 # raise an OSError if the file does not exist
634 os.unlink(support.TESTFN)
635 self.assertRaises(OSError, posix.chown, support.TESTFN, -1, -1)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000636
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000637 # re-create the file
Victor Stinnerbf816222011-06-30 23:25:47 +0200638 support.create_empty_file(support.TESTFN)
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200639 self._test_all_chown_common(posix.chown, support.TESTFN,
640 getattr(posix, 'stat', None))
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000641
642 @unittest.skipUnless(hasattr(posix, 'fchown'), "test needs os.fchown()")
643 def test_fchown(self):
644 os.unlink(support.TESTFN)
645
646 # re-create the file
647 test_file = open(support.TESTFN, 'w')
648 try:
649 fd = test_file.fileno()
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200650 self._test_all_chown_common(posix.fchown, fd,
651 getattr(posix, 'fstat', None))
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000652 finally:
653 test_file.close()
654
655 @unittest.skipUnless(hasattr(posix, 'lchown'), "test needs os.lchown()")
656 def test_lchown(self):
657 os.unlink(support.TESTFN)
658 # create a symlink
Ned Deily3eb67d52011-06-28 00:00:28 -0700659 os.symlink(_DUMMY_SYMLINK, support.TESTFN)
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200660 self._test_all_chown_common(posix.lchown, support.TESTFN,
661 getattr(posix, 'lstat', None))
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000662
Serhiy Storchaka43767632013-11-03 21:31:38 +0200663 @unittest.skipUnless(hasattr(posix, 'chdir'), 'test needs posix.chdir()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000664 def test_chdir(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200665 posix.chdir(os.curdir)
666 self.assertRaises(OSError, posix.chdir, support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000667
Martin v. Löwisc9e1c7d2010-07-23 12:16:41 +0000668 def test_listdir(self):
Serhiy Storchaka1180e5a2017-07-11 06:36:46 +0300669 self.assertIn(support.TESTFN, posix.listdir(os.curdir))
Martin v. Löwisc9e1c7d2010-07-23 12:16:41 +0000670
671 def test_listdir_default(self):
Larry Hastingsfdaea062012-06-25 04:42:23 -0700672 # When listdir is called without argument,
673 # it's the same as listdir(os.curdir).
Serhiy Storchaka1180e5a2017-07-11 06:36:46 +0300674 self.assertIn(support.TESTFN, posix.listdir())
Neal Norwitze241ce82003-02-17 18:17:05 +0000675
Larry Hastingsfdaea062012-06-25 04:42:23 -0700676 def test_listdir_bytes(self):
677 # When listdir is called with a bytes object,
678 # the returned strings are of type bytes.
Serhiy Storchaka1180e5a2017-07-11 06:36:46 +0300679 self.assertIn(os.fsencode(support.TESTFN), posix.listdir(b'.'))
680
681 def test_listdir_bytes_like(self):
682 for cls in bytearray, memoryview:
683 with self.assertWarns(DeprecationWarning):
684 names = posix.listdir(cls(b'.'))
685 self.assertIn(os.fsencode(support.TESTFN), names)
686 for name in names:
687 self.assertIs(type(name), bytes)
Larry Hastingsfdaea062012-06-25 04:42:23 -0700688
689 @unittest.skipUnless(posix.listdir in os.supports_fd,
690 "test needs fd support for posix.listdir()")
691 def test_listdir_fd(self):
Antoine Pitrou8250e232011-02-25 23:41:16 +0000692 f = posix.open(posix.getcwd(), posix.O_RDONLY)
Charles-François Natali7546ad32012-01-08 18:34:06 +0100693 self.addCleanup(posix.close, f)
Antoine Pitrou8250e232011-02-25 23:41:16 +0000694 self.assertEqual(
695 sorted(posix.listdir('.')),
Larry Hastings9cf065c2012-06-22 16:30:09 -0700696 sorted(posix.listdir(f))
Antoine Pitrou8250e232011-02-25 23:41:16 +0000697 )
Charles-François Natali7546ad32012-01-08 18:34:06 +0100698 # Check that the fd offset was reset (issue #13739)
Charles-François Natali7546ad32012-01-08 18:34:06 +0100699 self.assertEqual(
700 sorted(posix.listdir('.')),
Larry Hastings9cf065c2012-06-22 16:30:09 -0700701 sorted(posix.listdir(f))
Charles-François Natali7546ad32012-01-08 18:34:06 +0100702 )
Antoine Pitrou8250e232011-02-25 23:41:16 +0000703
Serhiy Storchaka43767632013-11-03 21:31:38 +0200704 @unittest.skipUnless(hasattr(posix, 'access'), 'test needs posix.access()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000705 def test_access(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200706 self.assertTrue(posix.access(support.TESTFN, os.R_OK))
Neal Norwitze241ce82003-02-17 18:17:05 +0000707
Serhiy Storchaka43767632013-11-03 21:31:38 +0200708 @unittest.skipUnless(hasattr(posix, 'umask'), 'test needs posix.umask()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000709 def test_umask(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200710 old_mask = posix.umask(0)
711 self.assertIsInstance(old_mask, int)
712 posix.umask(old_mask)
Neal Norwitze241ce82003-02-17 18:17:05 +0000713
Serhiy Storchaka43767632013-11-03 21:31:38 +0200714 @unittest.skipUnless(hasattr(posix, 'strerror'),
715 'test needs posix.strerror()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000716 def test_strerror(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200717 self.assertTrue(posix.strerror(0))
Neal Norwitze241ce82003-02-17 18:17:05 +0000718
Serhiy Storchaka43767632013-11-03 21:31:38 +0200719 @unittest.skipUnless(hasattr(posix, 'pipe'), 'test needs posix.pipe()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000720 def test_pipe(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200721 reader, writer = posix.pipe()
722 os.close(reader)
723 os.close(writer)
Neal Norwitze241ce82003-02-17 18:17:05 +0000724
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200725 @unittest.skipUnless(hasattr(os, 'pipe2'), "test needs os.pipe2()")
Charles-François Natali239bb962011-06-03 12:55:15 +0200726 @support.requires_linux_version(2, 6, 27)
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200727 def test_pipe2(self):
728 self.assertRaises(TypeError, os.pipe2, 'DEADBEEF')
729 self.assertRaises(TypeError, os.pipe2, 0, 0)
730
Charles-François Natali368f34b2011-06-06 19:49:47 +0200731 # try calling with flags = 0, like os.pipe()
732 r, w = os.pipe2(0)
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200733 os.close(r)
734 os.close(w)
735
736 # test flags
737 r, w = os.pipe2(os.O_CLOEXEC|os.O_NONBLOCK)
738 self.addCleanup(os.close, r)
739 self.addCleanup(os.close, w)
Victor Stinnerbff989e2013-08-28 12:25:40 +0200740 self.assertFalse(os.get_inheritable(r))
741 self.assertFalse(os.get_inheritable(w))
Victor Stinner1db9e7b2014-07-29 22:32:47 +0200742 self.assertFalse(os.get_blocking(r))
743 self.assertFalse(os.get_blocking(w))
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200744 # try reading from an empty pipe: this should fail, not block
745 self.assertRaises(OSError, os.read, r, 1)
746 # try a write big enough to fill-up the pipe: this should either
747 # fail or perform a partial write, not block
748 try:
749 os.write(w, b'x' * support.PIPE_MAX_SIZE)
750 except OSError:
751 pass
752
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +0200753 @support.cpython_only
754 @unittest.skipUnless(hasattr(os, 'pipe2'), "test needs os.pipe2()")
755 @support.requires_linux_version(2, 6, 27)
756 def test_pipe2_c_limits(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +0200757 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +0200758 import _testcapi
Serhiy Storchaka78980432013-01-15 01:12:17 +0200759 self.assertRaises(OverflowError, os.pipe2, _testcapi.INT_MAX + 1)
760 self.assertRaises(OverflowError, os.pipe2, _testcapi.UINT_MAX + 1)
761
Serhiy Storchaka43767632013-11-03 21:31:38 +0200762 @unittest.skipUnless(hasattr(posix, 'utime'), 'test needs posix.utime()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000763 def test_utime(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200764 now = time.time()
765 posix.utime(support.TESTFN, None)
766 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None))
767 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None))
768 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now))
769 posix.utime(support.TESTFN, (int(now), int(now)))
770 posix.utime(support.TESTFN, (now, now))
Neal Norwitze241ce82003-02-17 18:17:05 +0000771
Larry Hastings9cf065c2012-06-22 16:30:09 -0700772 def _test_chflags_regular_file(self, chflags_func, target_file, **kwargs):
Ned Deily3eb67d52011-06-28 00:00:28 -0700773 st = os.stat(target_file)
774 self.assertTrue(hasattr(st, 'st_flags'))
Trent Nelson75959cf2012-08-21 23:59:31 +0000775
776 # ZFS returns EOPNOTSUPP when attempting to set flag UF_IMMUTABLE.
777 flags = st.st_flags | stat.UF_IMMUTABLE
778 try:
779 chflags_func(target_file, flags, **kwargs)
780 except OSError as err:
781 if err.errno != errno.EOPNOTSUPP:
782 raise
783 msg = 'chflag UF_IMMUTABLE not supported by underlying fs'
784 self.skipTest(msg)
785
Ned Deily3eb67d52011-06-28 00:00:28 -0700786 try:
787 new_st = os.stat(target_file)
788 self.assertEqual(st.st_flags | stat.UF_IMMUTABLE, new_st.st_flags)
789 try:
790 fd = open(target_file, 'w+')
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200791 except OSError as e:
Ned Deily3eb67d52011-06-28 00:00:28 -0700792 self.assertEqual(e.errno, errno.EPERM)
793 finally:
794 posix.chflags(target_file, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000795
Ned Deily3eb67d52011-06-28 00:00:28 -0700796 @unittest.skipUnless(hasattr(posix, 'chflags'), 'test needs os.chflags()')
797 def test_chflags(self):
798 self._test_chflags_regular_file(posix.chflags, support.TESTFN)
799
800 @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
801 def test_lchflags_regular_file(self):
802 self._test_chflags_regular_file(posix.lchflags, support.TESTFN)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700803 self._test_chflags_regular_file(posix.chflags, support.TESTFN, follow_symlinks=False)
Ned Deily3eb67d52011-06-28 00:00:28 -0700804
805 @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
806 def test_lchflags_symlink(self):
807 testfn_st = os.stat(support.TESTFN)
808
809 self.assertTrue(hasattr(testfn_st, 'st_flags'))
810
811 os.symlink(support.TESTFN, _DUMMY_SYMLINK)
812 self.teardown_files.append(_DUMMY_SYMLINK)
813 dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
814
Larry Hastings9cf065c2012-06-22 16:30:09 -0700815 def chflags_nofollow(path, flags):
816 return posix.chflags(path, flags, follow_symlinks=False)
Ned Deily3eb67d52011-06-28 00:00:28 -0700817
Larry Hastings9cf065c2012-06-22 16:30:09 -0700818 for fn in (posix.lchflags, chflags_nofollow):
Trent Nelson75959cf2012-08-21 23:59:31 +0000819 # ZFS returns EOPNOTSUPP when attempting to set flag UF_IMMUTABLE.
820 flags = dummy_symlink_st.st_flags | stat.UF_IMMUTABLE
821 try:
822 fn(_DUMMY_SYMLINK, flags)
823 except OSError as err:
824 if err.errno != errno.EOPNOTSUPP:
825 raise
826 msg = 'chflag UF_IMMUTABLE not supported by underlying fs'
827 self.skipTest(msg)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700828 try:
829 new_testfn_st = os.stat(support.TESTFN)
830 new_dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
831
832 self.assertEqual(testfn_st.st_flags, new_testfn_st.st_flags)
833 self.assertEqual(dummy_symlink_st.st_flags | stat.UF_IMMUTABLE,
834 new_dummy_symlink_st.st_flags)
835 finally:
836 fn(_DUMMY_SYMLINK, dummy_symlink_st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000837
Guido van Rossum98297ee2007-11-06 21:34:58 +0000838 def test_environ(self):
Victor Stinner17b490d2010-05-06 22:19:30 +0000839 if os.name == "nt":
840 item_type = str
841 else:
842 item_type = bytes
Guido van Rossum98297ee2007-11-06 21:34:58 +0000843 for k, v in posix.environ.items():
Victor Stinner17b490d2010-05-06 22:19:30 +0000844 self.assertEqual(type(k), item_type)
845 self.assertEqual(type(v), item_type)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000846
Serhiy Storchaka77703942017-06-25 07:33:01 +0300847 @unittest.skipUnless(hasattr(os, "putenv"), "requires os.putenv()")
848 def test_putenv(self):
849 with self.assertRaises(ValueError):
850 os.putenv('FRUIT\0VEGETABLE', 'cabbage')
851 with self.assertRaises(ValueError):
852 os.putenv(b'FRUIT\0VEGETABLE', b'cabbage')
853 with self.assertRaises(ValueError):
854 os.putenv('FRUIT', 'orange\0VEGETABLE=cabbage')
855 with self.assertRaises(ValueError):
856 os.putenv(b'FRUIT', b'orange\0VEGETABLE=cabbage')
857 with self.assertRaises(ValueError):
858 os.putenv('FRUIT=ORANGE', 'lemon')
859 with self.assertRaises(ValueError):
860 os.putenv(b'FRUIT=ORANGE', b'lemon')
861
Serhiy Storchaka43767632013-11-03 21:31:38 +0200862 @unittest.skipUnless(hasattr(posix, 'getcwd'), 'test needs posix.getcwd()')
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000863 def test_getcwd_long_pathnames(self):
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500864 dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef'
865 curdir = os.getcwd()
866 base_path = os.path.abspath(support.TESTFN) + '.getcwd'
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000867
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500868 try:
869 os.mkdir(base_path)
870 os.chdir(base_path)
871 except:
872 # Just returning nothing instead of the SkipTest exception, because
873 # the test results in Error in that case. Is that ok?
874 # raise unittest.SkipTest("cannot create directory for testing")
875 return
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000876
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500877 def _create_and_do_getcwd(dirname, current_path_length = 0):
878 try:
879 os.mkdir(dirname)
880 except:
881 raise unittest.SkipTest("mkdir cannot create directory sufficiently deep for getcwd test")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000882
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500883 os.chdir(dirname)
884 try:
885 os.getcwd()
886 if current_path_length < 1027:
887 _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
888 finally:
889 os.chdir('..')
890 os.rmdir(dirname)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000891
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500892 _create_and_do_getcwd(dirname)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000893
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500894 finally:
895 os.chdir(curdir)
896 support.rmtree(base_path)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000897
Ross Lagerwallb0ae53d2011-06-10 07:30:30 +0200898 @unittest.skipUnless(hasattr(posix, 'getgrouplist'), "test needs posix.getgrouplist()")
899 @unittest.skipUnless(hasattr(pwd, 'getpwuid'), "test needs pwd.getpwuid()")
900 @unittest.skipUnless(hasattr(os, 'getuid'), "test needs os.getuid()")
901 def test_getgrouplist(self):
Ross Lagerwalla0b315f2012-12-13 15:20:26 +0000902 user = pwd.getpwuid(os.getuid())[0]
903 group = pwd.getpwuid(os.getuid())[3]
904 self.assertIn(group, posix.getgrouplist(user, group))
Ross Lagerwallb0ae53d2011-06-10 07:30:30 +0200905
Ross Lagerwallb0ae53d2011-06-10 07:30:30 +0200906
Antoine Pitrou318b8f32011-01-12 18:45:27 +0000907 @unittest.skipUnless(hasattr(os, 'getegid'), "test needs os.getegid()")
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000908 def test_getgroups(self):
Jesus Cea61f32cb2014-06-28 18:39:35 +0200909 with os.popen('id -G 2>/dev/null') as idg:
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000910 groups = idg.read().strip()
Charles-François Natalie8a255a2012-05-02 20:01:38 +0200911 ret = idg.close()
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000912
Xavier de Gaye24c3b492016-10-19 11:00:26 +0200913 try:
914 idg_groups = set(int(g) for g in groups.split())
915 except ValueError:
916 idg_groups = set()
917 if ret is not None or not idg_groups:
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000918 raise unittest.SkipTest("need working 'id -G'")
919
Ned Deily028915e2013-02-02 15:08:52 -0800920 # Issues 16698: OS X ABIs prior to 10.6 have limits on getgroups()
921 if sys.platform == 'darwin':
922 import sysconfig
923 dt = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') or '10.0'
Ned Deily04cdfa12014-06-25 13:36:14 -0700924 if tuple(int(n) for n in dt.split('.')[0:2]) < (10, 6):
Ned Deily028915e2013-02-02 15:08:52 -0800925 raise unittest.SkipTest("getgroups(2) is broken prior to 10.6")
926
Ronald Oussoren7fb6f512010-08-01 19:18:13 +0000927 # 'id -G' and 'os.getgroups()' should return the same
Xavier de Gaye24c3b492016-10-19 11:00:26 +0200928 # groups, ignoring order, duplicates, and the effective gid.
929 # #10822/#26944 - It is implementation defined whether
930 # posix.getgroups() includes the effective gid.
931 symdiff = idg_groups.symmetric_difference(posix.getgroups())
932 self.assertTrue(not symdiff or symdiff == {posix.getegid()})
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000933
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000934 # tests for the posix *at functions follow
935
Larry Hastings9cf065c2012-06-22 16:30:09 -0700936 @unittest.skipUnless(os.access in os.supports_dir_fd, "test needs dir_fd support for os.access()")
937 def test_access_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000938 f = posix.open(posix.getcwd(), posix.O_RDONLY)
939 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700940 self.assertTrue(posix.access(support.TESTFN, os.R_OK, dir_fd=f))
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000941 finally:
942 posix.close(f)
943
Larry Hastings9cf065c2012-06-22 16:30:09 -0700944 @unittest.skipUnless(os.chmod in os.supports_dir_fd, "test needs dir_fd support in os.chmod()")
945 def test_chmod_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000946 os.chmod(support.TESTFN, stat.S_IRUSR)
947
948 f = posix.open(posix.getcwd(), posix.O_RDONLY)
949 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700950 posix.chmod(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000951
952 s = posix.stat(support.TESTFN)
953 self.assertEqual(s[0] & stat.S_IRWXU, stat.S_IRUSR | stat.S_IWUSR)
954 finally:
955 posix.close(f)
956
Larry Hastings9cf065c2012-06-22 16:30:09 -0700957 @unittest.skipUnless(os.chown in os.supports_dir_fd, "test needs dir_fd support in os.chown()")
958 def test_chown_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000959 support.unlink(support.TESTFN)
Victor Stinnerbf816222011-06-30 23:25:47 +0200960 support.create_empty_file(support.TESTFN)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000961
962 f = posix.open(posix.getcwd(), posix.O_RDONLY)
963 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700964 posix.chown(support.TESTFN, os.getuid(), os.getgid(), dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000965 finally:
966 posix.close(f)
967
Larry Hastings9cf065c2012-06-22 16:30:09 -0700968 @unittest.skipUnless(os.stat in os.supports_dir_fd, "test needs dir_fd support in os.stat()")
969 def test_stat_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000970 support.unlink(support.TESTFN)
971 with open(support.TESTFN, 'w') as outfile:
972 outfile.write("testline\n")
973
974 f = posix.open(posix.getcwd(), posix.O_RDONLY)
975 try:
976 s1 = posix.stat(support.TESTFN)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700977 s2 = posix.stat(support.TESTFN, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000978 self.assertEqual(s1, s2)
Serhiy Storchakaa2ad5c32013-01-07 23:13:46 +0200979 s2 = posix.stat(support.TESTFN, dir_fd=None)
980 self.assertEqual(s1, s2)
Serhiy Storchaka7155b882016-04-08 08:48:20 +0300981 self.assertRaisesRegex(TypeError, 'should be integer or None, not',
Serhiy Storchakaa2ad5c32013-01-07 23:13:46 +0200982 posix.stat, support.TESTFN, dir_fd=posix.getcwd())
Serhiy Storchaka7155b882016-04-08 08:48:20 +0300983 self.assertRaisesRegex(TypeError, 'should be integer or None, not',
Serhiy Storchakaa2ad5c32013-01-07 23:13:46 +0200984 posix.stat, support.TESTFN, dir_fd=float(f))
985 self.assertRaises(OverflowError,
986 posix.stat, support.TESTFN, dir_fd=10**20)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000987 finally:
988 posix.close(f)
989
Larry Hastings9cf065c2012-06-22 16:30:09 -0700990 @unittest.skipUnless(os.utime in os.supports_dir_fd, "test needs dir_fd support in os.utime()")
991 def test_utime_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000992 f = posix.open(posix.getcwd(), posix.O_RDONLY)
993 try:
994 now = time.time()
Larry Hastings9cf065c2012-06-22 16:30:09 -0700995 posix.utime(support.TESTFN, None, dir_fd=f)
996 posix.utime(support.TESTFN, dir_fd=f)
997 self.assertRaises(TypeError, posix.utime, support.TESTFN, now, dir_fd=f)
998 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None), dir_fd=f)
999 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None), dir_fd=f)
1000 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now), dir_fd=f)
1001 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, "x"), dir_fd=f)
1002 posix.utime(support.TESTFN, (int(now), int(now)), dir_fd=f)
1003 posix.utime(support.TESTFN, (now, now), dir_fd=f)
1004 posix.utime(support.TESTFN,
1005 (int(now), int((now - int(now)) * 1e9)), dir_fd=f)
1006 posix.utime(support.TESTFN, dir_fd=f,
1007 times=(int(now), int((now - int(now)) * 1e9)))
1008
Larry Hastings90867a52012-06-22 17:01:41 -07001009 # try dir_fd and follow_symlinks together
Larry Hastings9cf065c2012-06-22 16:30:09 -07001010 if os.utime in os.supports_follow_symlinks:
Larry Hastings90867a52012-06-22 17:01:41 -07001011 try:
1012 posix.utime(support.TESTFN, follow_symlinks=False, dir_fd=f)
Georg Brandl969288e2012-06-26 09:25:44 +02001013 except ValueError:
Larry Hastings90867a52012-06-22 17:01:41 -07001014 # whoops! using both together not supported on this platform.
1015 pass
Larry Hastings9cf065c2012-06-22 16:30:09 -07001016
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001017 finally:
1018 posix.close(f)
1019
Larry Hastings9cf065c2012-06-22 16:30:09 -07001020 @unittest.skipUnless(os.link in os.supports_dir_fd, "test needs dir_fd support in os.link()")
Xavier de Gaye3a4e9892016-12-13 10:00:01 +01001021 @unittest.skipIf(android_not_root, "hard link not allowed, non root user")
Larry Hastings9cf065c2012-06-22 16:30:09 -07001022 def test_link_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001023 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1024 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -07001025 posix.link(support.TESTFN, support.TESTFN + 'link', src_dir_fd=f, dst_dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001026 # should have same inodes
1027 self.assertEqual(posix.stat(support.TESTFN)[1],
1028 posix.stat(support.TESTFN + 'link')[1])
1029 finally:
1030 posix.close(f)
1031 support.unlink(support.TESTFN + 'link')
1032
Larry Hastings9cf065c2012-06-22 16:30:09 -07001033 @unittest.skipUnless(os.mkdir in os.supports_dir_fd, "test needs dir_fd support in os.mkdir()")
1034 def test_mkdir_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001035 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1036 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -07001037 posix.mkdir(support.TESTFN + 'dir', dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001038 posix.stat(support.TESTFN + 'dir') # should not raise exception
1039 finally:
1040 posix.close(f)
1041 support.rmtree(support.TESTFN + 'dir')
1042
Larry Hastings9cf065c2012-06-22 16:30:09 -07001043 @unittest.skipUnless((os.mknod in os.supports_dir_fd) and hasattr(stat, 'S_IFIFO'),
1044 "test requires both stat.S_IFIFO and dir_fd support for os.mknod()")
Xavier de Gaye3a4e9892016-12-13 10:00:01 +01001045 @unittest.skipIf(android_not_root, "mknod not allowed, non root user")
Larry Hastings9cf065c2012-06-22 16:30:09 -07001046 def test_mknod_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001047 # Test using mknodat() to create a FIFO (the only use specified
1048 # by POSIX).
1049 support.unlink(support.TESTFN)
1050 mode = stat.S_IFIFO | stat.S_IRUSR | stat.S_IWUSR
1051 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1052 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -07001053 posix.mknod(support.TESTFN, mode, 0, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001054 except OSError as e:
1055 # Some old systems don't allow unprivileged users to use
1056 # mknod(), or only support creating device nodes.
1057 self.assertIn(e.errno, (errno.EPERM, errno.EINVAL))
1058 else:
1059 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
1060 finally:
1061 posix.close(f)
1062
Larry Hastings9cf065c2012-06-22 16:30:09 -07001063 @unittest.skipUnless(os.open in os.supports_dir_fd, "test needs dir_fd support in os.open()")
1064 def test_open_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001065 support.unlink(support.TESTFN)
1066 with open(support.TESTFN, 'w') as outfile:
1067 outfile.write("testline\n")
1068 a = posix.open(posix.getcwd(), posix.O_RDONLY)
Larry Hastings9cf065c2012-06-22 16:30:09 -07001069 b = posix.open(support.TESTFN, posix.O_RDONLY, dir_fd=a)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001070 try:
1071 res = posix.read(b, 9).decode(encoding="utf-8")
1072 self.assertEqual("testline\n", res)
1073 finally:
1074 posix.close(a)
1075 posix.close(b)
1076
Larry Hastings9cf065c2012-06-22 16:30:09 -07001077 @unittest.skipUnless(os.readlink in os.supports_dir_fd, "test needs dir_fd support in os.readlink()")
1078 def test_readlink_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001079 os.symlink(support.TESTFN, support.TESTFN + 'link')
1080 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1081 try:
1082 self.assertEqual(posix.readlink(support.TESTFN + 'link'),
Larry Hastings9cf065c2012-06-22 16:30:09 -07001083 posix.readlink(support.TESTFN + 'link', dir_fd=f))
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001084 finally:
1085 support.unlink(support.TESTFN + 'link')
1086 posix.close(f)
1087
Larry Hastings9cf065c2012-06-22 16:30:09 -07001088 @unittest.skipUnless(os.rename in os.supports_dir_fd, "test needs dir_fd support in os.rename()")
1089 def test_rename_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001090 support.unlink(support.TESTFN)
Victor Stinnerbf816222011-06-30 23:25:47 +02001091 support.create_empty_file(support.TESTFN + 'ren')
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001092 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1093 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -07001094 posix.rename(support.TESTFN + 'ren', support.TESTFN, src_dir_fd=f, dst_dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001095 except:
1096 posix.rename(support.TESTFN + 'ren', support.TESTFN)
1097 raise
1098 else:
Andrew Svetlov5b898402012-12-18 21:26:36 +02001099 posix.stat(support.TESTFN) # should not raise exception
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001100 finally:
1101 posix.close(f)
1102
Larry Hastings9cf065c2012-06-22 16:30:09 -07001103 @unittest.skipUnless(os.symlink in os.supports_dir_fd, "test needs dir_fd support in os.symlink()")
1104 def test_symlink_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001105 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1106 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -07001107 posix.symlink(support.TESTFN, support.TESTFN + 'link', dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001108 self.assertEqual(posix.readlink(support.TESTFN + 'link'), support.TESTFN)
1109 finally:
1110 posix.close(f)
1111 support.unlink(support.TESTFN + 'link')
1112
Larry Hastings9cf065c2012-06-22 16:30:09 -07001113 @unittest.skipUnless(os.unlink in os.supports_dir_fd, "test needs dir_fd support in os.unlink()")
1114 def test_unlink_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001115 f = posix.open(posix.getcwd(), posix.O_RDONLY)
Victor Stinnerbf816222011-06-30 23:25:47 +02001116 support.create_empty_file(support.TESTFN + 'del')
Andrew Svetlov5b898402012-12-18 21:26:36 +02001117 posix.stat(support.TESTFN + 'del') # should not raise exception
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001118 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -07001119 posix.unlink(support.TESTFN + 'del', dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001120 except:
1121 support.unlink(support.TESTFN + 'del')
1122 raise
1123 else:
1124 self.assertRaises(OSError, posix.stat, support.TESTFN + 'link')
1125 finally:
1126 posix.close(f)
1127
Larry Hastings9cf065c2012-06-22 16:30:09 -07001128 @unittest.skipUnless(os.mkfifo in os.supports_dir_fd, "test needs dir_fd support in os.mkfifo()")
Xavier de Gaye3a4e9892016-12-13 10:00:01 +01001129 @unittest.skipIf(android_not_root, "mkfifo not allowed, non root user")
Larry Hastings9cf065c2012-06-22 16:30:09 -07001130 def test_mkfifo_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001131 support.unlink(support.TESTFN)
1132 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1133 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -07001134 posix.mkfifo(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001135 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
1136 finally:
1137 posix.close(f)
1138
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001139 requires_sched_h = unittest.skipUnless(hasattr(posix, 'sched_yield'),
1140 "don't have scheduling support")
Antoine Pitrou84869872012-08-04 16:16:35 +02001141 requires_sched_affinity = unittest.skipUnless(hasattr(posix, 'sched_setaffinity'),
Benjamin Peterson50ba2712011-08-02 22:15:40 -05001142 "don't have sched affinity support")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001143
1144 @requires_sched_h
1145 def test_sched_yield(self):
1146 # This has no error conditions (at least on Linux).
1147 posix.sched_yield()
1148
1149 @requires_sched_h
Charles-François Nataliea0d5fc2011-09-06 19:03:35 +02001150 @unittest.skipUnless(hasattr(posix, 'sched_get_priority_max'),
1151 "requires sched_get_priority_max()")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001152 def test_sched_priority(self):
1153 # Round-robin usually has interesting priorities.
1154 pol = posix.SCHED_RR
1155 lo = posix.sched_get_priority_min(pol)
1156 hi = posix.sched_get_priority_max(pol)
1157 self.assertIsInstance(lo, int)
1158 self.assertIsInstance(hi, int)
1159 self.assertGreaterEqual(hi, lo)
Benjamin Peterson539b6c42011-08-02 22:09:37 -05001160 # OSX evidently just returns 15 without checking the argument.
1161 if sys.platform != "darwin":
Benjamin Petersonc1581582011-08-02 22:10:55 -05001162 self.assertRaises(OSError, posix.sched_get_priority_min, -23)
1163 self.assertRaises(OSError, posix.sched_get_priority_max, -23)
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001164
Benjamin Petersonc5fce4d2011-08-02 18:07:32 -05001165 @unittest.skipUnless(hasattr(posix, 'sched_setscheduler'), "can't change scheduler")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001166 def test_get_and_set_scheduler_and_param(self):
1167 possible_schedulers = [sched for name, sched in posix.__dict__.items()
1168 if name.startswith("SCHED_")]
1169 mine = posix.sched_getscheduler(0)
1170 self.assertIn(mine, possible_schedulers)
1171 try:
Jesus Ceaceb5d162011-09-10 01:16:55 +02001172 parent = posix.sched_getscheduler(os.getppid())
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001173 except OSError as e:
Jesus Ceaceb5d162011-09-10 01:16:55 +02001174 if e.errno != errno.EPERM:
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001175 raise
1176 else:
Jesus Ceaceb5d162011-09-10 01:16:55 +02001177 self.assertIn(parent, possible_schedulers)
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001178 self.assertRaises(OSError, posix.sched_getscheduler, -1)
1179 self.assertRaises(OSError, posix.sched_getparam, -1)
1180 param = posix.sched_getparam(0)
1181 self.assertIsInstance(param.sched_priority, int)
Charles-François Natali7b911cb2011-08-21 12:41:43 +02001182
Charles-François Natalib402a5c2013-01-13 14:13:25 +01001183 # POSIX states that calling sched_setparam() or sched_setscheduler() on
1184 # a process with a scheduling policy other than SCHED_FIFO or SCHED_RR
1185 # is implementation-defined: NetBSD and FreeBSD can return EINVAL.
1186 if not sys.platform.startswith(('freebsd', 'netbsd')):
1187 try:
1188 posix.sched_setscheduler(0, mine, param)
1189 posix.sched_setparam(0, param)
1190 except OSError as e:
1191 if e.errno != errno.EPERM:
1192 raise
Charles-François Natali7b911cb2011-08-21 12:41:43 +02001193 self.assertRaises(OSError, posix.sched_setparam, -1, param)
1194
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001195 self.assertRaises(OSError, posix.sched_setscheduler, -1, mine, param)
1196 self.assertRaises(TypeError, posix.sched_setscheduler, 0, mine, None)
1197 self.assertRaises(TypeError, posix.sched_setparam, 0, 43)
1198 param = posix.sched_param(None)
1199 self.assertRaises(TypeError, posix.sched_setparam, 0, param)
1200 large = 214748364700
1201 param = posix.sched_param(large)
1202 self.assertRaises(OverflowError, posix.sched_setparam, 0, param)
1203 param = posix.sched_param(sched_priority=-large)
1204 self.assertRaises(OverflowError, posix.sched_setparam, 0, param)
1205
Benjamin Petersonc5fce4d2011-08-02 18:07:32 -05001206 @unittest.skipUnless(hasattr(posix, "sched_rr_get_interval"), "no function")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001207 def test_sched_rr_get_interval(self):
Benjamin Peterson43234ab2011-08-02 22:19:14 -05001208 try:
1209 interval = posix.sched_rr_get_interval(0)
1210 except OSError as e:
1211 # This likely means that sched_rr_get_interval is only valid for
1212 # processes with the SCHED_RR scheduler in effect.
1213 if e.errno != errno.EINVAL:
1214 raise
1215 self.skipTest("only works on SCHED_RR processes")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001216 self.assertIsInstance(interval, float)
1217 # Reasonable constraints, I think.
1218 self.assertGreaterEqual(interval, 0.)
1219 self.assertLess(interval, 1.)
1220
Benjamin Peterson2740af82011-08-02 17:41:34 -05001221 @requires_sched_affinity
Antoine Pitrou84869872012-08-04 16:16:35 +02001222 def test_sched_getaffinity(self):
1223 mask = posix.sched_getaffinity(0)
1224 self.assertIsInstance(mask, set)
1225 self.assertGreaterEqual(len(mask), 1)
1226 self.assertRaises(OSError, posix.sched_getaffinity, -1)
1227 for cpu in mask:
1228 self.assertIsInstance(cpu, int)
1229 self.assertGreaterEqual(cpu, 0)
1230 self.assertLess(cpu, 1 << 32)
1231
1232 @requires_sched_affinity
1233 def test_sched_setaffinity(self):
1234 mask = posix.sched_getaffinity(0)
1235 if len(mask) > 1:
1236 # Empty masks are forbidden
1237 mask.pop()
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001238 posix.sched_setaffinity(0, mask)
Antoine Pitrou84869872012-08-04 16:16:35 +02001239 self.assertEqual(posix.sched_getaffinity(0), mask)
1240 self.assertRaises(OSError, posix.sched_setaffinity, 0, [])
1241 self.assertRaises(ValueError, posix.sched_setaffinity, 0, [-10])
1242 self.assertRaises(OverflowError, posix.sched_setaffinity, 0, [1<<128])
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001243 self.assertRaises(OSError, posix.sched_setaffinity, -1, mask)
1244
Victor Stinner8b905bd2011-10-25 13:34:04 +02001245 def test_rtld_constants(self):
1246 # check presence of major RTLD_* constants
1247 posix.RTLD_LAZY
1248 posix.RTLD_NOW
1249 posix.RTLD_GLOBAL
1250 posix.RTLD_LOCAL
1251
Jesus Cea60c13dd2012-06-23 02:58:14 +02001252 @unittest.skipUnless(hasattr(os, 'SEEK_HOLE'),
1253 "test needs an OS that reports file holes")
Hynek Schlawackf841e422012-06-24 09:51:46 +02001254 def test_fs_holes(self):
Jesus Cea94363612012-06-22 18:32:07 +02001255 # Even if the filesystem doesn't report holes,
1256 # if the OS supports it the SEEK_* constants
1257 # will be defined and will have a consistent
1258 # behaviour:
1259 # os.SEEK_DATA = current position
1260 # os.SEEK_HOLE = end of file position
Hynek Schlawackf841e422012-06-24 09:51:46 +02001261 with open(support.TESTFN, 'r+b') as fp:
Jesus Cea94363612012-06-22 18:32:07 +02001262 fp.write(b"hello")
1263 fp.flush()
1264 size = fp.tell()
1265 fno = fp.fileno()
Jesus Cead46f7d22012-07-07 14:56:04 +02001266 try :
1267 for i in range(size):
1268 self.assertEqual(i, os.lseek(fno, i, os.SEEK_DATA))
1269 self.assertLessEqual(size, os.lseek(fno, i, os.SEEK_HOLE))
1270 self.assertRaises(OSError, os.lseek, fno, size, os.SEEK_DATA)
1271 self.assertRaises(OSError, os.lseek, fno, size, os.SEEK_HOLE)
1272 except OSError :
1273 # Some OSs claim to support SEEK_HOLE/SEEK_DATA
1274 # but it is not true.
1275 # For instance:
1276 # http://lists.freebsd.org/pipermail/freebsd-amd64/2012-January/014332.html
1277 raise unittest.SkipTest("OSError raised!")
Jesus Cea94363612012-06-22 18:32:07 +02001278
Larry Hastingsb0827312014-02-09 22:05:19 -08001279 def test_path_error2(self):
1280 """
1281 Test functions that call path_error2(), providing two filenames in their exceptions.
1282 """
Victor Stinner047b7ae2014-10-05 17:37:41 +02001283 for name in ("rename", "replace", "link"):
Larry Hastingsb0827312014-02-09 22:05:19 -08001284 function = getattr(os, name, None)
Victor Stinnerbed04a72014-10-05 17:37:59 +02001285 if function is None:
1286 continue
Larry Hastingsb0827312014-02-09 22:05:19 -08001287
Victor Stinnerbed04a72014-10-05 17:37:59 +02001288 for dst in ("noodly2", support.TESTFN):
1289 try:
1290 function('doesnotexistfilename', dst)
1291 except OSError as e:
1292 self.assertIn("'doesnotexistfilename' -> '{}'".format(dst), str(e))
1293 break
1294 else:
1295 self.fail("No valid path_error2() test for os." + name)
Larry Hastingsb0827312014-02-09 22:05:19 -08001296
Serhiy Storchaka2b0d2002015-04-20 09:53:58 +03001297 def test_path_with_null_character(self):
1298 fn = support.TESTFN
1299 fn_with_NUL = fn + '\0'
1300 self.addCleanup(support.unlink, fn)
1301 support.unlink(fn)
1302 fd = None
1303 try:
Serhiy Storchaka7e9d1d12015-04-20 10:12:28 +03001304 with self.assertRaises(ValueError):
Serhiy Storchaka2b0d2002015-04-20 09:53:58 +03001305 fd = os.open(fn_with_NUL, os.O_WRONLY | os.O_CREAT) # raises
1306 finally:
1307 if fd is not None:
1308 os.close(fd)
1309 self.assertFalse(os.path.exists(fn))
Serhiy Storchaka7e9d1d12015-04-20 10:12:28 +03001310 self.assertRaises(ValueError, os.mkdir, fn_with_NUL)
Serhiy Storchaka2b0d2002015-04-20 09:53:58 +03001311 self.assertFalse(os.path.exists(fn))
1312 open(fn, 'wb').close()
Serhiy Storchaka7e9d1d12015-04-20 10:12:28 +03001313 self.assertRaises(ValueError, os.stat, fn_with_NUL)
Serhiy Storchaka2b0d2002015-04-20 09:53:58 +03001314
1315 def test_path_with_null_byte(self):
1316 fn = os.fsencode(support.TESTFN)
1317 fn_with_NUL = fn + b'\0'
1318 self.addCleanup(support.unlink, fn)
1319 support.unlink(fn)
1320 fd = None
1321 try:
1322 with self.assertRaises(ValueError):
1323 fd = os.open(fn_with_NUL, os.O_WRONLY | os.O_CREAT) # raises
1324 finally:
1325 if fd is not None:
1326 os.close(fd)
1327 self.assertFalse(os.path.exists(fn))
1328 self.assertRaises(ValueError, os.mkdir, fn_with_NUL)
1329 self.assertFalse(os.path.exists(fn))
1330 open(fn, 'wb').close()
1331 self.assertRaises(ValueError, os.stat, fn_with_NUL)
1332
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001333class PosixGroupsTester(unittest.TestCase):
1334
1335 def setUp(self):
1336 if posix.getuid() != 0:
1337 raise unittest.SkipTest("not enough privileges")
1338 if not hasattr(posix, 'getgroups'):
1339 raise unittest.SkipTest("need posix.getgroups")
1340 if sys.platform == 'darwin':
1341 raise unittest.SkipTest("getgroups(2) is broken on OSX")
1342 self.saved_groups = posix.getgroups()
1343
1344 def tearDown(self):
1345 if hasattr(posix, 'setgroups'):
1346 posix.setgroups(self.saved_groups)
1347 elif hasattr(posix, 'initgroups'):
1348 name = pwd.getpwuid(posix.getuid()).pw_name
1349 posix.initgroups(name, self.saved_groups[0])
1350
1351 @unittest.skipUnless(hasattr(posix, 'initgroups'),
1352 "test needs posix.initgroups()")
1353 def test_initgroups(self):
1354 # find missing group
1355
Benjamin Peterson659a6f52014-03-01 19:14:12 -05001356 g = max(self.saved_groups or [0]) + 1
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001357 name = pwd.getpwuid(posix.getuid()).pw_name
1358 posix.initgroups(name, g)
1359 self.assertIn(g, posix.getgroups())
1360
1361 @unittest.skipUnless(hasattr(posix, 'setgroups'),
1362 "test needs posix.setgroups()")
1363 def test_setgroups(self):
Antoine Pitroue5a91012010-09-04 17:32:06 +00001364 for groups in [[0], list(range(16))]:
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001365 posix.setgroups(groups)
1366 self.assertListEqual(groups, posix.getgroups())
1367
Neal Norwitze241ce82003-02-17 18:17:05 +00001368def test_main():
Antoine Pitrou68c95922011-03-20 17:33:57 +01001369 try:
1370 support.run_unittest(PosixTester, PosixGroupsTester)
1371 finally:
1372 support.reap_children()
Neal Norwitze241ce82003-02-17 18:17:05 +00001373
1374if __name__ == '__main__':
1375 test_main()