component_debug/cli/
start.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_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}