fix(runtime): recover awake ownership and batch model failures

This commit is contained in:
chenmingxuan committed 2026-10-28 11:50:05 +08:00
1 parent 6b2c0f199d
commit baf069854b
17 files changed
+477 -32

No files matched your search

+60
View File
@@ -24,6 +24,66 @@ def completed(stdout="", returncode=0, stderr=""):
return MagicMock(returncode=returncode, stdout=stdout, stderr=stderr)
@pytest.mark.parametrize("stage", ["directory", "acquire"])
def test_inaccessible_awake_lock_skips_actions_and_can_recover(stage, monkeypatch, tmp_path):
owner = FileLock(tmp_path / "recovered.lock", thread_local=False)
denied_owner = MagicMock()
denied_owner.acquire.side_effect = PermissionError("awake lock access denied")
factory = MagicMock(
side_effect=[
PermissionError("awake directory denied") if stage == "directory" else denied_owner,
owner,
]
)
configure = MagicMock(return_value=AWAKE_STRATEGY_USB)
monkeypatch.setattr("artemis.runtime.awake_service._owner_lock", factory)
monkeypatch.setattr("artemis.runtime.awake_service._configure_usb_stay_awake", configure)
service = ScreenAwakeService()
try:
assert service.ensure_device("device") is None
configure.assert_not_called()
assert service.device_ids == ()
assert service.ensure_device("device") == AWAKE_STRATEGY_USB
configure.assert_called_once_with("device")
finally:
service.shutdown()
def test_awake_monitor_continues_to_other_devices_after_access_denied(monkeypatch, tmp_path):
def owner(device):
if device == "denied":
raise PermissionError("denied")
return FileLock(tmp_path / f"{device}.lock", thread_local=False)
monkeypatch.setattr("artemis.runtime.awake_service._owner_lock", owner)
configure = MagicMock(return_value=AWAKE_STRATEGY_USB)
monkeypatch.setattr("artemis.runtime.awake_service._configure_usb_stay_awake", configure)
service = ScreenAwakeService()
try:
service._reconcile_connected_devices({"denied", "healthy"})
service._reconcile_connected_devices({"denied", "healthy"})
assert service.device_ids == ("healthy",)
configure.assert_called_once_with("healthy")
finally:
service.shutdown()
@patch(
"artemis.runtime.awake_service.ScreenAwakeLease",
side_effect=PermissionError("legacy directory denied"),
)
@patch("artemis.runtime.awake_service.subprocess.run")
def test_optional_legacy_directory_failure_does_not_abort_usb_policy(mock_run, _lease):
mock_run.side_effect = [
completed(),
completed(),
completed(),
completed("2"),
completed("mStayOn=true"),
]
assert _configure_usb_stay_awake("device") == AWAKE_STRATEGY_USB
@patch(
"artemis.runtime.awake_service._configure_usb_stay_awake", return_value=AWAKE_STRATEGY_HEARTBEAT
)