cpython: f8ff61f44aca (original) (raw)
--- a/Lib/test/test_stat.py +++ b/Lib/test/test_stat.py @@ -1,14 +1,52 @@ import unittest import os +from test.support import TESTFN, run_unittest, import_fresh_module import stat -from test.support import TESTFN, run_unittest - - -def get_mode(fname=TESTFN):
- class TestFilemode(unittest.TestCase):
- file_flags = {'SF_APPEND', 'SF_ARCHIVED', 'SF_IMMUTABLE', 'SF_NOUNLINK',
'SF_SNAPSHOT', 'UF_APPEND', 'UF_COMPRESSED', 'UF_HIDDEN',[](#l1.17)
'UF_IMMUTABLE', 'UF_NODUMP', 'UF_NOUNLINK', 'UF_OPAQUE'}[](#l1.18)
- format_funcs = {'S_ISBLK', 'S_ISCHR', 'S_ISDIR', 'S_ISFIFO', 'S_ISLNK',
'S_ISREG', 'S_ISSOCK'}[](#l1.24)
- stat_struct = {
'ST_MODE': 0,[](#l1.27)
'ST_INO': 1,[](#l1.28)
'ST_DEV': 2,[](#l1.29)
'ST_NLINK': 3,[](#l1.30)
'ST_UID': 4,[](#l1.31)
'ST_GID': 5,[](#l1.32)
'ST_SIZE': 6,[](#l1.33)
'ST_ATIME': 7,[](#l1.34)
'ST_MTIME': 8,[](#l1.35)
'ST_CTIME': 9}[](#l1.36)
permission bit value are defined by POSIX
- permission_bits = {
'S_ISUID': 0o4000,[](#l1.40)
'S_ISGID': 0o2000,[](#l1.41)
'S_ENFMT': 0o2000,[](#l1.42)
'S_ISVTX': 0o1000,[](#l1.43)
'S_IRWXU': 0o700,[](#l1.44)
'S_IRUSR': 0o400,[](#l1.45)
'S_IREAD': 0o400,[](#l1.46)
'S_IWUSR': 0o200,[](#l1.47)
'S_IWRITE': 0o200,[](#l1.48)
'S_IXUSR': 0o100,[](#l1.49)
'S_IEXEC': 0o100,[](#l1.50)
'S_IRWXG': 0o070,[](#l1.51)
'S_IRGRP': 0o040,[](#l1.52)
'S_IWGRP': 0o020,[](#l1.53)
'S_IXGRP': 0o010,[](#l1.54)
'S_IRWXO': 0o007,[](#l1.55)
'S_IROTH': 0o004,[](#l1.56)
'S_IWOTH': 0o002,[](#l1.57)
'S_IXOTH': 0o001}[](#l1.58)
def setUp(self): try: @@ -20,29 +58,75 @@ class TestFilemode(unittest.TestCase): pass tearDown = setUp
- def get_mode(self, fname=TESTFN):
st_mode = os.lstat(fname).st_mode[](#l1.67)
modestr = stat.filemode(st_mode)[](#l1.68)
return st_mode, modestr[](#l1.69)
- def assertS_IS(self, name, mode):
# test format, lstrip is for S_IFIFO[](#l1.72)
fmt = getattr(stat, "S_IF" + name.lstrip("F"))[](#l1.73)
self.assertEqual(stat.S_IFMT(mode), fmt)[](#l1.74)
# test that just one function returns true[](#l1.75)
testname = "S_IS" + name[](#l1.76)
for funcname in self.format_funcs:[](#l1.77)
func = getattr(stat, funcname, None)[](#l1.78)
if func is None:[](#l1.79)
if funcname == testname:[](#l1.80)
raise ValueError(funcname)[](#l1.81)
continue[](#l1.82)
if funcname == testname:[](#l1.83)
self.assertTrue(func(mode))[](#l1.84)
else:[](#l1.85)
self.assertFalse(func(mode))[](#l1.86)
+ def test_mode(self): with open(TESTFN, 'w'): pass if os.name == 'posix': os.chmod(TESTFN, 0o700)
self.assertEqual(get_mode(), '-rwx------')[](#l1.93)
st_mode, modestr = self.get_mode()[](#l1.94)
self.assertEqual(modestr, '-rwx------')[](#l1.95)
self.assertS_IS("REG", st_mode)[](#l1.96)
self.assertEqual(stat.S_IMODE(st_mode),[](#l1.97)
stat.S_IRWXU)[](#l1.98)
self.assertEqual(get_mode(), '----rwx---')[](#l1.101)
st_mode, modestr = self.get_mode()[](#l1.102)
self.assertEqual(modestr, '----rwx---')[](#l1.103)
self.assertS_IS("REG", st_mode)[](#l1.104)
self.assertEqual(stat.S_IMODE(st_mode),[](#l1.105)
stat.S_IRWXG)[](#l1.106)
self.assertEqual(get_mode(), '-------rwx')[](#l1.109)
st_mode, modestr = self.get_mode()[](#l1.110)
self.assertEqual(modestr, '-------rwx')[](#l1.111)
self.assertS_IS("REG", st_mode)[](#l1.112)
self.assertEqual(stat.S_IMODE(st_mode),[](#l1.113)
stat.S_IRWXO)[](#l1.114)
self.assertEqual(get_mode(), '-r--r--r--')[](#l1.117)
st_mode, modestr = self.get_mode()[](#l1.118)
self.assertS_IS("REG", st_mode)[](#l1.119)
self.assertEqual(modestr, '-r--r--r--')[](#l1.120)
self.assertEqual(stat.S_IMODE(st_mode), 0o444)[](#l1.121) else:[](#l1.122) os.chmod(TESTFN, 0o700)[](#l1.123)
self.assertEqual(get_mode()[:3], '-rw')[](#l1.124)
st_mode, modestr = self.get_mode()[](#l1.125)
self.assertEqual(modestr[:3], '-rw')[](#l1.126)
self.assertS_IS("REG", st_mode)[](#l1.127)
self.assertEqual(stat.S_IFMT(st_mode),[](#l1.128)
stat.S_IFREG)[](#l1.129)
def test_directory(self): os.mkdir(TESTFN) os.chmod(TESTFN, 0o700)
st_mode, modestr = self.get_mode()[](#l1.134)
self.assertS_IS("DIR", st_mode)[](#l1.135) if os.name == 'posix':[](#l1.136)
self.assertEqual(get_mode(), 'drwx------')[](#l1.137)
self.assertEqual(modestr, 'drwx------')[](#l1.138) else:[](#l1.139)
self.assertEqual(get_mode()[0], 'd')[](#l1.140)
self.assertEqual(modestr[0], 'd')[](#l1.141)
@unittest.skipUnless(hasattr(os, 'symlink'), 'os.symlink not available') def test_link(self): @@ -51,12 +135,47 @@ class TestFilemode(unittest.TestCase): except (OSError, NotImplementedError) as err: raise unittest.SkipTest(str(err)) else:
self.assertEqual(get_mode()[0], 'l')[](#l1.149)
st_mode, modestr = self.get_mode()[](#l1.150)
self.assertEqual(modestr[0], 'l')[](#l1.151)
self.assertS_IS("LNK", st_mode)[](#l1.152)
@unittest.skipUnless(hasattr(os, 'mkfifo'), 'os.mkfifo not available') def test_fifo(self): os.mkfifo(TESTFN, 0o700)
self.assertEqual(get_mode(), 'prwx------')[](#l1.157)
st_mode, modestr = self.get_mode()[](#l1.158)
self.assertEqual(modestr, 'prwx------')[](#l1.159)
self.assertS_IS("FIFO", st_mode)[](#l1.160)
- @unittest.skipUnless(os.name == 'posix', 'requires Posix')
- def test_devices(self):
if os.path.exists(os.devnull):[](#l1.164)
st_mode, modestr = self.get_mode(os.devnull)[](#l1.165)
self.assertEqual(modestr[0], 'c')[](#l1.166)
self.assertS_IS("CHR", st_mode)[](#l1.167)
for blockdev in ("/dev/sda", "/dev/hda", "/dev/da0", "/dev/ad0"):[](#l1.168)
if os.path.exists(blockdev):[](#l1.169)
st_mode, modestr = self.get_mode(blockdev)[](#l1.170)
self.assertEqual(modestr[0], 'b')[](#l1.171)
self.assertS_IS("BLK", st_mode)[](#l1.172)
break[](#l1.173)
- def test_module_attributes(self):
for key, value in self.stat_struct.items():[](#l1.176)
modvalue = getattr(stat, key)[](#l1.177)
self.assertEqual(value, modvalue, key)[](#l1.178)
for key, value in self.permission_bits.items():[](#l1.179)
modvalue = getattr(stat, key)[](#l1.180)
self.assertEqual(value, modvalue, key)[](#l1.181)
for key in self.file_flags:[](#l1.182)
modvalue = getattr(stat, key)[](#l1.183)
self.assertIsInstance(modvalue, int)[](#l1.184)
for key in self.formats:[](#l1.185)
modvalue = getattr(stat, key)[](#l1.186)
self.assertIsInstance(modvalue, int)[](#l1.187)
for key in self.format_funcs:[](#l1.188)
func = getattr(stat, key)[](#l1.189)
self.assertTrue(callable(func))[](#l1.190)
self.assertEqual(func(0), 0)[](#l1.191)