• R. David Murray's avatar
    Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge · a21e4ca3
    R. David Murray yazdı
    ........
      r70734 | r.david.murray | 2009-03-30 15:04:00 -0400 (Mon, 30 Mar 2009) | 7 lines
    
      Add import_function method to test.test_support, and modify a number of
      tests that expect to be skipped if imports fail or functions don't
      exist to use import_function and import_module.  The ultimate goal is
      to change regrtest to not skip automatically on ImportError.  Checking
      in now to make sure the buldbots don't show any errors on platforms
      I can't direct test on.
    ........
      r70775 | r.david.murray | 2009-03-30 19:05:48 -0400 (Mon, 30 Mar 2009) | 4 lines
    
      Change more tests to use import_module for the modules that
      should cause tests to be skipped.  Also rename import_function
      to the more descriptive get_attribute and add a docstring.
    ........
      r70856 | r.david.murray | 2009-03-31 14:32:17 -0400 (Tue, 31 Mar 2009) | 7 lines
    
      A few more test skips via import_module, and change import_module to
      return the error message produced by importlib, so that if an import
      in the package whose import is being wrapped is what failed the skip
      message will contain the name of that module instead of the name of the
      wrapped module.  Also fixed formatting of some previous comments.
    ........
      r70874 | r.david.murray | 2009-03-31 15:33:15 -0400 (Tue, 31 Mar 2009) | 5 lines
    
      Improve test_support.import_module docstring, remove
      deprecated flag from get_attribute since it isn't likely
      to do anything useful.
    ........
      r70876 | r.david.murray | 2009-03-31 15:49:15 -0400 (Tue, 31 Mar 2009) | 4 lines
    
      Remove the regrtest check that turns any ImportError into a skipped test.
      Hopefully all modules whose imports legitimately result in a skipped
      test have been properly wrapped by the previous commits.
    ........
      r70877 | r.david.murray | 2009-03-31 15:57:24 -0400 (Tue, 31 Mar 2009) | 2 lines
    
      Add NEWS entry for regrtest change.
    ........
    a21e4ca3
test_grp.py 2.94 KB
"""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.assert_(isinstance(value.gr_name, str))
        self.assertEqual(value[1], value.gr_passwd)
        self.assert_(isinstance(value.gr_passwd, str))
        self.assertEqual(value[2], value.gr_gid)
        self.assert_(isinstance(value.gr_gid, int))
        self.assertEqual(value[3], value.gr_mem)
        self.assert_(isinstance(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)
            e2 = grp.getgrnam(e.gr_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(), e.gr_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 = 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_main():
    support.run_unittest(GroupDatabaseTestCase)

if __name__ == "__main__":
    test_main()