blob: 63e6529b817eb5913fdb7ce489f4708b3a4434c5 [file] [log] [blame]
// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
use anyhow::{Error, Result, anyhow};
use fuchsia_component::server::ServiceFs;
use fuchsia_component_test::new::{ChildOptions, LocalComponentHandles, RealmBuilder};
use fuchsia_driver_test::{DriverTestRealmBuilder2, DriverTestRealmInstance2, Options2};
use futures::channel::mpsc;
use futures::{StreamExt, TryStreamExt};
use {fidl_fuchsia_driver_test as fdt, fidl_fuchsia_runtime_test as ft, fuchsia_async as fasync};
const WAITER_NAME: &'static str = "waiter";
async fn waiter_serve(mut stream: ft::WaiterRequestStream, mut sender: mpsc::Sender<()>) {
while let Some(ft::WaiterRequest::Ack { .. }) = stream.try_next().await.expect("Stream failed")
{
sender.try_send(()).expect("Sender failed")
}
}
async fn waiter_component(
handles: LocalComponentHandles,
sender: mpsc::Sender<()>,
) -> Result<(), Error> {
let mut fs = ServiceFs::new();
fs.dir("svc").add_fidl_service(move |stream: ft::WaiterRequestStream| {
fasync::Task::spawn(waiter_serve(stream, sender.clone())).detach()
});
fs.serve_connection(handles.outgoing_dir)?;
Ok(fs.collect::<()>().await)
}
#[fasync::run_singlethreaded(test)]
async fn test_driver_runtime() -> Result<()> {
let (sender, mut receiver) = mpsc::channel(1);
// Create the RealmBuilder.
let builder = RealmBuilder::new().await?;
let waiter = builder
.add_local_child(
WAITER_NAME,
move |handles: LocalComponentHandles| {
Box::pin(waiter_component(handles, sender.clone()))
},
ChildOptions::new(),
)
.await?;
let offer = fuchsia_component_test::Capability::protocol::<ft::WaiterMarker>().into();
let offers = vec![offer];
let args =
fdt::RealmArgs { root_driver: Some("#meta/root.cm".to_string()), ..Default::default() };
builder
.driver_test_realm_setup(Options2::new().driver_offers((&waiter).into(), offers), args)
.await?;
// Build the Realm.
let instance = builder.build().await?;
instance.wait_for_bootup().await?;
// Wait for the driver to call Waiter.Done.
receiver.next().await.ok_or_else(|| anyhow!("Receiver failed"))?;
instance.destroy().await?;
Ok(())
}