Port test_pwd.py to PyUnit. Check that getpwall() and
getpwnam()/getpwuid() return consistent data.

Change test_grp to check that getgrall() and
getgrnam()/getgrgid() return consistent data.
Add error checks similar to test_pwd.py.

Port test___all__.py to PyUnit.

From SF patch #662807.
diff --git a/Lib/test/output/test_pwd b/Lib/test/output/test_pwd
deleted file mode 100644
index ede4d8d..0000000
--- a/Lib/test/output/test_pwd
+++ /dev/null
@@ -1,7 +0,0 @@
-test_pwd
-pwd.getpwall()
-pwd.getpwuid()
-pwd.getpwnam()
-name matches uid
-caught expected exception
-caught expected exception
diff --git a/Lib/test/test___all__.py b/Lib/test/test___all__.py
index a0ffa65..85ee598 100644
--- a/Lib/test/test___all__.py
+++ b/Lib/test/test___all__.py
@@ -1,3 +1,6 @@
+import unittest
+from test import test_support
+
 from test.test_support import verify, verbose
 import sys
 import warnings
@@ -9,166 +12,189 @@
 warnings.filterwarnings("ignore", ".* statcache .*", DeprecationWarning,
                         r'statcache$')
 
-def check_all(modname):
-    names = {}
-    try:
-        exec "import %s" % modname in names
-    except ImportError:
-        # Silent fail here seems the best route since some modules
-        # may not be available in all environments.
-        # Since an ImportError may leave a partial module object in
-        # sys.modules, get rid of that first.  Here's what happens if
-        # you don't:  importing pty fails on Windows because pty tries to
-        # import FCNTL, which doesn't exist.  That raises an ImportError,
-        # caught here.  It also leaves a partial pty module in sys.modules.
-        # So when test_pty is called later, the import of pty succeeds,
-        # but shouldn't.  As a result, test_pty crashes with an
-        # AttributeError instead of an ImportError, and regrtest interprets
-        # the latter as a test failure (ImportError is treated as "test
-        # skipped" -- which is what test_pty should say on Windows).
+class AllTest(unittest.TestCase):
+
+    def check_all(self, modname):
+        names = {}
         try:
-            del sys.modules[modname]
-        except KeyError:
-            pass
-        return
-    verify(hasattr(sys.modules[modname], "__all__"),
-           "%s has no __all__ attribute" % modname)
-    names = {}
-    exec "from %s import *" % modname in names
-    if names.has_key("__builtins__"):
-        del names["__builtins__"]
-    keys = names.keys()
-    keys.sort()
-    all = list(sys.modules[modname].__all__) # in case it's a tuple
-    all.sort()
-    verify(keys==all, "%s != %s" % (keys, all))
+            exec "import %s" % modname in names
+        except ImportError:
+            # Silent fail here seems the best route since some modules
+            # may not be available in all environments.
+            # Since an ImportError may leave a partial module object in
+            # sys.modules, get rid of that first.  Here's what happens if
+            # you don't:  importing pty fails on Windows because pty tries to
+            # import FCNTL, which doesn't exist.  That raises an ImportError,
+            # caught here.  It also leaves a partial pty module in sys.modules.
+            # So when test_pty is called later, the import of pty succeeds,
+            # but shouldn't.  As a result, test_pty crashes with an
+            # AttributeError instead of an ImportError, and regrtest interprets
+            # the latter as a test failure (ImportError is treated as "test
+            # skipped" -- which is what test_pty should say on Windows).
+            try:
+                del sys.modules[modname]
+            except KeyError:
+                pass
+            return
+        verify(hasattr(sys.modules[modname], "__all__"),
+               "%s has no __all__ attribute" % modname)
+        names = {}
+        exec "from %s import *" % modname in names
+        if names.has_key("__builtins__"):
+            del names["__builtins__"]
+        keys = names.keys()
+        keys.sort()
+        all = list(sys.modules[modname].__all__) # in case it's a tuple
+        all.sort()
+        verify(keys==all, "%s != %s" % (keys, all))
 
-if not sys.platform.startswith('java'):
-    # In case _socket fails to build, make this test fail more gracefully
-    # than an AttributeError somewhere deep in CGIHTTPServer.
-    import _socket
+    def test_all(self):
+        if not sys.platform.startswith('java'):
+            # In case _socket fails to build, make this test fail more gracefully
+            # than an AttributeError somewhere deep in CGIHTTPServer.
+            import _socket
 
