"""Test script for the grp module.""" import unittest from test import support grp = support.import_module('grp') class GroupDatabaseTestCase(unittest.TestCase): 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.assertIsInstance(value.gr_name, str) self.assertEqual(value[1], value.gr_passwd) self.assertIsInstance(value.gr_passwd, str) self.assertEqual(value[2], value.gr_gid) self.assertIsInstance(value.gr_gid, int) self.assertEqual(value[3], value.gr_mem) self.assertIsInstance(value.gr_mem, list) def test_values(self): entries = grp.getgrall() for e in entries: self.check_value(e) def test_values_extended(self): entries = grp.getgrall() if len(entries) > 1000: # Huge group file (NIS?) -- skip the rest self.skipTest('huge group file, extended test skipped') for e in entries: e2 = grp.getgrgid(e.gr_gid) self.check_value(e2) self.assertEqual(e2.gr_gid, e.gr_gid) name = e.gr_name if name.startswith('+') or name.startswith('-'): # NIS-related entry continue e2 = grp.getgrnam(name) self.check_value(e2) # 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(), name.lower()) def test_errors(self): self.assertRaises(TypeError, grp.getgrgid) self.assertRaises(TypeError, grp.getgrnam) self.assertRaises(TypeError, grp.getgrall, 42) # embedded null character self.assertRaises(ValueError, grp.getgrnam, 'a\x00b') # try to get some errors bynames = {} bygids = {} for (n, p, g, mem) in grp.getgrall(): if not n or n == '+': continue # skip NIS entries etc. bynames[n] = g bygids[g] = n allnames = list(bynames.keys()) namei = 0 fakename = allnames[namei] while fakename in bynames: chars = list(fakename) for i in range(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(chars) self.assertRaises(KeyError, grp.getgrnam, fakename) # Choose a non-existent gid. fakegid = 4127 while fakegid in bygids: fakegid = (fakegid * 3) % 0x10000 self.assertRaises(KeyError, grp.getgrgid, fakegid) def test_noninteger_gid(self): entries = grp.getgrall() if not entries: self.skipTest('no groups') # Choose an existent gid. gid = entries[0][2] self.assertWarns(DeprecationWarning, grp.getgrgid, float(gid)) self.assertWarns(DeprecationWarning, grp.getgrgid, str(gid)) if __name__ == "__main__": unittest.main()