blob: 556305003b3d4db87ca5074ab019bae5697c5a2f [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
Christian Heimesd5e2b6f2008-03-19 21:50:51 +000012import pwd
Benjamin Petersondcf97b92008-07-02 17:30:14 +000013import shutil
Benjamin Peterson052a02b2010-08-17 01:27:09 +000014import stat
Neal Norwitze241ce82003-02-17 18:17:05 +000015import unittest
16import warnings
R. David Murraya21e4ca2009-03-31 23:16:50 +000017
Ned Deily3eb67d52011-06-28 00:00:28 -070018_DUMMY_SYMLINK = '%s/dummy-symlink' % os.getenv('TMPDIR', '/tmp')
Neal Norwitze241ce82003-02-17 18:17:05 +000019
20class PosixTester(unittest.TestCase):
21
22 def setUp(self):
23 # create empty file
Benjamin Petersonee8712c2008-05-20 21:35:26 +000024 fp = open(support.TESTFN, 'w+')
Neal Norwitze241ce82003-02-17 18:17:05 +000025 fp.close()
Ned Deily3eb67d52011-06-28 00:00:28 -070026 self.teardown_files = [ support.TESTFN ]
Brett Cannonc8d502e2010-03-20 21:53:28 +000027 self._warnings_manager = support.check_warnings()
28 self._warnings_manager.__enter__()
29 warnings.filterwarnings('ignore', '.* potential security risk .*',
30 RuntimeWarning)
Neal Norwitze241ce82003-02-17 18:17:05 +000031
32 def tearDown(self):
Ned Deily3eb67d52011-06-28 00:00:28 -070033 for teardown_file in self.teardown_files:
34 support.unlink(teardown_file)
Brett Cannonc8d502e2010-03-20 21:53:28 +000035 self._warnings_manager.__exit__(None, None, None)
Neal Norwitze241ce82003-02-17 18:17:05 +000036
37 def testNoArgFunctions(self):
38 # test posix functions which take no arguments and have
39 # no side-effects which we need to cleanup (e.g., fork, wait, abort)
Guido van Rossumf0af3e32008-10-02 18:55:37 +000040 NO_ARG_FUNCTIONS = [ "ctermid", "getcwd", "getcwdb", "uname",
Guido van Rossum687b9c02007-10-25 23:18:51 +000041 "times", "getloadavg",
Neal Norwitze241ce82003-02-17 18:17:05 +000042 "getegid", "geteuid", "getgid", "getgroups",
43 "getpid", "getpgrp", "getppid", "getuid",
44 ]
Neal Norwitz71b13e82003-02-23 22:12:24 +000045
Neal Norwitze241ce82003-02-17 18:17:05 +000046 for name in NO_ARG_FUNCTIONS:
47 posix_func = getattr(posix, name, None)
48 if posix_func is not None:
49 posix_func()
Neal Norwitz2ff51a82003-02-17 22:40:31 +000050 self.assertRaises(TypeError, posix_func, 1)
Neal Norwitze241ce82003-02-17 18:17:05 +000051
Martin v. Löwis7aed61a2009-11-27 14:09:49 +000052 if hasattr(posix, 'getresuid'):
53 def test_getresuid(self):
54 user_ids = posix.getresuid()
55 self.assertEqual(len(user_ids), 3)
56 for val in user_ids:
57 self.assertGreaterEqual(val, 0)
58
59 if hasattr(posix, 'getresgid'):
60 def test_getresgid(self):
61 group_ids = posix.getresgid()
62 self.assertEqual(len(group_ids), 3)
63 for val in group_ids:
64 self.assertGreaterEqual(val, 0)
65
66 if hasattr(posix, 'setresuid'):
67 def test_setresuid(self):
68 current_user_ids = posix.getresuid()
69 self.assertIsNone(posix.setresuid(*current_user_ids))
70 # -1 means don't change that value.
71 self.assertIsNone(posix.setresuid(-1, -1, -1))
72
73 def test_setresuid_exception(self):
74 # Don't do this test if someone is silly enough to run us as root.
75 current_user_ids = posix.getresuid()
76 if 0 not in current_user_ids:
77 new_user_ids = (current_user_ids[0]+1, -1, -1)
78 self.assertRaises(OSError, posix.setresuid, *new_user_ids)
79
80 if hasattr(posix, 'setresgid'):
81 def test_setresgid(self):
82 current_group_ids = posix.getresgid()
83 self.assertIsNone(posix.setresgid(*current_group_ids))
84 # -1 means don't change that value.
85 self.assertIsNone(posix.setresgid(-1, -1, -1))
86
87 def test_setresgid_exception(self):
88 # Don't do this test if someone is silly enough to run us as root.
89 current_group_ids = posix.getresgid()
90 if 0 not in current_group_ids:
91 new_group_ids = (current_group_ids[0]+1, -1, -1)
92 self.assertRaises(OSError, posix.setresgid, *new_group_ids)
93
Antoine Pitroub7572f02009-12-02 20:46:48 +000094 @unittest.skipUnless(hasattr(posix, 'initgroups'),
95 "test needs os.initgroups()")
96 def test_initgroups(self):
97 # It takes a string and an integer; check that it raises a TypeError
98 # for other argument lists.
99 self.assertRaises(TypeError, posix.initgroups)
100 self.assertRaises(TypeError, posix.initgroups, None)
101 self.assertRaises(TypeError, posix.initgroups, 3, "foo")
102 self.assertRaises(TypeError, posix.initgroups, "foo", 3, object())
103
104 # If a non-privileged user invokes it, it should fail with OSError
105 # EPERM.
106 if os.getuid() != 0:
107 name = pwd.getpwuid(posix.getuid()).pw_name
108 try:
109 posix.initgroups(name, 13)
110 except OSError as e:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000111 self.assertEqual(e.errno, errno.EPERM)
Antoine Pitroub7572f02009-12-02 20:46:48 +0000112 else:
113 self.fail("Expected OSError to be raised by initgroups")
114
Neal Norwitze241ce82003-02-17 18:17:05 +0000115 def test_statvfs(self):
116 if hasattr(posix, 'statvfs'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000117 self.assertTrue(posix.statvfs(os.curdir))
Neal Norwitze241ce82003-02-17 18:17:05 +0000118
119 def test_fstatvfs(self):
120 if hasattr(posix, 'fstatvfs'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000121 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000122 try:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000123 self.assertTrue(posix.fstatvfs(fp.fileno()))
Neal Norwitze241ce82003-02-17 18:17:05 +0000124 finally:
125 fp.close()
126
127 def test_ftruncate(self):
128 if hasattr(posix, 'ftruncate'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000129 fp = open(support.TESTFN, 'w+')
Neal Norwitze241ce82003-02-17 18:17:05 +0000130 try:
131 # we need to have some data to truncate
132 fp.write('test')
133 fp.flush()
134 posix.ftruncate(fp.fileno(), 0)
135 finally:
136 fp.close()
137
138 def test_dup(self):
139 if hasattr(posix, 'dup'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000140 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000141 try:
142 fd = posix.dup(fp.fileno())
Ezio Melottie9615932010-01-24 19:26:24 +0000143 self.assertIsInstance(fd, int)
Neal Norwitze241ce82003-02-17 18:17:05 +0000144 os.close(fd)
145 finally:
146 fp.close()
147
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000148 def test_confstr(self):
149 if hasattr(posix, 'confstr'):
150 self.assertRaises(ValueError, posix.confstr, "CS_garbage")
151 self.assertEqual(len(posix.confstr("CS_PATH")) > 0, True)
152
Neal Norwitze241ce82003-02-17 18:17:05 +0000153 def test_dup2(self):
154 if hasattr(posix, 'dup2'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000155 fp1 = open(support.TESTFN)
156 fp2 = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000157 try:
158 posix.dup2(fp1.fileno(), fp2.fileno())
159 finally:
160 fp1.close()
161 fp2.close()
162
Skip Montanaro98470002005-06-17 01:14:49 +0000163 def test_osexlock(self):
164 if hasattr(posix, "O_EXLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000165 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000166 os.O_WRONLY|os.O_EXLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000167 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000168 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
169 os.close(fd)
170
171 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000172 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000173 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000174 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000175 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
176 os.close(fd)
177
178 def test_osshlock(self):
179 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000180 fd1 = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000181 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000182 fd2 = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000183 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
184 os.close(fd2)
185 os.close(fd1)
186
187 if hasattr(posix, "O_EXLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000188 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000189 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000190 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000191 os.O_RDONLY|os.O_EXLOCK|os.O_NONBLOCK)
192 os.close(fd)
193
Neal Norwitze241ce82003-02-17 18:17:05 +0000194 def test_fstat(self):
195 if hasattr(posix, 'fstat'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000196 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000197 try:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000198 self.assertTrue(posix.fstat(fp.fileno()))
Neal Norwitze241ce82003-02-17 18:17:05 +0000199 finally:
200 fp.close()
201
202 def test_stat(self):
203 if hasattr(posix, 'stat'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000204 self.assertTrue(posix.stat(support.TESTFN))
Neal Norwitze241ce82003-02-17 18:17:05 +0000205
Benjamin Peterson052a02b2010-08-17 01:27:09 +0000206 @unittest.skipUnless(hasattr(posix, 'mkfifo'), "don't have mkfifo()")
207 def test_mkfifo(self):
208 support.unlink(support.TESTFN)
209 posix.mkfifo(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR)
210 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
211
212 @unittest.skipUnless(hasattr(posix, 'mknod') and hasattr(stat, 'S_IFIFO'),
213 "don't have mknod()/S_IFIFO")
214 def test_mknod(self):
215 # Test using mknod() to create a FIFO (the only use specified
216 # by POSIX).
217 support.unlink(support.TESTFN)
218 mode = stat.S_IFIFO | stat.S_IRUSR | stat.S_IWUSR
219 try:
220 posix.mknod(support.TESTFN, mode, 0)
221 except OSError as e:
222 # Some old systems don't allow unprivileged users to use
223 # mknod(), or only support creating device nodes.
224 self.assertIn(e.errno, (errno.EPERM, errno.EINVAL))
225 else:
226 self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
227
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000228 def _test_all_chown_common(self, chown_func, first_param):
229 """Common code for chown, fchown and lchown tests."""
230 if os.getuid() == 0:
231 try:
232 # Many linux distros have a nfsnobody user as MAX_UID-2
233 # that makes a good test case for signedness issues.
234 # http://bugs.python.org/issue1747858
235 # This part of the test only runs when run as root.
236 # Only scary people run their tests as root.
237 ent = pwd.getpwnam('nfsnobody')
238 chown_func(first_param, ent.pw_uid, ent.pw_gid)
239 except KeyError:
240 pass
241 else:
242 # non-root cannot chown to root, raises OSError
243 self.assertRaises(OSError, chown_func,
244 first_param, 0, 0)
245 # test a successful chown call
246 chown_func(first_param, os.getuid(), os.getgid())
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000247
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000248 @unittest.skipUnless(hasattr(posix, 'chown'), "test needs os.chown()")
249 def test_chown(self):
250 # raise an OSError if the file does not exist
251 os.unlink(support.TESTFN)
252 self.assertRaises(OSError, posix.chown, support.TESTFN, -1, -1)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000253
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000254 # re-create the file
255 open(support.TESTFN, 'w').close()
256 self._test_all_chown_common(posix.chown, support.TESTFN)
257
258 @unittest.skipUnless(hasattr(posix, 'fchown'), "test needs os.fchown()")
259 def test_fchown(self):
260 os.unlink(support.TESTFN)
261
262 # re-create the file
263 test_file = open(support.TESTFN, 'w')
264 try:
265 fd = test_file.fileno()
266 self._test_all_chown_common(posix.fchown, fd)
267 finally:
268 test_file.close()
269
270 @unittest.skipUnless(hasattr(posix, 'lchown'), "test needs os.lchown()")
271 def test_lchown(self):
272 os.unlink(support.TESTFN)
273 # create a symlink
Ned Deily3eb67d52011-06-28 00:00:28 -0700274 os.symlink(_DUMMY_SYMLINK, support.TESTFN)
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000275 self._test_all_chown_common(posix.lchown, support.TESTFN)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000276
Neal Norwitze241ce82003-02-17 18:17:05 +0000277 def test_chdir(self):
278 if hasattr(posix, 'chdir'):
279 posix.chdir(os.curdir)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000280 self.assertRaises(OSError, posix.chdir, support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000281
Martin v. Löwisc9e1c7d2010-07-23 12:16:41 +0000282 def test_listdir(self):
283 if hasattr(posix, 'listdir'):
284 self.assertTrue(support.TESTFN in posix.listdir(os.curdir))
285
286 def test_listdir_default(self):
287 # When listdir is called without argument, it's the same as listdir(os.curdir)
288 if hasattr(posix, 'listdir'):
289 self.assertTrue(support.TESTFN in posix.listdir())
Neal Norwitze241ce82003-02-17 18:17:05 +0000290
291 def test_access(self):
292 if hasattr(posix, 'access'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000293 self.assertTrue(posix.access(support.TESTFN, os.R_OK))
Neal Norwitze241ce82003-02-17 18:17:05 +0000294
295 def test_umask(self):
296 if hasattr(posix, 'umask'):
297 old_mask = posix.umask(0)
Ezio Melottie9615932010-01-24 19:26:24 +0000298 self.assertIsInstance(old_mask, int)
Neal Norwitze241ce82003-02-17 18:17:05 +0000299 posix.umask(old_mask)
300
301 def test_strerror(self):
302 if hasattr(posix, 'strerror'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000303 self.assertTrue(posix.strerror(0))
Neal Norwitze241ce82003-02-17 18:17:05 +0000304
305 def test_pipe(self):
306 if hasattr(posix, 'pipe'):
307 reader, writer = posix.pipe()
308 os.close(reader)
309 os.close(writer)
310
Neal Norwitze241ce82003-02-17 18:17:05 +0000311 def test_utime(self):
312 if hasattr(posix, 'utime'):
313 now = time.time()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000314 posix.utime(support.TESTFN, None)
315 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None))
316 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None))
317 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now))
318 posix.utime(support.TESTFN, (int(now), int(now)))
319 posix.utime(support.TESTFN, (now, now))
Neal Norwitze241ce82003-02-17 18:17:05 +0000320
Ned Deily3eb67d52011-06-28 00:00:28 -0700321 def _test_chflags_regular_file(self, chflags_func, target_file):
322 st = os.stat(target_file)
323 self.assertTrue(hasattr(st, 'st_flags'))
324 chflags_func(target_file, st.st_flags | stat.UF_IMMUTABLE)
325 try:
326 new_st = os.stat(target_file)
327 self.assertEqual(st.st_flags | stat.UF_IMMUTABLE, new_st.st_flags)
328 try:
329 fd = open(target_file, 'w+')
330 except IOError as e:
331 self.assertEqual(e.errno, errno.EPERM)
332 finally:
333 posix.chflags(target_file, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000334
Ned Deily3eb67d52011-06-28 00:00:28 -0700335 @unittest.skipUnless(hasattr(posix, 'chflags'), 'test needs os.chflags()')
336 def test_chflags(self):
337 self._test_chflags_regular_file(posix.chflags, support.TESTFN)
338
339 @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
340 def test_lchflags_regular_file(self):
341 self._test_chflags_regular_file(posix.lchflags, support.TESTFN)
342
343 @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
344 def test_lchflags_symlink(self):
345 testfn_st = os.stat(support.TESTFN)
346
347 self.assertTrue(hasattr(testfn_st, 'st_flags'))
348
349 os.symlink(support.TESTFN, _DUMMY_SYMLINK)
350 self.teardown_files.append(_DUMMY_SYMLINK)
351 dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
352
353 posix.lchflags(_DUMMY_SYMLINK,
354 dummy_symlink_st.st_flags | stat.UF_IMMUTABLE)
355 try:
356 new_testfn_st = os.stat(support.TESTFN)
357 new_dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
358
359 self.assertEqual(testfn_st.st_flags, new_testfn_st.st_flags)
360 self.assertEqual(dummy_symlink_st.st_flags | stat.UF_IMMUTABLE,
361 new_dummy_symlink_st.st_flags)
362 finally:
363 posix.lchflags(_DUMMY_SYMLINK, dummy_symlink_st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000364
Guido van Rossum98297ee2007-11-06 21:34:58 +0000365 def test_environ(self):
Victor Stinner17b490d2010-05-06 22:19:30 +0000366 if os.name == "nt":
367 item_type = str
368 else:
369 item_type = bytes
Guido van Rossum98297ee2007-11-06 21:34:58 +0000370 for k, v in posix.environ.items():
Victor Stinner17b490d2010-05-06 22:19:30 +0000371 self.assertEqual(type(k), item_type)
372 self.assertEqual(type(v), item_type)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000373
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000374 def test_getcwd_long_pathnames(self):
375 if hasattr(posix, 'getcwd'):
376 dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef'
377 curdir = os.getcwd()
378 base_path = os.path.abspath(support.TESTFN) + '.getcwd'
379
380 try:
381 os.mkdir(base_path)
382 os.chdir(base_path)
383 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000384# Just returning nothing instead of the SkipTest exception,
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000385# because the test results in Error in that case.
386# Is that ok?
Benjamin Petersone549ead2009-03-28 21:42:05 +0000387# raise unittest.SkipTest("cannot create directory for testing")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000388 return
389
390 def _create_and_do_getcwd(dirname, current_path_length = 0):
391 try:
392 os.mkdir(dirname)
393 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000394 raise unittest.SkipTest("mkdir cannot create directory sufficiently deep for getcwd test")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000395
396 os.chdir(dirname)
397 try:
398 os.getcwd()
399 if current_path_length < 1027:
400 _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
401 finally:
402 os.chdir('..')
403 os.rmdir(dirname)
404
405 _create_and_do_getcwd(dirname)
406
407 finally:
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000408 os.chdir(curdir)
R. David Murray414c91f2009-07-09 20:12:31 +0000409 support.rmtree(base_path)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000410
Antoine Pitrou318b8f32011-01-12 18:45:27 +0000411 @unittest.skipUnless(hasattr(os, 'getegid'), "test needs os.getegid()")
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000412 def test_getgroups(self):
413 with os.popen('id -G') as idg:
414 groups = idg.read().strip()
415
416 if not groups:
417 raise unittest.SkipTest("need working 'id -G'")
418
Ronald Oussoren7fb6f512010-08-01 19:18:13 +0000419 # 'id -G' and 'os.getgroups()' should return the same
420 # groups, ignoring order and duplicates.
Antoine Pitrou318b8f32011-01-12 18:45:27 +0000421 # #10822 - it is implementation defined whether posix.getgroups()
422 # includes the effective gid so we include it anyway, since id -G does
Ronald Oussorencb615e62010-07-24 14:15:19 +0000423 self.assertEqual(
Ronald Oussoren7fb6f512010-08-01 19:18:13 +0000424 set([int(x) for x in groups.split()]),
Antoine Pitrou318b8f32011-01-12 18:45:27 +0000425 set(posix.getgroups() + [posix.getegid()]))
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000426
427class PosixGroupsTester(unittest.TestCase):
428
429 def setUp(self):
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()
437
438 def tearDown(self):
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])
444
445 @unittest.skipUnless(hasattr(posix, 'initgroups'),
446 "test needs posix.initgroups()")
447 def test_initgroups(self):
448 # find missing group
449
Antoine Pitroue5a91012010-09-04 17:32:06 +0000450 g = max(self.saved_groups) + 1
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000451 name = pwd.getpwuid(posix.getuid()).pw_name
452 posix.initgroups(name, g)
453 self.assertIn(g, posix.getgroups())
454
455 @unittest.skipUnless(hasattr(posix, 'setgroups'),
456 "test needs posix.setgroups()")
457 def test_setgroups(self):
Antoine Pitroue5a91012010-09-04 17:32:06 +0000458 for groups in [[0], list(range(16))]:
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000459 posix.setgroups(groups)
460 self.assertListEqual(groups, posix.getgroups())
461
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000462
Neal Norwitze241ce82003-02-17 18:17:05 +0000463def test_main():
Ronald Oussorenb6ee4f52010-07-23 13:53:51 +0000464 support.run_unittest(PosixTester, PosixGroupsTester)
Neal Norwitze241ce82003-02-17 18:17:05 +0000465
466if __name__ == '__main__':
467 test_main()