Issue #15301: Enhance os.*chown() testing. Based on patch by Larry Hastings.

This commit is contained in:
Serhiy Storchaka 2013-02-20 19:43:05 +02:00
commit 07342983ce
1 changed files with 41 additions and 23 deletions

View File

@ -406,30 +406,42 @@ class PosixTester(unittest.TestCase):
def _test_all_chown_common(self, chown_func, first_param, stat_func): def _test_all_chown_common(self, chown_func, first_param, stat_func):
"""Common code for chown, fchown and lchown tests.""" """Common code for chown, fchown and lchown tests."""
def check_stat(): def check_stat(uid, gid):
if stat_func is not None: if stat_func is not None:
stat = stat_func(first_param) stat = stat_func(first_param)
self.assertEqual(stat.st_uid, os.getuid()) self.assertEqual(stat.st_uid, uid)
self.assertEqual(stat.st_gid, os.getgid()) self.assertEqual(stat.st_gid, gid)
uid = os.getuid()
gid = os.getgid()
# test a successful chown call # test a successful chown call
chown_func(first_param, os.getuid(), os.getgid()) chown_func(first_param, uid, gid)
check_stat() check_stat(uid, gid)
chown_func(first_param, -1, os.getgid()) chown_func(first_param, -1, gid)
check_stat() check_stat(uid, gid)
chown_func(first_param, os.getuid(), -1) chown_func(first_param, uid, -1)
check_stat() check_stat(uid, gid)
if os.getuid() == 0: if uid == 0:
try: # Try an amusingly large uid/gid to make sure we handle
# Many linux distros have a nfsnobody user as MAX_UID-2 # large unsigned values. (chown lets you use any
# that makes a good test case for signedness issues. # uid/gid you like, even if they aren't defined.)
# http://bugs.python.org/issue1747858 #
# This part of the test only runs when run as root. # This problem keeps coming up:
# Only scary people run their tests as root. # http://bugs.python.org/issue1747858
ent = pwd.getpwnam('nfsnobody') # http://bugs.python.org/issue4591
chown_func(first_param, ent.pw_uid, ent.pw_gid) # http://bugs.python.org/issue15301
except KeyError: # Hopefully the fix in 4591 fixes it for good!
pass #
# 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'): elif platform.system() in ('HP-UX', 'SunOS'):
# HP-UX and Solaris can allow a non-root user to chown() to root # HP-UX and Solaris can allow a non-root user to chown() to root
# (issue #5113) # (issue #5113)
@ -438,11 +450,17 @@ class PosixTester(unittest.TestCase):
else: else:
# non-root cannot chown to root, raises OSError # 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() check_stat(uid, gid)
self.assertRaises(OSError, chown_func, first_param, -1, 0) self.assertRaises(OSError, chown_func, first_param, -1, 0)
check_stat() check_stat(uid, gid)
self.assertRaises(OSError, chown_func, first_param, 0, -1) 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()") @unittest.skipUnless(hasattr(posix, 'chown'), "test needs os.chown()")
def test_chown(self): def test_chown(self):