blob: 9bedc7d2377b0ad4530a53ab9052734658d1fe26 [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()))
Larry Hastings9cf065c2012-06-22 16:30:09 -0700132 self.assertTrue(posix.statvfs(fp.fileno()))
Neal Norwitze241ce82003-02-17 18:17:05 +0000133 finally:
134 fp.close()
135
136 def test_ftruncate(self):
137 if hasattr(posix, 'ftruncate'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000138 fp = open(support.TESTFN, 'w+')
Neal Norwitze241ce82003-02-17 18:17:05 +0000139 try:
140 # we need to have some data to truncate
141 fp.write('test')
142 fp.flush()
143 posix.ftruncate(fp.fileno(), 0)
144 finally:
145 fp.close()
146
Ross Lagerwall7807c352011-03-17 20:20:30 +0200147 @unittest.skipUnless(hasattr(posix, 'truncate'), "test needs posix.truncate()")
148 def test_truncate(self):
149 with open(support.TESTFN, 'w') as fp:
150 fp.write('test')
151 fp.flush()
152 posix.truncate(support.TESTFN, 0)
153
Larry Hastings9cf065c2012-06-22 16:30:09 -0700154 @unittest.skipUnless(getattr(os, 'execve', None) in os.supports_fd, "test needs execve() to support the fd parameter")
Ross Lagerwall7807c352011-03-17 20:20:30 +0200155 @unittest.skipUnless(hasattr(os, 'fork'), "test needs os.fork()")
Ross Lagerwalldedf6cf2011-03-20 18:27:05 +0200156 @unittest.skipUnless(hasattr(os, 'waitpid'), "test needs os.waitpid()")
Ross Lagerwall7807c352011-03-17 20:20:30 +0200157 def test_fexecve(self):
158 fp = os.open(sys.executable, os.O_RDONLY)
159 try:
160 pid = os.fork()
161 if pid == 0:
162 os.chdir(os.path.split(sys.executable)[0])
Larry Hastings9cf065c2012-06-22 16:30:09 -0700163 posix.execve(fp, [sys.executable, '-c', 'pass'], os.environ)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200164 else:
Ross Lagerwalldedf6cf2011-03-20 18:27:05 +0200165 self.assertEqual(os.waitpid(pid, 0), (pid, 0))
Ross Lagerwall7807c352011-03-17 20:20:30 +0200166 finally:
167 os.close(fp)
168
169 @unittest.skipUnless(hasattr(posix, 'waitid'), "test needs posix.waitid()")
170 @unittest.skipUnless(hasattr(os, 'fork'), "test needs os.fork()")
171 def test_waitid(self):
172 pid = os.fork()
173 if pid == 0:
174 os.chdir(os.path.split(sys.executable)[0])
175 posix.execve(sys.executable, [sys.executable, '-c', 'pass'], os.environ)
176 else:
177 res = posix.waitid(posix.P_PID, pid, posix.WEXITED)
178 self.assertEqual(pid, res.si_pid)
179
180 @unittest.skipUnless(hasattr(posix, 'lockf'), "test needs posix.lockf()")
181 def test_lockf(self):
182 fd = os.open(support.TESTFN, os.O_WRONLY | os.O_CREAT)
183 try:
184 os.write(fd, b'test')
185 os.lseek(fd, 0, os.SEEK_SET)
186 posix.lockf(fd, posix.F_LOCK, 4)
187 # section is locked
188 posix.lockf(fd, posix.F_ULOCK, 4)
189 finally:
190 os.close(fd)
191
192 @unittest.skipUnless(hasattr(posix, 'pread'), "test needs posix.pread()")
193 def test_pread(self):
194 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
195 try:
196 os.write(fd, b'test')
197 os.lseek(fd, 0, os.SEEK_SET)
198 self.assertEqual(b'es', posix.pread(fd, 2, 1))
Florent Xiclunae41f0de2011-11-11 19:39:25 +0100199 # the first pread() shouldn't disturb the file offset
Ross Lagerwall7807c352011-03-17 20:20:30 +0200200 self.assertEqual(b'te', posix.read(fd, 2))
201 finally:
202 os.close(fd)
203
204 @unittest.skipUnless(hasattr(posix, 'pwrite'), "test needs posix.pwrite()")
205 def test_pwrite(self):
206 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
207 try:
208 os.write(fd, b'test')
209 os.lseek(fd, 0, os.SEEK_SET)
210 posix.pwrite(fd, b'xx', 1)
211 self.assertEqual(b'txxt', posix.read(fd, 4))
212 finally:
213 os.close(fd)
214
215 @unittest.skipUnless(hasattr(posix, 'posix_fallocate'),
216 "test needs posix.posix_fallocate()")
217 def test_posix_fallocate(self):
218 fd = os.open(support.TESTFN, os.O_WRONLY | os.O_CREAT)
219 try:
220 posix.posix_fallocate(fd, 0, 10)
221 except OSError as inst:
222 # issue10812, ZFS doesn't appear to support posix_fallocate,
223 # so skip Solaris-based since they are likely to have ZFS.
224 if inst.errno != errno.EINVAL or not sys.platform.startswith("sunos"):
225 raise
226 finally:
227 os.close(fd)
228
229 @unittest.skipUnless(hasattr(posix, 'posix_fadvise'),
230 "test needs posix.posix_fadvise()")
231 def test_posix_fadvise(self):
232 fd = os.open(support.TESTFN, os.O_RDONLY)
233 try:
234 posix.posix_fadvise(fd, 0, 0, posix.POSIX_FADV_WILLNEED)
235 finally:
236 os.close(fd)
237
Larry Hastings9cf065c2012-06-22 16:30:09 -0700238 @unittest.skipUnless(os.utime in os.supports_fd, "test needs fd support in os.utime")
239 def test_utime_with_fd(self):
Ross Lagerwall7807c352011-03-17 20:20:30 +0200240 now = time.time()
241 fd = os.open(support.TESTFN, os.O_RDONLY)
242 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700243 posix.utime(fd)
244 posix.utime(fd, None)
245 self.assertRaises(TypeError, posix.utime, fd, (None, None))
246 self.assertRaises(TypeError, posix.utime, fd, (now, None))
247 self.assertRaises(TypeError, posix.utime, fd, (None, now))
248 posix.utime(fd, (int(now), int(now)))
249 posix.utime(fd, (now, now))
250 self.assertRaises(ValueError, posix.utime, fd, (now, now), ns=(now, now))
251 self.assertRaises(ValueError, posix.utime, fd, (now, 0), ns=(None, None))
252 self.assertRaises(ValueError, posix.utime, fd, (None, None), ns=(now, 0))
253 posix.utime(fd, (int(now), int((now - int(now)) * 1e9)))
254 posix.utime(fd, ns=(int(now), int((now - int(now)) * 1e9)))
255
Ross Lagerwall7807c352011-03-17 20:20:30 +0200256 finally:
257 os.close(fd)
258
Larry Hastings9cf065c2012-06-22 16:30:09 -0700259 @unittest.skipUnless(os.utime in os.supports_follow_symlinks, "test needs follow_symlinks support in os.utime")
260 def test_utime_nofollow_symlinks(self):
Ross Lagerwall7807c352011-03-17 20:20:30 +0200261 now = time.time()
Larry Hastings9cf065c2012-06-22 16:30:09 -0700262 posix.utime(support.TESTFN, None, follow_symlinks=False)
263 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None), follow_symlinks=False)
264 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None), follow_symlinks=False)
265 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now), follow_symlinks=False)
266 posix.utime(support.TESTFN, (int(now), int(now)), follow_symlinks=False)
267 posix.utime(support.TESTFN, (now, now), follow_symlinks=False)
268 posix.utime(support.TESTFN, follow_symlinks=False)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200269
270 @unittest.skipUnless(hasattr(posix, 'writev'), "test needs posix.writev()")
271 def test_writev(self):
272 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
273 try:
274 os.writev(fd, (b'test1', b'tt2', b't3'))
275 os.lseek(fd, 0, os.SEEK_SET)
276 self.assertEqual(b'test1tt2t3', posix.read(fd, 10))
277 finally:
278 os.close(fd)
279
280 @unittest.skipUnless(hasattr(posix, 'readv'), "test needs posix.readv()")
281 def test_readv(self):
282 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
283 try:
284 os.write(fd, b'test1tt2t3')
285 os.lseek(fd, 0, os.SEEK_SET)
286 buf = [bytearray(i) for i in [5, 3, 2]]
287 self.assertEqual(posix.readv(fd, buf), 10)
288 self.assertEqual([b'test1', b'tt2', b't3'], [bytes(i) for i in buf])
289 finally:
290 os.close(fd)
291
Neal Norwitze241ce82003-02-17 18:17:05 +0000292 def test_dup(self):
293 if hasattr(posix, 'dup'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000294 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000295 try:
296 fd = posix.dup(fp.fileno())
Ezio Melottie9615932010-01-24 19:26:24 +0000297 self.assertIsInstance(fd, int)
Neal Norwitze241ce82003-02-17 18:17:05 +0000298 os.close(fd)
299 finally:
300 fp.close()
301
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000302 def test_confstr(self):
303 if hasattr(posix, 'confstr'):
304 self.assertRaises(ValueError, posix.confstr, "CS_garbage")
305 self.assertEqual(len(posix.confstr("CS_PATH")) > 0, True)
306
Neal Norwitze241ce82003-02-17 18:17:05 +0000307 def test_dup2(self):
308 if hasattr(posix, 'dup2'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000309 fp1 = open(support.TESTFN)
310 fp2 = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000311 try:
312 posix.dup2(fp1.fileno(), fp2.fileno())
313 finally:
314 fp1.close()
315 fp2.close()
316
Charles-François Natali1e045b12011-05-22 20:42:32 +0200317 @unittest.skipUnless(hasattr(os, 'O_CLOEXEC'), "needs os.O_CLOEXEC")
Charles-François Natali239bb962011-06-03 12:55:15 +0200318 @support.requires_linux_version(2, 6, 23)
Charles-François Natali1e045b12011-05-22 20:42:32 +0200319 def test_oscloexec(self):
320 fd = os.open(support.TESTFN, os.O_RDONLY|os.O_CLOEXEC)
321 self.addCleanup(os.close, fd)
Victor Stinnere36f3752011-05-24 00:29:43 +0200322 self.assertTrue(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Charles-François Natali1e045b12011-05-22 20:42:32 +0200323
Skip Montanaro98470002005-06-17 01:14:49 +0000324 def test_osexlock(self):
325 if hasattr(posix, "O_EXLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000326 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000327 os.O_WRONLY|os.O_EXLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000328 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000329 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
330 os.close(fd)
331
332 if hasattr(posix, "O_SHLOCK"):
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_SHLOCK|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 def test_osshlock(self):
340 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000341 fd1 = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000342 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000343 fd2 = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000344 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
345 os.close(fd2)
346 os.close(fd1)
347
348 if hasattr(posix, "O_EXLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000349 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000350 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000351 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000352 os.O_RDONLY|os.O_EXLOCK|os.O_NONBLOCK)
353 os.close(fd)
354
Neal Norwitze241ce82003-02-17 18:17:05 +0000355 def test_fstat(self):
356 if hasattr(posix, 'fstat'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000357 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000358 try:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000359 self.assertTrue(posix.fstat(fp.fileno()))
Larry Hastings9cf065c2012-06-22 16:30:09 -0700360 self.assertTrue(posix.stat(fp.fileno()))
Neal Norwitze241ce82003-02-17 18:17:05 +0000361 finally:
362 fp.close()
363
364 def test_stat(self):
365 if hasattr(posix, 'stat'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000366 self.assertTrue(posix.stat(support.TESTFN))
Neal Norwitze241ce82003-02-17 18:17:05 +0000367
Benjamin Peterson052a02b2010-08-17 01:27:09 +0000368 @unittest.skipUnless(hasattr(posix, 'mkfifo'), "don't have mkfifo()")
369 def test_mkfifo(self):
370 support.unlink(support.TESTFN)
371 posix.mkfifo(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR)
372 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
373
374 @unittest.skipUnless(hasattr(posix, 'mknod') and hasattr(stat, 'S_IFIFO'),
375 "don't have mknod()/S_IFIFO")
376 def test_mknod(self):
377 # Test using mknod() to create a FIFO (the only use specified
378 # by POSIX).
379 support.unlink(support.TESTFN)
380 mode = stat.S_IFIFO | stat.S_IRUSR | stat.S_IWUSR
381 try:
382 posix.mknod(support.TESTFN, mode, 0)
383 except OSError as e:
384 # Some old systems don't allow unprivileged users to use
385 # mknod(), or only support creating device nodes.
386 self.assertIn(e.errno, (errno.EPERM, errno.EINVAL))
387 else:
388 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
389
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000390 def _test_all_chown_common(self, chown_func, first_param):
391 """Common code for chown, fchown and lchown tests."""
Charles-François Nataliab2d58e2012-04-17 19:48:35 +0200392 # test a successful chown call
393 chown_func(first_param, os.getuid(), os.getgid())
394
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000395 if os.getuid() == 0:
396 try:
397 # Many linux distros have a nfsnobody user as MAX_UID-2
398 # that makes a good test case for signedness issues.
399 # http://bugs.python.org/issue1747858
400 # This part of the test only runs when run as root.
401 # Only scary people run their tests as root.
402 ent = pwd.getpwnam('nfsnobody')
403 chown_func(first_param, ent.pw_uid, ent.pw_gid)
404 except KeyError:
405 pass
Charles-François Nataliab2d58e2012-04-17 19:48:35 +0200406 elif platform.system() in ('HP-UX', 'SunOS'):
407 # HP-UX and Solaris can allow a non-root user to chown() to root
408 # (issue #5113)
409 raise unittest.SkipTest("Skipping because of non-standard chown() "
410 "behavior")
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000411 else:
412 # non-root cannot chown to root, raises OSError
413 self.assertRaises(OSError, chown_func,
414 first_param, 0, 0)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000415
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000416 @unittest.skipUnless(hasattr(posix, 'chown'), "test needs os.chown()")
417 def test_chown(self):
418 # raise an OSError if the file does not exist
419 os.unlink(support.TESTFN)
420 self.assertRaises(OSError, posix.chown, support.TESTFN, -1, -1)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000421
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000422 # re-create the file
Victor Stinnerbf816222011-06-30 23:25:47 +0200423 support.create_empty_file(support.TESTFN)
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000424 self._test_all_chown_common(posix.chown, support.TESTFN)
425
426 @unittest.skipUnless(hasattr(posix, 'fchown'), "test needs os.fchown()")
427 def test_fchown(self):
428 os.unlink(support.TESTFN)
429
430 # re-create the file
431 test_file = open(support.TESTFN, 'w')
432 try:
433 fd = test_file.fileno()
434 self._test_all_chown_common(posix.fchown, fd)
435 finally:
436 test_file.close()
437
438 @unittest.skipUnless(hasattr(posix, 'lchown'), "test needs os.lchown()")
439 def test_lchown(self):
440 os.unlink(support.TESTFN)
441 # create a symlink
Ned Deily3eb67d52011-06-28 00:00:28 -0700442 os.symlink(_DUMMY_SYMLINK, support.TESTFN)
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000443 self._test_all_chown_common(posix.lchown, support.TESTFN)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000444
Neal Norwitze241ce82003-02-17 18:17:05 +0000445 def test_chdir(self):
446 if hasattr(posix, 'chdir'):
447 posix.chdir(os.curdir)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000448 self.assertRaises(OSError, posix.chdir, support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000449
Martin v. Löwisc9e1c7d2010-07-23 12:16:41 +0000450 def test_listdir(self):
Larry Hastingsfdaea062012-06-25 04:42:23 -0700451 self.assertTrue(support.TESTFN in posix.listdir(os.curdir))
Martin v. Löwisc9e1c7d2010-07-23 12:16:41 +0000452
453 def test_listdir_default(self):
Larry Hastingsfdaea062012-06-25 04:42:23 -0700454 # When listdir is called without argument,
455 # it's the same as listdir(os.curdir).
456 self.assertTrue(support.TESTFN in posix.listdir())
Neal Norwitze241ce82003-02-17 18:17:05 +0000457
Larry Hastingsfdaea062012-06-25 04:42:23 -0700458 def test_listdir_bytes(self):
459 # When listdir is called with a bytes object,
460 # the returned strings are of type bytes.
461 self.assertTrue(os.fsencode(support.TESTFN) in posix.listdir(b'.'))
462
463 @unittest.skipUnless(posix.listdir in os.supports_fd,
464 "test needs fd support for posix.listdir()")
465 def test_listdir_fd(self):
Antoine Pitrou8250e232011-02-25 23:41:16 +0000466 f = posix.open(posix.getcwd(), posix.O_RDONLY)
Charles-François Natali7546ad32012-01-08 18:34:06 +0100467 self.addCleanup(posix.close, f)
Antoine Pitrou8250e232011-02-25 23:41:16 +0000468 self.assertEqual(
469 sorted(posix.listdir('.')),
Larry Hastings9cf065c2012-06-22 16:30:09 -0700470 sorted(posix.listdir(f))
Antoine Pitrou8250e232011-02-25 23:41:16 +0000471 )
Charles-François Natali7546ad32012-01-08 18:34:06 +0100472 # Check that the fd offset was reset (issue #13739)
Charles-François Natali7546ad32012-01-08 18:34:06 +0100473 self.assertEqual(
474 sorted(posix.listdir('.')),
Larry Hastings9cf065c2012-06-22 16:30:09 -0700475 sorted(posix.listdir(f))
Charles-François Natali7546ad32012-01-08 18:34:06 +0100476 )
Antoine Pitrou8250e232011-02-25 23:41:16 +0000477
Neal Norwitze241ce82003-02-17 18:17:05 +0000478 def test_access(self):
479 if hasattr(posix, 'access'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000480 self.assertTrue(posix.access(support.TESTFN, os.R_OK))
Neal Norwitze241ce82003-02-17 18:17:05 +0000481
482 def test_umask(self):
483 if hasattr(posix, 'umask'):
484 old_mask = posix.umask(0)
Ezio Melottie9615932010-01-24 19:26:24 +0000485 self.assertIsInstance(old_mask, int)
Neal Norwitze241ce82003-02-17 18:17:05 +0000486 posix.umask(old_mask)
487
488 def test_strerror(self):
489 if hasattr(posix, 'strerror'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000490 self.assertTrue(posix.strerror(0))
Neal Norwitze241ce82003-02-17 18:17:05 +0000491
492 def test_pipe(self):
493 if hasattr(posix, 'pipe'):
494 reader, writer = posix.pipe()
495 os.close(reader)
496 os.close(writer)
497
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200498 @unittest.skipUnless(hasattr(os, 'pipe2'), "test needs os.pipe2()")
Charles-François Natali239bb962011-06-03 12:55:15 +0200499 @support.requires_linux_version(2, 6, 27)
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200500 def test_pipe2(self):
501 self.assertRaises(TypeError, os.pipe2, 'DEADBEEF')
502 self.assertRaises(TypeError, os.pipe2, 0, 0)
503
Charles-François Natali368f34b2011-06-06 19:49:47 +0200504 # try calling with flags = 0, like os.pipe()
505 r, w = os.pipe2(0)
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200506 os.close(r)
507 os.close(w)
508
509 # test flags
510 r, w = os.pipe2(os.O_CLOEXEC|os.O_NONBLOCK)
511 self.addCleanup(os.close, r)
512 self.addCleanup(os.close, w)
513 self.assertTrue(fcntl.fcntl(r, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
514 self.assertTrue(fcntl.fcntl(w, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
515 # try reading from an empty pipe: this should fail, not block
516 self.assertRaises(OSError, os.read, r, 1)
517 # try a write big enough to fill-up the pipe: this should either
518 # fail or perform a partial write, not block
519 try:
520 os.write(w, b'x' * support.PIPE_MAX_SIZE)
521 except OSError:
522 pass
523
Neal Norwitze241ce82003-02-17 18:17:05 +0000524 def test_utime(self):
525 if hasattr(posix, 'utime'):
526 now = time.time()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000527 posix.utime(support.TESTFN, None)
528 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None))
529 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None))
530 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now))
531 posix.utime(support.TESTFN, (int(now), int(now)))
532 posix.utime(support.TESTFN, (now, now))
Neal Norwitze241ce82003-02-17 18:17:05 +0000533
Larry Hastings9cf065c2012-06-22 16:30:09 -0700534 def _test_chflags_regular_file(self, chflags_func, target_file, **kwargs):
Ned Deily3eb67d52011-06-28 00:00:28 -0700535 st = os.stat(target_file)
536 self.assertTrue(hasattr(st, 'st_flags'))
Larry Hastings9cf065c2012-06-22 16:30:09 -0700537 chflags_func(target_file, st.st_flags | stat.UF_IMMUTABLE, **kwargs)
Ned Deily3eb67d52011-06-28 00:00:28 -0700538 try:
539 new_st = os.stat(target_file)
540 self.assertEqual(st.st_flags | stat.UF_IMMUTABLE, new_st.st_flags)
541 try:
542 fd = open(target_file, 'w+')
543 except IOError as e:
544 self.assertEqual(e.errno, errno.EPERM)
545 finally:
546 posix.chflags(target_file, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000547
Ned Deily3eb67d52011-06-28 00:00:28 -0700548 @unittest.skipUnless(hasattr(posix, 'chflags'), 'test needs os.chflags()')
549 def test_chflags(self):
550 self._test_chflags_regular_file(posix.chflags, support.TESTFN)
551
552 @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
553 def test_lchflags_regular_file(self):
554 self._test_chflags_regular_file(posix.lchflags, support.TESTFN)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700555 self._test_chflags_regular_file(posix.chflags, support.TESTFN, follow_symlinks=False)
Ned Deily3eb67d52011-06-28 00:00:28 -0700556
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
Larry Hastings9cf065c2012-06-22 16:30:09 -0700567 def chflags_nofollow(path, flags):
568 return posix.chflags(path, flags, follow_symlinks=False)
Ned Deily3eb67d52011-06-28 00:00:28 -0700569
Larry Hastings9cf065c2012-06-22 16:30:09 -0700570 for fn in (posix.lchflags, chflags_nofollow):
571 fn(_DUMMY_SYMLINK,
572 dummy_symlink_st.st_flags | stat.UF_IMMUTABLE)
573 try:
574 new_testfn_st = os.stat(support.TESTFN)
575 new_dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
576
577 self.assertEqual(testfn_st.st_flags, new_testfn_st.st_flags)
578 self.assertEqual(dummy_symlink_st.st_flags | stat.UF_IMMUTABLE,
579 new_dummy_symlink_st.st_flags)
580 finally:
581 fn(_DUMMY_SYMLINK, dummy_symlink_st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000582
Guido van Rossum98297ee2007-11-06 21:34:58 +0000583 def test_environ(self):
Victor Stinner17b490d2010-05-06 22:19:30 +0000584 if os.name == "nt":
585 item_type = str
586 else:
587 item_type = bytes
Guido van Rossum98297ee2007-11-06 21:34:58 +0000588 for k, v in posix.environ.items():
Victor Stinner17b490d2010-05-06 22:19:30 +0000589 self.assertEqual(type(k), item_type)
590 self.assertEqual(type(v), item_type)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000591
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000592 def test_getcwd_long_pathnames(self):
593 if hasattr(posix, 'getcwd'):
594 dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef'
595 curdir = os.getcwd()
596 base_path = os.path.abspath(support.TESTFN) + '.getcwd'
597
598 try:
599 os.mkdir(base_path)
600 os.chdir(base_path)
601 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000602# Just returning nothing instead of the SkipTest exception,
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000603# because the test results in Error in that case.
604# Is that ok?
Benjamin Petersone549ead2009-03-28 21:42:05 +0000605# raise unittest.SkipTest("cannot create directory for testing")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000606 return
607
608 def _create_and_do_getcwd(dirname, current_path_length = 0):
609 try:
610 os.mkdir(dirname)
611 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000612 raise unittest.SkipTest("mkdir cannot create directory sufficiently deep for getcwd test")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000613
614 os.chdir(dirname)
615 try:
616 os.getcwd()
617 if current_path_length < 1027:
618 _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
619 finally:
620 os.chdir('..')
621 os.rmdir(dirname)
622
623 _create_and_do_getcwd(dirname)
624
625 finally:
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000626 os.chdir(curdir)
R. David Murray414c91f2009-07-09 20:12:31 +0000627 support.rmtree(base_path)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000628
Ross Lagerwallb0ae53d2011-06-10 07:30:30 +0200629 @unittest.skipUnless(hasattr(posix, 'getgrouplist'), "test needs posix.getgrouplist()")
630 @unittest.skipUnless(hasattr(pwd, 'getpwuid'), "test needs pwd.getpwuid()")
631 @unittest.skipUnless(hasattr(os, 'getuid'), "test needs os.getuid()")
632 def test_getgrouplist(self):
633 with os.popen('id -G') as idg:
634 groups = idg.read().strip()
Charles-François Natalid59240d2012-05-02 20:04:40 +0200635 ret = idg.close()
Ross Lagerwallb0ae53d2011-06-10 07:30:30 +0200636
Charles-François Natali360b3c22012-05-02 20:50:13 +0200637 if ret != None or not groups:
Ross Lagerwallb0ae53d2011-06-10 07:30:30 +0200638 raise unittest.SkipTest("need working 'id -G'")
639
640 self.assertEqual(
641 set([int(x) for x in groups.split()]),
642 set(posix.getgrouplist(pwd.getpwuid(os.getuid())[0],
643 pwd.getpwuid(os.getuid())[3])))
644
Antoine Pitrou318b8f32011-01-12 18:45:27 +0000645 @unittest.skipUnless(hasattr(os, 'getegid'), "test needs os.getegid()")
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000646 def test_getgroups(self):
647 with os.popen('id -G') as idg:
648 groups = idg.read().strip()
Charles-François Natalie8a255a2012-05-02 20:01:38 +0200649 ret = idg.close()
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000650
Charles-François Natali39687ee2012-05-02 20:49:14 +0200651 if ret != None or not groups:
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000652 raise unittest.SkipTest("need working 'id -G'")
653
Ronald Oussoren7fb6f512010-08-01 19:18:13 +0000654 # 'id -G' and 'os.getgroups()' should return the same
655 # groups, ignoring order and duplicates.
Antoine Pitrou318b8f32011-01-12 18:45:27 +0000656 # #10822 - it is implementation defined whether posix.getgroups()
657 # includes the effective gid so we include it anyway, since id -G does
Ronald Oussorencb615e62010-07-24 14:15:19 +0000658 self.assertEqual(
Ronald Oussoren7fb6f512010-08-01 19:18:13 +0000659 set([int(x) for x in groups.split()]),
Antoine Pitrou318b8f32011-01-12 18:45:27 +0000660 set(posix.getgroups() + [posix.getegid()]))
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000661
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000662 # tests for the posix *at functions follow
663
Larry Hastings9cf065c2012-06-22 16:30:09 -0700664 @unittest.skipUnless(os.access in os.supports_dir_fd, "test needs dir_fd support for os.access()")
665 def test_access_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000666 f = posix.open(posix.getcwd(), posix.O_RDONLY)
667 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700668 self.assertTrue(posix.access(support.TESTFN, os.R_OK, dir_fd=f))
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000669 finally:
670 posix.close(f)
671
Larry Hastings9cf065c2012-06-22 16:30:09 -0700672 @unittest.skipUnless(os.chmod in os.supports_dir_fd, "test needs dir_fd support in os.chmod()")
673 def test_chmod_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000674 os.chmod(support.TESTFN, stat.S_IRUSR)
675
676 f = posix.open(posix.getcwd(), posix.O_RDONLY)
677 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700678 posix.chmod(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000679
680 s = posix.stat(support.TESTFN)
681 self.assertEqual(s[0] & stat.S_IRWXU, stat.S_IRUSR | stat.S_IWUSR)
682 finally:
683 posix.close(f)
684
Larry Hastings9cf065c2012-06-22 16:30:09 -0700685 @unittest.skipUnless(os.chown in os.supports_dir_fd, "test needs dir_fd support in os.chown()")
686 def test_chown_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000687 support.unlink(support.TESTFN)
Victor Stinnerbf816222011-06-30 23:25:47 +0200688 support.create_empty_file(support.TESTFN)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000689
690 f = posix.open(posix.getcwd(), posix.O_RDONLY)
691 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700692 posix.chown(support.TESTFN, os.getuid(), os.getgid(), dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000693 finally:
694 posix.close(f)
695
Larry Hastings9cf065c2012-06-22 16:30:09 -0700696 @unittest.skipUnless(os.stat in os.supports_dir_fd, "test needs dir_fd support in os.stat()")
697 def test_stat_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000698 support.unlink(support.TESTFN)
699 with open(support.TESTFN, 'w') as outfile:
700 outfile.write("testline\n")
701
702 f = posix.open(posix.getcwd(), posix.O_RDONLY)
703 try:
704 s1 = posix.stat(support.TESTFN)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700705 s2 = posix.stat(support.TESTFN, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000706 self.assertEqual(s1, s2)
707 finally:
708 posix.close(f)
709
Larry Hastings9cf065c2012-06-22 16:30:09 -0700710 @unittest.skipUnless(os.utime in os.supports_dir_fd, "test needs dir_fd support in os.utime()")
711 def test_utime_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000712 f = posix.open(posix.getcwd(), posix.O_RDONLY)
713 try:
714 now = time.time()
Larry Hastings9cf065c2012-06-22 16:30:09 -0700715 posix.utime(support.TESTFN, None, dir_fd=f)
716 posix.utime(support.TESTFN, dir_fd=f)
717 self.assertRaises(TypeError, posix.utime, support.TESTFN, now, dir_fd=f)
718 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None), dir_fd=f)
719 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None), dir_fd=f)
720 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now), dir_fd=f)
721 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, "x"), dir_fd=f)
722 posix.utime(support.TESTFN, (int(now), int(now)), dir_fd=f)
723 posix.utime(support.TESTFN, (now, now), dir_fd=f)
724 posix.utime(support.TESTFN,
725 (int(now), int((now - int(now)) * 1e9)), dir_fd=f)
726 posix.utime(support.TESTFN, dir_fd=f,
727 times=(int(now), int((now - int(now)) * 1e9)))
728
Larry Hastings90867a52012-06-22 17:01:41 -0700729 # try dir_fd and follow_symlinks together
Larry Hastings9cf065c2012-06-22 16:30:09 -0700730 if os.utime in os.supports_follow_symlinks:
Larry Hastings90867a52012-06-22 17:01:41 -0700731 try:
732 posix.utime(support.TESTFN, follow_symlinks=False, dir_fd=f)
Georg Brandl969288e2012-06-26 09:25:44 +0200733 except ValueError:
Larry Hastings90867a52012-06-22 17:01:41 -0700734 # whoops! using both together not supported on this platform.
735 pass
Larry Hastings9cf065c2012-06-22 16:30:09 -0700736
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000737 finally:
738 posix.close(f)
739
Larry Hastings9cf065c2012-06-22 16:30:09 -0700740 @unittest.skipUnless(os.link in os.supports_dir_fd, "test needs dir_fd support in os.link()")
741 def test_link_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000742 f = posix.open(posix.getcwd(), posix.O_RDONLY)
743 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700744 posix.link(support.TESTFN, support.TESTFN + 'link', src_dir_fd=f, dst_dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000745 # should have same inodes
746 self.assertEqual(posix.stat(support.TESTFN)[1],
747 posix.stat(support.TESTFN + 'link')[1])
748 finally:
749 posix.close(f)
750 support.unlink(support.TESTFN + 'link')
751
Larry Hastings9cf065c2012-06-22 16:30:09 -0700752 @unittest.skipUnless(os.mkdir in os.supports_dir_fd, "test needs dir_fd support in os.mkdir()")
753 def test_mkdir_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000754 f = posix.open(posix.getcwd(), posix.O_RDONLY)
755 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700756 posix.mkdir(support.TESTFN + 'dir', dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000757 posix.stat(support.TESTFN + 'dir') # should not raise exception
758 finally:
759 posix.close(f)
760 support.rmtree(support.TESTFN + 'dir')
761
Larry Hastings9cf065c2012-06-22 16:30:09 -0700762 @unittest.skipUnless((os.mknod in os.supports_dir_fd) and hasattr(stat, 'S_IFIFO'),
763 "test requires both stat.S_IFIFO and dir_fd support for os.mknod()")
764 def test_mknod_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000765 # Test using mknodat() to create a FIFO (the only use specified
766 # by POSIX).
767 support.unlink(support.TESTFN)
768 mode = stat.S_IFIFO | stat.S_IRUSR | stat.S_IWUSR
769 f = posix.open(posix.getcwd(), posix.O_RDONLY)
770 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700771 posix.mknod(support.TESTFN, mode, 0, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000772 except OSError as e:
773 # Some old systems don't allow unprivileged users to use
774 # mknod(), or only support creating device nodes.
775 self.assertIn(e.errno, (errno.EPERM, errno.EINVAL))
776 else:
777 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
778 finally:
779 posix.close(f)
780
Larry Hastings9cf065c2012-06-22 16:30:09 -0700781 @unittest.skipUnless(os.open in os.supports_dir_fd, "test needs dir_fd support in os.open()")
782 def test_open_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000783 support.unlink(support.TESTFN)
784 with open(support.TESTFN, 'w') as outfile:
785 outfile.write("testline\n")
786 a = posix.open(posix.getcwd(), posix.O_RDONLY)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700787 b = posix.open(support.TESTFN, posix.O_RDONLY, dir_fd=a)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000788 try:
789 res = posix.read(b, 9).decode(encoding="utf-8")
790 self.assertEqual("testline\n", res)
791 finally:
792 posix.close(a)
793 posix.close(b)
794
Larry Hastings9cf065c2012-06-22 16:30:09 -0700795 @unittest.skipUnless(os.readlink in os.supports_dir_fd, "test needs dir_fd support in os.readlink()")
796 def test_readlink_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000797 os.symlink(support.TESTFN, support.TESTFN + 'link')
798 f = posix.open(posix.getcwd(), posix.O_RDONLY)
799 try:
800 self.assertEqual(posix.readlink(support.TESTFN + 'link'),
Larry Hastings9cf065c2012-06-22 16:30:09 -0700801 posix.readlink(support.TESTFN + 'link', dir_fd=f))
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000802 finally:
803 support.unlink(support.TESTFN + 'link')
804 posix.close(f)
805
Larry Hastings9cf065c2012-06-22 16:30:09 -0700806 @unittest.skipUnless(os.rename in os.supports_dir_fd, "test needs dir_fd support in os.rename()")
807 def test_rename_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000808 support.unlink(support.TESTFN)
Victor Stinnerbf816222011-06-30 23:25:47 +0200809 support.create_empty_file(support.TESTFN + 'ren')
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000810 f = posix.open(posix.getcwd(), posix.O_RDONLY)
811 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700812 posix.rename(support.TESTFN + 'ren', support.TESTFN, src_dir_fd=f, dst_dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000813 except:
814 posix.rename(support.TESTFN + 'ren', support.TESTFN)
815 raise
816 else:
817 posix.stat(support.TESTFN) # should not throw exception
818 finally:
819 posix.close(f)
820
Larry Hastings9cf065c2012-06-22 16:30:09 -0700821 @unittest.skipUnless(os.symlink in os.supports_dir_fd, "test needs dir_fd support in os.symlink()")
822 def test_symlink_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000823 f = posix.open(posix.getcwd(), posix.O_RDONLY)
824 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700825 posix.symlink(support.TESTFN, support.TESTFN + 'link', dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000826 self.assertEqual(posix.readlink(support.TESTFN + 'link'), support.TESTFN)
827 finally:
828 posix.close(f)
829 support.unlink(support.TESTFN + 'link')
830
Larry Hastings9cf065c2012-06-22 16:30:09 -0700831 @unittest.skipUnless(os.unlink in os.supports_dir_fd, "test needs dir_fd support in os.unlink()")
832 def test_unlink_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000833 f = posix.open(posix.getcwd(), posix.O_RDONLY)
Victor Stinnerbf816222011-06-30 23:25:47 +0200834 support.create_empty_file(support.TESTFN + 'del')
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000835 posix.stat(support.TESTFN + 'del') # should not throw exception
836 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700837 posix.unlink(support.TESTFN + 'del', dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000838 except:
839 support.unlink(support.TESTFN + 'del')
840 raise
841 else:
842 self.assertRaises(OSError, posix.stat, support.TESTFN + 'link')
843 finally:
844 posix.close(f)
845
Larry Hastings9cf065c2012-06-22 16:30:09 -0700846 @unittest.skipUnless(os.mkfifo in os.supports_dir_fd, "test needs dir_fd support in os.mkfifo()")
847 def test_mkfifo_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000848 support.unlink(support.TESTFN)
849 f = posix.open(posix.getcwd(), posix.O_RDONLY)
850 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700851 posix.mkfifo(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000852 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
Jesus Cea60c13dd2012-06-23 02:58:14 +02001018 @unittest.skipUnless(hasattr(os, 'SEEK_HOLE'),
1019 "test needs an OS that reports file holes")
Jesus Cea2a193a82012-06-25 13:45:38 +02001020 @unittest.skipIf(sys.platform in ('freebsd7', 'freebsd8', 'freebsd9'),
Jesus Cea9d874862012-06-23 02:55:36 +02001021 "Skip test because known kernel bug - " \
1022 "http://lists.freebsd.org/pipermail/freebsd-amd64/2012-January/014332.html")
Hynek Schlawackf841e422012-06-24 09:51:46 +02001023 def test_fs_holes(self):
Jesus Cea94363612012-06-22 18:32:07 +02001024 # Even if the filesystem doesn't report holes,
1025 # if the OS supports it the SEEK_* constants
1026 # will be defined and will have a consistent
1027 # behaviour:
1028 # os.SEEK_DATA = current position
1029 # os.SEEK_HOLE = end of file position
Hynek Schlawackf841e422012-06-24 09:51:46 +02001030 with open(support.TESTFN, 'r+b') as fp:
Jesus Cea94363612012-06-22 18:32:07 +02001031 fp.write(b"hello")
1032 fp.flush()
1033 size = fp.tell()
1034 fno = fp.fileno()
Hynek Schlawackf841e422012-06-24 09:51:46 +02001035 for i in range(size):
Jesus Cea94363612012-06-22 18:32:07 +02001036 self.assertEqual(i, os.lseek(fno, i, os.SEEK_DATA))
1037 self.assertLessEqual(size, os.lseek(fno, i, os.SEEK_HOLE))
1038 self.assertRaises(OSError, os.lseek, fno, size, os.SEEK_DATA)
1039 self.assertRaises(OSError, os.lseek, fno, size, os.SEEK_HOLE)
1040
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001041class PosixGroupsTester(unittest.TestCase):
1042
1043 def setUp(self):
1044 if posix.getuid() != 0:
1045 raise unittest.SkipTest("not enough privileges")
1046 if not hasattr(posix, 'getgroups'):
1047 raise unittest.SkipTest("need posix.getgroups")
1048 if sys.platform == 'darwin':
1049 raise unittest.SkipTest("getgroups(2) is broken on OSX")
1050 self.saved_groups = posix.getgroups()
1051
1052 def tearDown(self):
1053 if hasattr(posix, 'setgroups'):
1054 posix.setgroups(self.saved_groups)
1055 elif hasattr(posix, 'initgroups'):
1056 name = pwd.getpwuid(posix.getuid()).pw_name
1057 posix.initgroups(name, self.saved_groups[0])
1058
1059 @unittest.skipUnless(hasattr(posix, 'initgroups'),
1060 "test needs posix.initgroups()")
1061 def test_initgroups(self):
1062 # find missing group
1063
Antoine Pitroue5a91012010-09-04 17:32:06 +00001064 g = max(self.saved_groups) + 1
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001065 name = pwd.getpwuid(posix.getuid()).pw_name
1066 posix.initgroups(name, g)
1067 self.assertIn(g, posix.getgroups())
1068
1069 @unittest.skipUnless(hasattr(posix, 'setgroups'),
1070 "test needs posix.setgroups()")
1071 def test_setgroups(self):
Antoine Pitroue5a91012010-09-04 17:32:06 +00001072 for groups in [[0], list(range(16))]:
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001073 posix.setgroups(groups)
1074 self.assertListEqual(groups, posix.getgroups())
1075
Neal Norwitze241ce82003-02-17 18:17:05 +00001076def test_main():
Antoine Pitrou68c95922011-03-20 17:33:57 +01001077 try:
1078 support.run_unittest(PosixTester, PosixGroupsTester)
1079 finally:
1080 support.reap_children()
Neal Norwitze241ce82003-02-17 18:17:05 +00001081
1082if __name__ == '__main__':
1083 test_main()