-check_all("BaseHTTPServer")
-check_all("CGIHTTPServer")
-check_all("ConfigParser")
-check_all("Cookie")
-check_all("MimeWriter")
-check_all("SimpleHTTPServer")
-check_all("SocketServer")
-check_all("StringIO")
-check_all("UserString")
-check_all("aifc")
-check_all("atexit")
-check_all("audiodev")
-check_all("base64")
-check_all("bdb")
-check_all("binhex")
-check_all("calendar")
-check_all("cgi")
-check_all("cmd")
-check_all("code")
-check_all("codecs")
-check_all("codeop")
-check_all("colorsys")
-check_all("commands")
-check_all("compileall")
-check_all("copy")
-check_all("copy_reg")
-check_all("dbhash")
-check_all("dircache")
-check_all("dis")
-check_all("doctest")
-check_all("dospath")
-check_all("filecmp")
-check_all("fileinput")
-check_all("fnmatch")
-check_all("fpformat")
-check_all("ftplib")
-check_all("getopt")
-check_all("getpass")
-check_all("gettext")
-check_all("glob")
-check_all("gopherlib")
-check_all("gzip")
-check_all("htmllib")
-check_all("httplib")
-check_all("ihooks")
-check_all("imaplib")
-check_all("imghdr")
-check_all("imputil")
-check_all("keyword")
-check_all("linecache")
-check_all("locale")
-check_all("macpath")
-check_all("macurl2path")
-check_all("mailbox")
-check_all("mhlib")
-check_all("mimetools")
-check_all("mimetypes")
-check_all("mimify")
-check_all("multifile")
-check_all("netrc")
-check_all("nntplib")
-check_all("ntpath")
-check_all("os")
-check_all("pdb")
-check_all("pickle")
-check_all("pipes")
-check_all("popen2")
-check_all("poplib")
-check_all("posixpath")
-check_all("pprint")
-check_all("pre")  # deprecated
-check_all("profile")
-check_all("pstats")
-check_all("pty")
-check_all("py_compile")
-check_all("pyclbr")
-check_all("quopri")
-check_all("random")
-check_all("re")
-check_all("reconvert")
-check_all("regsub")
-check_all("repr")
-check_all("rexec")
-check_all("rfc822")
-check_all("robotparser")
-check_all("sched")
-check_all("sgmllib")
-check_all("shelve")
-check_all("shlex")
-check_all("shutil")
-check_all("smtpd")
-check_all("smtplib")
-check_all("sndhdr")
-check_all("socket")
-check_all("sre")
-check_all("stat_cache")
-check_all("tabnanny")
-check_all("telnetlib")
-check_all("tempfile")
-check_all("toaiff")
-check_all("tokenize")
-check_all("traceback")
-check_all("tty")
-check_all("urllib")
-check_all("urlparse")
-check_all("uu")
-check_all("warnings")
-check_all("wave")
-check_all("weakref")
-check_all("webbrowser")
-check_all("xdrlib")
-check_all("zipfile")
+        self.check_all("BaseHTTPServer")
+        self.check_all("CGIHTTPServer")
+        self.check_all("ConfigParser")
+        self.check_all("Cookie")
+        self.check_all("MimeWriter")
+        self.check_all("SimpleHTTPServer")
+        self.check_all("SocketServer")
+        self.check_all("StringIO")
+        self.check_all("UserString")
+        self.check_all("aifc")
+        self.check_all("atexit")
+        self.check_all("audiodev")
+        self.check_all("base64")
+        self.check_all("bdb")
+        self.check_all("binhex")
+        self.check_all("calendar")
+        self.check_all("cgi")
+        self.check_all("cmd")
+        self.check_all("code")
+        self.check_all("codecs")
+        self.check_all("codeop")
+        self.check_all("colorsys")
+        self.check_all("commands")
+        self.check_all("compileall")
+        self.check_all("copy")
+        self.check_all("copy_reg")
+        self.check_all("dbhash")
+        self.check_all("difflib")
+        self.check_all("dircache")
+        self.check_all("dis")
+        self.check_all("doctest")
+        self.check_all("dummy_thread")
+        self.check_all("dummy_threading")
+        self.check_all("filecmp")
+        self.check_all("fileinput")
+        self.check_all("fnmatch")
+        self.check_all("fpformat")
+        self.check_all("ftplib")
+        self.check_all("getopt")
+        self.check_all("getpass")
+        self.check_all("gettext")
+        self.check_all("glob")
+        self.check_all("gopherlib")
+        self.check_all("gzip")
+        self.check_all("heapq")
+        self.check_all("htmllib")
+        self.check_all("httplib")
+        self.check_all("ihooks")
+        self.check_all("imaplib")
+        self.check_all("imghdr")
+        self.check_all("imputil")
+        self.check_all("keyword")
+        self.check_all("linecache")
+        self.check_all("locale")
+        self.check_all("macpath")
+        self.check_all("macurl2path")
+        self.check_all("mailbox")
+        self.check_all("mailcap")
+        self.check_all("mhlib")
+        self.check_all("mimetools")
+        self.check_all("mimetypes")
+        self.check_all("mimify")
+        self.check_all("multifile")
+        self.check_all("netrc")
+        self.check_all("nntplib")
+        self.check_all("ntpath")
+        self.check_all("opcode")
+        self.check_all("os")
+        self.check_all("os2emxpath")
+        self.check_all("pdb")
+        self.check_all("pickle")
+        self.check_all("pipes")
+        self.check_all("popen2")
+        self.check_all("poplib")
+        self.check_all("posixpath")
+        self.check_all("pprint")
+        self.check_all("pre")  # deprecated
+        self.check_all("profile")
+        self.check_all("pstats")
+        self.check_all("pty")
+        self.check_all("py_compile")
+        self.check_all("pyclbr")
+        self.check_all("quopri")
+        self.check_all("random")
+        self.check_all("re")
+        self.check_all("reconvert")
+        self.check_all("regsub")
+        self.check_all("repr")
+        self.check_all("rexec")
+        self.check_all("rfc822")
+        self.check_all("robotparser")
+        self.check_all("sched")
+        self.check_all("sets")
+        self.check_all("sgmllib")
+        self.check_all("shelve")
+        self.check_all("shlex")
+        self.check_all("shutil")
+        self.check_all("smtpd")
+        self.check_all("smtplib")
+        self.check_all("sndhdr")
+        self.check_all("socket")
+        self.check_all("sre")
+        self.check_all("statcache")
+        self.check_all("symtable")
+        self.check_all("tabnanny")
+        self.check_all("tarfile")
+        self.check_all("telnetlib")
+        self.check_all("tempfile")
+        self.check_all("textwrap")
+        self.check_all("threading")
+        self.check_all("toaiff")
+        self.check_all("tokenize")
+        self.check_all("traceback")
+        self.check_all("tty")
+        self.check_all("urllib")
+        self.check_all("urlparse")
+        self.check_all("uu")
+        self.check_all("warnings")
+        self.check_all("wave")
+        self.check_all("weakref")
+        self.check_all("webbrowser")
+        self.check_all("xdrlib")
+        self.check_all("zipfile")
 
