| //@ run-pass |
| //@ check-run-results |
| //@ ignore-windows |
| //@ ignore-wasm32 |
| //@ ignore-fuchsia |
| //@ ignore-horizon |
| //@ ignore-android |
| //@ normalize-stderr-test: ".rs:\d+:\d+" -> ".rs:LL:CC" |
| //@ compile-flags: -Zon-broken-pipe=error |
| |
| // Test what the error message looks like when `println!()` panics because of |
| // `std::io::ErrorKind::BrokenPipe` |
| |
| use std::env; |
| use std::process::{Command, Stdio}; |
| |
| 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(); |
| } |