diff options
Diffstat (limited to 'tests/ui/process/println-with-broken-pipe.rs')
| -rw-r--r-- | tests/ui/process/println-with-broken-pipe.rs | 44 |
1 files changed, 44 insertions, 0 deletions
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(); +} |
