@@ -2947,16 +2947,84 @@ def test_locate_files(self):
29472947 error_pattern = r"One or more files not found: 2\.txt \(search paths: \)"
29482948 self .assertErrorRegex (EasyBuildError , error_pattern , ft .locate_files , ['2.txt' ], [])
29492949
2950+ def test_set_gid_sticky_bits (self ):
2951+ """Test for set_gid_sticky_bits function."""
2952+ test_dir = os .path .join (self .test_prefix , 'test_dir' )
2953+ test_subdir = os .path .join (test_dir , 'subdir' )
2954+
2955+ ft .mkdir (test_subdir , parents = True )
2956+ dir_perms = os .lstat (test_dir )[stat .ST_MODE ]
2957+ self .assertEqual (dir_perms & stat .S_ISGID , 0 )
2958+ self .assertEqual (dir_perms & stat .S_ISVTX , 0 )
2959+ dir_perms = os .lstat (test_subdir )[stat .ST_MODE ]
2960+ self .assertEqual (dir_perms & stat .S_ISGID , 0 )
2961+ self .assertEqual (dir_perms & stat .S_ISVTX , 0 )
2962+
2963+ # by default, GID & sticky bits are not set
2964+ ft .set_gid_sticky_bits (test_dir )
2965+ dir_perms = os .lstat (test_dir )[stat .ST_MODE ]
2966+ self .assertEqual (dir_perms & stat .S_ISGID , 0 )
2967+ self .assertEqual (dir_perms & stat .S_ISVTX , 0 )
2968+
2969+ ft .set_gid_sticky_bits (test_dir , set_gid = True )
2970+ dir_perms = os .lstat (test_dir )[stat .ST_MODE ]
2971+ self .assertEqual (dir_perms & stat .S_ISGID , stat .S_ISGID )
2972+ self .assertEqual (dir_perms & stat .S_ISVTX , 0 )
2973+ ft .remove_dir (test_dir )
2974+ ft .mkdir (test_subdir , parents = True )
2975+
2976+ ft .set_gid_sticky_bits (test_dir , sticky = True )
2977+ dir_perms = os .lstat (test_dir )[stat .ST_MODE ]
2978+ self .assertEqual (dir_perms & stat .S_ISGID , 0 )
2979+ self .assertEqual (dir_perms & stat .S_ISVTX , stat .S_ISVTX )
2980+ ft .remove_dir (test_dir )
2981+ ft .mkdir (test_subdir , parents = True )
2982+
2983+ ft .set_gid_sticky_bits (test_dir , set_gid = True , sticky = True )
2984+ dir_perms = os .lstat (test_dir )[stat .ST_MODE ]
2985+ self .assertEqual (dir_perms & stat .S_ISGID , stat .S_ISGID )
2986+ self .assertEqual (dir_perms & stat .S_ISVTX , stat .S_ISVTX )
2987+ # no recursion by default
2988+ dir_perms = os .lstat (test_subdir )[stat .ST_MODE ]
2989+ self .assertEqual (dir_perms & stat .S_ISGID , 0 )
2990+ self .assertEqual (dir_perms & stat .S_ISVTX , 0 )
2991+
2992+ ft .remove_dir (test_dir )
2993+ ft .mkdir (test_subdir , parents = True )
2994+
2995+ ft .set_gid_sticky_bits (test_dir , set_gid = True , sticky = True , recursive = True )
2996+ dir_perms = os .lstat (test_dir )[stat .ST_MODE ]
2997+ self .assertEqual (dir_perms & stat .S_ISGID , stat .S_ISGID )
2998+ self .assertEqual (dir_perms & stat .S_ISVTX , stat .S_ISVTX )
2999+ dir_perms = os .lstat (test_subdir )[stat .ST_MODE ]
3000+ self .assertEqual (dir_perms & stat .S_ISGID , stat .S_ISGID )
3001+ self .assertEqual (dir_perms & stat .S_ISVTX , stat .S_ISVTX )
3002+
3003+ ft .remove_dir (test_dir )
3004+ ft .mkdir (test_subdir , parents = True )
3005+
3006+ # set_gid_sticky_bits honors relevant build options
3007+ init_config (build_options = {'set_gid_bit' : True , 'sticky_bit' : True })
3008+ ft .set_gid_sticky_bits (test_dir , recursive = True )
3009+ dir_perms = os .lstat (test_dir )[stat .ST_MODE ]
3010+ self .assertEqual (dir_perms & stat .S_ISGID , stat .S_ISGID )
3011+ self .assertEqual (dir_perms & stat .S_ISVTX , stat .S_ISVTX )
3012+ dir_perms = os .lstat (test_subdir )[stat .ST_MODE ]
3013+ self .assertEqual (dir_perms & stat .S_ISGID , stat .S_ISGID )
3014+ self .assertEqual (dir_perms & stat .S_ISVTX , stat .S_ISVTX )
3015+
29503016 def test_create_unused_dir (self ):
29513017 """Test create_unused_dir function."""
29523018 path = ft .create_unused_dir (self .test_prefix , 'folder' )
29533019 self .assertEqual (path , os .path .join (self .test_prefix , 'folder' ))
29543020 self .assertTrue (os .path .exists (path ))
3021+
29553022 # Repeat with existing folder(s) should create new ones
29563023 for i in range (10 ):
29573024 path = ft .create_unused_dir (self .test_prefix , 'folder' )
29583025 self .assertEqual (path , os .path .join (self .test_prefix , 'folder_%s' % i ))
29593026 self .assertTrue (os .path .exists (path ))
3027+
29603028 # Not influenced by similar folder
29613029 path = ft .create_unused_dir (self .test_prefix , 'folder2' )
29623030 self .assertEqual (path , os .path .join (self .test_prefix , 'folder2' ))
@@ -2965,18 +3033,20 @@ def test_create_unused_dir(self):
29653033 path = ft .create_unused_dir (self .test_prefix , 'folder2' )
29663034 self .assertEqual (path , os .path .join (self .test_prefix , 'folder2_%s' % i ))
29673035 self .assertTrue (os .path .exists (path ))
3036+
29683037 # Fail cleanly if passed a readonly folder
29693038 readonly_dir = os .path .join (self .test_prefix , 'ro_folder' )
2970- os .mkdir (readonly_dir )
3039+ ft .mkdir (readonly_dir )
29713040 old_perms = os .lstat (readonly_dir )[stat .ST_MODE ]
2972- os . chmod (readonly_dir , stat .S_IREAD | stat .S_IEXEC )
3041+ ft . adjust_permissions (readonly_dir , stat .S_IREAD | stat .S_IEXEC , relative = False )
29733042 try :
29743043 self .assertErrorRegex (EasyBuildError , 'Failed to create directory' ,
29753044 ft .create_unused_dir , readonly_dir , 'new_folder' )
29763045 finally :
2977- os .chmod (readonly_dir , old_perms )
3046+ ft .adjust_permissions (readonly_dir , old_perms , relative = False )
3047+
29783048 # Ignore files same as folders. So first just create a file with no contents
2979- open (os .path .join (self .test_prefix , 'file' ), 'w' ). close ( )
3049+ ft . write_file (os .path .join (self .test_prefix , 'file' ), '' )
29803050 path = ft .create_unused_dir (self .test_prefix , 'file' )
29813051 self .assertEqual (path , os .path .join (self .test_prefix , 'file_0' ))
29823052 self .assertTrue (os .path .exists (path ))
0 commit comments