| // Copyright 2021 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, |
| component_events::{ |
| events::{Event, EventSource, EventSubscription, Stopped}, |
| matcher::EventMatcher, |
| }, |
| fidl_fuchsia_boot as fboot, fidl_fuchsia_fshost as fshost, fidl_fuchsia_io as fio, |
| fidl_fuchsia_logger as flogger, |
| fuchsia_component_test::new::{ |
| Capability, ChildOptions, RealmBuilder, RealmInstance, Ref, Route, |
| }, |
| futures::FutureExt, |
| }; |
| |
| mod mocks; |
| |
| #[cfg(feature = "fshost_cpp")] |
| const FSHOST_URL: &'static str = "#meta/test-fshost.cm"; |
| #[cfg(feature = "fshost_rust")] |
| const FSHOST_URL: &'static str = "#meta/test-fshost-rust.cm"; |
| |
| async fn new_realm() -> Result<RealmInstance, Error> { |
| let mocks = mocks::new_mocks().await; |
| let builder = RealmBuilder::new().await?; |
| println!("using {} as fshost", FSHOST_URL); |
| let fshost = builder.add_child("fshost", FSHOST_URL, ChildOptions::new().eager()).await?; |
| builder |
| .add_route( |
| Route::new() |
| .capability(Capability::protocol::<fshost::AdminMarker>()) |
| .from(&fshost) |
| .to(Ref::parent()), |
| ) |
| .await?; |
| builder |
| .add_route( |
| Route::new() |
| .capability(Capability::protocol::<flogger::LogSinkMarker>()) |
| .from(Ref::parent()) |
| .to(&fshost), |
| ) |
| .await?; |
| let mocks = |
| builder.add_local_child("mocks", move |h| mocks(h).boxed(), ChildOptions::new()).await?; |
| builder |
| .add_route( |
| Route::new() |
| .capability(Capability::protocol::<fboot::ArgumentsMarker>()) |
| .capability(Capability::protocol::<fboot::ItemsMarker>()) |
| .capability(Capability::directory("dev").path("/dev").rights(fio::RW_STAR_DIR)) |
| .from(&mocks) |
| .to(&fshost), |
| ) |
| .await?; |
| Ok(builder.build().await?) |
| } |
| |
| #[fuchsia::test] |
| async fn admin_shutdown_shuts_down_fshost() { |
| let realm = new_realm().await.unwrap(); |
| |
| let event_source = EventSource::new().unwrap(); |
| let mut event_stream = |
| event_source.subscribe(vec![EventSubscription::new(vec![Stopped::NAME])]).await.unwrap(); |
| |
| let admin = realm.root.connect_to_protocol_at_exposed_dir::<fshost::AdminMarker>().unwrap(); |
| admin.shutdown().await.unwrap(); |
| |
| EventMatcher::ok() |
| .moniker_regex("realm_builder:.*/fshost$") |
| .wait::<Stopped>(&mut event_stream) |
| .await |
| .unwrap(); |
| |
| realm.destroy().await.unwrap(); |
| } |