blob: c3dfffb1784537ededc59febe193f34f48580c84 [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
R. David Murrayeb3615d2009-04-22 02:24:39 +00004
5# Skip these tests if there is no posix module.
6posix = support.import_module('posix')
Neal Norwitze241ce82003-02-17 18:17:05 +00007
Antoine Pitroub7572f02009-12-02 20:46:48 +00008import errno
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00009import sys
Neal Norwitze241ce82003-02-17 18:17:05 +000010import time
11import os
Charles-François Natali1e045b12011-05-22 20:42:32 +020012import fcntl
Christian Heimesd5e2b6f2008-03-19 21:50:51 +000013import pwd
Benjamin Petersondcf97b92008-07-02 17:30:14 +000014import shutil
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
Martin v. Löwis7aed61a2009-11-27 14:09:49 +000055 if hasattr(posix, 'getresuid'):
56 def test_getresuid(self):
57 user_ids = posix.getresuid()
58 self.assertEqual(len(user_ids), 3)
59 for val in user_ids:
60 self.assertGreaterEqual(val, 0)
61
62 if hasattr(posix, 'getresgid'):
63 def test_getresgid(self):
64 group_ids = posix.getresgid()
65 self.assertEqual(len(group_ids), 3)
66 for val in group_ids:
67 self.assertGreaterEqual(val, 0)
68
69 if hasattr(posix, 'setresuid'):
70 def test_setresuid(self):
71 current_user_ids = posix.getresuid()
72 self.assertIsNone(posix.setresuid(*current_user_ids))
73 # -1 means don't change that value.
74 self.assertIsNone(posix.setresuid(-1, -1, -1))
75
76 def test_setresuid_exception(self):
77 # Don't do this test if someone is silly enough to run us as root.
78 current_user_ids = posix.getresuid()
79 if 0 not in current_user_ids:
80 new_user_ids = (current_user_ids[0]+1, -1, -1)
81 self.assertRaises(OSError, posix.setresuid, *new_user_ids)
82
83 if hasattr(posix, 'setresgid'):
84 def test_setresgid(self):
85 current_group_ids = posix.getresgid()
86 self.assertIsNone(posix.setresgid(*current_group_ids))
87 # -1 means don't change that value.
88 self.assertIsNone(posix.setresgid(-1, -1, -1))
89
90 def test_setresgid_exception(self):
91 # Don't do this test if someone is silly enough to run us as root.
92 current_group_ids = posix.getresgid()
93 if 0 not in current_group_ids:
94 new_group_ids = (current_group_ids[0]+1, -1, -1)
95 self.assertRaises(OSError, posix.setresgid, *new_group_ids)
96
Antoine Pitroub7572f02009-12-02 20:46:48 +000097 @unittest.skipUnless(hasattr(posix, 'initgroups'),
98 "test needs os.initgroups()")
99 def test_initgroups(self):
100 # It takes a string and an integer; check that it raises a TypeError
101 # for other argument lists.
102 self.assertRaises(TypeError, posix.initgroups)
103 self.assertRaises(TypeError, posix.initgroups, None)
104 self.assertRaises(TypeError, posix.initgroups, 3, "foo")
105 self.assertRaises(TypeError, posix.initgroups, "foo", 3, object())
106
107 # If a non-privileged user invokes it, it should fail with OSError
108 # EPERM.
109 if os.getuid() != 0:
110 name = pwd.getpwuid(posix.getuid()).pw_name
111 try:
112 posix.initgroups(name, 13)
113 except OSError as e:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000114 self.assertEqual(e.errno, errno.EPERM)
Antoine Pitroub7572f02009-12-02 20:46:48 +0000115 else:
116 self.fail("Expected OSError to be raised by initgroups")
117
Neal Norwitze241ce82003-02-17 18:17:05 +0000118 def test_statvfs(self):
119 if hasattr(posix, 'statvfs'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000120 self.assertTrue(posix.statvfs(os.curdir))
Neal Norwitze241ce82003-02-17 18:17:05 +0000121
122 def test_fstatvfs(self):
123 if hasattr(posix, 'fstatvfs'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000124 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000125 try:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000126 self.assertTrue(posix.fstatvfs(fp.fileno()))
Neal Norwitze241ce82003-02-17 18:17:05 +0000127 finally:
128 fp.close()
129
130 def test_ftruncate(self):
131 if hasattr(posix, 'ftruncate'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000132 fp = open(support.TESTFN, 'w+')
Neal Norwitze241ce82003-02-17 18:17:05 +0000133 try:
134 # we need to have some data to truncate
135 fp.write('test')
136 fp.flush()
137 posix.ftruncate(fp.fileno(), 0)
138 finally:
139 fp.close()
140
Ross Lagerwall7807c352011-03-17 20:20:30 +0200141 @unittest.skipUnless(hasattr(posix, 'truncate'), "test needs posix.truncate()")
142 def test_truncate(self):
143 with open(support.TESTFN, 'w') as fp:
144 fp.write('test')
145 fp.flush()
146 posix.truncate(support.TESTFN, 0)
147
148 @unittest.skipUnless(hasattr(posix, 'fexecve'), "test needs posix.fexecve()")
149 @unittest.skipUnless(hasattr(os, 'fork'), "test needs os.fork()")
Ross Lagerwalldedf6cf2011-03-20 18:27:05 +0200150 @unittest.skipUnless(hasattr(os, 'waitpid'), "test needs os.waitpid()")
Ross Lagerwall7807c352011-03-17 20:20:30 +0200151 def test_fexecve(self):
152 fp = os.open(sys.executable, os.O_RDONLY)
153 try:
154 pid = os.fork()
155 if pid == 0:
156 os.chdir(os.path.split(sys.executable)[0])
157 posix.fexecve(fp, [sys.executable, '-c', 'pass'], os.environ)
158 else:
Ross Lagerwalldedf6cf2011-03-20 18:27:05 +0200159 self.assertEqual(os.waitpid(pid, 0), (pid, 0))
Ross Lagerwall7807c352011-03-17 20:20:30 +0200160 finally:
161 os.close(fp)
162
163 @unittest.skipUnless(hasattr(posix, 'waitid'), "test needs posix.waitid()")
164 @unittest.skipUnless(hasattr(os, 'fork'), "test needs os.fork()")
165 def test_waitid(self):
166 pid = os.fork()
167 if pid == 0:
168 os.chdir(os.path.split(sys.executable)[0])
169 posix.execve(sys.executable, [sys.executable, '-c', 'pass'], os.environ)
170 else:
171 res = posix.waitid(posix.P_PID, pid, posix.WEXITED)
172 self.assertEqual(pid, res.si_pid)
173
174 @unittest.skipUnless(hasattr(posix, 'lockf'), "test needs posix.lockf()")
175 def test_lockf(self):
176 fd = os.open(support.TESTFN, os.O_WRONLY | os.O_CREAT)
177 try:
178 os.write(fd, b'test')
179 os.lseek(fd, 0, os.SEEK_SET)
180 posix.lockf(fd, posix.F_LOCK, 4)
181 # section is locked
182 posix.lockf(fd, posix.F_ULOCK, 4)
183 finally:
184 os.close(fd)
185
186 @unittest.skipUnless(hasattr(posix, 'pread'), "test needs posix.pread()")
187 def test_pread(self):
188 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
189 try:
190 os.write(fd, b'test')
191 os.lseek(fd, 0, os.SEEK_SET)
192 self.assertEqual(b'es', posix.pread(fd, 2, 1))
Florent Xiclunae41f0de2011-11-11 19:39:25 +0100193 # the first pread() shouldn't disturb the file offset
Ross Lagerwall7807c352011-03-17 20:20:30 +0200194 self.assertEqual(b'te', posix.read(fd, 2))
195 finally:
196 os.close(fd)
197
198 @unittest.skipUnless(hasattr(posix, 'pwrite'), "test needs posix.pwrite()")
199 def test_pwrite(self):
200 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
201 try:
202 os.write(fd, b'test')
203 os.lseek(fd, 0, os.SEEK_SET)
204 posix.pwrite(fd, b'xx', 1)
205 self.assertEqual(b'txxt', posix.read(fd, 4))
206 finally:
207 os.close(fd)
208
209 @unittest.skipUnless(hasattr(posix, 'posix_fallocate'),
210 "test needs posix.posix_fallocate()")
211 def test_posix_fallocate(self):
212 fd = os.open(support.TESTFN, os.O_WRONLY | os.O_CREAT)
213 try:
214 posix.posix_fallocate(fd, 0, 10)
215 except OSError as inst:
216 # issue10812, ZFS doesn't appear to support posix_fallocate,
217 # so skip Solaris-based since they are likely to have ZFS.
218 if inst.errno != errno.EINVAL or not sys.platform.startswith("sunos"):
219 raise
220 finally:
221 os.close(fd)
222
223 @unittest.skipUnless(hasattr(posix, 'posix_fadvise'),
224 "test needs posix.posix_fadvise()")
225 def test_posix_fadvise(self):
226 fd = os.open(support.TESTFN, os.O_RDONLY)
227 try:
228 posix.posix_fadvise(fd, 0, 0, posix.POSIX_FADV_WILLNEED)
229 finally:
230 os.close(fd)
231
232 @unittest.skipUnless(hasattr(posix, 'futimes'), "test needs posix.futimes()")
233 def test_futimes(self):
234 now = time.time()
235 fd = os.open(support.TESTFN, os.O_RDONLY)
236 try:
237 posix.futimes(fd, None)
Brian Curtinc1b65d12011-11-07 14:18:54 -0600238 posix.futimes(fd)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200239 self.assertRaises(TypeError, posix.futimes, fd, (None, None))
240 self.assertRaises(TypeError, posix.futimes, fd, (now, None))
241 self.assertRaises(TypeError, posix.futimes, fd, (None, now))
242 posix.futimes(fd, (int(now), int(now)))
243 posix.futimes(fd, (now, now))
244 finally:
245 os.close(fd)
246
247 @unittest.skipUnless(hasattr(posix, 'lutimes'), "test needs posix.lutimes()")
248 def test_lutimes(self):
249 now = time.time()
250 posix.lutimes(support.TESTFN, None)
251 self.assertRaises(TypeError, posix.lutimes, support.TESTFN, (None, None))
252 self.assertRaises(TypeError, posix.lutimes, support.TESTFN, (now, None))
253 self.assertRaises(TypeError, posix.lutimes, support.TESTFN, (None, now))
254 posix.lutimes(support.TESTFN, (int(now), int(now)))
255 posix.lutimes(support.TESTFN, (now, now))
Brian Curtinc1b65d12011-11-07 14:18:54 -0600256 posix.lutimes(support.TESTFN)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200257
258 @unittest.skipUnless(hasattr(posix, 'futimens'), "test needs posix.futimens()")
259 def test_futimens(self):
260 now = time.time()
261 fd = os.open(support.TESTFN, os.O_RDONLY)
262 try:
263 self.assertRaises(TypeError, posix.futimens, fd, (None, None), (None, None))
264 self.assertRaises(TypeError, posix.futimens, fd, (now, 0), None)
265 self.assertRaises(TypeError, posix.futimens, fd, None, (now, 0))
266 posix.futimens(fd, (int(now), int((now - int(now)) * 1e9)),
267 (int(now), int((now - int(now)) * 1e9)))
Brian Curtinc1b65d12011-11-07 14:18:54 -0600268 posix.futimens(fd)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200269 finally:
270 os.close(fd)
271
272 @unittest.skipUnless(hasattr(posix, 'writev'), "test needs posix.writev()")
273 def test_writev(self):
274 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
275 try:
276 os.writev(fd, (b'test1', b'tt2', b't3'))
277 os.lseek(fd, 0, os.SEEK_SET)
278 self.assertEqual(b'test1tt2t3', posix.read(fd, 10))
279 finally:
280 os.close(fd)
281
282 @unittest.skipUnless(hasattr(posix, 'readv'), "test needs posix.readv()")
283 def test_readv(self):
284 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
285 try:
286 os.write(fd, b'test1tt2t3')
287 os.lseek(fd, 0, os.SEEK_SET)
288 buf = [bytearray(i) for i in [5, 3, 2]]
289 self.assertEqual(posix.readv(fd, buf), 10)
290 self.assertEqual([b'test1', b'tt2', b't3'], [bytes(i) for i in buf])
291 finally:
292 os.close(fd)
293
Neal Norwitze241ce82003-02-17 18:17:05 +0000294 def test_dup(self):
295 if hasattr(posix, 'dup'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000296 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000297 try:
298 fd = posix.dup(fp.fileno())
Ezio Melottie9615932010-01-24 19:26:24 +0000299 self.assertIsInstance(fd, int)
Neal Norwitze241ce82003-02-17 18:17:05 +0000300 os.close(fd)
301 finally:
302 fp.close()
303
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000304 def test_confstr(self):
305 if hasattr(posix, 'confstr'):
306 self.assertRaises(ValueError, posix.confstr, "CS_garbage")
307 self.assertEqual(len(posix.confstr("CS_PATH")) > 0, True)
308
Neal Norwitze241ce82003-02-17 18:17:05 +0000309 def test_dup2(self):
310 if hasattr(posix, 'dup2'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000311 fp1 = open(support.TESTFN)
312 fp2 = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000313 try:
314 posix.dup2(fp1.fileno(), fp2.fileno())
315 finally:
316 fp1.close()
317 fp2.close()
318
Charles-François Natali1e045b12011-05-22 20:42:32 +0200319 @unittest.skipUnless(hasattr(os, 'O_CLOEXEC'), "needs os.O_CLOEXEC")
Charles-François Natali239bb962011-06-03 12:55:15 +0200320 @support.requires_linux_version(2, 6, 23)
Charles-François Natali1e045b12011-05-22 20:42:32 +0200321 def test_oscloexec(self):
322 fd = os.open(support.TESTFN, os.O_RDONLY|os.O_CLOEXEC)
323 self.addCleanup(os.close, fd)
Victor Stinnere36f3752011-05-24 00:29:43 +0200324 self.assertTrue(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Charles-François Natali1e045b12011-05-22 20:42:32 +0200325
Skip Montanaro98470002005-06-17 01:14:49 +0000326 def test_osexlock(self):
327 if hasattr(posix, "O_EXLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000328 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000329 os.O_WRONLY|os.O_EXLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000330 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000331 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
332 os.close(fd)
333
334 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000335 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000336 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000337 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000338 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
339 os.close(fd)
340
341 def test_osshlock(self):
342 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000343 fd1 = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000344 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000345 fd2 = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000346 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
347 os.close(fd2)
348 os.close(fd1)
349
350 if hasattr(posix, "O_EXLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000351 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000352 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000353 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000354 os.O_RDONLY|os.O_EXLOCK|os.O_NONBLOCK)
355 os.close(fd)
356
Neal Norwitze241ce82003-02-17 18:17:05 +0000357 def test_fstat(self):
358 if hasattr(posix, 'fstat'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000359 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000360 try:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000361 self.assertTrue(posix.fstat(fp.fileno()))
Neal Norwitze241ce82003-02-17 18:17:05 +0000362 finally:
363 fp.close()
364
365 def test_stat(self):
366 if hasattr(posix, 'stat'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000367 self.assertTrue(posix.stat(support.TESTFN))
Neal Norwitze241ce82003-02-17 18:17:05 +0000368
Benjamin Peterson052a02b2010-08-17 01:27:09 +0000369 @unittest.skipUnless(hasattr(posix, 'mkfifo'), "don't have mkfifo()")
370 def test_mkfifo(self):
371 support.unlink(support.TESTFN)
372 posix.mkfifo(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR)
373 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
374
375 @unittest.skipUnless(hasattr(posix, 'mknod') and hasattr(stat, 'S_IFIFO'),
376 "don't have mknod()/S_IFIFO")
377 def test_mknod(self):
378 # Test using mknod() to create a FIFO (the only use specified
379 # by POSIX).
380 support.unlink(support.TESTFN)
381 mode = stat.S_IFIFO | stat.S_IRUSR | stat.S_IWUSR
382 try:
383 posix.mknod(support.TESTFN, mode, 0)
384 except OSError as e:
385 # Some old systems don't allow unprivileged users to use
386 # mknod(), or only support creating device nodes.
387 self.assertIn(e.errno, (errno.EPERM, errno.EINVAL))
388 else:
389 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
390
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000391 def _test_all_chown_common(self, chown_func, first_param):
392 """Common code for chown, fchown and lchown tests."""
393 if os.getuid() == 0:
394 try:
395 # Many linux distros have a nfsnobody user as MAX_UID-2
396 # that makes a good test case for signedness issues.
397 # http://bugs.python.org/issue1747858
398 # This part of the test only runs when run as root.
399 # Only scary people run their tests as root.
400 ent = pwd.getpwnam('nfsnobody')
401 chown_func(first_param, ent.pw_uid, ent.pw_gid)
402 except KeyError:
403 pass
404 else:
405 # non-root cannot chown to root, raises OSError
406 self.assertRaises(OSError, chown_func,
407 first_param, 0, 0)
408 # test a successful chown call
409 chown_func(first_param, os.getuid(), os.getgid())
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000410
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000411 @unittest.skipUnless(hasattr(posix, 'chown'), "test needs os.chown()")
412 def test_chown(self):
413 # raise an OSError if the file does not exist
414 os.unlink(support.TESTFN)
415 self.assertRaises(OSError, posix.chown, support.TESTFN, -1, -1)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000416
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000417 # re-create the file
Victor Stinnerbf816222011-06-30 23:25:47 +0200418 support.create_empty_file(support.TESTFN)
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000419 self._test_all_chown_common(posix.chown, support.TESTFN)
420
421 @unittest.skipUnless(hasattr(posix, 'fchown'), "test needs os.fchown()")
422 def test_fchown(self):
423 os.unlink(support.TESTFN)
424
425 # re-create the file
426 test_file = open(support.TESTFN, 'w')
427 try:
428 fd = test_file.fileno()
429 self._test_all_chown_common(posix.fchown, fd)
430 finally:
431 test_file.close()
432
433 @unittest.skipUnless(hasattr(posix, 'lchown'), "test needs os.lchown()")
434 def test_lchown(self):
435 os.unlink(support.TESTFN)
436 # create a symlink
Ned Deily3eb67d52011-06-28 00:00:28 -0700437 os.symlink(_DUMMY_SYMLINK, support.TESTFN)
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000438 self._test_all_chown_common(posix.lchown, support.TESTFN)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000439
Neal Norwitze241ce82003-02-17 18:17:05 +0000440 def test_chdir(self):
441 if hasattr(posix, 'chdir'):
442 posix.chdir(os.curdir)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000443 self.assertRaises(OSError, posix.chdir, support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000444
Martin v. Löwisc9e1c7d2010-07-23 12:16:41 +0000445 def test_listdir(self):
446 if hasattr(posix, 'listdir'):
447 self.assertTrue(support.TESTFN in posix.listdir(os.curdir))
448
449 def test_listdir_default(self):
450 # When listdir is called without argument, it's the same as listdir(os.curdir)
451 if hasattr(posix, 'listdir'):
452 self.assertTrue(support.TESTFN in posix.listdir())
Neal Norwitze241ce82003-02-17 18:17:05 +0000453
Charles-François Natali77940902012-02-06 19:54:48 +0100454 @unittest.skipUnless(hasattr(posix, 'flistdir'), "test needs posix.flistdir()")
455 def test_flistdir(self):
Antoine Pitrou8250e232011-02-25 23:41:16 +0000456 f = posix.open(posix.getcwd(), posix.O_RDONLY)
Charles-François Natali7546ad32012-01-08 18:34:06 +0100457 self.addCleanup(posix.close, f)
Antoine Pitrou8250e232011-02-25 23:41:16 +0000458 self.assertEqual(
459 sorted(posix.listdir('.')),
Charles-François Natali77940902012-02-06 19:54:48 +0100460 sorted(posix.flistdir(f))
Antoine Pitrou8250e232011-02-25 23:41:16 +0000461 )
Charles-François Natali7546ad32012-01-08 18:34:06 +0100462 # Check that the fd offset was reset (issue #13739)
Charles-François Natali7546ad32012-01-08 18:34:06 +0100463 self.assertEqual(
464 sorted(posix.listdir('.')),
Charles-François Natali77940902012-02-06 19:54:48 +0100465 sorted(posix.flistdir(f))
Charles-François Natali7546ad32012-01-08 18:34:06 +0100466 )
Antoine Pitrou8250e232011-02-25 23:41:16 +0000467
Neal Norwitze241ce82003-02-17 18:17:05 +0000468 def test_access(self):
469 if hasattr(posix, 'access'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000470 self.assertTrue(posix.access(support.TESTFN, os.R_OK))
Neal Norwitze241ce82003-02-17 18:17:05 +0000471
472 def test_umask(self):
473 if hasattr(posix, 'umask'):
474 old_mask = posix.umask(0)
Ezio Melottie9615932010-01-24 19:26:24 +0000475 self.assertIsInstance(old_mask, int)
Neal Norwitze241ce82003-02-17 18:17:05 +0000476 posix.umask(old_mask)
477
478 def test_strerror(self):
479 if hasattr(posix, 'strerror'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000480 self.assertTrue(posix.strerror(0))
Neal Norwitze241ce82003-02-17 18:17:05 +0000481
482 def test_pipe(self):
483 if hasattr(posix, 'pipe'):
484 reader, writer = posix.pipe()
485 os.close(reader)
486 os.close(writer)
487
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200488 @unittest.skipUnless(hasattr(os, 'pipe2'), "test needs os.pipe2()")
Charles-François Natali239bb962011-06-03 12:55:15 +0200489 @support.requires_linux_version(2, 6, 27)
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200490 def test_pipe2(self):
491 self.assertRaises(TypeError, os.pipe2, 'DEADBEEF')
492 self.assertRaises(TypeError, os.pipe2, 0, 0)
493
Charles-François Natali368f34b2011-06-06 19:49:47 +0200494 # try calling with flags = 0, like os.pipe()
495 r, w = os.pipe2(0)
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200496 os.close(r)
497 os.close(w)
498
499 # test flags
500 r, w = os.pipe2(os.O_CLOEXEC|os.O_NONBLOCK)
501 self.addCleanup(os.close, r)
502 self.addCleanup(os.close, w)
503 self.assertTrue(fcntl.fcntl(r, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
504 self.assertTrue(fcntl.fcntl(w, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
505 # try reading from an empty pipe: this should fail, not block
506 self.assertRaises(OSError, os.read, r, 1)
507 # try a write big enough to fill-up the pipe: this should either
508 # fail or perform a partial write, not block
509 try:
510 os.write(w, b'x' * support.PIPE_MAX_SIZE)
511 except OSError:
512 pass
513
Neal Norwitze241ce82003-02-17 18:17:05 +0000514 def test_utime(self):
515 if hasattr(posix, 'utime'):
516 now = time.time()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000517 posix.utime(support.TESTFN, None)
518 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None))
519 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None))
520 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now))
521 posix.utime(support.TESTFN, (int(now), int(now)))
522 posix.utime(support.TESTFN, (now, now))
Neal Norwitze241ce82003-02-17 18:17:05 +0000523
Ned Deily3eb67d52011-06-28 00:00:28 -0700524 def _test_chflags_regular_file(self, chflags_func, target_file):
525 st = os.stat(target_file)
526 self.assertTrue(hasattr(st, 'st_flags'))
527 chflags_func(target_file, st.st_flags | stat.UF_IMMUTABLE)
528 try:
529 new_st = os.stat(target_file)
530 self.assertEqual(st.st_flags | stat.UF_IMMUTABLE, new_st.st_flags)
531 try:
532 fd = open(target_file, 'w+')
533 except IOError as e:
534 self.assertEqual(e.errno, errno.EPERM)
535 finally:
536 posix.chflags(target_file, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000537
Ned Deily3eb67d52011-06-28 00:00:28 -0700538 @unittest.skipUnless(hasattr(posix, 'chflags'), 'test needs os.chflags()')
539 def test_chflags(self):
540 self._test_chflags_regular_file(posix.chflags, support.TESTFN)
541
542 @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
543 def test_lchflags_regular_file(self):
544 self._test_chflags_regular_file(posix.lchflags, support.TESTFN)
545
546 @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
547 def test_lchflags_symlink(self):
548 testfn_st = os.stat(support.TESTFN)
549
550 self.assertTrue(hasattr(testfn_st, 'st_flags'))
551
552 os.symlink(support.TESTFN, _DUMMY_SYMLINK)
553 self.teardown_files.append(_DUMMY_SYMLINK)
554 dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
555
556 posix.lchflags(_DUMMY_SYMLINK,
557 dummy_symlink_st.st_flags | stat.UF_IMMUTABLE)
558 try:
559 new_testfn_st = os.stat(support.TESTFN)
560 new_dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
561
562 self.assertEqual(testfn_st.st_flags, new_testfn_st.st_flags)
563 self.assertEqual(dummy_symlink_st.st_flags | stat.UF_IMMUTABLE,
564 new_dummy_symlink_st.st_flags)
565 finally:
566 posix.lchflags(_DUMMY_SYMLINK, dummy_symlink_st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000567
Guido van Rossum98297ee2007-11-06 21:34:58 +0000568 def test_environ(self):
Victor Stinner17b490d2010-05-06 22:19:30 +0000569 if os.name == "nt":
570 item_type = str
571 else:
572 item_type = bytes
Guido van Rossum98297ee2007-11-06 21:34:58 +0000573 for k, v in posix.environ.items():
Victor Stinner17b490d2010-05-06 22:19:30 +0000574 self.assertEqual(type(k), item_type)
575 self.assertEqual(type(v), item_type)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000576
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000577 def test_getcwd_long_pathnames(self):
578 if hasattr(posix, 'getcwd'):
579 dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef'
580 curdir = os.getcwd()
581 base_path = os.path.abspath(support.TESTFN) + '.getcwd'
582
583 try:
584 os.mkdir(base_path)
585 os.chdir(base_path)
586 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000587# Just returning nothing instead of the SkipTest exception,
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000588# because the test results in Error in that case.
589# Is that ok?
Benjamin Petersone549ead2009-03-28 21:42:05 +0000590# raise unittest.SkipTest("cannot create directory for testing")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000591 return
592
593 def _create_and_do_getcwd(dirname, current_path_length = 0):
594 try:
595 os.mkdir(dirname)
596 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000597 raise unittest.SkipTest("mkdir cannot create directory sufficiently deep for getcwd test")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000598
599 os.chdir(dirname)
600 try:
601 os.getcwd()
602 if current_path_length < 1027:
603 _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
604 finally:
605 os.chdir('..')
606 os.rmdir(dirname)
607
608 _create_and_do_getcwd(dirname)
609
610 finally:
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000611 os.chdir(curdir)
R. David Murray414c91f2009-07-09 20:12:31 +0000612 support.rmtree(base_path)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000613
Ross Lagerwallb0ae53d2011-06-10 07:30:30 +0200614 @unittest.skipUnless(hasattr(posix, 'getgrouplist'), "test needs posix.getgrouplist()")
615 @unittest.skipUnless(hasattr(pwd, 'getpwuid'), "test needs pwd.getpwuid()")
616 @unittest.skipUnless(hasattr(os, 'getuid'), "test needs os.getuid()")
617 def test_getgrouplist(self):
618 with os.popen('id -G') as idg:
619 groups = idg.read().strip()
620
621 if not groups:
622 raise unittest.SkipTest("need working 'id -G'")
623
624 self.assertEqual(
625 set([int(x) for x in groups.split()]),
626 set(posix.getgrouplist(pwd.getpwuid(os.getuid())[0],
627 pwd.getpwuid(os.getuid())[3])))
628
Antoine Pitrou318b8f32011-01-12 18:45:27 +0000629 @unittest.skipUnless(hasattr(os, 'getegid'), "test needs os.getegid()")
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000630 def test_getgroups(self):
631 with os.popen('id -G') as idg:
632 groups = idg.read().strip()
633
634 if not groups:
635 raise unittest.SkipTest("need working 'id -G'")
636
Ronald Oussoren7fb6f512010-08-01 19:18:13 +0000637 # 'id -G' and 'os.getgroups()' should return the same
638 # groups, ignoring order and duplicates.
Antoine Pitrou318b8f32011-01-12 18:45:27 +0000639 # #10822 - it is implementation defined whether posix.getgroups()
640 # includes the effective gid so we include it anyway, since id -G does
Ronald Oussorencb615e62010-07-24 14:15:19 +0000641 self.assertEqual(
Ronald Oussoren7fb6f512010-08-01 19:18:13 +0000642 set([int(x) for x in groups.split()]),
Antoine Pitrou318b8f32011-01-12 18:45:27 +0000643 set(posix.getgroups() + [posix.getegid()]))
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000644
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000645 # tests for the posix *at functions follow
646
647 @unittest.skipUnless(hasattr(posix, 'faccessat'), "test needs posix.faccessat()")
648 def test_faccessat(self):
649 f = posix.open(posix.getcwd(), posix.O_RDONLY)
650 try:
651 self.assertTrue(posix.faccessat(f, support.TESTFN, os.R_OK))
652 finally:
653 posix.close(f)
654
655 @unittest.skipUnless(hasattr(posix, 'fchmodat'), "test needs posix.fchmodat()")
656 def test_fchmodat(self):
657 os.chmod(support.TESTFN, stat.S_IRUSR)
658
659 f = posix.open(posix.getcwd(), posix.O_RDONLY)
660 try:
661 posix.fchmodat(f, support.TESTFN, stat.S_IRUSR | stat.S_IWUSR)
662
663 s = posix.stat(support.TESTFN)
664 self.assertEqual(s[0] & stat.S_IRWXU, stat.S_IRUSR | stat.S_IWUSR)
665 finally:
666 posix.close(f)
667
668 @unittest.skipUnless(hasattr(posix, 'fchownat'), "test needs posix.fchownat()")
669 def test_fchownat(self):
670 support.unlink(support.TESTFN)
Victor Stinnerbf816222011-06-30 23:25:47 +0200671 support.create_empty_file(support.TESTFN)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000672
673 f = posix.open(posix.getcwd(), posix.O_RDONLY)
674 try:
675 posix.fchownat(f, support.TESTFN, os.getuid(), os.getgid())
676 finally:
677 posix.close(f)
678
679 @unittest.skipUnless(hasattr(posix, 'fstatat'), "test needs posix.fstatat()")
680 def test_fstatat(self):
681 support.unlink(support.TESTFN)
682 with open(support.TESTFN, 'w') as outfile:
683 outfile.write("testline\n")
684
685 f = posix.open(posix.getcwd(), posix.O_RDONLY)
686 try:
687 s1 = posix.stat(support.TESTFN)
688 s2 = posix.fstatat(f, support.TESTFN)
689 self.assertEqual(s1, s2)
690 finally:
691 posix.close(f)
692
693 @unittest.skipUnless(hasattr(posix, 'futimesat'), "test needs posix.futimesat()")
694 def test_futimesat(self):
695 f = posix.open(posix.getcwd(), posix.O_RDONLY)
696 try:
697 now = time.time()
698 posix.futimesat(f, support.TESTFN, None)
Brian Curtinc1b65d12011-11-07 14:18:54 -0600699 posix.futimesat(f, support.TESTFN)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000700 self.assertRaises(TypeError, posix.futimesat, f, support.TESTFN, (None, None))
701 self.assertRaises(TypeError, posix.futimesat, f, support.TESTFN, (now, None))
702 self.assertRaises(TypeError, posix.futimesat, f, support.TESTFN, (None, now))
703 posix.futimesat(f, support.TESTFN, (int(now), int(now)))
704 posix.futimesat(f, support.TESTFN, (now, now))
705 finally:
706 posix.close(f)
707
708 @unittest.skipUnless(hasattr(posix, 'linkat'), "test needs posix.linkat()")
709 def test_linkat(self):
710 f = posix.open(posix.getcwd(), posix.O_RDONLY)
711 try:
712 posix.linkat(f, support.TESTFN, f, support.TESTFN + 'link')
713 # should have same inodes
714 self.assertEqual(posix.stat(support.TESTFN)[1],
715 posix.stat(support.TESTFN + 'link')[1])
716 finally:
717 posix.close(f)
718 support.unlink(support.TESTFN + 'link')
719
720 @unittest.skipUnless(hasattr(posix, 'mkdirat'), "test needs posix.mkdirat()")
721 def test_mkdirat(self):
722 f = posix.open(posix.getcwd(), posix.O_RDONLY)
723 try:
724 posix.mkdirat(f, support.TESTFN + 'dir')
725 posix.stat(support.TESTFN + 'dir') # should not raise exception
726 finally:
727 posix.close(f)
728 support.rmtree(support.TESTFN + 'dir')
729
730 @unittest.skipUnless(hasattr(posix, 'mknodat') and hasattr(stat, 'S_IFIFO'),
731 "don't have mknodat()/S_IFIFO")
732 def test_mknodat(self):
733 # Test using mknodat() to create a FIFO (the only use specified
734 # by POSIX).
735 support.unlink(support.TESTFN)
736 mode = stat.S_IFIFO | stat.S_IRUSR | stat.S_IWUSR
737 f = posix.open(posix.getcwd(), posix.O_RDONLY)
738 try:
739 posix.mknodat(f, support.TESTFN, mode, 0)
740 except OSError as e:
741 # Some old systems don't allow unprivileged users to use
742 # mknod(), or only support creating device nodes.
743 self.assertIn(e.errno, (errno.EPERM, errno.EINVAL))
744 else:
745 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
746 finally:
747 posix.close(f)
748
749 @unittest.skipUnless(hasattr(posix, 'openat'), "test needs posix.openat()")
750 def test_openat(self):
751 support.unlink(support.TESTFN)
752 with open(support.TESTFN, 'w') as outfile:
753 outfile.write("testline\n")
754 a = posix.open(posix.getcwd(), posix.O_RDONLY)
755 b = posix.openat(a, support.TESTFN, posix.O_RDONLY)
756 try:
757 res = posix.read(b, 9).decode(encoding="utf-8")
758 self.assertEqual("testline\n", res)
759 finally:
760 posix.close(a)
761 posix.close(b)
762
763 @unittest.skipUnless(hasattr(posix, 'readlinkat'), "test needs posix.readlinkat()")
764 def test_readlinkat(self):
765 os.symlink(support.TESTFN, support.TESTFN + 'link')
766 f = posix.open(posix.getcwd(), posix.O_RDONLY)
767 try:
768 self.assertEqual(posix.readlink(support.TESTFN + 'link'),
769 posix.readlinkat(f, support.TESTFN + 'link'))
770 finally:
771 support.unlink(support.TESTFN + 'link')
772 posix.close(f)
773
774 @unittest.skipUnless(hasattr(posix, 'renameat'), "test needs posix.renameat()")
775 def test_renameat(self):
776 support.unlink(support.TESTFN)
Victor Stinnerbf816222011-06-30 23:25:47 +0200777 support.create_empty_file(support.TESTFN + 'ren')
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000778 f = posix.open(posix.getcwd(), posix.O_RDONLY)
779 try:
780 posix.renameat(f, support.TESTFN + 'ren', f, support.TESTFN)
781 except:
782 posix.rename(support.TESTFN + 'ren', support.TESTFN)
783 raise
784 else:
785 posix.stat(support.TESTFN) # should not throw exception
786 finally:
787 posix.close(f)
788
789 @unittest.skipUnless(hasattr(posix, 'symlinkat'), "test needs posix.symlinkat()")
790 def test_symlinkat(self):
791 f = posix.open(posix.getcwd(), posix.O_RDONLY)
792 try:
793 posix.symlinkat(support.TESTFN, f, support.TESTFN + 'link')
794 self.assertEqual(posix.readlink(support.TESTFN + 'link'), support.TESTFN)
795 finally:
796 posix.close(f)
797 support.unlink(support.TESTFN + 'link')
798
799 @unittest.skipUnless(hasattr(posix, 'unlinkat'), "test needs posix.unlinkat()")
800 def test_unlinkat(self):
801 f = posix.open(posix.getcwd(), posix.O_RDONLY)
Victor Stinnerbf816222011-06-30 23:25:47 +0200802 support.create_empty_file(support.TESTFN + 'del')
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000803 posix.stat(support.TESTFN + 'del') # should not throw exception
804 try:
805 posix.unlinkat(f, support.TESTFN + 'del')
806 except:
807 support.unlink(support.TESTFN + 'del')
808 raise
809 else:
810 self.assertRaises(OSError, posix.stat, support.TESTFN + 'link')
811 finally:
812 posix.close(f)
813
814 @unittest.skipUnless(hasattr(posix, 'utimensat'), "test needs posix.utimensat()")
815 def test_utimensat(self):
816 f = posix.open(posix.getcwd(), posix.O_RDONLY)
817 try:
818 now = time.time()
819 posix.utimensat(f, support.TESTFN, None, None)
Brian Curtin569b4942011-11-07 16:09:20 -0600820 posix.utimensat(f, support.TESTFN)
821 posix.utimensat(f, support.TESTFN, flags=os.AT_SYMLINK_NOFOLLOW)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000822 self.assertRaises(TypeError, posix.utimensat, f, support.TESTFN, (None, None), (None, None))
823 self.assertRaises(TypeError, posix.utimensat, f, support.TESTFN, (now, 0), None)
824 self.assertRaises(TypeError, posix.utimensat, f, support.TESTFN, None, (now, 0))
825 posix.utimensat(f, support.TESTFN, (int(now), int((now - int(now)) * 1e9)),
826 (int(now), int((now - int(now)) * 1e9)))
Brian Curtin569b4942011-11-07 16:09:20 -0600827 posix.utimensat(dirfd=f, path=support.TESTFN,
828 atime=(int(now), int((now - int(now)) * 1e9)),
829 mtime=(int(now), int((now - int(now)) * 1e9)))
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000830 finally:
831 posix.close(f)
832
833 @unittest.skipUnless(hasattr(posix, 'mkfifoat'), "don't have mkfifoat()")
834 def test_mkfifoat(self):
835 support.unlink(support.TESTFN)
836 f = posix.open(posix.getcwd(), posix.O_RDONLY)
837 try:
838 posix.mkfifoat(f, support.TESTFN, stat.S_IRUSR | stat.S_IWUSR)
839 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
840 finally:
841 posix.close(f)
842
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500843 requires_sched_h = unittest.skipUnless(hasattr(posix, 'sched_yield'),
844 "don't have scheduling support")
Benjamin Peterson2740af82011-08-02 17:41:34 -0500845 requires_sched_affinity = unittest.skipUnless(hasattr(posix, 'cpu_set'),
Benjamin Peterson50ba2712011-08-02 22:15:40 -0500846 "don't have sched affinity support")
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500847
848 @requires_sched_h
849 def test_sched_yield(self):
850 # This has no error conditions (at least on Linux).
851 posix.sched_yield()
852
853 @requires_sched_h
Charles-François Nataliea0d5fc2011-09-06 19:03:35 +0200854 @unittest.skipUnless(hasattr(posix, 'sched_get_priority_max'),
855 "requires sched_get_priority_max()")
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500856 def test_sched_priority(self):
857 # Round-robin usually has interesting priorities.
858 pol = posix.SCHED_RR
859 lo = posix.sched_get_priority_min(pol)
860 hi = posix.sched_get_priority_max(pol)
861 self.assertIsInstance(lo, int)
862 self.assertIsInstance(hi, int)
863 self.assertGreaterEqual(hi, lo)
Benjamin Peterson539b6c42011-08-02 22:09:37 -0500864 # OSX evidently just returns 15 without checking the argument.
865 if sys.platform != "darwin":
Benjamin Petersonc1581582011-08-02 22:10:55 -0500866 self.assertRaises(OSError, posix.sched_get_priority_min, -23)
867 self.assertRaises(OSError, posix.sched_get_priority_max, -23)
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500868
Benjamin Petersonc5fce4d2011-08-02 18:07:32 -0500869 @unittest.skipUnless(hasattr(posix, 'sched_setscheduler'), "can't change scheduler")
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500870 def test_get_and_set_scheduler_and_param(self):
871 possible_schedulers = [sched for name, sched in posix.__dict__.items()
872 if name.startswith("SCHED_")]
873 mine = posix.sched_getscheduler(0)
874 self.assertIn(mine, possible_schedulers)
875 try:
Jesus Ceaceb5d162011-09-10 01:16:55 +0200876 parent = posix.sched_getscheduler(os.getppid())
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500877 except OSError as e:
Jesus Ceaceb5d162011-09-10 01:16:55 +0200878 if e.errno != errno.EPERM:
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500879 raise
880 else:
Jesus Ceaceb5d162011-09-10 01:16:55 +0200881 self.assertIn(parent, possible_schedulers)
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500882 self.assertRaises(OSError, posix.sched_getscheduler, -1)
883 self.assertRaises(OSError, posix.sched_getparam, -1)
884 param = posix.sched_getparam(0)
885 self.assertIsInstance(param.sched_priority, int)
Benjamin Peterson18592ca2011-08-02 18:48:59 -0500886 try:
887 posix.sched_setscheduler(0, mine, param)
888 except OSError as e:
889 if e.errno != errno.EPERM:
890 raise
Charles-François Natali7b911cb2011-08-21 12:41:43 +0200891
892 # POSIX states that calling sched_setparam() on a process with a
893 # scheduling policy other than SCHED_FIFO or SCHED_RR is
894 # implementation-defined: FreeBSD returns EINVAL.
895 if not sys.platform.startswith('freebsd'):
896 posix.sched_setparam(0, param)
897 self.assertRaises(OSError, posix.sched_setparam, -1, param)
898
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500899 self.assertRaises(OSError, posix.sched_setscheduler, -1, mine, param)
900 self.assertRaises(TypeError, posix.sched_setscheduler, 0, mine, None)
901 self.assertRaises(TypeError, posix.sched_setparam, 0, 43)
902 param = posix.sched_param(None)
903 self.assertRaises(TypeError, posix.sched_setparam, 0, param)
904 large = 214748364700
905 param = posix.sched_param(large)
906 self.assertRaises(OverflowError, posix.sched_setparam, 0, param)
907 param = posix.sched_param(sched_priority=-large)
908 self.assertRaises(OverflowError, posix.sched_setparam, 0, param)
909
Benjamin Petersonc5fce4d2011-08-02 18:07:32 -0500910 @unittest.skipUnless(hasattr(posix, "sched_rr_get_interval"), "no function")
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500911 def test_sched_rr_get_interval(self):
Benjamin Peterson43234ab2011-08-02 22:19:14 -0500912 try:
913 interval = posix.sched_rr_get_interval(0)
914 except OSError as e:
915 # This likely means that sched_rr_get_interval is only valid for
916 # processes with the SCHED_RR scheduler in effect.
917 if e.errno != errno.EINVAL:
918 raise
919 self.skipTest("only works on SCHED_RR processes")
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500920 self.assertIsInstance(interval, float)
921 # Reasonable constraints, I think.
922 self.assertGreaterEqual(interval, 0.)
923 self.assertLess(interval, 1.)
924
Benjamin Peterson2740af82011-08-02 17:41:34 -0500925 @requires_sched_affinity
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500926 def test_sched_affinity(self):
927 mask = posix.sched_getaffinity(0, 1024)
928 self.assertGreaterEqual(mask.count(), 1)
929 self.assertIsInstance(mask, posix.cpu_set)
930 self.assertRaises(OSError, posix.sched_getaffinity, -1, 1024)
931 empty = posix.cpu_set(10)
932 posix.sched_setaffinity(0, mask)
933 self.assertRaises(OSError, posix.sched_setaffinity, 0, empty)
934 self.assertRaises(OSError, posix.sched_setaffinity, -1, mask)
935
Benjamin Peterson2740af82011-08-02 17:41:34 -0500936 @requires_sched_affinity
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500937 def test_cpu_set_basic(self):
938 s = posix.cpu_set(10)
939 self.assertEqual(len(s), 10)
940 self.assertEqual(s.count(), 0)
941 s.set(0)
942 s.set(9)
943 self.assertTrue(s.isset(0))
944 self.assertTrue(s.isset(9))
945 self.assertFalse(s.isset(5))
946 self.assertEqual(s.count(), 2)
947 s.clear(0)
948 self.assertFalse(s.isset(0))
949 self.assertEqual(s.count(), 1)
950 s.zero()
951 self.assertFalse(s.isset(0))
952 self.assertFalse(s.isset(9))
953 self.assertEqual(s.count(), 0)
954 self.assertRaises(ValueError, s.set, -1)
955 self.assertRaises(ValueError, s.set, 10)
956 self.assertRaises(ValueError, s.clear, -1)
957 self.assertRaises(ValueError, s.clear, 10)
958 self.assertRaises(ValueError, s.isset, -1)
959 self.assertRaises(ValueError, s.isset, 10)
960
Benjamin Peterson2740af82011-08-02 17:41:34 -0500961 @requires_sched_affinity
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500962 def test_cpu_set_cmp(self):
963 self.assertNotEqual(posix.cpu_set(11), posix.cpu_set(12))
964 l = posix.cpu_set(10)
965 r = posix.cpu_set(10)
966 self.assertEqual(l, r)
967 l.set(1)
968 self.assertNotEqual(l, r)
969 r.set(1)
970 self.assertEqual(l, r)
971
Benjamin Peterson2740af82011-08-02 17:41:34 -0500972 @requires_sched_affinity
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500973 def test_cpu_set_bitwise(self):
974 l = posix.cpu_set(5)
975 l.set(0)
976 l.set(1)
977 r = posix.cpu_set(5)
978 r.set(1)
979 r.set(2)
980 b = l & r
981 self.assertEqual(b.count(), 1)
982 self.assertTrue(b.isset(1))
983 b = l | r
984 self.assertEqual(b.count(), 3)
985 self.assertTrue(b.isset(0))
986 self.assertTrue(b.isset(1))
987 self.assertTrue(b.isset(2))
988 b = l ^ r
989 self.assertEqual(b.count(), 2)
990 self.assertTrue(b.isset(0))
991 self.assertFalse(b.isset(1))
992 self.assertTrue(b.isset(2))
993 b = l
994 b |= r
995 self.assertIs(b, l)
996 self.assertEqual(l.count(), 3)
997
Victor Stinner8b905bd2011-10-25 13:34:04 +0200998 def test_rtld_constants(self):
999 # check presence of major RTLD_* constants
1000 posix.RTLD_LAZY
1001 posix.RTLD_NOW
1002 posix.RTLD_GLOBAL
1003 posix.RTLD_LOCAL
1004
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001005class PosixGroupsTester(unittest.TestCase):
1006
1007 def setUp(self):
1008 if posix.getuid() != 0:
1009 raise unittest.SkipTest("not enough privileges")
1010 if not hasattr(posix, 'getgroups'):
1011 raise unittest.SkipTest("need posix.getgroups")
1012 if sys.platform == 'darwin':
1013 raise unittest.SkipTest("getgroups(2) is broken on OSX")
1014 self.saved_groups = posix.getgroups()
1015
1016 def tearDown(self):
1017 if hasattr(posix, 'setgroups'):
1018 posix.setgroups(self.saved_groups)
1019 elif hasattr(posix, 'initgroups'):
1020 name = pwd.getpwuid(posix.getuid()).pw_name
1021 posix.initgroups(name, self.saved_groups[0])
1022
1023 @unittest.skipUnless(hasattr(posix, 'initgroups'),
1024 "test needs posix.initgroups()")
1025 def test_initgroups(self):
1026 # find missing group
1027
Antoine Pitroue5a91012010-09-04 17:32:06 +00001028 g = max(self.saved_groups) + 1
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001029 name = pwd.getpwuid(posix.getuid()).pw_name
1030 posix.initgroups(name, g)
1031 self.assertIn(g, posix.getgroups())
1032
1033 @unittest.skipUnless(hasattr(posix, 'setgroups'),
1034 "test needs posix.setgroups()")
1035 def test_setgroups(self):
Antoine Pitroue5a91012010-09-04 17:32:06 +00001036 for groups in [[0], list(range(16))]:
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001037 posix.setgroups(groups)
1038 self.assertListEqual(groups, posix.getgroups())
1039
Neal Norwitze241ce82003-02-17 18:17:05 +00001040def test_main():
Antoine Pitrou68c95922011-03-20 17:33:57 +01001041 try:
1042 support.run_unittest(PosixTester, PosixGroupsTester)
1043 finally:
1044 support.reap_children()
Neal Norwitze241ce82003-02-17 18:17:05 +00001045
1046if __name__ == '__main__':
1047 test_main()