blob: a5a03870248d4b2e6b6c32d66e623f5c5a313667 [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::{anyhow, format_err, Context, Error},
ffx_core::ffx_plugin,
ffx_test_args::TestCommand,
fidl::endpoints::create_proxy,
fidl_fuchsia_test::CaseIteratorMarker,
fidl_fuchsia_test_manager as ftest_manager,
std::io::{stdout, Write},
};
#[ffx_plugin(ftest_manager::HarnessProxy = "core/appmgr:out:fuchsia.test.manager.Harness")]
pub async fn test(
harness_proxy: ftest_manager::HarnessProxy,
cmd: TestCommand,
) -> Result<(), Error> {
let writer = Box::new(stdout());
let count = cmd.count.unwrap_or(1);
let count = std::num::NonZeroU16::new(count)
.ok_or_else(|| anyhow!("--count should be greater than zero."))?;
if cmd.list {
get_tests(harness_proxy, writer, &cmd.test_url).await
} else {
match run_test_suite_lib::run_tests_and_get_outcome(
run_test_suite_lib::TestParams {
test_url: cmd.test_url,
timeout: cmd.timeout.and_then(std::num::NonZeroU32::new),
test_filter: cmd.test_filter,
also_run_disabled_tests: cmd.run_disabled,
parallel: cmd.parallel,
test_args: vec![],
harness: harness_proxy,
},
count,
)
.await
{
run_test_suite_lib::Outcome::Passed => Ok(()),
run_test_suite_lib::Outcome::Timedout => Err(anyhow!("Tests timed out")),
run_test_suite_lib::Outcome::Failed
| run_test_suite_lib::Outcome::Inconclusive
| run_test_suite_lib::Outcome::Error => {
Err(anyhow!("There was an error running tests"))
}
}
}
}
async fn get_tests<W: Write>(
harness_proxy: ftest_manager::HarnessProxy,
mut write: W,
suite_url: &String,
) -> Result<(), Error> {
let writer = &mut write;
let (suite_proxy, suite_server_end) = create_proxy().unwrap();
let (_controller_proxy, controller_server_end) = create_proxy().unwrap();
log::info!("launching test suite {}", suite_url);
let _result = harness_proxy
.launch_suite(
&suite_url,
ftest_manager::LaunchOptions::EMPTY,
suite_server_end,
controller_server_end,
)
.await
.context("launch_suite call failed")?
.map_err(|e| format_err!("error launching test: {:?}", e))?;
let (case_iterator, test_server_end) = create_proxy::<CaseIteratorMarker>()?;
suite_proxy
.get_tests(test_server_end)
.map_err(|e| format_err!("Error getting test steps: {}", e))?;
loop {
let cases = case_iterator.get_next().await?;
if cases.is_empty() {
return Ok(());
}
writeln!(writer, "Tests in suite {}:\n", suite_url)?;
for case in cases {
match case.name {
Some(n) => writeln!(writer, "{}", n)?,
None => writeln!(writer, "<No name>")?,
};
}
}
}