@@ -15,8 +15,10 @@ class TestFilemode:
1515 statmod = None
1616
1717 file_flags = {'SF_APPEND' , 'SF_ARCHIVED' , 'SF_IMMUTABLE' , 'SF_NOUNLINK' ,
18- 'SF_SNAPSHOT' , 'UF_APPEND' , 'UF_COMPRESSED' , 'UF_HIDDEN' ,
19- 'UF_IMMUTABLE' , 'UF_NODUMP' , 'UF_NOUNLINK' , 'UF_OPAQUE' }
18+ 'SF_SNAPSHOT' , 'SF_SETTABLE' , 'SF_RESTRICTED' , 'SF_FIRMLINK' ,
19+ 'SF_DATALESS' , 'UF_APPEND' , 'UF_COMPRESSED' , 'UF_HIDDEN' ,
20+ 'UF_IMMUTABLE' , 'UF_NODUMP' , 'UF_NOUNLINK' , 'UF_OPAQUE' ,
21+ 'UF_SETTABLE' , 'UF_TRACKED' , 'UF_DATAVAULT' }
2022
2123 formats = {'S_IFBLK' , 'S_IFCHR' , 'S_IFDIR' , 'S_IFIFO' , 'S_IFLNK' ,
2224 'S_IFREG' , 'S_IFSOCK' , 'S_IFDOOR' , 'S_IFPORT' , 'S_IFWHT' }
@@ -239,6 +241,18 @@ def test_module_attributes(self):
239241 self .assertTrue (callable (func ))
240242 self .assertEqual (func (0 ), 0 )
241243
244+ def test_flags_consistent (self ):
245+ self .assertFalse (self .statmod .UF_SETTABLE & self .statmod .SF_SETTABLE )
246+
247+ for flag in self .file_flags :
248+ if flag .startswith ("UF" ):
249+ self .assertTrue (getattr (self .statmod , flag ) & self .statmod .UF_SETTABLE , f"{ flag } not in UF_SETTABLE" )
250+ elif sys .platform == 'darwin' and self .statmod is c_stat and flag == 'SF_DATALESS' :
251+ self .assertTrue (self .statmod .SF_DATALESS & self .statmod .SF_SYNTHETIC , "SF_DATALESS not in SF_SYNTHETIC" )
252+ self .assertFalse (self .statmod .SF_DATALESS & self .statmod .SF_SETTABLE , "SF_DATALESS in SF_SETTABLE" )
253+ else :
254+ self .assertTrue (getattr (self .statmod , flag ) & self .statmod .SF_SETTABLE , f"{ flag } notin SF_SETTABLE" )
255+
242256 @unittest .skipUnless (sys .platform == "win32" ,
243257 "FILE_ATTRIBUTE_* constants are Win32 specific" )
244258 def test_file_attribute_constants (self ):
@@ -247,6 +261,66 @@ def test_file_attribute_constants(self):
247261 modvalue = getattr (self .statmod , key )
248262 self .assertEqual (value , modvalue , key )
249263
264+ @unittest .skipUnless (sys .platform == "darwin" , "macOS system check" )
265+ def test_macosx_attribute_values (self ):
266+ self .assertEqual (self .statmod .UF_SETTABLE , 0x0000ffff )
267+ self .assertEqual (self .statmod .UF_NODUMP , 0x00000001 )
268+ self .assertEqual (self .statmod .UF_IMMUTABLE , 0x00000002 )
269+ self .assertEqual (self .statmod .UF_APPEND , 0x00000004 )
270+ self .assertEqual (self .statmod .UF_OPAQUE , 0x00000008 )
271+ self .assertEqual (self .statmod .UF_COMPRESSED , 0x00000020 )
272+ self .assertEqual (self .statmod .UF_TRACKED , 0x00000040 )
273+ self .assertEqual (self .statmod .UF_DATAVAULT , 0x00000080 )
274+ self .assertEqual (self .statmod .UF_HIDDEN , 0x00008000 )
275+
276+ if self .statmod is c_stat :
277+ self .assertEqual (self .statmod .SF_SUPPORTED , 0x009f0000 )
278+ self .assertEqual (self .statmod .SF_SETTABLE , 0x3fff0000 )
279+ self .assertEqual (self .statmod .SF_SYNTHETIC , 0xc0000000 )
280+ else :
281+ self .assertEqual (self .statmod .SF_SETTABLE , 0xffff0000 )
282+ self .assertEqual (self .statmod .SF_ARCHIVED , 0x00010000 )
283+ self .assertEqual (self .statmod .SF_IMMUTABLE , 0x00020000 )
284+ self .assertEqual (self .statmod .SF_APPEND , 0x00040000 )
285+ self .assertEqual (self .statmod .SF_RESTRICTED , 0x00080000 )
286+ self .assertEqual (self .statmod .SF_NOUNLINK , 0x00100000 )
287+ self .assertEqual (self .statmod .SF_FIRMLINK , 0x00800000 )
288+ self .assertEqual (self .statmod .SF_DATALESS , 0x40000000 )
289+
290+ self .assertFalse (isinstance (self .statmod .S_IFMT , int ))
291+ self .assertEqual (self .statmod .S_IFIFO , 0o010000 )
292+ self .assertEqual (self .statmod .S_IFCHR , 0o020000 )
293+ self .assertEqual (self .statmod .S_IFDIR , 0o040000 )
294+ self .assertEqual (self .statmod .S_IFBLK , 0o060000 )
295+ self .assertEqual (self .statmod .S_IFREG , 0o100000 )
296+ self .assertEqual (self .statmod .S_IFLNK , 0o120000 )
297+ self .assertEqual (self .statmod .S_IFSOCK , 0o140000 )
298+
299+ if self .statmod is c_stat :
300+ self .assertEqual (self .statmod .S_IFWHT , 0o160000 )
301+
302+ self .assertEqual (self .statmod .S_IRWXU , 0o000700 )
303+ self .assertEqual (self .statmod .S_IRUSR , 0o000400 )
304+ self .assertEqual (self .statmod .S_IWUSR , 0o000200 )
305+ self .assertEqual (self .statmod .S_IXUSR , 0o000100 )
306+ self .assertEqual (self .statmod .S_IRWXG , 0o000070 )
307+ self .assertEqual (self .statmod .S_IRGRP , 0o000040 )
308+ self .assertEqual (self .statmod .S_IWGRP , 0o000020 )
309+ self .assertEqual (self .statmod .S_IXGRP , 0o000010 )
310+ self .assertEqual (self .statmod .S_IRWXO , 0o000007 )
311+ self .assertEqual (self .statmod .S_IROTH , 0o000004 )
312+ self .assertEqual (self .statmod .S_IWOTH , 0o000002 )
313+ self .assertEqual (self .statmod .S_IXOTH , 0o000001 )
314+ self .assertEqual (self .statmod .S_ISUID , 0o004000 )
315+ self .assertEqual (self .statmod .S_ISGID , 0o002000 )
316+ self .assertEqual (self .statmod .S_ISVTX , 0o001000 )
317+
318+ self .assertFalse (hasattr (self .statmod , "S_ISTXT" ))
319+ self .assertEqual (self .statmod .S_IREAD , self .statmod .S_IRUSR )
320+ self .assertEqual (self .statmod .S_IWRITE , self .statmod .S_IWUSR )
321+ self .assertEqual (self .statmod .S_IEXEC , self .statmod .S_IXUSR )
322+
323+
250324
251325@unittest .skipIf (c_stat is None , 'need _stat extension' )
252326class TestFilemodeCStat (TestFilemode , unittest .TestCase ):
0 commit comments