blob: fb607f003f087c5f49125b1555be322a2a914e83 [file] [log] [blame]
Fred Drake5b811be2001-05-18 21:38:52 +00001"""Test script for the grp module."""
2
Roger E. Masse749cc6b1996-12-18 19:36:34 +00003import grp
Fred Drake5b811be2001-05-18 21:38:52 +00004import unittest
Barry Warsaw04f357c2002-07-23 19:04:11 +00005from test import test_support
Roger E. Masse749cc6b1996-12-18 19:36:34 +00006
Fred Drake5b811be2001-05-18 21:38:52 +00007class GroupDatabaseTestCase(unittest.TestCase):
Roger E. Masse749cc6b1996-12-18 19:36:34 +00008
Walter Dörwaldce07c8a2003-04-23 19:50:24 +00009 def check_value(self, value):
10 # check that a grp tuple has the entries and
11 # attributes promised by the docs
12 self.assertEqual(len(value), 4)
13 self.assertEqual(value[0], value.gr_name)
Guido van Rossum3172c5d2007-10-16 18:12:55 +000014 self.assert_(isinstance(value.gr_name, str))
Walter Dörwaldce07c8a2003-04-23 19:50:24 +000015 self.assertEqual(value[1], value.gr_passwd)
Guido van Rossum3172c5d2007-10-16 18:12:55 +000016 self.assert_(isinstance(value.gr_passwd, str))
Walter Dörwaldce07c8a2003-04-23 19:50:24 +000017 self.assertEqual(value[2], value.gr_gid)
18 self.assert_(isinstance(value.gr_gid, int))
19 self.assertEqual(value[3], value.gr_mem)
20 self.assert_(isinstance(value.gr_mem, list))
21
Walter Dörwaldb1ded1e2003-04-15 11:10:33 +000022 def test_values(self):
23 entries = grp.getgrall()
Fred Drake5b811be2001-05-18 21:38:52 +000024
Walter Dörwaldb1ded1e2003-04-15 11:10:33 +000025 for e in entries:
Walter Dörwaldce07c8a2003-04-23 19:50:24 +000026 self.check_value(e)
Walter Dörwald43bc1f12003-04-15 15:59:36 +000027
Christian Heimes1af737c2008-01-23 08:24:23 +000028 if len(entries) > 1000: # Huge group file (NIS?) -- skip the rest
29 return
30
Walter Dörwald43bc1f12003-04-15 15:59:36 +000031 for e in entries:
Walter Dörwaldce07c8a2003-04-23 19:50:24 +000032 e2 = grp.getgrgid(e.gr_gid)
33 self.check_value(e2)
Walter Dörwaldce6829a2003-05-05 20:37:33 +000034 self.assertEqual(e2.gr_gid, e.gr_gid)
Walter Dörwaldce07c8a2003-04-23 19:50:24 +000035 e2 = grp.getgrnam(e.gr_name)
36 self.check_value(e2)
Thomas Wouters477c8d52006-05-27 19:21:47 +000037 # There are instances where getgrall() returns group names in
38 # lowercase while getgrgid() returns proper casing.
39 # Discovered on Ubuntu 5.04 (custom).
40 self.assertEqual(e2.gr_name.lower(), e.gr_name.lower())
Fred Drake5b811be2001-05-18 21:38:52 +000041
Walter Dörwaldb1ded1e2003-04-15 11:10:33 +000042 def test_errors(self):
43 self.assertRaises(TypeError, grp.getgrgid)
44 self.assertRaises(TypeError, grp.getgrnam)
45 self.assertRaises(TypeError, grp.getgrall, 42)
46
47 # try to get some errors
48 bynames = {}
49 bygids = {}
50 for (n, p, g, mem) in grp.getgrall():
Fredrik Lundh0e664e12005-12-12 20:53:40 +000051 if not n or n == '+':
52 continue # skip NIS entries etc.
Walter Dörwaldb1ded1e2003-04-15 11:10:33 +000053 bynames[n] = g
54 bygids[g] = n
55
Guido van Rossum9afbb4e2007-02-11 18:54:18 +000056 allnames = list(bynames.keys())
Walter Dörwaldb1ded1e2003-04-15 11:10:33 +000057 namei = 0
58 fakename = allnames[namei]
59 while fakename in bynames:
Guido van Rossumc1f779c2007-07-03 08:25:58 +000060 chars = list(fakename)
Guido van Rossum805365e2007-05-07 22:24:25 +000061 for i in range(len(chars)):
Walter Dörwaldb1ded1e2003-04-15 11:10:33 +000062 if chars[i] == 'z':
63 chars[i] = 'A'
64 break
65 elif chars[i] == 'Z':
66 continue
67 else:
68 chars[i] = chr(ord(chars[i]) + 1)
69 break
70 else:
71 namei = namei + 1
72 try:
73 fakename = allnames[namei]
74 except IndexError:
75 # should never happen... if so, just forget it
76 break
Guido van Rossumc1f779c2007-07-03 08:25:58 +000077 fakename = ''.join(chars)
Walter Dörwaldb1ded1e2003-04-15 11:10:33 +000078
79 self.assertRaises(KeyError, grp.getgrnam, fakename)
80
81 # Choose a non-existent gid.
82 fakegid = 4127
83 while fakegid in bygids:
84 fakegid = (fakegid * 3) % 0x10000
85
86 self.assertRaises(KeyError, grp.getgrgid, fakegid)
Fred Drake5b811be2001-05-18 21:38:52 +000087
Fred Drake2e2be372001-09-20 21:33:42 +000088def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +000089 test_support.run_unittest(GroupDatabaseTestCase)
Fred Drake2e2be372001-09-20 21:33:42 +000090
91if __name__ == "__main__":
92 test_main()