blob: 5ed2a0ffc514203cc27eaf73872d9ea644306983 [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
Charles-François Nataliab2d58e2012-04-17 19:48:35 +020013import platform
Christian Heimesd5e2b6f2008-03-19 21:50:51 +000014import pwd
Benjamin Petersondcf97b92008-07-02 17:30:14 +000015import shutil
Benjamin Peterson052a02b2010-08-17 01:27:09 +000016import stat
Ned Deilyba2eab22011-07-26 13:53:55 -070017import tempfile
Neal Norwitze241ce82003-02-17 18:17:05 +000018import unittest
19import warnings
R. David Murraya21e4ca2009-03-31 23:16:50 +000020
Ned Deilyba2eab22011-07-26 13:53:55 -070021_DUMMY_SYMLINK = os.path.join(tempfile.gettempdir(),
22 support.TESTFN + '-dummy-symlink')
Neal Norwitze241ce82003-02-17 18:17:05 +000023
24class PosixTester(unittest.TestCase):
25
26 def setUp(self):
27 # create empty file
Benjamin Petersonee8712c2008-05-20 21:35:26 +000028 fp = open(support.TESTFN, 'w+')
Neal Norwitze241ce82003-02-17 18:17:05 +000029 fp.close()
Ned Deily3eb67d52011-06-28 00:00:28 -070030 self.teardown_files = [ support.TESTFN ]
Brett Cannonc8d502e2010-03-20 21:53:28 +000031 self._warnings_manager = support.check_warnings()
32 self._warnings_manager.__enter__()
33 warnings.filterwarnings('ignore', '.* potential security risk .*',
34 RuntimeWarning)
Neal Norwitze241ce82003-02-17 18:17:05 +000035
36 def tearDown(self):
Ned Deily3eb67d52011-06-28 00:00:28 -070037 for teardown_file in self.teardown_files:
38 support.unlink(teardown_file)
Brett Cannonc8d502e2010-03-20 21:53:28 +000039 self._warnings_manager.__exit__(None, None, None)
Neal Norwitze241ce82003-02-17 18:17:05 +000040
41 def testNoArgFunctions(self):
42 # test posix functions which take no arguments and have
43 # no side-effects which we need to cleanup (e.g., fork, wait, abort)
Guido van Rossumf0af3e32008-10-02 18:55:37 +000044 NO_ARG_FUNCTIONS = [ "ctermid", "getcwd", "getcwdb", "uname",
Guido van Rossum687b9c02007-10-25 23:18:51 +000045 "times", "getloadavg",
Neal Norwitze241ce82003-02-17 18:17:05 +000046 "getegid", "geteuid", "getgid", "getgroups",
Ross Lagerwall7807c352011-03-17 20:20:30 +020047 "getpid", "getpgrp", "getppid", "getuid", "sync",
Neal Norwitze241ce82003-02-17 18:17:05 +000048 ]
Neal Norwitz71b13e82003-02-23 22:12:24 +000049
Neal Norwitze241ce82003-02-17 18:17:05 +000050 for name in NO_ARG_FUNCTIONS:
51 posix_func = getattr(posix, name, None)
52 if posix_func is not None:
53 posix_func()
Neal Norwitz2ff51a82003-02-17 22:40:31 +000054 self.assertRaises(TypeError, posix_func, 1)
Neal Norwitze241ce82003-02-17 18:17:05 +000055
Martin v. Löwis7aed61a2009-11-27 14:09:49 +000056 if hasattr(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)
62
63 if hasattr(posix, 'getresgid'):
64 def test_getresgid(self):
65 group_ids = posix.getresgid()
66 self.assertEqual(len(group_ids), 3)
67 for val in group_ids:
68 self.assertGreaterEqual(val, 0)
69
70 if hasattr(posix, 'setresuid'):
71 def test_setresuid(self):
72 current_user_ids = posix.getresuid()
73 self.assertIsNone(posix.setresuid(*current_user_ids))
74 # -1 means don't change that value.
75 self.assertIsNone(posix.setresuid(-1, -1, -1))
76
77 def test_setresuid_exception(self):
78 # Don't do this test if someone is silly enough to run us as root.
79 current_user_ids = posix.getresuid()
80 if 0 not in current_user_ids:
81 new_user_ids = (current_user_ids[0]+1, -1, -1)
82 self.assertRaises(OSError, posix.setresuid, *new_user_ids)
83
84 if hasattr(posix, 'setresgid'):
85 def test_setresgid(self):
86 current_group_ids = posix.getresgid()
87 self.assertIsNone(posix.setresgid(*current_group_ids))
88 # -1 means don't change that value.
89 self.assertIsNone(posix.setresgid(-1, -1, -1))
90
91 def test_setresgid_exception(self):
92 # Don't do this test if someone is silly enough to run us as root.
93 current_group_ids = posix.getresgid()
94 if 0 not in current_group_ids:
95 new_group_ids = (current_group_ids[0]+1, -1, -1)
96 self.assertRaises(OSError, posix.setresgid, *new_group_ids)
97
Antoine Pitroub7572f02009-12-02 20:46:48 +000098 @unittest.skipUnless(hasattr(posix, 'initgroups'),
99 "test needs os.initgroups()")
100 def test_initgroups(self):
101 # It takes a string and an integer; check that it raises a TypeError
102 # for other argument lists.
103 self.assertRaises(TypeError, posix.initgroups)
104 self.assertRaises(TypeError, posix.initgroups, None)
105 self.assertRaises(TypeError, posix.initgroups, 3, "foo")
106 self.assertRaises(TypeError, posix.initgroups, "foo", 3, object())
107
108 # If a non-privileged user invokes it, it should fail with OSError
109 # EPERM.
110 if os.getuid() != 0:
Charles-François Natalie8a255a2012-05-02 20:01:38 +0200111 try:
112 name = pwd.getpwuid(posix.getuid()).pw_name
113 except KeyError:
114 # the current UID may not have a pwd entry
115 raise unittest.SkipTest("need a pwd entry")
Antoine Pitroub7572f02009-12-02 20:46:48 +0000116 try:
117 posix.initgroups(name, 13)
118 except OSError as e:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000119 self.assertEqual(e.errno, errno.EPERM)
Antoine Pitroub7572f02009-12-02 20:46:48 +0000120 else:
121 self.fail("Expected OSError to be raised by initgroups")
122
Neal Norwitze241ce82003-02-17 18:17:05 +0000123 def test_statvfs(self):
124 if hasattr(posix, 'statvfs'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000125 self.assertTrue(posix.statvfs(os.curdir))
Neal Norwitze241ce82003-02-17 18:17:05 +0000126
127 def test_fstatvfs(self):
128 if hasattr(posix, 'fstatvfs'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000129 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000130 try:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000131 self.assertTrue(posix.fstatvfs(fp.fileno()))
Neal Norwitze241ce82003-02-17 18:17:05 +0000132 finally:
133 fp.close()
134
135 def test_ftruncate(self):
136 if hasattr(posix, 'ftruncate'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000137 fp = open(support.TESTFN, 'w+')
Neal Norwitze241ce82003-02-17 18:17:05 +0000138 try:
139 # we need to have some data to truncate
140 fp.write('test')
141 fp.flush()
142 posix.ftruncate(fp.fileno(), 0)
143 finally:
144 fp.close()
145
Ross Lagerwall7807c352011-03-17 20:20:30 +0200146 @unittest.skipUnless(hasattr(posix, 'truncate'), "test needs posix.truncate()")
147 def test_truncate(self):
148 with open(support.TESTFN, 'w') as fp:
149 fp.write('test')
150 fp.flush()
151 posix.truncate(support.TESTFN, 0)
152
153 @unittest.skipUnless(hasattr(posix, 'fexecve'), "test needs posix.fexecve()")
154 @unittest.skipUnless(hasattr(os, 'fork'), "test needs os.fork()")
Ross Lagerwalldedf6cf2011-03-20 18:27:05 +0200155 @unittest.skipUnless(hasattr(os, 'waitpid'), "test needs os.waitpid()")
Ross Lagerwall7807c352011-03-17 20:20:30 +0200156 def test_fexecve(self):
157 fp = os.open(sys.executable, os.O_RDONLY)
158 try:
159 pid = os.fork()
160 if pid == 0:
161 os.chdir(os.path.split(sys.executable)[0])
162 posix.fexecve(fp, [sys.executable, '-c', 'pass'], os.environ)
163 else:
Ross Lagerwalldedf6cf2011-03-20 18:27:05 +0200164 self.assertEqual(os.waitpid(pid, 0), (pid, 0))
Ross Lagerwall7807c352011-03-17 20:20:30 +0200165 finally:
166 os.close(fp)
167
168 @unittest.skipUnless(hasattr(posix, 'waitid'), "test needs posix.waitid()")
169 @unittest.skipUnless(hasattr(os, 'fork'), "test needs os.fork()")
170 def test_waitid(self):
171 pid = os.fork()
172 if pid == 0:
173 os.chdir(os.path.split(sys.executable)[0])
174 posix.execve(sys.executable, [sys.executable, '-c', 'pass'], os.environ)
175 else:
176 res = posix.waitid(posix.P_PID, pid, posix.WEXITED)
177 self.assertEqual(pid, res.si_pid)
178
179 @unittest.skipUnless(hasattr(posix, 'lockf'), "test needs posix.lockf()")
180 def test_lockf(self):
181 fd = os.open(support.TESTFN, os.O_WRONLY | os.O_CREAT)
182 try:
183 os.write(fd, b'test')
184 os.lseek(fd, 0, os.SEEK_SET)
185 posix.lockf(fd, posix.F_LOCK, 4)
186 # section is locked
187 posix.lockf(fd, posix.F_ULOCK, 4)
188 finally:
189 os.close(fd)
190
191 @unittest.skipUnless(hasattr(posix, 'pread'), "test needs posix.pread()")
192 def test_pread(self):
193 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
194 try:
195 os.write(fd, b'test')
196 os.lseek(fd, 0, os.SEEK_SET)
197 self.assertEqual(b'es', posix.pread(fd, 2, 1))
Florent Xiclunae41f0de2011-11-11 19:39:25 +0100198 # the first pread() shouldn't disturb the file offset
Ross Lagerwall7807c352011-03-17 20:20:30 +0200199 self.assertEqual(b'te', posix.read(fd, 2))
200 finally:
201 os.close(fd)
202
203 @unittest.skipUnless(hasattr(posix, 'pwrite'), "test needs posix.pwrite()")
204 def test_pwrite(self):
205 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
206 try:
207 os.write(fd, b'test')
208 os.lseek(fd, 0, os.SEEK_SET)
209 posix.pwrite(fd, b'xx', 1)
210 self.assertEqual(b'txxt', posix.read(fd, 4))
211 finally:
212 os.close(fd)
213
214 @unittest.skipUnless(hasattr(posix, 'posix_fallocate'),
215 "test needs posix.posix_fallocate()")
216 def test_posix_fallocate(self):
217 fd = os.open(support.TESTFN, os.O_WRONLY | os.O_CREAT)
218 try:
219 posix.posix_fallocate(fd, 0, 10)
220 except OSError as inst:
221 # issue10812, ZFS doesn't appear to support posix_fallocate,
222 # so skip Solaris-based since they are likely to have ZFS.
223 if inst.errno != errno.EINVAL or not sys.platform.startswith("sunos"):
224 raise
225 finally:
226 os.close(fd)
227
228 @unittest.skipUnless(hasattr(posix, 'posix_fadvise'),
229 "test needs posix.posix_fadvise()")
230 def test_posix_fadvise(self):
231 fd = os.open(support.TESTFN, os.O_RDONLY)
232 try:
233 posix.posix_fadvise(fd, 0, 0, posix.POSIX_FADV_WILLNEED)
234 finally:
235 os.close(fd)
236
237 @unittest.skipUnless(hasattr(posix, 'futimes'), "test needs posix.futimes()")
238 def test_futimes(self):
239 now = time.time()
240 fd = os.open(support.TESTFN, os.O_RDONLY)
241 try:
242 posix.futimes(fd, None)
Brian Curtinc1b65d12011-11-07 14:18:54 -0600243 posix.futimes(fd)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200244 self.assertRaises(TypeError, posix.futimes, fd, (None, None))
245 self.assertRaises(TypeError, posix.futimes, fd, (now, None))
246 self.assertRaises(TypeError, posix.futimes, fd, (None, now))
247 posix.futimes(fd, (int(now), int(now)))
248 posix.futimes(fd, (now, now))
249 finally:
250 os.close(fd)
251
252 @unittest.skipUnless(hasattr(posix, 'lutimes'), "test needs posix.lutimes()")
253 def test_lutimes(self):
254 now = time.time()
255 posix.lutimes(support.TESTFN, None)
256 self.assertRaises(TypeError, posix.lutimes, support.TESTFN, (None, None))
257 self.assertRaises(TypeError, posix.lutimes, support.TESTFN, (now, None))
258 self.assertRaises(TypeError, posix.lutimes, support.TESTFN, (None, now))
259 posix.lutimes(support.TESTFN, (int(now), int(now)))
260 posix.lutimes(support.TESTFN, (now, now))
Brian Curtinc1b65d12011-11-07 14:18:54 -0600261 posix.lutimes(support.TESTFN)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200262
263 @unittest.skipUnless(hasattr(posix, 'futimens'), "test needs posix.futimens()")
264 def test_futimens(self):
265 now = time.time()
266 fd = os.open(support.TESTFN, os.O_RDONLY)
267 try:
268 self.assertRaises(TypeError, posix.futimens, fd, (None, None), (None, None))
269 self.assertRaises(TypeError, posix.futimens, fd, (now, 0), None)
270 self.assertRaises(TypeError, posix.futimens, fd, None, (now, 0))
271 posix.futimens(fd, (int(now), int((now - int(now)) * 1e9)),
272 (int(now), int((now - int(now)) * 1e9)))
Brian Curtinc1b65d12011-11-07 14:18:54 -0600273 posix.futimens(fd)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200274 finally:
275 os.close(fd)
276
277 @unittest.skipUnless(hasattr(posix, 'writev'), "test needs posix.writev()")
278 def test_writev(self):
279 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
280 try:
281 os.writev(fd, (b'test1', b'tt2', b't3'))
282 os.lseek(fd, 0, os.SEEK_SET)
283 self.assertEqual(b'test1tt2t3', posix.read(fd, 10))
284 finally:
285 os.close(fd)
286
287 @unittest.skipUnless(hasattr(posix, 'readv'), "test needs posix.readv()")
288 def test_readv(self):
289 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
290 try:
291 os.write(fd, b'test1tt2t3')
292 os.lseek(fd, 0, os.SEEK_SET)
293 buf = [bytearray(i) for i in [5, 3, 2]]
294 self.assertEqual(posix.readv(fd, buf), 10)
295 self.assertEqual([b'test1', b'tt2', b't3'], [bytes(i) for i in buf])
296 finally:
297 os.close(fd)
298
Neal Norwitze241ce82003-02-17 18:17:05 +0000299 def test_dup(self):
300 if hasattr(posix, 'dup'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000301 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000302 try:
303 fd = posix.dup(fp.fileno())
Ezio Melottie9615932010-01-24 19:26:24 +0000304 self.assertIsInstance(fd, int)
Neal Norwitze241ce82003-02-17 18:17:05 +0000305 os.close(fd)
306 finally:
307 fp.close()
308
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000309 def test_confstr(self):
310 if hasattr(posix, 'confstr'):
311 self.assertRaises(ValueError, posix.confstr, "CS_garbage")
312 self.assertEqual(len(posix.confstr("CS_PATH")) > 0, True)
313
Neal Norwitze241ce82003-02-17 18:17:05 +0000314 def test_dup2(self):
315 if hasattr(posix, 'dup2'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000316 fp1 = open(support.TESTFN)
317 fp2 = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000318 try:
319 posix.dup2(fp1.fileno(), fp2.fileno())
320 finally:
321 fp1.close()
322 fp2.close()
323
Charles-François Natali1e045b12011-05-22 20:42:32 +0200324 @unittest.skipUnless(hasattr(os, 'O_CLOEXEC'), "needs os.O_CLOEXEC")
Charles-François Natali239bb962011-06-03 12:55:15 +0200325 @support.requires_linux_version(2, 6, 23)
Charles-François Natali1e045b12011-05-22 20:42:32 +0200326 def test_oscloexec(self):
327 fd = os.open(support.TESTFN, os.O_RDONLY|os.O_CLOEXEC)
328 self.addCleanup(os.close, fd)
Victor Stinnere36f3752011-05-24 00:29:43 +0200329 self.assertTrue(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Charles-François Natali1e045b12011-05-22 20:42:32 +0200330
Skip Montanaro98470002005-06-17 01:14:49 +0000331 def test_osexlock(self):
332 if hasattr(posix, "O_EXLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000333 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000334 os.O_WRONLY|os.O_EXLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000335 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000336 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
337 os.close(fd)
338
339 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000340 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000341 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000342 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000343 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
344 os.close(fd)
345
346 def test_osshlock(self):
347 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000348 fd1 = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000349 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000350 fd2 = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000351 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
352 os.close(fd2)
353 os.close(fd1)
354
355 if hasattr(posix, "O_EXLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000356 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000357 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000358 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000359 os.O_RDONLY|os.O_EXLOCK|os.O_NONBLOCK)
360 os.close(fd)
361
Neal Norwitze241ce82003-02-17 18:17:05 +0000362 def test_fstat(self):
363 if hasattr(posix, 'fstat'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000364 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000365 try:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000366 self.assertTrue(posix.fstat(fp.fileno()))
Neal Norwitze241ce82003-02-17 18:17:05 +0000367 finally:
368 fp.close()
369
370 def test_stat(self):
371 if hasattr(posix, 'stat'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000372 self.assertTrue(posix.stat(support.TESTFN))
Neal Norwitze241ce82003-02-17 18:17:05 +0000373
Benjamin Peterson052a02b2010-08-17 01:27:09 +0000374 @unittest.skipUnless(hasattr(posix, 'mkfifo'), "don't have mkfifo()")
375 def test_mkfifo(self):
376 support.unlink(support.TESTFN)
377 posix.mkfifo(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR)
378 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
379
380 @unittest.skipUnless(hasattr(posix, 'mknod') and hasattr(stat, 'S_IFIFO'),
381 "don't have mknod()/S_IFIFO")
382 def test_mknod(self):
383 # Test using mknod() to create a FIFO (the only use specified
384 # by POSIX).
385 support.unlink(support.TESTFN)
386 mode = stat.S_IFIFO | stat.S_IRUSR | stat.S_IWUSR
387 try:
388 posix.mknod(support.TESTFN, mode, 0)
389 except OSError as e:
390 # Some old systems don't allow unprivileged users to use
391 # mknod(), or only support creating device nodes.
392 self.assertIn(e.errno, (errno.EPERM, errno.EINVAL))
393 else:
394 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
395
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000396 def _test_all_chown_common(self, chown_func, first_param):
397 """Common code for chown, fchown and lchown tests."""
Charles-François Nataliab2d58e2012-04-17 19:48:35 +0200398 # test a successful chown call
399 chown_func(first_param, os.getuid(), os.getgid())
400
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000401 if os.getuid() == 0:
402 try:
403 # Many linux distros have a nfsnobody user as MAX_UID-2
404 # that makes a good test case for signedness issues.
405 # http://bugs.python.org/issue1747858
406 # This part of the test only runs when run as root.
407 # Only scary people run their tests as root.
408 ent = pwd.getpwnam('nfsnobody')
409 chown_func(first_param, ent.pw_uid, ent.pw_gid)
410 except KeyError:
411 pass
Charles-François Nataliab2d58e2012-04-17 19:48:35 +0200412 elif platform.system() in ('HP-UX', 'SunOS'):
413 # HP-UX and Solaris can allow a non-root user to chown() to root
414 # (issue #5113)
415 raise unittest.SkipTest("Skipping because of non-standard chown() "
416 "behavior")
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000417 else:
418 # non-root cannot chown to root, raises OSError
419 self.assertRaises(OSError, chown_func,
420 first_param, 0, 0)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000421
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000422 @unittest.skipUnless(hasattr(posix, 'chown'), "test needs os.chown()")
423 def test_chown(self):
424 # raise an OSError if the file does not exist
425 os.unlink(support.TESTFN)
426 self.assertRaises(OSError, posix.chown, support.TESTFN, -1, -1)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000427
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000428 # re-create the file
Victor Stinnerbf816222011-06-30 23:25:47 +0200429 support.create_empty_file(support.TESTFN)
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000430 self._test_all_chown_common(posix.chown, support.TESTFN)
431
432 @unittest.skipUnless(hasattr(posix, 'fchown'), "test needs os.fchown()")
433 def test_fchown(self):
434 os.unlink(support.TESTFN)
435
436 # re-create the file
437 test_file = open(support.TESTFN, 'w')
438 try:
439 fd = test_file.fileno()
440 self._test_all_chown_common(posix.fchown, fd)
441 finally:
442 test_file.close()
443
444 @unittest.skipUnless(hasattr(posix, 'lchown'), "test needs os.lchown()")
445 def test_lchown(self):
446 os.unlink(support.TESTFN)
447 # create a symlink
Ned Deily3eb67d52011-06-28 00:00:28 -0700448 os.symlink(_DUMMY_SYMLINK, support.TESTFN)
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000449 self._test_all_chown_common(posix.lchown, support.TESTFN)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000450
Neal Norwitze241ce82003-02-17 18:17:05 +0000451 def test_chdir(self):
452 if hasattr(posix, 'chdir'):
453 posix.chdir(os.curdir)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000454 self.assertRaises(OSError, posix.chdir, support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000455
Martin v. Löwisc9e1c7d2010-07-23 12:16:41 +0000456 def test_listdir(self):
457 if hasattr(posix, 'listdir'):
458 self.assertTrue(support.TESTFN in posix.listdir(os.curdir))
459
460 def test_listdir_default(self):
461 # When listdir is called without argument, it's the same as listdir(os.curdir)
462 if hasattr(posix, 'listdir'):
463 self.assertTrue(support.TESTFN in posix.listdir())
Neal Norwitze241ce82003-02-17 18:17:05 +0000464
Charles-François Natali77940902012-02-06 19:54:48 +0100465 @unittest.skipUnless(hasattr(posix, 'flistdir'), "test needs posix.flistdir()")
466 def test_flistdir(self):
Antoine Pitrou8250e232011-02-25 23:41:16 +0000467 f = posix.open(posix.getcwd(), posix.O_RDONLY)
Charles-François Natali7546ad32012-01-08 18:34:06 +0100468 self.addCleanup(posix.close, f)
Antoine Pitrou8250e232011-02-25 23:41:16 +0000469 self.assertEqual(
470 sorted(posix.listdir('.')),
Charles-François Natali77940902012-02-06 19:54:48 +0100471 sorted(posix.flistdir(f))
Antoine Pitrou8250e232011-02-25 23:41:16 +0000472 )
Charles-François Natali7546ad32012-01-08 18:34:06 +0100473 # Check that the fd offset was reset (issue #13739)
Charles-François Natali7546ad32012-01-08 18:34:06 +0100474 self.assertEqual(
475 sorted(posix.listdir('.')),
Charles-François Natali77940902012-02-06 19:54:48 +0100476 sorted(posix.flistdir(f))
Charles-François Natali7546ad32012-01-08 18:34:06 +0100477 )
Antoine Pitrou8250e232011-02-25 23:41:16 +0000478
Neal Norwitze241ce82003-02-17 18:17:05 +0000479 def test_access(self):
480 if hasattr(posix, 'access'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000481 self.assertTrue(posix.access(support.TESTFN, os.R_OK))
Neal Norwitze241ce82003-02-17 18:17:05 +0000482
483 def test_umask(self):
484 if hasattr(posix, 'umask'):
485 old_mask = posix.umask(0)
Ezio Melottie9615932010-01-24 19:26:24 +0000486 self.assertIsInstance(old_mask, int)
Neal Norwitze241ce82003-02-17 18:17:05 +0000487 posix.umask(old_mask)
488
489 def test_strerror(self):
490 if hasattr(posix, 'strerror'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000491 self.assertTrue(posix.strerror(0))
Neal Norwitze241ce82003-02-17 18:17:05 +0000492
493 def test_pipe(self):
494 if hasattr(posix, 'pipe'):
495 reader, writer = posix.pipe()
496 os.close(reader)
497 os.close(writer)
498
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200499 @unittest.skipUnless(hasattr(os, 'pipe2'), "test needs os.pipe2()")
Charles-François Natali239bb962011-06-03 12:55:15 +0200500 @support.requires_linux_version(2, 6, 27)
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200501 def test_pipe2(self):
502 self.assertRaises(TypeError, os.pipe2, 'DEADBEEF')
503 self.assertRaises(TypeError, os.pipe2, 0, 0)
504
Charles-François Natali368f34b2011-06-06 19:49:47 +0200505 # try calling with flags = 0, like os.pipe()
506 r, w = os.pipe2(0)
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200507 os.close(r)
508 os.close(w)
509
510 # test flags
511 r, w = os.pipe2(os.O_CLOEXEC|os.O_NONBLOCK)
512 self.addCleanup(os.close, r)
513 self.addCleanup(os.close, w)
514 self.assertTrue(fcntl.fcntl(r, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
515 self.assertTrue(fcntl.fcntl(w, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
516 # try reading from an empty pipe: this should fail, not block
517 self.assertRaises(OSError, os.read, r, 1)
518 # try a write big enough to fill-up the pipe: this should either
519 # fail or perform a partial write, not block
520 try:
521 os.write(w, b'x' * support.PIPE_MAX_SIZE)
522 except OSError:
523 pass
524
Neal Norwitze241ce82003-02-17 18:17:05 +0000525 def test_utime(self):
526 if hasattr(posix, 'utime'):
527 now = time.time()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000528 posix.utime(support.TESTFN, None)
529 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None))
530 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None))
531 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now))
532 posix.utime(support.TESTFN, (int(now), int(now)))
533 posix.utime(support.TESTFN, (now, now))
Neal Norwitze241ce82003-02-17 18:17:05 +0000534
Ned Deily3eb67d52011-06-28 00:00:28 -0700535 def _test_chflags_regular_file(self, chflags_func, target_file):
536 st = os.stat(target_file)
537 self.assertTrue(hasattr(st, 'st_flags'))
538 chflags_func(target_file, st.st_flags | stat.UF_IMMUTABLE)
539 try:
540 new_st = os.stat(target_file)
541 self.assertEqual(st.st_flags | stat.UF_IMMUTABLE, new_st.st_flags)
542 try:
543 fd = open(target_file, 'w+')
544 except IOError as e:
545 self.assertEqual(e.errno, errno.EPERM)
546 finally:
547 posix.chflags(target_file, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000548
Ned Deily3eb67d52011-06-28 00:00:28 -0700549 @unittest.skipUnless(hasattr(posix, 'chflags'), 'test needs os.chflags()')
550 def test_chflags(self):
551 self._test_chflags_regular_file(posix.chflags, support.TESTFN)
552
553 @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
554 def test_lchflags_regular_file(self):
555 self._test_chflags_regular_file(posix.lchflags, support.TESTFN)
556
557 @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
558 def test_lchflags_symlink(self):
559 testfn_st = os.stat(support.TESTFN)
560
561 self.assertTrue(hasattr(testfn_st, 'st_flags'))
562
563 os.symlink(support.TESTFN, _DUMMY_SYMLINK)
564 self.teardown_files.append(_DUMMY_SYMLINK)
565 dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
566
567 posix.lchflags(_DUMMY_SYMLINK,
568 dummy_symlink_st.st_flags | stat.UF_IMMUTABLE)
569 try:
570 new_testfn_st = os.stat(support.TESTFN)
571 new_dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
572
573 self.assertEqual(testfn_st.st_flags, new_testfn_st.st_flags)
574 self.assertEqual(dummy_symlink_st.st_flags | stat.UF_IMMUTABLE,
575 new_dummy_symlink_st.st_flags)
576 finally:
577 posix.lchflags(_DUMMY_SYMLINK, dummy_symlink_st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000578
Guido van Rossum98297ee2007-11-06 21:34:58 +0000579 def test_environ(self):
Victor Stinner17b490d2010-05-06 22:19:30 +0000580 if os.name == "nt":
581 item_type = str
582 else:
583 item_type = bytes
Guido van Rossum98297ee2007-11-06 21:34:58 +0000584 for k, v in posix.environ.items():
Victor Stinner17b490d2010-05-06 22:19:30 +0000585 self.assertEqual(type(k), item_type)
586 self.assertEqual(type(v), item_type)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000587
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000588 def test_getcwd_long_pathnames(self):
589 if hasattr(posix, 'getcwd'):
590 dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef'
591 curdir = os.getcwd()
592 base_path = os.path.abspath(support.TESTFN) + '.getcwd'
593
594 try:
595 os.mkdir(base_path)
596 os.chdir(base_path)
597 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000598# Just returning nothing instead of the SkipTest exception,
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000599# because the test results in Error in that case.
600# Is that ok?
Benjamin Petersone549ead2009-03-28 21:42:05 +0000601# raise unittest.SkipTest("cannot create directory for testing")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000602 return
603
604 def _create_and_do_getcwd(dirname, current_path_length = 0):
605 try:
606 os.mkdir(dirname)
607 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000608 raise unittest.SkipTest("mkdir cannot create directory sufficiently deep for getcwd test")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000609
610 os.chdir(dirname)
611 try:
612 os.getcwd()
613 if current_path_length < 1027:
614 _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
615 finally:
616 os.chdir('..')
617 os.rmdir(dirname)
618
619 _create_and_do_getcwd(dirname)
620
621 finally:
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000622 os.chdir(curdir)
R. David Murray414c91f2009-07-09 20:12:31 +0000623 support.rmtree(base_path)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000624
Ross Lagerwallb0ae53d2011-06-10 07:30:30 +0200625 @unittest.skipUnless(hasattr(posix, 'getgrouplist'), "test needs posix.getgrouplist()")
626 @unittest.skipUnless(hasattr(pwd, 'getpwuid'), "test needs pwd.getpwuid()")
627 @unittest.skipUnless(hasattr(os, 'getuid'), "test needs os.getuid()")
628 def test_getgrouplist(self):
629 with os.popen('id -G') as idg:
630 groups = idg.read().strip()
Charles-François Natalid59240d2012-05-02 20:04:40 +0200631 ret = idg.close()
Ross Lagerwallb0ae53d2011-06-10 07:30:30 +0200632
Charles-François Natalid59240d2012-05-02 20:04:40 +0200633 if ret != 0 or not groups:
Ross Lagerwallb0ae53d2011-06-10 07:30:30 +0200634 raise unittest.SkipTest("need working 'id -G'")
635
636 self.assertEqual(
637 set([int(x) for x in groups.split()]),
638 set(posix.getgrouplist(pwd.getpwuid(os.getuid())[0],
639 pwd.getpwuid(os.getuid())[3])))
640
Antoine Pitrou318b8f32011-01-12 18:45:27 +0000641 @unittest.skipUnless(hasattr(os, 'getegid'), "test needs os.getegid()")
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000642 def test_getgroups(self):
643 with os.popen('id -G') as idg:
644 groups = idg.read().strip()
Charles-François Natalie8a255a2012-05-02 20:01:38 +0200645 ret = idg.close()
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000646
Charles-François Natalie8a255a2012-05-02 20:01:38 +0200647 if ret != 0 or not groups:
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000648 raise unittest.SkipTest("need working 'id -G'")
649
Ronald Oussoren7fb6f512010-08-01 19:18:13 +0000650 # 'id -G' and 'os.getgroups()' should return the same
651 # groups, ignoring order and duplicates.
Antoine Pitrou318b8f32011-01-12 18:45:27 +0000652 # #10822 - it is implementation defined whether posix.getgroups()
653 # includes the effective gid so we include it anyway, since id -G does
Ronald Oussorencb615e62010-07-24 14:15:19 +0000654 self.assertEqual(
Ronald Oussoren7fb6f512010-08-01 19:18:13 +0000655 set([int(x) for x in groups.split()]),
Antoine Pitrou318b8f32011-01-12 18:45:27 +0000656 set(posix.getgroups() + [posix.getegid()]))
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000657
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000658 # tests for the posix *at functions follow
659
660 @unittest.skipUnless(hasattr(posix, 'faccessat'), "test needs posix.faccessat()")
661 def test_faccessat(self):
662 f = posix.open(posix.getcwd(), posix.O_RDONLY)
663 try:
664 self.assertTrue(posix.faccessat(f, support.TESTFN, os.R_OK))
665 finally:
666 posix.close(f)
667
668 @unittest.skipUnless(hasattr(posix, 'fchmodat'), "test needs posix.fchmodat()")
669 def test_fchmodat(self):
670 os.chmod(support.TESTFN, stat.S_IRUSR)
671
672 f = posix.open(posix.getcwd(), posix.O_RDONLY)
673 try:
674 posix.fchmodat(f, support.TESTFN, stat.S_IRUSR | stat.S_IWUSR)
675
676 s = posix.stat(support.TESTFN)
677 self.assertEqual(s[0] & stat.S_IRWXU, stat.S_IRUSR | stat.S_IWUSR)
678 finally:
679 posix.close(f)
680
681 @unittest.skipUnless(hasattr(posix, 'fchownat'), "test needs posix.fchownat()")
682 def test_fchownat(self):
683 support.unlink(support.TESTFN)
Victor Stinnerbf816222011-06-30 23:25:47 +0200684 support.create_empty_file(support.TESTFN)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000685
686 f = posix.open(posix.getcwd(), posix.O_RDONLY)
687 try:
688 posix.fchownat(f, support.TESTFN, os.getuid(), os.getgid())
689 finally:
690 posix.close(f)
691
692 @unittest.skipUnless(hasattr(posix, 'fstatat'), "test needs posix.fstatat()")
693 def test_fstatat(self):
694 support.unlink(support.TESTFN)
695 with open(support.TESTFN, 'w') as outfile:
696 outfile.write("testline\n")
697
698 f = posix.open(posix.getcwd(), posix.O_RDONLY)
699 try:
700 s1 = posix.stat(support.TESTFN)
701 s2 = posix.fstatat(f, support.TESTFN)
702 self.assertEqual(s1, s2)
703 finally:
704 posix.close(f)
705
706 @unittest.skipUnless(hasattr(posix, 'futimesat'), "test needs posix.futimesat()")
707 def test_futimesat(self):
708 f = posix.open(posix.getcwd(), posix.O_RDONLY)
709 try:
710 now = time.time()
711 posix.futimesat(f, support.TESTFN, None)
Brian Curtinc1b65d12011-11-07 14:18:54 -0600712 posix.futimesat(f, support.TESTFN)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000713 self.assertRaises(TypeError, posix.futimesat, f, support.TESTFN, (None, None))
714 self.assertRaises(TypeError, posix.futimesat, f, support.TESTFN, (now, None))
715 self.assertRaises(TypeError, posix.futimesat, f, support.TESTFN, (None, now))
716 posix.futimesat(f, support.TESTFN, (int(now), int(now)))
717 posix.futimesat(f, support.TESTFN, (now, now))
718 finally:
719 posix.close(f)
720
721 @unittest.skipUnless(hasattr(posix, 'linkat'), "test needs posix.linkat()")
722 def test_linkat(self):
723 f = posix.open(posix.getcwd(), posix.O_RDONLY)
724 try:
725 posix.linkat(f, support.TESTFN, f, support.TESTFN + 'link')
726 # should have same inodes
727 self.assertEqual(posix.stat(support.TESTFN)[1],
728 posix.stat(support.TESTFN + 'link')[1])
729 finally:
730 posix.close(f)
731 support.unlink(support.TESTFN + 'link')
732
733 @unittest.skipUnless(hasattr(posix, 'mkdirat'), "test needs posix.mkdirat()")
734 def test_mkdirat(self):
735 f = posix.open(posix.getcwd(), posix.O_RDONLY)
736 try:
737 posix.mkdirat(f, support.TESTFN + 'dir')
738 posix.stat(support.TESTFN + 'dir') # should not raise exception
739 finally:
740 posix.close(f)
741 support.rmtree(support.TESTFN + 'dir')
742
743 @unittest.skipUnless(hasattr(posix, 'mknodat') and hasattr(stat, 'S_IFIFO'),
744 "don't have mknodat()/S_IFIFO")
745 def test_mknodat(self):
746 # Test using mknodat() to create a FIFO (the only use specified
747 # by POSIX).
748 support.unlink(support.TESTFN)
749 mode = stat.S_IFIFO | stat.S_IRUSR | stat.S_IWUSR
750 f = posix.open(posix.getcwd(), posix.O_RDONLY)
751 try:
752 posix.mknodat(f, support.TESTFN, mode, 0)
753 except OSError as e:
754 # Some old systems don't allow unprivileged users to use
755 # mknod(), or only support creating device nodes.
756 self.assertIn(e.errno, (errno.EPERM, errno.EINVAL))
757 else:
758 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
759 finally:
760 posix.close(f)
761
762 @unittest.skipUnless(hasattr(posix, 'openat'), "test needs posix.openat()")
763 def test_openat(self):
764 support.unlink(support.TESTFN)
765 with open(support.TESTFN, 'w') as outfile:
766 outfile.write("testline\n")
767 a = posix.open(posix.getcwd(), posix.O_RDONLY)
768 b = posix.openat(a, support.TESTFN, posix.O_RDONLY)
769 try:
770 res = posix.read(b, 9).decode(encoding="utf-8")
771 self.assertEqual("testline\n", res)
772 finally:
773 posix.close(a)
774 posix.close(b)
775
776 @unittest.skipUnless(hasattr(posix, 'readlinkat'), "test needs posix.readlinkat()")
777 def test_readlinkat(self):
778 os.symlink(support.TESTFN, support.TESTFN + 'link')
779 f = posix.open(posix.getcwd(), posix.O_RDONLY)
780 try:
781 self.assertEqual(posix.readlink(support.TESTFN + 'link'),
782 posix.readlinkat(f, support.TESTFN + 'link'))
783 finally:
784 support.unlink(support.TESTFN + 'link')
785 posix.close(f)
786
787 @unittest.skipUnless(hasattr(posix, 'renameat'), "test needs posix.renameat()")
788 def test_renameat(self):
789 support.unlink(support.TESTFN)
Victor Stinnerbf816222011-06-30 23:25:47 +0200790 support.create_empty_file(support.TESTFN + 'ren')
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000791 f = posix.open(posix.getcwd(), posix.O_RDONLY)
792 try:
793 posix.renameat(f, support.TESTFN + 'ren', f, support.TESTFN)
794 except:
795 posix.rename(support.TESTFN + 'ren', support.TESTFN)
796 raise
797 else:
798 posix.stat(support.TESTFN) # should not throw exception
799 finally:
800 posix.close(f)
801
802 @unittest.skipUnless(hasattr(posix, 'symlinkat'), "test needs posix.symlinkat()")
803 def test_symlinkat(self):
804 f = posix.open(posix.getcwd(), posix.O_RDONLY)
805 try:
806 posix.symlinkat(support.TESTFN, f, support.TESTFN + 'link')
807 self.assertEqual(posix.readlink(support.TESTFN + 'link'), support.TESTFN)
808 finally:
809 posix.close(f)
810 support.unlink(support.TESTFN + 'link')
811
812 @unittest.skipUnless(hasattr(posix, 'unlinkat'), "test needs posix.unlinkat()")
813 def test_unlinkat(self):
814 f = posix.open(posix.getcwd(), posix.O_RDONLY)
Victor Stinnerbf816222011-06-30 23:25:47 +0200815 support.create_empty_file(support.TESTFN + 'del')
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000816 posix.stat(support.TESTFN + 'del') # should not throw exception
817 try:
818 posix.unlinkat(f, support.TESTFN + 'del')
819 except:
820 support.unlink(support.TESTFN + 'del')
821 raise
822 else:
823 self.assertRaises(OSError, posix.stat, support.TESTFN + 'link')
824 finally:
825 posix.close(f)
826
827 @unittest.skipUnless(hasattr(posix, 'utimensat'), "test needs posix.utimensat()")
828 def test_utimensat(self):
829 f = posix.open(posix.getcwd(), posix.O_RDONLY)
830 try:
831 now = time.time()
832 posix.utimensat(f, support.TESTFN, None, None)
Brian Curtin569b4942011-11-07 16:09:20 -0600833 posix.utimensat(f, support.TESTFN)
834 posix.utimensat(f, support.TESTFN, flags=os.AT_SYMLINK_NOFOLLOW)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000835 self.assertRaises(TypeError, posix.utimensat, f, support.TESTFN, (None, None), (None, None))
836 self.assertRaises(TypeError, posix.utimensat, f, support.TESTFN, (now, 0), None)
837 self.assertRaises(TypeError, posix.utimensat, f, support.TESTFN, None, (now, 0))
838 posix.utimensat(f, support.TESTFN, (int(now), int((now - int(now)) * 1e9)),
839 (int(now), int((now - int(now)) * 1e9)))
Brian Curtin569b4942011-11-07 16:09:20 -0600840 posix.utimensat(dirfd=f, path=support.TESTFN,
841 atime=(int(now), int((now - int(now)) * 1e9)),
842 mtime=(int(now), int((now - int(now)) * 1e9)))
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000843 finally:
844 posix.close(f)
845
846 @unittest.skipUnless(hasattr(posix, 'mkfifoat'), "don't have mkfifoat()")
847 def test_mkfifoat(self):
848 support.unlink(support.TESTFN)
849 f = posix.open(posix.getcwd(), posix.O_RDONLY)
850 try:
851 posix.mkfifoat(f, support.TESTFN, stat.S_IRUSR | stat.S_IWUSR)
852 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
853 finally:
854 posix.close(f)
855
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500856 requires_sched_h = unittest.skipUnless(hasattr(posix, 'sched_yield'),
857 "don't have scheduling support")
Benjamin Peterson2740af82011-08-02 17:41:34 -0500858 requires_sched_affinity = unittest.skipUnless(hasattr(posix, 'cpu_set'),
Benjamin Peterson50ba2712011-08-02 22:15:40 -0500859 "don't have sched affinity support")
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500860
861 @requires_sched_h
862 def test_sched_yield(self):
863 # This has no error conditions (at least on Linux).
864 posix.sched_yield()
865
866 @requires_sched_h
Charles-François Nataliea0d5fc2011-09-06 19:03:35 +0200867 @unittest.skipUnless(hasattr(posix, 'sched_get_priority_max'),
868 "requires sched_get_priority_max()")
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500869 def test_sched_priority(self):
870 # Round-robin usually has interesting priorities.
871 pol = posix.SCHED_RR
872 lo = posix.sched_get_priority_min(pol)
873 hi = posix.sched_get_priority_max(pol)
874 self.assertIsInstance(lo, int)
875 self.assertIsInstance(hi, int)
876 self.assertGreaterEqual(hi, lo)
Benjamin Peterson539b6c42011-08-02 22:09:37 -0500877 # OSX evidently just returns 15 without checking the argument.
878 if sys.platform != "darwin":
Benjamin Petersonc1581582011-08-02 22:10:55 -0500879 self.assertRaises(OSError, posix.sched_get_priority_min, -23)
880 self.assertRaises(OSError, posix.sched_get_priority_max, -23)
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500881
Benjamin Petersonc5fce4d2011-08-02 18:07:32 -0500882 @unittest.skipUnless(hasattr(posix, 'sched_setscheduler'), "can't change scheduler")
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500883 def test_get_and_set_scheduler_and_param(self):
884 possible_schedulers = [sched for name, sched in posix.__dict__.items()
885 if name.startswith("SCHED_")]
886 mine = posix.sched_getscheduler(0)
887 self.assertIn(mine, possible_schedulers)
888 try:
Jesus Ceaceb5d162011-09-10 01:16:55 +0200889 parent = posix.sched_getscheduler(os.getppid())
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500890 except OSError as e:
Jesus Ceaceb5d162011-09-10 01:16:55 +0200891 if e.errno != errno.EPERM:
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500892 raise
893 else:
Jesus Ceaceb5d162011-09-10 01:16:55 +0200894 self.assertIn(parent, possible_schedulers)
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500895 self.assertRaises(OSError, posix.sched_getscheduler, -1)
896 self.assertRaises(OSError, posix.sched_getparam, -1)
897 param = posix.sched_getparam(0)
898 self.assertIsInstance(param.sched_priority, int)
Benjamin Peterson18592ca2011-08-02 18:48:59 -0500899 try:
900 posix.sched_setscheduler(0, mine, param)
901 except OSError as e:
902 if e.errno != errno.EPERM:
903 raise
Charles-François Natali7b911cb2011-08-21 12:41:43 +0200904
905 # POSIX states that calling sched_setparam() on a process with a
906 # scheduling policy other than SCHED_FIFO or SCHED_RR is
907 # implementation-defined: FreeBSD returns EINVAL.
908 if not sys.platform.startswith('freebsd'):
909 posix.sched_setparam(0, param)
910 self.assertRaises(OSError, posix.sched_setparam, -1, param)
911
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500912 self.assertRaises(OSError, posix.sched_setscheduler, -1, mine, param)
913 self.assertRaises(TypeError, posix.sched_setscheduler, 0, mine, None)
914 self.assertRaises(TypeError, posix.sched_setparam, 0, 43)
915 param = posix.sched_param(None)
916 self.assertRaises(TypeError, posix.sched_setparam, 0, param)
917 large = 214748364700
918 param = posix.sched_param(large)
919 self.assertRaises(OverflowError, posix.sched_setparam, 0, param)
920 param = posix.sched_param(sched_priority=-large)
921 self.assertRaises(OverflowError, posix.sched_setparam, 0, param)
922
Benjamin Petersonc5fce4d2011-08-02 18:07:32 -0500923 @unittest.skipUnless(hasattr(posix, "sched_rr_get_interval"), "no function")
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500924 def test_sched_rr_get_interval(self):
Benjamin Peterson43234ab2011-08-02 22:19:14 -0500925 try:
926 interval = posix.sched_rr_get_interval(0)
927 except OSError as e:
928 # This likely means that sched_rr_get_interval is only valid for
929 # processes with the SCHED_RR scheduler in effect.
930 if e.errno != errno.EINVAL:
931 raise
932 self.skipTest("only works on SCHED_RR processes")
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500933 self.assertIsInstance(interval, float)
934 # Reasonable constraints, I think.
935 self.assertGreaterEqual(interval, 0.)
936 self.assertLess(interval, 1.)
937
Benjamin Peterson2740af82011-08-02 17:41:34 -0500938 @requires_sched_affinity
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500939 def test_sched_affinity(self):
940 mask = posix.sched_getaffinity(0, 1024)
941 self.assertGreaterEqual(mask.count(), 1)
942 self.assertIsInstance(mask, posix.cpu_set)
943 self.assertRaises(OSError, posix.sched_getaffinity, -1, 1024)
944 empty = posix.cpu_set(10)
945 posix.sched_setaffinity(0, mask)
946 self.assertRaises(OSError, posix.sched_setaffinity, 0, empty)
947 self.assertRaises(OSError, posix.sched_setaffinity, -1, mask)
948
Benjamin Peterson2740af82011-08-02 17:41:34 -0500949 @requires_sched_affinity
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500950 def test_cpu_set_basic(self):
951 s = posix.cpu_set(10)
952 self.assertEqual(len(s), 10)
953 self.assertEqual(s.count(), 0)
954 s.set(0)
955 s.set(9)
956 self.assertTrue(s.isset(0))
957 self.assertTrue(s.isset(9))
958 self.assertFalse(s.isset(5))
959 self.assertEqual(s.count(), 2)
960 s.clear(0)
961 self.assertFalse(s.isset(0))
962 self.assertEqual(s.count(), 1)
963 s.zero()
964 self.assertFalse(s.isset(0))
965 self.assertFalse(s.isset(9))
966 self.assertEqual(s.count(), 0)
967 self.assertRaises(ValueError, s.set, -1)
968 self.assertRaises(ValueError, s.set, 10)
969 self.assertRaises(ValueError, s.clear, -1)
970 self.assertRaises(ValueError, s.clear, 10)
971 self.assertRaises(ValueError, s.isset, -1)
972 self.assertRaises(ValueError, s.isset, 10)
973
Benjamin Peterson2740af82011-08-02 17:41:34 -0500974 @requires_sched_affinity
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500975 def test_cpu_set_cmp(self):
976 self.assertNotEqual(posix.cpu_set(11), posix.cpu_set(12))
977 l = posix.cpu_set(10)
978 r = posix.cpu_set(10)
979 self.assertEqual(l, r)
980 l.set(1)
981 self.assertNotEqual(l, r)
982 r.set(1)
983 self.assertEqual(l, r)
984
Benjamin Peterson2740af82011-08-02 17:41:34 -0500985 @requires_sched_affinity
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500986 def test_cpu_set_bitwise(self):
987 l = posix.cpu_set(5)
988 l.set(0)
989 l.set(1)
990 r = posix.cpu_set(5)
991 r.set(1)
992 r.set(2)
993 b = l & r
994 self.assertEqual(b.count(), 1)
995 self.assertTrue(b.isset(1))
996 b = l | r
997 self.assertEqual(b.count(), 3)
998 self.assertTrue(b.isset(0))
999 self.assertTrue(b.isset(1))
1000 self.assertTrue(b.isset(2))
1001 b = l ^ r
1002 self.assertEqual(b.count(), 2)
1003 self.assertTrue(b.isset(0))
1004 self.assertFalse(b.isset(1))
1005 self.assertTrue(b.isset(2))
1006 b = l
1007 b |= r
1008 self.assertIs(b, l)
1009 self.assertEqual(l.count(), 3)
1010
Victor Stinner8b905bd2011-10-25 13:34:04 +02001011 def test_rtld_constants(self):
1012 # check presence of major RTLD_* constants
1013 posix.RTLD_LAZY
1014 posix.RTLD_NOW
1015 posix.RTLD_GLOBAL
1016 posix.RTLD_LOCAL
1017
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001018class PosixGroupsTester(unittest.TestCase):
1019
1020 def setUp(self):
1021 if posix.getuid() != 0:
1022 raise unittest.SkipTest("not enough privileges")
1023 if not hasattr(posix, 'getgroups'):
1024 raise unittest.SkipTest("need posix.getgroups")
1025 if sys.platform == 'darwin':
1026 raise unittest.SkipTest("getgroups(2) is broken on OSX")
1027 self.saved_groups = posix.getgroups()
1028
1029 def tearDown(self):
1030 if hasattr(posix, 'setgroups'):
1031 posix.setgroups(self.saved_groups)
1032 elif hasattr(posix, 'initgroups'):
1033 name = pwd.getpwuid(posix.getuid()).pw_name
1034 posix.initgroups(name, self.saved_groups[0])
1035
1036 @unittest.skipUnless(hasattr(posix, 'initgroups'),
1037 "test needs posix.initgroups()")
1038 def test_initgroups(self):
1039 # find missing group
1040
Antoine Pitroue5a91012010-09-04 17:32:06 +00001041 g = max(self.saved_groups) + 1
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001042 name = pwd.getpwuid(posix.getuid()).pw_name
1043 posix.initgroups(name, g)
1044 self.assertIn(g, posix.getgroups())
1045
1046 @unittest.skipUnless(hasattr(posix, 'setgroups'),
1047 "test needs posix.setgroups()")
1048 def test_setgroups(self):
Antoine Pitroue5a91012010-09-04 17:32:06 +00001049 for groups in [[0], list(range(16))]:
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001050 posix.setgroups(groups)
1051 self.assertListEqual(groups, posix.getgroups())
1052
Neal Norwitze241ce82003-02-17 18:17:05 +00001053def test_main():
Antoine Pitrou68c95922011-03-20 17:33:57 +01001054 try:
1055 support.run_unittest(PosixTester, PosixGroupsTester)
1056 finally:
1057 support.reap_children()
Neal Norwitze241ce82003-02-17 18:17:05 +00001058
1059if __name__ == '__main__':
1060 test_main()