From e5b2c5ebb89b962faec2937b3befa01ced90c579 Mon Sep 17 00:00:00 2001 From: David Sherret Date: Thu, 6 Jun 2024 08:37:13 -0400 Subject: [PATCH] chore: support `-- --nocapture` in the spec tests (#24113) --- tests/specs/README.md | 7 +++++++ tests/specs/mod.rs | 14 +++++++++++++- tests/specs/schema.json | 3 +++ tests/util/server/src/builders.rs | 16 ++++++++-------- 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/tests/specs/README.md b/tests/specs/README.md index bd3430f058..29c83ec128 100644 --- a/tests/specs/README.md +++ b/tests/specs/README.md @@ -26,6 +26,13 @@ Or just the following, though it might run other tests: cargo test test_name ``` +To run showing the output of every test use `-- --nocapture` (note: this will +cause tests to run sequentially instead of in parallel): + +``` +cargo test test_name -- --nocapture +``` + ## `__test__.json` file This file describes the test(s) to execute and the steps to execute. A basic diff --git a/tests/specs/mod.rs b/tests/specs/mod.rs index 3a52ab29ea..c46969f4e1 100644 --- a/tests/specs/mod.rs +++ b/tests/specs/mod.rs @@ -19,6 +19,7 @@ use file_test_runner::collection::CollectedTest; use file_test_runner::collection::CollectedTestCategory; use file_test_runner::SubTestResult; use file_test_runner::TestResult; +use once_cell::sync::Lazy; use serde::Deserialize; use test_util::tests_path; use test_util::PathRef; @@ -26,6 +27,9 @@ use test_util::TestContextBuilder; const MANIFEST_FILE_NAME: &str = "__test__.jsonc"; +static NO_CAPTURE: Lazy = + Lazy::new(|| std::env::args().any(|arg| arg == "--nocapture")); + #[derive(Clone, Deserialize)] #[serde(untagged)] enum VecOrString { @@ -178,7 +182,9 @@ pub fn main() { let _http_guard = test_util::http_server(); file_test_runner::run_tests( &root_category, - file_test_runner::RunOptions { parallel: true }, + file_test_runner::RunOptions { + parallel: !*NO_CAPTURE, + }, run_test, ); } @@ -373,6 +379,12 @@ fn run_step( Some(command_name) => command.name(command_name), None => command, }; + let command = match *NO_CAPTURE { + // deprecated is only to prevent use, so this is fine here + #[allow(deprecated)] + true => command.show_output(), + false => command, + }; let output = command.run(); if step.output.ends_with(".out") { let test_output_path = cwd.join(&step.output); diff --git a/tests/specs/schema.json b/tests/specs/schema.json index d41babd19e..bf57b4826a 100644 --- a/tests/specs/schema.json +++ b/tests/specs/schema.json @@ -93,6 +93,9 @@ "additionalProperties": { "type": "string" } + }, + "repeat": { + "type": "number" } } }, { diff --git a/tests/util/server/src/builders.rs b/tests/util/server/src/builders.rs index bd2d02f3fe..58563bd03b 100644 --- a/tests/util/server/src/builders.rs +++ b/tests/util/server/src/builders.rs @@ -387,7 +387,7 @@ pub struct TestCommandBuilder { args_text: String, args_vec: Vec, split_output: bool, - debug_output: bool, + show_output: bool, } impl TestCommandBuilder { @@ -407,7 +407,7 @@ impl TestCommandBuilder { command_name: "deno".to_string(), args_text: "".to_string(), args_vec: Default::default(), - debug_output: false, + show_output: false, } } @@ -489,8 +489,8 @@ impl TestCommandBuilder { /// Not deprecated, this is just here so you don't accidentally /// commit code with this enabled. #[deprecated] - pub fn debug_output(mut self) -> Self { - self.debug_output = true; + pub fn show_output(mut self) -> Self { + self.show_output = true; self } @@ -662,15 +662,15 @@ impl TestCommandBuilder { let (stderr_reader, stderr_writer) = pipe().unwrap(); command.stdout(stdout_writer); command.stderr(stderr_writer); - let debug_output = self.debug_output; + let show_output = self.show_output; ( None, Some(( std::thread::spawn(move || { - read_pipe_to_string(stdout_reader, debug_output) + read_pipe_to_string(stdout_reader, show_output) }), std::thread::spawn(move || { - read_pipe_to_string(stderr_reader, debug_output) + read_pipe_to_string(stderr_reader, show_output) }), )), ) @@ -695,7 +695,7 @@ impl TestCommandBuilder { drop(command); let combined = combined_reader.map(|pipe| { - sanitize_output(read_pipe_to_string(pipe, self.debug_output), &args) + sanitize_output(read_pipe_to_string(pipe, self.show_output), &args) }); let status = process.wait().unwrap();