"""Test script for the grp module.""" import random import string import unittest from test.support import import_helper grp = import_helper.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.getgrgid, 3.14) self.assertRaises(TypeError, grp.getgrgid, 0.0) self.assertRaises(TypeError, grp.getgrgid, 0, 0) # should be out of gid_t range self.assertRaises(OverflowError, grp.getgrgid, 2**128) self.assertRaises(OverflowError, grp.getgrgid, -2**128) self.assertRaises(TypeError, grp.getgrnam) self.assertRaises(TypeError, grp.getgrnam, 42) self.assertRaises(TypeError, grp.getgrnam, b'root') self.assertRaises(TypeError, grp.getgrnam, 'root', 0) # embedded null character self.assertRaisesRegex(ValueError, 'null', grp.getgrnam, 'a\x00b') self.assertRaisesRegex(ValueError, 'null', grp.getgrnam, 'root\x00') self.assertRaises(UnicodeEncodeError, grp.getgrnam, 'roo\udc74') self.assertRaises(KeyError, grp.getgrnam, '') self.assertRaises(TypeError, grp.getgrall, 42) # Find a non-existent group name. # getgrall() will not necessarily report all existing groups # (typical for LDAP based directories in big organizations). for _ in range(30): fakename = ''.join(random.choices(string.ascii_lowercase, k=6)) try: grp.getgrnam(fakename) except KeyError: break else: self.fail('Cannot find non-existent group name') # Find a non-existent gid. maxgid = 2**31 for _ in range(30): fakegid = random.randrange(maxgid) try: grp.getgrgid(fakegid) except KeyError: break except OverflowError: if maxgid == 2**31: maxgid = 2**16-1 elif maxgid == 2**16-1: maxgid = 2**15 else: raise else: self.fail('Cannot find non-existent gid') if __name__ == "__main__": unittest.main()