remotevol_fuchsia_test_util/
fuchsia.rs

1// Copyright 2025 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 diagnostics_reader::ArchiveReader;
6use fidl::endpoints::create_proxy;
7use fuchsia_async::DurationExt;
8use fuchsia_component_test::RealmInstance;
9use log::info;
10use {fidl_fuchsia_io as fio, fuchsia_async as fasync};
11
12pub const PROGRAM_COLLECTION: &str = "debian_programs";
13
14pub async fn open_sysrq_trigger(realm: &RealmInstance) -> fio::FileProxy {
15    info!("opening sysrq trigger");
16    fuchsia_fs::directory::open_file(
17        realm.root.get_exposed_dir(),
18        "/fs_root/proc/sysrq-trigger",
19        fuchsia_fs::PERM_WRITABLE,
20    )
21    .await
22    .unwrap()
23}
24
25pub async fn wait_for_starnix_volume_to_be_mounted() {
26    loop {
27        fasync::Timer::new(fasync::MonotonicDuration::from_millis(100).after_now()).await;
28        let test_fxfs_inspect = ArchiveReader::inspect()
29            .select_all_for_component("test-fxfs")
30            .snapshot()
31            .await
32            .unwrap();
33        if test_fxfs_inspect.len() == 0 {
34            continue;
35        }
36        let payload = test_fxfs_inspect[0].payload.as_ref().unwrap();
37        if let Some(child) = payload.get_child("starnix_volume") {
38            if child.get_property("mounted").and_then(|p| p.boolean()) == Some(true) {
39                break;
40            }
41        } else {
42            continue;
43        }
44    }
45}
46
47pub async fn get_storage_for_component_instance(
48    moniker_prefix: &str,
49    storage_admin: fidl_fuchsia_sys2::StorageAdminProxy,
50) -> fio::DirectoryProxy {
51    let (storage_user_iterator, storage_user_iterator_server_end) =
52        create_proxy::<fidl_fuchsia_sys2::StorageIteratorMarker>();
53    storage_admin
54        .list_storage_in_realm(".", storage_user_iterator_server_end)
55        .await
56        .unwrap()
57        .unwrap();
58    let mut matching_storage_users = vec![];
59    loop {
60        let chunk = storage_user_iterator.next().await.unwrap();
61        if chunk.is_empty() {
62            break;
63        }
64        let mut matches: Vec<String> = chunk
65            .into_iter()
66            .filter(|moniker| {
67                info!("moniker is {moniker}");
68                moniker.starts_with(moniker_prefix)
69            })
70            .collect();
71        matching_storage_users.append(&mut matches);
72    }
73    assert!(!matching_storage_users.is_empty());
74    let (proxy, server_end) = create_proxy::<fio::DirectoryMarker>();
75    storage_admin
76        .open_storage(matching_storage_users.first().unwrap(), server_end.into_channel().into())
77        .await
78        .unwrap()
79        .unwrap();
80    proxy
81}