import importlib.util import subprocess import pytest from pathlib import Path def _load_factory_reset_module(): spec = importlib.util.spec_from_file_location("factory_reset_under_test", Path(__file__).resolve().parents[1] / "factory_reset.py") module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module factory_reset = _load_factory_reset_module() def test_remove_path_retries_directory_not_empty(monkeypatch): results = iter( [ subprocess.CompletedProcess([], 1, stderr="rm: cannot remove '/data/params': Directory not empty"), subprocess.CompletedProcess([], 0), ] ) calls = [] sleeps = [] def fake_run(*args, **kwargs): calls.append((args, kwargs)) return next(results) monkeypatch.setattr(factory_reset.subprocess, "run", fake_run) monkeypatch.setattr(factory_reset.time, "sleep", sleeps.append) factory_reset.remove_path("/data/params") assert len(calls) == 2 assert calls[0][0][0] == ["sudo", "rm", "-rf", "--", "/data/params"] assert sleeps == [factory_reset._DELETE_RETRY_DELAY_S] def test_remove_path_does_not_retry_non_transient_error(monkeypatch): calls = [] def fake_run(*args, **kwargs): calls.append((args, kwargs)) return subprocess.CompletedProcess([], 1, stderr="rm: cannot remove '/data/params': Permission denied") monkeypatch.setattr(factory_reset.subprocess, "run", fake_run) with pytest.raises(RuntimeError, match="Permission denied"): factory_reset.remove_path("/data/params") assert len(calls) == 1