blob: 4856083dc8d89c241bfe8f444e69800682acfed0 [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
Serhiy Storchaka78980432013-01-15 01:12:17 +020020import _testcapi
R. David Murraya21e4ca2009-03-31 23:16:50 +000021
Ned Deilyba2eab22011-07-26 13:53:55 -070022_DUMMY_SYMLINK = os.path.join(tempfile.gettempdir(),
23 support.TESTFN + '-dummy-symlink')
Neal Norwitze241ce82003-02-17 18:17:05 +000024
25class PosixTester(unittest.TestCase):
26
27 def setUp(self):
28 # create empty file
Benjamin Petersonee8712c2008-05-20 21:35:26 +000029 fp = open(support.TESTFN, 'w+')
Neal Norwitze241ce82003-02-17 18:17:05 +000030 fp.close()
Ned Deily3eb67d52011-06-28 00:00:28 -070031 self.teardown_files = [ support.TESTFN ]
Brett Cannonc8d502e2010-03-20 21:53:28 +000032 self._warnings_manager = support.check_warnings()
33 self._warnings_manager.__enter__()
34 warnings.filterwarnings('ignore', '.* potential security risk .*',
35 RuntimeWarning)
Neal Norwitze241ce82003-02-17 18:17:05 +000036
37 def tearDown(self):
Ned Deily3eb67d52011-06-28 00:00:28 -070038 for teardown_file in self.teardown_files:
39 support.unlink(teardown_file)
Brett Cannonc8d502e2010-03-20 21:53:28 +000040 self._warnings_manager.__exit__(None, None, None)
Neal Norwitze241ce82003-02-17 18:17:05 +000041
42 def testNoArgFunctions(self):
43 # test posix functions which take no arguments and have
44 # no side-effects which we need to cleanup (e.g., fork, wait, abort)
Guido van Rossumf0af3e32008-10-02 18:55:37 +000045 NO_ARG_FUNCTIONS = [ "ctermid", "getcwd", "getcwdb", "uname",
Guido van Rossum687b9c02007-10-25 23:18:51 +000046 "times", "getloadavg",
Neal Norwitze241ce82003-02-17 18:17:05 +000047 "getegid", "geteuid", "getgid", "getgroups",
Ross Lagerwall7807c352011-03-17 20:20:30 +020048 "getpid", "getpgrp", "getppid", "getuid", "sync",
Neal Norwitze241ce82003-02-17 18:17:05 +000049 ]
Neal Norwitz71b13e82003-02-23 22:12:24 +000050
Neal Norwitze241ce82003-02-17 18:17:05 +000051 for name in NO_ARG_FUNCTIONS:
52 posix_func = getattr(posix, name, None)
53 if posix_func is not None:
54 posix_func()
Neal Norwitz2ff51a82003-02-17 22:40:31 +000055 self.assertRaises(TypeError, posix_func, 1)
Neal Norwitze241ce82003-02-17 18:17:05 +000056
Martin v. Löwis7aed61a2009-11-27 14:09:49 +000057 if hasattr(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)
63
64 if hasattr(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)
70
71 if hasattr(posix, 'setresuid'):
72 def test_setresuid(self):
73 current_user_ids = posix.getresuid()
74 self.assertIsNone(posix.setresuid(*current_user_ids))
75 # -1 means don't change that value.
76 self.assertIsNone(posix.setresuid(-1, -1, -1))
77
78 def test_setresuid_exception(self):
79 # Don't do this test if someone is silly enough to run us as root.
80 current_user_ids = posix.getresuid()
81 if 0 not in current_user_ids:
82 new_user_ids = (current_user_ids[0]+1, -1, -1)
83 self.assertRaises(OSError, posix.setresuid, *new_user_ids)
84
85 if hasattr(posix, 'setresgid'):
86 def test_setresgid(self):
87 current_group_ids = posix.getresgid()
88 self.assertIsNone(posix.setresgid(*current_group_ids))
89 # -1 means don't change that value.
90 self.assertIsNone(posix.setresgid(-1, -1, -1))
91
92 def test_setresgid_exception(self):
93 # Don't do this test if someone is silly enough to run us as root.
94 current_group_ids = posix.getresgid()
95 if 0 not in current_group_ids:
96 new_group_ids = (current_group_ids[0]+1, -1, -1)
97 self.assertRaises(OSError, posix.setresgid, *new_group_ids)
98
Antoine Pitroub7572f02009-12-02 20:46:48 +000099 @unittest.skipUnless(hasattr(posix, 'initgroups'),
100 "test needs os.initgroups()")
101 def test_initgroups(self):
102 # It takes a string and an integer; check that it raises a TypeError
103 # for other argument lists.
104 self.assertRaises(TypeError, posix.initgroups)
105 self.assertRaises(TypeError, posix.initgroups, None)
106 self.assertRaises(TypeError, posix.initgroups, 3, "foo")
107 self.assertRaises(TypeError, posix.initgroups, "foo", 3, object())
108
109 # If a non-privileged user invokes it, it should fail with OSError
110 # EPERM.
111 if os.getuid() != 0:
Charles-François Natalie8a255a2012-05-02 20:01:38 +0200112 try:
113 name = pwd.getpwuid(posix.getuid()).pw_name
114 except KeyError:
115 # the current UID may not have a pwd entry
116 raise unittest.SkipTest("need a pwd entry")
Antoine Pitroub7572f02009-12-02 20:46:48 +0000117 try:
118 posix.initgroups(name, 13)
119 except OSError as e:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000120 self.assertEqual(e.errno, errno.EPERM)
Antoine Pitroub7572f02009-12-02 20:46:48 +0000121 else:
122 self.fail("Expected OSError to be raised by initgroups")
123
Neal Norwitze241ce82003-02-17 18:17:05 +0000124 def test_statvfs(self):
125 if hasattr(posix, 'statvfs'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000126 self.assertTrue(posix.statvfs(os.curdir))
Neal Norwitze241ce82003-02-17 18:17:05 +0000127
128 def test_fstatvfs(self):
129 if hasattr(posix, 'fstatvfs'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000130 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000131 try:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000132 self.assertTrue(posix.fstatvfs(fp.fileno()))
Larry Hastings9cf065c2012-06-22 16:30:09 -0700133 self.assertTrue(posix.statvfs(fp.fileno()))
Neal Norwitze241ce82003-02-17 18:17:05 +0000134 finally:
135 fp.close()
136
137 def test_ftruncate(self):
138 if hasattr(posix, 'ftruncate'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000139 fp = open(support.TESTFN, 'w+')
Neal Norwitze241ce82003-02-17 18:17:05 +0000140 try:
141 # we need to have some data to truncate
142 fp.write('test')
143 fp.flush()
144 posix.ftruncate(fp.fileno(), 0)
145 finally:
146 fp.close()
147
Ross Lagerwall7807c352011-03-17 20:20:30 +0200148 @unittest.skipUnless(hasattr(posix, 'truncate'), "test needs posix.truncate()")
149 def test_truncate(self):
150 with open(support.TESTFN, 'w') as fp:
151 fp.write('test')
152 fp.flush()
153 posix.truncate(support.TESTFN, 0)
154
Larry Hastings9cf065c2012-06-22 16:30:09 -0700155 @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 +0200156 @unittest.skipUnless(hasattr(os, 'fork'), "test needs os.fork()")
Ross Lagerwalldedf6cf2011-03-20 18:27:05 +0200157 @unittest.skipUnless(hasattr(os, 'waitpid'), "test needs os.waitpid()")
Ross Lagerwall7807c352011-03-17 20:20:30 +0200158 def test_fexecve(self):
159 fp = os.open(sys.executable, os.O_RDONLY)
160 try:
161 pid = os.fork()
162 if pid == 0:
163 os.chdir(os.path.split(sys.executable)[0])
Larry Hastings9cf065c2012-06-22 16:30:09 -0700164 posix.execve(fp, [sys.executable, '-c', 'pass'], os.environ)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200165 else:
Ross Lagerwalldedf6cf2011-03-20 18:27:05 +0200166 self.assertEqual(os.waitpid(pid, 0), (pid, 0))
Ross Lagerwall7807c352011-03-17 20:20:30 +0200167 finally:
168 os.close(fp)
169
170 @unittest.skipUnless(hasattr(posix, 'waitid'), "test needs posix.waitid()")
171 @unittest.skipUnless(hasattr(os, 'fork'), "test needs os.fork()")
172 def test_waitid(self):
173 pid = os.fork()
174 if pid == 0:
175 os.chdir(os.path.split(sys.executable)[0])
176 posix.execve(sys.executable, [sys.executable, '-c', 'pass'], os.environ)
177 else:
178 res = posix.waitid(posix.P_PID, pid, posix.WEXITED)
179 self.assertEqual(pid, res.si_pid)
180
181 @unittest.skipUnless(hasattr(posix, 'lockf'), "test needs posix.lockf()")
182 def test_lockf(self):
183 fd = os.open(support.TESTFN, os.O_WRONLY | os.O_CREAT)
184 try:
185 os.write(fd, b'test')
186 os.lseek(fd, 0, os.SEEK_SET)
187 posix.lockf(fd, posix.F_LOCK, 4)
188 # section is locked
189 posix.lockf(fd, posix.F_ULOCK, 4)
190 finally:
191 os.close(fd)
192
193 @unittest.skipUnless(hasattr(posix, 'pread'), "test needs posix.pread()")
194 def test_pread(self):
195 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
196 try:
197 os.write(fd, b'test')
198 os.lseek(fd, 0, os.SEEK_SET)
199 self.assertEqual(b'es', posix.pread(fd, 2, 1))
Florent Xiclunae41f0de2011-11-11 19:39:25 +0100200 # the first pread() shouldn't disturb the file offset
Ross Lagerwall7807c352011-03-17 20:20:30 +0200201 self.assertEqual(b'te', posix.read(fd, 2))
202 finally:
203 os.close(fd)
204
205 @unittest.skipUnless(hasattr(posix, 'pwrite'), "test needs posix.pwrite()")
206 def test_pwrite(self):
207 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
208 try:
209 os.write(fd, b'test')
210 os.lseek(fd, 0, os.SEEK_SET)
211 posix.pwrite(fd, b'xx', 1)
212 self.assertEqual(b'txxt', posix.read(fd, 4))
213 finally:
214 os.close(fd)
215
216 @unittest.skipUnless(hasattr(posix, 'posix_fallocate'),
217 "test needs posix.posix_fallocate()")
218 def test_posix_fallocate(self):
219 fd = os.open(support.TESTFN, os.O_WRONLY | os.O_CREAT)
220 try:
221 posix.posix_fallocate(fd, 0, 10)
222 except OSError as inst:
223 # issue10812, ZFS doesn't appear to support posix_fallocate,
224 # so skip Solaris-based since they are likely to have ZFS.
225 if inst.errno != errno.EINVAL or not sys.platform.startswith("sunos"):
226 raise
227 finally:
228 os.close(fd)
229
230 @unittest.skipUnless(hasattr(posix, 'posix_fadvise'),
231 "test needs posix.posix_fadvise()")
232 def test_posix_fadvise(self):
233 fd = os.open(support.TESTFN, os.O_RDONLY)
234 try:
235 posix.posix_fadvise(fd, 0, 0, posix.POSIX_FADV_WILLNEED)
236 finally:
237 os.close(fd)
238
Larry Hastings9cf065c2012-06-22 16:30:09 -0700239 @unittest.skipUnless(os.utime in os.supports_fd, "test needs fd support in os.utime")
240 def test_utime_with_fd(self):
Ross Lagerwall7807c352011-03-17 20:20:30 +0200241 now = time.time()
242 fd = os.open(support.TESTFN, os.O_RDONLY)
243 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700244 posix.utime(fd)
245 posix.utime(fd, None)
246 self.assertRaises(TypeError, posix.utime, fd, (None, None))
247 self.assertRaises(TypeError, posix.utime, fd, (now, None))
248 self.assertRaises(TypeError, posix.utime, fd, (None, now))
249 posix.utime(fd, (int(now), int(now)))
250 posix.utime(fd, (now, now))
251 self.assertRaises(ValueError, posix.utime, fd, (now, now), ns=(now, now))
252 self.assertRaises(ValueError, posix.utime, fd, (now, 0), ns=(None, None))
253 self.assertRaises(ValueError, posix.utime, fd, (None, None), ns=(now, 0))
254 posix.utime(fd, (int(now), int((now - int(now)) * 1e9)))
255 posix.utime(fd, ns=(int(now), int((now - int(now)) * 1e9)))
256
Ross Lagerwall7807c352011-03-17 20:20:30 +0200257 finally:
258 os.close(fd)
259
Larry Hastings9cf065c2012-06-22 16:30:09 -0700260 @unittest.skipUnless(os.utime in os.supports_follow_symlinks, "test needs follow_symlinks support in os.utime")
261 def test_utime_nofollow_symlinks(self):
Ross Lagerwall7807c352011-03-17 20:20:30 +0200262 now = time.time()
Larry Hastings9cf065c2012-06-22 16:30:09 -0700263 posix.utime(support.TESTFN, None, follow_symlinks=False)
264 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None), follow_symlinks=False)
265 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None), follow_symlinks=False)
266 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now), follow_symlinks=False)
267 posix.utime(support.TESTFN, (int(now), int(now)), follow_symlinks=False)
268 posix.utime(support.TESTFN, (now, now), follow_symlinks=False)
269 posix.utime(support.TESTFN, follow_symlinks=False)
Ross Lagerwall7807c352011-03-17 20:20:30 +0200270
271 @unittest.skipUnless(hasattr(posix, 'writev'), "test needs posix.writev()")
272 def test_writev(self):
273 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
274 try:
275 os.writev(fd, (b'test1', b'tt2', b't3'))
276 os.lseek(fd, 0, os.SEEK_SET)
277 self.assertEqual(b'test1tt2t3', posix.read(fd, 10))
278 finally:
279 os.close(fd)
280
281 @unittest.skipUnless(hasattr(posix, 'readv'), "test needs posix.readv()")
282 def test_readv(self):
283 fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
284 try:
285 os.write(fd, b'test1tt2t3')
286 os.lseek(fd, 0, os.SEEK_SET)
287 buf = [bytearray(i) for i in [5, 3, 2]]
288 self.assertEqual(posix.readv(fd, buf), 10)
289 self.assertEqual([b'test1', b'tt2', b't3'], [bytes(i) for i in buf])
290 finally:
291 os.close(fd)
292
Neal Norwitze241ce82003-02-17 18:17:05 +0000293 def test_dup(self):
294 if hasattr(posix, 'dup'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000295 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000296 try:
297 fd = posix.dup(fp.fileno())
Ezio Melottie9615932010-01-24 19:26:24 +0000298 self.assertIsInstance(fd, int)
Neal Norwitze241ce82003-02-17 18:17:05 +0000299 os.close(fd)
300 finally:
301 fp.close()
302
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000303 def test_confstr(self):
304 if hasattr(posix, 'confstr'):
305 self.assertRaises(ValueError, posix.confstr, "CS_garbage")
306 self.assertEqual(len(posix.confstr("CS_PATH")) > 0, True)
307
Neal Norwitze241ce82003-02-17 18:17:05 +0000308 def test_dup2(self):
309 if hasattr(posix, 'dup2'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000310 fp1 = open(support.TESTFN)
311 fp2 = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000312 try:
313 posix.dup2(fp1.fileno(), fp2.fileno())
314 finally:
315 fp1.close()
316 fp2.close()
317
Charles-François Natali1e045b12011-05-22 20:42:32 +0200318 @unittest.skipUnless(hasattr(os, 'O_CLOEXEC'), "needs os.O_CLOEXEC")
Charles-François Natali239bb962011-06-03 12:55:15 +0200319 @support.requires_linux_version(2, 6, 23)
Charles-François Natali1e045b12011-05-22 20:42:32 +0200320 def test_oscloexec(self):
321 fd = os.open(support.TESTFN, os.O_RDONLY|os.O_CLOEXEC)
322 self.addCleanup(os.close, fd)
Victor Stinnere36f3752011-05-24 00:29:43 +0200323 self.assertTrue(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Charles-François Natali1e045b12011-05-22 20:42:32 +0200324
Skip Montanaro98470002005-06-17 01:14:49 +0000325 def test_osexlock(self):
326 if hasattr(posix, "O_EXLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000327 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000328 os.O_WRONLY|os.O_EXLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000329 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000330 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
331 os.close(fd)
332
333 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000334 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000335 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000336 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000337 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
338 os.close(fd)
339
340 def test_osshlock(self):
341 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000342 fd1 = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000343 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000344 fd2 = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000345 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
346 os.close(fd2)
347 os.close(fd1)
348
349 if hasattr(posix, "O_EXLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000350 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000351 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000352 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000353 os.O_RDONLY|os.O_EXLOCK|os.O_NONBLOCK)
354 os.close(fd)
355
Neal Norwitze241ce82003-02-17 18:17:05 +0000356 def test_fstat(self):
357 if hasattr(posix, 'fstat'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000358 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000359 try:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000360 self.assertTrue(posix.fstat(fp.fileno()))
Larry Hastings9cf065c2012-06-22 16:30:09 -0700361 self.assertTrue(posix.stat(fp.fileno()))
Serhiy Storchakaa2ad5c32013-01-07 23:13:46 +0200362
363 self.assertRaisesRegex(TypeError,
364 'should be string, bytes or integer, not',
365 posix.stat, float(fp.fileno()))
Neal Norwitze241ce82003-02-17 18:17:05 +0000366 finally:
367 fp.close()
368
369 def test_stat(self):
370 if hasattr(posix, 'stat'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000371 self.assertTrue(posix.stat(support.TESTFN))
Serhiy Storchakaa2ad5c32013-01-07 23:13:46 +0200372 self.assertTrue(posix.stat(os.fsencode(support.TESTFN)))
373 self.assertTrue(posix.stat(bytearray(os.fsencode(support.TESTFN))))
374
375 self.assertRaisesRegex(TypeError,
376 'can\'t specify None for path argument',
377 posix.stat, None)
378 self.assertRaisesRegex(TypeError,
379 'should be string, bytes or integer, not',
380 posix.stat, list(support.TESTFN))
381 self.assertRaisesRegex(TypeError,
382 'should be string, bytes or integer, not',
383 posix.stat, list(os.fsencode(support.TESTFN)))
Neal Norwitze241ce82003-02-17 18:17:05 +0000384
Benjamin Peterson052a02b2010-08-17 01:27:09 +0000385 @unittest.skipUnless(hasattr(posix, 'mkfifo'), "don't have mkfifo()")
386 def test_mkfifo(self):
387 support.unlink(support.TESTFN)
388 posix.mkfifo(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR)
389 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
390
391 @unittest.skipUnless(hasattr(posix, 'mknod') and hasattr(stat, 'S_IFIFO'),
392 "don't have mknod()/S_IFIFO")
393 def test_mknod(self):
394 # Test using mknod() to create a FIFO (the only use specified
395 # by POSIX).
396 support.unlink(support.TESTFN)
397 mode = stat.S_IFIFO | stat.S_IRUSR | stat.S_IWUSR
398 try:
399 posix.mknod(support.TESTFN, mode, 0)
400 except OSError as e:
401 # Some old systems don't allow unprivileged users to use
402 # mknod(), or only support creating device nodes.
403 self.assertIn(e.errno, (errno.EPERM, errno.EINVAL))
404 else:
405 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
406
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200407 def _test_all_chown_common(self, chown_func, first_param, stat_func):
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000408 """Common code for chown, fchown and lchown tests."""
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200409 def check_stat(uid, gid):
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200410 if stat_func is not None:
411 stat = stat_func(first_param)
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200412 self.assertEqual(stat.st_uid, uid)
413 self.assertEqual(stat.st_gid, gid)
414 uid = os.getuid()
415 gid = os.getgid()
Charles-François Nataliab2d58e2012-04-17 19:48:35 +0200416 # test a successful chown call
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200417 chown_func(first_param, uid, gid)
418 check_stat(uid, gid)
419 chown_func(first_param, -1, gid)
420 check_stat(uid, gid)
421 chown_func(first_param, uid, -1)
422 check_stat(uid, gid)
Charles-François Nataliab2d58e2012-04-17 19:48:35 +0200423
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200424 if uid == 0:
425 # Try an amusingly large uid/gid to make sure we handle
426 # large unsigned values. (chown lets you use any
427 # uid/gid you like, even if they aren't defined.)
428 #
429 # This problem keeps coming up:
430 # http://bugs.python.org/issue1747858
431 # http://bugs.python.org/issue4591
432 # http://bugs.python.org/issue15301
433 # Hopefully the fix in 4591 fixes it for good!
434 #
435 # This part of the test only runs when run as root.
436 # Only scary people run their tests as root.
437
438 big_value = 2**31
439 chown_func(first_param, big_value, big_value)
440 check_stat(big_value, big_value)
441 chown_func(first_param, -1, -1)
442 check_stat(big_value, big_value)
443 chown_func(first_param, uid, gid)
444 check_stat(uid, gid)
Charles-François Nataliab2d58e2012-04-17 19:48:35 +0200445 elif platform.system() in ('HP-UX', 'SunOS'):
446 # HP-UX and Solaris can allow a non-root user to chown() to root
447 # (issue #5113)
448 raise unittest.SkipTest("Skipping because of non-standard chown() "
449 "behavior")
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000450 else:
451 # non-root cannot chown to root, raises OSError
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200452 self.assertRaises(OSError, chown_func, first_param, 0, 0)
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200453 check_stat(uid, gid)
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200454 self.assertRaises(OSError, chown_func, first_param, 0, -1)
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200455 check_stat(uid, gid)
Serhiy Storchakaa2964b32013-02-21 14:34:36 +0200456 if 0 not in os.getgroups():
Serhiy Storchakab3d62ce2013-02-20 19:48:22 +0200457 self.assertRaises(OSError, chown_func, first_param, -1, 0)
458 check_stat(uid, gid)
Serhiy Storchaka54db2fd2013-02-20 19:40:25 +0200459 # test illegal types
460 for t in str, float:
461 self.assertRaises(TypeError, chown_func, first_param, t(uid), gid)
462 check_stat(uid, gid)
463 self.assertRaises(TypeError, chown_func, first_param, uid, t(gid))
464 check_stat(uid, gid)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000465
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000466 @unittest.skipUnless(hasattr(posix, 'chown'), "test needs os.chown()")
467 def test_chown(self):
468 # raise an OSError if the file does not exist
469 os.unlink(support.TESTFN)
470 self.assertRaises(OSError, posix.chown, support.TESTFN, -1, -1)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000471
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000472 # re-create the file
Victor Stinnerbf816222011-06-30 23:25:47 +0200473 support.create_empty_file(support.TESTFN)
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200474 self._test_all_chown_common(posix.chown, support.TESTFN,
475 getattr(posix, 'stat', None))
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000476
477 @unittest.skipUnless(hasattr(posix, 'fchown'), "test needs os.fchown()")
478 def test_fchown(self):
479 os.unlink(support.TESTFN)
480
481 # re-create the file
482 test_file = open(support.TESTFN, 'w')
483 try:
484 fd = test_file.fileno()
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200485 self._test_all_chown_common(posix.fchown, fd,
486 getattr(posix, 'fstat', None))
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000487 finally:
488 test_file.close()
489
490 @unittest.skipUnless(hasattr(posix, 'lchown'), "test needs os.lchown()")
491 def test_lchown(self):
492 os.unlink(support.TESTFN)
493 # create a symlink
Ned Deily3eb67d52011-06-28 00:00:28 -0700494 os.symlink(_DUMMY_SYMLINK, support.TESTFN)
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200495 self._test_all_chown_common(posix.lchown, support.TESTFN,
496 getattr(posix, 'lstat', None))
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000497
Neal Norwitze241ce82003-02-17 18:17:05 +0000498 def test_chdir(self):
499 if hasattr(posix, 'chdir'):
500 posix.chdir(os.curdir)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000501 self.assertRaises(OSError, posix.chdir, support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000502
Martin v. Löwisc9e1c7d2010-07-23 12:16:41 +0000503 def test_listdir(self):
Larry Hastingsfdaea062012-06-25 04:42:23 -0700504 self.assertTrue(support.TESTFN in posix.listdir(os.curdir))
Martin v. Löwisc9e1c7d2010-07-23 12:16:41 +0000505
506 def test_listdir_default(self):
Larry Hastingsfdaea062012-06-25 04:42:23 -0700507 # When listdir is called without argument,
508 # it's the same as listdir(os.curdir).
509 self.assertTrue(support.TESTFN in posix.listdir())
Neal Norwitze241ce82003-02-17 18:17:05 +0000510
Larry Hastingsfdaea062012-06-25 04:42:23 -0700511 def test_listdir_bytes(self):
512 # When listdir is called with a bytes object,
513 # the returned strings are of type bytes.
514 self.assertTrue(os.fsencode(support.TESTFN) in posix.listdir(b'.'))
515
516 @unittest.skipUnless(posix.listdir in os.supports_fd,
517 "test needs fd support for posix.listdir()")
518 def test_listdir_fd(self):
Antoine Pitrou8250e232011-02-25 23:41:16 +0000519 f = posix.open(posix.getcwd(), posix.O_RDONLY)
Charles-François Natali7546ad32012-01-08 18:34:06 +0100520 self.addCleanup(posix.close, f)
Antoine Pitrou8250e232011-02-25 23:41:16 +0000521 self.assertEqual(
522 sorted(posix.listdir('.')),
Larry Hastings9cf065c2012-06-22 16:30:09 -0700523 sorted(posix.listdir(f))
Antoine Pitrou8250e232011-02-25 23:41:16 +0000524 )
Charles-François Natali7546ad32012-01-08 18:34:06 +0100525 # Check that the fd offset was reset (issue #13739)
Charles-François Natali7546ad32012-01-08 18:34:06 +0100526 self.assertEqual(
527 sorted(posix.listdir('.')),
Larry Hastings9cf065c2012-06-22 16:30:09 -0700528 sorted(posix.listdir(f))
Charles-François Natali7546ad32012-01-08 18:34:06 +0100529 )
Antoine Pitrou8250e232011-02-25 23:41:16 +0000530
Neal Norwitze241ce82003-02-17 18:17:05 +0000531 def test_access(self):
532 if hasattr(posix, 'access'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000533 self.assertTrue(posix.access(support.TESTFN, os.R_OK))
Neal Norwitze241ce82003-02-17 18:17:05 +0000534
535 def test_umask(self):
536 if hasattr(posix, 'umask'):
537 old_mask = posix.umask(0)
Ezio Melottie9615932010-01-24 19:26:24 +0000538 self.assertIsInstance(old_mask, int)
Neal Norwitze241ce82003-02-17 18:17:05 +0000539 posix.umask(old_mask)
540
541 def test_strerror(self):
542 if hasattr(posix, 'strerror'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000543 self.assertTrue(posix.strerror(0))
Neal Norwitze241ce82003-02-17 18:17:05 +0000544
545 def test_pipe(self):
546 if hasattr(posix, 'pipe'):
547 reader, writer = posix.pipe()
548 os.close(reader)
549 os.close(writer)
550
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200551 @unittest.skipUnless(hasattr(os, 'pipe2'), "test needs os.pipe2()")
Charles-François Natali239bb962011-06-03 12:55:15 +0200552 @support.requires_linux_version(2, 6, 27)
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200553 def test_pipe2(self):
554 self.assertRaises(TypeError, os.pipe2, 'DEADBEEF')
555 self.assertRaises(TypeError, os.pipe2, 0, 0)
556
Charles-François Natali368f34b2011-06-06 19:49:47 +0200557 # try calling with flags = 0, like os.pipe()
558 r, w = os.pipe2(0)
Charles-François Natalidaafdd52011-05-29 20:07:40 +0200559 os.close(r)
560 os.close(w)
561
562 # test flags
563 r, w = os.pipe2(os.O_CLOEXEC|os.O_NONBLOCK)
564 self.addCleanup(os.close, r)
565 self.addCleanup(os.close, w)
566 self.assertTrue(fcntl.fcntl(r, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
567 self.assertTrue(fcntl.fcntl(w, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
568 # try reading from an empty pipe: this should fail, not block
569 self.assertRaises(OSError, os.read, r, 1)
570 # try a write big enough to fill-up the pipe: this should either
571 # fail or perform a partial write, not block
572 try:
573 os.write(w, b'x' * support.PIPE_MAX_SIZE)
574 except OSError:
575 pass
576
Serhiy Storchaka78980432013-01-15 01:12:17 +0200577 # Issue 15989
578 self.assertRaises(OverflowError, os.pipe2, _testcapi.INT_MAX + 1)
579 self.assertRaises(OverflowError, os.pipe2, _testcapi.UINT_MAX + 1)
580
Neal Norwitze241ce82003-02-17 18:17:05 +0000581 def test_utime(self):
582 if hasattr(posix, 'utime'):
583 now = time.time()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000584 posix.utime(support.TESTFN, None)
585 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None))
586 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None))
587 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now))
588 posix.utime(support.TESTFN, (int(now), int(now)))
589 posix.utime(support.TESTFN, (now, now))
Neal Norwitze241ce82003-02-17 18:17:05 +0000590
Larry Hastings9cf065c2012-06-22 16:30:09 -0700591 def _test_chflags_regular_file(self, chflags_func, target_file, **kwargs):
Ned Deily3eb67d52011-06-28 00:00:28 -0700592 st = os.stat(target_file)
593 self.assertTrue(hasattr(st, 'st_flags'))
Trent Nelson75959cf2012-08-21 23:59:31 +0000594
595 # ZFS returns EOPNOTSUPP when attempting to set flag UF_IMMUTABLE.
596 flags = st.st_flags | stat.UF_IMMUTABLE
597 try:
598 chflags_func(target_file, flags, **kwargs)
599 except OSError as err:
600 if err.errno != errno.EOPNOTSUPP:
601 raise
602 msg = 'chflag UF_IMMUTABLE not supported by underlying fs'
603 self.skipTest(msg)
604
Ned Deily3eb67d52011-06-28 00:00:28 -0700605 try:
606 new_st = os.stat(target_file)
607 self.assertEqual(st.st_flags | stat.UF_IMMUTABLE, new_st.st_flags)
608 try:
609 fd = open(target_file, 'w+')
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200610 except OSError as e:
Ned Deily3eb67d52011-06-28 00:00:28 -0700611 self.assertEqual(e.errno, errno.EPERM)
612 finally:
613 posix.chflags(target_file, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000614
Ned Deily3eb67d52011-06-28 00:00:28 -0700615 @unittest.skipUnless(hasattr(posix, 'chflags'), 'test needs os.chflags()')
616 def test_chflags(self):
617 self._test_chflags_regular_file(posix.chflags, support.TESTFN)
618
619 @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
620 def test_lchflags_regular_file(self):
621 self._test_chflags_regular_file(posix.lchflags, support.TESTFN)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700622 self._test_chflags_regular_file(posix.chflags, support.TESTFN, follow_symlinks=False)
Ned Deily3eb67d52011-06-28 00:00:28 -0700623
624 @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
625 def test_lchflags_symlink(self):
626 testfn_st = os.stat(support.TESTFN)
627
628 self.assertTrue(hasattr(testfn_st, 'st_flags'))
629
630 os.symlink(support.TESTFN, _DUMMY_SYMLINK)
631 self.teardown_files.append(_DUMMY_SYMLINK)
632 dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
633
Larry Hastings9cf065c2012-06-22 16:30:09 -0700634 def chflags_nofollow(path, flags):
635 return posix.chflags(path, flags, follow_symlinks=False)
Ned Deily3eb67d52011-06-28 00:00:28 -0700636
Larry Hastings9cf065c2012-06-22 16:30:09 -0700637 for fn in (posix.lchflags, chflags_nofollow):
Trent Nelson75959cf2012-08-21 23:59:31 +0000638 # ZFS returns EOPNOTSUPP when attempting to set flag UF_IMMUTABLE.
639 flags = dummy_symlink_st.st_flags | stat.UF_IMMUTABLE
640 try:
641 fn(_DUMMY_SYMLINK, flags)
642 except OSError as err:
643 if err.errno != errno.EOPNOTSUPP:
644 raise
645 msg = 'chflag UF_IMMUTABLE not supported by underlying fs'
646 self.skipTest(msg)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700647 try:
648 new_testfn_st = os.stat(support.TESTFN)
649 new_dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
650
651 self.assertEqual(testfn_st.st_flags, new_testfn_st.st_flags)
652 self.assertEqual(dummy_symlink_st.st_flags | stat.UF_IMMUTABLE,
653 new_dummy_symlink_st.st_flags)
654 finally:
655 fn(_DUMMY_SYMLINK, dummy_symlink_st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000656
Guido van Rossum98297ee2007-11-06 21:34:58 +0000657 def test_environ(self):
Victor Stinner17b490d2010-05-06 22:19:30 +0000658 if os.name == "nt":
659 item_type = str
660 else:
661 item_type = bytes
Guido van Rossum98297ee2007-11-06 21:34:58 +0000662 for k, v in posix.environ.items():
Victor Stinner17b490d2010-05-06 22:19:30 +0000663 self.assertEqual(type(k), item_type)
664 self.assertEqual(type(v), item_type)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000665
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000666 def test_getcwd_long_pathnames(self):
667 if hasattr(posix, 'getcwd'):
668 dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef'
669 curdir = os.getcwd()
670 base_path = os.path.abspath(support.TESTFN) + '.getcwd'
671
672 try:
673 os.mkdir(base_path)
674 os.chdir(base_path)
675 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000676# Just returning nothing instead of the SkipTest exception,
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000677# because the test results in Error in that case.
678# Is that ok?
Benjamin Petersone549ead2009-03-28 21:42:05 +0000679# raise unittest.SkipTest("cannot create directory for testing")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000680 return
681
682 def _create_and_do_getcwd(dirname, current_path_length = 0):
683 try:
684 os.mkdir(dirname)
685 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000686 raise unittest.SkipTest("mkdir cannot create directory sufficiently deep for getcwd test")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000687
688 os.chdir(dirname)
689 try:
690 os.getcwd()
691 if current_path_length < 1027:
692 _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
693 finally:
694 os.chdir('..')
695 os.rmdir(dirname)
696
697 _create_and_do_getcwd(dirname)
698
699 finally:
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000700 os.chdir(curdir)
R. David Murray414c91f2009-07-09 20:12:31 +0000701 support.rmtree(base_path)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000702
Ross Lagerwallb0ae53d2011-06-10 07:30:30 +0200703 @unittest.skipUnless(hasattr(posix, 'getgrouplist'), "test needs posix.getgrouplist()")
704 @unittest.skipUnless(hasattr(pwd, 'getpwuid'), "test needs pwd.getpwuid()")
705 @unittest.skipUnless(hasattr(os, 'getuid'), "test needs os.getuid()")
706 def test_getgrouplist(self):
Ross Lagerwalla0b315f2012-12-13 15:20:26 +0000707 user = pwd.getpwuid(os.getuid())[0]
708 group = pwd.getpwuid(os.getuid())[3]
709 self.assertIn(group, posix.getgrouplist(user, group))
Ross Lagerwallb0ae53d2011-06-10 07:30:30 +0200710
Ross Lagerwallb0ae53d2011-06-10 07:30:30 +0200711
Antoine Pitrou318b8f32011-01-12 18:45:27 +0000712 @unittest.skipUnless(hasattr(os, 'getegid'), "test needs os.getegid()")
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000713 def test_getgroups(self):
714 with os.popen('id -G') as idg:
715 groups = idg.read().strip()
Charles-François Natalie8a255a2012-05-02 20:01:38 +0200716 ret = idg.close()
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000717
Benjamin Petersonb29614e2012-10-09 11:16:03 -0400718 if ret is not None or not groups:
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000719 raise unittest.SkipTest("need working 'id -G'")
720
Ned Deily028915e2013-02-02 15:08:52 -0800721 # Issues 16698: OS X ABIs prior to 10.6 have limits on getgroups()
722 if sys.platform == 'darwin':
723 import sysconfig
724 dt = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') or '10.0'
725 if float(dt) < 10.6:
726 raise unittest.SkipTest("getgroups(2) is broken prior to 10.6")
727
Ronald Oussoren7fb6f512010-08-01 19:18:13 +0000728 # 'id -G' and 'os.getgroups()' should return the same
729 # groups, ignoring order and duplicates.
Antoine Pitrou318b8f32011-01-12 18:45:27 +0000730 # #10822 - it is implementation defined whether posix.getgroups()
731 # includes the effective gid so we include it anyway, since id -G does
Ronald Oussorencb615e62010-07-24 14:15:19 +0000732 self.assertEqual(
Ronald Oussoren7fb6f512010-08-01 19:18:13 +0000733 set([int(x) for x in groups.split()]),
Antoine Pitrou318b8f32011-01-12 18:45:27 +0000734 set(posix.getgroups() + [posix.getegid()]))
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000735
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000736 # tests for the posix *at functions follow
737
Larry Hastings9cf065c2012-06-22 16:30:09 -0700738 @unittest.skipUnless(os.access in os.supports_dir_fd, "test needs dir_fd support for os.access()")
739 def test_access_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000740 f = posix.open(posix.getcwd(), posix.O_RDONLY)
741 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700742 self.assertTrue(posix.access(support.TESTFN, os.R_OK, dir_fd=f))
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000743 finally:
744 posix.close(f)
745
Larry Hastings9cf065c2012-06-22 16:30:09 -0700746 @unittest.skipUnless(os.chmod in os.supports_dir_fd, "test needs dir_fd support in os.chmod()")
747 def test_chmod_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000748 os.chmod(support.TESTFN, stat.S_IRUSR)
749
750 f = posix.open(posix.getcwd(), posix.O_RDONLY)
751 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700752 posix.chmod(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000753
754 s = posix.stat(support.TESTFN)
755 self.assertEqual(s[0] & stat.S_IRWXU, stat.S_IRUSR | stat.S_IWUSR)
756 finally:
757 posix.close(f)
758
Larry Hastings9cf065c2012-06-22 16:30:09 -0700759 @unittest.skipUnless(os.chown in os.supports_dir_fd, "test needs dir_fd support in os.chown()")
760 def test_chown_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000761 support.unlink(support.TESTFN)
Victor Stinnerbf816222011-06-30 23:25:47 +0200762 support.create_empty_file(support.TESTFN)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000763
764 f = posix.open(posix.getcwd(), posix.O_RDONLY)
765 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700766 posix.chown(support.TESTFN, os.getuid(), os.getgid(), dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000767 finally:
768 posix.close(f)
769
Larry Hastings9cf065c2012-06-22 16:30:09 -0700770 @unittest.skipUnless(os.stat in os.supports_dir_fd, "test needs dir_fd support in os.stat()")
771 def test_stat_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000772 support.unlink(support.TESTFN)
773 with open(support.TESTFN, 'w') as outfile:
774 outfile.write("testline\n")
775
776 f = posix.open(posix.getcwd(), posix.O_RDONLY)
777 try:
778 s1 = posix.stat(support.TESTFN)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700779 s2 = posix.stat(support.TESTFN, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000780 self.assertEqual(s1, s2)
Serhiy Storchakaa2ad5c32013-01-07 23:13:46 +0200781 s2 = posix.stat(support.TESTFN, dir_fd=None)
782 self.assertEqual(s1, s2)
783 self.assertRaisesRegex(TypeError, 'should be integer, not',
784 posix.stat, support.TESTFN, dir_fd=posix.getcwd())
785 self.assertRaisesRegex(TypeError, 'should be integer, not',
786 posix.stat, support.TESTFN, dir_fd=float(f))
787 self.assertRaises(OverflowError,
788 posix.stat, support.TESTFN, dir_fd=10**20)
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.utime in os.supports_dir_fd, "test needs dir_fd support in os.utime()")
793 def test_utime_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000794 f = posix.open(posix.getcwd(), posix.O_RDONLY)
795 try:
796 now = time.time()
Larry Hastings9cf065c2012-06-22 16:30:09 -0700797 posix.utime(support.TESTFN, None, dir_fd=f)
798 posix.utime(support.TESTFN, dir_fd=f)
799 self.assertRaises(TypeError, posix.utime, support.TESTFN, now, dir_fd=f)
800 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None), dir_fd=f)
801 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None), dir_fd=f)
802 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now), dir_fd=f)
803 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, "x"), dir_fd=f)
804 posix.utime(support.TESTFN, (int(now), int(now)), dir_fd=f)
805 posix.utime(support.TESTFN, (now, now), dir_fd=f)
806 posix.utime(support.TESTFN,
807 (int(now), int((now - int(now)) * 1e9)), dir_fd=f)
808 posix.utime(support.TESTFN, dir_fd=f,
809 times=(int(now), int((now - int(now)) * 1e9)))
810
Larry Hastings90867a52012-06-22 17:01:41 -0700811 # try dir_fd and follow_symlinks together
Larry Hastings9cf065c2012-06-22 16:30:09 -0700812 if os.utime in os.supports_follow_symlinks:
Larry Hastings90867a52012-06-22 17:01:41 -0700813 try:
814 posix.utime(support.TESTFN, follow_symlinks=False, dir_fd=f)
Georg Brandl969288e2012-06-26 09:25:44 +0200815 except ValueError:
Larry Hastings90867a52012-06-22 17:01:41 -0700816 # whoops! using both together not supported on this platform.
817 pass
Larry Hastings9cf065c2012-06-22 16:30:09 -0700818
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000819 finally:
820 posix.close(f)
821
Larry Hastings9cf065c2012-06-22 16:30:09 -0700822 @unittest.skipUnless(os.link in os.supports_dir_fd, "test needs dir_fd support in os.link()")
823 def test_link_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000824 f = posix.open(posix.getcwd(), posix.O_RDONLY)
825 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700826 posix.link(support.TESTFN, support.TESTFN + 'link', src_dir_fd=f, dst_dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000827 # should have same inodes
828 self.assertEqual(posix.stat(support.TESTFN)[1],
829 posix.stat(support.TESTFN + 'link')[1])
830 finally:
831 posix.close(f)
832 support.unlink(support.TESTFN + 'link')
833
Larry Hastings9cf065c2012-06-22 16:30:09 -0700834 @unittest.skipUnless(os.mkdir in os.supports_dir_fd, "test needs dir_fd support in os.mkdir()")
835 def test_mkdir_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000836 f = posix.open(posix.getcwd(), posix.O_RDONLY)
837 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700838 posix.mkdir(support.TESTFN + 'dir', dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000839 posix.stat(support.TESTFN + 'dir') # should not raise exception
840 finally:
841 posix.close(f)
842 support.rmtree(support.TESTFN + 'dir')
843
Larry Hastings9cf065c2012-06-22 16:30:09 -0700844 @unittest.skipUnless((os.mknod in os.supports_dir_fd) and hasattr(stat, 'S_IFIFO'),
845 "test requires both stat.S_IFIFO and dir_fd support for os.mknod()")
846 def test_mknod_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000847 # Test using mknodat() to create a FIFO (the only use specified
848 # by POSIX).
849 support.unlink(support.TESTFN)
850 mode = stat.S_IFIFO | stat.S_IRUSR | stat.S_IWUSR
851 f = posix.open(posix.getcwd(), posix.O_RDONLY)
852 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700853 posix.mknod(support.TESTFN, mode, 0, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000854 except OSError as e:
855 # Some old systems don't allow unprivileged users to use
856 # mknod(), or only support creating device nodes.
857 self.assertIn(e.errno, (errno.EPERM, errno.EINVAL))
858 else:
859 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
860 finally:
861 posix.close(f)
862
Larry Hastings9cf065c2012-06-22 16:30:09 -0700863 @unittest.skipUnless(os.open in os.supports_dir_fd, "test needs dir_fd support in os.open()")
864 def test_open_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000865 support.unlink(support.TESTFN)
866 with open(support.TESTFN, 'w') as outfile:
867 outfile.write("testline\n")
868 a = posix.open(posix.getcwd(), posix.O_RDONLY)
Larry Hastings9cf065c2012-06-22 16:30:09 -0700869 b = posix.open(support.TESTFN, posix.O_RDONLY, dir_fd=a)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000870 try:
871 res = posix.read(b, 9).decode(encoding="utf-8")
872 self.assertEqual("testline\n", res)
873 finally:
874 posix.close(a)
875 posix.close(b)
876
Larry Hastings9cf065c2012-06-22 16:30:09 -0700877 @unittest.skipUnless(os.readlink in os.supports_dir_fd, "test needs dir_fd support in os.readlink()")
878 def test_readlink_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000879 os.symlink(support.TESTFN, support.TESTFN + 'link')
880 f = posix.open(posix.getcwd(), posix.O_RDONLY)
881 try:
882 self.assertEqual(posix.readlink(support.TESTFN + 'link'),
Larry Hastings9cf065c2012-06-22 16:30:09 -0700883 posix.readlink(support.TESTFN + 'link', dir_fd=f))
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000884 finally:
885 support.unlink(support.TESTFN + 'link')
886 posix.close(f)
887
Larry Hastings9cf065c2012-06-22 16:30:09 -0700888 @unittest.skipUnless(os.rename in os.supports_dir_fd, "test needs dir_fd support in os.rename()")
889 def test_rename_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000890 support.unlink(support.TESTFN)
Victor Stinnerbf816222011-06-30 23:25:47 +0200891 support.create_empty_file(support.TESTFN + 'ren')
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000892 f = posix.open(posix.getcwd(), posix.O_RDONLY)
893 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700894 posix.rename(support.TESTFN + 'ren', support.TESTFN, src_dir_fd=f, dst_dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000895 except:
896 posix.rename(support.TESTFN + 'ren', support.TESTFN)
897 raise
898 else:
Andrew Svetlov5b898402012-12-18 21:26:36 +0200899 posix.stat(support.TESTFN) # should not raise exception
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000900 finally:
901 posix.close(f)
902
Larry Hastings9cf065c2012-06-22 16:30:09 -0700903 @unittest.skipUnless(os.symlink in os.supports_dir_fd, "test needs dir_fd support in os.symlink()")
904 def test_symlink_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000905 f = posix.open(posix.getcwd(), posix.O_RDONLY)
906 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700907 posix.symlink(support.TESTFN, support.TESTFN + 'link', dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000908 self.assertEqual(posix.readlink(support.TESTFN + 'link'), support.TESTFN)
909 finally:
910 posix.close(f)
911 support.unlink(support.TESTFN + 'link')
912
Larry Hastings9cf065c2012-06-22 16:30:09 -0700913 @unittest.skipUnless(os.unlink in os.supports_dir_fd, "test needs dir_fd support in os.unlink()")
914 def test_unlink_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000915 f = posix.open(posix.getcwd(), posix.O_RDONLY)
Victor Stinnerbf816222011-06-30 23:25:47 +0200916 support.create_empty_file(support.TESTFN + 'del')
Andrew Svetlov5b898402012-12-18 21:26:36 +0200917 posix.stat(support.TESTFN + 'del') # should not raise exception
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000918 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700919 posix.unlink(support.TESTFN + 'del', dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000920 except:
921 support.unlink(support.TESTFN + 'del')
922 raise
923 else:
924 self.assertRaises(OSError, posix.stat, support.TESTFN + 'link')
925 finally:
926 posix.close(f)
927
Larry Hastings9cf065c2012-06-22 16:30:09 -0700928 @unittest.skipUnless(os.mkfifo in os.supports_dir_fd, "test needs dir_fd support in os.mkfifo()")
929 def test_mkfifo_dir_fd(self):
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000930 support.unlink(support.TESTFN)
931 f = posix.open(posix.getcwd(), posix.O_RDONLY)
932 try:
Larry Hastings9cf065c2012-06-22 16:30:09 -0700933 posix.mkfifo(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR, dir_fd=f)
Antoine Pitrouf65132d2011-02-25 23:25:17 +0000934 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
935 finally:
936 posix.close(f)
937
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500938 requires_sched_h = unittest.skipUnless(hasattr(posix, 'sched_yield'),
939 "don't have scheduling support")
Antoine Pitrou84869872012-08-04 16:16:35 +0200940 requires_sched_affinity = unittest.skipUnless(hasattr(posix, 'sched_setaffinity'),
Benjamin Peterson50ba2712011-08-02 22:15:40 -0500941 "don't have sched affinity support")
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500942
943 @requires_sched_h
944 def test_sched_yield(self):
945 # This has no error conditions (at least on Linux).
946 posix.sched_yield()
947
948 @requires_sched_h
Charles-François Nataliea0d5fc2011-09-06 19:03:35 +0200949 @unittest.skipUnless(hasattr(posix, 'sched_get_priority_max'),
950 "requires sched_get_priority_max()")
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500951 def test_sched_priority(self):
952 # Round-robin usually has interesting priorities.
953 pol = posix.SCHED_RR
954 lo = posix.sched_get_priority_min(pol)
955 hi = posix.sched_get_priority_max(pol)
956 self.assertIsInstance(lo, int)
957 self.assertIsInstance(hi, int)
958 self.assertGreaterEqual(hi, lo)
Benjamin Peterson539b6c42011-08-02 22:09:37 -0500959 # OSX evidently just returns 15 without checking the argument.
960 if sys.platform != "darwin":
Benjamin Petersonc1581582011-08-02 22:10:55 -0500961 self.assertRaises(OSError, posix.sched_get_priority_min, -23)
962 self.assertRaises(OSError, posix.sched_get_priority_max, -23)
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500963
Benjamin Petersonc5fce4d2011-08-02 18:07:32 -0500964 @unittest.skipUnless(hasattr(posix, 'sched_setscheduler'), "can't change scheduler")
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500965 def test_get_and_set_scheduler_and_param(self):
966 possible_schedulers = [sched for name, sched in posix.__dict__.items()
967 if name.startswith("SCHED_")]
968 mine = posix.sched_getscheduler(0)
969 self.assertIn(mine, possible_schedulers)
970 try:
Jesus Ceaceb5d162011-09-10 01:16:55 +0200971 parent = posix.sched_getscheduler(os.getppid())
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500972 except OSError as e:
Jesus Ceaceb5d162011-09-10 01:16:55 +0200973 if e.errno != errno.EPERM:
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500974 raise
975 else:
Jesus Ceaceb5d162011-09-10 01:16:55 +0200976 self.assertIn(parent, possible_schedulers)
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500977 self.assertRaises(OSError, posix.sched_getscheduler, -1)
978 self.assertRaises(OSError, posix.sched_getparam, -1)
979 param = posix.sched_getparam(0)
980 self.assertIsInstance(param.sched_priority, int)
Charles-François Natali7b911cb2011-08-21 12:41:43 +0200981
Charles-François Natalib402a5c2013-01-13 14:13:25 +0100982 # POSIX states that calling sched_setparam() or sched_setscheduler() on
983 # a process with a scheduling policy other than SCHED_FIFO or SCHED_RR
984 # is implementation-defined: NetBSD and FreeBSD can return EINVAL.
985 if not sys.platform.startswith(('freebsd', 'netbsd')):
986 try:
987 posix.sched_setscheduler(0, mine, param)
988 posix.sched_setparam(0, param)
989 except OSError as e:
990 if e.errno != errno.EPERM:
991 raise
Charles-François Natali7b911cb2011-08-21 12:41:43 +0200992 self.assertRaises(OSError, posix.sched_setparam, -1, param)
993
Benjamin Peterson94b580d2011-08-02 17:30:04 -0500994 self.assertRaises(OSError, posix.sched_setscheduler, -1, mine, param)
995 self.assertRaises(TypeError, posix.sched_setscheduler, 0, mine, None)
996 self.assertRaises(TypeError, posix.sched_setparam, 0, 43)
997 param = posix.sched_param(None)
998 self.assertRaises(TypeError, posix.sched_setparam, 0, param)
999 large = 214748364700
1000 param = posix.sched_param(large)
1001 self.assertRaises(OverflowError, posix.sched_setparam, 0, param)
1002 param = posix.sched_param(sched_priority=-large)
1003 self.assertRaises(OverflowError, posix.sched_setparam, 0, param)
1004
Benjamin Petersonc5fce4d2011-08-02 18:07:32 -05001005 @unittest.skipUnless(hasattr(posix, "sched_rr_get_interval"), "no function")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001006 def test_sched_rr_get_interval(self):
Benjamin Peterson43234ab2011-08-02 22:19:14 -05001007 try:
1008 interval = posix.sched_rr_get_interval(0)
1009 except OSError as e:
1010 # This likely means that sched_rr_get_interval is only valid for
1011 # processes with the SCHED_RR scheduler in effect.
1012 if e.errno != errno.EINVAL:
1013 raise
1014 self.skipTest("only works on SCHED_RR processes")
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001015 self.assertIsInstance(interval, float)
1016 # Reasonable constraints, I think.
1017 self.assertGreaterEqual(interval, 0.)
1018 self.assertLess(interval, 1.)
1019
Benjamin Peterson2740af82011-08-02 17:41:34 -05001020 @requires_sched_affinity
Antoine Pitrou84869872012-08-04 16:16:35 +02001021 def test_sched_getaffinity(self):
1022 mask = posix.sched_getaffinity(0)
1023 self.assertIsInstance(mask, set)
1024 self.assertGreaterEqual(len(mask), 1)
1025 self.assertRaises(OSError, posix.sched_getaffinity, -1)
1026 for cpu in mask:
1027 self.assertIsInstance(cpu, int)
1028 self.assertGreaterEqual(cpu, 0)
1029 self.assertLess(cpu, 1 << 32)
1030
1031 @requires_sched_affinity
1032 def test_sched_setaffinity(self):
1033 mask = posix.sched_getaffinity(0)
1034 if len(mask) > 1:
1035 # Empty masks are forbidden
1036 mask.pop()
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001037 posix.sched_setaffinity(0, mask)
Antoine Pitrou84869872012-08-04 16:16:35 +02001038 self.assertEqual(posix.sched_getaffinity(0), mask)
1039 self.assertRaises(OSError, posix.sched_setaffinity, 0, [])
1040 self.assertRaises(ValueError, posix.sched_setaffinity, 0, [-10])
1041 self.assertRaises(OverflowError, posix.sched_setaffinity, 0, [1<<128])
Benjamin Peterson94b580d2011-08-02 17:30:04 -05001042 self.assertRaises(OSError, posix.sched_setaffinity, -1, mask)
1043
Victor Stinner8b905bd2011-10-25 13:34:04 +02001044 def test_rtld_constants(self):
1045 # check presence of major RTLD_* constants
1046 posix.RTLD_LAZY
1047 posix.RTLD_NOW
1048 posix.RTLD_GLOBAL
1049 posix.RTLD_LOCAL
1050
Jesus Cea60c13dd2012-06-23 02:58:14 +02001051 @unittest.skipUnless(hasattr(os, 'SEEK_HOLE'),
1052 "test needs an OS that reports file holes")
Hynek Schlawackf841e422012-06-24 09:51:46 +02001053 def test_fs_holes(self):
Jesus Cea94363612012-06-22 18:32:07 +02001054 # Even if the filesystem doesn't report holes,
1055 # if the OS supports it the SEEK_* constants
1056 # will be defined and will have a consistent
1057 # behaviour:
1058 # os.SEEK_DATA = current position
1059 # os.SEEK_HOLE = end of file position
Hynek Schlawackf841e422012-06-24 09:51:46 +02001060 with open(support.TESTFN, 'r+b') as fp:
Jesus Cea94363612012-06-22 18:32:07 +02001061 fp.write(b"hello")
1062 fp.flush()
1063 size = fp.tell()
1064 fno = fp.fileno()
Jesus Cead46f7d22012-07-07 14:56:04 +02001065 try :
1066 for i in range(size):
1067 self.assertEqual(i, os.lseek(fno, i, os.SEEK_DATA))
1068 self.assertLessEqual(size, os.lseek(fno, i, os.SEEK_HOLE))
1069 self.assertRaises(OSError, os.lseek, fno, size, os.SEEK_DATA)
1070 self.assertRaises(OSError, os.lseek, fno, size, os.SEEK_HOLE)
1071 except OSError :
1072 # Some OSs claim to support SEEK_HOLE/SEEK_DATA
1073 # but it is not true.
1074 # For instance:
1075 # http://lists.freebsd.org/pipermail/freebsd-amd64/2012-January/014332.html
1076 raise unittest.SkipTest("OSError raised!")
Jesus Cea94363612012-06-22 18:32:07 +02001077
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001078class PosixGroupsTester(unittest.TestCase):
1079
1080 def setUp(self):
1081 if posix.getuid() != 0:
1082 raise unittest.SkipTest("not enough privileges")
1083 if not hasattr(posix, 'getgroups'):
1084 raise unittest.SkipTest("need posix.getgroups")
1085 if sys.platform == 'darwin':
1086 raise unittest.SkipTest("getgroups(2) is broken on OSX")
1087 self.saved_groups = posix.getgroups()
1088
1089 def tearDown(self):
1090 if hasattr(posix, 'setgroups'):
1091 posix.setgroups(self.saved_groups)
1092 elif hasattr(posix, 'initgroups'):
1093 name = pwd.getpwuid(posix.getuid()).pw_name
1094 posix.initgroups(name, self.saved_groups[0])
1095
1096 @unittest.skipUnless(hasattr(posix, 'initgroups'),
1097 "test needs posix.initgroups()")
1098 def test_initgroups(self):
1099 # find missing group
1100
Antoine Pitroue5a91012010-09-04 17:32:06 +00001101 g = max(self.saved_groups) + 1
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001102 name = pwd.getpwuid(posix.getuid()).pw_name
1103 posix.initgroups(name, g)
1104 self.assertIn(g, posix.getgroups())
1105
1106 @unittest.skipUnless(hasattr(posix, 'setgroups'),
1107 "test needs posix.setgroups()")
1108 def test_setgroups(self):
Antoine Pitroue5a91012010-09-04 17:32:06 +00001109 for groups in [[0], list(range(16))]:
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +00001110 posix.setgroups(groups)
1111 self.assertListEqual(groups, posix.getgroups())
1112
Neal Norwitze241ce82003-02-17 18:17:05 +00001113def test_main():
Antoine Pitrou68c95922011-03-20 17:33:57 +01001114 try:
1115 support.run_unittest(PosixTester, PosixGroupsTester)
1116 finally:
1117 support.reap_children()
Neal Norwitze241ce82003-02-17 18:17:05 +00001118
1119if __name__ == '__main__':
1120 test_main()