Issue #4591: Uid and gid values larger than 2**31 are supported now.
diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py
index 06ad5c8..042665b 100644
--- a/Lib/test/test_posix.py
+++ b/Lib/test/test_posix.py
@@ -232,10 +232,20 @@
         else:
             self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
 
-    def _test_all_chown_common(self, chown_func, first_param):
+    def _test_all_chown_common(self, chown_func, first_param, stat_func):
         """Common code for chown, fchown and lchown tests."""
+        def check_stat():
+            if stat_func is not None:
+                stat = stat_func(first_param)
+                self.assertEqual(stat.st_uid, os.getuid())
+                self.assertEqual(stat.st_gid, os.getgid())
         # test a successful chown call
         chown_func(first_param, os.getuid(), os.getgid())
+        check_stat()
+        chown_func(first_param, -1, os.getgid())
+        check_stat()
+        chown_func(first_param, os.getuid(), -1)
+        check_stat()
 
         if os.getuid() == 0:
             try:
@@ -255,8 +265,12 @@
                                     "behavior")
         else:
             # non-root cannot chown to root, raises OSError
-            self.assertRaises(OSError, chown_func,
-                              first_param, 0, 0)
+            self.assertRaises(OSError, chown_func, first_param, 0, 0)
+            check_stat()
+            self.assertRaises(OSError, chown_func, first_param, -1, 0)
+            check_stat()
+            self.assertRaises(OSError, chown_func, first_param, 0, -1)
+            check_stat()
 
     @unittest.skipUnless(hasattr(posix, 'chown'), "test needs os.chown()")
     def test_chown(self):
@@ -266,7 +280,8 @@
 
         # re-create the file
         open(support.TESTFN, 'w').close()
-        self._test_all_chown_common(posix.chown, support.TESTFN)
+        self._test_all_chown_common(posix.chown, support.TESTFN,
+                                    getattr(posix, 'stat', None))
 
     @unittest.skipUnless(hasattr(posix, 'fchown'), "test needs os.fchown()")
     def test_fchown(self):
@@ -276,7 +291,8 @@
         test_file = open(support.TESTFN, 'w')
         try:
             fd = test_file.fileno()
-            self._test_all_chown_common(posix.fchown, fd)
+            self._test_all_chown_common(posix.fchown, fd,
+                                        getattr(posix, 'fstat', None))
         finally:
             test_file.close()
 
@@ -285,7 +301,8 @@
         os.unlink(support.TESTFN)
         # create a symlink
         os.symlink(_DUMMY_SYMLINK, support.TESTFN)
-        self._test_all_chown_common(posix.lchown, support.TESTFN)
+        self._test_all_chown_common(posix.lchown, support.TESTFN,
+                                    getattr(posix, 'lstat', None))
 
     def test_chdir(self):
         if hasattr(posix, 'chdir'):
diff --git a/Lib/test/test_pwd.py b/Lib/test/test_pwd.py
index ae1c8fe..aa8f69f 100644
--- a/Lib/test/test_pwd.py
+++ b/Lib/test/test_pwd.py
@@ -49,7 +49,9 @@
 
     def test_errors(self):
         self.assertRaises(TypeError, pwd.getpwuid)
+        self.assertRaises(TypeError, pwd.getpwuid, 3.14)
         self.assertRaises(TypeError, pwd.getpwnam)
+        self.assertRaises(TypeError, pwd.getpwnam, 42)
         self.assertRaises(TypeError, pwd.getpwall, 42)
 
         # try to get some errors
@@ -93,6 +95,13 @@
         self.assertNotIn(fakeuid, byuids)
         self.assertRaises(KeyError, pwd.getpwuid, fakeuid)
 
+        # -1 shouldn't be a valid uid because it has a special meaning in many
+        # uid-related functions
+        self.assertRaises(KeyError, pwd.getpwuid, -1)
+        # should be out of uid_t range
+        self.assertRaises(KeyError, pwd.getpwuid, 2**128)
+        self.assertRaises(KeyError, pwd.getpwuid, -2**128)
+
 def test_main():
     support.run_unittest(PwdTest)