Skip to main content

wlan_power_manager_testing/
testing.rs

1// Copyright 2026 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use 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}