Skip to content

Commit 7708fdc

Browse files
committed
Increase filemarks coverage with more corner cases. A few are explicitly
disabled when run as privileged user like in our doker CI because basic ACLs are not fully enforced in that case.
1 parent 9689854 commit 7708fdc

File tree

1 file changed

+87
-1
lines changed

1 file changed

+87
-1
lines changed

tests/test_mig_shared_filemarks.py

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
"""Unit tests for mig.shared.filemarks module"""
2929

3030
import os
31+
import shutil
32+
import stat
3133
import tempfile
3234
import time
3335
import 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

134220
if __name__ == '__main__':
135221
testmain()

0 commit comments

Comments
 (0)