feat(v0.3): Power-сервис на FSM — dev-mock кормит события, grace+durable-barrier
P7.2: service.rs оборачивает PowerFsm — D-Bus state/signals из FSM; apply_event исполняет действия (эмит сигналов, фоновый grace-таймер, durable-barrier sync). dev-mock SetAcc/SetIgnition/TriggerShutdown/AbortShutdown кормят входы FSM. FSM: AccOff → AccChanged(false)+ShutdownImminent (сохранён walking-skeleton-регресс). Integration: ShutdownImminent + abort. zbus → tokio-executor (default-features=false, features=["tokio"]) — иначе tokio::spawn в хендлере паникует (async-io). test-integration --test-threads=1 (тесты владеют одним именем на шине). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Signed-off-by: Alexander <akotenev2003@gmail.com>
This commit is contained in:
@@ -48,3 +48,48 @@ async fn power_state_and_fake_acc() {
|
||||
let sig = acc.next().await.unwrap();
|
||||
assert!(!sig.args().unwrap().on());
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[ignore = "нужна session-шина: just test-integration"]
|
||||
async fn shutdown_imminent_then_abort() {
|
||||
let svc = PowerService::new();
|
||||
let mock = svc.mock();
|
||||
let server = zbus::Connection::session().await.unwrap();
|
||||
server.object_server().at(names::power::PATH, svc).await.unwrap();
|
||||
server.object_server().at(names::power::PATH, mock).await.unwrap();
|
||||
server.request_name(names::power::NAME).await.unwrap();
|
||||
|
||||
let client = zbus::Connection::session().await.unwrap();
|
||||
let power = PowerClient::new(&client).await.unwrap();
|
||||
let mut imminent = power.proxy().receive_shutdown_imminent().await.unwrap();
|
||||
let mut aborted = power.proxy().receive_shutdown_aborted().await.unwrap();
|
||||
|
||||
// ACC-off → ShutdownImminent(acc_off), состояние shutting_down
|
||||
client
|
||||
.call_method(
|
||||
Some(names::power::NAME),
|
||||
names::power::PATH,
|
||||
Some(names::power::MOCK_IFACE),
|
||||
"SetAcc",
|
||||
&(false,),
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
let sig = imminent.next().await.unwrap();
|
||||
assert_eq!(sig.args().unwrap().reason(), "acc_off");
|
||||
assert_eq!(power.power_state().await.unwrap(), PowerState::ShuttingDown);
|
||||
|
||||
// re-power до grace → ShutdownAborted + running
|
||||
client
|
||||
.call_method(
|
||||
Some(names::power::NAME),
|
||||
names::power::PATH,
|
||||
Some(names::power::MOCK_IFACE),
|
||||
"SetAcc",
|
||||
&(true,),
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
aborted.next().await.unwrap();
|
||||
assert_eq!(power.power_state().await.unwrap(), PowerState::Running);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user