Skip to main content

fake_powerdomain/
lib.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 fidl_fuchsia_driver_framework as fdf;
6use fidl_next::Responder;
7use fidl_next_fuchsia_hardware_powerdomain::{self as fpowerdomain, DomainServerHandler};
8use fuchsia_async as fasync;
9use fuchsia_component::server::{ServiceFs, ServiceObjTrait};
10use fuchsia_sync::Mutex;
11use std::sync::Arc;
12
13struct FakePowerDomainState {
14    enabled: bool,
15}
16
17pub struct FakePowerDomain {
18    state: Arc<Mutex<FakePowerDomainState>>,
19}
20
21impl FakePowerDomain {
22    pub fn new() -> Self {
23        Self { state: Arc::new(Mutex::new(FakePowerDomainState { enabled: false })) }
24    }
25
26    pub fn enabled(&self) -> bool {
27        self.state.lock().enabled
28    }
29
30    pub fn serve<O: ServiceObjTrait>(
31        &self,
32        service_fs: &mut ServiceFs<O>,
33        scope: fasync::ScopeHandle,
34        instance_name: &str,
35    ) -> fdf::Offer {
36        fdf_component::ServiceOffer::<fpowerdomain::Service>::new_next()
37            .add_default_named_next(
38                service_fs,
39                instance_name,
40                FakePowerDomainService { state: self.state.clone(), scope },
41            )
42            .build_zircon_offer_next()
43    }
44}
45
46struct FakePowerDomainService {
47    state: Arc<Mutex<FakePowerDomainState>>,
48    scope: fasync::ScopeHandle,
49}
50
51impl fpowerdomain::ServiceHandler for FakePowerDomainService {
52    fn domain(&self, server_end: fidl_next::ServerEnd<fpowerdomain::Domain>) {
53        server_end.spawn_on(FakePowerDomainServer { state: self.state.clone() }, &self.scope);
54    }
55}
56
57struct FakePowerDomainServer {
58    state: Arc<Mutex<FakePowerDomainState>>,
59}
60
61impl DomainServerHandler for FakePowerDomainServer {
62    async fn enable(&mut self, responder: Responder<fpowerdomain::domain::Enable>) {
63        self.state.lock().enabled = true;
64        let _ = responder.respond(()).await;
65    }
66
67    async fn disable(&mut self, responder: Responder<fpowerdomain::domain::Disable>) {
68        self.state.lock().enabled = false;
69        let _ = responder.respond(()).await;
70    }
71
72    async fn is_enabled(&mut self, responder: Responder<fpowerdomain::domain::IsEnabled>) {
73        let enabled = self.state.lock().enabled;
74        let _ = responder.respond(enabled).await;
75    }
76}