//! Интеграция `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); }