component_debug/cli/
start.rs
1use crate::cli::format::format_start_error;
6use crate::lifecycle::start_instance;
7use crate::query::get_cml_moniker_from_query;
8use anyhow::Result;
9use fidl_fuchsia_sys2 as fsys;
10
11pub async fn start_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, "Starting component instance...")?;
21
22 let _ = start_instance(&lifecycle_controller, &moniker)
23 .await
24 .map_err(|e| format_start_error(&moniker, e))?;
25
26 writeln!(writer, "Started 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::StartInstanceWithArgs {
47 moniker,
48 binder: _,
49 args: _,
50 responder,
51 } => {
52 assert_eq!(Moniker::parse_str(expected_moniker), Moniker::parse_str(&moniker));
53 responder.send(Ok(())).unwrap();
54 }
55 fsys::LifecycleControllerRequest::StartInstance {
56 moniker,
57 binder: _,
58 responder,
59 } => {
60 assert_eq!(Moniker::parse_str(expected_moniker), Moniker::parse_str(&moniker));
61 responder.send(Ok(())).unwrap();
62 }
63 _ => panic!("Unexpected Lifecycle Controller request"),
64 }
65 })
66 .detach();
67 lifecycle_controller
68 }
69
70 #[fuchsia_async::run_singlethreaded(test)]
71 async fn test_success() -> Result<()> {
72 let mut output = Vec::new();
73 let lifecycle_controller = setup_fake_lifecycle_controller("/core/ffx-laboratory:test");
74 let realm_query = serve_realm_query_instances(vec![fsys::Instance {
75 moniker: Some("/core/ffx-laboratory:test".to_string()),
76 url: Some("fuchsia-pkg://fuchsia.com/test#meta/test.cml".to_string()),
77 instance_id: None,
78 resolved_info: None,
79 ..Default::default()
80 }]);
81 start_cmd(
82 "/core/ffx-laboratory:test".to_string(),
83 lifecycle_controller,
84 realm_query,
85 &mut output,
86 )
87 .await
88 .unwrap();
89 Ok(())
90 }
91}