diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2013-02-20 17:40:25 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2013-02-20 17:40:25 (GMT) |
commit | 54db2fd5d0a3383a26135ff5afade302753bce28 (patch) | |
tree | 26c2dba0a1c7acf14b97132ba3039e69f3e65c9c /Lib/test/test_posix.py | |
parent | 774a39f26ef2fa8ed96f3c52d3edac5e93926b4b (diff) | |
download | cpython-54db2fd5d0a3383a26135ff5afade302753bce28.zip cpython-54db2fd5d0a3383a26135ff5afade302753bce28.tar.gz cpython-54db2fd5d0a3383a26135ff5afade302753bce28.tar.bz2 |
Issue #15301: Enhance os.*chown() testing. Based on patch by Larry Hastings.
Diffstat (limited to 'Lib/test/test_posix.py')
-rw-r--r-- | Lib/test/test_posix.py | 66 |
1 files changed, 42 insertions, 24 deletions
diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index 042665b..e06ffa5 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -234,30 +234,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) @@ -266,11 +278,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): |