blob: 7dea1beab2c28b0a933a1e1582ffe36189b48e66 [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
Ross Lagerwall7807c352011-03-17 20:20:30 +0200180 @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
Pablo Galindo4defba32018-01-27 16:16:37 +0000276 @unittest.skipUnless(hasattr(posix, 'preadv'), "test needs posix.preadv()")
277 def test_preadv(self):
278 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
279 try:
280 os.write(fd, b'test1tt2t3t5t6t6t8')
281 buf = [bytearray(i) for i in [5, 3, 2]]
282 self.assertEqual(posix.preadv(fd, buf, 3), 10)
283 self.assertEqual([b't1tt2', b't3t', b'5t'], list(buf))
284 finally:
285 os.close(fd)
286
287 @unittest.skipUnless(hasattr(posix, 'RWF_HIPRI'), "test needs posix.RWF_HIPRI")
288 def test_preadv_flags(self):
289 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
290 try:
291 os.write(fd, b'test1tt2t3t5t6t6t8')
292 buf = [bytearray(i) for i in [5, 3, 2]]
293 self.assertEqual(posix.preadv(fd, buf, 3, os.RWF_HIPRI), 10)
294 self.assertEqual([b't1tt2', b't3t', b'5t'], list(buf))
295 finally:
296 os.close(fd)
297
Ross Lagerwall7807c352011-03-17 20:20:30 +0200298 @unittest.skipUnless(hasattr(posix, 'pwrite'), "test needs posix.pwrite()")
299 def test_pwrite(self):
300 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
301 try:
302 os.write(fd, b'test')
303 os.lseek(fd, 0, os.SEEK_SET)
304 posix.pwrite(fd, b'xx', 1)
305 self.assertEqual(b'txxt', posix.read(fd, 4))
306 finally:
307 os.close(fd)
308
Pablo Galindo4defba32018-01-27 16:16:37 +0000309 @unittest.skipUnless(hasattr(posix, 'pwritev'), "test needs posix.pwritev()")
310 def test_pwritev(self):
311 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
312 try:
313 os.write(fd, b"xx")
314 os.lseek(fd, 0, os.SEEK_SET)
315 n = os.pwritev(fd, [b'test1', b'tt2', b't3'], 2)
316 self.assertEqual(n, 10)
317
318 os.lseek(fd, 0, os.SEEK_SET)
319 self.assertEqual(b'xxtest1tt2t3', posix.read(fd, 100))
320 finally:
321 os.close(fd)
322
323 @unittest.skipUnless(hasattr(posix, 'os.RWF_SYNC'), "test needs os.RWF_SYNC")
324 def test_pwritev_flags(self):
325 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
326 try:
327 os.write(fd,b"xx")
328 os.lseek(fd, 0, os.SEEK_SET)
329 n = os.pwritev(fd, [b'test1', b'tt2', b't3'], 2, os.RWF_SYNC)
330 self.assertEqual(n, 10)
331
332 os.lseek(fd, 0, os.SEEK_SET)
333 self.assertEqual(b'xxtest1tt2', posix.read(fd, 100))
334 finally:
335 os.close(fd)
336
Ross Lagerwall7807c352011-03-17 20:20:30 +0200337 @unittest.skipUnless(hasattr(posix, 'posix_fallocate'),
338 "test needs posix.posix_fallocate()")
339 def test_posix_fallocate(self):
340 fd = os.open(support.TESTFN, os.O_WRONLY | os.O_CREAT)
341 try:
342 posix.posix_fallocate(fd, 0, 10)
343 except OSError as inst:
344 # issue10812, ZFS doesn't appear to support posix_fallocate,
345 # so skip Solaris-based since they are likely to have ZFS.
Miss Islington (bot)96fb8282018-05-26 14:57:01 -0700346 # issue33655: Also ignore EINVAL on *BSD since ZFS is also
347 # often used there.
348 if inst.errno == errno.EINVAL and sys.platform.startswith(
349 ('sunos', 'freebsd', 'netbsd', 'openbsd', 'gnukfreebsd')):
350 raise unittest.SkipTest("test may fail on ZFS filesystems")
351 else:
Ross Lagerwall7807c352011-03-17 20:20:30 +0200352 raise
353 finally:
354 os.close(fd)
355
Коренберг Маркd4b93e22017-08-14 18:55:16 +0500356 # issue31106 - posix_fallocate() does not set error in errno.
357 @unittest.skipUnless(hasattr(posix, 'posix_fallocate'),
358 "test needs posix.posix_fallocate()")
359 def test_posix_fallocate_errno(self):
360 try:
361 posix.posix_fallocate(-42, 0, 10)
362 except OSError as inst:
363 if inst.errno != errno.EBADF:
364 raise
365
Ross Lagerwall7807c352011-03-17 20:20:30 +0200366 @unittest.skipUnless(hasattr(posix, 'posix_fadvise'),
367 "test needs posix.posix_fadvise()")
368 def test_posix_fadvise(self):
369 fd = os.open(support.TESTFN, os.O_RDONLY)
370 try:
371 posix.posix_fadvise(fd, 0, 0, posix.POSIX_FADV_WILLNEED)
372 finally:
373 os.close(fd)
374
Коренберг Маркd4b93e22017-08-14 18:55:16 +0500375 @unittest.skipUnless(hasattr(posix, 'posix_fadvise'),
376 "test needs posix.posix_fadvise()")
377 def test_posix_fadvise_errno(self):
378 try:
379 posix.posix_fadvise(-42, 0, 0, posix.POSIX_FADV_WILLNEED)
380 except OSError as inst:
381 if inst.errno != errno.EBADF:
382 raise
383
Larry Hastings9cf065c2012-06-22 16:30:09 -0700384 @unittest.skipUnless(os.utime in os.supports_fd, "test needs fd support in os.utime")
385 def test_utime_with_fd(self):
Ross Lagerwall7807c352011-03-17 20:20:30 +0200386 now = time.time()
387 fd = os.open(support.TESTFN, os.O_RDONLY)
388 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700389 posix.utime(fd)
390 posix.utime(fd, None)
391 self.assertRaises(TypeError, posix.utime, fd, (None, None))
392 self.assertRaises(TypeError, posix.utime, fd, (now, None))
393 self.assertRaises(TypeError, posix.utime, fd, (None, now))
394 posix.utime(fd, (int(now), int(now)))
395 posix.utime(fd, (now, now))
396 self.assertRaises(ValueError, posix.utime, fd, (now, now), ns=(now, now))
397 self.assertRaises(ValueError, posix.utime, fd, (now, 0), ns=(None, None))
398 self.assertRaises(ValueError, posix.utime, fd, (None, None), ns=(now, 0))
399 posix.utime(fd, (int(now), int((now - int(now)) * 1e9)))
400 posix.utime(fd, ns=(int(now), int((now - int(now)) * 1e9)))
401
Ross Lagerwall7807c352011-03-17 20:20:30 +0200402 finally:
403 os.close(fd)
404
Larry Hastings9cf065c2012-06-22 16:30:09 -0700405 @unittest.skipUnless(os.utime in os.supports_follow_symlinks, "test needs follow_symlinks support in os.utime")
406 def test_utime_nofollow_symlinks(self):
Ross Lagerwall7807c352011-03-17 20:20:30 +0200407 now = time.time()
Larry Hastings9cf065c2012-06-22 16:30:09 -0700408 posix.utime(support.TESTFN, None, follow_symlinks=False)
409 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None), follow_symlinks=False)
410 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None), follow_symlinks=False)
411 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now), follow_symlinks=False)
412 posix.utime(support.TESTFN, (int(now), int(now)), follow_symlinks=False)
413 posix.utime(support.TESTFN, (now, now), follow_symlinks=False)
414 posix.utime(support.TESTFN, follow_symlinks=False)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200415
416 @unittest.skipUnless(hasattr(posix, 'writev'), "test needs posix.writev()")
417 def test_writev(self):
418 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
419 try:
Victor Stinner57ddf782014-01-08 15:21:28 +0100420 n = os.writev(fd, (b'test1', b'tt2', b't3'))
421 self.assertEqual(n, 10)
422
Ross Lagerwall7807c352011-03-17 20:20:30 +0200423 os.lseek(fd, 0, os.SEEK_SET)
424 self.assertEqual(b'test1tt2t3', posix.read(fd, 10))
Victor Stinner57ddf782014-01-08 15:21:28 +0100425
426 # Issue #20113: empty list of buffers should not crash
Victor Stinnercd5ca6a2014-01-08 16:01:31 +0100427 try:
428 size = posix.writev(fd, [])
429 except OSError:
430 # writev(fd, []) raises OSError(22, "Invalid argument")
431 # on OpenIndiana
432 pass
433 else:
434 self.assertEqual(size, 0)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200435 finally:
436 os.close(fd)
437
438 @unittest.skipUnless(hasattr(posix, 'readv'), "test needs posix.readv()")
439 def test_readv(self):
440 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
441 try:
442 os.write(fd, b'test1tt2t3')
443 os.lseek(fd, 0, os.SEEK_SET)
444 buf = [bytearray(i) for i in [5, 3, 2]]
445 self.assertEqual(posix.readv(fd, buf), 10)
446 self.assertEqual([b'test1', b'tt2', b't3'], [bytes(i) for i in buf])
Victor Stinner57ddf782014-01-08 15:21:28 +0100447
448 # Issue #20113: empty list of buffers should not crash
Victor Stinnercd5ca6a2014-01-08 16:01:31 +0100449 try:
450 size = posix.readv(fd, [])
451 except OSError:
452 # readv(fd, []) raises OSError(22, "Invalid argument")
453 # on OpenIndiana
454 pass
455 else:
456 self.assertEqual(size, 0)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200457 finally:
458 os.close(fd)
459
Serhiy Storchaka43767632013-11-03 21:31:38 +0200460 @unittest.skipUnless(hasattr(posix, 'dup'),
461 'test needs posix.dup()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000462 def test_dup(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200463 fp = open(support.TESTFN)
464 try:
465 fd = posix.dup(fp.fileno())
466 self.assertIsInstance(fd, int)
467 os.close(fd)
468 finally:
469 fp.close()
Neal Norwitze241ce82003-02-17 18:17:05 +0000470
Serhiy Storchaka43767632013-11-03 21:31:38 +0200471 @unittest.skipUnless(hasattr(posix, 'confstr'),
472 'test needs posix.confstr()')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000473 def test_confstr(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200474 self.assertRaises(ValueError, posix.confstr, "CS_garbage")
475 self.assertEqual(len(posix.confstr("CS_PATH")) > 0, True)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000476
Serhiy Storchaka43767632013-11-03 21:31:38 +0200477 @unittest.skipUnless(hasattr(posix, 'dup2'),
478 'test needs posix.dup2()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000479 def test_dup2(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200480 fp1 = open(support.TESTFN)
481 fp2 = open(support.TESTFN)
482 try:
483 posix.dup2(fp1.fileno(), fp2.fileno())
484 finally:
485 fp1.close()
486 fp2.close()
Neal Norwitze241ce82003-02-17 18:17:05 +0000487
Charles-François Natali1e045b12011-05-22 20:42:32 +0200488 @unittest.skipUnless(hasattr(os, 'O_CLOEXEC'), "needs os.O_CLOEXEC")
Charles-François Natali239bb962011-06-03 12:55:15 +0200489 @support.requires_linux_version(2, 6, 23)
Charles-François Natali1e045b12011-05-22 20:42:32 +0200490 def test_oscloexec(self):
491 fd = os.open(support.TESTFN, os.O_RDONLY|os.O_CLOEXEC)
492 self.addCleanup(os.close, fd)
Victor Stinner1db9e7b2014-07-29 22:32:47 +0200493 self.assertFalse(os.get_inheritable(fd))
Charles-François Natali1e045b12011-05-22 20:42:32 +0200494
Serhiy Storchaka43767632013-11-03 21:31:38 +0200495 @unittest.skipUnless(hasattr(posix, 'O_EXLOCK'),
496 'test needs posix.O_EXLOCK')
Skip Montanaro98470002005-06-17 01:14:49 +0000497 def test_osexlock(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200498 fd = os.open(support.TESTFN,
499 os.O_WRONLY|os.O_EXLOCK|os.O_CREAT)
500 self.assertRaises(OSError, os.open, support.TESTFN,
501 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
502 os.close(fd)
503
504 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000505 fd = os.open(support.TESTFN,
Serhiy Storchaka43767632013-11-03 21:31:38 +0200506 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000507 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000508 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
509 os.close(fd)
510
Serhiy Storchaka43767632013-11-03 21:31:38 +0200511 @unittest.skipUnless(hasattr(posix, 'O_SHLOCK'),
512 'test needs posix.O_SHLOCK')
Skip Montanaro98470002005-06-17 01:14:49 +0000513 def test_osshlock(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200514 fd1 = os.open(support.TESTFN,
515 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
516 fd2 = os.open(support.TESTFN,
517 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
518 os.close(fd2)
519 os.close(fd1)
520
521 if hasattr(posix, "O_EXLOCK"):
522 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000523 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Serhiy Storchaka43767632013-11-03 21:31:38 +0200524 self.assertRaises(OSError, os.open, support.TESTFN,
525 os.O_RDONLY|os.O_EXLOCK|os.O_NONBLOCK)
526 os.close(fd)
Skip Montanaro98470002005-06-17 01:14:49 +0000527
Serhiy Storchaka43767632013-11-03 21:31:38 +0200528 @unittest.skipUnless(hasattr(posix, 'fstat'),
529 'test needs posix.fstat()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000530 def test_fstat(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200531 fp = open(support.TESTFN)
532 try:
533 self.assertTrue(posix.fstat(fp.fileno()))
534 self.assertTrue(posix.stat(fp.fileno()))
Serhiy Storchakaa2ad5c32013-01-07 23:13:46 +0200535
Serhiy Storchaka43767632013-11-03 21:31:38 +0200536 self.assertRaisesRegex(TypeError,
Brett Cannon3f9183b2016-08-26 14:44:48 -0700537 'should be string, bytes, os.PathLike or integer, not',
Serhiy Storchaka43767632013-11-03 21:31:38 +0200538 posix.stat, float(fp.fileno()))
539 finally:
540 fp.close()
Neal Norwitze241ce82003-02-17 18:17:05 +0000541
Serhiy Storchaka43767632013-11-03 21:31:38 +0200542 @unittest.skipUnless(hasattr(posix, 'stat'),
543 'test needs posix.stat()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000544 def test_stat(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200545 self.assertTrue(posix.stat(support.TESTFN))
546 self.assertTrue(posix.stat(os.fsencode(support.TESTFN)))
Serhiy Storchakaa2ad5c32013-01-07 23:13:46 +0200547
Serhiy Storchakad73c3182016-08-06 23:22:08 +0300548 self.assertWarnsRegex(DeprecationWarning,
Brett Cannon3f9183b2016-08-26 14:44:48 -0700549 'should be string, bytes, os.PathLike or integer, not',
Serhiy Storchakad73c3182016-08-06 23:22:08 +0300550 posix.stat, bytearray(os.fsencode(support.TESTFN)))
Serhiy Storchaka43767632013-11-03 21:31:38 +0200551 self.assertRaisesRegex(TypeError,
Brett Cannon3f9183b2016-08-26 14:44:48 -0700552 'should be string, bytes, os.PathLike or integer, not',
Serhiy Storchaka43767632013-11-03 21:31:38 +0200553 posix.stat, None)
554 self.assertRaisesRegex(TypeError,
Brett Cannon3f9183b2016-08-26 14:44:48 -0700555 'should be string, bytes, os.PathLike or integer, not',
Serhiy Storchaka43767632013-11-03 21:31:38 +0200556 posix.stat, list(support.TESTFN))
557 self.assertRaisesRegex(TypeError,
Brett Cannon3f9183b2016-08-26 14:44:48 -0700558 'should be string, bytes, os.PathLike or integer, not',
Serhiy Storchaka43767632013-11-03 21:31:38 +0200559 posix.stat, list(os.fsencode(support.TESTFN)))
Neal Norwitze241ce82003-02-17 18:17:05 +0000560
Benjamin Peterson052a02b2010-08-17 01:27:09 +0000561 @unittest.skipUnless(hasattr(posix, 'mkfifo'), "don't have mkfifo()")
562 def test_mkfifo(self):
563 support.unlink(support.TESTFN)
xdegaye92c2ca72017-11-12 17:31:07 +0100564 try:
565 posix.mkfifo(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR)
566 except PermissionError as e:
567 self.skipTest('posix.mkfifo(): %s' % e)
Benjamin Peterson052a02b2010-08-17 01:27:09 +0000568 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
569
570 @unittest.skipUnless(hasattr(posix, 'mknod') and hasattr(stat, 'S_IFIFO'),
571 "don't have mknod()/S_IFIFO")
572 def test_mknod(self):
573 # Test using mknod() to create a FIFO (the only use specified
574 # by POSIX).
575 support.unlink(support.TESTFN)
576 mode = stat.S_IFIFO | stat.S_IRUSR | stat.S_IWUSR
577 try:
578 posix.mknod(support.TESTFN, mode, 0)
579 except OSError as e:
580 # Some old systems don't allow unprivileged users to use
581 # mknod(), or only support creating device nodes.
xdegaye92c2ca72017-11-12 17:31:07 +0100582 self.assertIn(e.errno, (errno.EPERM, errno.EINVAL, errno.EACCES))
Benjamin Peterson052a02b2010-08-17 01:27:09 +0000583 else:
584 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
585
Martin Panterbf19d162015-09-09 01:01:13 +0000586 # Keyword arguments are also supported
587 support.unlink(support.TESTFN)
588 try:
589 posix.mknod(path=support.TESTFN, mode=mode, device=0,
590 dir_fd=None)
591 except OSError as e:
xdegaye92c2ca72017-11-12 17:31:07 +0100592 self.assertIn(e.errno, (errno.EPERM, errno.EINVAL, errno.EACCES))
Martin Panterbf19d162015-09-09 01:01:13 +0000593
Serhiy Storchaka16b2e4f2015-04-20 09:22:13 +0300594 @unittest.skipUnless(hasattr(posix, 'stat'), 'test needs posix.stat()')
595 @unittest.skipUnless(hasattr(posix, 'makedev'), 'test needs posix.makedev()')
596 def test_makedev(self):
597 st = posix.stat(support.TESTFN)
598 dev = st.st_dev
599 self.assertIsInstance(dev, int)
600 self.assertGreaterEqual(dev, 0)
601
602 major = posix.major(dev)
603 self.assertIsInstance(major, int)
604 self.assertGreaterEqual(major, 0)
605 self.assertEqual(posix.major(dev), major)
606 self.assertRaises(TypeError, posix.major, float(dev))
607 self.assertRaises(TypeError, posix.major)
608 self.assertRaises((ValueError, OverflowError), posix.major, -1)
609
610 minor = posix.minor(dev)
611 self.assertIsInstance(minor, int)
612 self.assertGreaterEqual(minor, 0)
613 self.assertEqual(posix.minor(dev), minor)
614 self.assertRaises(TypeError, posix.minor, float(dev))
615 self.assertRaises(TypeError, posix.minor)
616 self.assertRaises((ValueError, OverflowError), posix.minor, -1)
617
Victor Stinner13ff2452018-01-22 18:32:50 +0100618 # FIXME: reenable these tests on FreeBSD with the kernel fix
Victor Stinner12953ff2017-07-27 16:55:54 +0200619 if sys.platform.startswith('freebsd') and dev >= 0x1_0000_0000:
620 self.skipTest("bpo-31044: on FreeBSD CURRENT, minor() truncates "
621 "64-bit dev to 32-bit")
622
Serhiy Storchaka16b2e4f2015-04-20 09:22:13 +0300623 self.assertEqual(posix.makedev(major, minor), dev)
624 self.assertRaises(TypeError, posix.makedev, float(major), minor)
625 self.assertRaises(TypeError, posix.makedev, major, float(minor))
626 self.assertRaises(TypeError, posix.makedev, major)
627 self.assertRaises(TypeError, posix.makedev)
628
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200629 def _test_all_chown_common(self, chown_func, first_param, stat_func):
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000630 """Common code for chown, fchown and lchown tests."""
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200631 def check_stat(uid, gid):
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200632 if stat_func is not None:
633 stat = stat_func(first_param)
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200634 self.assertEqual(stat.st_uid, uid)
635 self.assertEqual(stat.st_gid, gid)
636 uid = os.getuid()
637 gid = os.getgid()
Charles-François Nataliab2d58e2012-04-17 19:48:35 +0200638 # test a successful chown call
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200639 chown_func(first_param, uid, gid)
640 check_stat(uid, gid)
641 chown_func(first_param, -1, gid)
642 check_stat(uid, gid)
643 chown_func(first_param, uid, -1)
644 check_stat(uid, gid)
Charles-François Nataliab2d58e2012-04-17 19:48:35 +0200645
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200646 if uid == 0:
647 # Try an amusingly large uid/gid to make sure we handle
648 # large unsigned values. (chown lets you use any
649 # uid/gid you like, even if they aren't defined.)
650 #
651 # This problem keeps coming up:
652 # http://bugs.python.org/issue1747858
653 # http://bugs.python.org/issue4591
654 # http://bugs.python.org/issue15301
655 # Hopefully the fix in 4591 fixes it for good!
656 #
657 # This part of the test only runs when run as root.
658 # Only scary people run their tests as root.
659
660 big_value = 2**31
661 chown_func(first_param, big_value, big_value)
662 check_stat(big_value, big_value)
663 chown_func(first_param, -1, -1)
664 check_stat(big_value, big_value)
665 chown_func(first_param, uid, gid)
666 check_stat(uid, gid)
Charles-François Nataliab2d58e2012-04-17 19:48:35 +0200667 elif platform.system() in ('HP-UX', 'SunOS'):
668 # HP-UX and Solaris can allow a non-root user to chown() to root
669 # (issue #5113)
670 raise unittest.SkipTest("Skipping because of non-standard chown() "
671 "behavior")
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000672 else:
673 # non-root cannot chown to root, raises OSError
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200674 self.assertRaises(OSError, chown_func, first_param, 0, 0)
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200675 check_stat(uid, gid)
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200676 self.assertRaises(OSError, chown_func, first_param, 0, -1)
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200677 check_stat(uid, gid)
Serhiy Storchakaa2964b32013-02-21 14:34:36 +0200678 if 0 not in os.getgroups():
Serhiy Storchakab3d62ce2013-02-20 19:48:22 +0200679 self.assertRaises(OSError, chown_func, first_param, -1, 0)
680 check_stat(uid, gid)
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200681 # test illegal types
682 for t in str, float:
683 self.assertRaises(TypeError, chown_func, first_param, t(uid), gid)
684 check_stat(uid, gid)
685 self.assertRaises(TypeError, chown_func, first_param, uid, t(gid))
686 check_stat(uid, gid)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000687
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000688 @unittest.skipUnless(hasattr(posix, 'chown'), "test needs os.chown()")
689 def test_chown(self):
690 # raise an OSError if the file does not exist
691 os.unlink(support.TESTFN)
692 self.assertRaises(OSError, posix.chown, support.TESTFN, -1, -1)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000693
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000694 # re-create the file
Victor Stinnerbf816222011-06-30 23:25:47 +0200695 support.create_empty_file(support.TESTFN)
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200696 self._test_all_chown_common(posix.chown, support.TESTFN,
697 getattr(posix, 'stat', None))
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000698
699 @unittest.skipUnless(hasattr(posix, 'fchown'), "test needs os.fchown()")
700 def test_fchown(self):
701 os.unlink(support.TESTFN)
702
703 # re-create the file
704 test_file = open(support.TESTFN, 'w')
705 try:
706 fd = test_file.fileno()
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200707 self._test_all_chown_common(posix.fchown, fd,
708 getattr(posix, 'fstat', None))
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000709 finally:
710 test_file.close()
711
712 @unittest.skipUnless(hasattr(posix, 'lchown'), "test needs os.lchown()")
713 def test_lchown(self):
714 os.unlink(support.TESTFN)
715 # create a symlink
Ned Deily3eb67d52011-06-28 00:00:28 -0700716 os.symlink(_DUMMY_SYMLINK, support.TESTFN)
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200717 self._test_all_chown_common(posix.lchown, support.TESTFN,
718 getattr(posix, 'lstat', None))
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000719
Serhiy Storchaka43767632013-11-03 21:31:38 +0200720 @unittest.skipUnless(hasattr(posix, 'chdir'), 'test needs posix.chdir()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000721 def test_chdir(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200722 posix.chdir(os.curdir)
723 self.assertRaises(OSError, posix.chdir, support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000724
Martin v. Löwisc9e1c7d2010-07-23 12:16:41 +0000725 def test_listdir(self):
Serhiy Storchaka1180e5a2017-07-11 06:36:46 +0300726 self.assertIn(support.TESTFN, posix.listdir(os.curdir))
Martin v. Löwisc9e1c7d2010-07-23 12:16:41 +0000727
728 def test_listdir_default(self):
Larry Hastingsfdaea062012-06-25 04:42:23 -0700729 # When listdir is called without argument,
730 # it's the same as listdir(os.curdir).
Serhiy Storchaka1180e5a2017-07-11 06:36:46 +0300731 self.assertIn(support.TESTFN, posix.listdir())
Neal Norwitze241ce82003-02-17 18:17:05 +0000732
Larry Hastingsfdaea062012-06-25 04:42:23 -0700733 def test_listdir_bytes(self):
734 # When listdir is called with a bytes object,
735 # the returned strings are of type bytes.
Serhiy Storchaka1180e5a2017-07-11 06:36:46 +0300736 self.assertIn(os.fsencode(support.TESTFN), posix.listdir(b'.'))
737
738 def test_listdir_bytes_like(self):
739 for cls in bytearray, memoryview:
740 with self.assertWarns(DeprecationWarning):
741 names = posix.listdir(cls(b'.'))
742 self.assertIn(os.fsencode(support.TESTFN), names)
743 for name in names:
744 self.assertIs(type(name), bytes)
Larry Hastingsfdaea062012-06-25 04:42:23 -0700745
746 @unittest.skipUnless(posix.listdir in os.supports_fd,
747 "test needs fd support for posix.listdir()")
748 def test_listdir_fd(self):
Antoine Pitrou8250e232011-02-25 23:41:16 +0000749 f = posix.open(posix.getcwd(), posix.O_RDONLY)
Charles-François Natali7546ad32012-01-08 18:34:06 +0100750 self.addCleanup(posix.close, f)
Antoine Pitrou8250e232011-02-25 23:41:16 +0000751 self.assertEqual(
752 sorted(posix.listdir('.')),
Larry Hastings9cf065c2012-06-22 16:30:09 -0700753 sorted(posix.listdir(f))
Antoine Pitrou8250e232011-02-25 23:41:16 +0000754 )
Charles-François Natali7546ad32012-01-08 18:34:06 +0100755 # Check that the fd offset was reset (issue #13739)
Charles-François Natali7546ad32012-01-08 18:34:06 +0100756 self.assertEqual(
757 sorted(posix.listdir('.')),
Larry Hastings9cf065c2012-06-22 16:30:09 -0700758 sorted(posix.listdir(f))
Charles-François Natali7546ad32012-01-08 18:34:06 +0100759 )
Antoine Pitrou8250e232011-02-25 23:41:16 +0000760
Serhiy Storchaka43767632013-11-03 21:31:38 +0200761 @unittest.skipUnless(hasattr(posix, 'access'), 'test needs posix.access()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000762 def test_access(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200763 self.assertTrue(posix.access(support.TESTFN, os.R_OK))
Neal Norwitze241ce82003-02-17 18:17:05 +0000764
Serhiy Storchaka43767632013-11-03 21:31:38 +0200765 @unittest.skipUnless(hasattr(posix, 'umask'), 'test needs posix.umask()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000766 def test_umask(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200767 old_mask = posix.umask(0)
768 self.assertIsInstance(old_mask, int)
769 posix.umask(old_mask)
Neal Norwitze241ce82003-02-17 18:17:05 +0000770
Serhiy Storchaka43767632013-11-03 21:31:38 +0200771 @unittest.skipUnless(hasattr(posix, 'strerror'),
772 'test needs posix.strerror()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000773 def test_strerror(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200774 self.assertTrue(posix.strerror(0))
Neal Norwitze241ce82003-02-17 18:17:05 +0000775
Serhiy Storchaka43767632013-11-03 21:31:38 +0200776 @unittest.skipUnless(hasattr(posix, 'pipe'), 'test needs posix.pipe()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000777 def test_pipe(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200778 reader, writer = posix.pipe()
779 os.close(reader)
780 os.close(writer)
Neal Norwitze241ce82003-02-17 18:17:05 +0000781
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200782 @unittest.skipUnless(hasattr(os, 'pipe2'), "test needs os.pipe2()")
Charles-François Natali239bb962011-06-03 12:55:15 +0200783 @support.requires_linux_version(2, 6, 27)
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200784 def test_pipe2(self):
785 self.assertRaises(TypeError, os.pipe2, 'DEADBEEF')
786 self.assertRaises(TypeError, os.pipe2, 0, 0)
787
Charles-François Natali368f34b2011-06-06 19:49:47 +0200788 # try calling with flags = 0, like os.pipe()
789 r, w = os.pipe2(0)
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200790 os.close(r)
791 os.close(w)
792
793 # test flags
794 r, w = os.pipe2(os.O_CLOEXEC|os.O_NONBLOCK)
795 self.addCleanup(os.close, r)
796 self.addCleanup(os.close, w)
Victor Stinnerbff989e2013-08-28 12:25:40 +0200797 self.assertFalse(os.get_inheritable(r))
798 self.assertFalse(os.get_inheritable(w))
Victor Stinner1db9e7b2014-07-29 22:32:47 +0200799 self.assertFalse(os.get_blocking(r))
800 self.assertFalse(os.get_blocking(w))
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200801 # try reading from an empty pipe: this should fail, not block
802 self.assertRaises(OSError, os.read, r, 1)
803 # try a write big enough to fill-up the pipe: this should either
804 # fail or perform a partial write, not block
805 try:
806 os.write(w, b'x' * support.PIPE_MAX_SIZE)
807 except OSError:
808 pass
809
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +0200810 @support.cpython_only
811 @unittest.skipUnless(hasattr(os, 'pipe2'), "test needs os.pipe2()")
812 @support.requires_linux_version(2, 6, 27)
813 def test_pipe2_c_limits(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +0200814 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +0200815 import _testcapi
Serhiy Storchaka78980432013-01-15 01:12:17 +0200816 self.assertRaises(OverflowError, os.pipe2, _testcapi.INT_MAX + 1)
817 self.assertRaises(OverflowError, os.pipe2, _testcapi.UINT_MAX + 1)
818
Serhiy Storchaka43767632013-11-03 21:31:38 +0200819 @unittest.skipUnless(hasattr(posix, 'utime'), 'test needs posix.utime()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000820 def test_utime(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200821 now = time.time()
822 posix.utime(support.TESTFN, None)
823 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None))
824 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None))
825 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now))
826 posix.utime(support.TESTFN, (int(now), int(now)))
827 posix.utime(support.TESTFN, (now, now))
Neal Norwitze241ce82003-02-17 18:17:05 +0000828
Larry Hastings9cf065c2012-06-22 16:30:09 -0700829 def _test_chflags_regular_file(self, chflags_func, target_file, **kwargs):
Ned Deily3eb67d52011-06-28 00:00:28 -0700830 st = os.stat(target_file)
831 self.assertTrue(hasattr(st, 'st_flags'))
Trent Nelson75959cf2012-08-21 23:59:31 +0000832
833 # ZFS returns EOPNOTSUPP when attempting to set flag UF_IMMUTABLE.
834 flags = st.st_flags | stat.UF_IMMUTABLE
835 try:
836 chflags_func(target_file, flags, **kwargs)
837 except OSError as err:
838 if err.errno != errno.EOPNOTSUPP:
839 raise
840 msg = 'chflag UF_IMMUTABLE not supported by underlying fs'
841 self.skipTest(msg)
842
Ned Deily3eb67d52011-06-28 00:00:28 -0700843 try:
844 new_st = os.stat(target_file)
845 self.assertEqual(st.st_flags | stat.UF_IMMUTABLE, new_st.st_flags)
846 try:
847 fd = open(target_file, 'w+')
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200848 except OSError as e:
Ned Deily3eb67d52011-06-28 00:00:28 -0700849 self.assertEqual(e.errno, errno.EPERM)
850 finally:
851 posix.chflags(target_file, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000852
Ned Deily3eb67d52011-06-28 00:00:28 -0700853 @unittest.skipUnless(hasattr(posix, 'chflags'), 'test needs os.chflags()')
854 def test_chflags(self):
855 self._test_chflags_regular_file(posix.chflags, support.TESTFN)
856
857 @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
858 def test_lchflags_regular_file(self):
859 self._test_chflags_regular_file(posix.lchflags, support.TESTFN)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700860 self._test_chflags_regular_file(posix.chflags, support.TESTFN, follow_symlinks=False)
Ned Deily3eb67d52011-06-28 00:00:28 -0700861
862 @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
863 def test_lchflags_symlink(self):
864 testfn_st = os.stat(support.TESTFN)
865
866 self.assertTrue(hasattr(testfn_st, 'st_flags'))
867
868 os.symlink(support.TESTFN, _DUMMY_SYMLINK)
869 self.teardown_files.append(_DUMMY_SYMLINK)
870 dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
871
Larry Hastings9cf065c2012-06-22 16:30:09 -0700872 def chflags_nofollow(path, flags):
873 return posix.chflags(path, flags, follow_symlinks=False)
Ned Deily3eb67d52011-06-28 00:00:28 -0700874
Larry Hastings9cf065c2012-06-22 16:30:09 -0700875 for fn in (posix.lchflags, chflags_nofollow):
Trent Nelson75959cf2012-08-21 23:59:31 +0000876 # ZFS returns EOPNOTSUPP when attempting to set flag UF_IMMUTABLE.
877 flags = dummy_symlink_st.st_flags | stat.UF_IMMUTABLE
878 try:
879 fn(_DUMMY_SYMLINK, flags)
880 except OSError as err:
881 if err.errno != errno.EOPNOTSUPP:
882 raise
883 msg = 'chflag UF_IMMUTABLE not supported by underlying fs'
884 self.skipTest(msg)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700885 try:
886 new_testfn_st = os.stat(support.TESTFN)
887 new_dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
888
889 self.assertEqual(testfn_st.st_flags, new_testfn_st.st_flags)
890 self.assertEqual(dummy_symlink_st.st_flags | stat.UF_IMMUTABLE,
891 new_dummy_symlink_st.st_flags)
892 finally:
893 fn(_DUMMY_SYMLINK, dummy_symlink_st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000894
Guido van Rossum98297ee2007-11-06 21:34:58 +0000895 def test_environ(self):
Victor Stinner17b490d2010-05-06 22:19:30 +0000896 if os.name == "nt":
897 item_type = str
898 else:
899 item_type = bytes
Guido van Rossum98297ee2007-11-06 21:34:58 +0000900 for k, v in posix.environ.items():
Victor Stinner17b490d2010-05-06 22:19:30 +0000901 self.assertEqual(type(k), item_type)
902 self.assertEqual(type(v), item_type)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000903
Serhiy Storchaka77703942017-06-25 07:33:01 +0300904 @unittest.skipUnless(hasattr(os, "putenv"), "requires os.putenv()")
905 def test_putenv(self):
906 with self.assertRaises(ValueError):
907 os.putenv('FRUIT\0VEGETABLE', 'cabbage')
908 with self.assertRaises(ValueError):
909 os.putenv(b'FRUIT\0VEGETABLE', b'cabbage')
910 with self.assertRaises(ValueError):
911 os.putenv('FRUIT', 'orange\0VEGETABLE=cabbage')
912 with self.assertRaises(ValueError):
913 os.putenv(b'FRUIT', b'orange\0VEGETABLE=cabbage')
914 with self.assertRaises(ValueError):
915 os.putenv('FRUIT=ORANGE', 'lemon')
916 with self.assertRaises(ValueError):
917 os.putenv(b'FRUIT=ORANGE', b'lemon')
918
Serhiy Storchaka43767632013-11-03 21:31:38 +0200919 @unittest.skipUnless(hasattr(posix, 'getcwd'), 'test needs posix.getcwd()')
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000920 def test_getcwd_long_pathnames(self):
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500921 dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef'
922 curdir = os.getcwd()
923 base_path = os.path.abspath(support.TESTFN) + '.getcwd'
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000924
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500925 try:
926 os.mkdir(base_path)
927 os.chdir(base_path)
928 except:
929 # Just returning nothing instead of the SkipTest exception, because
930 # the test results in Error in that case. Is that ok?
931 # raise unittest.SkipTest("cannot create directory for testing")
932 return
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000933
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500934 def _create_and_do_getcwd(dirname, current_path_length = 0):
935 try:
936 os.mkdir(dirname)
937 except:
938 raise unittest.SkipTest("mkdir cannot create directory sufficiently deep for getcwd test")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000939
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500940 os.chdir(dirname)
941 try:
942 os.getcwd()
943 if current_path_length < 1027:
944 _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
945 finally:
946 os.chdir('..')
947 os.rmdir(dirname)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000948
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500949 _create_and_do_getcwd(dirname)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000950
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500951 finally:
952 os.chdir(curdir)
953 support.rmtree(base_path)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000954
Ross Lagerwallb0ae53d2011-06-10 07:30:30 +0200955 @unittest.skipUnless(hasattr(posix, 'getgrouplist'), "test needs posix.getgrouplist()")
956 @unittest.skipUnless(hasattr(pwd, 'getpwuid'), "test needs pwd.getpwuid()")
957 @unittest.skipUnless(hasattr(os, 'getuid'), "test needs os.getuid()")
958 def test_getgrouplist(self):
Ross Lagerwalla0b315f2012-12-13 15:20:26 +0000959 user = pwd.getpwuid(os.getuid())[0]
960 group = pwd.getpwuid(os.getuid())[3]
961 self.assertIn(group, posix.getgrouplist(user, group))
Ross Lagerwallb0ae53d2011-06-10 07:30:30 +0200962
Ross Lagerwallb0ae53d2011-06-10 07:30:30 +0200963
Antoine Pitrou318b8f32011-01-12 18:45:27 +0000964 @unittest.skipUnless(hasattr(os, 'getegid'), "test needs os.getegid()")
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000965 def test_getgroups(self):
Jesus Cea61f32cb2014-06-28 18:39:35 +0200966 with os.popen('id -G 2>/dev/null') as idg:
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000967 groups = idg.read().strip()
Charles-François Natalie8a255a2012-05-02 20:01:38 +0200968 ret = idg.close()
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000969
Xavier de Gaye24c3b492016-10-19 11:00:26 +0200970 try:
971 idg_groups = set(int(g) for g in groups.split())
972 except ValueError:
973 idg_groups = set()
974 if ret is not None or not idg_groups:
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000975 raise unittest.SkipTest("need working 'id -G'")
976
Ned Deily028915e2013-02-02 15:08:52 -0800977 # Issues 16698: OS X ABIs prior to 10.6 have limits on getgroups()
978 if sys.platform == 'darwin':
979 import sysconfig
980 dt = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') or '10.0'
Ned Deily04cdfa12014-06-25 13:36:14 -0700981 if tuple(int(n) for n in dt.split('.')[0:2]) < (10, 6):
Ned Deily028915e2013-02-02 15:08:52 -0800982 raise unittest.SkipTest("getgroups(2) is broken prior to 10.6")
983
Ronald Oussoren7fb6f512010-08-01 19:18:13 +0000984 # 'id -G' and 'os.getgroups()' should return the same
Xavier de Gaye24c3b492016-10-19 11:00:26 +0200985 # groups, ignoring order, duplicates, and the effective gid.
986 # #10822/#26944 - It is implementation defined whether
987 # posix.getgroups() includes the effective gid.
988 symdiff = idg_groups.symmetric_difference(posix.getgroups())
989 self.assertTrue(not symdiff or symdiff == {posix.getegid()})
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000990
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000991 # tests for the posix *at functions follow
992
Larry Hastings9cf065c2012-06-22 16:30:09 -0700993 @unittest.skipUnless(os.access in os.supports_dir_fd, "test needs dir_fd support for os.access()")
994 def test_access_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000995 f = posix.open(posix.getcwd(), posix.O_RDONLY)
996 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700997 self.assertTrue(posix.access(support.TESTFN, os.R_OK, dir_fd=f))
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000998 finally:
999 posix.close(f)
1000
Larry Hastings9cf065c2012-06-22 16:30:09 -07001001 @unittest.skipUnless(os.chmod in os.supports_dir_fd, "test needs dir_fd support in os.chmod()")
1002 def test_chmod_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001003 os.chmod(support.TESTFN, stat.S_IRUSR)
1004
1005 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1006 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -07001007 posix.chmod(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001008
1009 s = posix.stat(support.TESTFN)
1010 self.assertEqual(s[0] & stat.S_IRWXU, stat.S_IRUSR | stat.S_IWUSR)
1011 finally:
1012 posix.close(f)
1013
Larry Hastings9cf065c2012-06-22 16:30:09 -07001014 @unittest.skipUnless(os.chown in os.supports_dir_fd, "test needs dir_fd support in os.chown()")
1015 def test_chown_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001016 support.unlink(support.TESTFN)
Victor Stinnerbf816222011-06-30 23:25:47 +02001017 support.create_empty_file(support.TESTFN)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001018
1019 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1020 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -07001021 posix.chown(support.TESTFN, os.getuid(), os.getgid(), dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001022 finally:
1023 posix.close(f)
1024
Larry Hastings9cf065c2012-06-22 16:30:09 -07001025 @unittest.skipUnless(os.stat in os.supports_dir_fd, "test needs dir_fd support in os.stat()")
1026 def test_stat_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001027 support.unlink(support.TESTFN)
1028 with open(support.TESTFN, 'w') as outfile:
1029 outfile.write("testline\n")
1030
1031 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1032 try:
1033 s1 = posix.stat(support.TESTFN)
Larry Hastings9cf065c2012-06-22 16:30:09 -07001034 s2 = posix.stat(support.TESTFN, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001035 self.assertEqual(s1, s2)
Serhiy Storchakaa2ad5c32013-01-07 23:13:46 +02001036 s2 = posix.stat(support.TESTFN, dir_fd=None)
1037 self.assertEqual(s1, s2)
Serhiy Storchaka7155b882016-04-08 08:48:20 +03001038 self.assertRaisesRegex(TypeError, 'should be integer or None, not',
Serhiy Storchakaa2ad5c32013-01-07 23:13:46 +02001039 posix.stat, support.TESTFN, dir_fd=posix.getcwd())
Serhiy Storchaka7155b882016-04-08 08:48:20 +03001040 self.assertRaisesRegex(TypeError, 'should be integer or None, not',
Serhiy Storchakaa2ad5c32013-01-07 23:13:46 +02001041 posix.stat, support.TESTFN, dir_fd=float(f))
1042 self.assertRaises(OverflowError,
1043 posix.stat, support.TESTFN, dir_fd=10**20)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001044 finally:
1045 posix.close(f)
1046
Larry Hastings9cf065c2012-06-22 16:30:09 -07001047 @unittest.skipUnless(os.utime in os.supports_dir_fd, "test needs dir_fd support in os.utime()")
1048 def test_utime_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001049 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1050 try:
1051 now = time.time()
Larry Hastings9cf065c2012-06-22 16:30:09 -07001052 posix.utime(support.TESTFN, None, dir_fd=f)
1053 posix.utime(support.TESTFN, dir_fd=f)
1054 self.assertRaises(TypeError, posix.utime, support.TESTFN, now, dir_fd=f)
1055 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None), dir_fd=f)
1056 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None), dir_fd=f)
1057 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now), dir_fd=f)
1058 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, "x"), dir_fd=f)
1059 posix.utime(support.TESTFN, (int(now), int(now)), dir_fd=f)
1060 posix.utime(support.TESTFN, (now, now), dir_fd=f)
1061 posix.utime(support.TESTFN,
1062 (int(now), int((now - int(now)) * 1e9)), dir_fd=f)
1063 posix.utime(support.TESTFN, dir_fd=f,
1064 times=(int(now), int((now - int(now)) * 1e9)))
1065
Larry Hastings90867a52012-06-22 17:01:41 -07001066 # try dir_fd and follow_symlinks together
Larry Hastings9cf065c2012-06-22 16:30:09 -07001067 if os.utime in os.supports_follow_symlinks:
Larry Hastings90867a52012-06-22 17:01:41 -07001068 try:
1069 posix.utime(support.TESTFN, follow_symlinks=False, dir_fd=f)
Georg Brandl969288e2012-06-26 09:25:44 +02001070 except ValueError:
Larry Hastings90867a52012-06-22 17:01:41 -07001071 # whoops! using both together not supported on this platform.
1072 pass
Larry Hastings9cf065c2012-06-22 16:30:09 -07001073
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001074 finally:
1075 posix.close(f)
1076
Larry Hastings9cf065c2012-06-22 16:30:09 -07001077 @unittest.skipUnless(os.link in os.supports_dir_fd, "test needs dir_fd support in os.link()")
1078 def test_link_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001079 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1080 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -07001081 posix.link(support.TESTFN, support.TESTFN + 'link', src_dir_fd=f, dst_dir_fd=f)
xdegaye92c2ca72017-11-12 17:31:07 +01001082 except PermissionError as e:
1083 self.skipTest('posix.link(): %s' % e)
1084 else:
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001085 # should have same inodes
1086 self.assertEqual(posix.stat(support.TESTFN)[1],
1087 posix.stat(support.TESTFN + 'link')[1])
1088 finally:
1089 posix.close(f)
1090 support.unlink(support.TESTFN + 'link')
1091
Larry Hastings9cf065c2012-06-22 16:30:09 -07001092 @unittest.skipUnless(os.mkdir in os.supports_dir_fd, "test needs dir_fd support in os.mkdir()")
1093 def test_mkdir_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001094 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1095 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -07001096 posix.mkdir(support.TESTFN + 'dir', dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001097 posix.stat(support.TESTFN + 'dir') # should not raise exception
1098 finally:
1099 posix.close(f)
1100 support.rmtree(support.TESTFN + 'dir')
1101
Larry Hastings9cf065c2012-06-22 16:30:09 -07001102 @unittest.skipUnless((os.mknod in os.supports_dir_fd) and hasattr(stat, 'S_IFIFO'),
1103 "test requires both stat.S_IFIFO and dir_fd support for os.mknod()")
1104 def test_mknod_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001105 # Test using mknodat() to create a FIFO (the only use specified
1106 # by POSIX).
1107 support.unlink(support.TESTFN)
1108 mode = stat.S_IFIFO | stat.S_IRUSR | stat.S_IWUSR
1109 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1110 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -07001111 posix.mknod(support.TESTFN, mode, 0, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001112 except OSError as e:
1113 # Some old systems don't allow unprivileged users to use
1114 # mknod(), or only support creating device nodes.
xdegaye92c2ca72017-11-12 17:31:07 +01001115 self.assertIn(e.errno, (errno.EPERM, errno.EINVAL, errno.EACCES))
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001116 else:
1117 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
1118 finally:
1119 posix.close(f)
1120
Larry Hastings9cf065c2012-06-22 16:30:09 -07001121 @unittest.skipUnless(os.open in os.supports_dir_fd, "test needs dir_fd support in os.open()")
1122 def test_open_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001123 support.unlink(support.TESTFN)
1124 with open(support.TESTFN, 'w') as outfile:
1125 outfile.write("testline\n")
1126 a = posix.open(posix.getcwd(), posix.O_RDONLY)
Larry Hastings9cf065c2012-06-22 16:30:09 -07001127 b = posix.open(support.TESTFN, posix.O_RDONLY, dir_fd=a)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001128 try:
1129 res = posix.read(b, 9).decode(encoding="utf-8")
1130 self.assertEqual("testline\n", res)
1131 finally:
1132 posix.close(a)
1133 posix.close(b)
1134
Larry Hastings9cf065c2012-06-22 16:30:09 -07001135 @unittest.skipUnless(os.readlink in os.supports_dir_fd, "test needs dir_fd support in os.readlink()")
1136 def test_readlink_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001137 os.symlink(support.TESTFN, support.TESTFN + 'link')
1138 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1139 try:
1140 self.assertEqual(posix.readlink(support.TESTFN + 'link'),
Larry Hastings9cf065c2012-06-22 16:30:09 -07001141 posix.readlink(support.TESTFN + 'link', dir_fd=f))
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001142 finally:
1143 support.unlink(support.TESTFN + 'link')
1144 posix.close(f)
1145
Larry Hastings9cf065c2012-06-22 16:30:09 -07001146 @unittest.skipUnless(os.rename in os.supports_dir_fd, "test needs dir_fd support in os.rename()")
1147 def test_rename_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001148 support.unlink(support.TESTFN)
Victor Stinnerbf816222011-06-30 23:25:47 +02001149 support.create_empty_file(support.TESTFN + 'ren')
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001150 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1151 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -07001152 posix.rename(support.TESTFN + 'ren', support.TESTFN, src_dir_fd=f, dst_dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001153 except:
1154 posix.rename(support.TESTFN + 'ren', support.TESTFN)
1155 raise
1156 else:
Andrew Svetlov5b898402012-12-18 21:26:36 +02001157 posix.stat(support.TESTFN) # should not raise exception
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001158 finally:
1159 posix.close(f)
1160
Larry Hastings9cf065c2012-06-22 16:30:09 -07001161 @unittest.skipUnless(os.symlink in os.supports_dir_fd, "test needs dir_fd support in os.symlink()")
1162 def test_symlink_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001163 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1164 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -07001165 posix.symlink(support.TESTFN, support.TESTFN + 'link', dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001166 self.assertEqual(posix.readlink(support.TESTFN + 'link'), support.TESTFN)
1167 finally:
1168 posix.close(f)
1169 support.unlink(support.TESTFN + 'link')
1170
Larry Hastings9cf065c2012-06-22 16:30:09 -07001171 @unittest.skipUnless(os.unlink in os.supports_dir_fd, "test needs dir_fd support in os.unlink()")
1172 def test_unlink_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001173 f = posix.open(posix.getcwd(), posix.O_RDONLY)
Victor Stinnerbf816222011-06-30 23:25:47 +02001174 support.create_empty_file(support.TESTFN + 'del')
Andrew Svetlov5b898402012-12-18 21:26:36 +02001175 posix.stat(support.TESTFN + 'del') # should not raise exception
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001176 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -07001177 posix.unlink(support.TESTFN + 'del', dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001178 except:
1179 support.unlink(support.TESTFN + 'del')
1180 raise
1181 else:
1182 self.assertRaises(OSError, posix.stat, support.TESTFN + 'link')
1183 finally:
1184 posix.close(f)
1185
Larry Hastings9cf065c2012-06-22 16:30:09 -07001186 @unittest.skipUnless(os.mkfifo in os.supports_dir_fd, "test needs dir_fd support in os.mkfifo()")
1187 def test_mkfifo_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001188 support.unlink(support.TESTFN)
1189 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1190 try:
xdegaye92c2ca72017-11-12 17:31:07 +01001191 try:
1192 posix.mkfifo(support.TESTFN,
1193 stat.S_IRUSR | stat.S_IWUSR, dir_fd=f)
1194 except PermissionError as e:
1195 self.skipTest('posix.mkfifo(): %s' % e)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001196 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
1197 finally:
1198 posix.close(f)
1199
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001200 requires_sched_h = unittest.skipUnless(hasattr(posix, 'sched_yield'),
1201 "don't have scheduling support")
Antoine Pitrou84869872012-08-04 16:16:35 +02001202 requires_sched_affinity = unittest.skipUnless(hasattr(posix, 'sched_setaffinity'),
Benjamin Peterson50ba2712011-08-02 22:15:40 -05001203 "don't have sched affinity support")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001204
1205 @requires_sched_h
1206 def test_sched_yield(self):
1207 # This has no error conditions (at least on Linux).
1208 posix.sched_yield()
1209
1210 @requires_sched_h
Charles-François Nataliea0d5fc2011-09-06 19:03:35 +02001211 @unittest.skipUnless(hasattr(posix, 'sched_get_priority_max'),
1212 "requires sched_get_priority_max()")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001213 def test_sched_priority(self):
1214 # Round-robin usually has interesting priorities.
1215 pol = posix.SCHED_RR
1216 lo = posix.sched_get_priority_min(pol)
1217 hi = posix.sched_get_priority_max(pol)
1218 self.assertIsInstance(lo, int)
1219 self.assertIsInstance(hi, int)
1220 self.assertGreaterEqual(hi, lo)
Benjamin Peterson539b6c42011-08-02 22:09:37 -05001221 # OSX evidently just returns 15 without checking the argument.
1222 if sys.platform != "darwin":
Benjamin Petersonc1581582011-08-02 22:10:55 -05001223 self.assertRaises(OSError, posix.sched_get_priority_min, -23)
1224 self.assertRaises(OSError, posix.sched_get_priority_max, -23)
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001225
Benjamin Petersonc5fce4d2011-08-02 18:07:32 -05001226 @unittest.skipUnless(hasattr(posix, 'sched_setscheduler'), "can't change scheduler")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001227 def test_get_and_set_scheduler_and_param(self):
1228 possible_schedulers = [sched for name, sched in posix.__dict__.items()
1229 if name.startswith("SCHED_")]
1230 mine = posix.sched_getscheduler(0)
1231 self.assertIn(mine, possible_schedulers)
1232 try:
Jesus Ceaceb5d162011-09-10 01:16:55 +02001233 parent = posix.sched_getscheduler(os.getppid())
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001234 except OSError as e:
Jesus Ceaceb5d162011-09-10 01:16:55 +02001235 if e.errno != errno.EPERM:
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001236 raise
1237 else:
Jesus Ceaceb5d162011-09-10 01:16:55 +02001238 self.assertIn(parent, possible_schedulers)
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001239 self.assertRaises(OSError, posix.sched_getscheduler, -1)
1240 self.assertRaises(OSError, posix.sched_getparam, -1)
1241 param = posix.sched_getparam(0)
1242 self.assertIsInstance(param.sched_priority, int)
Charles-François Natali7b911cb2011-08-21 12:41:43 +02001243
Charles-François Natalib402a5c2013-01-13 14:13:25 +01001244 # POSIX states that calling sched_setparam() or sched_setscheduler() on
1245 # a process with a scheduling policy other than SCHED_FIFO or SCHED_RR
1246 # is implementation-defined: NetBSD and FreeBSD can return EINVAL.
1247 if not sys.platform.startswith(('freebsd', 'netbsd')):
1248 try:
1249 posix.sched_setscheduler(0, mine, param)
1250 posix.sched_setparam(0, param)
1251 except OSError as e:
1252 if e.errno != errno.EPERM:
1253 raise
Charles-François Natali7b911cb2011-08-21 12:41:43 +02001254 self.assertRaises(OSError, posix.sched_setparam, -1, param)
1255
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001256 self.assertRaises(OSError, posix.sched_setscheduler, -1, mine, param)
1257 self.assertRaises(TypeError, posix.sched_setscheduler, 0, mine, None)
1258 self.assertRaises(TypeError, posix.sched_setparam, 0, 43)
1259 param = posix.sched_param(None)
1260 self.assertRaises(TypeError, posix.sched_setparam, 0, param)
1261 large = 214748364700
1262 param = posix.sched_param(large)
1263 self.assertRaises(OverflowError, posix.sched_setparam, 0, param)
1264 param = posix.sched_param(sched_priority=-large)
1265 self.assertRaises(OverflowError, posix.sched_setparam, 0, param)
1266
Benjamin Petersonc5fce4d2011-08-02 18:07:32 -05001267 @unittest.skipUnless(hasattr(posix, "sched_rr_get_interval"), "no function")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001268 def test_sched_rr_get_interval(self):
Benjamin Peterson43234ab2011-08-02 22:19:14 -05001269 try:
1270 interval = posix.sched_rr_get_interval(0)
1271 except OSError as e:
1272 # This likely means that sched_rr_get_interval is only valid for
1273 # processes with the SCHED_RR scheduler in effect.
1274 if e.errno != errno.EINVAL:
1275 raise
1276 self.skipTest("only works on SCHED_RR processes")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001277 self.assertIsInstance(interval, float)
1278 # Reasonable constraints, I think.
1279 self.assertGreaterEqual(interval, 0.)
1280 self.assertLess(interval, 1.)
1281
Benjamin Peterson2740af82011-08-02 17:41:34 -05001282 @requires_sched_affinity
Antoine Pitrou84869872012-08-04 16:16:35 +02001283 def test_sched_getaffinity(self):
1284 mask = posix.sched_getaffinity(0)
1285 self.assertIsInstance(mask, set)
1286 self.assertGreaterEqual(len(mask), 1)
1287 self.assertRaises(OSError, posix.sched_getaffinity, -1)
1288 for cpu in mask:
1289 self.assertIsInstance(cpu, int)
1290 self.assertGreaterEqual(cpu, 0)
1291 self.assertLess(cpu, 1 << 32)
1292
1293 @requires_sched_affinity
1294 def test_sched_setaffinity(self):
1295 mask = posix.sched_getaffinity(0)
1296 if len(mask) > 1:
1297 # Empty masks are forbidden
1298 mask.pop()
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001299 posix.sched_setaffinity(0, mask)
Antoine Pitrou84869872012-08-04 16:16:35 +02001300 self.assertEqual(posix.sched_getaffinity(0), mask)
1301 self.assertRaises(OSError, posix.sched_setaffinity, 0, [])
1302 self.assertRaises(ValueError, posix.sched_setaffinity, 0, [-10])
1303 self.assertRaises(OverflowError, posix.sched_setaffinity, 0, [1<<128])
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001304 self.assertRaises(OSError, posix.sched_setaffinity, -1, mask)
1305
Victor Stinner8b905bd2011-10-25 13:34:04 +02001306 def test_rtld_constants(self):
1307 # check presence of major RTLD_* constants
1308 posix.RTLD_LAZY
1309 posix.RTLD_NOW
1310 posix.RTLD_GLOBAL
1311 posix.RTLD_LOCAL
1312
Jesus Cea60c13dd2012-06-23 02:58:14 +02001313 @unittest.skipUnless(hasattr(os, 'SEEK_HOLE'),
1314 "test needs an OS that reports file holes")
Hynek Schlawackf841e422012-06-24 09:51:46 +02001315 def test_fs_holes(self):
Jesus Cea94363612012-06-22 18:32:07 +02001316 # Even if the filesystem doesn't report holes,
1317 # if the OS supports it the SEEK_* constants
1318 # will be defined and will have a consistent
1319 # behaviour:
1320 # os.SEEK_DATA = current position
1321 # os.SEEK_HOLE = end of file position
Hynek Schlawackf841e422012-06-24 09:51:46 +02001322 with open(support.TESTFN, 'r+b') as fp:
Jesus Cea94363612012-06-22 18:32:07 +02001323 fp.write(b"hello")
1324 fp.flush()
1325 size = fp.tell()
1326 fno = fp.fileno()
Jesus Cead46f7d22012-07-07 14:56:04 +02001327 try :
1328 for i in range(size):
1329 self.assertEqual(i, os.lseek(fno, i, os.SEEK_DATA))
1330 self.assertLessEqual(size, os.lseek(fno, i, os.SEEK_HOLE))
1331 self.assertRaises(OSError, os.lseek, fno, size, os.SEEK_DATA)
1332 self.assertRaises(OSError, os.lseek, fno, size, os.SEEK_HOLE)
1333 except OSError :
1334 # Some OSs claim to support SEEK_HOLE/SEEK_DATA
1335 # but it is not true.
1336 # For instance:
1337 # http://lists.freebsd.org/pipermail/freebsd-amd64/2012-January/014332.html
1338 raise unittest.SkipTest("OSError raised!")
Jesus Cea94363612012-06-22 18:32:07 +02001339
Larry Hastingsb0827312014-02-09 22:05:19 -08001340 def test_path_error2(self):
1341 """
1342 Test functions that call path_error2(), providing two filenames in their exceptions.
1343 """
Victor Stinner047b7ae2014-10-05 17:37:41 +02001344 for name in ("rename", "replace", "link"):
Larry Hastingsb0827312014-02-09 22:05:19 -08001345 function = getattr(os, name, None)
Victor Stinnerbed04a72014-10-05 17:37:59 +02001346 if function is None:
1347 continue
Larry Hastingsb0827312014-02-09 22:05:19 -08001348
Victor Stinnerbed04a72014-10-05 17:37:59 +02001349 for dst in ("noodly2", support.TESTFN):
1350 try:
1351 function('doesnotexistfilename', dst)
1352 except OSError as e:
1353 self.assertIn("'doesnotexistfilename' -> '{}'".format(dst), str(e))
1354 break
1355 else:
1356 self.fail("No valid path_error2() test for os." + name)
Larry Hastingsb0827312014-02-09 22:05:19 -08001357
Serhiy Storchaka2b0d2002015-04-20 09:53:58 +03001358 def test_path_with_null_character(self):
1359 fn = support.TESTFN
1360 fn_with_NUL = fn + '\0'
1361 self.addCleanup(support.unlink, fn)
1362 support.unlink(fn)
1363 fd = None
1364 try:
Serhiy Storchaka7e9d1d12015-04-20 10:12:28 +03001365 with self.assertRaises(ValueError):
Serhiy Storchaka2b0d2002015-04-20 09:53:58 +03001366 fd = os.open(fn_with_NUL, os.O_WRONLY | os.O_CREAT) # raises
1367 finally:
1368 if fd is not None:
1369 os.close(fd)
1370 self.assertFalse(os.path.exists(fn))
Serhiy Storchaka7e9d1d12015-04-20 10:12:28 +03001371 self.assertRaises(ValueError, os.mkdir, fn_with_NUL)
Serhiy Storchaka2b0d2002015-04-20 09:53:58 +03001372 self.assertFalse(os.path.exists(fn))
1373 open(fn, 'wb').close()
Serhiy Storchaka7e9d1d12015-04-20 10:12:28 +03001374 self.assertRaises(ValueError, os.stat, fn_with_NUL)
Serhiy Storchaka2b0d2002015-04-20 09:53:58 +03001375
1376 def test_path_with_null_byte(self):
1377 fn = os.fsencode(support.TESTFN)
1378 fn_with_NUL = fn + b'\0'
1379 self.addCleanup(support.unlink, fn)
1380 support.unlink(fn)
1381 fd = None
1382 try:
1383 with self.assertRaises(ValueError):
1384 fd = os.open(fn_with_NUL, os.O_WRONLY | os.O_CREAT) # raises
1385 finally:
1386 if fd is not None:
1387 os.close(fd)
1388 self.assertFalse(os.path.exists(fn))
1389 self.assertRaises(ValueError, os.mkdir, fn_with_NUL)
1390 self.assertFalse(os.path.exists(fn))
1391 open(fn, 'wb').close()
1392 self.assertRaises(ValueError, os.stat, fn_with_NUL)
1393
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001394class PosixGroupsTester(unittest.TestCase):
1395
1396 def setUp(self):
1397 if posix.getuid() != 0:
1398 raise unittest.SkipTest("not enough privileges")
1399 if not hasattr(posix, 'getgroups'):
1400 raise unittest.SkipTest("need posix.getgroups")
1401 if sys.platform == 'darwin':
1402 raise unittest.SkipTest("getgroups(2) is broken on OSX")
1403 self.saved_groups = posix.getgroups()
1404
1405 def tearDown(self):
1406 if hasattr(posix, 'setgroups'):
1407 posix.setgroups(self.saved_groups)
1408 elif hasattr(posix, 'initgroups'):
1409 name = pwd.getpwuid(posix.getuid()).pw_name
1410 posix.initgroups(name, self.saved_groups[0])
1411
1412 @unittest.skipUnless(hasattr(posix, 'initgroups'),
1413 "test needs posix.initgroups()")
1414 def test_initgroups(self):
1415 # find missing group
1416
Benjamin Peterson659a6f52014-03-01 19:14:12 -05001417 g = max(self.saved_groups or [0]) + 1
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001418 name = pwd.getpwuid(posix.getuid()).pw_name
1419 posix.initgroups(name, g)
1420 self.assertIn(g, posix.getgroups())
1421
1422 @unittest.skipUnless(hasattr(posix, 'setgroups'),
1423 "test needs posix.setgroups()")
1424 def test_setgroups(self):
Antoine Pitroue5a91012010-09-04 17:32:06 +00001425 for groups in [[0], list(range(16))]:
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001426 posix.setgroups(groups)
1427 self.assertListEqual(groups, posix.getgroups())
1428
Neal Norwitze241ce82003-02-17 18:17:05 +00001429def test_main():
Antoine Pitrou68c95922011-03-20 17:33:57 +01001430 try:
Pablo Galindo8e633a42018-05-14 17:52:43 -04001431 support.run_unittest(PosixTester, PosixGroupsTester)
Antoine Pitrou68c95922011-03-20 17:33:57 +01001432 finally:
1433 support.reap_children()
Neal Norwitze241ce82003-02-17 18:17:05 +00001434
1435if __name__ == '__main__':
1436 test_main()