From b6ee4f5bfcaad3c63055ec0e99c0382ff23548d8 Mon Sep 17 00:00:00 2001 From: Ronald Oussoren Date: Fri, 23 Jul 2010 13:53:51 +0000 Subject: This fixes issue7900 by adding code that deals with the fact that getgroups(2) might return more that MAX_GROUPS on OSX. See the issue (and python-dev archives) for the gory details. Summarized: OSX behaves rather oddly and Apple says this is intentional. --- Lib/test/test_posix.py | 53 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) (limited to 'Lib/test/test_posix.py') diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index ab78ab6c78..6708aeb896 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -6,6 +6,7 @@ from test import support posix = support.import_module('posix') import errno +import sys import time import os import pwd @@ -349,9 +350,59 @@ class PosixTester(unittest.TestCase): os.chdir(curdir) support.rmtree(base_path) + def test_getgroups(self): + with os.popen('id -G') as idg: + groups = idg.read().strip() + + if not groups: + raise unittest.SkipTest("need working 'id -G'") + + self.assertEqual([int(x) for x in groups.split()], posix.getgroups()) + +class PosixGroupsTester(unittest.TestCase): + + def setUp(self): + if posix.getuid() != 0: + raise unittest.SkipTest("not enough privileges") + if not hasattr(posix, 'getgroups'): + raise unittest.SkipTest("need posix.getgroups") + if sys.platform == 'darwin': + raise unittest.SkipTest("getgroups(2) is broken on OSX") + self.saved_groups = posix.getgroups() + + def tearDown(self): + if hasattr(posix, 'setgroups'): + posix.setgroups(self.saved_groups) + elif hasattr(posix, 'initgroups'): + name = pwd.getpwuid(posix.getuid()).pw_name + posix.initgroups(name, self.saved_groups[0]) + + @unittest.skipUnless(hasattr(posix, 'initgroups'), + "test needs posix.initgroups()") + def test_initgroups(self): + # find missing group + + groups = sorted(self.saved_groups) + for g1,g2 in zip(groups[:-1], groups[1:]): + g = g1 + 1 + if g < g2: + break + else: + g = g2 + 1 + name = pwd.getpwuid(posix.getuid()).pw_name + posix.initgroups(name, g) + self.assertIn(g, posix.getgroups()) + + @unittest.skipUnless(hasattr(posix, 'setgroups'), + "test needs posix.setgroups()") + def test_setgroups(self): + for groups in [[0], range(16)]: + posix.setgroups(groups) + self.assertListEqual(groups, posix.getgroups()) + def test_main(): - support.run_unittest(PosixTester) + support.run_unittest(PosixTester, PosixGroupsTester) if __name__ == '__main__': test_main() -- cgit v1.2.1