component_debug/cli/
resolve.rs
1use 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}