blob: d31e39c736c3784d989abf7b41b05575f1fe5991 [file] [log] [blame]
Fred Drake5b811be2001-05-18 21:38:52 +00001"""Test script for the grp module."""
2
Fred Drake5b811be2001-05-18 21:38:52 +00003import unittest
Barry Warsaw04f357c2002-07-23 19:04:11 +00004from test import test_support
Roger E. Masse749cc6b1996-12-18 19:36:34 +00005
R. David Murray59beec32009-03-30 19:04:00 +00006grp = test_support.import_module('grp')
7
Fred Drake5b811be2001-05-18 21:38:52 +00008class GroupDatabaseTestCase(unittest.TestCase):
Roger E. Masse749cc6b1996-12-18 19:36:34 +00009
Walter Dörwaldce07c8a2003-04-23 19:50:24 +000010 def check_value(self, value):
11 # check that a grp tuple has the entries and
12 # attributes promised by the docs
13 self.assertEqual(len(value), 4)
14 self.assertEqual(value[0], value.gr_name)
Ezio Melottib0f5adc2010-01-24 16:58:36 +000015 self.assertIsInstance(value.gr_name, basestring)
Walter Dörwaldce07c8a2003-04-23 19:50:24 +000016 self.assertEqual(value[1], value.gr_passwd)
Ezio Melottib0f5adc2010-01-24 16:58:36 +000017 self.assertIsInstance(value.gr_passwd, basestring)
Walter Dörwaldce07c8a2003-04-23 19:50:24 +000018 self.assertEqual(value[2], value.gr_gid)
Benjamin Peterson01d9a772013-03-23 15:40:36 -050019 self.assertIsInstance(value.gr_gid, (long, int))
Walter Dörwaldce07c8a2003-04-23 19:50:24 +000020 self.assertEqual(value[3], value.gr_mem)
Ezio Melottib0f5adc2010-01-24 16:58:36 +000021 self.assertIsInstance(value.gr_mem, list)
Walter Dörwaldce07c8a2003-04-23 19:50:24 +000022
Walter Dörwaldb1ded1e2003-04-15 11:10:33 +000023 def test_values(self):
24 entries = grp.getgrall()
Fred Drake5b811be2001-05-18 21:38:52 +000025
Walter Dörwaldb1ded1e2003-04-15 11:10:33 +000026 for e in entries:
Walter Dörwaldce07c8a2003-04-23 19:50:24 +000027 self.check_value(e)
Walter Dörwald43bc1f12003-04-15 15:59:36 +000028
Zachary Ware1f702212013-12-10 14:09:20 -060029 def test_values_extended(self):
30 entries = grp.getgrall()
Guido van Rossum66b4ab72008-01-23 01:18:27 +000031 if len(entries) > 1000: # Huge group file (NIS?) -- skip the rest
Zachary Ware1f702212013-12-10 14:09:20 -060032 self.skipTest('huge group file, extended test skipped')
Guido van Rossum66b4ab72008-01-23 01:18:27 +000033
Walter Dörwald43bc1f12003-04-15 15:59:36 +000034 for e in entries:
Walter Dörwaldce07c8a2003-04-23 19:50:24 +000035 e2 = grp.getgrgid(e.gr_gid)
36 self.check_value(e2)
Walter Dörwaldce6829a2003-05-05 20:37:33 +000037 self.assertEqual(e2.gr_gid, e.gr_gid)
R. David Murrayf8a63912010-12-14 16:26:30 +000038 name = e.gr_name
39 if name.startswith('+') or name.startswith('-'):
40 # NIS-related entry
41 continue
42 e2 = grp.getgrnam(name)
Walter Dörwaldce07c8a2003-04-23 19:50:24 +000043 self.check_value(e2)
Brett Cannon36850452006-05-25 21:33:11 +000044 # There are instances where getgrall() returns group names in
45 # lowercase while getgrgid() returns proper casing.
46 # Discovered on Ubuntu 5.04 (custom).
R. David Murrayf8a63912010-12-14 16:26:30 +000047 self.assertEqual(e2.gr_name.lower(), name.lower())
Fred Drake5b811be2001-05-18 21:38:52 +000048
Walter Dörwaldb1ded1e2003-04-15 11:10:33 +000049 def test_errors(self):
50 self.assertRaises(TypeError, grp.getgrgid)
51 self.assertRaises(TypeError, grp.getgrnam)
52 self.assertRaises(TypeError, grp.getgrall, 42)
53
54 # try to get some errors
55 bynames = {}
56 bygids = {}
57 for (n, p, g, mem) in grp.getgrall():
Fredrik Lundh0e664e12005-12-12 20:53:40 +000058 if not n or n == '+':
59 continue # skip NIS entries etc.
Walter Dörwaldb1ded1e2003-04-15 11:10:33 +000060 bynames[n] = g
61 bygids[g] = n
62
63 allnames = bynames.keys()
64 namei = 0
65 fakename = allnames[namei]
66 while fakename in bynames:
Georg Brandl74bbc792008-07-18 19:06:13 +000067 chars = list(fakename)
Walter Dörwaldb1ded1e2003-04-15 11:10:33 +000068 for i in xrange(len(chars)):
69 if chars[i] == 'z':
70 chars[i] = 'A'
71 break
72 elif chars[i] == 'Z':
73 continue
74 else:
75 chars[i] = chr(ord(chars[i]) + 1)
76 break
77 else:
78 namei = namei + 1
79 try:
80 fakename = allnames[namei]
81 except IndexError:
82 # should never happen... if so, just forget it
83 break
Georg Brandl74bbc792008-07-18 19:06:13 +000084 fakename = ''.join(chars)
Walter Dörwaldb1ded1e2003-04-15 11:10:33 +000085
86 self.assertRaises(KeyError, grp.getgrnam, fakename)
87
88 # Choose a non-existent gid.
89 fakegid = 4127
90 while fakegid in bygids:
91 fakegid = (fakegid * 3) % 0x10000
92
93 self.assertRaises(KeyError, grp.getgrgid, fakegid)
Fred Drake5b811be2001-05-18 21:38:52 +000094
Fred Drake2e2be372001-09-20 21:33:42 +000095def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +000096 test_support.run_unittest(GroupDatabaseTestCase)
Fred Drake2e2be372001-09-20 21:33:42 +000097
98if __name__ == "__main__":
99 test_main()