From 075a6bbef960a7be4cebc6f6b9b7a3d6212f56a6 Mon Sep 17 00:00:00 2001 From: Martin Nordholts Date: Fri, 10 Mar 2023 12:50:02 +0100 Subject: [PATCH] Regression test `println!()` panic message on `ErrorKind::BrokenPipe` No existing test failed if the [`panic!()`][1] of the `println!()` family of functions was removed, or if its message was changed. So add such a test. [1] https://github.com/rust-lang/rust/blob/104f4300cfddbd956e32820ef202a732f06ec848/library/std/src/io/stdio.rs#L1007-L1009 --- tests/ui/process/println-with-broken-pipe.rs | 44 +++++++++++++++++++ .../println-with-broken-pipe.run.stderr | 2 + .../println-with-broken-pipe.run.stdout | 1 + 3 files changed, 47 insertions(+) create mode 100644 tests/ui/process/println-with-broken-pipe.rs create mode 100644 tests/ui/process/println-with-broken-pipe.run.stderr create mode 100644 tests/ui/process/println-with-broken-pipe.run.stdout diff --git a/tests/ui/process/println-with-broken-pipe.rs b/tests/ui/process/println-with-broken-pipe.rs new file mode 100644 index 00000000000..47c590ce2f0 --- /dev/null +++ b/tests/ui/process/println-with-broken-pipe.rs @@ -0,0 +1,44 @@ +// run-pass +// check-run-results +// ignore-windows +// ignore-emscripten +// ignore-fuchsia +// ignore-horizon +// ignore-android +// normalize-stderr-test ".rs:\d+:\d+" -> ".rs:LL:CC" + +// Test what the error message looks like when `println!()` panics because of +// `std::io::ErrorKind::BrokenPipe` + +#![feature(unix_sigpipe)] + +use std::env; +use std::process::{Command, Stdio}; + +#[unix_sigpipe = "sig_ign"] +fn main() { + let mut args = env::args(); + let me = args.next().unwrap(); + + if let Some(arg) = args.next() { + // More than enough iterations to fill any pipe buffer. Normally this + // loop will end with a panic more or less immediately. + for _ in 0..65536 * 64 { + println!("{arg}"); + } + unreachable!("should have panicked because of BrokenPipe"); + } + + // Set up a pipeline with a short-lived consumer and wait for it to finish. + // This will produce the `println!()` panic message on stderr. + let mut producer = Command::new(&me) + .arg("this line shall appear exactly once on stdout") + .env("RUST_BACKTRACE", "0") + .stdout(Stdio::piped()) + .spawn() + .unwrap(); + let mut consumer = + Command::new("head").arg("-n1").stdin(producer.stdout.take().unwrap()).spawn().unwrap(); + consumer.wait().unwrap(); + producer.wait().unwrap(); +} diff --git a/tests/ui/process/println-with-broken-pipe.run.stderr b/tests/ui/process/println-with-broken-pipe.run.stderr new file mode 100644 index 00000000000..ebcd920d501 --- /dev/null +++ b/tests/ui/process/println-with-broken-pipe.run.stderr @@ -0,0 +1,2 @@ +thread 'main' panicked at 'failed printing to stdout: Broken pipe (os error 32)', library/std/src/io/stdio.rs:LL:CC +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/tests/ui/process/println-with-broken-pipe.run.stdout b/tests/ui/process/println-with-broken-pipe.run.stdout new file mode 100644 index 00000000000..f55c39578b1 --- /dev/null +++ b/tests/ui/process/println-with-broken-pipe.run.stdout @@ -0,0 +1 @@ +this line shall appear exactly once on stdout