wlan_power_manager_testing/
testing.rs1use anyhow::Error;
6use async_trait::async_trait;
7use fidl_fuchsia_power_system as fsystem;
8use fuchsia_sync::Mutex;
9use std::sync::Arc;
10use wlan_power_manager::{PowerManager, SyncPowerManager, WakeLease};
11
12pub struct TestPowerManager {
13 pub calls: Arc<Mutex<Vec<String>>>,
14 pub active_leases: Arc<Mutex<Vec<(String, fsystem::LeaseToken)>>>,
15 pub mock_power_element_lease_result: Arc<Mutex<Result<(), String>>>,
16}
17
18impl TestPowerManager {
19 pub fn new() -> Self {
20 Self {
21 calls: Arc::new(Mutex::new(vec![])),
22 active_leases: Arc::new(Mutex::new(vec![])),
23 mock_power_element_lease_result: Arc::new(Mutex::new(Ok(()))),
24 }
25 }
26
27 pub fn mock_power_element_lease_failure(&self) {
28 *self.mock_power_element_lease_result.lock() =
29 Err("mocked power element lease failure".to_string());
30 }
31
32 pub fn is_lease_dropped(&self, name: &str) -> bool {
33 let leases = self.active_leases.lock();
34 if let Some((_, token)) = leases.iter().rev().find(|(n, _)| n == name) {
35 #[allow(clippy::match_like_matches_macro)]
36 match token
37 .wait_one(zx::Signals::EVENTPAIR_PEER_CLOSED, zx::MonotonicInstant::INFINITE_PAST)
38 {
39 zx::WaitResult::TimedOut(_) => false,
40 _ => true,
41 }
42 } else {
43 true
44 }
45 }
46}
47
48#[async_trait]
49impl PowerManager for TestPowerManager {
50 async fn take_wake_lease(&self, name: &str) -> Option<WakeLease> {
51 self.calls.lock().push(name.to_string());
52 let (local_token, token) = fsystem::LeaseToken::create();
53 self.active_leases.lock().push((name.to_string(), local_token));
54 Some(WakeLease::from_token_for_test(token))
55 }
56
57 async fn power_element_lease(
58 &self,
59 lease_name: &str,
60 _dependency_token: fidl_fuchsia_power_broker::DependencyToken,
61 _dependency_level: u8,
62 ) -> Result<fidl_fuchsia_power_broker::LeaseToken, Error> {
63 self.calls.lock().push(lease_name.to_string());
64 if let Err(e) = self.mock_power_element_lease_result.lock().as_ref() {
65 anyhow::bail!("{e}");
66 }
67 let (local_token, remote_token) = zx::EventPair::create();
68 self.active_leases.lock().push((lease_name.to_string(), remote_token));
69 Ok(local_token)
70 }
71
72 async fn register_suspend_blocker(
73 &self,
74 _suspend_blocker: fidl::endpoints::ClientEnd<fsystem::SuspendBlockerMarker>,
75 name: &str,
76 ) -> Result<WakeLease, Error> {
77 self.calls.lock().push(name.to_string());
78 let (local_token, token) = fsystem::LeaseToken::create();
79 self.active_leases.lock().push((name.to_string(), local_token));
80 Ok(WakeLease::from_token_for_test(token))
81 }
82}
83
84#[derive(Debug)]
85pub struct FakeSyncPowerManager {
86 pub calls: Arc<Mutex<Vec<String>>>,
87 pub active_leases: Arc<Mutex<Vec<(String, fsystem::LeaseToken)>>>,
88}
89
90impl FakeSyncPowerManager {
91 pub fn new() -> Self {
92 Self { calls: Arc::new(Mutex::new(vec![])), active_leases: Arc::new(Mutex::new(vec![])) }
93 }
94
95 pub fn is_lease_dropped(&self, name: &str) -> bool {
96 let leases = self.active_leases.lock();
97 if let Some((_, token)) = leases.iter().rev().find(|(n, _)| n == name) {
98 #[allow(clippy::match_like_matches_macro)]
99 match token
100 .wait_one(zx::Signals::EVENTPAIR_PEER_CLOSED, zx::MonotonicInstant::INFINITE_PAST)
101 {
102 zx::WaitResult::TimedOut(_) => false,
103 _ => true,
104 }
105 } else {
106 true
107 }
108 }
109}
110
111impl SyncPowerManager for FakeSyncPowerManager {
112 fn take_wake_lease(&self, name: &str) -> Option<WakeLease> {
113 self.calls.lock().push(name.to_string());
114 let (local_token, token) = fsystem::LeaseToken::create();
115 self.active_leases.lock().push((name.to_string(), local_token));
116 Some(WakeLease::from_token(token))
117 }
118}