blob: 8ada0e3ab3c7d6645ae367546a807fc4f7eb00db [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
R. David Murrayeb3615d2009-04-22 02:24:39 +00005
6# Skip these tests if there is no posix module.
7posix = support.import_module('posix')
Neal Norwitze241ce82003-02-17 18:17:05 +00008
Antoine Pitroub7572f02009-12-02 20:46:48 +00009import errno
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +000010import sys
Neal Norwitze241ce82003-02-17 18:17:05 +000011import time
12import os
Charles-François Nataliab2d58e2012-04-17 19:48:35 +020013import platform
Christian Heimesd5e2b6f2008-03-19 21:50:51 +000014import pwd
Benjamin Peterson052a02b2010-08-17 01:27:09 +000015import stat
Ned Deilyba2eab22011-07-26 13:53:55 -070016import tempfile
Neal Norwitze241ce82003-02-17 18:17:05 +000017import unittest
18import warnings
R. David Murraya21e4ca2009-03-31 23:16:50 +000019
Ned Deilyba2eab22011-07-26 13:53:55 -070020_DUMMY_SYMLINK = os.path.join(tempfile.gettempdir(),
21 support.TESTFN + '-dummy-symlink')
Neal Norwitze241ce82003-02-17 18:17:05 +000022
23class PosixTester(unittest.TestCase):
24
25 def setUp(self):
26 # create empty file
Benjamin Petersonee8712c2008-05-20 21:35:26 +000027 fp = open(support.TESTFN, 'w+')
Neal Norwitze241ce82003-02-17 18:17:05 +000028 fp.close()
Ned Deily3eb67d52011-06-28 00:00:28 -070029 self.teardown_files = [ support.TESTFN ]
Brett Cannonc8d502e2010-03-20 21:53:28 +000030 self._warnings_manager = support.check_warnings()
31 self._warnings_manager.__enter__()
32 warnings.filterwarnings('ignore', '.* potential security risk .*',
33 RuntimeWarning)
Neal Norwitze241ce82003-02-17 18:17:05 +000034
35 def tearDown(self):
Ned Deily3eb67d52011-06-28 00:00:28 -070036 for teardown_file in self.teardown_files:
37 support.unlink(teardown_file)
Brett Cannonc8d502e2010-03-20 21:53:28 +000038 self._warnings_manager.__exit__(None, None, None)
Neal Norwitze241ce82003-02-17 18:17:05 +000039
40 def testNoArgFunctions(self):
41 # test posix functions which take no arguments and have
42 # no side-effects which we need to cleanup (e.g., fork, wait, abort)
Guido van Rossumf0af3e32008-10-02 18:55:37 +000043 NO_ARG_FUNCTIONS = [ "ctermid", "getcwd", "getcwdb", "uname",
Guido van Rossum687b9c02007-10-25 23:18:51 +000044 "times", "getloadavg",
Neal Norwitze241ce82003-02-17 18:17:05 +000045 "getegid", "geteuid", "getgid", "getgroups",
Ross Lagerwall7807c352011-03-17 20:20:30 +020046 "getpid", "getpgrp", "getppid", "getuid", "sync",
Neal Norwitze241ce82003-02-17 18:17:05 +000047 ]
Neal Norwitz71b13e82003-02-23 22:12:24 +000048
Neal Norwitze241ce82003-02-17 18:17:05 +000049 for name in NO_ARG_FUNCTIONS:
50 posix_func = getattr(posix, name, None)
51 if posix_func is not None:
52 posix_func()
Neal Norwitz2ff51a82003-02-17 22:40:31 +000053 self.assertRaises(TypeError, posix_func, 1)
Neal Norwitze241ce82003-02-17 18:17:05 +000054
Serhiy Storchaka43767632013-11-03 21:31:38 +020055 @unittest.skipUnless(hasattr(posix, 'getresuid'),
56 'test needs posix.getresuid()')
57 def test_getresuid(self):
58 user_ids = posix.getresuid()
59 self.assertEqual(len(user_ids), 3)
60 for val in user_ids:
61 self.assertGreaterEqual(val, 0)
Martin v. Löwis7aed61a2009-11-27 14:09:49 +000062
Serhiy Storchaka43767632013-11-03 21:31:38 +020063 @unittest.skipUnless(hasattr(posix, 'getresgid'),
64 'test needs posix.getresgid()')
65 def test_getresgid(self):
66 group_ids = posix.getresgid()
67 self.assertEqual(len(group_ids), 3)
68 for val in group_ids:
69 self.assertGreaterEqual(val, 0)
Martin v. Löwis7aed61a2009-11-27 14:09:49 +000070
Serhiy Storchaka43767632013-11-03 21:31:38 +020071 @unittest.skipUnless(hasattr(posix, 'setresuid'),
72 'test needs posix.setresuid()')
73 def test_setresuid(self):
74 current_user_ids = posix.getresuid()
75 self.assertIsNone(posix.setresuid(*current_user_ids))
76 # -1 means don't change that value.
77 self.assertIsNone(posix.setresuid(-1, -1, -1))
Martin v. Löwis7aed61a2009-11-27 14:09:49 +000078
Serhiy Storchaka43767632013-11-03 21:31:38 +020079 @unittest.skipUnless(hasattr(posix, 'setresuid'),
80 'test needs posix.setresuid()')
81 def test_setresuid_exception(self):
82 # Don't do this test if someone is silly enough to run us as root.
83 current_user_ids = posix.getresuid()
84 if 0 not in current_user_ids:
85 new_user_ids = (current_user_ids[0]+1, -1, -1)
86 self.assertRaises(OSError, posix.setresuid, *new_user_ids)
Martin v. Löwis7aed61a2009-11-27 14:09:49 +000087
Serhiy Storchaka43767632013-11-03 21:31:38 +020088 @unittest.skipUnless(hasattr(posix, 'setresgid'),
89 'test needs posix.setresgid()')
90 def test_setresgid(self):
91 current_group_ids = posix.getresgid()
92 self.assertIsNone(posix.setresgid(*current_group_ids))
93 # -1 means don't change that value.
94 self.assertIsNone(posix.setresgid(-1, -1, -1))
Martin v. Löwis7aed61a2009-11-27 14:09:49 +000095
Serhiy Storchaka43767632013-11-03 21:31:38 +020096 @unittest.skipUnless(hasattr(posix, 'setresgid'),
97 'test needs posix.setresgid()')
98 def test_setresgid_exception(self):
99 # Don't do this test if someone is silly enough to run us as root.
100 current_group_ids = posix.getresgid()
101 if 0 not in current_group_ids:
102 new_group_ids = (current_group_ids[0]+1, -1, -1)
103 self.assertRaises(OSError, posix.setresgid, *new_group_ids)
Martin v. Löwis7aed61a2009-11-27 14:09:49 +0000104
Antoine Pitroub7572f02009-12-02 20:46:48 +0000105 @unittest.skipUnless(hasattr(posix, 'initgroups'),
106 "test needs os.initgroups()")
107 def test_initgroups(self):
108 # It takes a string and an integer; check that it raises a TypeError
109 # for other argument lists.
110 self.assertRaises(TypeError, posix.initgroups)
111 self.assertRaises(TypeError, posix.initgroups, None)
112 self.assertRaises(TypeError, posix.initgroups, 3, "foo")
113 self.assertRaises(TypeError, posix.initgroups, "foo", 3, object())
114
115 # If a non-privileged user invokes it, it should fail with OSError
116 # EPERM.
117 if os.getuid() != 0:
Charles-François Natalie8a255a2012-05-02 20:01:38 +0200118 try:
119 name = pwd.getpwuid(posix.getuid()).pw_name
120 except KeyError:
121 # the current UID may not have a pwd entry
122 raise unittest.SkipTest("need a pwd entry")
Antoine Pitroub7572f02009-12-02 20:46:48 +0000123 try:
124 posix.initgroups(name, 13)
125 except OSError as e:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000126 self.assertEqual(e.errno, errno.EPERM)
Antoine Pitroub7572f02009-12-02 20:46:48 +0000127 else:
128 self.fail("Expected OSError to be raised by initgroups")
129
Serhiy Storchaka43767632013-11-03 21:31:38 +0200130 @unittest.skipUnless(hasattr(posix, 'statvfs'),
131 'test needs posix.statvfs()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000132 def test_statvfs(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200133 self.assertTrue(posix.statvfs(os.curdir))
Neal Norwitze241ce82003-02-17 18:17:05 +0000134
Serhiy Storchaka43767632013-11-03 21:31:38 +0200135 @unittest.skipUnless(hasattr(posix, 'fstatvfs'),
136 'test needs posix.fstatvfs()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000137 def test_fstatvfs(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200138 fp = open(support.TESTFN)
139 try:
140 self.assertTrue(posix.fstatvfs(fp.fileno()))
141 self.assertTrue(posix.statvfs(fp.fileno()))
142 finally:
143 fp.close()
Neal Norwitze241ce82003-02-17 18:17:05 +0000144
Serhiy Storchaka43767632013-11-03 21:31:38 +0200145 @unittest.skipUnless(hasattr(posix, 'ftruncate'),
146 'test needs posix.ftruncate()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000147 def test_ftruncate(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200148 fp = open(support.TESTFN, 'w+')
149 try:
150 # we need to have some data to truncate
151 fp.write('test')
152 fp.flush()
153 posix.ftruncate(fp.fileno(), 0)
154 finally:
155 fp.close()
Neal Norwitze241ce82003-02-17 18:17:05 +0000156
Ross Lagerwall7807c352011-03-17 20:20:30 +0200157 @unittest.skipUnless(hasattr(posix, 'truncate'), "test needs posix.truncate()")
158 def test_truncate(self):
159 with open(support.TESTFN, 'w') as fp:
160 fp.write('test')
161 fp.flush()
162 posix.truncate(support.TESTFN, 0)
163
Larry Hastings9cf065c2012-06-22 16:30:09 -0700164 @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 +0200165 @unittest.skipUnless(hasattr(os, 'fork'), "test needs os.fork()")
Ross Lagerwalldedf6cf2011-03-20 18:27:05 +0200166 @unittest.skipUnless(hasattr(os, 'waitpid'), "test needs os.waitpid()")
Ross Lagerwall7807c352011-03-17 20:20:30 +0200167 def test_fexecve(self):
168 fp = os.open(sys.executable, os.O_RDONLY)
169 try:
170 pid = os.fork()
171 if pid == 0:
172 os.chdir(os.path.split(sys.executable)[0])
Larry Hastings9cf065c2012-06-22 16:30:09 -0700173 posix.execve(fp, [sys.executable, '-c', 'pass'], os.environ)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200174 else:
Ross Lagerwalldedf6cf2011-03-20 18:27:05 +0200175 self.assertEqual(os.waitpid(pid, 0), (pid, 0))
Ross Lagerwall7807c352011-03-17 20:20:30 +0200176 finally:
177 os.close(fp)
178
Pablo Galindo6c6ddf92018-01-29 01:56:10 +0000179
180 @unittest.skipUnless(hasattr(os, 'posix_spawn'), "test needs os.posix_spawn")
181 def test_posix_spawn(self):
182 pid = posix.posix_spawn(sys.executable, [sys.executable, "-c", "pass"], os.environ,[])
183 self.assertEqual(os.waitpid(pid,0),(pid,0))
184
185
186 @unittest.skipUnless(hasattr(os, 'posix_spawn'), "test needs os.posix_spawn")
187 def test_posix_spawn_file_actions(self):
188 file_actions = []
189 file_actions.append((0,3,os.path.realpath(__file__),0,0))
190 file_actions.append((os.POSIX_SPAWN_CLOSE,2))
191 file_actions.append((os.POSIX_SPAWN_DUP2,1,4))
192 pid = posix.posix_spawn(sys.executable, [sys.executable, "-c", "pass"], os.environ, file_actions)
193 self.assertEqual(os.waitpid(pid,0),(pid,0))
194
195
Ross Lagerwall7807c352011-03-17 20:20:30 +0200196 @unittest.skipUnless(hasattr(posix, 'waitid'), "test needs posix.waitid()")
197 @unittest.skipUnless(hasattr(os, 'fork'), "test needs os.fork()")
198 def test_waitid(self):
199 pid = os.fork()
200 if pid == 0:
201 os.chdir(os.path.split(sys.executable)[0])
202 posix.execve(sys.executable, [sys.executable, '-c', 'pass'], os.environ)
203 else:
204 res = posix.waitid(posix.P_PID, pid, posix.WEXITED)
205 self.assertEqual(pid, res.si_pid)
206
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200207 @unittest.skipUnless(hasattr(os, 'fork'), "test needs os.fork()")
Gregory P. Smith163468a2017-05-29 10:03:41 -0700208 def test_register_at_fork(self):
209 with self.assertRaises(TypeError, msg="Positional args not allowed"):
210 os.register_at_fork(lambda: None)
211 with self.assertRaises(TypeError, msg="Args must be callable"):
212 os.register_at_fork(before=2)
213 with self.assertRaises(TypeError, msg="Args must be callable"):
214 os.register_at_fork(after_in_child="three")
215 with self.assertRaises(TypeError, msg="Args must be callable"):
216 os.register_at_fork(after_in_parent=b"Five")
217 with self.assertRaises(TypeError, msg="Args must not be None"):
218 os.register_at_fork(before=None)
219 with self.assertRaises(TypeError, msg="Args must not be None"):
220 os.register_at_fork(after_in_child=None)
221 with self.assertRaises(TypeError, msg="Args must not be None"):
222 os.register_at_fork(after_in_parent=None)
223 with self.assertRaises(TypeError, msg="Invalid arg was allowed"):
224 # Ensure a combination of valid and invalid is an error.
225 os.register_at_fork(before=None, after_in_parent=lambda: 3)
226 with self.assertRaises(TypeError, msg="Invalid arg was allowed"):
227 # Ensure a combination of valid and invalid is an error.
228 os.register_at_fork(before=lambda: None, after_in_child='')
229 # We test actual registrations in their own process so as not to
230 # pollute this one. There is no way to unregister for cleanup.
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200231 code = """if 1:
232 import os
233
234 r, w = os.pipe()
235 fin_r, fin_w = os.pipe()
236
Gregory P. Smith163468a2017-05-29 10:03:41 -0700237 os.register_at_fork(before=lambda: os.write(w, b'A'))
238 os.register_at_fork(after_in_parent=lambda: os.write(w, b'C'))
239 os.register_at_fork(after_in_child=lambda: os.write(w, b'E'))
240 os.register_at_fork(before=lambda: os.write(w, b'B'),
241 after_in_parent=lambda: os.write(w, b'D'),
242 after_in_child=lambda: os.write(w, b'F'))
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200243
244 pid = os.fork()
245 if pid == 0:
246 # At this point, after-forkers have already been executed
247 os.close(w)
248 # Wait for parent to tell us to exit
249 os.read(fin_r, 1)
250 os._exit(0)
251 else:
252 try:
253 os.close(w)
254 with open(r, "rb") as f:
255 data = f.read()
256 assert len(data) == 6, data
257 # Check before-fork callbacks
258 assert data[:2] == b'BA', data
259 # Check after-fork callbacks
260 assert sorted(data[2:]) == list(b'CDEF'), data
261 assert data.index(b'C') < data.index(b'D'), data
262 assert data.index(b'E') < data.index(b'F'), data
263 finally:
264 os.write(fin_w, b'!')
265 """
266 assert_python_ok('-c', code)
267
Ross Lagerwall7807c352011-03-17 20:20:30 +0200268 @unittest.skipUnless(hasattr(posix, 'lockf'), "test needs posix.lockf()")
269 def test_lockf(self):
270 fd = os.open(support.TESTFN, os.O_WRONLY | os.O_CREAT)
271 try:
272 os.write(fd, b'test')
273 os.lseek(fd, 0, os.SEEK_SET)
274 posix.lockf(fd, posix.F_LOCK, 4)
275 # section is locked
276 posix.lockf(fd, posix.F_ULOCK, 4)
277 finally:
278 os.close(fd)
279
280 @unittest.skipUnless(hasattr(posix, 'pread'), "test needs posix.pread()")
281 def test_pread(self):
282 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
283 try:
284 os.write(fd, b'test')
285 os.lseek(fd, 0, os.SEEK_SET)
286 self.assertEqual(b'es', posix.pread(fd, 2, 1))
Florent Xiclunae41f0de2011-11-11 19:39:25 +0100287 # the first pread() shouldn't disturb the file offset
Ross Lagerwall7807c352011-03-17 20:20:30 +0200288 self.assertEqual(b'te', posix.read(fd, 2))
289 finally:
290 os.close(fd)
291
Pablo Galindo4defba32018-01-27 16:16:37 +0000292 @unittest.skipUnless(hasattr(posix, 'preadv'), "test needs posix.preadv()")
293 def test_preadv(self):
294 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
295 try:
296 os.write(fd, b'test1tt2t3t5t6t6t8')
297 buf = [bytearray(i) for i in [5, 3, 2]]
298 self.assertEqual(posix.preadv(fd, buf, 3), 10)
299 self.assertEqual([b't1tt2', b't3t', b'5t'], list(buf))
300 finally:
301 os.close(fd)
302
303 @unittest.skipUnless(hasattr(posix, 'RWF_HIPRI'), "test needs posix.RWF_HIPRI")
304 def test_preadv_flags(self):
305 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
306 try:
307 os.write(fd, b'test1tt2t3t5t6t6t8')
308 buf = [bytearray(i) for i in [5, 3, 2]]
309 self.assertEqual(posix.preadv(fd, buf, 3, os.RWF_HIPRI), 10)
310 self.assertEqual([b't1tt2', b't3t', b'5t'], list(buf))
311 finally:
312 os.close(fd)
313
Ross Lagerwall7807c352011-03-17 20:20:30 +0200314 @unittest.skipUnless(hasattr(posix, 'pwrite'), "test needs posix.pwrite()")
315 def test_pwrite(self):
316 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
317 try:
318 os.write(fd, b'test')
319 os.lseek(fd, 0, os.SEEK_SET)
320 posix.pwrite(fd, b'xx', 1)
321 self.assertEqual(b'txxt', posix.read(fd, 4))
322 finally:
323 os.close(fd)
324
Pablo Galindo4defba32018-01-27 16:16:37 +0000325 @unittest.skipUnless(hasattr(posix, 'pwritev'), "test needs posix.pwritev()")
326 def test_pwritev(self):
327 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
328 try:
329 os.write(fd, b"xx")
330 os.lseek(fd, 0, os.SEEK_SET)
331 n = os.pwritev(fd, [b'test1', b'tt2', b't3'], 2)
332 self.assertEqual(n, 10)
333
334 os.lseek(fd, 0, os.SEEK_SET)
335 self.assertEqual(b'xxtest1tt2t3', posix.read(fd, 100))
336 finally:
337 os.close(fd)
338
339 @unittest.skipUnless(hasattr(posix, 'os.RWF_SYNC'), "test needs os.RWF_SYNC")
340 def test_pwritev_flags(self):
341 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
342 try:
343 os.write(fd,b"xx")
344 os.lseek(fd, 0, os.SEEK_SET)
345 n = os.pwritev(fd, [b'test1', b'tt2', b't3'], 2, os.RWF_SYNC)
346 self.assertEqual(n, 10)
347
348 os.lseek(fd, 0, os.SEEK_SET)
349 self.assertEqual(b'xxtest1tt2', posix.read(fd, 100))
350 finally:
351 os.close(fd)
352
Ross Lagerwall7807c352011-03-17 20:20:30 +0200353 @unittest.skipUnless(hasattr(posix, 'posix_fallocate'),
354 "test needs posix.posix_fallocate()")
355 def test_posix_fallocate(self):
356 fd = os.open(support.TESTFN, os.O_WRONLY | os.O_CREAT)
357 try:
358 posix.posix_fallocate(fd, 0, 10)
359 except OSError as inst:
360 # issue10812, ZFS doesn't appear to support posix_fallocate,
361 # so skip Solaris-based since they are likely to have ZFS.
362 if inst.errno != errno.EINVAL or not sys.platform.startswith("sunos"):
363 raise
364 finally:
365 os.close(fd)
366
Коренберг Маркd4b93e22017-08-14 18:55:16 +0500367 # issue31106 - posix_fallocate() does not set error in errno.
368 @unittest.skipUnless(hasattr(posix, 'posix_fallocate'),
369 "test needs posix.posix_fallocate()")
370 def test_posix_fallocate_errno(self):
371 try:
372 posix.posix_fallocate(-42, 0, 10)
373 except OSError as inst:
374 if inst.errno != errno.EBADF:
375 raise
376
Ross Lagerwall7807c352011-03-17 20:20:30 +0200377 @unittest.skipUnless(hasattr(posix, 'posix_fadvise'),
378 "test needs posix.posix_fadvise()")
379 def test_posix_fadvise(self):
380 fd = os.open(support.TESTFN, os.O_RDONLY)
381 try:
382 posix.posix_fadvise(fd, 0, 0, posix.POSIX_FADV_WILLNEED)
383 finally:
384 os.close(fd)
385
Коренберг Маркd4b93e22017-08-14 18:55:16 +0500386 @unittest.skipUnless(hasattr(posix, 'posix_fadvise'),
387 "test needs posix.posix_fadvise()")
388 def test_posix_fadvise_errno(self):
389 try:
390 posix.posix_fadvise(-42, 0, 0, posix.POSIX_FADV_WILLNEED)
391 except OSError as inst:
392 if inst.errno != errno.EBADF:
393 raise
394
Larry Hastings9cf065c2012-06-22 16:30:09 -0700395 @unittest.skipUnless(os.utime in os.supports_fd, "test needs fd support in os.utime")
396 def test_utime_with_fd(self):
Ross Lagerwall7807c352011-03-17 20:20:30 +0200397 now = time.time()
398 fd = os.open(support.TESTFN, os.O_RDONLY)
399 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700400 posix.utime(fd)
401 posix.utime(fd, None)
402 self.assertRaises(TypeError, posix.utime, fd, (None, None))
403 self.assertRaises(TypeError, posix.utime, fd, (now, None))
404 self.assertRaises(TypeError, posix.utime, fd, (None, now))
405 posix.utime(fd, (int(now), int(now)))
406 posix.utime(fd, (now, now))
407 self.assertRaises(ValueError, posix.utime, fd, (now, now), ns=(now, now))
408 self.assertRaises(ValueError, posix.utime, fd, (now, 0), ns=(None, None))
409 self.assertRaises(ValueError, posix.utime, fd, (None, None), ns=(now, 0))
410 posix.utime(fd, (int(now), int((now - int(now)) * 1e9)))
411 posix.utime(fd, ns=(int(now), int((now - int(now)) * 1e9)))
412
Ross Lagerwall7807c352011-03-17 20:20:30 +0200413 finally:
414 os.close(fd)
415
Larry Hastings9cf065c2012-06-22 16:30:09 -0700416 @unittest.skipUnless(os.utime in os.supports_follow_symlinks, "test needs follow_symlinks support in os.utime")
417 def test_utime_nofollow_symlinks(self):
Ross Lagerwall7807c352011-03-17 20:20:30 +0200418 now = time.time()
Larry Hastings9cf065c2012-06-22 16:30:09 -0700419 posix.utime(support.TESTFN, None, follow_symlinks=False)
420 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None), follow_symlinks=False)
421 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None), follow_symlinks=False)
422 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now), follow_symlinks=False)
423 posix.utime(support.TESTFN, (int(now), int(now)), follow_symlinks=False)
424 posix.utime(support.TESTFN, (now, now), follow_symlinks=False)
425 posix.utime(support.TESTFN, follow_symlinks=False)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200426
427 @unittest.skipUnless(hasattr(posix, 'writev'), "test needs posix.writev()")
428 def test_writev(self):
429 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
430 try:
Victor Stinner57ddf782014-01-08 15:21:28 +0100431 n = os.writev(fd, (b'test1', b'tt2', b't3'))
432 self.assertEqual(n, 10)
433
Ross Lagerwall7807c352011-03-17 20:20:30 +0200434 os.lseek(fd, 0, os.SEEK_SET)
435 self.assertEqual(b'test1tt2t3', posix.read(fd, 10))
Victor Stinner57ddf782014-01-08 15:21:28 +0100436
437 # Issue #20113: empty list of buffers should not crash
Victor Stinnercd5ca6a2014-01-08 16:01:31 +0100438 try:
439 size = posix.writev(fd, [])
440 except OSError:
441 # writev(fd, []) raises OSError(22, "Invalid argument")
442 # on OpenIndiana
443 pass
444 else:
445 self.assertEqual(size, 0)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200446 finally:
447 os.close(fd)
448
449 @unittest.skipUnless(hasattr(posix, 'readv'), "test needs posix.readv()")
450 def test_readv(self):
451 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
452 try:
453 os.write(fd, b'test1tt2t3')
454 os.lseek(fd, 0, os.SEEK_SET)
455 buf = [bytearray(i) for i in [5, 3, 2]]
456 self.assertEqual(posix.readv(fd, buf), 10)
457 self.assertEqual([b'test1', b'tt2', b't3'], [bytes(i) for i in buf])
Victor Stinner57ddf782014-01-08 15:21:28 +0100458
459 # Issue #20113: empty list of buffers should not crash
Victor Stinnercd5ca6a2014-01-08 16:01:31 +0100460 try:
461 size = posix.readv(fd, [])
462 except OSError:
463 # readv(fd, []) raises OSError(22, "Invalid argument")
464 # on OpenIndiana
465 pass
466 else:
467 self.assertEqual(size, 0)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200468 finally:
469 os.close(fd)
470
Serhiy Storchaka43767632013-11-03 21:31:38 +0200471 @unittest.skipUnless(hasattr(posix, 'dup'),
472 'test needs posix.dup()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000473 def test_dup(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200474 fp = open(support.TESTFN)
475 try:
476 fd = posix.dup(fp.fileno())
477 self.assertIsInstance(fd, int)
478 os.close(fd)
479 finally:
480 fp.close()
Neal Norwitze241ce82003-02-17 18:17:05 +0000481
Serhiy Storchaka43767632013-11-03 21:31:38 +0200482 @unittest.skipUnless(hasattr(posix, 'confstr'),
483 'test needs posix.confstr()')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000484 def test_confstr(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200485 self.assertRaises(ValueError, posix.confstr, "CS_garbage")
486 self.assertEqual(len(posix.confstr("CS_PATH")) > 0, True)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000487
Serhiy Storchaka43767632013-11-03 21:31:38 +0200488 @unittest.skipUnless(hasattr(posix, 'dup2'),
489 'test needs posix.dup2()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000490 def test_dup2(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200491 fp1 = open(support.TESTFN)
492 fp2 = open(support.TESTFN)
493 try:
494 posix.dup2(fp1.fileno(), fp2.fileno())
495 finally:
496 fp1.close()
497 fp2.close()
Neal Norwitze241ce82003-02-17 18:17:05 +0000498
Charles-François Natali1e045b12011-05-22 20:42:32 +0200499 @unittest.skipUnless(hasattr(os, 'O_CLOEXEC'), "needs os.O_CLOEXEC")
Charles-François Natali239bb962011-06-03 12:55:15 +0200500 @support.requires_linux_version(2, 6, 23)
Charles-François Natali1e045b12011-05-22 20:42:32 +0200501 def test_oscloexec(self):
502 fd = os.open(support.TESTFN, os.O_RDONLY|os.O_CLOEXEC)
503 self.addCleanup(os.close, fd)
Victor Stinner1db9e7b2014-07-29 22:32:47 +0200504 self.assertFalse(os.get_inheritable(fd))
Charles-François Natali1e045b12011-05-22 20:42:32 +0200505
Serhiy Storchaka43767632013-11-03 21:31:38 +0200506 @unittest.skipUnless(hasattr(posix, 'O_EXLOCK'),
507 'test needs posix.O_EXLOCK')
Skip Montanaro98470002005-06-17 01:14:49 +0000508 def test_osexlock(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200509 fd = os.open(support.TESTFN,
510 os.O_WRONLY|os.O_EXLOCK|os.O_CREAT)
511 self.assertRaises(OSError, os.open, support.TESTFN,
512 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
513 os.close(fd)
514
515 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000516 fd = os.open(support.TESTFN,
Serhiy Storchaka43767632013-11-03 21:31:38 +0200517 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000518 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000519 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
520 os.close(fd)
521
Serhiy Storchaka43767632013-11-03 21:31:38 +0200522 @unittest.skipUnless(hasattr(posix, 'O_SHLOCK'),
523 'test needs posix.O_SHLOCK')
Skip Montanaro98470002005-06-17 01:14:49 +0000524 def test_osshlock(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200525 fd1 = os.open(support.TESTFN,
526 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
527 fd2 = os.open(support.TESTFN,
528 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
529 os.close(fd2)
530 os.close(fd1)
531
532 if hasattr(posix, "O_EXLOCK"):
533 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000534 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Serhiy Storchaka43767632013-11-03 21:31:38 +0200535 self.assertRaises(OSError, os.open, support.TESTFN,
536 os.O_RDONLY|os.O_EXLOCK|os.O_NONBLOCK)
537 os.close(fd)
Skip Montanaro98470002005-06-17 01:14:49 +0000538
Serhiy Storchaka43767632013-11-03 21:31:38 +0200539 @unittest.skipUnless(hasattr(posix, 'fstat'),
540 'test needs posix.fstat()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000541 def test_fstat(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200542 fp = open(support.TESTFN)
543 try:
544 self.assertTrue(posix.fstat(fp.fileno()))
545 self.assertTrue(posix.stat(fp.fileno()))
Serhiy Storchakaa2ad5c32013-01-07 23:13:46 +0200546
Serhiy Storchaka43767632013-11-03 21:31:38 +0200547 self.assertRaisesRegex(TypeError,
Brett Cannon3f9183b2016-08-26 14:44:48 -0700548 'should be string, bytes, os.PathLike or integer, not',
Serhiy Storchaka43767632013-11-03 21:31:38 +0200549 posix.stat, float(fp.fileno()))
550 finally:
551 fp.close()
Neal Norwitze241ce82003-02-17 18:17:05 +0000552
Serhiy Storchaka43767632013-11-03 21:31:38 +0200553 @unittest.skipUnless(hasattr(posix, 'stat'),
554 'test needs posix.stat()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000555 def test_stat(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200556 self.assertTrue(posix.stat(support.TESTFN))
557 self.assertTrue(posix.stat(os.fsencode(support.TESTFN)))
Serhiy Storchakaa2ad5c32013-01-07 23:13:46 +0200558
Serhiy Storchakad73c3182016-08-06 23:22:08 +0300559 self.assertWarnsRegex(DeprecationWarning,
Brett Cannon3f9183b2016-08-26 14:44:48 -0700560 'should be string, bytes, os.PathLike or integer, not',
Serhiy Storchakad73c3182016-08-06 23:22:08 +0300561 posix.stat, bytearray(os.fsencode(support.TESTFN)))
Serhiy Storchaka43767632013-11-03 21:31:38 +0200562 self.assertRaisesRegex(TypeError,
Brett Cannon3f9183b2016-08-26 14:44:48 -0700563 'should be string, bytes, os.PathLike or integer, not',
Serhiy Storchaka43767632013-11-03 21:31:38 +0200564 posix.stat, None)
565 self.assertRaisesRegex(TypeError,
Brett Cannon3f9183b2016-08-26 14:44:48 -0700566 'should be string, bytes, os.PathLike or integer, not',
Serhiy Storchaka43767632013-11-03 21:31:38 +0200567 posix.stat, list(support.TESTFN))
568 self.assertRaisesRegex(TypeError,
Brett Cannon3f9183b2016-08-26 14:44:48 -0700569 'should be string, bytes, os.PathLike or integer, not',
Serhiy Storchaka43767632013-11-03 21:31:38 +0200570 posix.stat, list(os.fsencode(support.TESTFN)))
Neal Norwitze241ce82003-02-17 18:17:05 +0000571
Benjamin Peterson052a02b2010-08-17 01:27:09 +0000572 @unittest.skipUnless(hasattr(posix, 'mkfifo'), "don't have mkfifo()")
573 def test_mkfifo(self):
574 support.unlink(support.TESTFN)
xdegaye92c2ca72017-11-12 17:31:07 +0100575 try:
576 posix.mkfifo(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR)
577 except PermissionError as e:
578 self.skipTest('posix.mkfifo(): %s' % e)
Benjamin Peterson052a02b2010-08-17 01:27:09 +0000579 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
580
581 @unittest.skipUnless(hasattr(posix, 'mknod') and hasattr(stat, 'S_IFIFO'),
582 "don't have mknod()/S_IFIFO")
583 def test_mknod(self):
584 # Test using mknod() to create a FIFO (the only use specified
585 # by POSIX).
586 support.unlink(support.TESTFN)
587 mode = stat.S_IFIFO | stat.S_IRUSR | stat.S_IWUSR
588 try:
589 posix.mknod(support.TESTFN, mode, 0)
590 except OSError as e:
591 # Some old systems don't allow unprivileged users to use
592 # mknod(), or only support creating device nodes.
xdegaye92c2ca72017-11-12 17:31:07 +0100593 self.assertIn(e.errno, (errno.EPERM, errno.EINVAL, errno.EACCES))
Benjamin Peterson052a02b2010-08-17 01:27:09 +0000594 else:
595 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
596
Martin Panterbf19d162015-09-09 01:01:13 +0000597 # Keyword arguments are also supported
598 support.unlink(support.TESTFN)
599 try:
600 posix.mknod(path=support.TESTFN, mode=mode, device=0,
601 dir_fd=None)
602 except OSError as e:
xdegaye92c2ca72017-11-12 17:31:07 +0100603 self.assertIn(e.errno, (errno.EPERM, errno.EINVAL, errno.EACCES))
Martin Panterbf19d162015-09-09 01:01:13 +0000604
Serhiy Storchaka16b2e4f2015-04-20 09:22:13 +0300605 @unittest.skipUnless(hasattr(posix, 'stat'), 'test needs posix.stat()')
606 @unittest.skipUnless(hasattr(posix, 'makedev'), 'test needs posix.makedev()')
607 def test_makedev(self):
608 st = posix.stat(support.TESTFN)
609 dev = st.st_dev
610 self.assertIsInstance(dev, int)
611 self.assertGreaterEqual(dev, 0)
612
613 major = posix.major(dev)
614 self.assertIsInstance(major, int)
615 self.assertGreaterEqual(major, 0)
616 self.assertEqual(posix.major(dev), major)
617 self.assertRaises(TypeError, posix.major, float(dev))
618 self.assertRaises(TypeError, posix.major)
619 self.assertRaises((ValueError, OverflowError), posix.major, -1)
620
621 minor = posix.minor(dev)
622 self.assertIsInstance(minor, int)
623 self.assertGreaterEqual(minor, 0)
624 self.assertEqual(posix.minor(dev), minor)
625 self.assertRaises(TypeError, posix.minor, float(dev))
626 self.assertRaises(TypeError, posix.minor)
627 self.assertRaises((ValueError, OverflowError), posix.minor, -1)
628
Victor Stinner13ff2452018-01-22 18:32:50 +0100629 # FIXME: reenable these tests on FreeBSD with the kernel fix
Victor Stinner12953ff2017-07-27 16:55:54 +0200630 if sys.platform.startswith('freebsd') and dev >= 0x1_0000_0000:
631 self.skipTest("bpo-31044: on FreeBSD CURRENT, minor() truncates "
632 "64-bit dev to 32-bit")
633
Serhiy Storchaka16b2e4f2015-04-20 09:22:13 +0300634 self.assertEqual(posix.makedev(major, minor), dev)
635 self.assertRaises(TypeError, posix.makedev, float(major), minor)
636 self.assertRaises(TypeError, posix.makedev, major, float(minor))
637 self.assertRaises(TypeError, posix.makedev, major)
638 self.assertRaises(TypeError, posix.makedev)
639
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200640 def _test_all_chown_common(self, chown_func, first_param, stat_func):
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000641 """Common code for chown, fchown and lchown tests."""
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200642 def check_stat(uid, gid):
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200643 if stat_func is not None:
644 stat = stat_func(first_param)
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200645 self.assertEqual(stat.st_uid, uid)
646 self.assertEqual(stat.st_gid, gid)
647 uid = os.getuid()
648 gid = os.getgid()
Charles-François Nataliab2d58e2012-04-17 19:48:35 +0200649 # test a successful chown call
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200650 chown_func(first_param, uid, gid)
651 check_stat(uid, gid)
652 chown_func(first_param, -1, gid)
653 check_stat(uid, gid)
654 chown_func(first_param, uid, -1)
655 check_stat(uid, gid)
Charles-François Nataliab2d58e2012-04-17 19:48:35 +0200656
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200657 if uid == 0:
658 # Try an amusingly large uid/gid to make sure we handle
659 # large unsigned values. (chown lets you use any
660 # uid/gid you like, even if they aren't defined.)
661 #
662 # This problem keeps coming up:
663 # http://bugs.python.org/issue1747858
664 # http://bugs.python.org/issue4591
665 # http://bugs.python.org/issue15301
666 # Hopefully the fix in 4591 fixes it for good!
667 #
668 # This part of the test only runs when run as root.
669 # Only scary people run their tests as root.
670
671 big_value = 2**31
672 chown_func(first_param, big_value, big_value)
673 check_stat(big_value, big_value)
674 chown_func(first_param, -1, -1)
675 check_stat(big_value, big_value)
676 chown_func(first_param, uid, gid)
677 check_stat(uid, gid)
Charles-François Nataliab2d58e2012-04-17 19:48:35 +0200678 elif platform.system() in ('HP-UX', 'SunOS'):
679 # HP-UX and Solaris can allow a non-root user to chown() to root
680 # (issue #5113)
681 raise unittest.SkipTest("Skipping because of non-standard chown() "
682 "behavior")
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000683 else:
684 # non-root cannot chown to root, raises OSError
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200685 self.assertRaises(OSError, chown_func, first_param, 0, 0)
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200686 check_stat(uid, gid)
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200687 self.assertRaises(OSError, chown_func, first_param, 0, -1)
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200688 check_stat(uid, gid)
Serhiy Storchakaa2964b32013-02-21 14:34:36 +0200689 if 0 not in os.getgroups():
Serhiy Storchakab3d62ce2013-02-20 19:48:22 +0200690 self.assertRaises(OSError, chown_func, first_param, -1, 0)
691 check_stat(uid, gid)
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200692 # test illegal types
693 for t in str, float:
694 self.assertRaises(TypeError, chown_func, first_param, t(uid), gid)
695 check_stat(uid, gid)
696 self.assertRaises(TypeError, chown_func, first_param, uid, t(gid))
697 check_stat(uid, gid)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000698
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000699 @unittest.skipUnless(hasattr(posix, 'chown'), "test needs os.chown()")
700 def test_chown(self):
701 # raise an OSError if the file does not exist
702 os.unlink(support.TESTFN)
703 self.assertRaises(OSError, posix.chown, support.TESTFN, -1, -1)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000704
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000705 # re-create the file
Victor Stinnerbf816222011-06-30 23:25:47 +0200706 support.create_empty_file(support.TESTFN)
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200707 self._test_all_chown_common(posix.chown, support.TESTFN,
708 getattr(posix, 'stat', None))
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000709
710 @unittest.skipUnless(hasattr(posix, 'fchown'), "test needs os.fchown()")
711 def test_fchown(self):
712 os.unlink(support.TESTFN)
713
714 # re-create the file
715 test_file = open(support.TESTFN, 'w')
716 try:
717 fd = test_file.fileno()
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200718 self._test_all_chown_common(posix.fchown, fd,
719 getattr(posix, 'fstat', None))
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000720 finally:
721 test_file.close()
722
723 @unittest.skipUnless(hasattr(posix, 'lchown'), "test needs os.lchown()")
724 def test_lchown(self):
725 os.unlink(support.TESTFN)
726 # create a symlink
Ned Deily3eb67d52011-06-28 00:00:28 -0700727 os.symlink(_DUMMY_SYMLINK, support.TESTFN)
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200728 self._test_all_chown_common(posix.lchown, support.TESTFN,
729 getattr(posix, 'lstat', None))
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000730
Serhiy Storchaka43767632013-11-03 21:31:38 +0200731 @unittest.skipUnless(hasattr(posix, 'chdir'), 'test needs posix.chdir()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000732 def test_chdir(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200733 posix.chdir(os.curdir)
734 self.assertRaises(OSError, posix.chdir, support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000735
Martin v. Löwisc9e1c7d2010-07-23 12:16:41 +0000736 def test_listdir(self):
Serhiy Storchaka1180e5a2017-07-11 06:36:46 +0300737 self.assertIn(support.TESTFN, posix.listdir(os.curdir))
Martin v. Löwisc9e1c7d2010-07-23 12:16:41 +0000738
739 def test_listdir_default(self):
Larry Hastingsfdaea062012-06-25 04:42:23 -0700740 # When listdir is called without argument,
741 # it's the same as listdir(os.curdir).
Serhiy Storchaka1180e5a2017-07-11 06:36:46 +0300742 self.assertIn(support.TESTFN, posix.listdir())
Neal Norwitze241ce82003-02-17 18:17:05 +0000743
Larry Hastingsfdaea062012-06-25 04:42:23 -0700744 def test_listdir_bytes(self):
745 # When listdir is called with a bytes object,
746 # the returned strings are of type bytes.
Serhiy Storchaka1180e5a2017-07-11 06:36:46 +0300747 self.assertIn(os.fsencode(support.TESTFN), posix.listdir(b'.'))
748
749 def test_listdir_bytes_like(self):
750 for cls in bytearray, memoryview:
751 with self.assertWarns(DeprecationWarning):
752 names = posix.listdir(cls(b'.'))
753 self.assertIn(os.fsencode(support.TESTFN), names)
754 for name in names:
755 self.assertIs(type(name), bytes)
Larry Hastingsfdaea062012-06-25 04:42:23 -0700756
757 @unittest.skipUnless(posix.listdir in os.supports_fd,
758 "test needs fd support for posix.listdir()")
759 def test_listdir_fd(self):
Antoine Pitrou8250e232011-02-25 23:41:16 +0000760 f = posix.open(posix.getcwd(), posix.O_RDONLY)
Charles-François Natali7546ad32012-01-08 18:34:06 +0100761 self.addCleanup(posix.close, f)
Antoine Pitrou8250e232011-02-25 23:41:16 +0000762 self.assertEqual(
763 sorted(posix.listdir('.')),
Larry Hastings9cf065c2012-06-22 16:30:09 -0700764 sorted(posix.listdir(f))
Antoine Pitrou8250e232011-02-25 23:41:16 +0000765 )
Charles-François Natali7546ad32012-01-08 18:34:06 +0100766 # Check that the fd offset was reset (issue #13739)
Charles-François Natali7546ad32012-01-08 18:34:06 +0100767 self.assertEqual(
768 sorted(posix.listdir('.')),
Larry Hastings9cf065c2012-06-22 16:30:09 -0700769 sorted(posix.listdir(f))
Charles-François Natali7546ad32012-01-08 18:34:06 +0100770 )
Antoine Pitrou8250e232011-02-25 23:41:16 +0000771
Serhiy Storchaka43767632013-11-03 21:31:38 +0200772 @unittest.skipUnless(hasattr(posix, 'access'), 'test needs posix.access()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000773 def test_access(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200774 self.assertTrue(posix.access(support.TESTFN, os.R_OK))
Neal Norwitze241ce82003-02-17 18:17:05 +0000775
Serhiy Storchaka43767632013-11-03 21:31:38 +0200776 @unittest.skipUnless(hasattr(posix, 'umask'), 'test needs posix.umask()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000777 def test_umask(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200778 old_mask = posix.umask(0)
779 self.assertIsInstance(old_mask, int)
780 posix.umask(old_mask)
Neal Norwitze241ce82003-02-17 18:17:05 +0000781
Serhiy Storchaka43767632013-11-03 21:31:38 +0200782 @unittest.skipUnless(hasattr(posix, 'strerror'),
783 'test needs posix.strerror()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000784 def test_strerror(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200785 self.assertTrue(posix.strerror(0))
Neal Norwitze241ce82003-02-17 18:17:05 +0000786
Serhiy Storchaka43767632013-11-03 21:31:38 +0200787 @unittest.skipUnless(hasattr(posix, 'pipe'), 'test needs posix.pipe()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000788 def test_pipe(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200789 reader, writer = posix.pipe()
790 os.close(reader)
791 os.close(writer)
Neal Norwitze241ce82003-02-17 18:17:05 +0000792
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200793 @unittest.skipUnless(hasattr(os, 'pipe2'), "test needs os.pipe2()")
Charles-François Natali239bb962011-06-03 12:55:15 +0200794 @support.requires_linux_version(2, 6, 27)
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200795 def test_pipe2(self):
796 self.assertRaises(TypeError, os.pipe2, 'DEADBEEF')
797 self.assertRaises(TypeError, os.pipe2, 0, 0)
798
Charles-François Natali368f34b2011-06-06 19:49:47 +0200799 # try calling with flags = 0, like os.pipe()
800 r, w = os.pipe2(0)
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200801 os.close(r)
802 os.close(w)
803
804 # test flags
805 r, w = os.pipe2(os.O_CLOEXEC|os.O_NONBLOCK)
806 self.addCleanup(os.close, r)
807 self.addCleanup(os.close, w)
Victor Stinnerbff989e2013-08-28 12:25:40 +0200808 self.assertFalse(os.get_inheritable(r))
809 self.assertFalse(os.get_inheritable(w))
Victor Stinner1db9e7b2014-07-29 22:32:47 +0200810 self.assertFalse(os.get_blocking(r))
811 self.assertFalse(os.get_blocking(w))
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200812 # try reading from an empty pipe: this should fail, not block
813 self.assertRaises(OSError, os.read, r, 1)
814 # try a write big enough to fill-up the pipe: this should either
815 # fail or perform a partial write, not block
816 try:
817 os.write(w, b'x' * support.PIPE_MAX_SIZE)
818 except OSError:
819 pass
820
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +0200821 @support.cpython_only
822 @unittest.skipUnless(hasattr(os, 'pipe2'), "test needs os.pipe2()")
823 @support.requires_linux_version(2, 6, 27)
824 def test_pipe2_c_limits(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +0200825 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +0200826 import _testcapi
Serhiy Storchaka78980432013-01-15 01:12:17 +0200827 self.assertRaises(OverflowError, os.pipe2, _testcapi.INT_MAX + 1)
828 self.assertRaises(OverflowError, os.pipe2, _testcapi.UINT_MAX + 1)
829
Serhiy Storchaka43767632013-11-03 21:31:38 +0200830 @unittest.skipUnless(hasattr(posix, 'utime'), 'test needs posix.utime()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000831 def test_utime(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200832 now = time.time()
833 posix.utime(support.TESTFN, None)
834 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None))
835 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None))
836 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now))
837 posix.utime(support.TESTFN, (int(now), int(now)))
838 posix.utime(support.TESTFN, (now, now))
Neal Norwitze241ce82003-02-17 18:17:05 +0000839
Larry Hastings9cf065c2012-06-22 16:30:09 -0700840 def _test_chflags_regular_file(self, chflags_func, target_file, **kwargs):
Ned Deily3eb67d52011-06-28 00:00:28 -0700841 st = os.stat(target_file)
842 self.assertTrue(hasattr(st, 'st_flags'))
Trent Nelson75959cf2012-08-21 23:59:31 +0000843
844 # ZFS returns EOPNOTSUPP when attempting to set flag UF_IMMUTABLE.
845 flags = st.st_flags | stat.UF_IMMUTABLE
846 try:
847 chflags_func(target_file, flags, **kwargs)
848 except OSError as err:
849 if err.errno != errno.EOPNOTSUPP:
850 raise
851 msg = 'chflag UF_IMMUTABLE not supported by underlying fs'
852 self.skipTest(msg)
853
Ned Deily3eb67d52011-06-28 00:00:28 -0700854 try:
855 new_st = os.stat(target_file)
856 self.assertEqual(st.st_flags | stat.UF_IMMUTABLE, new_st.st_flags)
857 try:
858 fd = open(target_file, 'w+')
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200859 except OSError as e:
Ned Deily3eb67d52011-06-28 00:00:28 -0700860 self.assertEqual(e.errno, errno.EPERM)
861 finally:
862 posix.chflags(target_file, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000863
Ned Deily3eb67d52011-06-28 00:00:28 -0700864 @unittest.skipUnless(hasattr(posix, 'chflags'), 'test needs os.chflags()')
865 def test_chflags(self):
866 self._test_chflags_regular_file(posix.chflags, support.TESTFN)
867
868 @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
869 def test_lchflags_regular_file(self):
870 self._test_chflags_regular_file(posix.lchflags, support.TESTFN)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700871 self._test_chflags_regular_file(posix.chflags, support.TESTFN, follow_symlinks=False)
Ned Deily3eb67d52011-06-28 00:00:28 -0700872
873 @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
874 def test_lchflags_symlink(self):
875 testfn_st = os.stat(support.TESTFN)
876
877 self.assertTrue(hasattr(testfn_st, 'st_flags'))
878
879 os.symlink(support.TESTFN, _DUMMY_SYMLINK)
880 self.teardown_files.append(_DUMMY_SYMLINK)
881 dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
882
Larry Hastings9cf065c2012-06-22 16:30:09 -0700883 def chflags_nofollow(path, flags):
884 return posix.chflags(path, flags, follow_symlinks=False)
Ned Deily3eb67d52011-06-28 00:00:28 -0700885
Larry Hastings9cf065c2012-06-22 16:30:09 -0700886 for fn in (posix.lchflags, chflags_nofollow):
Trent Nelson75959cf2012-08-21 23:59:31 +0000887 # ZFS returns EOPNOTSUPP when attempting to set flag UF_IMMUTABLE.
888 flags = dummy_symlink_st.st_flags | stat.UF_IMMUTABLE
889 try:
890 fn(_DUMMY_SYMLINK, flags)
891 except OSError as err:
892 if err.errno != errno.EOPNOTSUPP:
893 raise
894 msg = 'chflag UF_IMMUTABLE not supported by underlying fs'
895 self.skipTest(msg)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700896 try:
897 new_testfn_st = os.stat(support.TESTFN)
898 new_dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
899
900 self.assertEqual(testfn_st.st_flags, new_testfn_st.st_flags)
901 self.assertEqual(dummy_symlink_st.st_flags | stat.UF_IMMUTABLE,
902 new_dummy_symlink_st.st_flags)
903 finally:
904 fn(_DUMMY_SYMLINK, dummy_symlink_st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000905
Guido van Rossum98297ee2007-11-06 21:34:58 +0000906 def test_environ(self):
Victor Stinner17b490d2010-05-06 22:19:30 +0000907 if os.name == "nt":
908 item_type = str
909 else:
910 item_type = bytes
Guido van Rossum98297ee2007-11-06 21:34:58 +0000911 for k, v in posix.environ.items():
Victor Stinner17b490d2010-05-06 22:19:30 +0000912 self.assertEqual(type(k), item_type)
913 self.assertEqual(type(v), item_type)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000914
Serhiy Storchaka77703942017-06-25 07:33:01 +0300915 @unittest.skipUnless(hasattr(os, "putenv"), "requires os.putenv()")
916 def test_putenv(self):
917 with self.assertRaises(ValueError):
918 os.putenv('FRUIT\0VEGETABLE', 'cabbage')
919 with self.assertRaises(ValueError):
920 os.putenv(b'FRUIT\0VEGETABLE', b'cabbage')
921 with self.assertRaises(ValueError):
922 os.putenv('FRUIT', 'orange\0VEGETABLE=cabbage')
923 with self.assertRaises(ValueError):
924 os.putenv(b'FRUIT', b'orange\0VEGETABLE=cabbage')
925 with self.assertRaises(ValueError):
926 os.putenv('FRUIT=ORANGE', 'lemon')
927 with self.assertRaises(ValueError):
928 os.putenv(b'FRUIT=ORANGE', b'lemon')
929
Serhiy Storchaka43767632013-11-03 21:31:38 +0200930 @unittest.skipUnless(hasattr(posix, 'getcwd'), 'test needs posix.getcwd()')
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000931 def test_getcwd_long_pathnames(self):
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500932 dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef'
933 curdir = os.getcwd()
934 base_path = os.path.abspath(support.TESTFN) + '.getcwd'
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000935
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500936 try:
937 os.mkdir(base_path)
938 os.chdir(base_path)
939 except:
940 # Just returning nothing instead of the SkipTest exception, because
941 # the test results in Error in that case. Is that ok?
942 # raise unittest.SkipTest("cannot create directory for testing")
943 return
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000944
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500945 def _create_and_do_getcwd(dirname, current_path_length = 0):
946 try:
947 os.mkdir(dirname)
948 except:
949 raise unittest.SkipTest("mkdir cannot create directory sufficiently deep for getcwd test")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000950
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500951 os.chdir(dirname)
952 try:
953 os.getcwd()
954 if current_path_length < 1027:
955 _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
956 finally:
957 os.chdir('..')
958 os.rmdir(dirname)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000959
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500960 _create_and_do_getcwd(dirname)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000961
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500962 finally:
963 os.chdir(curdir)
964 support.rmtree(base_path)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000965
Ross Lagerwallb0ae53d2011-06-10 07:30:30 +0200966 @unittest.skipUnless(hasattr(posix, 'getgrouplist'), "test needs posix.getgrouplist()")
967 @unittest.skipUnless(hasattr(pwd, 'getpwuid'), "test needs pwd.getpwuid()")
968 @unittest.skipUnless(hasattr(os, 'getuid'), "test needs os.getuid()")
969 def test_getgrouplist(self):
Ross Lagerwalla0b315f2012-12-13 15:20:26 +0000970 user = pwd.getpwuid(os.getuid())[0]
971 group = pwd.getpwuid(os.getuid())[3]
972 self.assertIn(group, posix.getgrouplist(user, group))
Ross Lagerwallb0ae53d2011-06-10 07:30:30 +0200973
Ross Lagerwallb0ae53d2011-06-10 07:30:30 +0200974
Antoine Pitrou318b8f32011-01-12 18:45:27 +0000975 @unittest.skipUnless(hasattr(os, 'getegid'), "test needs os.getegid()")
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000976 def test_getgroups(self):
Jesus Cea61f32cb2014-06-28 18:39:35 +0200977 with os.popen('id -G 2>/dev/null') as idg:
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000978 groups = idg.read().strip()
Charles-François Natalie8a255a2012-05-02 20:01:38 +0200979 ret = idg.close()
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000980
Xavier de Gaye24c3b492016-10-19 11:00:26 +0200981 try:
982 idg_groups = set(int(g) for g in groups.split())
983 except ValueError:
984 idg_groups = set()
985 if ret is not None or not idg_groups:
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000986 raise unittest.SkipTest("need working 'id -G'")
987
Ned Deily028915e2013-02-02 15:08:52 -0800988 # Issues 16698: OS X ABIs prior to 10.6 have limits on getgroups()
989 if sys.platform == 'darwin':
990 import sysconfig
991 dt = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') or '10.0'
Ned Deily04cdfa12014-06-25 13:36:14 -0700992 if tuple(int(n) for n in dt.split('.')[0:2]) < (10, 6):
Ned Deily028915e2013-02-02 15:08:52 -0800993 raise unittest.SkipTest("getgroups(2) is broken prior to 10.6")
994
Ronald Oussoren7fb6f512010-08-01 19:18:13 +0000995 # 'id -G' and 'os.getgroups()' should return the same
Xavier de Gaye24c3b492016-10-19 11:00:26 +0200996 # groups, ignoring order, duplicates, and the effective gid.
997 # #10822/#26944 - It is implementation defined whether
998 # posix.getgroups() includes the effective gid.
999 symdiff = idg_groups.symmetric_difference(posix.getgroups())
1000 self.assertTrue(not symdiff or symdiff == {posix.getegid()})
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001001
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001002 # tests for the posix *at functions follow
1003
Larry Hastings9cf065c2012-06-22 16:30:09 -07001004 @unittest.skipUnless(os.access in os.supports_dir_fd, "test needs dir_fd support for os.access()")
1005 def test_access_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001006 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1007 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -07001008 self.assertTrue(posix.access(support.TESTFN, os.R_OK, dir_fd=f))
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001009 finally:
1010 posix.close(f)
1011
Larry Hastings9cf065c2012-06-22 16:30:09 -07001012 @unittest.skipUnless(os.chmod in os.supports_dir_fd, "test needs dir_fd support in os.chmod()")
1013 def test_chmod_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001014 os.chmod(support.TESTFN, stat.S_IRUSR)
1015
1016 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1017 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -07001018 posix.chmod(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001019
1020 s = posix.stat(support.TESTFN)
1021 self.assertEqual(s[0] & stat.S_IRWXU, stat.S_IRUSR | stat.S_IWUSR)
1022 finally:
1023 posix.close(f)
1024
Larry Hastings9cf065c2012-06-22 16:30:09 -07001025 @unittest.skipUnless(os.chown in os.supports_dir_fd, "test needs dir_fd support in os.chown()")
1026 def test_chown_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001027 support.unlink(support.TESTFN)
Victor Stinnerbf816222011-06-30 23:25:47 +02001028 support.create_empty_file(support.TESTFN)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001029
1030 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1031 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -07001032 posix.chown(support.TESTFN, os.getuid(), os.getgid(), dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001033 finally:
1034 posix.close(f)
1035
Larry Hastings9cf065c2012-06-22 16:30:09 -07001036 @unittest.skipUnless(os.stat in os.supports_dir_fd, "test needs dir_fd support in os.stat()")
1037 def test_stat_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001038 support.unlink(support.TESTFN)
1039 with open(support.TESTFN, 'w') as outfile:
1040 outfile.write("testline\n")
1041
1042 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1043 try:
1044 s1 = posix.stat(support.TESTFN)
Larry Hastings9cf065c2012-06-22 16:30:09 -07001045 s2 = posix.stat(support.TESTFN, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001046 self.assertEqual(s1, s2)
Serhiy Storchakaa2ad5c32013-01-07 23:13:46 +02001047 s2 = posix.stat(support.TESTFN, dir_fd=None)
1048 self.assertEqual(s1, s2)
Serhiy Storchaka7155b882016-04-08 08:48:20 +03001049 self.assertRaisesRegex(TypeError, 'should be integer or None, not',
Serhiy Storchakaa2ad5c32013-01-07 23:13:46 +02001050 posix.stat, support.TESTFN, dir_fd=posix.getcwd())
Serhiy Storchaka7155b882016-04-08 08:48:20 +03001051 self.assertRaisesRegex(TypeError, 'should be integer or None, not',
Serhiy Storchakaa2ad5c32013-01-07 23:13:46 +02001052 posix.stat, support.TESTFN, dir_fd=float(f))
1053 self.assertRaises(OverflowError,
1054 posix.stat, support.TESTFN, dir_fd=10**20)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001055 finally:
1056 posix.close(f)
1057
Larry Hastings9cf065c2012-06-22 16:30:09 -07001058 @unittest.skipUnless(os.utime in os.supports_dir_fd, "test needs dir_fd support in os.utime()")
1059 def test_utime_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001060 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1061 try:
1062 now = time.time()
Larry Hastings9cf065c2012-06-22 16:30:09 -07001063 posix.utime(support.TESTFN, None, dir_fd=f)
1064 posix.utime(support.TESTFN, dir_fd=f)
1065 self.assertRaises(TypeError, posix.utime, support.TESTFN, now, dir_fd=f)
1066 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None), dir_fd=f)
1067 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None), dir_fd=f)
1068 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now), dir_fd=f)
1069 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, "x"), dir_fd=f)
1070 posix.utime(support.TESTFN, (int(now), int(now)), dir_fd=f)
1071 posix.utime(support.TESTFN, (now, now), dir_fd=f)
1072 posix.utime(support.TESTFN,
1073 (int(now), int((now - int(now)) * 1e9)), dir_fd=f)
1074 posix.utime(support.TESTFN, dir_fd=f,
1075 times=(int(now), int((now - int(now)) * 1e9)))
1076
Larry Hastings90867a52012-06-22 17:01:41 -07001077 # try dir_fd and follow_symlinks together
Larry Hastings9cf065c2012-06-22 16:30:09 -07001078 if os.utime in os.supports_follow_symlinks:
Larry Hastings90867a52012-06-22 17:01:41 -07001079 try:
1080 posix.utime(support.TESTFN, follow_symlinks=False, dir_fd=f)
Georg Brandl969288e2012-06-26 09:25:44 +02001081 except ValueError:
Larry Hastings90867a52012-06-22 17:01:41 -07001082 # whoops! using both together not supported on this platform.
1083 pass
Larry Hastings9cf065c2012-06-22 16:30:09 -07001084
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001085 finally:
1086 posix.close(f)
1087
Larry Hastings9cf065c2012-06-22 16:30:09 -07001088 @unittest.skipUnless(os.link in os.supports_dir_fd, "test needs dir_fd support in os.link()")
1089 def test_link_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001090 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1091 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -07001092 posix.link(support.TESTFN, support.TESTFN + 'link', src_dir_fd=f, dst_dir_fd=f)
xdegaye92c2ca72017-11-12 17:31:07 +01001093 except PermissionError as e:
1094 self.skipTest('posix.link(): %s' % e)
1095 else:
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001096 # should have same inodes
1097 self.assertEqual(posix.stat(support.TESTFN)[1],
1098 posix.stat(support.TESTFN + 'link')[1])
1099 finally:
1100 posix.close(f)
1101 support.unlink(support.TESTFN + 'link')
1102
Larry Hastings9cf065c2012-06-22 16:30:09 -07001103 @unittest.skipUnless(os.mkdir in os.supports_dir_fd, "test needs dir_fd support in os.mkdir()")
1104 def test_mkdir_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.mkdir(support.TESTFN + 'dir', dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001108 posix.stat(support.TESTFN + 'dir') # should not raise exception
1109 finally:
1110 posix.close(f)
1111 support.rmtree(support.TESTFN + 'dir')
1112
Larry Hastings9cf065c2012-06-22 16:30:09 -07001113 @unittest.skipUnless((os.mknod in os.supports_dir_fd) and hasattr(stat, 'S_IFIFO'),
1114 "test requires both stat.S_IFIFO and dir_fd support for os.mknod()")
1115 def test_mknod_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001116 # Test using mknodat() to create a FIFO (the only use specified
1117 # by POSIX).
1118 support.unlink(support.TESTFN)
1119 mode = stat.S_IFIFO | stat.S_IRUSR | stat.S_IWUSR
1120 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1121 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -07001122 posix.mknod(support.TESTFN, mode, 0, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001123 except OSError as e:
1124 # Some old systems don't allow unprivileged users to use
1125 # mknod(), or only support creating device nodes.
xdegaye92c2ca72017-11-12 17:31:07 +01001126 self.assertIn(e.errno, (errno.EPERM, errno.EINVAL, errno.EACCES))
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001127 else:
1128 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
1129 finally:
1130 posix.close(f)
1131
Larry Hastings9cf065c2012-06-22 16:30:09 -07001132 @unittest.skipUnless(os.open in os.supports_dir_fd, "test needs dir_fd support in os.open()")
1133 def test_open_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001134 support.unlink(support.TESTFN)
1135 with open(support.TESTFN, 'w') as outfile:
1136 outfile.write("testline\n")
1137 a = posix.open(posix.getcwd(), posix.O_RDONLY)
Larry Hastings9cf065c2012-06-22 16:30:09 -07001138 b = posix.open(support.TESTFN, posix.O_RDONLY, dir_fd=a)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001139 try:
1140 res = posix.read(b, 9).decode(encoding="utf-8")
1141 self.assertEqual("testline\n", res)
1142 finally:
1143 posix.close(a)
1144 posix.close(b)
1145
Larry Hastings9cf065c2012-06-22 16:30:09 -07001146 @unittest.skipUnless(os.readlink in os.supports_dir_fd, "test needs dir_fd support in os.readlink()")
1147 def test_readlink_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001148 os.symlink(support.TESTFN, support.TESTFN + 'link')
1149 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1150 try:
1151 self.assertEqual(posix.readlink(support.TESTFN + 'link'),
Larry Hastings9cf065c2012-06-22 16:30:09 -07001152 posix.readlink(support.TESTFN + 'link', dir_fd=f))
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001153 finally:
1154 support.unlink(support.TESTFN + 'link')
1155 posix.close(f)
1156
Larry Hastings9cf065c2012-06-22 16:30:09 -07001157 @unittest.skipUnless(os.rename in os.supports_dir_fd, "test needs dir_fd support in os.rename()")
1158 def test_rename_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001159 support.unlink(support.TESTFN)
Victor Stinnerbf816222011-06-30 23:25:47 +02001160 support.create_empty_file(support.TESTFN + 'ren')
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001161 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1162 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -07001163 posix.rename(support.TESTFN + 'ren', support.TESTFN, src_dir_fd=f, dst_dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001164 except:
1165 posix.rename(support.TESTFN + 'ren', support.TESTFN)
1166 raise
1167 else:
Andrew Svetlov5b898402012-12-18 21:26:36 +02001168 posix.stat(support.TESTFN) # should not raise exception
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001169 finally:
1170 posix.close(f)
1171
Larry Hastings9cf065c2012-06-22 16:30:09 -07001172 @unittest.skipUnless(os.symlink in os.supports_dir_fd, "test needs dir_fd support in os.symlink()")
1173 def test_symlink_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001174 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1175 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -07001176 posix.symlink(support.TESTFN, support.TESTFN + 'link', dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001177 self.assertEqual(posix.readlink(support.TESTFN + 'link'), support.TESTFN)
1178 finally:
1179 posix.close(f)
1180 support.unlink(support.TESTFN + 'link')
1181
Larry Hastings9cf065c2012-06-22 16:30:09 -07001182 @unittest.skipUnless(os.unlink in os.supports_dir_fd, "test needs dir_fd support in os.unlink()")
1183 def test_unlink_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001184 f = posix.open(posix.getcwd(), posix.O_RDONLY)
Victor Stinnerbf816222011-06-30 23:25:47 +02001185 support.create_empty_file(support.TESTFN + 'del')
Andrew Svetlov5b898402012-12-18 21:26:36 +02001186 posix.stat(support.TESTFN + 'del') # should not raise exception
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001187 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -07001188 posix.unlink(support.TESTFN + 'del', dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001189 except:
1190 support.unlink(support.TESTFN + 'del')
1191 raise
1192 else:
1193 self.assertRaises(OSError, posix.stat, support.TESTFN + 'link')
1194 finally:
1195 posix.close(f)
1196
Larry Hastings9cf065c2012-06-22 16:30:09 -07001197 @unittest.skipUnless(os.mkfifo in os.supports_dir_fd, "test needs dir_fd support in os.mkfifo()")
1198 def test_mkfifo_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001199 support.unlink(support.TESTFN)
1200 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1201 try:
xdegaye92c2ca72017-11-12 17:31:07 +01001202 try:
1203 posix.mkfifo(support.TESTFN,
1204 stat.S_IRUSR | stat.S_IWUSR, dir_fd=f)
1205 except PermissionError as e:
1206 self.skipTest('posix.mkfifo(): %s' % e)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001207 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
1208 finally:
1209 posix.close(f)
1210
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001211 requires_sched_h = unittest.skipUnless(hasattr(posix, 'sched_yield'),
1212 "don't have scheduling support")
Antoine Pitrou84869872012-08-04 16:16:35 +02001213 requires_sched_affinity = unittest.skipUnless(hasattr(posix, 'sched_setaffinity'),
Benjamin Peterson50ba2712011-08-02 22:15:40 -05001214 "don't have sched affinity support")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001215
1216 @requires_sched_h
1217 def test_sched_yield(self):
1218 # This has no error conditions (at least on Linux).
1219 posix.sched_yield()
1220
1221 @requires_sched_h
Charles-François Nataliea0d5fc2011-09-06 19:03:35 +02001222 @unittest.skipUnless(hasattr(posix, 'sched_get_priority_max'),
1223 "requires sched_get_priority_max()")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001224 def test_sched_priority(self):
1225 # Round-robin usually has interesting priorities.
1226 pol = posix.SCHED_RR
1227 lo = posix.sched_get_priority_min(pol)
1228 hi = posix.sched_get_priority_max(pol)
1229 self.assertIsInstance(lo, int)
1230 self.assertIsInstance(hi, int)
1231 self.assertGreaterEqual(hi, lo)
Benjamin Peterson539b6c42011-08-02 22:09:37 -05001232 # OSX evidently just returns 15 without checking the argument.
1233 if sys.platform != "darwin":
Benjamin Petersonc1581582011-08-02 22:10:55 -05001234 self.assertRaises(OSError, posix.sched_get_priority_min, -23)
1235 self.assertRaises(OSError, posix.sched_get_priority_max, -23)
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001236
Benjamin Petersonc5fce4d2011-08-02 18:07:32 -05001237 @unittest.skipUnless(hasattr(posix, 'sched_setscheduler'), "can't change scheduler")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001238 def test_get_and_set_scheduler_and_param(self):
1239 possible_schedulers = [sched for name, sched in posix.__dict__.items()
1240 if name.startswith("SCHED_")]
1241 mine = posix.sched_getscheduler(0)
1242 self.assertIn(mine, possible_schedulers)
1243 try:
Jesus Ceaceb5d162011-09-10 01:16:55 +02001244 parent = posix.sched_getscheduler(os.getppid())
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001245 except OSError as e:
Jesus Ceaceb5d162011-09-10 01:16:55 +02001246 if e.errno != errno.EPERM:
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001247 raise
1248 else:
Jesus Ceaceb5d162011-09-10 01:16:55 +02001249 self.assertIn(parent, possible_schedulers)
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001250 self.assertRaises(OSError, posix.sched_getscheduler, -1)
1251 self.assertRaises(OSError, posix.sched_getparam, -1)
1252 param = posix.sched_getparam(0)
1253 self.assertIsInstance(param.sched_priority, int)
Charles-François Natali7b911cb2011-08-21 12:41:43 +02001254
Charles-François Natalib402a5c2013-01-13 14:13:25 +01001255 # POSIX states that calling sched_setparam() or sched_setscheduler() on
1256 # a process with a scheduling policy other than SCHED_FIFO or SCHED_RR
1257 # is implementation-defined: NetBSD and FreeBSD can return EINVAL.
1258 if not sys.platform.startswith(('freebsd', 'netbsd')):
1259 try:
1260 posix.sched_setscheduler(0, mine, param)
1261 posix.sched_setparam(0, param)
1262 except OSError as e:
1263 if e.errno != errno.EPERM:
1264 raise
Charles-François Natali7b911cb2011-08-21 12:41:43 +02001265 self.assertRaises(OSError, posix.sched_setparam, -1, param)
1266
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001267 self.assertRaises(OSError, posix.sched_setscheduler, -1, mine, param)
1268 self.assertRaises(TypeError, posix.sched_setscheduler, 0, mine, None)
1269 self.assertRaises(TypeError, posix.sched_setparam, 0, 43)
1270 param = posix.sched_param(None)
1271 self.assertRaises(TypeError, posix.sched_setparam, 0, param)
1272 large = 214748364700
1273 param = posix.sched_param(large)
1274 self.assertRaises(OverflowError, posix.sched_setparam, 0, param)
1275 param = posix.sched_param(sched_priority=-large)
1276 self.assertRaises(OverflowError, posix.sched_setparam, 0, param)
1277
Benjamin Petersonc5fce4d2011-08-02 18:07:32 -05001278 @unittest.skipUnless(hasattr(posix, "sched_rr_get_interval"), "no function")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001279 def test_sched_rr_get_interval(self):
Benjamin Peterson43234ab2011-08-02 22:19:14 -05001280 try:
1281 interval = posix.sched_rr_get_interval(0)
1282 except OSError as e:
1283 # This likely means that sched_rr_get_interval is only valid for
1284 # processes with the SCHED_RR scheduler in effect.
1285 if e.errno != errno.EINVAL:
1286 raise
1287 self.skipTest("only works on SCHED_RR processes")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001288 self.assertIsInstance(interval, float)
1289 # Reasonable constraints, I think.
1290 self.assertGreaterEqual(interval, 0.)
1291 self.assertLess(interval, 1.)
1292
Benjamin Peterson2740af82011-08-02 17:41:34 -05001293 @requires_sched_affinity
Antoine Pitrou84869872012-08-04 16:16:35 +02001294 def test_sched_getaffinity(self):
1295 mask = posix.sched_getaffinity(0)
1296 self.assertIsInstance(mask, set)
1297 self.assertGreaterEqual(len(mask), 1)
1298 self.assertRaises(OSError, posix.sched_getaffinity, -1)
1299 for cpu in mask:
1300 self.assertIsInstance(cpu, int)
1301 self.assertGreaterEqual(cpu, 0)
1302 self.assertLess(cpu, 1 << 32)
1303
1304 @requires_sched_affinity
1305 def test_sched_setaffinity(self):
1306 mask = posix.sched_getaffinity(0)
1307 if len(mask) > 1:
1308 # Empty masks are forbidden
1309 mask.pop()
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001310 posix.sched_setaffinity(0, mask)
Antoine Pitrou84869872012-08-04 16:16:35 +02001311 self.assertEqual(posix.sched_getaffinity(0), mask)
1312 self.assertRaises(OSError, posix.sched_setaffinity, 0, [])
1313 self.assertRaises(ValueError, posix.sched_setaffinity, 0, [-10])
1314 self.assertRaises(OverflowError, posix.sched_setaffinity, 0, [1<<128])
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001315 self.assertRaises(OSError, posix.sched_setaffinity, -1, mask)
1316
Victor Stinner8b905bd2011-10-25 13:34:04 +02001317 def test_rtld_constants(self):
1318 # check presence of major RTLD_* constants
1319 posix.RTLD_LAZY
1320 posix.RTLD_NOW
1321 posix.RTLD_GLOBAL
1322 posix.RTLD_LOCAL
1323
Jesus Cea60c13dd2012-06-23 02:58:14 +02001324 @unittest.skipUnless(hasattr(os, 'SEEK_HOLE'),
1325 "test needs an OS that reports file holes")
Hynek Schlawackf841e422012-06-24 09:51:46 +02001326 def test_fs_holes(self):
Jesus Cea94363612012-06-22 18:32:07 +02001327 # Even if the filesystem doesn't report holes,
1328 # if the OS supports it the SEEK_* constants
1329 # will be defined and will have a consistent
1330 # behaviour:
1331 # os.SEEK_DATA = current position
1332 # os.SEEK_HOLE = end of file position
Hynek Schlawackf841e422012-06-24 09:51:46 +02001333 with open(support.TESTFN, 'r+b') as fp:
Jesus Cea94363612012-06-22 18:32:07 +02001334 fp.write(b"hello")
1335 fp.flush()
1336 size = fp.tell()
1337 fno = fp.fileno()
Jesus Cead46f7d22012-07-07 14:56:04 +02001338 try :
1339 for i in range(size):
1340 self.assertEqual(i, os.lseek(fno, i, os.SEEK_DATA))
1341 self.assertLessEqual(size, os.lseek(fno, i, os.SEEK_HOLE))
1342 self.assertRaises(OSError, os.lseek, fno, size, os.SEEK_DATA)
1343 self.assertRaises(OSError, os.lseek, fno, size, os.SEEK_HOLE)
1344 except OSError :
1345 # Some OSs claim to support SEEK_HOLE/SEEK_DATA
1346 # but it is not true.
1347 # For instance:
1348 # http://lists.freebsd.org/pipermail/freebsd-amd64/2012-January/014332.html
1349 raise unittest.SkipTest("OSError raised!")
Jesus Cea94363612012-06-22 18:32:07 +02001350
Larry Hastingsb0827312014-02-09 22:05:19 -08001351 def test_path_error2(self):
1352 """
1353 Test functions that call path_error2(), providing two filenames in their exceptions.
1354 """
Victor Stinner047b7ae2014-10-05 17:37:41 +02001355 for name in ("rename", "replace", "link"):
Larry Hastingsb0827312014-02-09 22:05:19 -08001356 function = getattr(os, name, None)
Victor Stinnerbed04a72014-10-05 17:37:59 +02001357 if function is None:
1358 continue
Larry Hastingsb0827312014-02-09 22:05:19 -08001359
Victor Stinnerbed04a72014-10-05 17:37:59 +02001360 for dst in ("noodly2", support.TESTFN):
1361 try:
1362 function('doesnotexistfilename', dst)
1363 except OSError as e:
1364 self.assertIn("'doesnotexistfilename' -> '{}'".format(dst), str(e))
1365 break
1366 else:
1367 self.fail("No valid path_error2() test for os." + name)
Larry Hastingsb0827312014-02-09 22:05:19 -08001368
Serhiy Storchaka2b0d2002015-04-20 09:53:58 +03001369 def test_path_with_null_character(self):
1370 fn = support.TESTFN
1371 fn_with_NUL = fn + '\0'
1372 self.addCleanup(support.unlink, fn)
1373 support.unlink(fn)
1374 fd = None
1375 try:
Serhiy Storchaka7e9d1d12015-04-20 10:12:28 +03001376 with self.assertRaises(ValueError):
Serhiy Storchaka2b0d2002015-04-20 09:53:58 +03001377 fd = os.open(fn_with_NUL, os.O_WRONLY | os.O_CREAT) # raises
1378 finally:
1379 if fd is not None:
1380 os.close(fd)
1381 self.assertFalse(os.path.exists(fn))
Serhiy Storchaka7e9d1d12015-04-20 10:12:28 +03001382 self.assertRaises(ValueError, os.mkdir, fn_with_NUL)
Serhiy Storchaka2b0d2002015-04-20 09:53:58 +03001383 self.assertFalse(os.path.exists(fn))
1384 open(fn, 'wb').close()
Serhiy Storchaka7e9d1d12015-04-20 10:12:28 +03001385 self.assertRaises(ValueError, os.stat, fn_with_NUL)
Serhiy Storchaka2b0d2002015-04-20 09:53:58 +03001386
1387 def test_path_with_null_byte(self):
1388 fn = os.fsencode(support.TESTFN)
1389 fn_with_NUL = fn + b'\0'
1390 self.addCleanup(support.unlink, fn)
1391 support.unlink(fn)
1392 fd = None
1393 try:
1394 with self.assertRaises(ValueError):
1395 fd = os.open(fn_with_NUL, os.O_WRONLY | os.O_CREAT) # raises
1396 finally:
1397 if fd is not None:
1398 os.close(fd)
1399 self.assertFalse(os.path.exists(fn))
1400 self.assertRaises(ValueError, os.mkdir, fn_with_NUL)
1401 self.assertFalse(os.path.exists(fn))
1402 open(fn, 'wb').close()
1403 self.assertRaises(ValueError, os.stat, fn_with_NUL)
1404
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001405class PosixGroupsTester(unittest.TestCase):
1406
1407 def setUp(self):
1408 if posix.getuid() != 0:
1409 raise unittest.SkipTest("not enough privileges")
1410 if not hasattr(posix, 'getgroups'):
1411 raise unittest.SkipTest("need posix.getgroups")
1412 if sys.platform == 'darwin':
1413 raise unittest.SkipTest("getgroups(2) is broken on OSX")
1414 self.saved_groups = posix.getgroups()
1415
1416 def tearDown(self):
1417 if hasattr(posix, 'setgroups'):
1418 posix.setgroups(self.saved_groups)
1419 elif hasattr(posix, 'initgroups'):
1420 name = pwd.getpwuid(posix.getuid()).pw_name
1421 posix.initgroups(name, self.saved_groups[0])
1422
1423 @unittest.skipUnless(hasattr(posix, 'initgroups'),
1424 "test needs posix.initgroups()")
1425 def test_initgroups(self):
1426 # find missing group
1427
Benjamin Peterson659a6f52014-03-01 19:14:12 -05001428 g = max(self.saved_groups or [0]) + 1
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001429 name = pwd.getpwuid(posix.getuid()).pw_name
1430 posix.initgroups(name, g)
1431 self.assertIn(g, posix.getgroups())
1432
1433 @unittest.skipUnless(hasattr(posix, 'setgroups'),
1434 "test needs posix.setgroups()")
1435 def test_setgroups(self):
Antoine Pitroue5a91012010-09-04 17:32:06 +00001436 for groups in [[0], list(range(16))]:
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001437 posix.setgroups(groups)
1438 self.assertListEqual(groups, posix.getgroups())
1439
Neal Norwitze241ce82003-02-17 18:17:05 +00001440def test_main():
Antoine Pitrou68c95922011-03-20 17:33:57 +01001441 try:
1442 support.run_unittest(PosixTester, PosixGroupsTester)
1443 finally:
1444 support.reap_children()
Neal Norwitze241ce82003-02-17 18:17:05 +00001445
1446if __name__ == '__main__':
1447 test_main()