summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2013-02-20 17:42:31 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2013-02-20 17:42:31 (GMT)
commitf0602062b6f71fd0719078ce4122e6ab2a2cd459 (patch)
tree619456f514cc795dd5cf39ef209bf37d61976c79 /Lib
parent5a9ce077e0f59c34032f194e3ee0e4849b269c77 (diff)
parent54db2fd5d0a3383a26135ff5afade302753bce28 (diff)
downloadcpython-f0602062b6f71fd0719078ce4122e6ab2a2cd459.zip
cpython-f0602062b6f71fd0719078ce4122e6ab2a2cd459.tar.gz
cpython-f0602062b6f71fd0719078ce4122e6ab2a2cd459.tar.bz2
Issue #15301: Enhance os.*chown() testing. Based on patch by Larry Hastings.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_posix.py66
1 files changed, 42 insertions, 24 deletions
diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py
index d83440d..cfc188a 100644
--- a/Lib/test/test_posix.py
+++ b/Lib/test/test_posix.py
@@ -406,30 +406,42 @@ class PosixTester(unittest.TestCase):
def _test_all_chown_common(self, chown_func, first_param, stat_func):
"""Common code for chown, fchown and lchown tests."""
- def check_stat():
+ def check_stat(uid, gid):
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())
+ self.assertEqual(stat.st_uid, uid)
+ self.assertEqual(stat.st_gid, gid)
+ uid = os.getuid()
+ 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:
- # Many linux distros have a nfsnobody user as MAX_UID-2
- # that makes a good test case for signedness issues.
- # http://bugs.python.org/issue1747858
- # This part of the test only runs when run as root.
- # Only scary people run their tests as root.
- ent = pwd.getpwnam('nfsnobody')
- chown_func(first_param, ent.pw_uid, ent.pw_gid)
- except KeyError:
- pass
+ chown_func(first_param, uid, gid)
+ check_stat(uid, gid)
+ chown_func(first_param, -1, gid)
+ check_stat(uid, gid)
+ chown_func(first_param, uid, -1)
+ check_stat(uid, gid)
+
+ if uid == 0:
+ # Try an amusingly large uid/gid to make sure we handle
+ # large unsigned values. (chown lets you use any
+ # uid/gid you like, even if they aren't defined.)
+ #
+ # This problem keeps coming up:
+ # http://bugs.python.org/issue1747858
+ # http://bugs.python.org/issue4591
+ # http://bugs.python.org/issue15301
+ # Hopefully the fix in 4591 fixes it for good!
+ #
+ # This part of the test only runs when run as root.
+ # Only scary people run their tests as root.
+
+ big_value = 2**31
+ chown_func(first_param, big_value, big_value)
+ check_stat(big_value, big_value)
+ chown_func(first_param, -1, -1)
+ check_stat(big_value, big_value)
+ chown_func(first_param, uid, gid)
+ check_stat(uid, gid)
elif platform.system() in ('HP-UX', 'SunOS'):
# HP-UX and Solaris can allow a non-root user to chown() to root
# (issue #5113)
@@ -438,11 +450,17 @@ class PosixTester(unittest.TestCase):
else:
# non-root cannot chown to root, raises OSError
self.assertRaises(OSError, chown_func, first_param, 0, 0)
- check_stat()
+ check_stat(uid, gid)
self.assertRaises(OSError, chown_func, first_param, -1, 0)
- check_stat()
+ check_stat(uid, gid)
self.assertRaises(OSError, chown_func, first_param, 0, -1)
- check_stat()
+ check_stat(uid, gid)
+ # test illegal types
+ for t in str, float:
+ self.assertRaises(TypeError, chown_func, first_param, t(uid), gid)
+ check_stat(uid, gid)
+ self.assertRaises(TypeError, chown_func, first_param, uid, t(gid))
+ check_stat(uid, gid)
@unittest.skipUnless(hasattr(posix, 'chown'), "test needs os.chown()")
def test_chown(self):