blob: 77e5b0c4fdf6fba9059cf6e0d9ce0d0799f3b459 [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 Nataliab2d58e2012-04-17 19:48:35 +020012import platform
Christian Heimesd5e2b6f2008-03-19 21:50:51 +000013import pwd
Benjamin Petersondcf97b92008-07-02 17:30:14 +000014import shutil
Benjamin Peterson052a02b2010-08-17 01:27:09 +000015import stat
Ned Deilyba2eab22011-07-26 13:53:55 -070016import tempfile
Neal Norwitze241ce82003-02-17 18:17:05 +000017import unittest
18import warnings
R. David Murraya21e4ca2009-03-31 23:16:50 +000019
Ned Deilyba2eab22011-07-26 13:53:55 -070020_DUMMY_SYMLINK = os.path.join(tempfile.gettempdir(),
21 support.TESTFN + '-dummy-symlink')
Neal Norwitze241ce82003-02-17 18:17:05 +000022
23class PosixTester(unittest.TestCase):
24
25 def setUp(self):
26 # create empty file
Benjamin Petersonee8712c2008-05-20 21:35:26 +000027 fp = open(support.TESTFN, 'w+')
Neal Norwitze241ce82003-02-17 18:17:05 +000028 fp.close()
Ned Deily3eb67d52011-06-28 00:00:28 -070029 self.teardown_files = [ support.TESTFN ]
Brett Cannonc8d502e2010-03-20 21:53:28 +000030 self._warnings_manager = support.check_warnings()
31 self._warnings_manager.__enter__()
32 warnings.filterwarnings('ignore', '.* potential security risk .*',
33 RuntimeWarning)
Neal Norwitze241ce82003-02-17 18:17:05 +000034
35 def tearDown(self):
Ned Deily3eb67d52011-06-28 00:00:28 -070036 for teardown_file in self.teardown_files:
37 support.unlink(teardown_file)
Brett Cannonc8d502e2010-03-20 21:53:28 +000038 self._warnings_manager.__exit__(None, None, None)
Neal Norwitze241ce82003-02-17 18:17:05 +000039
40 def testNoArgFunctions(self):
41 # test posix functions which take no arguments and have
42 # no side-effects which we need to cleanup (e.g., fork, wait, abort)
Guido van Rossumf0af3e32008-10-02 18:55:37 +000043 NO_ARG_FUNCTIONS = [ "ctermid", "getcwd", "getcwdb", "uname",
Guido van Rossum687b9c02007-10-25 23:18:51 +000044 "times", "getloadavg",
Neal Norwitze241ce82003-02-17 18:17:05 +000045 "getegid", "geteuid", "getgid", "getgroups",
Ross Lagerwall7807c352011-03-17 20:20:30 +020046 "getpid", "getpgrp", "getppid", "getuid", "sync",
Neal Norwitze241ce82003-02-17 18:17:05 +000047 ]
Neal Norwitz71b13e82003-02-23 22:12:24 +000048
Neal Norwitze241ce82003-02-17 18:17:05 +000049 for name in NO_ARG_FUNCTIONS:
50 posix_func = getattr(posix, name, None)
51 if posix_func is not None:
52 posix_func()
Neal Norwitz2ff51a82003-02-17 22:40:31 +000053 self.assertRaises(TypeError, posix_func, 1)
Neal Norwitze241ce82003-02-17 18:17:05 +000054
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,
401 'should be string, bytes or integer, not',
402 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)))
411 self.assertTrue(posix.stat(bytearray(os.fsencode(support.TESTFN))))
Serhiy Storchakaa2ad5c32013-01-07 23:13:46 +0200412
Serhiy Storchaka43767632013-11-03 21:31:38 +0200413 self.assertRaisesRegex(TypeError,
414 'can\'t specify None for path argument',
415 posix.stat, None)
416 self.assertRaisesRegex(TypeError,
417 'should be string, bytes or integer, not',
418 posix.stat, list(support.TESTFN))
419 self.assertRaisesRegex(TypeError,
420 'should be string, bytes or integer, not',
421 posix.stat, list(os.fsencode(support.TESTFN)))
Neal Norwitze241ce82003-02-17 18:17:05 +0000422
Benjamin Peterson052a02b2010-08-17 01:27:09 +0000423 @unittest.skipUnless(hasattr(posix, 'mkfifo'), "don't have mkfifo()")
424 def test_mkfifo(self):
425 support.unlink(support.TESTFN)
426 posix.mkfifo(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR)
427 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
428
429 @unittest.skipUnless(hasattr(posix, 'mknod') and hasattr(stat, 'S_IFIFO'),
430 "don't have mknod()/S_IFIFO")
431 def test_mknod(self):
432 # Test using mknod() to create a FIFO (the only use specified
433 # by POSIX).
434 support.unlink(support.TESTFN)
435 mode = stat.S_IFIFO | stat.S_IRUSR | stat.S_IWUSR
436 try:
437 posix.mknod(support.TESTFN, mode, 0)
438 except OSError as e:
439 # Some old systems don't allow unprivileged users to use
440 # mknod(), or only support creating device nodes.
441 self.assertIn(e.errno, (errno.EPERM, errno.EINVAL))
442 else:
443 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
444
Serhiy Storchaka16b2e4f2015-04-20 09:22:13 +0300445 @unittest.skipUnless(hasattr(posix, 'stat'), 'test needs posix.stat()')
446 @unittest.skipUnless(hasattr(posix, 'makedev'), 'test needs posix.makedev()')
447 def test_makedev(self):
448 st = posix.stat(support.TESTFN)
449 dev = st.st_dev
450 self.assertIsInstance(dev, int)
451 self.assertGreaterEqual(dev, 0)
452
453 major = posix.major(dev)
454 self.assertIsInstance(major, int)
455 self.assertGreaterEqual(major, 0)
456 self.assertEqual(posix.major(dev), major)
457 self.assertRaises(TypeError, posix.major, float(dev))
458 self.assertRaises(TypeError, posix.major)
459 self.assertRaises((ValueError, OverflowError), posix.major, -1)
460
461 minor = posix.minor(dev)
462 self.assertIsInstance(minor, int)
463 self.assertGreaterEqual(minor, 0)
464 self.assertEqual(posix.minor(dev), minor)
465 self.assertRaises(TypeError, posix.minor, float(dev))
466 self.assertRaises(TypeError, posix.minor)
467 self.assertRaises((ValueError, OverflowError), posix.minor, -1)
468
469 self.assertEqual(posix.makedev(major, minor), dev)
470 self.assertRaises(TypeError, posix.makedev, float(major), minor)
471 self.assertRaises(TypeError, posix.makedev, major, float(minor))
472 self.assertRaises(TypeError, posix.makedev, major)
473 self.assertRaises(TypeError, posix.makedev)
474
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200475 def _test_all_chown_common(self, chown_func, first_param, stat_func):
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000476 """Common code for chown, fchown and lchown tests."""
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200477 def check_stat(uid, gid):
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200478 if stat_func is not None:
479 stat = stat_func(first_param)
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200480 self.assertEqual(stat.st_uid, uid)
481 self.assertEqual(stat.st_gid, gid)
482 uid = os.getuid()
483 gid = os.getgid()
Charles-François Nataliab2d58e2012-04-17 19:48:35 +0200484 # test a successful chown call
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200485 chown_func(first_param, uid, gid)
486 check_stat(uid, gid)
487 chown_func(first_param, -1, gid)
488 check_stat(uid, gid)
489 chown_func(first_param, uid, -1)
490 check_stat(uid, gid)
Charles-François Nataliab2d58e2012-04-17 19:48:35 +0200491
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200492 if uid == 0:
493 # Try an amusingly large uid/gid to make sure we handle
494 # large unsigned values. (chown lets you use any
495 # uid/gid you like, even if they aren't defined.)
496 #
497 # This problem keeps coming up:
498 # http://bugs.python.org/issue1747858
499 # http://bugs.python.org/issue4591
500 # http://bugs.python.org/issue15301
501 # Hopefully the fix in 4591 fixes it for good!
502 #
503 # This part of the test only runs when run as root.
504 # Only scary people run their tests as root.
505
506 big_value = 2**31
507 chown_func(first_param, big_value, big_value)
508 check_stat(big_value, big_value)
509 chown_func(first_param, -1, -1)
510 check_stat(big_value, big_value)
511 chown_func(first_param, uid, gid)
512 check_stat(uid, gid)
Charles-François Nataliab2d58e2012-04-17 19:48:35 +0200513 elif platform.system() in ('HP-UX', 'SunOS'):
514 # HP-UX and Solaris can allow a non-root user to chown() to root
515 # (issue #5113)
516 raise unittest.SkipTest("Skipping because of non-standard chown() "
517 "behavior")
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000518 else:
519 # non-root cannot chown to root, raises OSError
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200520 self.assertRaises(OSError, chown_func, first_param, 0, 0)
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200521 check_stat(uid, gid)
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200522 self.assertRaises(OSError, chown_func, first_param, 0, -1)
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200523 check_stat(uid, gid)
Serhiy Storchakaa2964b32013-02-21 14:34:36 +0200524 if 0 not in os.getgroups():
Serhiy Storchakab3d62ce2013-02-20 19:48:22 +0200525 self.assertRaises(OSError, chown_func, first_param, -1, 0)
526 check_stat(uid, gid)
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200527 # test illegal types
528 for t in str, float:
529 self.assertRaises(TypeError, chown_func, first_param, t(uid), gid)
530 check_stat(uid, gid)
531 self.assertRaises(TypeError, chown_func, first_param, uid, t(gid))
532 check_stat(uid, gid)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000533
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000534 @unittest.skipUnless(hasattr(posix, 'chown'), "test needs os.chown()")
535 def test_chown(self):
536 # raise an OSError if the file does not exist
537 os.unlink(support.TESTFN)
538 self.assertRaises(OSError, posix.chown, support.TESTFN, -1, -1)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000539
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000540 # re-create the file
Victor Stinnerbf816222011-06-30 23:25:47 +0200541 support.create_empty_file(support.TESTFN)
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200542 self._test_all_chown_common(posix.chown, support.TESTFN,
543 getattr(posix, 'stat', None))
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000544
545 @unittest.skipUnless(hasattr(posix, 'fchown'), "test needs os.fchown()")
546 def test_fchown(self):
547 os.unlink(support.TESTFN)
548
549 # re-create the file
550 test_file = open(support.TESTFN, 'w')
551 try:
552 fd = test_file.fileno()
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200553 self._test_all_chown_common(posix.fchown, fd,
554 getattr(posix, 'fstat', None))
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000555 finally:
556 test_file.close()
557
558 @unittest.skipUnless(hasattr(posix, 'lchown'), "test needs os.lchown()")
559 def test_lchown(self):
560 os.unlink(support.TESTFN)
561 # create a symlink
Ned Deily3eb67d52011-06-28 00:00:28 -0700562 os.symlink(_DUMMY_SYMLINK, support.TESTFN)
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200563 self._test_all_chown_common(posix.lchown, support.TESTFN,
564 getattr(posix, 'lstat', None))
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000565
Serhiy Storchaka43767632013-11-03 21:31:38 +0200566 @unittest.skipUnless(hasattr(posix, 'chdir'), 'test needs posix.chdir()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000567 def test_chdir(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200568 posix.chdir(os.curdir)
569 self.assertRaises(OSError, posix.chdir, support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000570
Martin v. Löwisc9e1c7d2010-07-23 12:16:41 +0000571 def test_listdir(self):
Larry Hastingsfdaea062012-06-25 04:42:23 -0700572 self.assertTrue(support.TESTFN in posix.listdir(os.curdir))
Martin v. Löwisc9e1c7d2010-07-23 12:16:41 +0000573
574 def test_listdir_default(self):
Larry Hastingsfdaea062012-06-25 04:42:23 -0700575 # When listdir is called without argument,
576 # it's the same as listdir(os.curdir).
577 self.assertTrue(support.TESTFN in posix.listdir())
Neal Norwitze241ce82003-02-17 18:17:05 +0000578
Larry Hastingsfdaea062012-06-25 04:42:23 -0700579 def test_listdir_bytes(self):
580 # When listdir is called with a bytes object,
581 # the returned strings are of type bytes.
582 self.assertTrue(os.fsencode(support.TESTFN) in posix.listdir(b'.'))
583
584 @unittest.skipUnless(posix.listdir in os.supports_fd,
585 "test needs fd support for posix.listdir()")
586 def test_listdir_fd(self):
Antoine Pitrou8250e232011-02-25 23:41:16 +0000587 f = posix.open(posix.getcwd(), posix.O_RDONLY)
Charles-François Natali7546ad32012-01-08 18:34:06 +0100588 self.addCleanup(posix.close, f)
Antoine Pitrou8250e232011-02-25 23:41:16 +0000589 self.assertEqual(
590 sorted(posix.listdir('.')),
Larry Hastings9cf065c2012-06-22 16:30:09 -0700591 sorted(posix.listdir(f))
Antoine Pitrou8250e232011-02-25 23:41:16 +0000592 )
Charles-François Natali7546ad32012-01-08 18:34:06 +0100593 # Check that the fd offset was reset (issue #13739)
Charles-François Natali7546ad32012-01-08 18:34:06 +0100594 self.assertEqual(
595 sorted(posix.listdir('.')),
Larry Hastings9cf065c2012-06-22 16:30:09 -0700596 sorted(posix.listdir(f))
Charles-François Natali7546ad32012-01-08 18:34:06 +0100597 )
Antoine Pitrou8250e232011-02-25 23:41:16 +0000598
Serhiy Storchaka43767632013-11-03 21:31:38 +0200599 @unittest.skipUnless(hasattr(posix, 'access'), 'test needs posix.access()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000600 def test_access(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200601 self.assertTrue(posix.access(support.TESTFN, os.R_OK))
Neal Norwitze241ce82003-02-17 18:17:05 +0000602
Serhiy Storchaka43767632013-11-03 21:31:38 +0200603 @unittest.skipUnless(hasattr(posix, 'umask'), 'test needs posix.umask()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000604 def test_umask(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200605 old_mask = posix.umask(0)
606 self.assertIsInstance(old_mask, int)
607 posix.umask(old_mask)
Neal Norwitze241ce82003-02-17 18:17:05 +0000608
Serhiy Storchaka43767632013-11-03 21:31:38 +0200609 @unittest.skipUnless(hasattr(posix, 'strerror'),
610 'test needs posix.strerror()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000611 def test_strerror(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200612 self.assertTrue(posix.strerror(0))
Neal Norwitze241ce82003-02-17 18:17:05 +0000613
Serhiy Storchaka43767632013-11-03 21:31:38 +0200614 @unittest.skipUnless(hasattr(posix, 'pipe'), 'test needs posix.pipe()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000615 def test_pipe(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200616 reader, writer = posix.pipe()
617 os.close(reader)
618 os.close(writer)
Neal Norwitze241ce82003-02-17 18:17:05 +0000619
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200620 @unittest.skipUnless(hasattr(os, 'pipe2'), "test needs os.pipe2()")
Charles-François Natali239bb962011-06-03 12:55:15 +0200621 @support.requires_linux_version(2, 6, 27)
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200622 def test_pipe2(self):
623 self.assertRaises(TypeError, os.pipe2, 'DEADBEEF')
624 self.assertRaises(TypeError, os.pipe2, 0, 0)
625
Charles-François Natali368f34b2011-06-06 19:49:47 +0200626 # try calling with flags = 0, like os.pipe()
627 r, w = os.pipe2(0)
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200628 os.close(r)
629 os.close(w)
630
631 # test flags
632 r, w = os.pipe2(os.O_CLOEXEC|os.O_NONBLOCK)
633 self.addCleanup(os.close, r)
634 self.addCleanup(os.close, w)
Victor Stinnerbff989e2013-08-28 12:25:40 +0200635 self.assertFalse(os.get_inheritable(r))
636 self.assertFalse(os.get_inheritable(w))
Victor Stinner1db9e7b2014-07-29 22:32:47 +0200637 self.assertFalse(os.get_blocking(r))
638 self.assertFalse(os.get_blocking(w))
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200639 # try reading from an empty pipe: this should fail, not block
640 self.assertRaises(OSError, os.read, r, 1)
641 # try a write big enough to fill-up the pipe: this should either
642 # fail or perform a partial write, not block
643 try:
644 os.write(w, b'x' * support.PIPE_MAX_SIZE)
645 except OSError:
646 pass
647
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +0200648 @support.cpython_only
649 @unittest.skipUnless(hasattr(os, 'pipe2'), "test needs os.pipe2()")
650 @support.requires_linux_version(2, 6, 27)
651 def test_pipe2_c_limits(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +0200652 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +0200653 import _testcapi
Serhiy Storchaka78980432013-01-15 01:12:17 +0200654 self.assertRaises(OverflowError, os.pipe2, _testcapi.INT_MAX + 1)
655 self.assertRaises(OverflowError, os.pipe2, _testcapi.UINT_MAX + 1)
656
Serhiy Storchaka43767632013-11-03 21:31:38 +0200657 @unittest.skipUnless(hasattr(posix, 'utime'), 'test needs posix.utime()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000658 def test_utime(self):
Serhiy Storchaka43767632013-11-03 21:31:38 +0200659 now = time.time()
660 posix.utime(support.TESTFN, None)
661 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None))
662 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None))
663 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now))
664 posix.utime(support.TESTFN, (int(now), int(now)))
665 posix.utime(support.TESTFN, (now, now))
Neal Norwitze241ce82003-02-17 18:17:05 +0000666
Larry Hastings9cf065c2012-06-22 16:30:09 -0700667 def _test_chflags_regular_file(self, chflags_func, target_file, **kwargs):
Ned Deily3eb67d52011-06-28 00:00:28 -0700668 st = os.stat(target_file)
669 self.assertTrue(hasattr(st, 'st_flags'))
Trent Nelson75959cf2012-08-21 23:59:31 +0000670
671 # ZFS returns EOPNOTSUPP when attempting to set flag UF_IMMUTABLE.
672 flags = st.st_flags | stat.UF_IMMUTABLE
673 try:
674 chflags_func(target_file, flags, **kwargs)
675 except OSError as err:
676 if err.errno != errno.EOPNOTSUPP:
677 raise
678 msg = 'chflag UF_IMMUTABLE not supported by underlying fs'
679 self.skipTest(msg)
680
Ned Deily3eb67d52011-06-28 00:00:28 -0700681 try:
682 new_st = os.stat(target_file)
683 self.assertEqual(st.st_flags | stat.UF_IMMUTABLE, new_st.st_flags)
684 try:
685 fd = open(target_file, 'w+')
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200686 except OSError as e:
Ned Deily3eb67d52011-06-28 00:00:28 -0700687 self.assertEqual(e.errno, errno.EPERM)
688 finally:
689 posix.chflags(target_file, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000690
Ned Deily3eb67d52011-06-28 00:00:28 -0700691 @unittest.skipUnless(hasattr(posix, 'chflags'), 'test needs os.chflags()')
692 def test_chflags(self):
693 self._test_chflags_regular_file(posix.chflags, support.TESTFN)
694
695 @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
696 def test_lchflags_regular_file(self):
697 self._test_chflags_regular_file(posix.lchflags, support.TESTFN)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700698 self._test_chflags_regular_file(posix.chflags, support.TESTFN, follow_symlinks=False)
Ned Deily3eb67d52011-06-28 00:00:28 -0700699
700 @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
701 def test_lchflags_symlink(self):
702 testfn_st = os.stat(support.TESTFN)
703
704 self.assertTrue(hasattr(testfn_st, 'st_flags'))
705
706 os.symlink(support.TESTFN, _DUMMY_SYMLINK)
707 self.teardown_files.append(_DUMMY_SYMLINK)
708 dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
709
Larry Hastings9cf065c2012-06-22 16:30:09 -0700710 def chflags_nofollow(path, flags):
711 return posix.chflags(path, flags, follow_symlinks=False)
Ned Deily3eb67d52011-06-28 00:00:28 -0700712
Larry Hastings9cf065c2012-06-22 16:30:09 -0700713 for fn in (posix.lchflags, chflags_nofollow):
Trent Nelson75959cf2012-08-21 23:59:31 +0000714 # ZFS returns EOPNOTSUPP when attempting to set flag UF_IMMUTABLE.
715 flags = dummy_symlink_st.st_flags | stat.UF_IMMUTABLE
716 try:
717 fn(_DUMMY_SYMLINK, flags)
718 except OSError as err:
719 if err.errno != errno.EOPNOTSUPP:
720 raise
721 msg = 'chflag UF_IMMUTABLE not supported by underlying fs'
722 self.skipTest(msg)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700723 try:
724 new_testfn_st = os.stat(support.TESTFN)
725 new_dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
726
727 self.assertEqual(testfn_st.st_flags, new_testfn_st.st_flags)
728 self.assertEqual(dummy_symlink_st.st_flags | stat.UF_IMMUTABLE,
729 new_dummy_symlink_st.st_flags)
730 finally:
731 fn(_DUMMY_SYMLINK, dummy_symlink_st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000732
Guido van Rossum98297ee2007-11-06 21:34:58 +0000733 def test_environ(self):
Victor Stinner17b490d2010-05-06 22:19:30 +0000734 if os.name == "nt":
735 item_type = str
736 else:
737 item_type = bytes
Guido van Rossum98297ee2007-11-06 21:34:58 +0000738 for k, v in posix.environ.items():
Victor Stinner17b490d2010-05-06 22:19:30 +0000739 self.assertEqual(type(k), item_type)
740 self.assertEqual(type(v), item_type)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000741
Serhiy Storchaka43767632013-11-03 21:31:38 +0200742 @unittest.skipUnless(hasattr(posix, 'getcwd'), 'test needs posix.getcwd()')
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000743 def test_getcwd_long_pathnames(self):
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500744 dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef'
745 curdir = os.getcwd()
746 base_path = os.path.abspath(support.TESTFN) + '.getcwd'
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000747
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500748 try:
749 os.mkdir(base_path)
750 os.chdir(base_path)
751 except:
752 # Just returning nothing instead of the SkipTest exception, because
753 # the test results in Error in that case. Is that ok?
754 # raise unittest.SkipTest("cannot create directory for testing")
755 return
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000756
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500757 def _create_and_do_getcwd(dirname, current_path_length = 0):
758 try:
759 os.mkdir(dirname)
760 except:
761 raise unittest.SkipTest("mkdir cannot create directory sufficiently deep for getcwd test")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000762
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500763 os.chdir(dirname)
764 try:
765 os.getcwd()
766 if current_path_length < 1027:
767 _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
768 finally:
769 os.chdir('..')
770 os.rmdir(dirname)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000771
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500772 _create_and_do_getcwd(dirname)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000773
Benjamin Peterson3a7dffa2013-08-23 21:01:48 -0500774 finally:
775 os.chdir(curdir)
776 support.rmtree(base_path)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000777
Ross Lagerwallb0ae53d2011-06-10 07:30:30 +0200778 @unittest.skipUnless(hasattr(posix, 'getgrouplist'), "test needs posix.getgrouplist()")
779 @unittest.skipUnless(hasattr(pwd, 'getpwuid'), "test needs pwd.getpwuid()")
780 @unittest.skipUnless(hasattr(os, 'getuid'), "test needs os.getuid()")
781 def test_getgrouplist(self):
Ross Lagerwalla0b315f2012-12-13 15:20:26 +0000782 user = pwd.getpwuid(os.getuid())[0]
783 group = pwd.getpwuid(os.getuid())[3]
784 self.assertIn(group, posix.getgrouplist(user, group))
Ross Lagerwallb0ae53d2011-06-10 07:30:30 +0200785
Ross Lagerwallb0ae53d2011-06-10 07:30:30 +0200786
Antoine Pitrou318b8f32011-01-12 18:45:27 +0000787 @unittest.skipUnless(hasattr(os, 'getegid'), "test needs os.getegid()")
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000788 def test_getgroups(self):
Jesus Cea61f32cb2014-06-28 18:39:35 +0200789 with os.popen('id -G 2>/dev/null') as idg:
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000790 groups = idg.read().strip()
Charles-François Natalie8a255a2012-05-02 20:01:38 +0200791 ret = idg.close()
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000792
Benjamin Petersonb29614e2012-10-09 11:16:03 -0400793 if ret is not None or not groups:
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000794 raise unittest.SkipTest("need working 'id -G'")
795
Ned Deily028915e2013-02-02 15:08:52 -0800796 # Issues 16698: OS X ABIs prior to 10.6 have limits on getgroups()
797 if sys.platform == 'darwin':
798 import sysconfig
799 dt = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') or '10.0'
Ned Deily04cdfa12014-06-25 13:36:14 -0700800 if tuple(int(n) for n in dt.split('.')[0:2]) < (10, 6):
Ned Deily028915e2013-02-02 15:08:52 -0800801 raise unittest.SkipTest("getgroups(2) is broken prior to 10.6")
802
Ronald Oussoren7fb6f512010-08-01 19:18:13 +0000803 # 'id -G' and 'os.getgroups()' should return the same
804 # groups, ignoring order and duplicates.
Antoine Pitrou318b8f32011-01-12 18:45:27 +0000805 # #10822 - it is implementation defined whether posix.getgroups()
806 # includes the effective gid so we include it anyway, since id -G does
Ronald Oussorencb615e62010-07-24 14:15:19 +0000807 self.assertEqual(
Ronald Oussoren7fb6f512010-08-01 19:18:13 +0000808 set([int(x) for x in groups.split()]),
Antoine Pitrou318b8f32011-01-12 18:45:27 +0000809 set(posix.getgroups() + [posix.getegid()]))
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000810
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000811 # tests for the posix *at functions follow
812
Larry Hastings9cf065c2012-06-22 16:30:09 -0700813 @unittest.skipUnless(os.access in os.supports_dir_fd, "test needs dir_fd support for os.access()")
814 def test_access_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000815 f = posix.open(posix.getcwd(), posix.O_RDONLY)
816 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700817 self.assertTrue(posix.access(support.TESTFN, os.R_OK, dir_fd=f))
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000818 finally:
819 posix.close(f)
820
Larry Hastings9cf065c2012-06-22 16:30:09 -0700821 @unittest.skipUnless(os.chmod in os.supports_dir_fd, "test needs dir_fd support in os.chmod()")
822 def test_chmod_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000823 os.chmod(support.TESTFN, stat.S_IRUSR)
824
825 f = posix.open(posix.getcwd(), posix.O_RDONLY)
826 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700827 posix.chmod(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000828
829 s = posix.stat(support.TESTFN)
830 self.assertEqual(s[0] & stat.S_IRWXU, stat.S_IRUSR | stat.S_IWUSR)
831 finally:
832 posix.close(f)
833
Larry Hastings9cf065c2012-06-22 16:30:09 -0700834 @unittest.skipUnless(os.chown in os.supports_dir_fd, "test needs dir_fd support in os.chown()")
835 def test_chown_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000836 support.unlink(support.TESTFN)
Victor Stinnerbf816222011-06-30 23:25:47 +0200837 support.create_empty_file(support.TESTFN)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000838
839 f = posix.open(posix.getcwd(), posix.O_RDONLY)
840 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700841 posix.chown(support.TESTFN, os.getuid(), os.getgid(), dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000842 finally:
843 posix.close(f)
844
Larry Hastings9cf065c2012-06-22 16:30:09 -0700845 @unittest.skipUnless(os.stat in os.supports_dir_fd, "test needs dir_fd support in os.stat()")
846 def test_stat_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000847 support.unlink(support.TESTFN)
848 with open(support.TESTFN, 'w') as outfile:
849 outfile.write("testline\n")
850
851 f = posix.open(posix.getcwd(), posix.O_RDONLY)
852 try:
853 s1 = posix.stat(support.TESTFN)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700854 s2 = posix.stat(support.TESTFN, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000855 self.assertEqual(s1, s2)
Serhiy Storchakaa2ad5c32013-01-07 23:13:46 +0200856 s2 = posix.stat(support.TESTFN, dir_fd=None)
857 self.assertEqual(s1, s2)
858 self.assertRaisesRegex(TypeError, 'should be integer, not',
859 posix.stat, support.TESTFN, dir_fd=posix.getcwd())
860 self.assertRaisesRegex(TypeError, 'should be integer, not',
861 posix.stat, support.TESTFN, dir_fd=float(f))
862 self.assertRaises(OverflowError,
863 posix.stat, support.TESTFN, dir_fd=10**20)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000864 finally:
865 posix.close(f)
866
Larry Hastings9cf065c2012-06-22 16:30:09 -0700867 @unittest.skipUnless(os.utime in os.supports_dir_fd, "test needs dir_fd support in os.utime()")
868 def test_utime_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000869 f = posix.open(posix.getcwd(), posix.O_RDONLY)
870 try:
871 now = time.time()
Larry Hastings9cf065c2012-06-22 16:30:09 -0700872 posix.utime(support.TESTFN, None, dir_fd=f)
873 posix.utime(support.TESTFN, dir_fd=f)
874 self.assertRaises(TypeError, posix.utime, support.TESTFN, now, dir_fd=f)
875 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None), dir_fd=f)
876 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None), dir_fd=f)
877 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now), dir_fd=f)
878 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, "x"), dir_fd=f)
879 posix.utime(support.TESTFN, (int(now), int(now)), dir_fd=f)
880 posix.utime(support.TESTFN, (now, now), dir_fd=f)
881 posix.utime(support.TESTFN,
882 (int(now), int((now - int(now)) * 1e9)), dir_fd=f)
883 posix.utime(support.TESTFN, dir_fd=f,
884 times=(int(now), int((now - int(now)) * 1e9)))
885
Larry Hastings90867a52012-06-22 17:01:41 -0700886 # try dir_fd and follow_symlinks together
Larry Hastings9cf065c2012-06-22 16:30:09 -0700887 if os.utime in os.supports_follow_symlinks:
Larry Hastings90867a52012-06-22 17:01:41 -0700888 try:
889 posix.utime(support.TESTFN, follow_symlinks=False, dir_fd=f)
Georg Brandl969288e2012-06-26 09:25:44 +0200890 except ValueError:
Larry Hastings90867a52012-06-22 17:01:41 -0700891 # whoops! using both together not supported on this platform.
892 pass
Larry Hastings9cf065c2012-06-22 16:30:09 -0700893
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000894 finally:
895 posix.close(f)
896
Larry Hastings9cf065c2012-06-22 16:30:09 -0700897 @unittest.skipUnless(os.link in os.supports_dir_fd, "test needs dir_fd support in os.link()")
898 def test_link_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000899 f = posix.open(posix.getcwd(), posix.O_RDONLY)
900 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700901 posix.link(support.TESTFN, support.TESTFN + 'link', src_dir_fd=f, dst_dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000902 # should have same inodes
903 self.assertEqual(posix.stat(support.TESTFN)[1],
904 posix.stat(support.TESTFN + 'link')[1])
905 finally:
906 posix.close(f)
907 support.unlink(support.TESTFN + 'link')
908
Larry Hastings9cf065c2012-06-22 16:30:09 -0700909 @unittest.skipUnless(os.mkdir in os.supports_dir_fd, "test needs dir_fd support in os.mkdir()")
910 def test_mkdir_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000911 f = posix.open(posix.getcwd(), posix.O_RDONLY)
912 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700913 posix.mkdir(support.TESTFN + 'dir', dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000914 posix.stat(support.TESTFN + 'dir') # should not raise exception
915 finally:
916 posix.close(f)
917 support.rmtree(support.TESTFN + 'dir')
918
Larry Hastings9cf065c2012-06-22 16:30:09 -0700919 @unittest.skipUnless((os.mknod in os.supports_dir_fd) and hasattr(stat, 'S_IFIFO'),
920 "test requires both stat.S_IFIFO and dir_fd support for os.mknod()")
921 def test_mknod_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000922 # Test using mknodat() to create a FIFO (the only use specified
923 # by POSIX).
924 support.unlink(support.TESTFN)
925 mode = stat.S_IFIFO | stat.S_IRUSR | stat.S_IWUSR
926 f = posix.open(posix.getcwd(), posix.O_RDONLY)
927 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700928 posix.mknod(support.TESTFN, mode, 0, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000929 except OSError as e:
930 # Some old systems don't allow unprivileged users to use
931 # mknod(), or only support creating device nodes.
932 self.assertIn(e.errno, (errno.EPERM, errno.EINVAL))
933 else:
934 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
935 finally:
936 posix.close(f)
937
Larry Hastings9cf065c2012-06-22 16:30:09 -0700938 @unittest.skipUnless(os.open in os.supports_dir_fd, "test needs dir_fd support in os.open()")
939 def test_open_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000940 support.unlink(support.TESTFN)
941 with open(support.TESTFN, 'w') as outfile:
942 outfile.write("testline\n")
943 a = posix.open(posix.getcwd(), posix.O_RDONLY)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700944 b = posix.open(support.TESTFN, posix.O_RDONLY, dir_fd=a)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000945 try:
946 res = posix.read(b, 9).decode(encoding="utf-8")
947 self.assertEqual("testline\n", res)
948 finally:
949 posix.close(a)
950 posix.close(b)
951
Larry Hastings9cf065c2012-06-22 16:30:09 -0700952 @unittest.skipUnless(os.readlink in os.supports_dir_fd, "test needs dir_fd support in os.readlink()")
953 def test_readlink_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000954 os.symlink(support.TESTFN, support.TESTFN + 'link')
955 f = posix.open(posix.getcwd(), posix.O_RDONLY)
956 try:
957 self.assertEqual(posix.readlink(support.TESTFN + 'link'),
Larry Hastings9cf065c2012-06-22 16:30:09 -0700958 posix.readlink(support.TESTFN + 'link', dir_fd=f))
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000959 finally:
960 support.unlink(support.TESTFN + 'link')
961 posix.close(f)
962
Larry Hastings9cf065c2012-06-22 16:30:09 -0700963 @unittest.skipUnless(os.rename in os.supports_dir_fd, "test needs dir_fd support in os.rename()")
964 def test_rename_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000965 support.unlink(support.TESTFN)
Victor Stinnerbf816222011-06-30 23:25:47 +0200966 support.create_empty_file(support.TESTFN + 'ren')
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000967 f = posix.open(posix.getcwd(), posix.O_RDONLY)
968 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700969 posix.rename(support.TESTFN + 'ren', support.TESTFN, src_dir_fd=f, dst_dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000970 except:
971 posix.rename(support.TESTFN + 'ren', support.TESTFN)
972 raise
973 else:
Andrew Svetlov5b898402012-12-18 21:26:36 +0200974 posix.stat(support.TESTFN) # should not raise exception
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000975 finally:
976 posix.close(f)
977
Larry Hastings9cf065c2012-06-22 16:30:09 -0700978 @unittest.skipUnless(os.symlink in os.supports_dir_fd, "test needs dir_fd support in os.symlink()")
979 def test_symlink_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000980 f = posix.open(posix.getcwd(), posix.O_RDONLY)
981 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700982 posix.symlink(support.TESTFN, support.TESTFN + 'link', dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000983 self.assertEqual(posix.readlink(support.TESTFN + 'link'), support.TESTFN)
984 finally:
985 posix.close(f)
986 support.unlink(support.TESTFN + 'link')
987
Larry Hastings9cf065c2012-06-22 16:30:09 -0700988 @unittest.skipUnless(os.unlink in os.supports_dir_fd, "test needs dir_fd support in os.unlink()")
989 def test_unlink_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000990 f = posix.open(posix.getcwd(), posix.O_RDONLY)
Victor Stinnerbf816222011-06-30 23:25:47 +0200991 support.create_empty_file(support.TESTFN + 'del')
Andrew Svetlov5b898402012-12-18 21:26:36 +0200992 posix.stat(support.TESTFN + 'del') # should not raise exception
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000993 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700994 posix.unlink(support.TESTFN + 'del', dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000995 except:
996 support.unlink(support.TESTFN + 'del')
997 raise
998 else:
999 self.assertRaises(OSError, posix.stat, support.TESTFN + 'link')
1000 finally:
1001 posix.close(f)
1002
Larry Hastings9cf065c2012-06-22 16:30:09 -07001003 @unittest.skipUnless(os.mkfifo in os.supports_dir_fd, "test needs dir_fd support in os.mkfifo()")
1004 def test_mkfifo_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001005 support.unlink(support.TESTFN)
1006 f = posix.open(posix.getcwd(), posix.O_RDONLY)
1007 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -07001008 posix.mkfifo(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +00001009 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
1010 finally:
1011 posix.close(f)
1012
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001013 requires_sched_h = unittest.skipUnless(hasattr(posix, 'sched_yield'),
1014 "don't have scheduling support")
Antoine Pitrou84869872012-08-04 16:16:35 +02001015 requires_sched_affinity = unittest.skipUnless(hasattr(posix, 'sched_setaffinity'),
Benjamin Peterson50ba2712011-08-02 22:15:40 -05001016 "don't have sched affinity support")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001017
1018 @requires_sched_h
1019 def test_sched_yield(self):
1020 # This has no error conditions (at least on Linux).
1021 posix.sched_yield()
1022
1023 @requires_sched_h
Charles-François Nataliea0d5fc2011-09-06 19:03:35 +02001024 @unittest.skipUnless(hasattr(posix, 'sched_get_priority_max'),
1025 "requires sched_get_priority_max()")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001026 def test_sched_priority(self):
1027 # Round-robin usually has interesting priorities.
1028 pol = posix.SCHED_RR
1029 lo = posix.sched_get_priority_min(pol)
1030 hi = posix.sched_get_priority_max(pol)
1031 self.assertIsInstance(lo, int)
1032 self.assertIsInstance(hi, int)
1033 self.assertGreaterEqual(hi, lo)
Benjamin Peterson539b6c42011-08-02 22:09:37 -05001034 # OSX evidently just returns 15 without checking the argument.
1035 if sys.platform != "darwin":
Benjamin Petersonc1581582011-08-02 22:10:55 -05001036 self.assertRaises(OSError, posix.sched_get_priority_min, -23)
1037 self.assertRaises(OSError, posix.sched_get_priority_max, -23)
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001038
Benjamin Petersonc5fce4d2011-08-02 18:07:32 -05001039 @unittest.skipUnless(hasattr(posix, 'sched_setscheduler'), "can't change scheduler")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001040 def test_get_and_set_scheduler_and_param(self):
1041 possible_schedulers = [sched for name, sched in posix.__dict__.items()
1042 if name.startswith("SCHED_")]
1043 mine = posix.sched_getscheduler(0)
1044 self.assertIn(mine, possible_schedulers)
1045 try:
Jesus Ceaceb5d162011-09-10 01:16:55 +02001046 parent = posix.sched_getscheduler(os.getppid())
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001047 except OSError as e:
Jesus Ceaceb5d162011-09-10 01:16:55 +02001048 if e.errno != errno.EPERM:
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001049 raise
1050 else:
Jesus Ceaceb5d162011-09-10 01:16:55 +02001051 self.assertIn(parent, possible_schedulers)
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001052 self.assertRaises(OSError, posix.sched_getscheduler, -1)
1053 self.assertRaises(OSError, posix.sched_getparam, -1)
1054 param = posix.sched_getparam(0)
1055 self.assertIsInstance(param.sched_priority, int)
Charles-François Natali7b911cb2011-08-21 12:41:43 +02001056
Charles-François Natalib402a5c2013-01-13 14:13:25 +01001057 # POSIX states that calling sched_setparam() or sched_setscheduler() on
1058 # a process with a scheduling policy other than SCHED_FIFO or SCHED_RR
1059 # is implementation-defined: NetBSD and FreeBSD can return EINVAL.
1060 if not sys.platform.startswith(('freebsd', 'netbsd')):
1061 try:
1062 posix.sched_setscheduler(0, mine, param)
1063 posix.sched_setparam(0, param)
1064 except OSError as e:
1065 if e.errno != errno.EPERM:
1066 raise
Charles-François Natali7b911cb2011-08-21 12:41:43 +02001067 self.assertRaises(OSError, posix.sched_setparam, -1, param)
1068
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001069 self.assertRaises(OSError, posix.sched_setscheduler, -1, mine, param)
1070 self.assertRaises(TypeError, posix.sched_setscheduler, 0, mine, None)
1071 self.assertRaises(TypeError, posix.sched_setparam, 0, 43)
1072 param = posix.sched_param(None)
1073 self.assertRaises(TypeError, posix.sched_setparam, 0, param)
1074 large = 214748364700
1075 param = posix.sched_param(large)
1076 self.assertRaises(OverflowError, posix.sched_setparam, 0, param)
1077 param = posix.sched_param(sched_priority=-large)
1078 self.assertRaises(OverflowError, posix.sched_setparam, 0, param)
1079
Benjamin Petersonc5fce4d2011-08-02 18:07:32 -05001080 @unittest.skipUnless(hasattr(posix, "sched_rr_get_interval"), "no function")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001081 def test_sched_rr_get_interval(self):
Benjamin Peterson43234ab2011-08-02 22:19:14 -05001082 try:
1083 interval = posix.sched_rr_get_interval(0)
1084 except OSError as e:
1085 # This likely means that sched_rr_get_interval is only valid for
1086 # processes with the SCHED_RR scheduler in effect.
1087 if e.errno != errno.EINVAL:
1088 raise
1089 self.skipTest("only works on SCHED_RR processes")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001090 self.assertIsInstance(interval, float)
1091 # Reasonable constraints, I think.
1092 self.assertGreaterEqual(interval, 0.)
1093 self.assertLess(interval, 1.)
1094
Benjamin Peterson2740af82011-08-02 17:41:34 -05001095 @requires_sched_affinity
Antoine Pitrou84869872012-08-04 16:16:35 +02001096 def test_sched_getaffinity(self):
1097 mask = posix.sched_getaffinity(0)
1098 self.assertIsInstance(mask, set)
1099 self.assertGreaterEqual(len(mask), 1)
1100 self.assertRaises(OSError, posix.sched_getaffinity, -1)
1101 for cpu in mask:
1102 self.assertIsInstance(cpu, int)
1103 self.assertGreaterEqual(cpu, 0)
1104 self.assertLess(cpu, 1 << 32)
1105
1106 @requires_sched_affinity
1107 def test_sched_setaffinity(self):
1108 mask = posix.sched_getaffinity(0)
1109 if len(mask) > 1:
1110 # Empty masks are forbidden
1111 mask.pop()
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001112 posix.sched_setaffinity(0, mask)
Antoine Pitrou84869872012-08-04 16:16:35 +02001113 self.assertEqual(posix.sched_getaffinity(0), mask)
1114 self.assertRaises(OSError, posix.sched_setaffinity, 0, [])
1115 self.assertRaises(ValueError, posix.sched_setaffinity, 0, [-10])
1116 self.assertRaises(OverflowError, posix.sched_setaffinity, 0, [1<<128])
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001117 self.assertRaises(OSError, posix.sched_setaffinity, -1, mask)
1118
Victor Stinner8b905bd2011-10-25 13:34:04 +02001119 def test_rtld_constants(self):
1120 # check presence of major RTLD_* constants
1121 posix.RTLD_LAZY
1122 posix.RTLD_NOW
1123 posix.RTLD_GLOBAL
1124 posix.RTLD_LOCAL
1125
Jesus Cea60c13dd2012-06-23 02:58:14 +02001126 @unittest.skipUnless(hasattr(os, 'SEEK_HOLE'),
1127 "test needs an OS that reports file holes")
Hynek Schlawackf841e422012-06-24 09:51:46 +02001128 def test_fs_holes(self):
Jesus Cea94363612012-06-22 18:32:07 +02001129 # Even if the filesystem doesn't report holes,
1130 # if the OS supports it the SEEK_* constants
1131 # will be defined and will have a consistent
1132 # behaviour:
1133 # os.SEEK_DATA = current position
1134 # os.SEEK_HOLE = end of file position
Hynek Schlawackf841e422012-06-24 09:51:46 +02001135 with open(support.TESTFN, 'r+b') as fp:
Jesus Cea94363612012-06-22 18:32:07 +02001136 fp.write(b"hello")
1137 fp.flush()
1138 size = fp.tell()
1139 fno = fp.fileno()
Jesus Cead46f7d22012-07-07 14:56:04 +02001140 try :
1141 for i in range(size):
1142 self.assertEqual(i, os.lseek(fno, i, os.SEEK_DATA))
1143 self.assertLessEqual(size, os.lseek(fno, i, os.SEEK_HOLE))
1144 self.assertRaises(OSError, os.lseek, fno, size, os.SEEK_DATA)
1145 self.assertRaises(OSError, os.lseek, fno, size, os.SEEK_HOLE)
1146 except OSError :
1147 # Some OSs claim to support SEEK_HOLE/SEEK_DATA
1148 # but it is not true.
1149 # For instance:
1150 # http://lists.freebsd.org/pipermail/freebsd-amd64/2012-January/014332.html
1151 raise unittest.SkipTest("OSError raised!")
Jesus Cea94363612012-06-22 18:32:07 +02001152
Larry Hastingsb0827312014-02-09 22:05:19 -08001153 def test_path_error2(self):
1154 """
1155 Test functions that call path_error2(), providing two filenames in their exceptions.
1156 """
Victor Stinner047b7ae2014-10-05 17:37:41 +02001157 for name in ("rename", "replace", "link"):
Larry Hastingsb0827312014-02-09 22:05:19 -08001158 function = getattr(os, name, None)
Victor Stinnerbed04a72014-10-05 17:37:59 +02001159 if function is None:
1160 continue
Larry Hastingsb0827312014-02-09 22:05:19 -08001161
Victor Stinnerbed04a72014-10-05 17:37:59 +02001162 for dst in ("noodly2", support.TESTFN):
1163 try:
1164 function('doesnotexistfilename', dst)
1165 except OSError as e:
1166 self.assertIn("'doesnotexistfilename' -> '{}'".format(dst), str(e))
1167 break
1168 else:
1169 self.fail("No valid path_error2() test for os." + name)
Larry Hastingsb0827312014-02-09 22:05:19 -08001170
Serhiy Storchaka2b0d2002015-04-20 09:53:58 +03001171 def test_path_with_null_character(self):
1172 fn = support.TESTFN
1173 fn_with_NUL = fn + '\0'
1174 self.addCleanup(support.unlink, fn)
1175 support.unlink(fn)
1176 fd = None
1177 try:
Serhiy Storchaka7e9d1d12015-04-20 10:12:28 +03001178 with self.assertRaises(ValueError):
Serhiy Storchaka2b0d2002015-04-20 09:53:58 +03001179 fd = os.open(fn_with_NUL, os.O_WRONLY | os.O_CREAT) # raises
1180 finally:
1181 if fd is not None:
1182 os.close(fd)
1183 self.assertFalse(os.path.exists(fn))
Serhiy Storchaka7e9d1d12015-04-20 10:12:28 +03001184 self.assertRaises(ValueError, os.mkdir, fn_with_NUL)
Serhiy Storchaka2b0d2002015-04-20 09:53:58 +03001185 self.assertFalse(os.path.exists(fn))
1186 open(fn, 'wb').close()
Serhiy Storchaka7e9d1d12015-04-20 10:12:28 +03001187 self.assertRaises(ValueError, os.stat, fn_with_NUL)
Serhiy Storchaka2b0d2002015-04-20 09:53:58 +03001188
1189 def test_path_with_null_byte(self):
1190 fn = os.fsencode(support.TESTFN)
1191 fn_with_NUL = fn + b'\0'
1192 self.addCleanup(support.unlink, fn)
1193 support.unlink(fn)
1194 fd = None
1195 try:
1196 with self.assertRaises(ValueError):
1197 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))
1202 self.assertRaises(ValueError, os.mkdir, fn_with_NUL)
1203 self.assertFalse(os.path.exists(fn))
1204 open(fn, 'wb').close()
1205 self.assertRaises(ValueError, os.stat, fn_with_NUL)
1206
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001207class PosixGroupsTester(unittest.TestCase):
1208
1209 def setUp(self):
1210 if posix.getuid() != 0:
1211 raise unittest.SkipTest("not enough privileges")
1212 if not hasattr(posix, 'getgroups'):
1213 raise unittest.SkipTest("need posix.getgroups")
1214 if sys.platform == 'darwin':
1215 raise unittest.SkipTest("getgroups(2) is broken on OSX")
1216 self.saved_groups = posix.getgroups()
1217
1218 def tearDown(self):
1219 if hasattr(posix, 'setgroups'):
1220 posix.setgroups(self.saved_groups)
1221 elif hasattr(posix, 'initgroups'):
1222 name = pwd.getpwuid(posix.getuid()).pw_name
1223 posix.initgroups(name, self.saved_groups[0])
1224
1225 @unittest.skipUnless(hasattr(posix, 'initgroups'),
1226 "test needs posix.initgroups()")
1227 def test_initgroups(self):
1228 # find missing group
1229
Benjamin Peterson659a6f52014-03-01 19:14:12 -05001230 g = max(self.saved_groups or [0]) + 1
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001231 name = pwd.getpwuid(posix.getuid()).pw_name
1232 posix.initgroups(name, g)
1233 self.assertIn(g, posix.getgroups())
1234
1235 @unittest.skipUnless(hasattr(posix, 'setgroups'),
1236 "test needs posix.setgroups()")
1237 def test_setgroups(self):
Antoine Pitroue5a91012010-09-04 17:32:06 +00001238 for groups in [[0], list(range(16))]:
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001239 posix.setgroups(groups)
1240 self.assertListEqual(groups, posix.getgroups())
1241
Neal Norwitze241ce82003-02-17 18:17:05 +00001242def test_main():
Antoine Pitrou68c95922011-03-20 17:33:57 +01001243 try:
1244 support.run_unittest(PosixTester, PosixGroupsTester)
1245 finally:
1246 support.reap_children()
Neal Norwitze241ce82003-02-17 18:17:05 +00001247
1248if __name__ == '__main__':
1249 test_main()