fidl_fuchsia_update_ext/
commit.rs1use anyhow::anyhow;
6use fidl_fuchsia_update::CommitStatusProviderProxy;
7
8#[derive(Copy, Clone, Debug, PartialEq)]
10pub enum CommitStatus {
11 Pending,
13 Committed,
15}
16
17pub async fn query_commit_status(
19 provider: &CommitStatusProviderProxy,
20) -> Result<CommitStatus, anyhow::Error> {
21 let event_pair = provider.is_current_system_committed().await?;
22 match event_pair.wait_one(zx::Signals::USER_0, zx::MonotonicInstant::INFINITE_PAST).to_result()
23 {
24 Ok(_) => Ok(CommitStatus::Committed),
25 Err(zx::Status::TIMED_OUT) => Ok(CommitStatus::Pending),
26 Err(status) => Err(anyhow!("unexpected status while asserting signal: {:?}", status)),
27 }
28}
29
30#[cfg(test)]
31mod tests {
32 use super::*;
33 use fidl::endpoints::create_proxy_and_stream;
34 use fidl_fuchsia_update::{CommitStatusProviderMarker, CommitStatusProviderRequest};
35 use fuchsia_async::{self as fasync};
36 use futures::StreamExt;
37 use zx::{HandleBased, Peered};
38
39 #[fasync::run_singlethreaded(test)]
41 async fn test_query_commit_status() {
42 let (proxy, mut stream) = create_proxy_and_stream::<CommitStatusProviderMarker>();
43 let (p0, p1) = zx::EventPair::create();
44
45 let _fidl_server = fasync::Task::local(async move {
46 while let Some(Ok(req)) = stream.next().await {
47 let CommitStatusProviderRequest::IsCurrentSystemCommitted { responder } = req;
48 let () = responder.send(p1.duplicate_handle(zx::Rights::BASIC).unwrap()).unwrap();
49 }
50 });
51
52 assert_eq!(query_commit_status(&proxy).await.unwrap(), CommitStatus::Pending);
54
55 let () = p0.signal_peer(zx::Signals::NONE, zx::Signals::USER_0).unwrap();
57 assert_eq!(query_commit_status(&proxy).await.unwrap(), CommitStatus::Committed,);
58 }
59}