blob: 71771ac821cf01e27951a36a01a50f0d43963f3c [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,
diagnostics_data::{Data, Logs},
example_tester::{logs_to_str, run_test, Client, Proxy, Server, TestKind},
fuchsia_async as fasync,
fuchsia_component_test::{ChildRef, RealmBuilder},
};
const PROTOCOL_NAME: &'static str = "test.exampletester.Simple";
// Tests the framework for a single component running locally. This is useful for testing things
// like local logging and persistent FIDL.
#[fasync::run_singlethreaded(test)]
async fn test_one_component() -> Result<(), Error> {
let client = Client::new("test_one_component", "#meta/example_tester_example_client.cm");
run_test(
PROTOCOL_NAME,
TestKind::StandaloneComponent { client: &client },
|builder: RealmBuilder, client: ChildRef| async move {
builder.init_mutable_config_to_empty(&client).await?;
builder.set_config_value_bool(&client, "do_in_process", true).await?;
builder.set_config_value_uint8(&client, "augend", 1).await?;
builder.set_config_value_uint8(&client, "addend", 3).await?;
Ok::<(RealmBuilder, ChildRef), Error>((builder, client))
},
|raw_logs: Vec<Data<Logs>>| {
let all_logs = logs_to_str(&raw_logs, None);
assert_eq!(all_logs.filter(|log| *log == "Started").count(), 1);
let client_logs = logs_to_str(&raw_logs, Some(vec![&client]));
assert_eq!(client_logs.last().expect("no response"), format!("Response: {}", 4));
},
)
.await
}
// Tests the standard FIDL IPC scenario, with a client talking to a server.
#[fasync::run_singlethreaded(test)]
async fn test_two_component() -> Result<(), Error> {
let augend = 1;
let addend = 2;
let want_response = 3;
let test_name = "test_two_component";
let client = Client::new(test_name.clone(), "#meta/example_tester_example_client.cm");
let server = Server::new(test_name, "#meta/example_tester_example_server.cm");
run_test(
PROTOCOL_NAME,
TestKind::ClientAndServer { client: &client, server: &server },
|builder: RealmBuilder, client: ChildRef| async move {
builder.init_mutable_config_to_empty(&client).await?;
builder.set_config_value_bool(&client, "do_in_process", false).await?;
builder.set_config_value_uint8(&client, "augend", augend).await?;
builder.set_config_value_uint8(&client, "addend", addend).await?;
Ok::<(RealmBuilder, ChildRef), Error>((builder, client))
},
|raw_logs: Vec<Data<Logs>>| {
let all_logs = logs_to_str(&raw_logs, None);
assert_eq!(all_logs.filter(|log| *log == "Started").count(), 2);
let non_client_logs = logs_to_str(&raw_logs, Some(vec![&server]));
assert_eq!(
non_client_logs
.filter(|log| *log == "Request received" || *log == "Response sent")
.count(),
2
);
let client_logs = logs_to_str(&raw_logs, Some(vec![&client]));
assert_eq!(
client_logs.last().expect("no response"),
format!("Response: {}", want_response)
);
},
)
.await
}
// Tests a client-server IPC interaction mediated by a proxy in the middle.
#[fasync::run_singlethreaded(test)]
async fn test_three_component() -> Result<(), Error> {
let augend = 4;
let addend = 5;
let want_response = 9;
let test_name = "test_three_component";
let client = Client::new(test_name.clone(), "#meta/example_tester_example_client.cm");
let proxy = Proxy::new(test_name.clone(), "#meta/example_tester_example_proxy.cm");
let server = Server::new(test_name, "#meta/example_tester_example_server.cm");
run_test(
PROTOCOL_NAME,
TestKind::ClientProxyAndServer { client: &client, proxy: &proxy, server: &server },
|builder: RealmBuilder, client: ChildRef| async move {
builder.init_mutable_config_to_empty(&client).await?;
builder.set_config_value_bool(&client, "do_in_process", false).await?;
builder.set_config_value_uint8(&client, "augend", augend).await?;
builder.set_config_value_uint8(&client, "addend", addend).await?;
Ok::<(RealmBuilder, ChildRef), Error>((builder, client))
},
|raw_logs: Vec<Data<Logs>>| {
let all_logs = logs_to_str(&raw_logs, None);
assert_eq!(all_logs.filter(|log| *log == "Started").count(), 3);
let non_client_logs = logs_to_str(&raw_logs, Some(vec![&proxy, &server]));
assert_eq!(
non_client_logs
.filter(|log| *log == "Request received" || *log == "Response sent")
.count(),
4
);
let client_logs = logs_to_str(&raw_logs, Some(vec![&client]));
assert_eq!(
client_logs.last().expect("no response"),
format!("Response: {}", want_response)
);
},
)
.await
}