17db96d56Sopenharmony_ci"""Test script for the grp module.""" 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ciimport unittest 47db96d56Sopenharmony_cifrom test.support import import_helper 57db96d56Sopenharmony_ci 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_cigrp = import_helper.import_module('grp') 87db96d56Sopenharmony_ci 97db96d56Sopenharmony_ciclass GroupDatabaseTestCase(unittest.TestCase): 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_ci def check_value(self, value): 127db96d56Sopenharmony_ci # check that a grp tuple has the entries and 137db96d56Sopenharmony_ci # attributes promised by the docs 147db96d56Sopenharmony_ci self.assertEqual(len(value), 4) 157db96d56Sopenharmony_ci self.assertEqual(value[0], value.gr_name) 167db96d56Sopenharmony_ci self.assertIsInstance(value.gr_name, str) 177db96d56Sopenharmony_ci self.assertEqual(value[1], value.gr_passwd) 187db96d56Sopenharmony_ci self.assertIsInstance(value.gr_passwd, str) 197db96d56Sopenharmony_ci self.assertEqual(value[2], value.gr_gid) 207db96d56Sopenharmony_ci self.assertIsInstance(value.gr_gid, int) 217db96d56Sopenharmony_ci self.assertEqual(value[3], value.gr_mem) 227db96d56Sopenharmony_ci self.assertIsInstance(value.gr_mem, list) 237db96d56Sopenharmony_ci 247db96d56Sopenharmony_ci def test_values(self): 257db96d56Sopenharmony_ci entries = grp.getgrall() 267db96d56Sopenharmony_ci 277db96d56Sopenharmony_ci for e in entries: 287db96d56Sopenharmony_ci self.check_value(e) 297db96d56Sopenharmony_ci 307db96d56Sopenharmony_ci def test_values_extended(self): 317db96d56Sopenharmony_ci entries = grp.getgrall() 327db96d56Sopenharmony_ci if len(entries) > 1000: # Huge group file (NIS?) -- skip the rest 337db96d56Sopenharmony_ci self.skipTest('huge group file, extended test skipped') 347db96d56Sopenharmony_ci 357db96d56Sopenharmony_ci for e in entries: 367db96d56Sopenharmony_ci e2 = grp.getgrgid(e.gr_gid) 377db96d56Sopenharmony_ci self.check_value(e2) 387db96d56Sopenharmony_ci self.assertEqual(e2.gr_gid, e.gr_gid) 397db96d56Sopenharmony_ci name = e.gr_name 407db96d56Sopenharmony_ci if name.startswith('+') or name.startswith('-'): 417db96d56Sopenharmony_ci # NIS-related entry 427db96d56Sopenharmony_ci continue 437db96d56Sopenharmony_ci e2 = grp.getgrnam(name) 447db96d56Sopenharmony_ci self.check_value(e2) 457db96d56Sopenharmony_ci # There are instances where getgrall() returns group names in 467db96d56Sopenharmony_ci # lowercase while getgrgid() returns proper casing. 477db96d56Sopenharmony_ci # Discovered on Ubuntu 5.04 (custom). 487db96d56Sopenharmony_ci self.assertEqual(e2.gr_name.lower(), name.lower()) 497db96d56Sopenharmony_ci 507db96d56Sopenharmony_ci def test_errors(self): 517db96d56Sopenharmony_ci self.assertRaises(TypeError, grp.getgrgid) 527db96d56Sopenharmony_ci self.assertRaises(TypeError, grp.getgrgid, 3.14) 537db96d56Sopenharmony_ci self.assertRaises(TypeError, grp.getgrnam) 547db96d56Sopenharmony_ci self.assertRaises(TypeError, grp.getgrnam, 42) 557db96d56Sopenharmony_ci self.assertRaises(TypeError, grp.getgrall, 42) 567db96d56Sopenharmony_ci # embedded null character 577db96d56Sopenharmony_ci self.assertRaisesRegex(ValueError, 'null', grp.getgrnam, 'a\x00b') 587db96d56Sopenharmony_ci 597db96d56Sopenharmony_ci # try to get some errors 607db96d56Sopenharmony_ci bynames = {} 617db96d56Sopenharmony_ci bygids = {} 627db96d56Sopenharmony_ci for (n, p, g, mem) in grp.getgrall(): 637db96d56Sopenharmony_ci if not n or n == '+': 647db96d56Sopenharmony_ci continue # skip NIS entries etc. 657db96d56Sopenharmony_ci bynames[n] = g 667db96d56Sopenharmony_ci bygids[g] = n 677db96d56Sopenharmony_ci 687db96d56Sopenharmony_ci allnames = list(bynames.keys()) 697db96d56Sopenharmony_ci namei = 0 707db96d56Sopenharmony_ci fakename = allnames[namei] 717db96d56Sopenharmony_ci while fakename in bynames: 727db96d56Sopenharmony_ci chars = list(fakename) 737db96d56Sopenharmony_ci for i in range(len(chars)): 747db96d56Sopenharmony_ci if chars[i] == 'z': 757db96d56Sopenharmony_ci chars[i] = 'A' 767db96d56Sopenharmony_ci break 777db96d56Sopenharmony_ci elif chars[i] == 'Z': 787db96d56Sopenharmony_ci continue 797db96d56Sopenharmony_ci else: 807db96d56Sopenharmony_ci chars[i] = chr(ord(chars[i]) + 1) 817db96d56Sopenharmony_ci break 827db96d56Sopenharmony_ci else: 837db96d56Sopenharmony_ci namei = namei + 1 847db96d56Sopenharmony_ci try: 857db96d56Sopenharmony_ci fakename = allnames[namei] 867db96d56Sopenharmony_ci except IndexError: 877db96d56Sopenharmony_ci # should never happen... if so, just forget it 887db96d56Sopenharmony_ci break 897db96d56Sopenharmony_ci fakename = ''.join(chars) 907db96d56Sopenharmony_ci 917db96d56Sopenharmony_ci self.assertRaises(KeyError, grp.getgrnam, fakename) 927db96d56Sopenharmony_ci 937db96d56Sopenharmony_ci # Choose a non-existent gid. 947db96d56Sopenharmony_ci fakegid = 4127 957db96d56Sopenharmony_ci while fakegid in bygids: 967db96d56Sopenharmony_ci fakegid = (fakegid * 3) % 0x10000 977db96d56Sopenharmony_ci 987db96d56Sopenharmony_ci self.assertRaises(KeyError, grp.getgrgid, fakegid) 997db96d56Sopenharmony_ci 1007db96d56Sopenharmony_ci def test_noninteger_gid(self): 1017db96d56Sopenharmony_ci entries = grp.getgrall() 1027db96d56Sopenharmony_ci if not entries: 1037db96d56Sopenharmony_ci self.skipTest('no groups') 1047db96d56Sopenharmony_ci # Choose an existent gid. 1057db96d56Sopenharmony_ci gid = entries[0][2] 1067db96d56Sopenharmony_ci self.assertRaises(TypeError, grp.getgrgid, float(gid)) 1077db96d56Sopenharmony_ci self.assertRaises(TypeError, grp.getgrgid, str(gid)) 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_ci 1107db96d56Sopenharmony_ciif __name__ == "__main__": 1117db96d56Sopenharmony_ci unittest.main() 112