2001-05-18 18:38:52 -03:00
|
|
|
"""Test script for the grp module."""
|
|
|
|
|
1996-12-18 15:36:34 -04:00
|
|
|
import grp
|
2001-05-18 18:38:52 -03:00
|
|
|
import unittest
|
2002-07-23 16:04:11 -03:00
|
|
|
from test import test_support
|
2001-05-18 18:38:52 -03:00
|
|
|
|
|
|
|
class GroupDatabaseTestCase(unittest.TestCase):
|
|
|
|
|
2003-04-23 16:50:24 -03:00
|
|
|
def check_value(self, value):
|
|
|
|
# check that a grp tuple has the entries and
|
|
|
|
# attributes promised by the docs
|
|
|
|
self.assertEqual(len(value), 4)
|
|
|
|
self.assertEqual(value[0], value.gr_name)
|
|
|
|
self.assert_(isinstance(value.gr_name, basestring))
|
|
|
|
self.assertEqual(value[1], value.gr_passwd)
|
|
|
|
self.assert_(isinstance(value.gr_passwd, basestring))
|
|
|
|
self.assertEqual(value[2], value.gr_gid)
|
|
|
|
self.assert_(isinstance(value.gr_gid, int))
|
|
|
|
self.assertEqual(value[3], value.gr_mem)
|
|
|
|
self.assert_(isinstance(value.gr_mem, list))
|
|
|
|
|
2003-04-15 08:10:33 -03:00
|
|
|
def test_values(self):
|
|
|
|
entries = grp.getgrall()
|
2001-05-18 18:38:52 -03:00
|
|
|
|
2003-04-15 08:10:33 -03:00
|
|
|
for e in entries:
|
2003-04-23 16:50:24 -03:00
|
|
|
self.check_value(e)
|
2003-04-15 12:59:36 -03:00
|
|
|
|
2008-01-22 21:20:26 -04:00
|
|
|
if len(entries) > 1000: # Huge group file (NIS?) -- skip the rest
|
|
|
|
return
|
|
|
|
|
2003-04-15 12:59:36 -03:00
|
|
|
for e in entries:
|
2003-04-23 16:50:24 -03:00
|
|
|
e2 = grp.getgrgid(e.gr_gid)
|
|
|
|
self.check_value(e2)
|
On Mac OS X pwd.getpwall() might return the tuples
('pgsql', '*', 252, []) and ('postgres', '*', 252, ['skip']),
but pwd.getgrgid(252) might return ('pgsql', '', 252, ['skip']).
Drop the test that tried to find a tuple similar to the one
returned from pwd.getgrgid() among those for the same gid returned
by pwd.getgrall(), as the only working definition of 'similar' seems
to be 'has the same gid'. This check can be done more directly.
This should fix SF bug #732783.
2003-05-05 17:37:33 -03:00
|
|
|
self.assertEqual(e2.gr_gid, e.gr_gid)
|
2003-04-23 16:50:24 -03:00
|
|
|
e2 = grp.getgrnam(e.gr_name)
|
|
|
|
self.check_value(e2)
|
2006-05-25 18:33:11 -03:00
|
|
|
# There are instances where getgrall() returns group names in
|
|
|
|
# lowercase while getgrgid() returns proper casing.
|
|
|
|
# Discovered on Ubuntu 5.04 (custom).
|
|
|
|
self.assertEqual(e2.gr_name.lower(), e.gr_name.lower())
|
2001-05-18 18:38:52 -03:00
|
|
|
|
2003-04-15 08:10:33 -03:00
|
|
|
def test_errors(self):
|
|
|
|
self.assertRaises(TypeError, grp.getgrgid)
|
|
|
|
self.assertRaises(TypeError, grp.getgrnam)
|
|
|
|
self.assertRaises(TypeError, grp.getgrall, 42)
|
2001-05-18 18:38:52 -03:00
|
|
|
|
2003-04-15 08:10:33 -03:00
|
|
|
# try to get some errors
|
|
|
|
bynames = {}
|
|
|
|
bygids = {}
|
|
|
|
for (n, p, g, mem) in grp.getgrall():
|
2005-12-12 16:53:40 -04:00
|
|
|
if not n or n == '+':
|
|
|
|
continue # skip NIS entries etc.
|
2003-04-15 08:10:33 -03:00
|
|
|
bynames[n] = g
|
|
|
|
bygids[g] = n
|
|
|
|
|
|
|
|
allnames = bynames.keys()
|
|
|
|
namei = 0
|
|
|
|
fakename = allnames[namei]
|
|
|
|
while fakename in bynames:
|
|
|
|
chars = map(None, fakename)
|
|
|
|
for i in xrange(len(chars)):
|
|
|
|
if chars[i] == 'z':
|
|
|
|
chars[i] = 'A'
|
|
|
|
break
|
|
|
|
elif chars[i] == 'Z':
|
|
|
|
continue
|
|
|
|
else:
|
|
|
|
chars[i] = chr(ord(chars[i]) + 1)
|
|
|
|
break
|
|
|
|
else:
|
|
|
|
namei = namei + 1
|
|
|
|
try:
|
|
|
|
fakename = allnames[namei]
|
|
|
|
except IndexError:
|
|
|
|
# should never happen... if so, just forget it
|
|
|
|
break
|
|
|
|
fakename = ''.join(map(None, chars))
|
|
|
|
|
|
|
|
self.assertRaises(KeyError, grp.getgrnam, fakename)
|
2001-09-20 18:33:42 -03:00
|
|
|
|
2003-04-15 08:10:33 -03:00
|
|
|
# Choose a non-existent gid.
|
|
|
|
fakegid = 4127
|
|
|
|
while fakegid in bygids:
|
|
|
|
fakegid = (fakegid * 3) % 0x10000
|
|
|
|
|
|
|
|
self.assertRaises(KeyError, grp.getgrgid, fakegid)
|
|
|
|
|
|
|
|
def test_main():
|
2003-05-01 14:45:56 -03:00
|
|
|
test_support.run_unittest(GroupDatabaseTestCase)
|
2001-09-20 18:33:42 -03:00
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
test_main()
|