Skip to content

Respect --nocapture in panic=abort test mode #68909

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 7, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 17 additions & 9 deletions src/libtest/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,7 @@ use std::{
env, io,
io::prelude::Write,
panic::{self, catch_unwind, AssertUnwindSafe, PanicInfo},
process,
process::{Command, Termination},
process::{self, Command, Termination},
sync::mpsc::{channel, Sender},
sync::{Arc, Mutex},
thread,
Expand Down Expand Up @@ -457,9 +456,13 @@ pub fn run_test(
monitor_ch,
opts.time,
),
RunStrategy::SpawnPrimary => {
spawn_test_subprocess(desc, opts.time.is_some(), monitor_ch, opts.time)
}
RunStrategy::SpawnPrimary => spawn_test_subprocess(
desc,
opts.nocapture,
opts.time.is_some(),
monitor_ch,
opts.time,
),
};

// If the platform is single-threaded we're just going to run
Expand Down Expand Up @@ -558,6 +561,7 @@ fn run_test_in_process(

fn spawn_test_subprocess(
desc: TestDesc,
nocapture: bool,
report_time: bool,
monitor_ch: Sender<CompletedTest>,
time_opts: Option<time::TestTimeOptions>,
Expand All @@ -566,11 +570,15 @@ fn spawn_test_subprocess(
let args = env::args().collect::<Vec<_>>();
let current_exe = &args[0];

let mut command = Command::new(current_exe);
command.env(SECONDARY_TEST_INVOKER_VAR, desc.name.as_slice());
if nocapture {
command.stdout(process::Stdio::inherit());
command.stderr(process::Stdio::inherit());
}

let start = report_time.then(Instant::now);
let output = match Command::new(current_exe)
.env(SECONDARY_TEST_INVOKER_VAR, desc.name.as_slice())
.output()
{
let output = match command.output() {
Ok(out) => out,
Err(e) => {
let err = format!("Failed to spawn {} as child for test: {:?}", args[0], e);
Expand Down
39 changes: 39 additions & 0 deletions src/test/ui/test-panic-abort-nocapture.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// no-prefer-dynamic
// compile-flags: --test -Cpanic=abort -Zpanic_abort_tests
// run-flags: --test-threads=1 --nocapture
// run-fail
// check-run-results
// exec-env:RUST_BACKTRACE=0

// ignore-wasm no panic or subprocess support
// ignore-emscripten no panic or subprocess support

#![cfg(test)]

use std::io::Write;

#[test]
fn it_works() {
println!("about to succeed");
assert_eq!(1 + 1, 2);
}

#[test]
#[should_panic]
fn it_panics() {
println!("about to panic");
assert_eq!(1 + 1, 4);
}

#[test]
fn it_fails() {
println!("about to fail");
assert_eq!(1 + 1, 4);
}

#[test]
fn it_writes_to_stdio() {
println!("hello, world");
writeln!(std::io::stdout(), "testing123").unwrap();
writeln!(std::io::stderr(), "testing321").unwrap();
}
9 changes: 9 additions & 0 deletions src/test/ui/test-panic-abort-nocapture.run.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
thread 'main' panicked at 'assertion failed: `(left == right)`
left: `2`,
right: `4`', $DIR/test-panic-abort-nocapture.rs:31:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
thread 'main' panicked at 'assertion failed: `(left == right)`
left: `2`,
right: `4`', $DIR/test-panic-abort-nocapture.rs:25:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
testing321
23 changes: 23 additions & 0 deletions src/test/ui/test-panic-abort-nocapture.run.stdout
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@

running 4 tests
test it_fails ... about to fail
FAILED
test it_panics ... about to panic
ok
test it_works ... about to succeed
ok
test it_writes_to_stdio ... hello, world
testing123
ok

failures:

---- it_fails stdout ----
---- it_fails stderr ----


failures:
it_fails

test result: FAILED. 3 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out