blob: 4b95a1a173006f7ab57b2cb3b3694b3f5e4ea5b8 [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)
14 self.assert_(isinstance(value.gr_name, basestring))
15 self.assertEqual(value[1], value.gr_passwd)
16 self.assert_(isinstance(value.gr_passwd, basestring))
17 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
22 def valueseq(self, value1, value2):
23 # are two grp tuples equal (don't compare passwords)
24 return value1.gr_name==value2.gr_name and \
25 value1.gr_gid==value2.gr_gid and value1.gr_mem==value2.gr_mem
26
Walter Dörwaldb1ded1e2003-04-15 11:10:33 +000027 def test_values(self):
28 entries = grp.getgrall()
Walter Dörwald43bc1f12003-04-15 15:59:36 +000029 entriesbygid = {}
Walter Dörwaldce07c8a2003-04-23 19:50:24 +000030 entriesbyname = {}
31
32 # we can't use the same strategy as in test_pwd, because
33 # we can't compare gr_passwd (Mac OS X returns
34 # "*" in getgrall() and "" in getgrgid())
Fred Drake5b811be2001-05-18 21:38:52 +000035
Walter Dörwaldb1ded1e2003-04-15 11:10:33 +000036 for e in entries:
Walter Dörwaldce07c8a2003-04-23 19:50:24 +000037 self.check_value(e)
Walter Dörwald43bc1f12003-04-15 15:59:36 +000038 entriesbygid.setdefault(e.gr_gid, []).append(e)
Walter Dörwaldce07c8a2003-04-23 19:50:24 +000039 entriesbyname.setdefault(e.gr_name, []).append(e)
Walter Dörwald43bc1f12003-04-15 15:59:36 +000040
Walter Dörwald43bc1f12003-04-15 15:59:36 +000041 for e in entries:
Walter Dörwaldce07c8a2003-04-23 19:50:24 +000042 e2 = grp.getgrgid(e.gr_gid)
43 self.check_value(e2)
44 # make sure that at least one of the entries
45 # for this gid compares equal to e2
46 self.assert_(max([self.valueseq(e2, x) \
47 for x in entriesbygid[e.gr_gid]]))
48 e2 = grp.getgrnam(e.gr_name)
49 self.check_value(e2)
50 # make sure that at least one of the entries
51 # for this name compares equal to e2
52 self.assert_(max([self.valueseq(e2, x) \
53 for x in entriesbyname[e.gr_name]]))
Fred Drake5b811be2001-05-18 21:38:52 +000054
Walter Dörwaldb1ded1e2003-04-15 11:10:33 +000055 def test_errors(self):
56 self.assertRaises(TypeError, grp.getgrgid)
57 self.assertRaises(TypeError, grp.getgrnam)
58 self.assertRaises(TypeError, grp.getgrall, 42)
59
60 # try to get some errors
61 bynames = {}
62 bygids = {}
63 for (n, p, g, mem) in grp.getgrall():
64 bynames[n] = g
65 bygids[g] = n
66
67 allnames = bynames.keys()
68 namei = 0
69 fakename = allnames[namei]
70 while fakename in bynames:
71 chars = map(None, fakename)
72 for i in xrange(len(chars)):
73 if chars[i] == 'z':
74 chars[i] = 'A'
75 break
76 elif chars[i] == 'Z':
77 continue
78 else:
79 chars[i] = chr(ord(chars[i]) + 1)
80 break
81 else:
82 namei = namei + 1
83 try:
84 fakename = allnames[namei]
85 except IndexError:
86 # should never happen... if so, just forget it
87 break
88 fakename = ''.join(map(None, chars))
89
90 self.assertRaises(KeyError, grp.getgrnam, fakename)
91
92 # Choose a non-existent gid.
93 fakegid = 4127
94 while fakegid in bygids:
95 fakegid = (fakegid * 3) % 0x10000
96
97 self.assertRaises(KeyError, grp.getgrgid, fakegid)
Fred Drake5b811be2001-05-18 21:38:52 +000098
Fred Drake2e2be372001-09-20 21:33:42 +000099def test_main():
Walter Dörwaldb1ded1e2003-04-15 11:10:33 +0000100 suite = unittest.TestSuite()
101 suite.addTest(unittest.makeSuite(GroupDatabaseTestCase))
102 test_support.run_suite(suite)
Fred Drake2e2be372001-09-20 21:33:42 +0000103
104if __name__ == "__main__":
105 test_main()