blob: d1bcdd6a05c79fcff1c21ebd2067345a0edd7608 [file] [log] [blame]
// 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 {
anyhow::Error,
echo_factory_interposer::EchoFactoryInterposer,
echo_interposer::EchoInterposer,
fuchsia_async as fasync,
futures::StreamExt,
test_utils_lib::{echo_capability::EchoCapability, events::*, test_utils::*},
};
#[fasync::run_singlethreaded(test)]
async fn echo_interposer_test() -> Result<(), Error> {
let test = BlackBoxTest::default(
"fuchsia-pkg://fuchsia.com/events_integration_test#meta/interpose_echo_realm.cm",
)
.await?;
let event_source = test.connect_to_event_source().await?;
// Setup the interposer
let (echo_interposer, mut rx) = EchoInterposer::new();
let interposer = event_source.install_interposer(echo_interposer).await?;
event_source.start_component_tree().await?;
// Ensure that the string "Interposed: Hippos rule!" is sent 10 times as a response
// from server to client.
for _ in 1..=10 {
let echo_string = rx.next().await.expect("local tx/rx channel was closed");
assert_eq!(echo_string, "Interposed: Hippos rule!");
}
interposer.abort();
Ok(())
}
#[fasync::run_singlethreaded(test)]
async fn scoped_events_test() -> Result<(), Error> {
let test = BlackBoxTest::default(
"fuchsia-pkg://fuchsia.com/events_integration_test#meta/echo_realm.cm",
)
.await?;
let event_source = test.connect_to_event_source().await?;
// Inject an echo capability for `echo_reporter` so that we can observe its messages here.
let mut echo_rx = {
let mut event_stream = event_source.subscribe(vec![CapabilityRouted::TYPE]).await?;
event_source.start_component_tree().await?;
// Wait for `echo_reporter` to attempt to connect to the Echo service
let event = event_stream
.wait_until_framework_capability(
"./echo_reporter:0",
"/svc/fidl.examples.routing.echo.Echo",
Some("./echo_reporter:0"),
)
.await?;
// Setup the echo capability.
let (capability, echo_rx) = EchoCapability::new();
event.inject(capability).await?;
event.resume().await?;
echo_rx
};
// Wait to receive the start trigger that echo_reporter recieved. This
// indicates to `echo_reporter` that it should start collecting `CapabilityRouted`
// events.
let start_trigger_echo = echo_rx.next().await.unwrap();
assert_eq!(start_trigger_echo.message, "Start trigger");
start_trigger_echo.resume();
// This indicates that `echo_reporter` will stop receiving `CapabilityRouted`
// events.
let stop_trigger_echo = echo_rx.next().await.unwrap();
assert_eq!(stop_trigger_echo.message, "Stop trigger");
stop_trigger_echo.resume();
// Verify that the `echo_reporter` sees `Started` and
// a `CapabilityRouted` event to itself (routing the ELF runner
// capability at startup), but not other `CapabilityRouted` events
// because the target of other `CapabilityRouted` events are outside
// its realm.
let events_echo = echo_rx.next().await.unwrap();
assert_eq!(
events_echo.message,
concat!(
"Events: [",
"RecordedEvent { event_type: CapabilityRouted, target_moniker: \"./echo_server:0\", capability_id: Some(\"elf\") }, ",
"RecordedEvent { event_type: Started, target_moniker: \"./echo_server:0\", capability_id: None }",
"]"
)
);
events_echo.resume();
Ok(())
}
#[fasync::run_singlethreaded(test)]
async fn nested_breakpoint_test() -> Result<(), Error> {
let test = BlackBoxTest::default(
"fuchsia-pkg://fuchsia.com/events_integration_test#meta/nested_reporter.cm",
)
.await?;
let event_source = test.connect_to_event_source().await?;
let (capability, mut echo_rx) = EchoCapability::new();
let injector = event_source.install_injector(capability).await?;
event_source.start_component_tree().await?;
let mut children = vec![];
for _ in 1..=3 {
let child = echo_rx.next().await.unwrap();
println!("child: {}", child.message);
children.push(child.message.clone());
child.resume();
}
children.sort_unstable();
assert_eq!(vec!["./child_a:0", "./child_b:0", "./child_c:0"], children);
injector.abort();
Ok(())
}
#[fasync::run_singlethreaded(test)]
async fn chained_interpose_breakpoint_test() -> Result<(), Error> {
let test = BlackBoxTest::default(
"fuchsia-pkg://fuchsia.com/events_integration_test#meta/chained_interpose_echo_realm.cm",
)
.await?;
let event_source = test.connect_to_event_source().await?;
let (capability, mut echo_rx) = EchoFactoryInterposer::new();
let injector = event_source.install_interposer(capability).await?;
event_source.start_component_tree().await?;
let mut messages = vec![];
for _ in 1..=3 {
let message = echo_rx.next().await.unwrap();
messages.push(message.clone());
}
messages.sort_unstable();
assert_eq!(vec!["Interposed: a", "Interposed: b", "Interposed: c"], messages);
injector.abort();
Ok(())
}