"""Test script for the grp module.""" | |
import unittest | |
from test import test_support | |
grp = test_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, basestring) | |
self.assertEqual(value[1], value.gr_passwd) | |
self.assertIsInstance(value.gr_passwd, basestring) | |
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) | |
if len(entries) > 1000: # Huge group file (NIS?) -- skip the rest | |
return | |
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) | |
# 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 = bynames.keys() | |
namei = 0 | |
fakename = allnames[namei] | |
while fakename in bynames: | |
chars = list(fakename) | |
for i in xrange(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_main(): | |
test_support.run_unittest(GroupDatabaseTestCase) | |
if __name__ == "__main__": | |
test_main() |