blob: c7ec03ec0e4388431267d206de89cad6260f91a7 [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
Hai Shi79bb2c92020-08-06 19:51:29 +08004from test.support import import_helper
Roger E. Masse749cc6b1996-12-18 19:36:34 +00005
Hai Shi79bb2c92020-08-06 19:51:29 +08006
7grp = import_helper.import_module('grp')
R. David Murraya21e4ca2009-03-31 23:16:50 +00008
Fred Drake5b811be2001-05-18 21:38:52 +00009class GroupDatabaseTestCase(unittest.TestCase):
Roger E. Masse749cc6b1996-12-18 19:36:34 +000010
Walter Dörwaldce07c8a2003-04-23 19:50:24 +000011 def check_value(self, value):
12 # check that a grp tuple has the entries and
13 # attributes promised by the docs
14 self.assertEqual(len(value), 4)
15 self.assertEqual(value[0], value.gr_name)
Ezio Melottie9615932010-01-24 19:26:24 +000016 self.assertIsInstance(value.gr_name, str)
Walter Dörwaldce07c8a2003-04-23 19:50:24 +000017 self.assertEqual(value[1], value.gr_passwd)
Ezio Melottie9615932010-01-24 19:26:24 +000018 self.assertIsInstance(value.gr_passwd, str)
Walter Dörwaldce07c8a2003-04-23 19:50:24 +000019 self.assertEqual(value[2], value.gr_gid)
Ezio Melottie9615932010-01-24 19:26:24 +000020 self.assertIsInstance(value.gr_gid, int)
Walter Dörwaldce07c8a2003-04-23 19:50:24 +000021 self.assertEqual(value[3], value.gr_mem)
Ezio Melottie9615932010-01-24 19:26:24 +000022 self.assertIsInstance(value.gr_mem, list)
Walter Dörwaldce07c8a2003-04-23 19:50:24 +000023
Walter Dörwaldb1ded1e2003-04-15 11:10:33 +000024 def test_values(self):
25 entries = grp.getgrall()
Fred Drake5b811be2001-05-18 21:38:52 +000026
Walter Dörwaldb1ded1e2003-04-15 11:10:33 +000027 for e in entries:
Walter Dörwaldce07c8a2003-04-23 19:50:24 +000028 self.check_value(e)
Walter Dörwald43bc1f12003-04-15 15:59:36 +000029
Zachary Ware9fe6d862013-12-08 00:20:35 -060030 def test_values_extended(self):
31 entries = grp.getgrall()
Christian Heimes1af737c2008-01-23 08:24:23 +000032 if len(entries) > 1000: # Huge group file (NIS?) -- skip the rest
Zachary Ware9fe6d862013-12-08 00:20:35 -060033 self.skipTest('huge group file, extended test skipped')
Christian Heimes1af737c2008-01-23 08:24:23 +000034
Walter Dörwald43bc1f12003-04-15 15:59:36 +000035 for e in entries:
Walter Dörwaldce07c8a2003-04-23 19:50:24 +000036 e2 = grp.getgrgid(e.gr_gid)
37 self.check_value(e2)
Walter Dörwaldce6829a2003-05-05 20:37:33 +000038 self.assertEqual(e2.gr_gid, e.gr_gid)
R. David Murrayec073312010-12-14 16:20:53 +000039 name = e.gr_name
40 if name.startswith('+') or name.startswith('-'):
41 # NIS-related entry
42 continue
43 e2 = grp.getgrnam(name)
Walter Dörwaldce07c8a2003-04-23 19:50:24 +000044 self.check_value(e2)
Thomas Wouters477c8d52006-05-27 19:21:47 +000045 # There are instances where getgrall() returns group names in
46 # lowercase while getgrgid() returns proper casing.
47 # Discovered on Ubuntu 5.04 (custom).
R. David Murrayec073312010-12-14 16:20:53 +000048 self.assertEqual(e2.gr_name.lower(), name.lower())
Fred Drake5b811be2001-05-18 21:38:52 +000049
Walter Dörwaldb1ded1e2003-04-15 11:10:33 +000050 def test_errors(self):
51 self.assertRaises(TypeError, grp.getgrgid)
52 self.assertRaises(TypeError, grp.getgrnam)
53 self.assertRaises(TypeError, grp.getgrall, 42)
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +030054 # embedded null character
55 self.assertRaises(ValueError, grp.getgrnam, 'a\x00b')
Walter Dörwaldb1ded1e2003-04-15 11:10:33 +000056
57 # try to get some errors
58 bynames = {}
59 bygids = {}
60 for (n, p, g, mem) in grp.getgrall():
Fredrik Lundh0e664e12005-12-12 20:53:40 +000061 if not n or n == '+':
62 continue # skip NIS entries etc.
Walter Dörwaldb1ded1e2003-04-15 11:10:33 +000063 bynames[n] = g
64 bygids[g] = n
65
Guido van Rossum9afbb4e2007-02-11 18:54:18 +000066 allnames = list(bynames.keys())
Walter Dörwaldb1ded1e2003-04-15 11:10:33 +000067 namei = 0
68 fakename = allnames[namei]
69 while fakename in bynames:
Guido van Rossumc1f779c2007-07-03 08:25:58 +000070 chars = list(fakename)
Guido van Rossum805365e2007-05-07 22:24:25 +000071 for i in range(len(chars)):
Walter Dörwaldb1ded1e2003-04-15 11:10:33 +000072 if chars[i] == 'z':
73 chars[i] = 'A'
74 break
75 elif chars[i] == 'Z':
76 continue
77 else:
78 chars[i] = chr(ord(chars[i]) + 1)
79 break
80 else:
81 namei = namei + 1
82 try:
83 fakename = allnames[namei]
84 except IndexError:
85 # should never happen... if so, just forget it
86 break
Guido van Rossumc1f779c2007-07-03 08:25:58 +000087 fakename = ''.join(chars)
Walter Dörwaldb1ded1e2003-04-15 11:10:33 +000088
89 self.assertRaises(KeyError, grp.getgrnam, fakename)
90
91 # Choose a non-existent gid.
92 fakegid = 4127
93 while fakegid in bygids:
94 fakegid = (fakegid * 3) % 0x10000
95
96 self.assertRaises(KeyError, grp.getgrgid, fakegid)
Fred Drake5b811be2001-05-18 21:38:52 +000097
Serhiy Storchaka9cc4ed52016-01-18 18:49:57 +020098 def test_noninteger_gid(self):
99 entries = grp.getgrall()
100 if not entries:
101 self.skipTest('no groups')
102 # Choose an existent gid.
103 gid = entries[0][2]
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300104 self.assertRaises(TypeError, grp.getgrgid, float(gid))
105 self.assertRaises(TypeError, grp.getgrgid, str(gid))
Serhiy Storchaka9cc4ed52016-01-18 18:49:57 +0200106
107
Fred Drake2e2be372001-09-20 21:33:42 +0000108if __name__ == "__main__":
Zachary Ware38c707e2015-04-13 15:00:43 -0500109 unittest.main()