2828"""Unit tests for mig.shared.filemarks module"""
2929
3030import os
31+ import shutil
32+ import stat
3133import tempfile
3234import time
3335import unittest
@@ -50,7 +52,7 @@ def before_each(self):
5052 """Setup fake configuration and temp dir before each test."""
5153 self .marks_base = os .path .join (self .configuration .mig_system_run ,
5254 TEST_MARKS_DIR )
53- ensure_dirs_exist (os . path . dirname ( self .marks_base ) )
55+ ensure_dirs_exist (self .marks_base )
5456 self .marks_path = os .path .join (self .marks_base , TEST_MARKS_FILE )
5557
5658 def test_update_filemark_create (self ):
@@ -130,6 +132,90 @@ def test_reset_filemark_all(self):
130132 result = get_filemark (self .configuration , self .marks_base , mark )
131133 self .assertEqual (result , 0 )
132134
135+ def test_update_filemark_fails_when_file_prevents_directory (self ):
136+ """Test update_filemark fails when file prevents create directory"""
137+ # Create a file in the way to prevent subdir creation
138+ result = update_filemark (self .configuration , self .marks_base ,
139+ 'obstruct' , time .time ())
140+ self .assertTrue (result )
141+ result = update_filemark (self .configuration , self .marks_base ,
142+ os .path .join ('obstruct' , 'test.mark' ),
143+ time .time ())
144+ self .assertFalse (result )
145+
146+ @unittest .skipIf (os .getuid () == 0 , "enable when not running as priv user" )
147+ def test_update_filemark_directory_perms_failure (self ):
148+ """Test update_filemark fails on directory creation failure"""
149+ # Create a read-only parent directory to prevent subdir creation
150+ # TODO: permissions are not enforced if running as a privileged user
151+ # like it's the case for our current docker CI
152+ os .chmod (self .marks_base , stat .S_IRUSR ) # Remove write permissions
153+
154+ result = update_filemark (self .configuration , self .marks_base ,
155+ os .path .join ('noaccess' , 'test.mark' ),
156+ time .time ())
157+ self .assertFalse (result )
158+
159+ @unittest .skipIf (os .getuid () == 0 , "enable when not running as priv user" )
160+ def test_get_filemark_permission_denied (self ):
161+ """Test get_filemark returns None when permission denied"""
162+ # Create valid file first
163+ update_filemark (self .configuration , self .marks_base ,
164+ TEST_MARKS_FILE , time .time ())
165+
166+ # Remove read permissions through parent dir
167+ os .chmod (self .marks_base , 0 )
168+ result = get_filemark (self .configuration , self .marks_base ,
169+ TEST_MARKS_FILE )
170+ self .assertIsNone (result )
171+ # Restore permissions so cleanup works
172+ os .chmod (self .marks_base , stat .S_IRWXU )
173+
174+ def test_reset_filemark_string_mark_list (self ):
175+ """Test reset_filemark handles single string mark_list"""
176+ update_filemark (self .configuration , self .marks_base ,
177+ TEST_MARKS_FILE , time .time ())
178+ reset_result = reset_filemark (self .configuration , self .marks_base ,
179+ TEST_MARKS_FILE )
180+ self .assertTrue (reset_result )
181+ self .assertEqual (get_filemark (self .configuration , self .marks_base ,
182+ TEST_MARKS_FILE ), 0 )
183+
184+ def test_reset_filemark_invalid_mark_list (self ):
185+ """Test reset_filemark fails with invalid mark_list type"""
186+ reset_result = reset_filemark (self .configuration , self .marks_base ,
187+ {'invalid' : 'type' })
188+ self .assertFalse (reset_result )
189+
190+ def test_reset_filemark_all_missing_dir (self ):
191+ """Test reset_filemark handles missing directory when mark_list=None"""
192+ shutil .rmtree (self .marks_base ) # Ensure directory doesn't exist
193+ reset_result = reset_filemark (self .configuration , self .marks_base )
194+ self .assertFalse (reset_result )
195+
196+ def test_reset_filemark_partial_failure (self ):
197+ """Test reset_filemark with partial success"""
198+ valid_mark = 'valid.mark'
199+ # invalid_mark = os.path.join('restricted_dir', 'invalid.mark')
200+ invalid_mark = 'invalid.mark'
201+ invalid_path = os .path .join (self .marks_base , invalid_mark )
202+ ensure_dirs_exist (invalid_path )
203+
204+ # Create both marks but remove access to the latter
205+ update_filemark (self .configuration , self .marks_base , valid_mark ,
206+ time .time ())
207+ update_filemark (self .configuration , self .marks_base , invalid_mark ,
208+ time .time ())
209+ os .chmod (invalid_path , stat .S_IRUSR ) # Remove write permissions
210+
211+ reset_result = reset_filemark (self .configuration , self .marks_base ,
212+ [valid_mark , invalid_mark ])
213+ self .assertFalse (reset_result ) # Should fail due to partial failure
214+
215+ # Verify valid mark was still reset
216+ self .assertEqual (get_filemark (self .configuration ,
217+ self .marks_base , valid_mark ), 0 )
218+
133219
134220if __name__ == '__main__' :
135221 testmain ()
0 commit comments