| import importlib.util | |
| import pathlib | |
| import threading | |
| import time | |
| import unittest | |
| ROOT = pathlib.Path(__file__).resolve().parents[1] | |
| MODULE_PATH = ROOT / "app" / "services" / "task_serial_executor.py" | |
| spec = importlib.util.spec_from_file_location("task_serial_executor", MODULE_PATH) | |
| if spec is None or spec.loader is None: | |
| raise ImportError("task_serial_executor module spec not found") | |
| task_serial_executor = importlib.util.module_from_spec(spec) | |
| spec.loader.exec_module(task_serial_executor) | |
| SerialTaskExecutor = task_serial_executor.SerialTaskExecutor | |
| class TestTaskSerialExecutor(unittest.TestCase): | |
| def test_executor_runs_tasks_one_by_one(self): | |
| executor = SerialTaskExecutor() | |
| state_lock = threading.Lock() | |
| state = {"active": 0, "peak_active": 0} | |
| def critical_work(): | |
| with state_lock: | |
| state["active"] += 1 | |
| state["peak_active"] = max(state["peak_active"], state["active"]) | |
| time.sleep(0.05) | |
| with state_lock: | |
| state["active"] -= 1 | |
| threads = [threading.Thread(target=lambda: executor.run(critical_work)) for _ in range(2)] | |
| for t in threads: | |
| t.start() | |
| for t in threads: | |
| t.join() | |
| self.assertEqual(state["peak_active"], 1) | |
| if __name__ == "__main__": | |
| unittest.main() | |