blob: 029d0815e9458984cc8a078db010b3411bd9a6e3 [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
Xavier de Gaye3a4e9892016-12-13 10:00:01 +01004android_not_root = support.android_not_root
R. David Murrayeb3615d2009-04-22 02:24:39 +00005
6# Skip these tests if there is no posix module.
7posix = support.import_module('posix')
Neal Norwitze241ce82003-02-17 18:17:05 +00008
Antoine Pitroub7572f02009-12-02 20:46:48 +00009import errno
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +000010import sys
Neal Norwitze241ce82003-02-17 18:17:05 +000011import time
12import os
Charles-François Nataliab2d58e2012-04-17 19:48:35 +020013import platform
Christian Heimesd5e2b6f2008-03-19 21:50:51 +000014import pwd
Benjamin Peterson052a02b2010-08-17 01:27:09 +000015import stat
Ned Deilyba2eab22011-07-26 13:53:55 -070016import tempfile
Neal Norwitze241ce82003-02-17 18:17:05 +000017import unittest
18import warnings
R. David Murraya21e4ca2009-03-31 23:16:50 +000019
Ned Deilyba2eab22011-07-26 13:53:55 -070020_DUMMY_SYMLINK = os.path.join(tempfile.gettempdir(),
21 support.TESTFN + '-dummy-symlink')
Neal Norwitze241ce82003-02-17 18:17:05 +000022
23class PosixTester(unittest.TestCase):
24
25 def setUp(self):
26 # create empty file
Benjamin Petersonee8712c2008-05-20 21:35:26 +000027 fp = open(support.TESTFN, 'w+')
Neal Norwitze241ce82003-02-17 18:17:05 +000028 fp.close()
Ned Deily3eb67d52011-06-28 00:00:28 -070029 self.teardown_files = [ support.TESTFN ]
Brett Cannonc8d502e2010-03-20 21:53:28 +000030 self._warnings_manager = support.check_warnings()
31 self._warnings_manager.__enter__()
32 warnings.filterwarnings('ignore', '.* potential security risk .*',
33 RuntimeWarning)
Neal Norwitze241ce82003-02-17 18:17:05 +000034
35 def tearDown(self):
Ned Deily3eb67d52011-06-28 00:00:28 -070036 for teardown_file in self.teardown_files:
37 support.unlink(teardown_file)
Brett Cannonc8d502e2010-03-20 21:53:28 +000038 self._warnings_manager.__exit__(None, None, None)
Neal Norwitze241ce82003-02-17 18:17:05 +000039
40 def testNoArgFunctions(self):
41 # test posix functions which take no arguments and have
42 # no side-effects which we need to cleanup (e.g., fork, wait, abort)
Guido van Rossumf0af3e32008-10-02 18:55:37 +000043 NO_ARG_FUNCTIONS = [ "ctermid", "getcwd", "getcwdb", "uname",
Guido van Rossum687b9c02007-10-25 23:18:51 +000044 "times", "getloadavg",
Neal Norwitze241ce82003-02-17 18:17:05 +000045 "getegid", "geteuid", "getgid", "getgroups",
Ross Lagerwall7807c352011-03-17 20:20:30 +020046 "getpid", "getpgrp", "getppid", "getuid", "sync",
Neal Norwitze241ce82003-02-17 18:17:05 +000047 ]
Neal Norwitz71b13e82003-02-23 22:12:24 +000048
Neal Norwitze241ce82003-02-17 18:17:05 +000049 for name in NO_ARG_FUNCTIONS:
50 posix_func = getattr(posix, name, None)
51 if posix_func is not None:
52 posix_func()
Neal Norwitz2ff51a82003-02-17 22:40:31 +000053 self.assertRaises(TypeError, posix_func, 1)
Neal Norwitze241ce82003-02-17 18:17:05 +000054
Serhiy Storchaka43767632013-11-03 21:31:38 +020055 @unittest.skipUnless(hasattr(posix, 'getresuid'),
56 'test needs posix.getresuid()')
57 def test_getresuid(self):
58 user_ids = posix.getresuid()
59 self.assertEqual(len(user_ids), 3)
60 for val in user_ids:
61 self.assertGreaterEqual(val, 0)
Martin v. Löwis7aed61a2009-11-27 14:09:49 +000062
Serhiy Storchaka43767632013-11-03 21:31:38 +020063 @unittest.skipUnless(hasattr(posix, 'getresgid'),
64 'test needs posix.getresgid()')
65 def test_getresgid(self):
66 group_ids = posix.getresgid()
67 self.assertEqual(len(group_ids), 3)
68 for val in group_ids:
69 self.assertGreaterEqual(val, 0)
Martin v. Löwis7aed61a2009-11-27 14:09:49 +000070
Serhiy Storchaka43767632013-11-03 21:31:38 +020071 @unittest.skipUnless(hasattr(posix, 'setresuid'),
72 'test needs posix.setresuid()')
73 def test_setresuid(self):
74 current_user_ids = posix.getresuid()
75 self.assertIsNone(posix.setresuid(*current_user_ids))
76 # -1 means don't change that value.
77 self.assertIsNone(posix.setresuid(-1, -1, -1))
Martin v. Löwis7aed61a2009-11-27 14:09:49 +000078
Serhiy Storchaka43767632013-11-03 21:31:38 +020079 @unittest.skipUnless(hasattr(posix, 'setresuid'),
80 'test needs posix.setresuid()')
81 def test_setresuid_exception(self):
82 # Don't do this test if someone is silly enough to run us as root.
83 current_user_ids = posix.getresuid()
84 if 0 not in current_user_ids:
85 new_user_ids = (current_user_ids[0]+1, -1, -1)
86 self.assertRaises(OSError, posix.setresuid, *new_user_ids)
Martin v. Löwis7aed61a2009-11-27 14:09:49 +000087
Serhiy Storchaka43767632013-11-03 21:31:38 +020088 @unittest.skipUnless(hasattr(posix, 'setresgid'),
89 'test needs posix.setresgid()')
90 def test_setresgid(self):
91 current_group_ids = posix.getresgid()
92 self.assertIsNone(posix.setresgid(*current_group_ids))
93 # -1 means don't change that value.
94 self.assertIsNone(posix.setresgid(-1, -1, -1))
Martin v. Löwis7aed61a2009-11-27 14:09:49 +000095
Serhiy Storchaka43767632013-11-03 21:31:38 +020096 @unittest.skipUnless(hasattr(posix, 'setresgid'),
97 'test needs posix.setresgid()')
98 def test_setresgid_exception(self):
99 # Don't do this test if someone is silly enough to run us as root.
100 current_group_ids = posix.getresgid()
101 if 0 not in current_group_ids:
102 new_group_ids = (current_group_ids[0]+1, -1, -1)
103 self.assertRaises(OSError, posix.setresgid, *new_group_ids)
Martin v. Löwis7aed61a2009-11-27 14:09:49 +0000104
Antoine Pitroub7572f02009-12-02 20:46:48 +0000105 @unittest.skipUnless(hasattr(posix, 'initgroups'),
106 "test needs os.initgroups()")
107 def test_initgroups(self):
108 # It takes a string and an integer; check that it raises a TypeError
109 # for other argument lists.
110 self.assertRaises(TypeError, posix.initgroups)
111 self.assertRaises(TypeError, posix.initgroups, None)
112 self.assertRaises(TypeError, posix.initgroups, 3, "foo")
113 self.assertRaises(TypeError, posix.initgroups, "foo", 3, object())
114
115 # If a non-privileged user invokes it, it should fail with OSError
116 # EPERM.
117 if os.getuid() != 0:
Charles-François Natalie8a255a2012-05-02 20:01:38 +0200118 try:
119 name = pwd.getpwuid(posix.getuid()).pw_name
120 except KeyError:
121 # the current UID may not have a pwd entry
122 raise unittest.SkipTest("need a pwd entry")
Antoine Pitroub7572f02009-12-02 20:46:48 +0000123 try:
124 posix.initgroups(name, 13)
125 except OSError as e:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000126 self.assertEqual(e.errno, errno.EPERM)
Antoine Pitroub7572f02009-12-02 20:46:48 +0000127 else:
128 self.fail("Expected OSError to be raised by initgroups")
129
Serhiy Storchaka43767632013-11-03 21:31:38 +0200130 @unittest.skipUnless(hasattr(posix, 'statvfs'),
131 'test needs posix.statvfs()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000132 def test_statvfs(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200133 self.assertTrue(posix.statvfs(os.curdir))
Neal Norwitze241ce82003-02-17 18:17:05 +0000134
Serhiy Storchaka43767632013-11-03 21:31:38 +0200135 @unittest.skipUnless(hasattr(posix, 'fstatvfs'),
136 'test needs posix.fstatvfs()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000137 def test_fstatvfs(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200138 fp = open(support.TESTFN)
139 try:
140 self.assertTrue(posix.fstatvfs(fp.fileno()))
141 self.assertTrue(posix.statvfs(fp.fileno()))
142 finally:
143 fp.close()
Neal Norwitze241ce82003-02-17 18:17:05 +0000144
Serhiy Storchaka43767632013-11-03 21:31:38 +0200145 @unittest.skipUnless(hasattr(posix, 'ftruncate'),
146 'test needs posix.ftruncate()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000147 def test_ftruncate(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200148 fp = open(support.TESTFN, 'w+')
149 try:
150 # we need to have some data to truncate
151 fp.write('test')
152 fp.flush()
153 posix.ftruncate(fp.fileno(), 0)
154 finally:
155 fp.close()
Neal Norwitze241ce82003-02-17 18:17:05 +0000156
Ross Lagerwall7807c352011-03-17 20:20:30 +0200157 @unittest.skipUnless(hasattr(posix, 'truncate'), "test needs posix.truncate()")
158 def test_truncate(self):
159 with open(support.TESTFN, 'w') as fp:
160 fp.write('test')
161 fp.flush()
162 posix.truncate(support.TESTFN, 0)
163
Larry Hastings9cf065c2012-06-22 16:30:09 -0700164 @unittest.skipUnless(getattr(os, 'execve', None) in os.supports_fd, "test needs execve() to support the fd parameter")
Ross Lagerwall7807c352011-03-17 20:20:30 +0200165 @unittest.skipUnless(hasattr(os, 'fork'), "test needs os.fork()")
Ross Lagerwalldedf6cf2011-03-20 18:27:05 +0200166 @unittest.skipUnless(hasattr(os, 'waitpid'), "test needs os.waitpid()")
Ross Lagerwall7807c352011-03-17 20:20:30 +0200167 def test_fexecve(self):
168 fp = os.open(sys.executable, os.O_RDONLY)
169 try:
170 pid = os.fork()
171 if pid == 0:
172 os.chdir(os.path.split(sys.executable)[0])
Larry Hastings9cf065c2012-06-22 16:30:09 -0700173 posix.execve(fp, [sys.executable, '-c', 'pass'], os.environ)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200174 else:
Ross Lagerwalldedf6cf2011-03-20 18:27:05 +0200175 self.assertEqual(os.waitpid(pid, 0), (pid, 0))
Ross Lagerwall7807c352011-03-17 20:20:30 +0200176 finally:
177 os.close(fp)
178
179 @unittest.skipUnless(hasattr(posix, 'waitid'), "test needs posix.waitid()")
180 @unittest.skipUnless(hasattr(os, 'fork'), "test needs os.fork()")
181 def test_waitid(self):
182 pid = os.fork()
183 if pid == 0:
184 os.chdir(os.path.split(sys.executable)[0])
185 posix.execve(sys.executable, [sys.executable, '-c', 'pass'], os.environ)
186 else:
187 res = posix.waitid(posix.P_PID, pid, posix.WEXITED)
188 self.assertEqual(pid, res.si_pid)
189
190 @unittest.skipUnless(hasattr(posix, 'lockf'), "test needs posix.lockf()")
191 def test_lockf(self):
192 fd = os.open(support.TESTFN, os.O_WRONLY | os.O_CREAT)
193 try:
194 os.write(fd, b'test')
195 os.lseek(fd, 0, os.SEEK_SET)
196 posix.lockf(fd, posix.F_LOCK, 4)
197 # section is locked
198 posix.lockf(fd, posix.F_ULOCK, 4)
199 finally:
200 os.close(fd)
201
202 @unittest.skipUnless(hasattr(posix, 'pread'), "test needs posix.pread()")
203 def test_pread(self):
204 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
205 try:
206 os.write(fd, b'test')
207 os.lseek(fd, 0, os.SEEK_SET)
208 self.assertEqual(b'es', posix.pread(fd, 2, 1))
Florent Xiclunae41f0de2011-11-11 19:39:25 +0100209 # the first pread() shouldn't disturb the file offset
Ross Lagerwall7807c352011-03-17 20:20:30 +0200210 self.assertEqual(b'te', posix.read(fd, 2))
211 finally:
212 os.close(fd)
213
214 @unittest.skipUnless(hasattr(posix, 'pwrite'), "test needs posix.pwrite()")
215 def test_pwrite(self):
216 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
217 try:
218 os.write(fd, b'test')
219 os.lseek(fd, 0, os.SEEK_SET)
220 posix.pwrite(fd, b'xx', 1)
221 self.assertEqual(b'txxt', posix.read(fd, 4))
222 finally:
223 os.close(fd)
224
225 @unittest.skipUnless(hasattr(posix, 'posix_fallocate'),
226 "test needs posix.posix_fallocate()")
227 def test_posix_fallocate(self):
228 fd = os.open(support.TESTFN, os.O_WRONLY | os.O_CREAT)
229 try:
230 posix.posix_fallocate(fd, 0, 10)
231 except OSError as inst:
232 # issue10812, ZFS doesn't appear to support posix_fallocate,
233 # so skip Solaris-based since they are likely to have ZFS.
234 if inst.errno != errno.EINVAL or not sys.platform.startswith("sunos"):
235 raise
236 finally:
237 os.close(fd)
238
239 @unittest.skipUnless(hasattr(posix, 'posix_fadvise'),
240 "test needs posix.posix_fadvise()")
241 def test_posix_fadvise(self):
242 fd = os.open(support.TESTFN, os.O_RDONLY)
243 try:
244 posix.posix_fadvise(fd, 0, 0, posix.POSIX_FADV_WILLNEED)
245 finally:
246 os.close(fd)
247
Larry Hastings9cf065c2012-06-22 16:30:09 -0700248 @unittest.skipUnless(os.utime in os.supports_fd, "test needs fd support in os.utime")
249 def test_utime_with_fd(self):
Ross Lagerwall7807c352011-03-17 20:20:30 +0200250 now = time.time()
251 fd = os.open(support.TESTFN, os.O_RDONLY)
252 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700253 posix.utime(fd)
254 posix.utime(fd, None)
255 self.assertRaises(TypeError, posix.utime, fd, (None, None))
256 self.assertRaises(TypeError, posix.utime, fd, (now, None))
257 self.assertRaises(TypeError, posix.utime, fd, (None, now))
258 posix.utime(fd, (int(now), int(now)))
259 posix.utime(fd, (now, now))
260 self.assertRaises(ValueError, posix.utime, fd, (now, now), ns=(now, now))
261 self.assertRaises(ValueError, posix.utime, fd, (now, 0), ns=(None, None))
262 self.assertRaises(ValueError, posix.utime, fd, (None, None), ns=(now, 0))
263 posix.utime(fd, (int(now), int((now - int(now)) * 1e9)))
264 posix.utime(fd, ns=(int(now), int((now - int(now)) * 1e9)))
265
Ross Lagerwall7807c352011-03-17 20:20:30 +0200266 finally:
267 os.close(fd)
268
Larry Hastings9cf065c2012-06-22 16:30:09 -0700269 @unittest.skipUnless(os.utime in os.supports_follow_symlinks, "test needs follow_symlinks support in os.utime")
270 def test_utime_nofollow_symlinks(self):
Ross Lagerwall7807c352011-03-17 20:20:30 +0200271 now = time.time()
Larry Hastings9cf065c2012-06-22 16:30:09 -0700272 posix.utime(support.TESTFN, None, follow_symlinks=False)
273 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None), follow_symlinks=False)
274 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None), follow_symlinks=False)
275 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now), follow_symlinks=False)
276 posix.utime(support.TESTFN, (int(now), int(now)), follow_symlinks=False)
277 posix.utime(support.TESTFN, (now, now), follow_symlinks=False)
278 posix.utime(support.TESTFN, follow_symlinks=False)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200279
280 @unittest.skipUnless(hasattr(posix, 'writev'), "test needs posix.writev()")
281 def test_writev(self):
282 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
283 try:
Victor Stinner57ddf782014-01-08 15:21:28 +0100284 n = os.writev(fd, (b'test1', b'tt2', b't3'))
285 self.assertEqual(n, 10)
286
Ross Lagerwall7807c352011-03-17 20:20:30 +0200287 os.lseek(fd, 0, os.SEEK_SET)
288 self.assertEqual(b'test1tt2t3', posix.read(fd, 10))
Victor Stinner57ddf782014-01-08 15:21:28 +0100289
290 # Issue #20113: empty list of buffers should not crash
Victor Stinnercd5ca6a2014-01-08 16:01:31 +0100291 try:
292 size = posix.writev(fd, [])
293 except OSError:
294 # writev(fd, []) raises OSError(22, "Invalid argument")
295 # on OpenIndiana
296 pass
297 else:
298 self.assertEqual(size, 0)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200299 finally:
300 os.close(fd)
301
302 @unittest.skipUnless(hasattr(posix, 'readv'), "test needs posix.readv()")
303 def test_readv(self):
304 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
305 try:
306 os.write(fd, b'test1tt2t3')
307 os.lseek(fd, 0, os.SEEK_SET)
308 buf = [bytearray(i) for i in [5, 3, 2]]
309 self.assertEqual(posix.readv(fd, buf), 10)
310 self.assertEqual([b'test1', b'tt2', b't3'], [bytes(i) for i in buf])
Victor Stinner57ddf782014-01-08 15:21:28 +0100311
312 # Issue #20113: empty list of buffers should not crash
Victor Stinnercd5ca6a2014-01-08 16:01:31 +0100313 try:
314 size = posix.readv(fd, [])
315 except OSError:
316 # readv(fd, []) raises OSError(22, "Invalid argument")
317 # on OpenIndiana
318 pass
319 else:
320 self.assertEqual(size, 0)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200321 finally:
322 os.close(fd)
323
Serhiy Storchaka43767632013-11-03 21:31:38 +0200324 @unittest.skipUnless(hasattr(posix, 'dup'),
325 'test needs posix.dup()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000326 def test_dup(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200327 fp = open(support.TESTFN)
328 try:
329 fd = posix.dup(fp.fileno())
330 self.assertIsInstance(fd, int)
331 os.close(fd)
332 finally:
333 fp.close()
Neal Norwitze241ce82003-02-17 18:17:05 +0000334
Serhiy Storchaka43767632013-11-03 21:31:38 +0200335 @unittest.skipUnless(hasattr(posix, 'confstr'),
336 'test needs posix.confstr()')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000337 def test_confstr(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200338 self.assertRaises(ValueError, posix.confstr, "CS_garbage")
339 self.assertEqual(len(posix.confstr("CS_PATH")) > 0, True)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000340
Serhiy Storchaka43767632013-11-03 21:31:38 +0200341 @unittest.skipUnless(hasattr(posix, 'dup2'),
342 'test needs posix.dup2()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000343 def test_dup2(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200344 fp1 = open(support.TESTFN)
345 fp2 = open(support.TESTFN)
346 try:
347 posix.dup2(fp1.fileno(), fp2.fileno())
348 finally:
349 fp1.close()
350 fp2.close()
Neal Norwitze241ce82003-02-17 18:17:05 +0000351
Charles-François Natali1e045b12011-05-22 20:42:32 +0200352 @unittest.skipUnless(hasattr(os, 'O_CLOEXEC'), "needs os.O_CLOEXEC")
Charles-François Natali239bb962011-06-03 12:55:15 +0200353 @support.requires_linux_version(2, 6, 23)
Charles-François Natali1e045b12011-05-22 20:42:32 +0200354 def test_oscloexec(self):
355 fd = os.open(support.TESTFN, os.O_RDONLY|os.O_CLOEXEC)
356 self.addCleanup(os.close, fd)
Victor Stinner1db9e7b2014-07-29 22:32:47 +0200357 self.assertFalse(os.get_inheritable(fd))
Charles-François Natali1e045b12011-05-22 20:42:32 +0200358
Serhiy Storchaka43767632013-11-03 21:31:38 +0200359 @unittest.skipUnless(hasattr(posix, 'O_EXLOCK'),
360 'test needs posix.O_EXLOCK')
Skip Montanaro98470002005-06-17 01:14:49 +0000361 def test_osexlock(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200362 fd = os.open(support.TESTFN,
363 os.O_WRONLY|os.O_EXLOCK|os.O_CREAT)
364 self.assertRaises(OSError, os.open, support.TESTFN,
365 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
366 os.close(fd)
367
368 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000369 fd = os.open(support.TESTFN,
Serhiy Storchaka43767632013-11-03 21:31:38 +0200370 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000371 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000372 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
373 os.close(fd)
374
Serhiy Storchaka43767632013-11-03 21:31:38 +0200375 @unittest.skipUnless(hasattr(posix, 'O_SHLOCK'),
376 'test needs posix.O_SHLOCK')
Skip Montanaro98470002005-06-17 01:14:49 +0000377 def test_osshlock(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200378 fd1 = os.open(support.TESTFN,
379 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
380 fd2 = os.open(support.TESTFN,
381 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
382 os.close(fd2)
383 os.close(fd1)
384
385 if hasattr(posix, "O_EXLOCK"):
386 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000387 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Serhiy Storchaka43767632013-11-03 21:31:38 +0200388 self.assertRaises(OSError, os.open, support.TESTFN,
389 os.O_RDONLY|os.O_EXLOCK|os.O_NONBLOCK)
390 os.close(fd)
Skip Montanaro98470002005-06-17 01:14:49 +0000391
Serhiy Storchaka43767632013-11-03 21:31:38 +0200392 @unittest.skipUnless(hasattr(posix, 'fstat'),
393 'test needs posix.fstat()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000394 def test_fstat(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200395 fp = open(support.TESTFN)
396 try:
397 self.assertTrue(posix.fstat(fp.fileno()))
398 self.assertTrue(posix.stat(fp.fileno()))
Serhiy Storchakaa2ad5c32013-01-07 23:13:46 +0200399
Serhiy Storchaka43767632013-11-03 21:31:38 +0200400 self.assertRaisesRegex(TypeError,
Brett Cannon3f9183b2016-08-26 14:44:48 -0700401 'should be string, bytes, os.PathLike or integer, not',
Serhiy Storchaka43767632013-11-03 21:31:38 +0200402 posix.stat, float(fp.fileno()))
403 finally:
404 fp.close()
Neal Norwitze241ce82003-02-17 18:17:05 +0000405
Serhiy Storchaka43767632013-11-03 21:31:38 +0200406 @unittest.skipUnless(hasattr(posix, 'stat'),
407 'test needs posix.stat()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000408 def test_stat(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200409 self.assertTrue(posix.stat(support.TESTFN))
410 self.assertTrue(posix.stat(os.fsencode(support.TESTFN)))
Serhiy Storchakaa2ad5c32013-01-07 23:13:46 +0200411
Serhiy Storchakad73c3182016-08-06 23:22:08 +0300412 self.assertWarnsRegex(DeprecationWarning,
Brett Cannon3f9183b2016-08-26 14:44:48 -0700413 'should be string, bytes, os.PathLike or integer, not',
Serhiy Storchakad73c3182016-08-06 23:22:08 +0300414 posix.stat, bytearray(os.fsencode(support.TESTFN)))
Serhiy Storchaka43767632013-11-03 21:31:38 +0200415 self.assertRaisesRegex(TypeError,
Brett Cannon3f9183b2016-08-26 14:44:48 -0700416 'should be string, bytes, os.PathLike or integer, not',
Serhiy Storchaka43767632013-11-03 21:31:38 +0200417 posix.stat, None)
418 self.assertRaisesRegex(TypeError,
Brett Cannon3f9183b2016-08-26 14:44:48 -0700419 'should be string, bytes, os.PathLike or integer, not',
Serhiy Storchaka43767632013-11-03 21:31:38 +0200420 posix.stat, list(support.TESTFN))
421 self.assertRaisesRegex(TypeError,
Brett Cannon3f9183b2016-08-26 14:44:48 -0700422 'should be string, bytes, os.PathLike or integer, not',
Serhiy Storchaka43767632013-11-03 21:31:38 +0200423 posix.stat, list(os.fsencode(support.TESTFN)))
Neal Norwitze241ce82003-02-17 18:17:05 +0000424
Benjamin Peterson052a02b2010-08-17 01:27:09 +0000425 @unittest.skipUnless(hasattr(posix, 'mkfifo'), "don't have mkfifo()")
Xavier de Gaye3a4e9892016-12-13 10:00:01 +0100426 @unittest.skipIf(android_not_root, "mkfifo not allowed, non root user")
Benjamin Peterson052a02b2010-08-17 01:27:09 +0000427 def test_mkfifo(self):
428 support.unlink(support.TESTFN)
429 posix.mkfifo(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR)
430 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
431
432 @unittest.skipUnless(hasattr(posix, 'mknod') and hasattr(stat, 'S_IFIFO'),
433 "don't have mknod()/S_IFIFO")
Xavier de Gaye3a4e9892016-12-13 10:00:01 +0100434 @unittest.skipIf(android_not_root, "mknod not allowed, non root user")
Benjamin Peterson052a02b2010-08-17 01:27:09 +0000435 def test_mknod(self):
436 # Test using mknod() to create a FIFO (the only use specified
437 # by POSIX).
438 support.unlink(support.TESTFN)
439 mode = stat.S_IFIFO | stat.S_IRUSR | stat.S_IWUSR
440 try:
441 posix.mknod(support.TESTFN, mode, 0)
442 except OSError as e:
443 # Some old systems don't allow unprivileged users to use
444 # mknod(), or only support creating device nodes.
445 self.assertIn(e.errno, (errno.EPERM, errno.EINVAL))
446 else:
447 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
448
Martin Panterbf19d162015-09-09 01:01:13 +0000449 # Keyword arguments are also supported
450 support.unlink(support.TESTFN)
451 try:
452 posix.mknod(path=support.TESTFN, mode=mode, device=0,
453 dir_fd=None)
454 except OSError as e:
455 self.assertIn(e.errno, (errno.EPERM, errno.EINVAL))
456
Serhiy Storchaka16b2e4f2015-04-20 09:22:13 +0300457 @unittest.skipUnless(hasattr(posix, 'stat'), 'test needs posix.stat()')
458 @unittest.skipUnless(hasattr(posix, 'makedev'), 'test needs posix.makedev()')
459 def test_makedev(self):
460 st = posix.stat(support.TESTFN)
461 dev = st.st_dev
462 self.assertIsInstance(dev, int)
463 self.assertGreaterEqual(dev, 0)
464
465 major = posix.major(dev)
466 self.assertIsInstance(major, int)
467 self.assertGreaterEqual(major, 0)
468 self.assertEqual(posix.major(dev), major)
469 self.assertRaises(TypeError, posix.major, float(dev))
470 self.assertRaises(TypeError, posix.major)
471 self.assertRaises((ValueError, OverflowError), posix.major, -1)
472
473 minor = posix.minor(dev)
474 self.assertIsInstance(minor, int)
475 self.assertGreaterEqual(minor, 0)
476 self.assertEqual(posix.minor(dev), minor)
477 self.assertRaises(TypeError, posix.minor, float(dev))
478 self.assertRaises(TypeError, posix.minor)
479 self.assertRaises((ValueError, OverflowError), posix.minor, -1)
480
481 self.assertEqual(posix.makedev(major, minor), dev)
482 self.assertRaises(TypeError, posix.makedev, float(major), minor)
483 self.assertRaises(TypeError, posix.makedev, major, float(minor))
484 self.assertRaises(TypeError, posix.makedev, major)
485 self.assertRaises(TypeError, posix.makedev)
486
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200487 def _test_all_chown_common(self, chown_func, first_param, stat_func):
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000488 """Common code for chown, fchown and lchown tests."""
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200489 def check_stat(uid, gid):
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200490 if stat_func is not None:
491 stat = stat_func(first_param)
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200492 self.assertEqual(stat.st_uid, uid)
493 self.assertEqual(stat.st_gid, gid)
494 uid = os.getuid()
495 gid = os.getgid()
Charles-François Nataliab2d58e2012-04-17 19:48:35 +0200496 # test a successful chown call
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200497 chown_func(first_param, uid, gid)
498 check_stat(uid, gid)
499 chown_func(first_param, -1, gid)
500 check_stat(uid, gid)
501 chown_func(first_param, uid, -1)
502 check_stat(uid, gid)
Charles-François Nataliab2d58e2012-04-17 19:48:35 +0200503
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200504 if uid == 0:
505 # Try an amusingly large uid/gid to make sure we handle
506 # large unsigned values. (chown lets you use any
507 # uid/gid you like, even if they aren't defined.)
508 #
509 # This problem keeps coming up:
510 # http://bugs.python.org/issue1747858
511 # http://bugs.python.org/issue4591
512 # http://bugs.python.org/issue15301
513 # Hopefully the fix in 4591 fixes it for good!
514 #
515 # This part of the test only runs when run as root.
516 # Only scary people run their tests as root.
517
518 big_value = 2**31
519 chown_func(first_param, big_value, big_value)
520 check_stat(big_value, big_value)
521 chown_func(first_param, -1, -1)
522 check_stat(big_value, big_value)
523 chown_func(first_param, uid, gid)
524 check_stat(uid, gid)
Charles-François Nataliab2d58e2012-04-17 19:48:35 +0200525 elif platform.system() in ('HP-UX', 'SunOS'):
526 # HP-UX and Solaris can allow a non-root user to chown() to root
527 # (issue #5113)
528 raise unittest.SkipTest("Skipping because of non-standard chown() "
529 "behavior")
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000530 else:
531 # non-root cannot chown to root, raises OSError
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200532 self.assertRaises(OSError, chown_func, first_param, 0, 0)
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200533 check_stat(uid, gid)
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200534 self.assertRaises(OSError, chown_func, first_param, 0, -1)
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200535 check_stat(uid, gid)
Serhiy Storchakaa2964b32013-02-21 14:34:36 +0200536 if 0 not in os.getgroups():
Serhiy Storchakab3d62ce2013-02-20 19:48:22 +0200537 self.assertRaises(OSError, chown_func, first_param, -1, 0)
538 check_stat(uid, gid)
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200539 # test illegal types
540 for t in str, float:
541 self.assertRaises(TypeError, chown_func, first_param, t(uid), gid)
542 check_stat(uid, gid)
543 self.assertRaises(TypeError, chown_func, first_param, uid, t(gid))
544 check_stat(uid, gid)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000545
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000546 @unittest.skipUnless(hasattr(posix, 'chown'), "test needs os.chown()")
547 def test_chown(self):
548 # raise an OSError if the file does not exist
549 os.unlink(support.TESTFN)
550 self.assertRaises(OSError, posix.chown, support.TESTFN, -1, -1)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000551
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000552 # re-create the file
Victor Stinnerbf816222011-06-30 23:25:47 +0200553 support.create_empty_file(support.TESTFN)
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200554 self._test_all_chown_common(posix.chown, support.TESTFN,
555 getattr(posix, 'stat', None))
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000556
557 @unittest.skipUnless(hasattr(posix, 'fchown'), "test needs os.fchown()")
558 def test_fchown(self):
559 os.unlink(support.TESTFN)
560
561 # re-create the file
562 test_file = open(support.TESTFN, 'w')
563 try:
564 fd = test_file.fileno()
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200565 self._test_all_chown_common(posix.fchown, fd,
566 getattr(posix, 'fstat', None))
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000567 finally:
568 test_file.close()
569
570 @unittest.skipUnless(hasattr(posix, 'lchown'), "test needs os.lchown()")
571 def test_lchown(self):
572 os.unlink(support.TESTFN)
573 # create a symlink
Ned Deily3eb67d52011-06-28 00:00:28 -0700574 os.symlink(_DUMMY_SYMLINK, support.TESTFN)
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200575 self._test_all_chown_common(posix.lchown, support.TESTFN,
576 getattr(posix, 'lstat', None))
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000577
Serhiy Storchaka43767632013-11-03 21:31:38 +0200578 @unittest.skipUnless(hasattr(posix, 'chdir'), 'test needs posix.chdir()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000579 def test_chdir(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200580 posix.chdir(os.curdir)
581 self.assertRaises(OSError, posix.chdir, support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000582
Martin v. Löwisc9e1c7d2010-07-23 12:16:41 +0000583 def test_listdir(self):
Larry Hastingsfdaea062012-06-25 04:42:23 -0700584 self.assertTrue(support.TESTFN in posix.listdir(os.curdir))
Martin v. Löwisc9e1c7d2010-07-23 12:16:41 +0000585
586 def test_listdir_default(self):
Larry Hastingsfdaea062012-06-25 04:42:23 -0700587 # When listdir is called without argument,
588 # it's the same as listdir(os.curdir).
589 self.assertTrue(support.TESTFN in posix.listdir())
Neal Norwitze241ce82003-02-17 18:17:05 +0000590
Larry Hastingsfdaea062012-06-25 04:42:23 -0700591 def test_listdir_bytes(self):
592 # When listdir is called with a bytes object,
593 # the returned strings are of type bytes.
594 self.assertTrue(os.fsencode(support.TESTFN) in posix.listdir(b'.'))
595
596 @unittest.skipUnless(posix.listdir in os.supports_fd,
597 "test needs fd support for posix.listdir()")
598 def test_listdir_fd(self):
Antoine Pitrou8250e232011-02-25 23:41:16 +0000599 f = posix.open(posix.getcwd(), posix.O_RDONLY)
Charles-François Natali7546ad32012-01-08 18:34:06 +0100600 self.addCleanup(posix.close, f)
Antoine Pitrou8250e232011-02-25 23:41:16 +0000601 self.assertEqual(
602 sorted(posix.listdir('.')),
Larry Hastings9cf065c2012-06-22 16:30:09 -0700603 sorted(posix.listdir(f))
Antoine Pitrou8250e232011-02-25 23:41:16 +0000604 )
Charles-François Natali7546ad32012-01-08 18:34:06 +0100605 # Check that the fd offset was reset (issue #13739)
Charles-François Natali7546ad32012-01-08 18:34:06 +0100606 self.assertEqual(
607 sorted(posix.listdir('.')),
Larry Hastings9cf065c2012-06-22 16:30:09 -0700608 sorted(posix.listdir(f))
Charles-François Natali7546ad32012-01-08 18:34:06 +0100609 )
Antoine Pitrou8250e232011-02-25 23:41:16 +0000610
Serhiy Storchaka43767632013-11-03 21:31:38 +0200611 @unittest.skipUnless(hasattr(posix, 'access'), 'test needs posix.access()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000612 def test_access(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200613 self.assertTrue(posix.access(support.TESTFN, os.R_OK))
Neal Norwitze241ce82003-02-17 18:17:05 +0000614
Serhiy Storchaka43767632013-11-03 21:31:38 +0200615 @unittest.skipUnless(hasattr(posix, 'umask'), 'test needs posix.umask()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000616 def test_umask(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200617 old_mask = posix.umask(0)
618 self.assertIsInstance(old_mask, int)
619 posix.umask(old_mask)
Neal Norwitze241ce82003-02-17 18:17:05 +0000620
Serhiy Storchaka43767632013-11-03 21:31:38 +0200621 @unittest.skipUnless(hasattr(posix, 'strerror'),
622 'test needs posix.strerror()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000623 def test_strerror(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200624 self.assertTrue(posix.strerror(0))
Neal Norwitze241ce82003-02-17 18:17:05 +0000625
Serhiy Storchaka43767632013-11-03 21:31:38 +0200626 @unittest.skipUnless(hasattr(posix, 'pipe'), 'test needs posix.pipe()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000627 def test_pipe(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200628 reader, writer = posix.pipe()
629 os.close(reader)
630 os.close(writer)
Neal Norwitze241ce82003-02-17 18:17:05 +0000631
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200632 @unittest.skipUnless(hasattr(os, 'pipe2'), "test needs os.pipe2()")
Charles-François Natali239bb962011-06-03 12:55:15 +0200633 @support.requires_linux_version(2, 6, 27)
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200634 def test_pipe2(self):
635 self.assertRaises(TypeError, os.pipe2, 'DEADBEEF')
636 self.assertRaises(TypeError, os.pipe2, 0, 0)
637
Charles-François Natali368f34b2011-06-06 19:49:47 +0200638 # try calling with flags = 0, like os.pipe()
639 r, w = os.pipe2(0)
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200640 os.close(r)
641 os.close(w)
642
643 # test flags
644 r, w = os.pipe2(os.O_CLOEXEC|os.O_NONBLOCK)
645 self.addCleanup(os.close, r)
646 self.addCleanup(os.close, w)
Victor Stinnerbff989e2013-08-28 12:25:40 +0200647 self.assertFalse(os.get_inheritable(r))
648 self.assertFalse(os.get_inheritable(w))
Victor Stinner1db9e7b2014-07-29 22:32:47 +0200649 self.assertFalse(os.get_blocking(r))
650 self.assertFalse(os.get_blocking(w))
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200651 # try reading from an empty pipe: this should fail, not block
652 self.assertRaises(OSError, os.read, r, 1)
653 # try a write big enough to fill-up the pipe: this should either
654 # fail or perform a partial write, not block
655 try:
656 os.write(w, b'x' * support.PIPE_MAX_SIZE)
657 except OSError:
658 pass
659
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +0200660 @support.cpython_only
661 @unittest.skipUnless(hasattr(os, 'pipe2'), "test needs os.pipe2()")
662 @support.requires_linux_version(2, 6, 27)
663 def test_pipe2_c_limits(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +0200664 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +0200665 import _testcapi
Serhiy Storchaka78980432013-01-15 01:12:17 +0200666 self.assertRaises(OverflowError, os.pipe2, _testcapi.INT_MAX + 1)
667 self.assertRaises(OverflowError, os.pipe2, _testcapi.UINT_MAX + 1)
668
Serhiy Storchaka43767632013-11-03 21:31:38 +0200669 @unittest.skipUnless(hasattr(posix, 'utime'), 'test needs posix.utime()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000670 def test_utime(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200671 now = time.time()
672 posix.utime(support.TESTFN, None)
673 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None))
674 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None))
675 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now))
676 posix.utime(support.TESTFN, (int(now), int(now)))
677 posix.utime(support.TESTFN, (now, now))
Neal Norwitze241ce82003-02-17 18:17:05 +0000678
Larry Hastings9cf065c2012-06-22 16:30:09 -0700679 def _test_chflags_regular_file(self, chflags_func, target_file, **kwargs):
Ned Deily3eb67d52011-06-28 00:00:28 -0700680 st = os.stat(target_file)
681 self.assertTrue(hasattr(st, 'st_flags'))
Trent Nelson75959cf2012-08-21 23:59:31 +0000682
683 # ZFS returns EOPNOTSUPP when attempting to set flag UF_IMMUTABLE.
684 flags = st.st_flags | stat.UF_IMMUTABLE
685 try:
686 chflags_func(target_file, flags, **kwargs)
687 except OSError as err:
688 if err.errno != errno.EOPNOTSUPP:
689 raise
690 msg = 'chflag UF_IMMUTABLE not supported by underlying fs'
691 self.skipTest(msg)
692
Ned Deily3eb67d52011-06-28 00:00:28 -0700693 try:
694 new_st = os.stat(target_file)
695 self.assertEqual(st.st_flags | stat.UF_IMMUTABLE, new_st.st_flags)
696 try:
697 fd = open(target_file, 'w+')
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200698 except OSError as e:
Ned Deily3eb67d52011-06-28 00:00:28 -0700699 self.assertEqual(e.errno, errno.EPERM)
700 finally:
701 posix.chflags(target_file, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000702
Ned Deily3eb67d52011-06-28 00:00:28 -0700703 @unittest.skipUnless(hasattr(posix, 'chflags'), 'test needs os.chflags()')
704 def test_chflags(self):
705 self._test_chflags_regular_file(posix.chflags, support.TESTFN)
706
707 @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
708 def test_lchflags_regular_file(self):
709 self._test_chflags_regular_file(posix.lchflags, support.TESTFN)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700710 self._test_chflags_regular_file(posix.chflags, support.TESTFN, follow_symlinks=False)
Ned Deily3eb67d52011-06-28 00:00:28 -0700711
712 @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
713 def test_lchflags_symlink(self):
714 testfn_st = os.stat(support.TESTFN)
715
716 self.assertTrue(hasattr(testfn_st, 'st_flags'))
717
718 os.symlink(support.TESTFN, _DUMMY_SYMLINK)
719 self.teardown_files.append(_DUMMY_SYMLINK)
720 dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
721
Larry Hastings9cf065c2012-06-22 16:30:09 -0700722 def chflags_nofollow(path, flags):
723 return posix.chflags(path, flags, follow_symlinks=False)
Ned Deily3eb67d52011-06-28 00:00:28 -0700724
Larry Hastings9cf065c2012-06-22 16:30:09 -0700725 for fn in (posix.lchflags, chflags_nofollow):
Trent Nelson75959cf2012-08-21 23:59:31 +0000726 # ZFS returns EOPNOTSUPP when attempting to set flag UF_IMMUTABLE.
727 flags = dummy_symlink_st.st_flags | stat.UF_IMMUTABLE
728 try:
729 fn(_DUMMY_SYMLINK, flags)
730 except OSError as err:
731 if err.errno != errno.EOPNOTSUPP:
732 raise
733 msg = 'chflag UF_IMMUTABLE not supported by underlying fs'
734 self.skipTest(msg)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700735 try:
736 new_testfn_st = os.stat(support.TESTFN)
737 new_dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
738
739 self.assertEqual(testfn_st.st_flags, new_testfn_st.st_flags)
740 self.assertEqual(dummy_symlink_st.st_flags | stat.UF_IMMUTABLE,
741 new_dummy_symlink_st.st_flags)
742 finally:
743 fn(_DUMMY_SYMLINK, dummy_symlink_st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000744
Guido van Rossum98297ee2007-11-06 21:34:58 +0000745 def test_environ(self):
Victor Stinner17b490d2010-05-06 22:19:30 +0000746 if os.name == "nt":
747 item_type = str
748 else:
749 item_type = bytes
Guido van Rossum98297ee2007-11-06 21:34:58 +0000750 for k, v in posix.environ.items():
Victor Stinner17b490d2010-05-06 22:19:30 +0000751 self.assertEqual(type(k), item_type)
752 self.assertEqual(type(v), item_type)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000753
Serhiy Storchaka43767632013-11-03 21:31:38 +0200754 @unittest.skipUnless(hasattr(posix, 'getcwd'), 'test needs posix.getcwd()')
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000755 def test_getcwd_long_pathnames(self):
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500756 dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef'
757 curdir = os.getcwd()
758 base_path = os.path.abspath(support.TESTFN) + '.getcwd'
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000759
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500760 try:
761 os.mkdir(base_path)
762 os.chdir(base_path)
763 except:
764 # Just returning nothing instead of the SkipTest exception, because
765 # the test results in Error in that case. Is that ok?
766 # raise unittest.SkipTest("cannot create directory for testing")
767 return
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000768
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500769 def _create_and_do_getcwd(dirname, current_path_length = 0):
770 try:
771 os.mkdir(dirname)
772 except:
773 raise unittest.SkipTest("mkdir cannot create directory sufficiently deep for getcwd test")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000774
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500775 os.chdir(dirname)
776 try:
777 os.getcwd()
778 if current_path_length < 1027:
779 _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
780 finally:
781 os.chdir('..')
782 os.rmdir(dirname)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000783
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500784 _create_and_do_getcwd(dirname)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000785
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500786 finally:
787 os.chdir(curdir)
788 support.rmtree(base_path)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000789
Ross Lagerwallb0ae53d2011-06-10 07:30:30 +0200790 @unittest.skipUnless(hasattr(posix, 'getgrouplist'), "test needs posix.getgrouplist()")
791 @unittest.skipUnless(hasattr(pwd, 'getpwuid'), "test needs pwd.getpwuid()")
792 @unittest.skipUnless(hasattr(os, 'getuid'), "test needs os.getuid()")
793 def test_getgrouplist(self):
Ross Lagerwalla0b315f2012-12-13 15:20:26 +0000794 user = pwd.getpwuid(os.getuid())[0]
795 group = pwd.getpwuid(os.getuid())[3]
796 self.assertIn(group, posix.getgrouplist(user, group))
Ross Lagerwallb0ae53d2011-06-10 07:30:30 +0200797
Ross Lagerwallb0ae53d2011-06-10 07:30:30 +0200798
Antoine Pitrou318b8f32011-01-12 18:45:27 +0000799 @unittest.skipUnless(hasattr(os, 'getegid'), "test needs os.getegid()")
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000800 def test_getgroups(self):
Jesus Cea61f32cb2014-06-28 18:39:35 +0200801 with os.popen('id -G 2>/dev/null') as idg:
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000802 groups = idg.read().strip()
Charles-François Natalie8a255a2012-05-02 20:01:38 +0200803 ret = idg.close()
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000804
Xavier de Gaye24c3b492016-10-19 11:00:26 +0200805 try:
806 idg_groups = set(int(g) for g in groups.split())
807 except ValueError:
808 idg_groups = set()
809 if ret is not None or not idg_groups:
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000810 raise unittest.SkipTest("need working 'id -G'")
811
Ned Deily028915e2013-02-02 15:08:52 -0800812 # Issues 16698: OS X ABIs prior to 10.6 have limits on getgroups()
813 if sys.platform == 'darwin':
814 import sysconfig
815 dt = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') or '10.0'
Ned Deily04cdfa12014-06-25 13:36:14 -0700816 if tuple(int(n) for n in dt.split('.')[0:2]) < (10, 6):
Ned Deily028915e2013-02-02 15:08:52 -0800817 raise unittest.SkipTest("getgroups(2) is broken prior to 10.6")
818
Ronald Oussoren7fb6f512010-08-01 19:18:13 +0000819 # 'id -G' and 'os.getgroups()' should return the same
Xavier de Gaye24c3b492016-10-19 11:00:26 +0200820 # groups, ignoring order, duplicates, and the effective gid.
821 # #10822/#26944 - It is implementation defined whether
822 # posix.getgroups() includes the effective gid.
823 symdiff = idg_groups.symmetric_difference(posix.getgroups())
824 self.assertTrue(not symdiff or symdiff == {posix.getegid()})
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000825
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000826 # tests for the posix *at functions follow
827
Larry Hastings9cf065c2012-06-22 16:30:09 -0700828 @unittest.skipUnless(os.access in os.supports_dir_fd, "test needs dir_fd support for os.access()")
829 def test_access_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000830 f = posix.open(posix.getcwd(), posix.O_RDONLY)
831 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700832 self.assertTrue(posix.access(support.TESTFN, os.R_OK, dir_fd=f))
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000833 finally:
834 posix.close(f)
835
Larry Hastings9cf065c2012-06-22 16:30:09 -0700836 @unittest.skipUnless(os.chmod in os.supports_dir_fd, "test needs dir_fd support in os.chmod()")
837 def test_chmod_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000838 os.chmod(support.TESTFN, stat.S_IRUSR)
839
840 f = posix.open(posix.getcwd(), posix.O_RDONLY)
841 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700842 posix.chmod(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000843
844 s = posix.stat(support.TESTFN)
845 self.assertEqual(s[0] & stat.S_IRWXU, stat.S_IRUSR | stat.S_IWUSR)
846 finally:
847 posix.close(f)
848
Larry Hastings9cf065c2012-06-22 16:30:09 -0700849 @unittest.skipUnless(os.chown in os.supports_dir_fd, "test needs dir_fd support in os.chown()")
850 def test_chown_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000851 support.unlink(support.TESTFN)
Victor Stinnerbf816222011-06-30 23:25:47 +0200852 support.create_empty_file(support.TESTFN)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000853
854 f = posix.open(posix.getcwd(), posix.O_RDONLY)
855 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700856 posix.chown(support.TESTFN, os.getuid(), os.getgid(), dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000857 finally:
858 posix.close(f)
859
Larry Hastings9cf065c2012-06-22 16:30:09 -0700860 @unittest.skipUnless(os.stat in os.supports_dir_fd, "test needs dir_fd support in os.stat()")
861 def test_stat_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000862 support.unlink(support.TESTFN)
863 with open(support.TESTFN, 'w') as outfile:
864 outfile.write("testline\n")
865
866 f = posix.open(posix.getcwd(), posix.O_RDONLY)
867 try:
868 s1 = posix.stat(support.TESTFN)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700869 s2 = posix.stat(support.TESTFN, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000870 self.assertEqual(s1, s2)
Serhiy Storchakaa2ad5c32013-01-07 23:13:46 +0200871 s2 = posix.stat(support.TESTFN, dir_fd=None)
872 self.assertEqual(s1, s2)
Serhiy Storchaka7155b882016-04-08 08:48:20 +0300873 self.assertRaisesRegex(TypeError, 'should be integer or None, not',
Serhiy Storchakaa2ad5c32013-01-07 23:13:46 +0200874 posix.stat, support.TESTFN, dir_fd=posix.getcwd())
Serhiy Storchaka7155b882016-04-08 08:48:20 +0300875 self.assertRaisesRegex(TypeError, 'should be integer or None, not',
Serhiy Storchakaa2ad5c32013-01-07 23:13:46 +0200876 posix.stat, support.TESTFN, dir_fd=float(f))
877 self.assertRaises(OverflowError,
878 posix.stat, support.TESTFN, dir_fd=10**20)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000879 finally:
880 posix.close(f)
881
Larry Hastings9cf065c2012-06-22 16:30:09 -0700882 @unittest.skipUnless(os.utime in os.supports_dir_fd, "test needs dir_fd support in os.utime()")
883 def test_utime_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000884 f = posix.open(posix.getcwd(), posix.O_RDONLY)
885 try:
886 now = time.time()
Larry Hastings9cf065c2012-06-22 16:30:09 -0700887 posix.utime(support.TESTFN, None, dir_fd=f)
888 posix.utime(support.TESTFN, dir_fd=f)
889 self.assertRaises(TypeError, posix.utime, support.TESTFN, now, dir_fd=f)
890 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None), dir_fd=f)
891 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None), dir_fd=f)
892 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now), dir_fd=f)
893 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, "x"), dir_fd=f)
894 posix.utime(support.TESTFN, (int(now), int(now)), dir_fd=f)
895 posix.utime(support.TESTFN, (now, now), dir_fd=f)
896 posix.utime(support.TESTFN,
897 (int(now), int((now - int(now)) * 1e9)), dir_fd=f)
898 posix.utime(support.TESTFN, dir_fd=f,
899 times=(int(now), int((now - int(now)) * 1e9)))
900
Larry Hastings90867a52012-06-22 17:01:41 -0700901 # try dir_fd and follow_symlinks together
Larry Hastings9cf065c2012-06-22 16:30:09 -0700902 if os.utime in os.supports_follow_symlinks:
Larry Hastings90867a52012-06-22 17:01:41 -0700903 try:
904 posix.utime(support.TESTFN, follow_symlinks=False, dir_fd=f)
Georg Brandl969288e2012-06-26 09:25:44 +0200905 except ValueError:
Larry Hastings90867a52012-06-22 17:01:41 -0700906 # whoops! using both together not supported on this platform.
907 pass
Larry Hastings9cf065c2012-06-22 16:30:09 -0700908
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000909 finally:
910 posix.close(f)
911
Larry Hastings9cf065c2012-06-22 16:30:09 -0700912 @unittest.skipUnless(os.link in os.supports_dir_fd, "test needs dir_fd support in os.link()")
Xavier de Gaye3a4e9892016-12-13 10:00:01 +0100913 @unittest.skipIf(android_not_root, "hard link not allowed, non root user")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700914 def test_link_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000915 f = posix.open(posix.getcwd(), posix.O_RDONLY)
916 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700917 posix.link(support.TESTFN, support.TESTFN + 'link', src_dir_fd=f, dst_dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000918 # should have same inodes
919 self.assertEqual(posix.stat(support.TESTFN)[1],
920 posix.stat(support.TESTFN + 'link')[1])
921 finally:
922 posix.close(f)
923 support.unlink(support.TESTFN + 'link')
924
Larry Hastings9cf065c2012-06-22 16:30:09 -0700925 @unittest.skipUnless(os.mkdir in os.supports_dir_fd, "test needs dir_fd support in os.mkdir()")
926 def test_mkdir_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000927 f = posix.open(posix.getcwd(), posix.O_RDONLY)
928 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700929 posix.mkdir(support.TESTFN + 'dir', dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000930 posix.stat(support.TESTFN + 'dir') # should not raise exception
931 finally:
932 posix.close(f)
933 support.rmtree(support.TESTFN + 'dir')
934
Larry Hastings9cf065c2012-06-22 16:30:09 -0700935 @unittest.skipUnless((os.mknod in os.supports_dir_fd) and hasattr(stat, 'S_IFIFO'),
936 "test requires both stat.S_IFIFO and dir_fd support for os.mknod()")
Xavier de Gaye3a4e9892016-12-13 10:00:01 +0100937 @unittest.skipIf(android_not_root, "mknod not allowed, non root user")
Larry Hastings9cf065c2012-06-22 16:30:09 -0700938 def test_mknod_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000939 # Test using mknodat() to create a FIFO (the only use specified
940 # by POSIX).
941 support.unlink(support.TESTFN)
942 mode = stat.S_IFIFO | stat.S_IRUSR | stat.S_IWUSR
943 f = posix.open(posix.getcwd(), posix.O_RDONLY)
944 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700945 posix.mknod(support.TESTFN, mode, 0, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000946 except OSError as e:
947 # Some old systems don't allow unprivileged users to use
948 # mknod(), or only support creating device nodes.
949 self.assertIn(e.errno, (errno.EPERM, errno.EINVAL))
950 else:
951 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
952 finally:
953 posix.close(f)
954
Larry Hastings9cf065c2012-06-22 16:30:09 -0700955 @unittest.skipUnless(os.open in os.supports_dir_fd, "test needs dir_fd support in os.open()")
956 def test_open_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000957 support.unlink(support.TESTFN)
958 with open(support.TESTFN, 'w') as outfile:
959 outfile.write("testline\n")
960 a = posix.open(posix.getcwd(), posix.O_RDONLY)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700961 b = posix.open(support.TESTFN, posix.O_RDONLY, dir_fd=a)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000962 try:
963 res = posix.read(b, 9).decode(encoding="utf-8")
964 self.assertEqual("testline\n", res)
965 finally:
966 posix.close(a)
967 posix.close(b)
968
Larry Hastings9cf065c2012-06-22 16:30:09 -0700969 @unittest.skipUnless(os.readlink in os.supports_dir_fd, "test needs dir_fd support in os.readlink()")
970 def test_readlink_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000971 os.symlink(support.TESTFN, support.TESTFN + 'link')
972 f = posix.open(posix.getcwd(), posix.O_RDONLY)
973 try:
974 self.assertEqual(posix.readlink(support.TESTFN + 'link'),
Larry Hastings9cf065c2012-06-22 16:30:09 -0700975 posix.readlink(support.TESTFN + 'link', dir_fd=f))
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000976 finally:
977 support.unlink(support.TESTFN + 'link')
978 posix.close(f)
979
Larry Hastings9cf065c2012-06-22 16:30:09 -0700980 @unittest.skipUnless(os.rename in os.supports_dir_fd, "test needs dir_fd support in os.rename()")
981 def test_rename_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000982 support.unlink(support.TESTFN)
Victor Stinnerbf816222011-06-30 23:25:47 +0200983 support.create_empty_file(support.TESTFN + 'ren')
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000984 f = posix.open(posix.getcwd(), posix.O_RDONLY)
985 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700986 posix.rename(support.TESTFN + 'ren', support.TESTFN, src_dir_fd=f, dst_dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000987 except:
988 posix.rename(support.TESTFN + 'ren', support.TESTFN)
989 raise
990 else:
Andrew Svetlov5b898402012-12-18 21:26:36 +0200991 posix.stat(support.TESTFN) # should not raise exception
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000992 finally:
993 posix.close(f)
994
Larry Hastings9cf065c2012-06-22 16:30:09 -0700995 @unittest.skipUnless(os.symlink in os.supports_dir_fd, "test needs dir_fd support in os.symlink()")
996 def test_symlink_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000997 f = posix.open(posix.getcwd(), posix.O_RDONLY)
998 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700999 posix.symlink(support.TESTFN, support.TESTFN + 'link', dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001000 self.assertEqual(posix.readlink(support.TESTFN + 'link'), support.TESTFN)
1001 finally:
1002 posix.close(f)
1003 support.unlink(support.TESTFN + 'link')
1004
Larry Hastings9cf065c2012-06-22 16:30:09 -07001005 @unittest.skipUnless(os.unlink in os.supports_dir_fd, "test needs dir_fd support in os.unlink()")
1006 def test_unlink_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001007 f = posix.open(posix.getcwd(), posix.O_RDONLY)
Victor Stinnerbf816222011-06-30 23:25:47 +02001008 support.create_empty_file(support.TESTFN + 'del')
Andrew Svetlov5b898402012-12-18 21:26:36 +02001009 posix.stat(support.TESTFN + 'del') # should not raise exception
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001010 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -07001011 posix.unlink(support.TESTFN + 'del', dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001012 except:
1013 support.unlink(support.TESTFN + 'del')
1014 raise
1015 else:
1016 self.assertRaises(OSError, posix.stat, support.TESTFN + 'link')
1017 finally:
1018 posix.close(f)
1019
Larry Hastings9cf065c2012-06-22 16:30:09 -07001020 @unittest.skipUnless(os.mkfifo in os.supports_dir_fd, "test needs dir_fd support in os.mkfifo()")
Xavier de Gaye3a4e9892016-12-13 10:00:01 +01001021 @unittest.skipIf(android_not_root, "mkfifo not allowed, non root user")
Larry Hastings9cf065c2012-06-22 16:30:09 -07001022 def test_mkfifo_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001023 support.unlink(support.TESTFN)
1024 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1025 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -07001026 posix.mkfifo(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001027 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
1028 finally:
1029 posix.close(f)
1030
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001031 requires_sched_h = unittest.skipUnless(hasattr(posix, 'sched_yield'),
1032 "don't have scheduling support")
Antoine Pitrou84869872012-08-04 16:16:35 +02001033 requires_sched_affinity = unittest.skipUnless(hasattr(posix, 'sched_setaffinity'),
Benjamin Peterson50ba2712011-08-02 22:15:40 -05001034 "don't have sched affinity support")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001035
1036 @requires_sched_h
1037 def test_sched_yield(self):
1038 # This has no error conditions (at least on Linux).
1039 posix.sched_yield()
1040
1041 @requires_sched_h
Charles-François Nataliea0d5fc2011-09-06 19:03:35 +02001042 @unittest.skipUnless(hasattr(posix, 'sched_get_priority_max'),
1043 "requires sched_get_priority_max()")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001044 def test_sched_priority(self):
1045 # Round-robin usually has interesting priorities.
1046 pol = posix.SCHED_RR
1047 lo = posix.sched_get_priority_min(pol)
1048 hi = posix.sched_get_priority_max(pol)
1049 self.assertIsInstance(lo, int)
1050 self.assertIsInstance(hi, int)
1051 self.assertGreaterEqual(hi, lo)
Benjamin Peterson539b6c42011-08-02 22:09:37 -05001052 # OSX evidently just returns 15 without checking the argument.
1053 if sys.platform != "darwin":
Benjamin Petersonc1581582011-08-02 22:10:55 -05001054 self.assertRaises(OSError, posix.sched_get_priority_min, -23)
1055 self.assertRaises(OSError, posix.sched_get_priority_max, -23)
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001056
Benjamin Petersonc5fce4d2011-08-02 18:07:32 -05001057 @unittest.skipUnless(hasattr(posix, 'sched_setscheduler'), "can't change scheduler")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001058 def test_get_and_set_scheduler_and_param(self):
1059 possible_schedulers = [sched for name, sched in posix.__dict__.items()
1060 if name.startswith("SCHED_")]
1061 mine = posix.sched_getscheduler(0)
1062 self.assertIn(mine, possible_schedulers)
1063 try:
Jesus Ceaceb5d162011-09-10 01:16:55 +02001064 parent = posix.sched_getscheduler(os.getppid())
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001065 except OSError as e:
Jesus Ceaceb5d162011-09-10 01:16:55 +02001066 if e.errno != errno.EPERM:
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001067 raise
1068 else:
Jesus Ceaceb5d162011-09-10 01:16:55 +02001069 self.assertIn(parent, possible_schedulers)
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001070 self.assertRaises(OSError, posix.sched_getscheduler, -1)
1071 self.assertRaises(OSError, posix.sched_getparam, -1)
1072 param = posix.sched_getparam(0)
1073 self.assertIsInstance(param.sched_priority, int)
Charles-François Natali7b911cb2011-08-21 12:41:43 +02001074
Charles-François Natalib402a5c2013-01-13 14:13:25 +01001075 # POSIX states that calling sched_setparam() or sched_setscheduler() on
1076 # a process with a scheduling policy other than SCHED_FIFO or SCHED_RR
1077 # is implementation-defined: NetBSD and FreeBSD can return EINVAL.
1078 if not sys.platform.startswith(('freebsd', 'netbsd')):
1079 try:
1080 posix.sched_setscheduler(0, mine, param)
1081 posix.sched_setparam(0, param)
1082 except OSError as e:
1083 if e.errno != errno.EPERM:
1084 raise
Charles-François Natali7b911cb2011-08-21 12:41:43 +02001085 self.assertRaises(OSError, posix.sched_setparam, -1, param)
1086
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001087 self.assertRaises(OSError, posix.sched_setscheduler, -1, mine, param)
1088 self.assertRaises(TypeError, posix.sched_setscheduler, 0, mine, None)
1089 self.assertRaises(TypeError, posix.sched_setparam, 0, 43)
1090 param = posix.sched_param(None)
1091 self.assertRaises(TypeError, posix.sched_setparam, 0, param)
1092 large = 214748364700
1093 param = posix.sched_param(large)
1094 self.assertRaises(OverflowError, posix.sched_setparam, 0, param)
1095 param = posix.sched_param(sched_priority=-large)
1096 self.assertRaises(OverflowError, posix.sched_setparam, 0, param)
1097
Benjamin Petersonc5fce4d2011-08-02 18:07:32 -05001098 @unittest.skipUnless(hasattr(posix, "sched_rr_get_interval"), "no function")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001099 def test_sched_rr_get_interval(self):
Benjamin Peterson43234ab2011-08-02 22:19:14 -05001100 try:
1101 interval = posix.sched_rr_get_interval(0)
1102 except OSError as e:
1103 # This likely means that sched_rr_get_interval is only valid for
1104 # processes with the SCHED_RR scheduler in effect.
1105 if e.errno != errno.EINVAL:
1106 raise
1107 self.skipTest("only works on SCHED_RR processes")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001108 self.assertIsInstance(interval, float)
1109 # Reasonable constraints, I think.
1110 self.assertGreaterEqual(interval, 0.)
1111 self.assertLess(interval, 1.)
1112
Benjamin Peterson2740af82011-08-02 17:41:34 -05001113 @requires_sched_affinity
Antoine Pitrou84869872012-08-04 16:16:35 +02001114 def test_sched_getaffinity(self):
1115 mask = posix.sched_getaffinity(0)
1116 self.assertIsInstance(mask, set)
1117 self.assertGreaterEqual(len(mask), 1)
1118 self.assertRaises(OSError, posix.sched_getaffinity, -1)
1119 for cpu in mask:
1120 self.assertIsInstance(cpu, int)
1121 self.assertGreaterEqual(cpu, 0)
1122 self.assertLess(cpu, 1 << 32)
1123
1124 @requires_sched_affinity
1125 def test_sched_setaffinity(self):
1126 mask = posix.sched_getaffinity(0)
1127 if len(mask) > 1:
1128 # Empty masks are forbidden
1129 mask.pop()
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001130 posix.sched_setaffinity(0, mask)
Antoine Pitrou84869872012-08-04 16:16:35 +02001131 self.assertEqual(posix.sched_getaffinity(0), mask)
1132 self.assertRaises(OSError, posix.sched_setaffinity, 0, [])
1133 self.assertRaises(ValueError, posix.sched_setaffinity, 0, [-10])
1134 self.assertRaises(OverflowError, posix.sched_setaffinity, 0, [1<<128])
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001135 self.assertRaises(OSError, posix.sched_setaffinity, -1, mask)
1136
Victor Stinner8b905bd2011-10-25 13:34:04 +02001137 def test_rtld_constants(self):
1138 # check presence of major RTLD_* constants
1139 posix.RTLD_LAZY
1140 posix.RTLD_NOW
1141 posix.RTLD_GLOBAL
1142 posix.RTLD_LOCAL
1143
Jesus Cea60c13dd2012-06-23 02:58:14 +02001144 @unittest.skipUnless(hasattr(os, 'SEEK_HOLE'),
1145 "test needs an OS that reports file holes")
Hynek Schlawackf841e422012-06-24 09:51:46 +02001146 def test_fs_holes(self):
Jesus Cea94363612012-06-22 18:32:07 +02001147 # Even if the filesystem doesn't report holes,
1148 # if the OS supports it the SEEK_* constants
1149 # will be defined and will have a consistent
1150 # behaviour:
1151 # os.SEEK_DATA = current position
1152 # os.SEEK_HOLE = end of file position
Hynek Schlawackf841e422012-06-24 09:51:46 +02001153 with open(support.TESTFN, 'r+b') as fp:
Jesus Cea94363612012-06-22 18:32:07 +02001154 fp.write(b"hello")
1155 fp.flush()
1156 size = fp.tell()
1157 fno = fp.fileno()
Jesus Cead46f7d22012-07-07 14:56:04 +02001158 try :
1159 for i in range(size):
1160 self.assertEqual(i, os.lseek(fno, i, os.SEEK_DATA))
1161 self.assertLessEqual(size, os.lseek(fno, i, os.SEEK_HOLE))
1162 self.assertRaises(OSError, os.lseek, fno, size, os.SEEK_DATA)
1163 self.assertRaises(OSError, os.lseek, fno, size, os.SEEK_HOLE)
1164 except OSError :
1165 # Some OSs claim to support SEEK_HOLE/SEEK_DATA
1166 # but it is not true.
1167 # For instance:
1168 # http://lists.freebsd.org/pipermail/freebsd-amd64/2012-January/014332.html
1169 raise unittest.SkipTest("OSError raised!")
Jesus Cea94363612012-06-22 18:32:07 +02001170
Larry Hastingsb0827312014-02-09 22:05:19 -08001171 def test_path_error2(self):
1172 """
1173 Test functions that call path_error2(), providing two filenames in their exceptions.
1174 """
Victor Stinner047b7ae2014-10-05 17:37:41 +02001175 for name in ("rename", "replace", "link"):
Larry Hastingsb0827312014-02-09 22:05:19 -08001176 function = getattr(os, name, None)
Victor Stinnerbed04a72014-10-05 17:37:59 +02001177 if function is None:
1178 continue
Larry Hastingsb0827312014-02-09 22:05:19 -08001179
Victor Stinnerbed04a72014-10-05 17:37:59 +02001180 for dst in ("noodly2", support.TESTFN):
1181 try:
1182 function('doesnotexistfilename', dst)
1183 except OSError as e:
1184 self.assertIn("'doesnotexistfilename' -> '{}'".format(dst), str(e))
1185 break
1186 else:
1187 self.fail("No valid path_error2() test for os." + name)
Larry Hastingsb0827312014-02-09 22:05:19 -08001188
Serhiy Storchaka2b0d2002015-04-20 09:53:58 +03001189 def test_path_with_null_character(self):
1190 fn = support.TESTFN
1191 fn_with_NUL = fn + '\0'
1192 self.addCleanup(support.unlink, fn)
1193 support.unlink(fn)
1194 fd = None
1195 try:
Serhiy Storchaka7e9d1d12015-04-20 10:12:28 +03001196 with self.assertRaises(ValueError):
Serhiy Storchaka2b0d2002015-04-20 09:53:58 +03001197 fd = os.open(fn_with_NUL, os.O_WRONLY | os.O_CREAT) # raises
1198 finally:
1199 if fd is not None:
1200 os.close(fd)
1201 self.assertFalse(os.path.exists(fn))
Serhiy Storchaka7e9d1d12015-04-20 10:12:28 +03001202 self.assertRaises(ValueError, os.mkdir, fn_with_NUL)
Serhiy Storchaka2b0d2002015-04-20 09:53:58 +03001203 self.assertFalse(os.path.exists(fn))
1204 open(fn, 'wb').close()
Serhiy Storchaka7e9d1d12015-04-20 10:12:28 +03001205 self.assertRaises(ValueError, os.stat, fn_with_NUL)
Serhiy Storchaka2b0d2002015-04-20 09:53:58 +03001206
1207 def test_path_with_null_byte(self):
1208 fn = os.fsencode(support.TESTFN)
1209 fn_with_NUL = fn + b'\0'
1210 self.addCleanup(support.unlink, fn)
1211 support.unlink(fn)
1212 fd = None
1213 try:
1214 with self.assertRaises(ValueError):
1215 fd = os.open(fn_with_NUL, os.O_WRONLY | os.O_CREAT) # raises
1216 finally:
1217 if fd is not None:
1218 os.close(fd)
1219 self.assertFalse(os.path.exists(fn))
1220 self.assertRaises(ValueError, os.mkdir, fn_with_NUL)
1221 self.assertFalse(os.path.exists(fn))
1222 open(fn, 'wb').close()
1223 self.assertRaises(ValueError, os.stat, fn_with_NUL)
1224
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001225class PosixGroupsTester(unittest.TestCase):
1226
1227 def setUp(self):
1228 if posix.getuid() != 0:
1229 raise unittest.SkipTest("not enough privileges")
1230 if not hasattr(posix, 'getgroups'):
1231 raise unittest.SkipTest("need posix.getgroups")
1232 if sys.platform == 'darwin':
1233 raise unittest.SkipTest("getgroups(2) is broken on OSX")
1234 self.saved_groups = posix.getgroups()
1235
1236 def tearDown(self):
1237 if hasattr(posix, 'setgroups'):
1238 posix.setgroups(self.saved_groups)
1239 elif hasattr(posix, 'initgroups'):
1240 name = pwd.getpwuid(posix.getuid()).pw_name
1241 posix.initgroups(name, self.saved_groups[0])
1242
1243 @unittest.skipUnless(hasattr(posix, 'initgroups'),
1244 "test needs posix.initgroups()")
1245 def test_initgroups(self):
1246 # find missing group
1247
Benjamin Peterson659a6f52014-03-01 19:14:12 -05001248 g = max(self.saved_groups or [0]) + 1
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001249 name = pwd.getpwuid(posix.getuid()).pw_name
1250 posix.initgroups(name, g)
1251 self.assertIn(g, posix.getgroups())
1252
1253 @unittest.skipUnless(hasattr(posix, 'setgroups'),
1254 "test needs posix.setgroups()")
1255 def test_setgroups(self):
Antoine Pitroue5a91012010-09-04 17:32:06 +00001256 for groups in [[0], list(range(16))]:
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001257 posix.setgroups(groups)
1258 self.assertListEqual(groups, posix.getgroups())
1259
Neal Norwitze241ce82003-02-17 18:17:05 +00001260def test_main():
Antoine Pitrou68c95922011-03-20 17:33:57 +01001261 try:
1262 support.run_unittest(PosixTester, PosixGroupsTester)
1263 finally:
1264 support.reap_children()
Neal Norwitze241ce82003-02-17 18:17:05 +00001265
1266if __name__ == '__main__':
1267 test_main()