3 from test import test_support
5 # Skip these tests if there is no posix module.
6 posix = test_support.import_module('posix')
20 _DUMMY_SYMLINK = os.path.join(tempfile.gettempdir(),
21 test_support.TESTFN + '-dummy-symlink')
23 warnings.filterwarnings('ignore', '.* potential security risk .*',
26 class PosixTester(unittest.TestCase):
30 fp = open(test_support.TESTFN, 'w+')
32 self.teardown_files = [ test_support.TESTFN ]
35 for teardown_file in self.teardown_files:
36 os.unlink(teardown_file)
38 def testNoArgFunctions(self):
39 # test posix functions which take no arguments and have
40 # no side-effects which we need to cleanup (e.g., fork, wait, abort)
41 NO_ARG_FUNCTIONS = [ "ctermid", "getcwd", "getcwdu", "uname",
42 "times", "getloadavg", "tmpnam",
43 "getegid", "geteuid", "getgid", "getgroups",
44 "getpid", "getpgrp", "getppid", "getuid",
47 with warnings.catch_warnings():
48 warnings.filterwarnings("ignore", "", DeprecationWarning)
49 for name in NO_ARG_FUNCTIONS:
50 posix_func = getattr(posix, name, None)
51 if posix_func is not None:
53 self.assertRaises(TypeError, posix_func, 1)
55 if hasattr(posix, 'getresuid'):
56 def test_getresuid(self):
57 user_ids = posix.getresuid()
58 self.assertEqual(len(user_ids), 3)
60 self.assertGreaterEqual(val, 0)
62 if hasattr(posix, 'getresgid'):
63 def test_getresgid(self):
64 group_ids = posix.getresgid()
65 self.assertEqual(len(group_ids), 3)
67 self.assertGreaterEqual(val, 0)
69 if hasattr(posix, 'setresuid'):
70 def test_setresuid(self):
71 current_user_ids = posix.getresuid()
72 self.assertIsNone(posix.setresuid(*current_user_ids))
73 # -1 means don't change that value.
74 self.assertIsNone(posix.setresuid(-1, -1, -1))
76 def test_setresuid_exception(self):
77 # Don't do this test if someone is silly enough to run us as root.
78 current_user_ids = posix.getresuid()
79 if 0 not in current_user_ids:
80 new_user_ids = (current_user_ids[0]+1, -1, -1)
81 self.assertRaises(OSError, posix.setresuid, *new_user_ids)
83 if hasattr(posix, 'setresgid'):
84 def test_setresgid(self):
85 current_group_ids = posix.getresgid()
86 self.assertIsNone(posix.setresgid(*current_group_ids))
87 # -1 means don't change that value.
88 self.assertIsNone(posix.setresgid(-1, -1, -1))
90 def test_setresgid_exception(self):
91 # Don't do this test if someone is silly enough to run us as root.
92 current_group_ids = posix.getresgid()
93 if 0 not in current_group_ids:
94 new_group_ids = (current_group_ids[0]+1, -1, -1)
95 self.assertRaises(OSError, posix.setresgid, *new_group_ids)
97 @unittest.skipUnless(hasattr(posix, 'initgroups'),
98 "test needs os.initgroups()")
99 def test_initgroups(self):
100 # It takes a string and an integer; check that it raises a TypeError
101 # for other argument lists.
102 self.assertRaises(TypeError, posix.initgroups)
103 self.assertRaises(TypeError, posix.initgroups, None)
104 self.assertRaises(TypeError, posix.initgroups, 3, "foo")
105 self.assertRaises(TypeError, posix.initgroups, "foo", 3, object())
107 # If a non-privileged user invokes it, it should fail with OSError
110 name = pwd.getpwuid(posix.getuid()).pw_name
112 posix.initgroups(name, 13)
114 self.assertEqual(e.errno, errno.EPERM)
116 self.fail("Expected OSError to be raised by initgroups")
118 def test_statvfs(self):
119 if hasattr(posix, 'statvfs'):
120 self.assertTrue(posix.statvfs(os.curdir))
122 def test_fstatvfs(self):
123 if hasattr(posix, 'fstatvfs'):
124 fp = open(test_support.TESTFN)
126 self.assertTrue(posix.fstatvfs(fp.fileno()))
130 def test_ftruncate(self):
131 if hasattr(posix, 'ftruncate'):
132 fp = open(test_support.TESTFN, 'w+')
134 # we need to have some data to truncate
137 posix.ftruncate(fp.fileno(), 0)
142 if hasattr(posix, 'dup'):
143 fp = open(test_support.TESTFN)
145 fd = posix.dup(fp.fileno())
146 self.assertIsInstance(fd, int)
151 def test_confstr(self):
152 if hasattr(posix, 'confstr'):
153 self.assertRaises(ValueError, posix.confstr, "CS_garbage")
154 self.assertEqual(len(posix.confstr("CS_PATH")) > 0, True)
157 if hasattr(posix, 'dup2'):
158 fp1 = open(test_support.TESTFN)
159 fp2 = open(test_support.TESTFN)
161 posix.dup2(fp1.fileno(), fp2.fileno())
166 def fdopen_helper(self, *args):
167 fd = os.open(test_support.TESTFN, os.O_RDONLY)
168 fp2 = posix.fdopen(fd, *args)
171 def test_fdopen(self):
172 if hasattr(posix, 'fdopen'):
174 self.fdopen_helper('r')
175 self.fdopen_helper('r', 100)
177 def test_osexlock(self):
178 if hasattr(posix, "O_EXLOCK"):
179 fd = os.open(test_support.TESTFN,
180 os.O_WRONLY|os.O_EXLOCK|os.O_CREAT)
181 self.assertRaises(OSError, os.open, test_support.TESTFN,
182 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
185 if hasattr(posix, "O_SHLOCK"):
186 fd = os.open(test_support.TESTFN,
187 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
188 self.assertRaises(OSError, os.open, test_support.TESTFN,
189 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
192 def test_osshlock(self):
193 if hasattr(posix, "O_SHLOCK"):
194 fd1 = os.open(test_support.TESTFN,
195 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
196 fd2 = os.open(test_support.TESTFN,
197 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
201 if hasattr(posix, "O_EXLOCK"):
202 fd = os.open(test_support.TESTFN,
203 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
204 self.assertRaises(OSError, os.open, test_support.TESTFN,
205 os.O_RDONLY|os.O_EXLOCK|os.O_NONBLOCK)
208 def test_fstat(self):
209 if hasattr(posix, 'fstat'):
210 fp = open(test_support.TESTFN)
212 self.assertTrue(posix.fstat(fp.fileno()))
217 if hasattr(posix, 'stat'):
218 self.assertTrue(posix.stat(test_support.TESTFN))
220 def _test_all_chown_common(self, chown_func, first_param):
221 """Common code for chown, fchown and lchown tests."""
224 # Many linux distros have a nfsnobody user as MAX_UID-2
225 # that makes a good test case for signedness issues.
226 # http://bugs.python.org/issue1747858
227 # This part of the test only runs when run as root.
228 # Only scary people run their tests as root.
229 ent = pwd.getpwnam('nfsnobody')
230 chown_func(first_param, ent.pw_uid, ent.pw_gid)
234 # non-root cannot chown to root, raises OSError
235 self.assertRaises(OSError, chown_func,
238 # test a successful chown call
239 chown_func(first_param, os.getuid(), os.getgid())
241 @unittest.skipUnless(hasattr(posix, 'chown'), "test needs os.chown()")
242 def test_chown(self):
243 # raise an OSError if the file does not exist
244 os.unlink(test_support.TESTFN)
245 self.assertRaises(OSError, posix.chown, test_support.TESTFN, -1, -1)
248 open(test_support.TESTFN, 'w').close()
249 self._test_all_chown_common(posix.chown, test_support.TESTFN)
251 @unittest.skipUnless(hasattr(posix, 'fchown'), "test needs os.fchown()")
252 def test_fchown(self):
253 os.unlink(test_support.TESTFN)
256 test_file = open(test_support.TESTFN, 'w')
258 fd = test_file.fileno()
259 self._test_all_chown_common(posix.fchown, fd)
263 @unittest.skipUnless(hasattr(posix, 'lchown'), "test needs os.lchown()")
264 def test_lchown(self):
265 os.unlink(test_support.TESTFN)
267 os.symlink(_DUMMY_SYMLINK, test_support.TESTFN)
268 self._test_all_chown_common(posix.lchown, test_support.TESTFN)
270 def test_chdir(self):
271 if hasattr(posix, 'chdir'):
272 posix.chdir(os.curdir)
273 self.assertRaises(OSError, posix.chdir, test_support.TESTFN)
275 def test_lsdir(self):
276 if hasattr(posix, 'lsdir'):
277 self.assertIn(test_support.TESTFN, posix.lsdir(os.curdir))
279 def test_access(self):
280 if hasattr(posix, 'access'):
281 self.assertTrue(posix.access(test_support.TESTFN, os.R_OK))
283 def test_umask(self):
284 if hasattr(posix, 'umask'):
285 old_mask = posix.umask(0)
286 self.assertIsInstance(old_mask, int)
287 posix.umask(old_mask)
289 def test_strerror(self):
290 if hasattr(posix, 'strerror'):
291 self.assertTrue(posix.strerror(0))
294 if hasattr(posix, 'pipe'):
295 reader, writer = posix.pipe()
299 def test_tempnam(self):
300 if hasattr(posix, 'tempnam'):
301 with warnings.catch_warnings():
302 warnings.filterwarnings("ignore", "tempnam", DeprecationWarning)
303 self.assertTrue(posix.tempnam())
304 self.assertTrue(posix.tempnam(os.curdir))
305 self.assertTrue(posix.tempnam(os.curdir, 'blah'))
307 def test_tmpfile(self):
308 if hasattr(posix, 'tmpfile'):
309 with warnings.catch_warnings():
310 warnings.filterwarnings("ignore", "tmpfile", DeprecationWarning)
314 def test_utime(self):
315 if hasattr(posix, 'utime'):
317 posix.utime(test_support.TESTFN, None)
318 self.assertRaises(TypeError, posix.utime, test_support.TESTFN, (None, None))
319 self.assertRaises(TypeError, posix.utime, test_support.TESTFN, (now, None))
320 self.assertRaises(TypeError, posix.utime, test_support.TESTFN, (None, now))
321 posix.utime(test_support.TESTFN, (int(now), int(now)))
322 posix.utime(test_support.TESTFN, (now, now))
324 def _test_chflags_regular_file(self, chflags_func, target_file):
325 st = os.stat(target_file)
326 self.assertTrue(hasattr(st, 'st_flags'))
327 chflags_func(target_file, st.st_flags | stat.UF_IMMUTABLE)
329 new_st = os.stat(target_file)
330 self.assertEqual(st.st_flags | stat.UF_IMMUTABLE, new_st.st_flags)
332 fd = open(target_file, 'w+')
334 self.assertEqual(e.errno, errno.EPERM)
336 posix.chflags(target_file, st.st_flags)
338 @unittest.skipUnless(hasattr(posix, 'chflags'), 'test needs os.chflags()')
339 def test_chflags(self):
340 self._test_chflags_regular_file(posix.chflags, test_support.TESTFN)
342 @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
343 def test_lchflags_regular_file(self):
344 self._test_chflags_regular_file(posix.lchflags, test_support.TESTFN)
346 @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
347 def test_lchflags_symlink(self):
348 testfn_st = os.stat(test_support.TESTFN)
350 self.assertTrue(hasattr(testfn_st, 'st_flags'))
352 os.symlink(test_support.TESTFN, _DUMMY_SYMLINK)
353 self.teardown_files.append(_DUMMY_SYMLINK)
354 dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
356 posix.lchflags(_DUMMY_SYMLINK,
357 dummy_symlink_st.st_flags | stat.UF_IMMUTABLE)
359 new_testfn_st = os.stat(test_support.TESTFN)
360 new_dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
362 self.assertEqual(testfn_st.st_flags, new_testfn_st.st_flags)
363 self.assertEqual(dummy_symlink_st.st_flags | stat.UF_IMMUTABLE,
364 new_dummy_symlink_st.st_flags)
366 posix.lchflags(_DUMMY_SYMLINK, dummy_symlink_st.st_flags)
368 def test_getcwd_long_pathnames(self):
369 if hasattr(posix, 'getcwd'):
370 dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef'
372 base_path = os.path.abspath(test_support.TESTFN) + '.getcwd'
378 # Just returning nothing instead of the SkipTest exception,
379 # because the test results in Error in that case.
381 # raise unittest.SkipTest, "cannot create directory for testing"
385 def _create_and_do_getcwd(dirname, current_path_length = 0):
389 raise unittest.SkipTest, "mkdir cannot create directory sufficiently deep for getcwd test"
394 if current_path_length < 4099:
395 _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
397 expected_errno = errno.ENAMETOOLONG
398 if 'sunos' in sys.platform or 'openbsd' in sys.platform:
399 expected_errno = errno.ERANGE # Issue 9185
400 self.assertEqual(e.errno, expected_errno)
405 _create_and_do_getcwd(dirname)
409 shutil.rmtree(base_path)
411 @unittest.skipUnless(hasattr(os, 'getegid'), "test needs os.getegid()")
412 def test_getgroups(self):
413 with os.popen('id -G') as idg:
414 groups = idg.read().strip()
417 raise unittest.SkipTest("need working 'id -G'")
419 # 'id -G' and 'os.getgroups()' should return the same
420 # groups, ignoring order and duplicates.
421 # #10822 - it is implementation defined whether posix.getgroups()
422 # includes the effective gid so we include it anyway, since id -G does
424 set([int(x) for x in groups.split()]),
425 set(posix.getgroups() + [posix.getegid()]))
427 class PosixGroupsTester(unittest.TestCase):
430 if posix.getuid() != 0:
431 raise unittest.SkipTest("not enough privileges")
432 if not hasattr(posix, 'getgroups'):
433 raise unittest.SkipTest("need posix.getgroups")
434 if sys.platform == 'darwin':
435 raise unittest.SkipTest("getgroups(2) is broken on OSX")
436 self.saved_groups = posix.getgroups()
439 if hasattr(posix, 'setgroups'):
440 posix.setgroups(self.saved_groups)
441 elif hasattr(posix, 'initgroups'):
442 name = pwd.getpwuid(posix.getuid()).pw_name
443 posix.initgroups(name, self.saved_groups[0])
445 @unittest.skipUnless(hasattr(posix, 'initgroups'),
446 "test needs posix.initgroups()")
447 def test_initgroups(self):
450 g = max(self.saved_groups) + 1
451 name = pwd.getpwuid(posix.getuid()).pw_name
452 posix.initgroups(name, g)
453 self.assertIn(g, posix.getgroups())
455 @unittest.skipUnless(hasattr(posix, 'setgroups'),
456 "test needs posix.setgroups()")
457 def test_setgroups(self):
458 for groups in [[0], range(16)]:
459 posix.setgroups(groups)
460 self.assertListEqual(groups, posix.getgroups())
464 test_support.run_unittest(PosixTester, PosixGroupsTester)
466 if __name__ == '__main__':