Make tests capture the error printed by a Result return
This commit is contained in:
@@ -999,7 +999,18 @@ fn print_to<T>(args: fmt::Arguments<'_>, global_s: fn() -> T, label: &str)
|
||||
where
|
||||
T: Write,
|
||||
{
|
||||
if OUTPUT_CAPTURE_USED.load(Ordering::Relaxed)
|
||||
if print_to_buffer_if_capture_used(args) {
|
||||
// Successfully wrote to capture buffer.
|
||||
return;
|
||||
}
|
||||
|
||||
if let Err(e) = global_s().write_fmt(args) {
|
||||
panic!("failed printing to {label}: {e}");
|
||||
}
|
||||
}
|
||||
|
||||
fn print_to_buffer_if_capture_used(args: fmt::Arguments<'_>) -> bool {
|
||||
OUTPUT_CAPTURE_USED.load(Ordering::Relaxed)
|
||||
&& OUTPUT_CAPTURE.try_with(|s| {
|
||||
// Note that we completely remove a local sink to write to in case
|
||||
// our printing recursively panics/prints, so the recursive
|
||||
@@ -1009,14 +1020,19 @@ where
|
||||
s.set(Some(w));
|
||||
})
|
||||
}) == Ok(Some(()))
|
||||
{
|
||||
// Successfully wrote to capture buffer.
|
||||
}
|
||||
|
||||
/// Used by impl Termination for Result to print error after `main` or a test
|
||||
/// has returned. Should avoid panicking, although we can't help it if one of
|
||||
/// the Display impls inside args decides to.
|
||||
pub(crate) fn attempt_print_to_stderr(args: fmt::Arguments<'_>) {
|
||||
if print_to_buffer_if_capture_used(args) {
|
||||
return;
|
||||
}
|
||||
|
||||
if let Err(e) = global_s().write_fmt(args) {
|
||||
panic!("failed printing to {label}: {e}");
|
||||
}
|
||||
// Ignore error if the write fails, for example because stderr is already
|
||||
// closed. There is not much point panicking at this point.
|
||||
let _ = stderr().write_fmt(args);
|
||||
}
|
||||
|
||||
#[unstable(
|
||||
|
||||
Reference in New Issue
Block a user