Files
shturman/crates/core/shturman-power/tests/integration.rs
T
kk0t9 aaae0508b9 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>
2026-06-24 23:17:13 +03:00

96 lines
3.3 KiB
Rust

//! Интеграция `Power1` + dev-mock на session-шине. `#[ignore]` — запуск: `just test-integration`.
//! Проверяет state по шине и fake-ACC: `dev.PowerMock1.SetAcc` → сигнал `Power1.AccChanged`.
use futures_util::StreamExt;
use shturman_ipc::{names, types::PowerState};
use shturman_power::PowerService;
use shturman_sdk::PowerClient;
#[tokio::test]
#[ignore = "нужна session-шина: just test-integration"]
async fn power_state_and_fake_acc() {
let svc = PowerService::new();
let mock = svc.mock();
// сервер: Power1 + dev.PowerMock1 на одном пути (владеет ru.shturman.Power)
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_conn = zbus::Connection::session().await.unwrap();
let power = PowerClient::new(&client_conn).await.unwrap();
assert_eq!(power.power_state().await.unwrap(), PowerState::Running);
// подписка на AccChanged
let mut acc = power.proxy().receive_acc_changed().await.unwrap();
// dev.PowerMock1.SetAcc(false) сырым D-Bus-вызовом
client_conn
.call_method(
Some(names::power::NAME),
names::power::PATH,
Some(names::power::MOCK_IFACE),
"SetAcc",
&(false,),
)
.await
.unwrap();
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);
}