blob: 9408e5c1b5859dc5bd584c05fa24758d3a9c1519 [file] [log] [blame]
Neal Norwitze241ce82003-02-17 18:17:05 +00001"Test posix functions"
2
Benjamin Petersonee8712c2008-05-20 21:35:26 +00003from test import support
R. David Murrayeb3615d2009-04-22 02:24:39 +00004
5# Skip these tests if there is no posix module.
6posix = support.import_module('posix')
Neal Norwitze241ce82003-02-17 18:17:05 +00007
Antoine Pitroub7572f02009-12-02 20:46:48 +00008import errno
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00009import sys
Neal Norwitze241ce82003-02-17 18:17:05 +000010import time
11import os
Charles-François Natali1e045b12011-05-22 20:42:32 +020012import fcntl
Charles-François Nataliab2d58e2012-04-17 19:48:35 +020013import platform
Christian Heimesd5e2b6f2008-03-19 21:50:51 +000014import pwd
Benjamin Petersondcf97b92008-07-02 17:30:14 +000015import shutil
Benjamin Peterson052a02b2010-08-17 01:27:09 +000016import stat
Ned Deilyba2eab22011-07-26 13:53:55 -070017import tempfile
Neal Norwitze241ce82003-02-17 18:17:05 +000018import unittest
19import warnings
R. David Murraya21e4ca2009-03-31 23:16:50 +000020
Ned Deilyba2eab22011-07-26 13:53:55 -070021_DUMMY_SYMLINK = os.path.join(tempfile.gettempdir(),
22 support.TESTFN + '-dummy-symlink')
Neal Norwitze241ce82003-02-17 18:17:05 +000023
24class PosixTester(unittest.TestCase):
25
26 def setUp(self):
27 # create empty file
Benjamin Petersonee8712c2008-05-20 21:35:26 +000028 fp = open(support.TESTFN, 'w+')
Neal Norwitze241ce82003-02-17 18:17:05 +000029 fp.close()
Ned Deily3eb67d52011-06-28 00:00:28 -070030 self.teardown_files = [ support.TESTFN ]
Brett Cannonc8d502e2010-03-20 21:53:28 +000031 self._warnings_manager = support.check_warnings()
32 self._warnings_manager.__enter__()
33 warnings.filterwarnings('ignore', '.* potential security risk .*',
34 RuntimeWarning)
Neal Norwitze241ce82003-02-17 18:17:05 +000035
36 def tearDown(self):
Ned Deily3eb67d52011-06-28 00:00:28 -070037 for teardown_file in self.teardown_files:
38 support.unlink(teardown_file)
Brett Cannonc8d502e2010-03-20 21:53:28 +000039 self._warnings_manager.__exit__(None, None, None)
Neal Norwitze241ce82003-02-17 18:17:05 +000040
41 def testNoArgFunctions(self):
42 # test posix functions which take no arguments and have
43 # no side-effects which we need to cleanup (e.g., fork, wait, abort)
Guido van Rossumf0af3e32008-10-02 18:55:37 +000044 NO_ARG_FUNCTIONS = [ "ctermid", "getcwd", "getcwdb", "uname",
Guido van Rossum687b9c02007-10-25 23:18:51 +000045 "times", "getloadavg",
Neal Norwitze241ce82003-02-17 18:17:05 +000046 "getegid", "geteuid", "getgid", "getgroups",
Ross Lagerwall7807c352011-03-17 20:20:30 +020047 "getpid", "getpgrp", "getppid", "getuid", "sync",
Neal Norwitze241ce82003-02-17 18:17:05 +000048 ]
Neal Norwitz71b13e82003-02-23 22:12:24 +000049
Neal Norwitze241ce82003-02-17 18:17:05 +000050 for name in NO_ARG_FUNCTIONS:
51 posix_func = getattr(posix, name, None)
52 if posix_func is not None:
53 posix_func()
Neal Norwitz2ff51a82003-02-17 22:40:31 +000054 self.assertRaises(TypeError, posix_func, 1)
Neal Norwitze241ce82003-02-17 18:17:05 +000055
Serhiy Storchaka79080682013-11-03 21:31:18 +020056 @unittest.skipUnless(hasattr(posix, 'getresuid'),
57 'test needs posix.getresuid()')
58 def test_getresuid(self):
59 user_ids = posix.getresuid()
60 self.assertEqual(len(user_ids), 3)
61 for val in user_ids:
62 self.assertGreaterEqual(val, 0)
Martin v. Löwis7aed61a2009-11-27 14:09:49 +000063
Serhiy Storchaka79080682013-11-03 21:31:18 +020064 @unittest.skipUnless(hasattr(posix, 'getresgid'),
65 'test needs posix.getresgid()')
66 def test_getresgid(self):
67 group_ids = posix.getresgid()
68 self.assertEqual(len(group_ids), 3)
69 for val in group_ids:
70 self.assertGreaterEqual(val, 0)
Martin v. Löwis7aed61a2009-11-27 14:09:49 +000071
Serhiy Storchaka79080682013-11-03 21:31:18 +020072 @unittest.skipUnless(hasattr(posix, 'setresuid'),
73 'test needs posix.setresuid()')
74 def test_setresuid(self):
75 current_user_ids = posix.getresuid()
76 self.assertIsNone(posix.setresuid(*current_user_ids))
77 # -1 means don't change that value.
78 self.assertIsNone(posix.setresuid(-1, -1, -1))
Martin v. Löwis7aed61a2009-11-27 14:09:49 +000079
Serhiy Storchaka79080682013-11-03 21:31:18 +020080 @unittest.skipUnless(hasattr(posix, 'setresuid'),
81 'test needs posix.setresuid()')
82 def test_setresuid_exception(self):
83 # Don't do this test if someone is silly enough to run us as root.
84 current_user_ids = posix.getresuid()
85 if 0 not in current_user_ids:
86 new_user_ids = (current_user_ids[0]+1, -1, -1)
87 self.assertRaises(OSError, posix.setresuid, *new_user_ids)
Martin v. Löwis7aed61a2009-11-27 14:09:49 +000088
Serhiy Storchaka79080682013-11-03 21:31:18 +020089 @unittest.skipUnless(hasattr(posix, 'setresgid'),
90 'test needs posix.setresgid()')
91 def test_setresgid(self):
92 current_group_ids = posix.getresgid()
93 self.assertIsNone(posix.setresgid(*current_group_ids))
94 # -1 means don't change that value.
95 self.assertIsNone(posix.setresgid(-1, -1, -1))
Martin v. Löwis7aed61a2009-11-27 14:09:49 +000096
Serhiy Storchaka79080682013-11-03 21:31:18 +020097 @unittest.skipUnless(hasattr(posix, 'setresgid'),
98 'test needs posix.setresgid()')
99 def test_setresgid_exception(self):
100 # Don't do this test if someone is silly enough to run us as root.
101 current_group_ids = posix.getresgid()
102 if 0 not in current_group_ids:
103 new_group_ids = (current_group_ids[0]+1, -1, -1)
104 self.assertRaises(OSError, posix.setresgid, *new_group_ids)
Martin v. Löwis7aed61a2009-11-27 14:09:49 +0000105
Antoine Pitroub7572f02009-12-02 20:46:48 +0000106 @unittest.skipUnless(hasattr(posix, 'initgroups'),
107 "test needs os.initgroups()")
108 def test_initgroups(self):
109 # It takes a string and an integer; check that it raises a TypeError
110 # for other argument lists.
111 self.assertRaises(TypeError, posix.initgroups)
112 self.assertRaises(TypeError, posix.initgroups, None)
113 self.assertRaises(TypeError, posix.initgroups, 3, "foo")
114 self.assertRaises(TypeError, posix.initgroups, "foo", 3, object())
115
116 # If a non-privileged user invokes it, it should fail with OSError
117 # EPERM.
118 if os.getuid() != 0:
Charles-François Natalie8a255a2012-05-02 20:01:38 +0200119 try:
120 name = pwd.getpwuid(posix.getuid()).pw_name
121 except KeyError:
122 # the current UID may not have a pwd entry
123 raise unittest.SkipTest("need a pwd entry")
Antoine Pitroub7572f02009-12-02 20:46:48 +0000124 try:
125 posix.initgroups(name, 13)
126 except OSError as e:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000127 self.assertEqual(e.errno, errno.EPERM)
Antoine Pitroub7572f02009-12-02 20:46:48 +0000128 else:
129 self.fail("Expected OSError to be raised by initgroups")
130
Serhiy Storchaka79080682013-11-03 21:31:18 +0200131 @unittest.skipUnless(hasattr(posix, 'statvfs'),
132 'test needs posix.statvfs()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000133 def test_statvfs(self):
Serhiy Storchaka79080682013-11-03 21:31:18 +0200134 self.assertTrue(posix.statvfs(os.curdir))
Neal Norwitze241ce82003-02-17 18:17:05 +0000135
Serhiy Storchaka79080682013-11-03 21:31:18 +0200136 @unittest.skipUnless(hasattr(posix, 'fstatvfs'),
137 'test needs posix.fstatvfs()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000138 def test_fstatvfs(self):
Serhiy Storchaka79080682013-11-03 21:31:18 +0200139 fp = open(support.TESTFN)
140 try:
141 self.assertTrue(posix.fstatvfs(fp.fileno()))
142 self.assertTrue(posix.statvfs(fp.fileno()))
143 finally:
144 fp.close()
Neal Norwitze241ce82003-02-17 18:17:05 +0000145
Serhiy Storchaka79080682013-11-03 21:31:18 +0200146 @unittest.skipUnless(hasattr(posix, 'ftruncate'),
147 'test needs posix.ftruncate()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000148 def test_ftruncate(self):
Serhiy Storchaka79080682013-11-03 21:31:18 +0200149 fp = open(support.TESTFN, 'w+')
150 try:
151 # we need to have some data to truncate
152 fp.write('test')
153 fp.flush()
154 posix.ftruncate(fp.fileno(), 0)
155 finally:
156 fp.close()
Neal Norwitze241ce82003-02-17 18:17:05 +0000157
Ross Lagerwall7807c352011-03-17 20:20:30 +0200158 @unittest.skipUnless(hasattr(posix, 'truncate'), "test needs posix.truncate()")
159 def test_truncate(self):
160 with open(support.TESTFN, 'w') as fp:
161 fp.write('test')
162 fp.flush()
163 posix.truncate(support.TESTFN, 0)
164
Larry Hastings9cf065c2012-06-22 16:30:09 -0700165 @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 +0200166 @unittest.skipUnless(hasattr(os, 'fork'), "test needs os.fork()")
Ross Lagerwalldedf6cf2011-03-20 18:27:05 +0200167 @unittest.skipUnless(hasattr(os, 'waitpid'), "test needs os.waitpid()")
Ross Lagerwall7807c352011-03-17 20:20:30 +0200168 def test_fexecve(self):
169 fp = os.open(sys.executable, os.O_RDONLY)
170 try:
171 pid = os.fork()
172 if pid == 0:
173 os.chdir(os.path.split(sys.executable)[0])
Larry Hastings9cf065c2012-06-22 16:30:09 -0700174 posix.execve(fp, [sys.executable, '-c', 'pass'], os.environ)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200175 else:
Ross Lagerwalldedf6cf2011-03-20 18:27:05 +0200176 self.assertEqual(os.waitpid(pid, 0), (pid, 0))
Ross Lagerwall7807c352011-03-17 20:20:30 +0200177 finally:
178 os.close(fp)
179
180 @unittest.skipUnless(hasattr(posix, 'waitid'), "test needs posix.waitid()")
181 @unittest.skipUnless(hasattr(os, 'fork'), "test needs os.fork()")
182 def test_waitid(self):
183 pid = os.fork()
184 if pid == 0:
185 os.chdir(os.path.split(sys.executable)[0])
186 posix.execve(sys.executable, [sys.executable, '-c', 'pass'], os.environ)
187 else:
188 res = posix.waitid(posix.P_PID, pid, posix.WEXITED)
189 self.assertEqual(pid, res.si_pid)
190
191 @unittest.skipUnless(hasattr(posix, 'lockf'), "test needs posix.lockf()")
192 def test_lockf(self):
193 fd = os.open(support.TESTFN, os.O_WRONLY | os.O_CREAT)
194 try:
195 os.write(fd, b'test')
196 os.lseek(fd, 0, os.SEEK_SET)
197 posix.lockf(fd, posix.F_LOCK, 4)
198 # section is locked
199 posix.lockf(fd, posix.F_ULOCK, 4)
200 finally:
201 os.close(fd)
202
203 @unittest.skipUnless(hasattr(posix, 'pread'), "test needs posix.pread()")
204 def test_pread(self):
205 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
206 try:
207 os.write(fd, b'test')
208 os.lseek(fd, 0, os.SEEK_SET)
209 self.assertEqual(b'es', posix.pread(fd, 2, 1))
Florent Xiclunae41f0de2011-11-11 19:39:25 +0100210 # the first pread() shouldn't disturb the file offset
Ross Lagerwall7807c352011-03-17 20:20:30 +0200211 self.assertEqual(b'te', posix.read(fd, 2))
212 finally:
213 os.close(fd)
214
215 @unittest.skipUnless(hasattr(posix, 'pwrite'), "test needs posix.pwrite()")
216 def test_pwrite(self):
217 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
218 try:
219 os.write(fd, b'test')
220 os.lseek(fd, 0, os.SEEK_SET)
221 posix.pwrite(fd, b'xx', 1)
222 self.assertEqual(b'txxt', posix.read(fd, 4))
223 finally:
224 os.close(fd)
225
226 @unittest.skipUnless(hasattr(posix, 'posix_fallocate'),
227 "test needs posix.posix_fallocate()")
228 def test_posix_fallocate(self):
229 fd = os.open(support.TESTFN, os.O_WRONLY | os.O_CREAT)
230 try:
231 posix.posix_fallocate(fd, 0, 10)
232 except OSError as inst:
233 # issue10812, ZFS doesn't appear to support posix_fallocate,
234 # so skip Solaris-based since they are likely to have ZFS.
235 if inst.errno != errno.EINVAL or not sys.platform.startswith("sunos"):
236 raise
237 finally:
238 os.close(fd)
239
240 @unittest.skipUnless(hasattr(posix, 'posix_fadvise'),
241 "test needs posix.posix_fadvise()")
242 def test_posix_fadvise(self):
243 fd = os.open(support.TESTFN, os.O_RDONLY)
244 try:
245 posix.posix_fadvise(fd, 0, 0, posix.POSIX_FADV_WILLNEED)
246 finally:
247 os.close(fd)
248
Larry Hastings9cf065c2012-06-22 16:30:09 -0700249 @unittest.skipUnless(os.utime in os.supports_fd, "test needs fd support in os.utime")
250 def test_utime_with_fd(self):
Ross Lagerwall7807c352011-03-17 20:20:30 +0200251 now = time.time()
252 fd = os.open(support.TESTFN, os.O_RDONLY)
253 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700254 posix.utime(fd)
255 posix.utime(fd, None)
256 self.assertRaises(TypeError, posix.utime, fd, (None, None))
257 self.assertRaises(TypeError, posix.utime, fd, (now, None))
258 self.assertRaises(TypeError, posix.utime, fd, (None, now))
259 posix.utime(fd, (int(now), int(now)))
260 posix.utime(fd, (now, now))
261 self.assertRaises(ValueError, posix.utime, fd, (now, now), ns=(now, now))
262 self.assertRaises(ValueError, posix.utime, fd, (now, 0), ns=(None, None))
263 self.assertRaises(ValueError, posix.utime, fd, (None, None), ns=(now, 0))
264 posix.utime(fd, (int(now), int((now - int(now)) * 1e9)))
265 posix.utime(fd, ns=(int(now), int((now - int(now)) * 1e9)))
266
Ross Lagerwall7807c352011-03-17 20:20:30 +0200267 finally:
268 os.close(fd)
269
Larry Hastings9cf065c2012-06-22 16:30:09 -0700270 @unittest.skipUnless(os.utime in os.supports_follow_symlinks, "test needs follow_symlinks support in os.utime")
271 def test_utime_nofollow_symlinks(self):
Ross Lagerwall7807c352011-03-17 20:20:30 +0200272 now = time.time()
Larry Hastings9cf065c2012-06-22 16:30:09 -0700273 posix.utime(support.TESTFN, None, follow_symlinks=False)
274 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None), follow_symlinks=False)
275 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None), follow_symlinks=False)
276 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now), follow_symlinks=False)
277 posix.utime(support.TESTFN, (int(now), int(now)), follow_symlinks=False)
278 posix.utime(support.TESTFN, (now, now), follow_symlinks=False)
279 posix.utime(support.TESTFN, follow_symlinks=False)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200280
281 @unittest.skipUnless(hasattr(posix, 'writev'), "test needs posix.writev()")
282 def test_writev(self):
283 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
284 try:
Victor Stinner57ddf782014-01-08 15:21:28 +0100285 n = os.writev(fd, (b'test1', b'tt2', b't3'))
286 self.assertEqual(n, 10)
287
Ross Lagerwall7807c352011-03-17 20:20:30 +0200288 os.lseek(fd, 0, os.SEEK_SET)
289 self.assertEqual(b'test1tt2t3', posix.read(fd, 10))
Victor Stinner57ddf782014-01-08 15:21:28 +0100290
291 # Issue #20113: empty list of buffers should not crash
Victor Stinnercd5ca6a2014-01-08 16:01:31 +0100292 try:
293 size = posix.writev(fd, [])
294 except OSError:
295 # writev(fd, []) raises OSError(22, "Invalid argument")
296 # on OpenIndiana
297 pass
298 else:
299 self.assertEqual(size, 0)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200300 finally:
301 os.close(fd)
302
303 @unittest.skipUnless(hasattr(posix, 'readv'), "test needs posix.readv()")
304 def test_readv(self):
305 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
306 try:
307 os.write(fd, b'test1tt2t3')
308 os.lseek(fd, 0, os.SEEK_SET)
309 buf = [bytearray(i) for i in [5, 3, 2]]
310 self.assertEqual(posix.readv(fd, buf), 10)
311 self.assertEqual([b'test1', b'tt2', b't3'], [bytes(i) for i in buf])
Victor Stinner57ddf782014-01-08 15:21:28 +0100312
313 # Issue #20113: empty list of buffers should not crash
Victor Stinnercd5ca6a2014-01-08 16:01:31 +0100314 try:
315 size = posix.readv(fd, [])
316 except OSError:
317 # readv(fd, []) raises OSError(22, "Invalid argument")
318 # on OpenIndiana
319 pass
320 else:
321 self.assertEqual(size, 0)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200322 finally:
323 os.close(fd)
324
Serhiy Storchaka79080682013-11-03 21:31:18 +0200325 @unittest.skipUnless(hasattr(posix, 'dup'),
326 'test needs posix.dup()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000327 def test_dup(self):
Serhiy Storchaka79080682013-11-03 21:31:18 +0200328 fp = open(support.TESTFN)
329 try:
330 fd = posix.dup(fp.fileno())
331 self.assertIsInstance(fd, int)
332 os.close(fd)
333 finally:
334 fp.close()
Neal Norwitze241ce82003-02-17 18:17:05 +0000335
Serhiy Storchaka79080682013-11-03 21:31:18 +0200336 @unittest.skipUnless(hasattr(posix, 'confstr'),
337 'test needs posix.confstr()')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000338 def test_confstr(self):
Serhiy Storchaka79080682013-11-03 21:31:18 +0200339 self.assertRaises(ValueError, posix.confstr, "CS_garbage")
340 self.assertEqual(len(posix.confstr("CS_PATH")) > 0, True)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000341
Serhiy Storchaka79080682013-11-03 21:31:18 +0200342 @unittest.skipUnless(hasattr(posix, 'dup2'),
343 'test needs posix.dup2()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000344 def test_dup2(self):
Serhiy Storchaka79080682013-11-03 21:31:18 +0200345 fp1 = open(support.TESTFN)
346 fp2 = open(support.TESTFN)
347 try:
348 posix.dup2(fp1.fileno(), fp2.fileno())
349 finally:
350 fp1.close()
351 fp2.close()
Neal Norwitze241ce82003-02-17 18:17:05 +0000352
Charles-François Natali1e045b12011-05-22 20:42:32 +0200353 @unittest.skipUnless(hasattr(os, 'O_CLOEXEC'), "needs os.O_CLOEXEC")
Charles-François Natali239bb962011-06-03 12:55:15 +0200354 @support.requires_linux_version(2, 6, 23)
Charles-François Natali1e045b12011-05-22 20:42:32 +0200355 def test_oscloexec(self):
356 fd = os.open(support.TESTFN, os.O_RDONLY|os.O_CLOEXEC)
357 self.addCleanup(os.close, fd)
Victor Stinnere36f3752011-05-24 00:29:43 +0200358 self.assertTrue(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Charles-François Natali1e045b12011-05-22 20:42:32 +0200359
Serhiy Storchaka79080682013-11-03 21:31:18 +0200360 @unittest.skipUnless(hasattr(posix, 'O_EXLOCK'),
361 'test needs posix.O_EXLOCK')
Skip Montanaro98470002005-06-17 01:14:49 +0000362 def test_osexlock(self):
Serhiy Storchaka79080682013-11-03 21:31:18 +0200363 fd = os.open(support.TESTFN,
364 os.O_WRONLY|os.O_EXLOCK|os.O_CREAT)
365 self.assertRaises(OSError, os.open, support.TESTFN,
366 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
367 os.close(fd)
368
369 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000370 fd = os.open(support.TESTFN,
Serhiy Storchaka79080682013-11-03 21:31:18 +0200371 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000372 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000373 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
374 os.close(fd)
375
Serhiy Storchaka79080682013-11-03 21:31:18 +0200376 @unittest.skipUnless(hasattr(posix, 'O_SHLOCK'),
377 'test needs posix.O_SHLOCK')
Skip Montanaro98470002005-06-17 01:14:49 +0000378 def test_osshlock(self):
Serhiy Storchaka79080682013-11-03 21:31:18 +0200379 fd1 = os.open(support.TESTFN,
380 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
381 fd2 = os.open(support.TESTFN,
382 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
383 os.close(fd2)
384 os.close(fd1)
385
386 if hasattr(posix, "O_EXLOCK"):
387 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000388 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Serhiy Storchaka79080682013-11-03 21:31:18 +0200389 self.assertRaises(OSError, os.open, support.TESTFN,
390 os.O_RDONLY|os.O_EXLOCK|os.O_NONBLOCK)
391 os.close(fd)
Skip Montanaro98470002005-06-17 01:14:49 +0000392
Serhiy Storchaka79080682013-11-03 21:31:18 +0200393 @unittest.skipUnless(hasattr(posix, 'fstat'),
394 'test needs posix.fstat()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000395 def test_fstat(self):
Serhiy Storchaka79080682013-11-03 21:31:18 +0200396 fp = open(support.TESTFN)
397 try:
398 self.assertTrue(posix.fstat(fp.fileno()))
399 self.assertTrue(posix.stat(fp.fileno()))
Serhiy Storchakaa2ad5c32013-01-07 23:13:46 +0200400
Serhiy Storchaka79080682013-11-03 21:31:18 +0200401 self.assertRaisesRegex(TypeError,
402 'should be string, bytes or integer, not',
403 posix.stat, float(fp.fileno()))
404 finally:
405 fp.close()
Neal Norwitze241ce82003-02-17 18:17:05 +0000406
Serhiy Storchaka79080682013-11-03 21:31:18 +0200407 @unittest.skipUnless(hasattr(posix, 'stat'),
408 'test needs posix.stat()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000409 def test_stat(self):
Serhiy Storchaka79080682013-11-03 21:31:18 +0200410 self.assertTrue(posix.stat(support.TESTFN))
411 self.assertTrue(posix.stat(os.fsencode(support.TESTFN)))
412 self.assertTrue(posix.stat(bytearray(os.fsencode(support.TESTFN))))
Serhiy Storchakaa2ad5c32013-01-07 23:13:46 +0200413
Serhiy Storchaka79080682013-11-03 21:31:18 +0200414 self.assertRaisesRegex(TypeError,
415 'can\'t specify None for path argument',
416 posix.stat, None)
417 self.assertRaisesRegex(TypeError,
418 'should be string, bytes or integer, not',
419 posix.stat, list(support.TESTFN))
420 self.assertRaisesRegex(TypeError,
421 'should be string, bytes or integer, not',
422 posix.stat, list(os.fsencode(support.TESTFN)))
Neal Norwitze241ce82003-02-17 18:17:05 +0000423
Benjamin Peterson052a02b2010-08-17 01:27:09 +0000424 @unittest.skipUnless(hasattr(posix, 'mkfifo'), "don't have mkfifo()")
425 def test_mkfifo(self):
426 support.unlink(support.TESTFN)
427 posix.mkfifo(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR)
428 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
429
430 @unittest.skipUnless(hasattr(posix, 'mknod') and hasattr(stat, 'S_IFIFO'),
431 "don't have mknod()/S_IFIFO")
432 def test_mknod(self):
433 # Test using mknod() to create a FIFO (the only use specified
434 # by POSIX).
435 support.unlink(support.TESTFN)
436 mode = stat.S_IFIFO | stat.S_IRUSR | stat.S_IWUSR
437 try:
438 posix.mknod(support.TESTFN, mode, 0)
439 except OSError as e:
440 # Some old systems don't allow unprivileged users to use
441 # mknod(), or only support creating device nodes.
442 self.assertIn(e.errno, (errno.EPERM, errno.EINVAL))
443 else:
444 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
445
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200446 def _test_all_chown_common(self, chown_func, first_param, stat_func):
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000447 """Common code for chown, fchown and lchown tests."""
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200448 def check_stat(uid, gid):
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200449 if stat_func is not None:
450 stat = stat_func(first_param)
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200451 self.assertEqual(stat.st_uid, uid)
452 self.assertEqual(stat.st_gid, gid)
453 uid = os.getuid()
454 gid = os.getgid()
Charles-François Nataliab2d58e2012-04-17 19:48:35 +0200455 # test a successful chown call
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200456 chown_func(first_param, uid, gid)
457 check_stat(uid, gid)
458 chown_func(first_param, -1, gid)
459 check_stat(uid, gid)
460 chown_func(first_param, uid, -1)
461 check_stat(uid, gid)
Charles-François Nataliab2d58e2012-04-17 19:48:35 +0200462
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200463 if uid == 0:
464 # Try an amusingly large uid/gid to make sure we handle
465 # large unsigned values. (chown lets you use any
466 # uid/gid you like, even if they aren't defined.)
467 #
468 # This problem keeps coming up:
469 # http://bugs.python.org/issue1747858
470 # http://bugs.python.org/issue4591
471 # http://bugs.python.org/issue15301
472 # Hopefully the fix in 4591 fixes it for good!
473 #
474 # This part of the test only runs when run as root.
475 # Only scary people run their tests as root.
476
477 big_value = 2**31
478 chown_func(first_param, big_value, big_value)
479 check_stat(big_value, big_value)
480 chown_func(first_param, -1, -1)
481 check_stat(big_value, big_value)
482 chown_func(first_param, uid, gid)
483 check_stat(uid, gid)
Charles-François Nataliab2d58e2012-04-17 19:48:35 +0200484 elif platform.system() in ('HP-UX', 'SunOS'):
485 # HP-UX and Solaris can allow a non-root user to chown() to root
486 # (issue #5113)
487 raise unittest.SkipTest("Skipping because of non-standard chown() "
488 "behavior")
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000489 else:
490 # non-root cannot chown to root, raises OSError
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200491 self.assertRaises(OSError, chown_func, first_param, 0, 0)
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200492 check_stat(uid, gid)
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200493 self.assertRaises(OSError, chown_func, first_param, 0, -1)
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200494 check_stat(uid, gid)
Serhiy Storchakaa2964b32013-02-21 14:34:36 +0200495 if 0 not in os.getgroups():
Serhiy Storchakab3d62ce2013-02-20 19:48:22 +0200496 self.assertRaises(OSError, chown_func, first_param, -1, 0)
497 check_stat(uid, gid)
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200498 # test illegal types
499 for t in str, float:
500 self.assertRaises(TypeError, chown_func, first_param, t(uid), gid)
501 check_stat(uid, gid)
502 self.assertRaises(TypeError, chown_func, first_param, uid, t(gid))
503 check_stat(uid, gid)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000504
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000505 @unittest.skipUnless(hasattr(posix, 'chown'), "test needs os.chown()")
506 def test_chown(self):
507 # raise an OSError if the file does not exist
508 os.unlink(support.TESTFN)
509 self.assertRaises(OSError, posix.chown, support.TESTFN, -1, -1)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000510
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000511 # re-create the file
Victor Stinnerbf816222011-06-30 23:25:47 +0200512 support.create_empty_file(support.TESTFN)
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200513 self._test_all_chown_common(posix.chown, support.TESTFN,
514 getattr(posix, 'stat', None))
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000515
516 @unittest.skipUnless(hasattr(posix, 'fchown'), "test needs os.fchown()")
517 def test_fchown(self):
518 os.unlink(support.TESTFN)
519
520 # re-create the file
521 test_file = open(support.TESTFN, 'w')
522 try:
523 fd = test_file.fileno()
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200524 self._test_all_chown_common(posix.fchown, fd,
525 getattr(posix, 'fstat', None))
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000526 finally:
527 test_file.close()
528
529 @unittest.skipUnless(hasattr(posix, 'lchown'), "test needs os.lchown()")
530 def test_lchown(self):
531 os.unlink(support.TESTFN)
532 # create a symlink
Ned Deily3eb67d52011-06-28 00:00:28 -0700533 os.symlink(_DUMMY_SYMLINK, support.TESTFN)
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200534 self._test_all_chown_common(posix.lchown, support.TESTFN,
535 getattr(posix, 'lstat', None))
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000536
Serhiy Storchaka79080682013-11-03 21:31:18 +0200537 @unittest.skipUnless(hasattr(posix, 'chdir'), 'test needs posix.chdir()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000538 def test_chdir(self):
Serhiy Storchaka79080682013-11-03 21:31:18 +0200539 posix.chdir(os.curdir)
540 self.assertRaises(OSError, posix.chdir, support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000541
Martin v. Löwisc9e1c7d2010-07-23 12:16:41 +0000542 def test_listdir(self):
Larry Hastingsfdaea062012-06-25 04:42:23 -0700543 self.assertTrue(support.TESTFN in posix.listdir(os.curdir))
Martin v. Löwisc9e1c7d2010-07-23 12:16:41 +0000544
545 def test_listdir_default(self):
Larry Hastingsfdaea062012-06-25 04:42:23 -0700546 # When listdir is called without argument,
547 # it's the same as listdir(os.curdir).
548 self.assertTrue(support.TESTFN in posix.listdir())
Neal Norwitze241ce82003-02-17 18:17:05 +0000549
Larry Hastingsfdaea062012-06-25 04:42:23 -0700550 def test_listdir_bytes(self):
551 # When listdir is called with a bytes object,
552 # the returned strings are of type bytes.
553 self.assertTrue(os.fsencode(support.TESTFN) in posix.listdir(b'.'))
554
555 @unittest.skipUnless(posix.listdir in os.supports_fd,
556 "test needs fd support for posix.listdir()")
557 def test_listdir_fd(self):
Antoine Pitrou8250e232011-02-25 23:41:16 +0000558 f = posix.open(posix.getcwd(), posix.O_RDONLY)
Charles-François Natali7546ad32012-01-08 18:34:06 +0100559 self.addCleanup(posix.close, f)
Antoine Pitrou8250e232011-02-25 23:41:16 +0000560 self.assertEqual(
561 sorted(posix.listdir('.')),
Larry Hastings9cf065c2012-06-22 16:30:09 -0700562 sorted(posix.listdir(f))
Antoine Pitrou8250e232011-02-25 23:41:16 +0000563 )
Charles-François Natali7546ad32012-01-08 18:34:06 +0100564 # Check that the fd offset was reset (issue #13739)
Charles-François Natali7546ad32012-01-08 18:34:06 +0100565 self.assertEqual(
566 sorted(posix.listdir('.')),
Larry Hastings9cf065c2012-06-22 16:30:09 -0700567 sorted(posix.listdir(f))
Charles-François Natali7546ad32012-01-08 18:34:06 +0100568 )
Antoine Pitrou8250e232011-02-25 23:41:16 +0000569
Serhiy Storchaka79080682013-11-03 21:31:18 +0200570 @unittest.skipUnless(hasattr(posix, 'access'), 'test needs posix.access()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000571 def test_access(self):
Serhiy Storchaka79080682013-11-03 21:31:18 +0200572 self.assertTrue(posix.access(support.TESTFN, os.R_OK))
Neal Norwitze241ce82003-02-17 18:17:05 +0000573
Serhiy Storchaka79080682013-11-03 21:31:18 +0200574 @unittest.skipUnless(hasattr(posix, 'umask'), 'test needs posix.umask()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000575 def test_umask(self):
Serhiy Storchaka79080682013-11-03 21:31:18 +0200576 old_mask = posix.umask(0)
577 self.assertIsInstance(old_mask, int)
578 posix.umask(old_mask)
Neal Norwitze241ce82003-02-17 18:17:05 +0000579
Serhiy Storchaka79080682013-11-03 21:31:18 +0200580 @unittest.skipUnless(hasattr(posix, 'strerror'),
581 'test needs posix.strerror()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000582 def test_strerror(self):
Serhiy Storchaka79080682013-11-03 21:31:18 +0200583 self.assertTrue(posix.strerror(0))
Neal Norwitze241ce82003-02-17 18:17:05 +0000584
Serhiy Storchaka79080682013-11-03 21:31:18 +0200585 @unittest.skipUnless(hasattr(posix, 'pipe'), 'test needs posix.pipe()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000586 def test_pipe(self):
Serhiy Storchaka79080682013-11-03 21:31:18 +0200587 reader, writer = posix.pipe()
588 os.close(reader)
589 os.close(writer)
Neal Norwitze241ce82003-02-17 18:17:05 +0000590
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200591 @unittest.skipUnless(hasattr(os, 'pipe2'), "test needs os.pipe2()")
Charles-François Natali239bb962011-06-03 12:55:15 +0200592 @support.requires_linux_version(2, 6, 27)
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200593 def test_pipe2(self):
594 self.assertRaises(TypeError, os.pipe2, 'DEADBEEF')
595 self.assertRaises(TypeError, os.pipe2, 0, 0)
596
Charles-François Natali368f34b2011-06-06 19:49:47 +0200597 # try calling with flags = 0, like os.pipe()
598 r, w = os.pipe2(0)
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200599 os.close(r)
600 os.close(w)
601
602 # test flags
603 r, w = os.pipe2(os.O_CLOEXEC|os.O_NONBLOCK)
604 self.addCleanup(os.close, r)
605 self.addCleanup(os.close, w)
606 self.assertTrue(fcntl.fcntl(r, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
607 self.assertTrue(fcntl.fcntl(w, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
608 # try reading from an empty pipe: this should fail, not block
609 self.assertRaises(OSError, os.read, r, 1)
610 # try a write big enough to fill-up the pipe: this should either
611 # fail or perform a partial write, not block
612 try:
613 os.write(w, b'x' * support.PIPE_MAX_SIZE)
614 except OSError:
615 pass
616
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +0200617 @support.cpython_only
618 @unittest.skipUnless(hasattr(os, 'pipe2'), "test needs os.pipe2()")
619 @support.requires_linux_version(2, 6, 27)
620 def test_pipe2_c_limits(self):
Serhiy Storchaka9101e232013-01-19 12:41:45 +0200621 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +0200622 import _testcapi
Serhiy Storchaka9101e232013-01-19 12:41:45 +0200623 self.assertRaises(OverflowError, os.pipe2, _testcapi.INT_MAX + 1)
624 self.assertRaises(OverflowError, os.pipe2, _testcapi.UINT_MAX + 1)
625
Serhiy Storchaka79080682013-11-03 21:31:18 +0200626 @unittest.skipUnless(hasattr(posix, 'utime'), 'test needs posix.utime()')
Neal Norwitze241ce82003-02-17 18:17:05 +0000627 def test_utime(self):
Serhiy Storchaka79080682013-11-03 21:31:18 +0200628 now = time.time()
629 posix.utime(support.TESTFN, None)
630 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None))
631 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None))
632 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now))
633 posix.utime(support.TESTFN, (int(now), int(now)))
634 posix.utime(support.TESTFN, (now, now))
Neal Norwitze241ce82003-02-17 18:17:05 +0000635
Larry Hastings9cf065c2012-06-22 16:30:09 -0700636 def _test_chflags_regular_file(self, chflags_func, target_file, **kwargs):
Ned Deily3eb67d52011-06-28 00:00:28 -0700637 st = os.stat(target_file)
638 self.assertTrue(hasattr(st, 'st_flags'))
Trent Nelson75959cf2012-08-21 23:59:31 +0000639
640 # ZFS returns EOPNOTSUPP when attempting to set flag UF_IMMUTABLE.
641 flags = st.st_flags | stat.UF_IMMUTABLE
642 try:
643 chflags_func(target_file, flags, **kwargs)
644 except OSError as err:
645 if err.errno != errno.EOPNOTSUPP:
646 raise
647 msg = 'chflag UF_IMMUTABLE not supported by underlying fs'
648 self.skipTest(msg)
649
Ned Deily3eb67d52011-06-28 00:00:28 -0700650 try:
651 new_st = os.stat(target_file)
652 self.assertEqual(st.st_flags | stat.UF_IMMUTABLE, new_st.st_flags)
653 try:
654 fd = open(target_file, 'w+')
655 except IOError as e:
656 self.assertEqual(e.errno, errno.EPERM)
657 finally:
658 posix.chflags(target_file, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000659
Ned Deily3eb67d52011-06-28 00:00:28 -0700660 @unittest.skipUnless(hasattr(posix, 'chflags'), 'test needs os.chflags()')
661 def test_chflags(self):
662 self._test_chflags_regular_file(posix.chflags, support.TESTFN)
663
664 @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
665 def test_lchflags_regular_file(self):
666 self._test_chflags_regular_file(posix.lchflags, support.TESTFN)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700667 self._test_chflags_regular_file(posix.chflags, support.TESTFN, follow_symlinks=False)
Ned Deily3eb67d52011-06-28 00:00:28 -0700668
669 @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
670 def test_lchflags_symlink(self):
671 testfn_st = os.stat(support.TESTFN)
672
673 self.assertTrue(hasattr(testfn_st, 'st_flags'))
674
675 os.symlink(support.TESTFN, _DUMMY_SYMLINK)
676 self.teardown_files.append(_DUMMY_SYMLINK)
677 dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
678
Larry Hastings9cf065c2012-06-22 16:30:09 -0700679 def chflags_nofollow(path, flags):
680 return posix.chflags(path, flags, follow_symlinks=False)
Ned Deily3eb67d52011-06-28 00:00:28 -0700681
Larry Hastings9cf065c2012-06-22 16:30:09 -0700682 for fn in (posix.lchflags, chflags_nofollow):
Trent Nelson75959cf2012-08-21 23:59:31 +0000683 # ZFS returns EOPNOTSUPP when attempting to set flag UF_IMMUTABLE.
684 flags = dummy_symlink_st.st_flags | stat.UF_IMMUTABLE
685 try:
686 fn(_DUMMY_SYMLINK, flags)
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)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700692 try:
693 new_testfn_st = os.stat(support.TESTFN)
694 new_dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
695
696 self.assertEqual(testfn_st.st_flags, new_testfn_st.st_flags)
697 self.assertEqual(dummy_symlink_st.st_flags | stat.UF_IMMUTABLE,
698 new_dummy_symlink_st.st_flags)
699 finally:
700 fn(_DUMMY_SYMLINK, dummy_symlink_st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000701
Guido van Rossum98297ee2007-11-06 21:34:58 +0000702 def test_environ(self):
Victor Stinner17b490d2010-05-06 22:19:30 +0000703 if os.name == "nt":
704 item_type = str
705 else:
706 item_type = bytes
Guido van Rossum98297ee2007-11-06 21:34:58 +0000707 for k, v in posix.environ.items():
Victor Stinner17b490d2010-05-06 22:19:30 +0000708 self.assertEqual(type(k), item_type)
709 self.assertEqual(type(v), item_type)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000710
Serhiy Storchaka79080682013-11-03 21:31:18 +0200711 @unittest.skipUnless(hasattr(posix, 'getcwd'), 'test needs posix.getcwd()')
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000712 def test_getcwd_long_pathnames(self):
713 if hasattr(posix, 'getcwd'):
714 dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef'
715 curdir = os.getcwd()
716 base_path = os.path.abspath(support.TESTFN) + '.getcwd'
717
718 try:
719 os.mkdir(base_path)
720 os.chdir(base_path)
721 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000722# Just returning nothing instead of the SkipTest exception,
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000723# because the test results in Error in that case.
724# Is that ok?
Benjamin Petersone549ead2009-03-28 21:42:05 +0000725# raise unittest.SkipTest("cannot create directory for testing")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000726 return
727
728 def _create_and_do_getcwd(dirname, current_path_length = 0):
729 try:
730 os.mkdir(dirname)
731 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000732 raise unittest.SkipTest("mkdir cannot create directory sufficiently deep for getcwd test")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000733
734 os.chdir(dirname)
735 try:
736 os.getcwd()
737 if current_path_length < 1027:
738 _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
739 finally:
740 os.chdir('..')
741 os.rmdir(dirname)
742
743 _create_and_do_getcwd(dirname)
744
745 finally:
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000746 os.chdir(curdir)
R. David Murray414c91f2009-07-09 20:12:31 +0000747 support.rmtree(base_path)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000748
Ross Lagerwallb0ae53d2011-06-10 07:30:30 +0200749 @unittest.skipUnless(hasattr(posix, 'getgrouplist'), "test needs posix.getgrouplist()")
750 @unittest.skipUnless(hasattr(pwd, 'getpwuid'), "test needs pwd.getpwuid()")
751 @unittest.skipUnless(hasattr(os, 'getuid'), "test needs os.getuid()")
752 def test_getgrouplist(self):
Ross Lagerwalla0b315f2012-12-13 15:20:26 +0000753 user = pwd.getpwuid(os.getuid())[0]
754 group = pwd.getpwuid(os.getuid())[3]
755 self.assertIn(group, posix.getgrouplist(user, group))
Ross Lagerwallb0ae53d2011-06-10 07:30:30 +0200756
Ross Lagerwallb0ae53d2011-06-10 07:30:30 +0200757
Antoine Pitrou318b8f32011-01-12 18:45:27 +0000758 @unittest.skipUnless(hasattr(os, 'getegid'), "test needs os.getegid()")
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000759 def test_getgroups(self):
760 with os.popen('id -G') as idg:
761 groups = idg.read().strip()
Charles-François Natalie8a255a2012-05-02 20:01:38 +0200762 ret = idg.close()
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000763
Benjamin Petersonb29614e2012-10-09 11:16:03 -0400764 if ret is not None or not groups:
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000765 raise unittest.SkipTest("need working 'id -G'")
766
Ned Deily028915e2013-02-02 15:08:52 -0800767 # Issues 16698: OS X ABIs prior to 10.6 have limits on getgroups()
768 if sys.platform == 'darwin':
769 import sysconfig
770 dt = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') or '10.0'
771 if float(dt) < 10.6:
772 raise unittest.SkipTest("getgroups(2) is broken prior to 10.6")
773
Ronald Oussoren7fb6f512010-08-01 19:18:13 +0000774 # 'id -G' and 'os.getgroups()' should return the same
775 # groups, ignoring order and duplicates.
Antoine Pitrou318b8f32011-01-12 18:45:27 +0000776 # #10822 - it is implementation defined whether posix.getgroups()
777 # includes the effective gid so we include it anyway, since id -G does
Ronald Oussorencb615e62010-07-24 14:15:19 +0000778 self.assertEqual(
Ronald Oussoren7fb6f512010-08-01 19:18:13 +0000779 set([int(x) for x in groups.split()]),
Antoine Pitrou318b8f32011-01-12 18:45:27 +0000780 set(posix.getgroups() + [posix.getegid()]))
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000781
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000782 # tests for the posix *at functions follow
783
Larry Hastings9cf065c2012-06-22 16:30:09 -0700784 @unittest.skipUnless(os.access in os.supports_dir_fd, "test needs dir_fd support for os.access()")
785 def test_access_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000786 f = posix.open(posix.getcwd(), posix.O_RDONLY)
787 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700788 self.assertTrue(posix.access(support.TESTFN, os.R_OK, dir_fd=f))
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000789 finally:
790 posix.close(f)
791
Larry Hastings9cf065c2012-06-22 16:30:09 -0700792 @unittest.skipUnless(os.chmod in os.supports_dir_fd, "test needs dir_fd support in os.chmod()")
793 def test_chmod_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000794 os.chmod(support.TESTFN, stat.S_IRUSR)
795
796 f = posix.open(posix.getcwd(), posix.O_RDONLY)
797 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700798 posix.chmod(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000799
800 s = posix.stat(support.TESTFN)
801 self.assertEqual(s[0] & stat.S_IRWXU, stat.S_IRUSR | stat.S_IWUSR)
802 finally:
803 posix.close(f)
804
Larry Hastings9cf065c2012-06-22 16:30:09 -0700805 @unittest.skipUnless(os.chown in os.supports_dir_fd, "test needs dir_fd support in os.chown()")
806 def test_chown_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000807 support.unlink(support.TESTFN)
Victor Stinnerbf816222011-06-30 23:25:47 +0200808 support.create_empty_file(support.TESTFN)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000809
810 f = posix.open(posix.getcwd(), posix.O_RDONLY)
811 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700812 posix.chown(support.TESTFN, os.getuid(), os.getgid(), dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000813 finally:
814 posix.close(f)
815
Larry Hastings9cf065c2012-06-22 16:30:09 -0700816 @unittest.skipUnless(os.stat in os.supports_dir_fd, "test needs dir_fd support in os.stat()")
817 def test_stat_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000818 support.unlink(support.TESTFN)
819 with open(support.TESTFN, 'w') as outfile:
820 outfile.write("testline\n")
821
822 f = posix.open(posix.getcwd(), posix.O_RDONLY)
823 try:
824 s1 = posix.stat(support.TESTFN)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700825 s2 = posix.stat(support.TESTFN, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000826 self.assertEqual(s1, s2)
Serhiy Storchakaa2ad5c32013-01-07 23:13:46 +0200827 s2 = posix.stat(support.TESTFN, dir_fd=None)
828 self.assertEqual(s1, s2)
829 self.assertRaisesRegex(TypeError, 'should be integer, not',
830 posix.stat, support.TESTFN, dir_fd=posix.getcwd())
831 self.assertRaisesRegex(TypeError, 'should be integer, not',
832 posix.stat, support.TESTFN, dir_fd=float(f))
833 self.assertRaises(OverflowError,
834 posix.stat, support.TESTFN, dir_fd=10**20)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000835 finally:
836 posix.close(f)
837
Larry Hastings9cf065c2012-06-22 16:30:09 -0700838 @unittest.skipUnless(os.utime in os.supports_dir_fd, "test needs dir_fd support in os.utime()")
839 def test_utime_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000840 f = posix.open(posix.getcwd(), posix.O_RDONLY)
841 try:
842 now = time.time()
Larry Hastings9cf065c2012-06-22 16:30:09 -0700843 posix.utime(support.TESTFN, None, dir_fd=f)
844 posix.utime(support.TESTFN, dir_fd=f)
845 self.assertRaises(TypeError, posix.utime, support.TESTFN, now, dir_fd=f)
846 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None), dir_fd=f)
847 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None), dir_fd=f)
848 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now), dir_fd=f)
849 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, "x"), dir_fd=f)
850 posix.utime(support.TESTFN, (int(now), int(now)), dir_fd=f)
851 posix.utime(support.TESTFN, (now, now), dir_fd=f)
852 posix.utime(support.TESTFN,
853 (int(now), int((now - int(now)) * 1e9)), dir_fd=f)
854 posix.utime(support.TESTFN, dir_fd=f,
855 times=(int(now), int((now - int(now)) * 1e9)))
856
Larry Hastings90867a52012-06-22 17:01:41 -0700857 # try dir_fd and follow_symlinks together
Larry Hastings9cf065c2012-06-22 16:30:09 -0700858 if os.utime in os.supports_follow_symlinks:
Larry Hastings90867a52012-06-22 17:01:41 -0700859 try:
860 posix.utime(support.TESTFN, follow_symlinks=False, dir_fd=f)
Georg Brandl969288e2012-06-26 09:25:44 +0200861 except ValueError:
Larry Hastings90867a52012-06-22 17:01:41 -0700862 # whoops! using both together not supported on this platform.
863 pass
Larry Hastings9cf065c2012-06-22 16:30:09 -0700864
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000865 finally:
866 posix.close(f)
867
Larry Hastings9cf065c2012-06-22 16:30:09 -0700868 @unittest.skipUnless(os.link in os.supports_dir_fd, "test needs dir_fd support in os.link()")
869 def test_link_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000870 f = posix.open(posix.getcwd(), posix.O_RDONLY)
871 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700872 posix.link(support.TESTFN, support.TESTFN + 'link', src_dir_fd=f, dst_dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000873 # should have same inodes
874 self.assertEqual(posix.stat(support.TESTFN)[1],
875 posix.stat(support.TESTFN + 'link')[1])
876 finally:
877 posix.close(f)
878 support.unlink(support.TESTFN + 'link')
879
Larry Hastings9cf065c2012-06-22 16:30:09 -0700880 @unittest.skipUnless(os.mkdir in os.supports_dir_fd, "test needs dir_fd support in os.mkdir()")
881 def test_mkdir_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000882 f = posix.open(posix.getcwd(), posix.O_RDONLY)
883 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700884 posix.mkdir(support.TESTFN + 'dir', dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000885 posix.stat(support.TESTFN + 'dir') # should not raise exception
886 finally:
887 posix.close(f)
888 support.rmtree(support.TESTFN + 'dir')
889
Larry Hastings9cf065c2012-06-22 16:30:09 -0700890 @unittest.skipUnless((os.mknod in os.supports_dir_fd) and hasattr(stat, 'S_IFIFO'),
891 "test requires both stat.S_IFIFO and dir_fd support for os.mknod()")
892 def test_mknod_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000893 # Test using mknodat() to create a FIFO (the only use specified
894 # by POSIX).
895 support.unlink(support.TESTFN)
896 mode = stat.S_IFIFO | stat.S_IRUSR | stat.S_IWUSR
897 f = posix.open(posix.getcwd(), posix.O_RDONLY)
898 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700899 posix.mknod(support.TESTFN, mode, 0, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000900 except OSError as e:
901 # Some old systems don't allow unprivileged users to use
902 # mknod(), or only support creating device nodes.
903 self.assertIn(e.errno, (errno.EPERM, errno.EINVAL))
904 else:
905 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
906 finally:
907 posix.close(f)
908
Larry Hastings9cf065c2012-06-22 16:30:09 -0700909 @unittest.skipUnless(os.open in os.supports_dir_fd, "test needs dir_fd support in os.open()")
910 def test_open_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000911 support.unlink(support.TESTFN)
912 with open(support.TESTFN, 'w') as outfile:
913 outfile.write("testline\n")
914 a = posix.open(posix.getcwd(), posix.O_RDONLY)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700915 b = posix.open(support.TESTFN, posix.O_RDONLY, dir_fd=a)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000916 try:
917 res = posix.read(b, 9).decode(encoding="utf-8")
918 self.assertEqual("testline\n", res)
919 finally:
920 posix.close(a)
921 posix.close(b)
922
Larry Hastings9cf065c2012-06-22 16:30:09 -0700923 @unittest.skipUnless(os.readlink in os.supports_dir_fd, "test needs dir_fd support in os.readlink()")
924 def test_readlink_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000925 os.symlink(support.TESTFN, support.TESTFN + 'link')
926 f = posix.open(posix.getcwd(), posix.O_RDONLY)
927 try:
928 self.assertEqual(posix.readlink(support.TESTFN + 'link'),
Larry Hastings9cf065c2012-06-22 16:30:09 -0700929 posix.readlink(support.TESTFN + 'link', dir_fd=f))
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000930 finally:
931 support.unlink(support.TESTFN + 'link')
932 posix.close(f)
933
Larry Hastings9cf065c2012-06-22 16:30:09 -0700934 @unittest.skipUnless(os.rename in os.supports_dir_fd, "test needs dir_fd support in os.rename()")
935 def test_rename_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000936 support.unlink(support.TESTFN)
Victor Stinnerbf816222011-06-30 23:25:47 +0200937 support.create_empty_file(support.TESTFN + 'ren')
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000938 f = posix.open(posix.getcwd(), posix.O_RDONLY)
939 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700940 posix.rename(support.TESTFN + 'ren', support.TESTFN, src_dir_fd=f, dst_dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000941 except:
942 posix.rename(support.TESTFN + 'ren', support.TESTFN)
943 raise
944 else:
Andrew Svetlov5b898402012-12-18 21:26:36 +0200945 posix.stat(support.TESTFN) # should not raise exception
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000946 finally:
947 posix.close(f)
948
Larry Hastings9cf065c2012-06-22 16:30:09 -0700949 @unittest.skipUnless(os.symlink in os.supports_dir_fd, "test needs dir_fd support in os.symlink()")
950 def test_symlink_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000951 f = posix.open(posix.getcwd(), posix.O_RDONLY)
952 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700953 posix.symlink(support.TESTFN, support.TESTFN + 'link', dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000954 self.assertEqual(posix.readlink(support.TESTFN + 'link'), support.TESTFN)
955 finally:
956 posix.close(f)
957 support.unlink(support.TESTFN + 'link')
958
Larry Hastings9cf065c2012-06-22 16:30:09 -0700959 @unittest.skipUnless(os.unlink in os.supports_dir_fd, "test needs dir_fd support in os.unlink()")
960 def test_unlink_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000961 f = posix.open(posix.getcwd(), posix.O_RDONLY)
Victor Stinnerbf816222011-06-30 23:25:47 +0200962 support.create_empty_file(support.TESTFN + 'del')
Andrew Svetlov5b898402012-12-18 21:26:36 +0200963 posix.stat(support.TESTFN + 'del') # should not raise exception
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000964 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700965 posix.unlink(support.TESTFN + 'del', dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000966 except:
967 support.unlink(support.TESTFN + 'del')
968 raise
969 else:
970 self.assertRaises(OSError, posix.stat, support.TESTFN + 'link')
971 finally:
972 posix.close(f)
973
Larry Hastings9cf065c2012-06-22 16:30:09 -0700974 @unittest.skipUnless(os.mkfifo in os.supports_dir_fd, "test needs dir_fd support in os.mkfifo()")
975 def test_mkfifo_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000976 support.unlink(support.TESTFN)
977 f = posix.open(posix.getcwd(), posix.O_RDONLY)
978 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700979 posix.mkfifo(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000980 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
981 finally:
982 posix.close(f)
983
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500984 requires_sched_h = unittest.skipUnless(hasattr(posix, 'sched_yield'),
985 "don't have scheduling support")
Antoine Pitrou84869872012-08-04 16:16:35 +0200986 requires_sched_affinity = unittest.skipUnless(hasattr(posix, 'sched_setaffinity'),
Benjamin Peterson50ba2712011-08-02 22:15:40 -0500987 "don't have sched affinity support")
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500988
989 @requires_sched_h
990 def test_sched_yield(self):
991 # This has no error conditions (at least on Linux).
992 posix.sched_yield()
993
994 @requires_sched_h
Charles-François Nataliea0d5fc2011-09-06 19:03:35 +0200995 @unittest.skipUnless(hasattr(posix, 'sched_get_priority_max'),
996 "requires sched_get_priority_max()")
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500997 def test_sched_priority(self):
998 # Round-robin usually has interesting priorities.
999 pol = posix.SCHED_RR
1000 lo = posix.sched_get_priority_min(pol)
1001 hi = posix.sched_get_priority_max(pol)
1002 self.assertIsInstance(lo, int)
1003 self.assertIsInstance(hi, int)
1004 self.assertGreaterEqual(hi, lo)
Benjamin Peterson539b6c42011-08-02 22:09:37 -05001005 # OSX evidently just returns 15 without checking the argument.
1006 if sys.platform != "darwin":
Benjamin Petersonc1581582011-08-02 22:10:55 -05001007 self.assertRaises(OSError, posix.sched_get_priority_min, -23)
1008 self.assertRaises(OSError, posix.sched_get_priority_max, -23)
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001009
Benjamin Petersonc5fce4d2011-08-02 18:07:32 -05001010 @unittest.skipUnless(hasattr(posix, 'sched_setscheduler'), "can't change scheduler")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001011 def test_get_and_set_scheduler_and_param(self):
1012 possible_schedulers = [sched for name, sched in posix.__dict__.items()
1013 if name.startswith("SCHED_")]
1014 mine = posix.sched_getscheduler(0)
1015 self.assertIn(mine, possible_schedulers)
1016 try:
Jesus Ceaceb5d162011-09-10 01:16:55 +02001017 parent = posix.sched_getscheduler(os.getppid())
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001018 except OSError as e:
Jesus Ceaceb5d162011-09-10 01:16:55 +02001019 if e.errno != errno.EPERM:
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001020 raise
1021 else:
Jesus Ceaceb5d162011-09-10 01:16:55 +02001022 self.assertIn(parent, possible_schedulers)
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001023 self.assertRaises(OSError, posix.sched_getscheduler, -1)
1024 self.assertRaises(OSError, posix.sched_getparam, -1)
1025 param = posix.sched_getparam(0)
1026 self.assertIsInstance(param.sched_priority, int)
Charles-François Natali7b911cb2011-08-21 12:41:43 +02001027
Charles-François Natalic78de462013-01-13 14:10:37 +01001028 # POSIX states that calling sched_setparam() or sched_setscheduler() on
1029 # a process with a scheduling policy other than SCHED_FIFO or SCHED_RR
1030 # is implementation-defined: NetBSD and FreeBSD can return EINVAL.
1031 if not sys.platform.startswith(('freebsd', 'netbsd')):
1032 try:
1033 posix.sched_setscheduler(0, mine, param)
1034 posix.sched_setparam(0, param)
1035 except OSError as e:
1036 if e.errno != errno.EPERM:
1037 raise
Charles-François Natali7b911cb2011-08-21 12:41:43 +02001038 self.assertRaises(OSError, posix.sched_setparam, -1, param)
1039
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001040 self.assertRaises(OSError, posix.sched_setscheduler, -1, mine, param)
1041 self.assertRaises(TypeError, posix.sched_setscheduler, 0, mine, None)
1042 self.assertRaises(TypeError, posix.sched_setparam, 0, 43)
1043 param = posix.sched_param(None)
1044 self.assertRaises(TypeError, posix.sched_setparam, 0, param)
1045 large = 214748364700
1046 param = posix.sched_param(large)
1047 self.assertRaises(OverflowError, posix.sched_setparam, 0, param)
1048 param = posix.sched_param(sched_priority=-large)
1049 self.assertRaises(OverflowError, posix.sched_setparam, 0, param)
1050
Benjamin Petersonc5fce4d2011-08-02 18:07:32 -05001051 @unittest.skipUnless(hasattr(posix, "sched_rr_get_interval"), "no function")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001052 def test_sched_rr_get_interval(self):
Benjamin Peterson43234ab2011-08-02 22:19:14 -05001053 try:
1054 interval = posix.sched_rr_get_interval(0)
1055 except OSError as e:
1056 # This likely means that sched_rr_get_interval is only valid for
1057 # processes with the SCHED_RR scheduler in effect.
1058 if e.errno != errno.EINVAL:
1059 raise
1060 self.skipTest("only works on SCHED_RR processes")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001061 self.assertIsInstance(interval, float)
1062 # Reasonable constraints, I think.
1063 self.assertGreaterEqual(interval, 0.)
1064 self.assertLess(interval, 1.)
1065
Benjamin Peterson2740af82011-08-02 17:41:34 -05001066 @requires_sched_affinity
Antoine Pitrou84869872012-08-04 16:16:35 +02001067 def test_sched_getaffinity(self):
1068 mask = posix.sched_getaffinity(0)
1069 self.assertIsInstance(mask, set)
1070 self.assertGreaterEqual(len(mask), 1)
1071 self.assertRaises(OSError, posix.sched_getaffinity, -1)
1072 for cpu in mask:
1073 self.assertIsInstance(cpu, int)
1074 self.assertGreaterEqual(cpu, 0)
1075 self.assertLess(cpu, 1 << 32)
1076
1077 @requires_sched_affinity
1078 def test_sched_setaffinity(self):
1079 mask = posix.sched_getaffinity(0)
1080 if len(mask) > 1:
1081 # Empty masks are forbidden
1082 mask.pop()
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001083 posix.sched_setaffinity(0, mask)
Antoine Pitrou84869872012-08-04 16:16:35 +02001084 self.assertEqual(posix.sched_getaffinity(0), mask)
1085 self.assertRaises(OSError, posix.sched_setaffinity, 0, [])
1086 self.assertRaises(ValueError, posix.sched_setaffinity, 0, [-10])
1087 self.assertRaises(OverflowError, posix.sched_setaffinity, 0, [1<<128])
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001088 self.assertRaises(OSError, posix.sched_setaffinity, -1, mask)
1089
Victor Stinner8b905bd2011-10-25 13:34:04 +02001090 def test_rtld_constants(self):
1091 # check presence of major RTLD_* constants
1092 posix.RTLD_LAZY
1093 posix.RTLD_NOW
1094 posix.RTLD_GLOBAL
1095 posix.RTLD_LOCAL
1096
Jesus Cea60c13dd2012-06-23 02:58:14 +02001097 @unittest.skipUnless(hasattr(os, 'SEEK_HOLE'),
1098 "test needs an OS that reports file holes")
Hynek Schlawackf841e422012-06-24 09:51:46 +02001099 def test_fs_holes(self):
Jesus Cea94363612012-06-22 18:32:07 +02001100 # Even if the filesystem doesn't report holes,
1101 # if the OS supports it the SEEK_* constants
1102 # will be defined and will have a consistent
1103 # behaviour:
1104 # os.SEEK_DATA = current position
1105 # os.SEEK_HOLE = end of file position
Hynek Schlawackf841e422012-06-24 09:51:46 +02001106 with open(support.TESTFN, 'r+b') as fp:
Jesus Cea94363612012-06-22 18:32:07 +02001107 fp.write(b"hello")
1108 fp.flush()
1109 size = fp.tell()
1110 fno = fp.fileno()
Jesus Cead46f7d22012-07-07 14:56:04 +02001111 try :
1112 for i in range(size):
1113 self.assertEqual(i, os.lseek(fno, i, os.SEEK_DATA))
1114 self.assertLessEqual(size, os.lseek(fno, i, os.SEEK_HOLE))
1115 self.assertRaises(OSError, os.lseek, fno, size, os.SEEK_DATA)
1116 self.assertRaises(OSError, os.lseek, fno, size, os.SEEK_HOLE)
1117 except OSError :
1118 # Some OSs claim to support SEEK_HOLE/SEEK_DATA
1119 # but it is not true.
1120 # For instance:
1121 # http://lists.freebsd.org/pipermail/freebsd-amd64/2012-January/014332.html
1122 raise unittest.SkipTest("OSError raised!")
Jesus Cea94363612012-06-22 18:32:07 +02001123
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001124class PosixGroupsTester(unittest.TestCase):
1125
1126 def setUp(self):
1127 if posix.getuid() != 0:
1128 raise unittest.SkipTest("not enough privileges")
1129 if not hasattr(posix, 'getgroups'):
1130 raise unittest.SkipTest("need posix.getgroups")
1131 if sys.platform == 'darwin':
1132 raise unittest.SkipTest("getgroups(2) is broken on OSX")
1133 self.saved_groups = posix.getgroups()
1134
1135 def tearDown(self):
1136 if hasattr(posix, 'setgroups'):
1137 posix.setgroups(self.saved_groups)
1138 elif hasattr(posix, 'initgroups'):
1139 name = pwd.getpwuid(posix.getuid()).pw_name
1140 posix.initgroups(name, self.saved_groups[0])
1141
1142 @unittest.skipUnless(hasattr(posix, 'initgroups'),
1143 "test needs posix.initgroups()")
1144 def test_initgroups(self):
1145 # find missing group
1146
Antoine Pitroue5a91012010-09-04 17:32:06 +00001147 g = max(self.saved_groups) + 1
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001148 name = pwd.getpwuid(posix.getuid()).pw_name
1149 posix.initgroups(name, g)
1150 self.assertIn(g, posix.getgroups())
1151
1152 @unittest.skipUnless(hasattr(posix, 'setgroups'),
1153 "test needs posix.setgroups()")
1154 def test_setgroups(self):
Antoine Pitroue5a91012010-09-04 17:32:06 +00001155 for groups in [[0], list(range(16))]:
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001156 posix.setgroups(groups)
1157 self.assertListEqual(groups, posix.getgroups())
1158
Neal Norwitze241ce82003-02-17 18:17:05 +00001159def test_main():
Antoine Pitrou68c95922011-03-20 17:33:57 +01001160 try:
1161 support.run_unittest(PosixTester, PosixGroupsTester)
1162 finally:
1163 support.reap_children()
Neal Norwitze241ce82003-02-17 18:17:05 +00001164
1165if __name__ == '__main__':
1166 test_main()