import os import time import threading import unittest from collections import namedtuple import selfdrive.loggerd.deleter as deleter from common.timeout import Timeout, TimeoutException from selfdrive.loggerd.tests.loggerd_tests_common import UploaderTestCase Stats = namedtuple("Stats", ['f_bavail', 'f_blocks', 'f_frsize']) class TestDeleter(UploaderTestCase): def fake_statvfs(self, d): return self.fake_stats def setUp(self): self.f_type = "fcamera.hevc" super(TestDeleter, self).setUp() self.fake_stats = Stats(f_bavail=0, f_blocks=10, f_frsize=4096) deleter.os.statvfs = self.fake_statvfs deleter.ROOT = self.root def start_thread(self): self.end_event = threading.Event() self.del_thread = threading.Thread(target=deleter.deleter_thread, args=[self.end_event]) self.del_thread.daemon = True self.del_thread.start() def join_thread(self): self.end_event.set() self.del_thread.join() def test_delete(self): f_path = self.make_file_with_data(self.seg_dir, self.f_type, 1) self.start_thread() with Timeout(5, "Timeout waiting for file to be deleted"): while os.path.exists(f_path): time.sleep(0.01) self.join_thread() self.assertFalse(os.path.exists(f_path), "File not deleted") def test_delete_files_in_create_order(self): f_path_1 = self.make_file_with_data(self.seg_dir, self.f_type) time.sleep(1) self.seg_num += 1 self.seg_dir = self.seg_format.format(self.seg_num) f_path_2 = self.make_file_with_data(self.seg_dir, self.f_type) self.start_thread() with Timeout(5, "Timeout waiting for file to be deleted"): while os.path.exists(f_path_1) and os.path.exists(f_path_2): time.sleep(0.01) self.join_thread() self.assertFalse(os.path.exists(f_path_1), "Older file not deleted") self.assertTrue(os.path.exists(f_path_2), "Newer file deleted before older file") def test_no_delete_when_available_space(self): f_path = self.make_file_with_data(self.seg_dir, self.f_type) block_size = 4096 available = (10 * 1024 * 1024 * 1024) / block_size # 10GB free self.fake_stats = Stats(f_bavail=available, f_blocks=10, f_frsize=block_size) self.start_thread() try: with Timeout(2, "Timeout waiting for file to be deleted"): while os.path.exists(f_path): time.sleep(0.01) except TimeoutException: pass finally: self.join_thread() self.assertTrue(os.path.exists(f_path), "File deleted with available space") def test_no_delete_with_lock_file(self): f_path = self.make_file_with_data(self.seg_dir, self.f_type, lock=True) self.start_thread() try: with Timeout(2, "Timeout waiting for file to be deleted"): while os.path.exists(f_path): time.sleep(0.01) except TimeoutException: pass finally: self.join_thread() self.assertTrue(os.path.exists(f_path), "File deleted when locked") if __name__ == "__main__": unittest.main()