-# rlcompleter needs special consideration; it import readline which
-# initializes GNU readline which calls setlocale(LC_CTYPE, "")... :-(
-try:
-    check_all("rlcompleter")
-finally:
-    try:
-        import locale
-    except ImportError:
-        pass
-    else:
-        locale.setlocale(locale.LC_CTYPE, 'C')
+        # rlcompleter needs special consideration; it import readline which
+        # initializes GNU readline which calls setlocale(LC_CTYPE, "")... :-(
+        try:
+            self.check_all("rlcompleter")
+        finally:
+            try:
+                import locale
+            except ImportError:
+                pass
+            else:
+                locale.setlocale(locale.LC_CTYPE, 'C')
+
+
+def test_main():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(AllTest))
+    test_support.run_suite(suite)
+
+if __name__ == "__main__":
+    test_main()
diff --git a/Lib/test/test_grp.py b/Lib/test/test_grp.py
index a8d78ba..85a52c1 100755
--- a/Lib/test/test_grp.py
+++ b/Lib/test/test_grp.py
@@ -1,7 +1,5 @@
 """Test script for the grp module."""
 
-# XXX This really needs some work, but what are the expected invariants?
-
 import grp
 import unittest
 from test import test_support
@@ -9,19 +7,71 @@
 
 class GroupDatabaseTestCase(unittest.TestCase):
 
-    def setUp(self):
-        self.groups = grp.getgrall()
+    def test_values(self):
+        entries = grp.getgrall()
 
-    def test_getgrgid(self):
-        entry = grp.getgrgid(self.groups[0][2])
+        for e in entries:
+            self.assertEqual(len(e), 4)
+            self.assertEqual(e[0], e.gr_name)
+            self.assert_(isinstance(e.gr_name, basestring))
+            self.assertEqual(e[1], e.gr_passwd)
+            self.assert_(isinstance(e.gr_passwd, basestring))
+            self.assertEqual(e[2], e.gr_gid)
+            self.assert_(isinstance(e.gr_gid, int))
+            self.assertEqual(e[3], e.gr_mem)
+            self.assert_(isinstance(e.gr_mem, list))
 
-    def test_getgrnam(self):
-        entry = grp.getgrnam(self.groups[0][0])
+            self.assertEqual(grp.getgrnam(e.gr_name), e)
+            self.assertEqual(grp.getgrgid(e.gr_gid), e)
 
