summaryrefslogtreecommitdiff
path: root/cli/tools/test.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/tools/test.rs')
-rw-r--r--cli/tools/test.rs71
1 files changed, 59 insertions, 12 deletions
diff --git a/cli/tools/test.rs b/cli/tools/test.rs
index 00317794f..8cfad29ee 100644
--- a/cli/tools/test.rs
+++ b/cli/tools/test.rs
@@ -21,6 +21,7 @@ use crate::graph_util::graph_valid;
use crate::located_script_name;
use crate::lockfile;
use crate::ops;
+use crate::ops::testing::create_stdout_stderr_pipes;
use crate::proc_state::ProcState;
use crate::resolver::ImportMapResolver;
use crate::resolver::JsxResolver;
@@ -80,8 +81,10 @@ pub struct TestDescription {
#[derive(Debug, Clone, PartialEq, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum TestOutput {
- // TODO(caspervonb): add stdout and stderr redirection.
- Console(String),
+ PrintStdout(String),
+ PrintStderr(String),
+ Stdout(Vec<u8>),
+ Stderr(Vec<u8>),
}
#[derive(Debug, Clone, PartialEq, Deserialize)]
@@ -219,8 +222,10 @@ struct PrettyTestReporter {
concurrent: bool,
echo_output: bool,
deferred_step_output: HashMap<TestDescription, Vec<DeferredStepOutput>>,
+ in_test_count: usize,
last_wait_output_level: usize,
cwd: Url,
+ did_have_user_output: bool,
}
impl PrettyTestReporter {
@@ -228,9 +233,11 @@ impl PrettyTestReporter {
PrettyTestReporter {
concurrent,
echo_output,
+ in_test_count: 0,
deferred_step_output: HashMap::new(),
last_wait_output_level: 0,
cwd: Url::from_directory_path(std::env::current_dir().unwrap()).unwrap(),
+ did_have_user_output: false,
}
}
@@ -251,7 +258,8 @@ impl PrettyTestReporter {
}
fn force_report_step_wait(&mut self, description: &TestStepDescription) {
- if self.last_wait_output_level < description.level {
+ let wrote_user_output = self.write_output_end();
+ if !wrote_user_output && self.last_wait_output_level < description.level {
println!();
}
print!("{}{} ...", " ".repeat(description.level), description.name);
@@ -273,7 +281,8 @@ impl PrettyTestReporter {
TestStepResult::Failed(_) => colors::red("FAILED").to_string(),
};
- if self.last_wait_output_level == description.level {
+ let wrote_user_output = self.write_output_end();
+ if !wrote_user_output && self.last_wait_output_level == description.level {
print!(" ");
} else {
print!("{}", " ".repeat(description.level));
@@ -291,6 +300,16 @@ impl PrettyTestReporter {
}
}
}
+
+ fn write_output_end(&mut self) -> bool {
+ if self.did_have_user_output {
+ println!("{}", colors::gray("----- output end -----"));
+ self.did_have_user_output = false;
+ true
+ } else {
+ false
+ }
+ }
}
impl TestReporter for PrettyTestReporter {
@@ -311,12 +330,31 @@ impl TestReporter for PrettyTestReporter {
if !self.concurrent {
self.force_report_wait(description);
}
+ self.in_test_count += 1;
}
fn report_output(&mut self, output: &TestOutput) {
- if self.echo_output {
- match output {
- TestOutput::Console(line) => println!("{}", line),
+ if !self.echo_output {
+ return;
+ }
+
+ if !self.did_have_user_output && self.in_test_count > 0 {
+ self.did_have_user_output = true;
+ println!();
+ println!("{}", colors::gray("------- output -------"));
+ }
+ match output {
+ TestOutput::PrintStdout(line) => {
+ print!("{}", line)
+ }
+ TestOutput::PrintStderr(line) => {
+ eprint!("{}", line)
+ }
+ TestOutput::Stdout(bytes) => {
+ std::io::stdout().write_all(bytes).unwrap();
+ }
+ TestOutput::Stderr(bytes) => {
+ std::io::stderr().write_all(bytes).unwrap();
}
}
}
@@ -327,6 +365,8 @@ impl TestReporter for PrettyTestReporter {
result: &TestResult,
elapsed: u64,
) {
+ self.in_test_count -= 1;
+
if self.concurrent {
self.force_report_wait(description);
@@ -351,16 +391,17 @@ impl TestReporter for PrettyTestReporter {
}
}
+ let wrote_user_output = self.write_output_end();
+ if !wrote_user_output && self.last_wait_output_level == 0 {
+ print!(" ");
+ }
+
let status = match result {
TestResult::Ok => colors::green("ok").to_string(),
TestResult::Ignored => colors::yellow("ignored").to_string(),
TestResult::Failed(_) => colors::red("FAILED").to_string(),
};
- if self.last_wait_output_level == 0 {
- print!(" ");
- }
-
println!(
"{} {}",
status,
@@ -487,11 +528,17 @@ async fn test_specifier(
channel: UnboundedSender<TestEvent>,
options: TestSpecifierOptions,
) -> Result<(), AnyError> {
+ let (stdout_writer, stderr_writer) =
+ create_stdout_stderr_pipes(channel.clone());
let mut worker = create_main_worker(
&ps,
specifier.clone(),
permissions,
- vec![ops::testing::init(channel.clone())],
+ vec![ops::testing::init(
+ channel.clone(),
+ stdout_writer,
+ stderr_writer,
+ )],
);
let mut maybe_coverage_collector = if let Some(ref coverage_dir) =