blob: 684326a44de58c9eab629b749afcc65463599403 [file] [log] [blame]
Neal Norwitze241ce82003-02-17 18:17:05 +00001"Test posix functions"
2
Walter Dörwald21d3a322003-05-01 17:45:56 +00003from test import test_support
Neal Norwitze241ce82003-02-17 18:17:05 +00004
R. David Murray95fb46c2009-04-21 13:06:04 +00005# Skip these tests if there is no posix module.
6posix = test_support.import_module('posix')
Neal Norwitze241ce82003-02-17 18:17:05 +00007
Antoine Pitrou30b3b352009-12-02 20:37:54 +00008import errno
Ronald Oussoren9e7ffae2010-07-24 09:46:41 +00009import sys
Neal Norwitze241ce82003-02-17 18:17:05 +000010import time
11import os
Charles-François Natalif8387642012-04-17 19:46:06 +020012import platform
Gregory P. Smithf48da8f2008-03-18 19:05:32 +000013import pwd
Facundo Batista5596b0c2008-06-22 13:36:20 +000014import shutil
Ned Deily43e10542011-06-27 23:41:53 -070015import stat
Stefan Krah182ae642010-07-13 19:17:08 +000016import sys
Ned Deilyd88131a2011-07-26 13:52:14 -070017import tempfile
Neal Norwitze241ce82003-02-17 18:17:05 +000018import unittest
19import warnings
R. David Murray59beec32009-03-30 19:04:00 +000020
Ned Deilyd88131a2011-07-26 13:52:14 -070021_DUMMY_SYMLINK = os.path.join(tempfile.gettempdir(),
22 test_support.TESTFN + '-dummy-symlink')
R. David Murray59beec32009-03-30 19:04:00 +000023
Neal Norwitze241ce82003-02-17 18:17:05 +000024warnings.filterwarnings('ignore', '.* potential security risk .*',
25 RuntimeWarning)
26
27class PosixTester(unittest.TestCase):
28
29 def setUp(self):
30 # create empty file
Walter Dörwald21d3a322003-05-01 17:45:56 +000031 fp = open(test_support.TESTFN, 'w+')
Neal Norwitze241ce82003-02-17 18:17:05 +000032 fp.close()
Ned Deily43e10542011-06-27 23:41:53 -070033 self.teardown_files = [ test_support.TESTFN ]
Neal Norwitze241ce82003-02-17 18:17:05 +000034
35 def tearDown(self):
Ned Deily43e10542011-06-27 23:41:53 -070036 for teardown_file in self.teardown_files:
37 os.unlink(teardown_file)
Neal Norwitze241ce82003-02-17 18:17:05 +000038
39 def testNoArgFunctions(self):
40 # test posix functions which take no arguments and have
41 # no side-effects which we need to cleanup (e.g., fork, wait, abort)
42 NO_ARG_FUNCTIONS = [ "ctermid", "getcwd", "getcwdu", "uname",
Neal Norwitz71b13e82003-02-23 22:12:24 +000043 "times", "getloadavg", "tmpnam",
Neal Norwitze241ce82003-02-17 18:17:05 +000044 "getegid", "geteuid", "getgid", "getgroups",
45 "getpid", "getpgrp", "getppid", "getuid",
46 ]
Neal Norwitz71b13e82003-02-23 22:12:24 +000047
Antoine Pitroub0614612011-01-02 20:04:52 +000048 with warnings.catch_warnings():
49 warnings.filterwarnings("ignore", "", DeprecationWarning)
50 for name in NO_ARG_FUNCTIONS:
51 posix_func = getattr(posix, name, None)
52 if posix_func is not None:
53 posix_func()
54 self.assertRaises(TypeError, posix_func, 1)
Neal Norwitze241ce82003-02-17 18:17:05 +000055
Martin v. Löwis50ea4562009-11-27 13:56:01 +000056 if hasattr(posix, 'getresuid'):
57 def test_getresuid(self):
58 user_ids = posix.getresuid()
59 self.assertEqual(len(user_ids), 3)
60 for val in user_ids:
61 self.assertGreaterEqual(val, 0)
62
63 if hasattr(posix, 'getresgid'):
64 def test_getresgid(self):
65 group_ids = posix.getresgid()
66 self.assertEqual(len(group_ids), 3)
67 for val in group_ids:
68 self.assertGreaterEqual(val, 0)
69
70 if hasattr(posix, 'setresuid'):
71 def test_setresuid(self):
72 current_user_ids = posix.getresuid()
73 self.assertIsNone(posix.setresuid(*current_user_ids))
74 # -1 means don't change that value.
75 self.assertIsNone(posix.setresuid(-1, -1, -1))
76
77 def test_setresuid_exception(self):
78 # Don't do this test if someone is silly enough to run us as root.
79 current_user_ids = posix.getresuid()
80 if 0 not in current_user_ids:
81 new_user_ids = (current_user_ids[0]+1, -1, -1)
82 self.assertRaises(OSError, posix.setresuid, *new_user_ids)
83
84 if hasattr(posix, 'setresgid'):
85 def test_setresgid(self):
86 current_group_ids = posix.getresgid()
87 self.assertIsNone(posix.setresgid(*current_group_ids))
88 # -1 means don't change that value.
89 self.assertIsNone(posix.setresgid(-1, -1, -1))
90
91 def test_setresgid_exception(self):
92 # Don't do this test if someone is silly enough to run us as root.
93 current_group_ids = posix.getresgid()
94 if 0 not in current_group_ids:
95 new_group_ids = (current_group_ids[0]+1, -1, -1)
96 self.assertRaises(OSError, posix.setresgid, *new_group_ids)
97
Antoine Pitrou30b3b352009-12-02 20:37:54 +000098 @unittest.skipUnless(hasattr(posix, 'initgroups'),
99 "test needs os.initgroups()")
100 def test_initgroups(self):
101 # It takes a string and an integer; check that it raises a TypeError
102 # for other argument lists.
103 self.assertRaises(TypeError, posix.initgroups)
104 self.assertRaises(TypeError, posix.initgroups, None)
105 self.assertRaises(TypeError, posix.initgroups, 3, "foo")
106 self.assertRaises(TypeError, posix.initgroups, "foo", 3, object())
107
108 # If a non-privileged user invokes it, it should fail with OSError
109 # EPERM.
110 if os.getuid() != 0:
111 name = pwd.getpwuid(posix.getuid()).pw_name
112 try:
113 posix.initgroups(name, 13)
114 except OSError as e:
Ezio Melotti2623a372010-11-21 13:34:58 +0000115 self.assertEqual(e.errno, errno.EPERM)
Antoine Pitrou30b3b352009-12-02 20:37:54 +0000116 else:
117 self.fail("Expected OSError to be raised by initgroups")
118
Neal Norwitze241ce82003-02-17 18:17:05 +0000119 def test_statvfs(self):
120 if hasattr(posix, 'statvfs'):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000121 self.assertTrue(posix.statvfs(os.curdir))
Neal Norwitze241ce82003-02-17 18:17:05 +0000122
123 def test_fstatvfs(self):
124 if hasattr(posix, 'fstatvfs'):
Walter Dörwald21d3a322003-05-01 17:45:56 +0000125 fp = open(test_support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000126 try:
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000127 self.assertTrue(posix.fstatvfs(fp.fileno()))
Neal Norwitze241ce82003-02-17 18:17:05 +0000128 finally:
129 fp.close()
130
131 def test_ftruncate(self):
132 if hasattr(posix, 'ftruncate'):
Walter Dörwald21d3a322003-05-01 17:45:56 +0000133 fp = open(test_support.TESTFN, 'w+')
Neal Norwitze241ce82003-02-17 18:17:05 +0000134 try:
135 # we need to have some data to truncate
136 fp.write('test')
137 fp.flush()
138 posix.ftruncate(fp.fileno(), 0)
139 finally:
140 fp.close()
141
142 def test_dup(self):
143 if hasattr(posix, 'dup'):
Walter Dörwald21d3a322003-05-01 17:45:56 +0000144 fp = open(test_support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000145 try:
146 fd = posix.dup(fp.fileno())
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000147 self.assertIsInstance(fd, int)
Neal Norwitze241ce82003-02-17 18:17:05 +0000148 os.close(fd)
149 finally:
150 fp.close()
151
Skip Montanaro94785ef2006-04-20 01:29:48 +0000152 def test_confstr(self):
153 if hasattr(posix, 'confstr'):
154 self.assertRaises(ValueError, posix.confstr, "CS_garbage")
155 self.assertEqual(len(posix.confstr("CS_PATH")) > 0, True)
156
Neal Norwitze241ce82003-02-17 18:17:05 +0000157 def test_dup2(self):
158 if hasattr(posix, 'dup2'):
Walter Dörwald21d3a322003-05-01 17:45:56 +0000159 fp1 = open(test_support.TESTFN)
160 fp2 = open(test_support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000161 try:
162 posix.dup2(fp1.fileno(), fp2.fileno())
163 finally:
164 fp1.close()
165 fp2.close()
166
167 def fdopen_helper(self, *args):
Walter Dörwald21d3a322003-05-01 17:45:56 +0000168 fd = os.open(test_support.TESTFN, os.O_RDONLY)
Neal Norwitze241ce82003-02-17 18:17:05 +0000169 fp2 = posix.fdopen(fd, *args)
170 fp2.close()
171
172 def test_fdopen(self):
173 if hasattr(posix, 'fdopen'):
174 self.fdopen_helper()
175 self.fdopen_helper('r')
176 self.fdopen_helper('r', 100)
177
Skip Montanaro98470002005-06-17 01:14:49 +0000178 def test_osexlock(self):
179 if hasattr(posix, "O_EXLOCK"):
180 fd = os.open(test_support.TESTFN,
181 os.O_WRONLY|os.O_EXLOCK|os.O_CREAT)
182 self.assertRaises(OSError, os.open, test_support.TESTFN,
183 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
184 os.close(fd)
185
186 if hasattr(posix, "O_SHLOCK"):
187 fd = os.open(test_support.TESTFN,
188 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
189 self.assertRaises(OSError, os.open, test_support.TESTFN,
190 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
191 os.close(fd)
192
193 def test_osshlock(self):
194 if hasattr(posix, "O_SHLOCK"):
195 fd1 = os.open(test_support.TESTFN,
196 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
197 fd2 = os.open(test_support.TESTFN,
198 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
199 os.close(fd2)
200 os.close(fd1)
201
202 if hasattr(posix, "O_EXLOCK"):
203 fd = os.open(test_support.TESTFN,
204 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
205 self.assertRaises(OSError, os.open, test_support.TESTFN,
206 os.O_RDONLY|os.O_EXLOCK|os.O_NONBLOCK)
207 os.close(fd)
208
Neal Norwitze241ce82003-02-17 18:17:05 +0000209 def test_fstat(self):
210 if hasattr(posix, 'fstat'):
Walter Dörwald21d3a322003-05-01 17:45:56 +0000211 fp = open(test_support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000212 try:
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000213 self.assertTrue(posix.fstat(fp.fileno()))
Neal Norwitze241ce82003-02-17 18:17:05 +0000214 finally:
215 fp.close()
216
217 def test_stat(self):
218 if hasattr(posix, 'stat'):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000219 self.assertTrue(posix.stat(test_support.TESTFN))
Neal Norwitze241ce82003-02-17 18:17:05 +0000220
Gregory P. Smith9f12d462009-12-23 09:31:11 +0000221 def _test_all_chown_common(self, chown_func, first_param):
222 """Common code for chown, fchown and lchown tests."""
Charles-François Natalif8387642012-04-17 19:46:06 +0200223 # test a successful chown call
224 chown_func(first_param, os.getuid(), os.getgid())
225
Gregory P. Smith9f12d462009-12-23 09:31:11 +0000226 if os.getuid() == 0:
227 try:
228 # Many linux distros have a nfsnobody user as MAX_UID-2
229 # that makes a good test case for signedness issues.
230 # http://bugs.python.org/issue1747858
231 # This part of the test only runs when run as root.
232 # Only scary people run their tests as root.
233 ent = pwd.getpwnam('nfsnobody')
234 chown_func(first_param, ent.pw_uid, ent.pw_gid)
235 except KeyError:
236 pass
Charles-François Natalif8387642012-04-17 19:46:06 +0200237 elif platform.system() in ('HP-UX', 'SunOS'):
238 # HP-UX and Solaris can allow a non-root user to chown() to root
239 # (issue #5113)
240 raise unittest.SkipTest("Skipping because of non-standard chown() "
241 "behavior")
Gregory P. Smith9f12d462009-12-23 09:31:11 +0000242 else:
243 # non-root cannot chown to root, raises OSError
244 self.assertRaises(OSError, chown_func,
245 first_param, 0, 0)
Gregory P. Smithf48da8f2008-03-18 19:05:32 +0000246
Gregory P. Smith9f12d462009-12-23 09:31:11 +0000247 @unittest.skipUnless(hasattr(posix, 'chown'), "test needs os.chown()")
248 def test_chown(self):
249 # raise an OSError if the file does not exist
250 os.unlink(test_support.TESTFN)
251 self.assertRaises(OSError, posix.chown, test_support.TESTFN, -1, -1)
252
253 # re-create the file
254 open(test_support.TESTFN, 'w').close()
255 self._test_all_chown_common(posix.chown, test_support.TESTFN)
256
257 @unittest.skipUnless(hasattr(posix, 'fchown'), "test needs os.fchown()")
258 def test_fchown(self):
259 os.unlink(test_support.TESTFN)
260
261 # re-create the file
262 test_file = open(test_support.TESTFN, 'w')
263 try:
264 fd = test_file.fileno()
265 self._test_all_chown_common(posix.fchown, fd)
266 finally:
267 test_file.close()
268
269 @unittest.skipUnless(hasattr(posix, 'lchown'), "test needs os.lchown()")
270 def test_lchown(self):
271 os.unlink(test_support.TESTFN)
272 # create a symlink
Ned Deily43e10542011-06-27 23:41:53 -0700273 os.symlink(_DUMMY_SYMLINK, test_support.TESTFN)
Gregory P. Smith9f12d462009-12-23 09:31:11 +0000274 self._test_all_chown_common(posix.lchown, test_support.TESTFN)
Gregory P. Smithf48da8f2008-03-18 19:05:32 +0000275
Neal Norwitze241ce82003-02-17 18:17:05 +0000276 def test_chdir(self):
277 if hasattr(posix, 'chdir'):
278 posix.chdir(os.curdir)
Walter Dörwald21d3a322003-05-01 17:45:56 +0000279 self.assertRaises(OSError, posix.chdir, test_support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000280
281 def test_lsdir(self):
282 if hasattr(posix, 'lsdir'):
Ezio Melottiaa980582010-01-23 23:04:36 +0000283 self.assertIn(test_support.TESTFN, posix.lsdir(os.curdir))
Neal Norwitze241ce82003-02-17 18:17:05 +0000284
285 def test_access(self):
286 if hasattr(posix, 'access'):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000287 self.assertTrue(posix.access(test_support.TESTFN, os.R_OK))
Neal Norwitze241ce82003-02-17 18:17:05 +0000288
289 def test_umask(self):
290 if hasattr(posix, 'umask'):
291 old_mask = posix.umask(0)
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000292 self.assertIsInstance(old_mask, int)
Neal Norwitze241ce82003-02-17 18:17:05 +0000293 posix.umask(old_mask)
294
295 def test_strerror(self):
296 if hasattr(posix, 'strerror'):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000297 self.assertTrue(posix.strerror(0))
Neal Norwitze241ce82003-02-17 18:17:05 +0000298
299 def test_pipe(self):
300 if hasattr(posix, 'pipe'):
Antoine Pitroubba8f2d2010-04-10 23:32:12 +0000301 reader, writer = posix.pipe()
302 os.close(reader)
303 os.close(writer)
Neal Norwitze241ce82003-02-17 18:17:05 +0000304
305 def test_tempnam(self):
306 if hasattr(posix, 'tempnam'):
Antoine Pitroub0614612011-01-02 20:04:52 +0000307 with warnings.catch_warnings():
308 warnings.filterwarnings("ignore", "tempnam", DeprecationWarning)
309 self.assertTrue(posix.tempnam())
310 self.assertTrue(posix.tempnam(os.curdir))
311 self.assertTrue(posix.tempnam(os.curdir, 'blah'))
Neal Norwitze241ce82003-02-17 18:17:05 +0000312
313 def test_tmpfile(self):
314 if hasattr(posix, 'tmpfile'):
Antoine Pitroub0614612011-01-02 20:04:52 +0000315 with warnings.catch_warnings():
316 warnings.filterwarnings("ignore", "tmpfile", DeprecationWarning)
317 fp = posix.tmpfile()
318 fp.close()
Neal Norwitze241ce82003-02-17 18:17:05 +0000319
320 def test_utime(self):
321 if hasattr(posix, 'utime'):
322 now = time.time()
Walter Dörwald21d3a322003-05-01 17:45:56 +0000323 posix.utime(test_support.TESTFN, None)
Neal Norwitzc28e7ad2004-06-06 20:27:05 +0000324 self.assertRaises(TypeError, posix.utime, test_support.TESTFN, (None, None))
325 self.assertRaises(TypeError, posix.utime, test_support.TESTFN, (now, None))
326 self.assertRaises(TypeError, posix.utime, test_support.TESTFN, (None, now))
327 posix.utime(test_support.TESTFN, (int(now), int(now)))
Walter Dörwald21d3a322003-05-01 17:45:56 +0000328 posix.utime(test_support.TESTFN, (now, now))
Neal Norwitze241ce82003-02-17 18:17:05 +0000329
Ned Deily43e10542011-06-27 23:41:53 -0700330 def _test_chflags_regular_file(self, chflags_func, target_file):
331 st = os.stat(target_file)
332 self.assertTrue(hasattr(st, 'st_flags'))
333 chflags_func(target_file, st.st_flags | stat.UF_IMMUTABLE)
334 try:
335 new_st = os.stat(target_file)
336 self.assertEqual(st.st_flags | stat.UF_IMMUTABLE, new_st.st_flags)
337 try:
338 fd = open(target_file, 'w+')
339 except IOError as e:
340 self.assertEqual(e.errno, errno.EPERM)
341 finally:
342 posix.chflags(target_file, st.st_flags)
Martin v. Löwis382abef2007-02-19 10:55:19 +0000343
Ned Deily43e10542011-06-27 23:41:53 -0700344 @unittest.skipUnless(hasattr(posix, 'chflags'), 'test needs os.chflags()')
345 def test_chflags(self):
346 self._test_chflags_regular_file(posix.chflags, test_support.TESTFN)
347
348 @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
349 def test_lchflags_regular_file(self):
350 self._test_chflags_regular_file(posix.lchflags, test_support.TESTFN)
351
352 @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
353 def test_lchflags_symlink(self):
354 testfn_st = os.stat(test_support.TESTFN)
355
356 self.assertTrue(hasattr(testfn_st, 'st_flags'))
357
358 os.symlink(test_support.TESTFN, _DUMMY_SYMLINK)
359 self.teardown_files.append(_DUMMY_SYMLINK)
360 dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
361
362 posix.lchflags(_DUMMY_SYMLINK,
363 dummy_symlink_st.st_flags | stat.UF_IMMUTABLE)
364 try:
365 new_testfn_st = os.stat(test_support.TESTFN)
366 new_dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
367
368 self.assertEqual(testfn_st.st_flags, new_testfn_st.st_flags)
369 self.assertEqual(dummy_symlink_st.st_flags | stat.UF_IMMUTABLE,
370 new_dummy_symlink_st.st_flags)
371 finally:
372 posix.lchflags(_DUMMY_SYMLINK, dummy_symlink_st.st_flags)
Martin v. Löwis382abef2007-02-19 10:55:19 +0000373
Facundo Batista5596b0c2008-06-22 13:36:20 +0000374 def test_getcwd_long_pathnames(self):
375 if hasattr(posix, 'getcwd'):
376 dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef'
377 curdir = os.getcwd()
Facundo Batista96f3dc32008-06-22 18:23:55 +0000378 base_path = os.path.abspath(test_support.TESTFN) + '.getcwd'
Facundo Batista5596b0c2008-06-22 13:36:20 +0000379
380 try:
381 os.mkdir(base_path)
382 os.chdir(base_path)
Facundo Batista96f3dc32008-06-22 18:23:55 +0000383 except:
Benjamin Peterson888a39b2009-03-26 20:48:25 +0000384# Just returning nothing instead of the SkipTest exception,
Facundo Batista2694eb02008-06-22 19:35:24 +0000385# because the test results in Error in that case.
386# Is that ok?
Benjamin Peterson888a39b2009-03-26 20:48:25 +0000387# raise unittest.SkipTest, "cannot create directory for testing"
Facundo Batista2694eb02008-06-22 19:35:24 +0000388 return
Facundo Batista5596b0c2008-06-22 13:36:20 +0000389
Facundo Batista96f3dc32008-06-22 18:23:55 +0000390 try:
Facundo Batista5596b0c2008-06-22 13:36:20 +0000391 def _create_and_do_getcwd(dirname, current_path_length = 0):
392 try:
393 os.mkdir(dirname)
394 except:
Benjamin Peterson888a39b2009-03-26 20:48:25 +0000395 raise unittest.SkipTest, "mkdir cannot create directory sufficiently deep for getcwd test"
Facundo Batista5596b0c2008-06-22 13:36:20 +0000396
397 os.chdir(dirname)
398 try:
399 os.getcwd()
Stefan Krah182ae642010-07-13 19:17:08 +0000400 if current_path_length < 4099:
Facundo Batista5596b0c2008-06-22 13:36:20 +0000401 _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
Stefan Krah182ae642010-07-13 19:17:08 +0000402 except OSError as e:
403 expected_errno = errno.ENAMETOOLONG
404 if 'sunos' in sys.platform or 'openbsd' in sys.platform:
405 expected_errno = errno.ERANGE # Issue 9185
406 self.assertEqual(e.errno, expected_errno)
Facundo Batista5596b0c2008-06-22 13:36:20 +0000407 finally:
408 os.chdir('..')
409 os.rmdir(dirname)
410
411 _create_and_do_getcwd(dirname)
412
413 finally:
Facundo Batista5596b0c2008-06-22 13:36:20 +0000414 os.chdir(curdir)
R. David Murrayb0c828a2009-07-09 18:41:03 +0000415 shutil.rmtree(base_path)
Facundo Batista5596b0c2008-06-22 13:36:20 +0000416
Antoine Pitrou8bc59fa2011-01-12 18:56:09 +0000417 @unittest.skipUnless(hasattr(os, 'getegid'), "test needs os.getegid()")
Ronald Oussoren9e7ffae2010-07-24 09:46:41 +0000418 def test_getgroups(self):
419 with os.popen('id -G') as idg:
420 groups = idg.read().strip()
421
422 if not groups:
423 raise unittest.SkipTest("need working 'id -G'")
424
Ronald Oussorenac72e582010-08-03 07:31:12 +0000425 # 'id -G' and 'os.getgroups()' should return the same
426 # groups, ignoring order and duplicates.
Antoine Pitrou8bc59fa2011-01-12 18:56:09 +0000427 # #10822 - it is implementation defined whether posix.getgroups()
428 # includes the effective gid so we include it anyway, since id -G does
Ronald Oussoren5719c2f2010-07-24 14:21:29 +0000429 self.assertEqual(
Ronald Oussorenac72e582010-08-03 07:31:12 +0000430 set([int(x) for x in groups.split()]),
Antoine Pitrou8bc59fa2011-01-12 18:56:09 +0000431 set(posix.getgroups() + [posix.getegid()]))
Ronald Oussoren9e7ffae2010-07-24 09:46:41 +0000432
433class PosixGroupsTester(unittest.TestCase):
434
435 def setUp(self):
436 if posix.getuid() != 0:
437 raise unittest.SkipTest("not enough privileges")
438 if not hasattr(posix, 'getgroups'):
439 raise unittest.SkipTest("need posix.getgroups")
440 if sys.platform == 'darwin':
441 raise unittest.SkipTest("getgroups(2) is broken on OSX")
442 self.saved_groups = posix.getgroups()
443
444 def tearDown(self):
445 if hasattr(posix, 'setgroups'):
446 posix.setgroups(self.saved_groups)
447 elif hasattr(posix, 'initgroups'):
448 name = pwd.getpwuid(posix.getuid()).pw_name
449 posix.initgroups(name, self.saved_groups[0])
450
451 @unittest.skipUnless(hasattr(posix, 'initgroups'),
452 "test needs posix.initgroups()")
453 def test_initgroups(self):
454 # find missing group
455
Antoine Pitroudd806ce2010-09-04 17:34:12 +0000456 g = max(self.saved_groups) + 1
Ronald Oussoren9e7ffae2010-07-24 09:46:41 +0000457 name = pwd.getpwuid(posix.getuid()).pw_name
458 posix.initgroups(name, g)
459 self.assertIn(g, posix.getgroups())
460
461 @unittest.skipUnless(hasattr(posix, 'setgroups'),
462 "test needs posix.setgroups()")
463 def test_setgroups(self):
464 for groups in [[0], range(16)]:
465 posix.setgroups(groups)
466 self.assertListEqual(groups, posix.getgroups())
467
Facundo Batista5596b0c2008-06-22 13:36:20 +0000468
Neal Norwitze241ce82003-02-17 18:17:05 +0000469def test_main():
Ronald Oussoren9e7ffae2010-07-24 09:46:41 +0000470 test_support.run_unittest(PosixTester, PosixGroupsTester)
Neal Norwitze241ce82003-02-17 18:17:05 +0000471
472if __name__ == '__main__':
473 test_main()