+    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():
+            bynames[n] = g
+            bygids[g] = n
+
+        allnames = bynames.keys()
+        namei = 0
+        fakename = allnames[namei]
+        while fakename in bynames:
+            chars = map(None, 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(map(None, 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)
-
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(GroupDatabaseTestCase))
+    test_support.run_suite(suite)
 
 if __name__ == "__main__":
     test_main()
diff --git a/Lib/test/test_pwd.py b/Lib/test/test_pwd.py
index 75d083b..78f9a69 100644
--- a/Lib/test/test_pwd.py
+++ b/Lib/test/test_pwd.py
@@ -1,71 +1,82 @@
-from test.test_support import verbose
+import unittest
+from test import test_support
+
 import pwd
 
-print 'pwd.getpwall()'
-entries = pwd.getpwall()
+class PwdTest(unittest.TestCase):
 
-for e in entries:
-    name = e[0]
-    uid = e[2]
-    if verbose:
-        print name, uid
-    print 'pwd.getpwuid()'
-    dbuid = pwd.getpwuid(uid)
-    if dbuid[0] != name:
-        print 'Mismatch in pwd.getpwuid()'
-    print 'pwd.getpwnam()'
-    dbname = pwd.getpwnam(name)
-    if dbname[2] != uid:
-        print 'Mismatch in pwd.getpwnam()'
-    else:
-        print 'name matches uid'
-    break
+    def test_values(self):
+        entries = pwd.getpwall()
 
-# try to get some errors
-bynames = {}
-byuids = {}
-for n, p, u, g, gecos, d, s in entries:
-    bynames[n] = u
-    byuids[u] = n
+        for e in entries:
+            self.assertEqual(len(e), 7)
+            self.assertEqual(e[0], e.pw_name)
+            self.assert_(isinstance(e.pw_name, basestring))
+            self.assertEqual(e[1], e.pw_passwd)
+            self.assert_(isinstance(e.pw_passwd, basestring))
+            self.assertEqual(e[2], e.pw_uid)
+            self.assert_(isinstance(e.pw_uid, int))
+            self.assertEqual(e[3], e.pw_gid)
+            self.assert_(isinstance(e.pw_gid, int))
+            self.assertEqual(e[4], e.pw_gecos)
+            self.assert_(isinstance(e.pw_gecos, basestring))
+            self.assertEqual(e[5], e.pw_dir)
+            self.assert_(isinstance(e.pw_dir, basestring))
+            self.assertEqual(e[6], e.pw_shell)
+            self.assert_(isinstance(e.pw_shell, basestring))
 
-allnames = bynames.keys()
-namei = 0
-fakename = allnames[namei]
-while bynames.has_key(fakename):
-    chars = map(None, 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(map(None, chars))
+            self.assertEqual(pwd.getpwnam(e.pw_name), e)
+            self.assertEqual(pwd.getpwuid(e.pw_uid), e)
 
-try:
-    pwd.getpwnam(fakename)
-except KeyError:
-    print 'caught expected exception'
-else:
-    print 'fakename', fakename, 'did not except pwd.getpwnam()'
+    def test_errors(self):
+        self.assertRaises(TypeError, pwd.getpwuid)
+        self.assertRaises(TypeError, pwd.getpwnam)
+        self.assertRaises(TypeError, pwd.getpwall, 42)
 
-# Choose a non-existent uid.
-fakeuid = 4127
-while byuids.has_key(fakeuid):
-    fakeuid = (fakeuid * 3) % 0x10000
+        # try to get some errors
+        bynames = {}
+        byuids = {}
+        for (n, p, u, g, gecos, d, s) in pwd.getpwall():
+            bynames[n] = u
+            byuids[u] = n
 
-try:
-    pwd.getpwuid(fakeuid)
-except KeyError:
-    print 'caught expected exception'
-else:
-    print 'fakeuid', fakeuid, 'did not except pwd.getpwuid()'
+        allnames = bynames.keys()
+        namei = 0
+        fakename = allnames[namei]
+        while fakename in bynames:
+            chars = map(None, 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(map(None, chars))
+
+        self.assertRaises(KeyError, pwd.getpwnam, fakename)
+
+        # Choose a non-existent uid.
+        fakeuid = 4127
+        while fakeuid in byuids:
+            fakeuid = (fakeuid * 3) % 0x10000
+
+        self.assertRaises(KeyError, pwd.getpwuid, fakeuid)
+
+def test_main():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(PwdTest))
+    test_support.run_suite(suite)
+
+if __name__ == "__main__":
+    test_main()
+