| // Copyright 2019 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 { |
| component_events::{events::*, matcher::*}, |
| fidl_fuchsia_sys2 as fsys, fuchsia_async as fasync, |
| fuchsia_component_test::new::{ |
| Capability, ChildOptions, RealmBuilder, RealmInstance, Ref, Route, |
| }, |
| }; |
| |
| /// Starts a nested component manager with a given root component URL using Realm Builer. |
| /// Routes some capabilities like LogSink and EventSource to the root. |
| async fn start_nested_cm(cm_url: &str, root_url: &str) -> RealmInstance { |
| let builder = RealmBuilder::new().await.unwrap(); |
| let root = builder.add_child("root", root_url, ChildOptions::new().eager()).await.unwrap(); |
| builder |
| .add_route( |
| Route::new() |
| .capability(Capability::protocol_by_name("fuchsia.logger.LogSink")) |
| .capability(Capability::protocol_by_name("fuchsia.sys2.EventSource")) |
| .from(Ref::parent()) |
| .to(&root), |
| ) |
| .await |
| .unwrap(); |
| builder.build_in_nested_component_manager(cm_url).await.unwrap() |
| } |
| |
| /// Connects to the EventSource protocol from the nested component manager, starts the component |
| /// topology and waits for a clean stop of the specified component instance |
| async fn wait_for_clean_stop(cm: RealmInstance, moniker_to_wait_on: &str) { |
| let proxy = cm.root.connect_to_protocol_at_exposed_dir::<fsys::EventSourceMarker>().unwrap(); |
| |
| let event_source = EventSource::from_proxy(proxy); |
| |
| let mut event_stream = |
| event_source.subscribe(vec![EventSubscription::new(vec![Stopped::NAME])]).await.unwrap(); |
| |
| cm.start_component_tree().await.unwrap(); |
| |
| // Expect the component to stop |
| EventMatcher::ok() |
| .stop(Some(ExitStatusMatcher::Clean)) |
| .moniker(moniker_to_wait_on) |
| .wait::<Stopped>(&mut event_stream) |
| .await |
| .unwrap(); |
| } |
| |
| #[fasync::run_singlethreaded(test)] |
| async fn storage() { |
| let cm = start_nested_cm("#meta/component_manager.cm", "#meta/storage_realm.cm").await; |
| wait_for_clean_stop(cm, "./root/storage_user").await; |
| } |
| |
| #[fasync::run_singlethreaded(test)] |
| async fn storage_from_collection() { |
| let cm = start_nested_cm("#meta/component_manager.cm", "#meta/storage_realm_coll.cm").await; |
| wait_for_clean_stop(cm, "./root").await; |
| } |
| |
| #[fasync::run_singlethreaded(test)] |
| async fn storage_from_collection_with_invalid_route() { |
| let cm = |
| start_nested_cm("#meta/component_manager.cm", "#meta/storage_realm_coll_invalid_route.cm") |
| .await; |
| wait_for_clean_stop(cm, "./root").await; |
| } |