@@ -2947,6 +2947,110 @@ 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+
3016+ def test_create_unused_dir (self ):
3017+ """Test create_unused_dir function."""
3018+ path = ft .create_unused_dir (self .test_prefix , 'folder' )
3019+ self .assertEqual (path , os .path .join (self .test_prefix , 'folder' ))
3020+ self .assertTrue (os .path .exists (path ))
3021+
3022+ # Repeat with existing folder(s) should create new ones
3023+ for i in range (10 ):
3024+ path = ft .create_unused_dir (self .test_prefix , 'folder' )
3025+ self .assertEqual (path , os .path .join (self .test_prefix , 'folder_%s' % i ))
3026+ self .assertTrue (os .path .exists (path ))
3027+
3028+ # Not influenced by similar folder
3029+ path = ft .create_unused_dir (self .test_prefix , 'folder2' )
3030+ self .assertEqual (path , os .path .join (self .test_prefix , 'folder2' ))
3031+ self .assertTrue (os .path .exists (path ))
3032+ for i in range (10 ):
3033+ path = ft .create_unused_dir (self .test_prefix , 'folder2' )
3034+ self .assertEqual (path , os .path .join (self .test_prefix , 'folder2_%s' % i ))
3035+ self .assertTrue (os .path .exists (path ))
3036+
3037+ # Fail cleanly if passed a readonly folder
3038+ readonly_dir = os .path .join (self .test_prefix , 'ro_folder' )
3039+ ft .mkdir (readonly_dir )
3040+ old_perms = os .lstat (readonly_dir )[stat .ST_MODE ]
3041+ ft .adjust_permissions (readonly_dir , stat .S_IREAD | stat .S_IEXEC , relative = False )
3042+ try :
3043+ self .assertErrorRegex (EasyBuildError , 'Failed to create directory' ,
3044+ ft .create_unused_dir , readonly_dir , 'new_folder' )
3045+ finally :
3046+ ft .adjust_permissions (readonly_dir , old_perms , relative = False )
3047+
3048+ # Ignore files same as folders. So first just create a file with no contents
3049+ ft .write_file (os .path .join (self .test_prefix , 'file' ), '' )
3050+ path = ft .create_unused_dir (self .test_prefix , 'file' )
3051+ self .assertEqual (path , os .path .join (self .test_prefix , 'file_0' ))
3052+ self .assertTrue (os .path .exists (path ))
3053+
29503054
29513055def suite ():
29523056 """ returns all the testcases in this module """
0 commit comments