component_debug/cli/
resolve.rs

1// Copyright 2023 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 crate::cli::format::format_resolve_error;
6use crate::lifecycle::resolve_instance;
7use crate::query::get_cml_moniker_from_query;
8use anyhow::Result;
9use fidl_fuchsia_sys2 as fsys;
10
11pub async fn resolve_cmd<W: std::io::Write>(
12    query: String,
13    lifecycle_controller: fsys::LifecycleControllerProxy,
14    realm_query: fsys::RealmQueryProxy,
15    mut writer: W,
16) -> Result<()> {
17    let moniker = get_cml_moniker_from_query(&query, &realm_query).await?;
18
19    writeln!(writer, "Moniker: {}", moniker)?;
20    writeln!(writer, "Resolving component instance...")?;
21
22    resolve_instance(&lifecycle_controller, &moniker)
23        .await
24        .map_err(|e| format_resolve_error(&moniker, e))?;
25
26    writeln!(writer, "Resolved component instance!")?;
27    Ok(())
28}
29
30#[cfg(test)]
31mod test {
32    use super::*;
33    use crate::test_utils::serve_realm_query_instances;
34    use fidl::endpoints::create_proxy_and_stream;
35    use futures::TryStreamExt;
36    use moniker::Moniker;
37
38    fn setup_fake_lifecycle_controller(
39        expected_moniker: &'static str,
40    ) -> fsys::LifecycleControllerProxy {
41        let (lifecycle_controller, mut stream) =
42            create_proxy_and_stream::<fsys::LifecycleControllerMarker>();
43        fuchsia_async::Task::local(async move {
44            let req = stream.try_next().await.unwrap().unwrap();
45            match req {
46                fsys::LifecycleControllerRequest::ResolveInstance { moniker, responder } => {
47                    assert_eq!(Moniker::parse_str(expected_moniker), Moniker::parse_str(&moniker));
48                    responder.send(Ok(())).unwrap();
49                }
50                _ => panic!("Unexpected Lifecycle Controller request"),
51            }
52        })
53        .detach();
54        lifecycle_controller
55    }
56
57    #[fuchsia_async::run_singlethreaded(test)]
58    async fn test_success() -> Result<()> {
59        let mut output = Vec::new();
60        let lifecycle_controller = setup_fake_lifecycle_controller("/core/ffx-laboratory:test");
61        let realm_query = serve_realm_query_instances(vec![fsys::Instance {
62            moniker: Some("/core/ffx-laboratory:test".to_string()),
63            url: Some("fuchsia-pkg://fuchsia.com/test#meta/test.cml".to_string()),
64            instance_id: None,
65            resolved_info: None,
66            ..Default::default()
67        }]);
68        let response = resolve_cmd(
69            "/core/ffx-laboratory:test".to_string(),
70            lifecycle_controller,
71            realm_query,
72            &mut output,
73        )
74        .await;
75        response.unwrap();
76        Ok(())
77    }
78}