blob: cd1d37c20de1e861586f2c1528cde96d97b55c3c [file] [log] [blame]
// Copyright 2020 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::{self, Event, EventStream};
use component_events::matcher::{EventMatcher, ExitStatusMatcher};
use component_events::sequence::{self, EventSequence};
use fidl_fuchsia_component as fcomponent;
use fuchsia_component_test::{Capability, ChildOptions, RealmBuilder, Ref, Route};
#[fuchsia::test]
/// Verifies that when a component has a LogSink in its namespace that the
/// component manager tries to connect to this and that if that component
/// tries to use a capability it isn't offered we see the expect log content
/// which is generated by component manager, but should be attributed to the
/// component that tried to use the capability.
///
/// Part of the test runs inside the `reader` component inside the test
/// topology. If `reader` sees the log it expects from the Archivist component
/// it exits cleanly, otherwise it crashes.
async fn verify_routing_failure_messages() {
let builder = RealmBuilder::new().await.unwrap();
let root =
builder.add_child("root", "#meta/e2e-root.cm", ChildOptions::new().eager()).await.unwrap();
builder
.add_route(
Route::new()
.capability(Capability::protocol_by_name("fuchsia.logger.LogSink"))
.capability(Capability::protocol_by_name("fuchsia.process.Launcher"))
.capability(Capability::event_stream("capability_requested").with_scope(&root))
.from(Ref::parent())
.to(&root),
)
.await
.unwrap();
let instance =
builder.build_in_nested_component_manager("#meta/component_manager.cm").await.unwrap();
let proxy: fcomponent::EventStreamProxy =
instance.root.connect_to_protocol_at_exposed_dir().unwrap();
proxy.wait_for_ready().await.unwrap();
let event_stream = EventStream::new(proxy);
let expected = EventSequence::new()
.has_subset(
vec![EventMatcher::ok()
.r#type(events::Stopped::TYPE)
.moniker("root/reader")
.stop(Some(ExitStatusMatcher::Clean))],
sequence::Ordering::Unordered,
)
.expect(event_stream);
instance.start_component_tree().await.unwrap();
expected.await.unwrap();
}