about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMartin Nordholts <enselic@gmail.com>2023-03-10 12:50:02 +0100
committerMartin Nordholts <enselic@gmail.com>2023-07-26 13:41:39 +0200
commit075a6bbef960a7be4cebc6f6b9b7a3d6212f56a6 (patch)
tree503257745666806698e25cb9db6c836855f7a89b
parenta6236fa460811bbd4a08a94db249c344fa9f2220 (diff)
downloadrust-075a6bbef960a7be4cebc6f6b9b7a3d6212f56a6.tar.gz
rust-075a6bbef960a7be4cebc6f6b9b7a3d6212f56a6.zip
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
-rw-r--r--tests/ui/process/println-with-broken-pipe.rs44
-rw-r--r--tests/ui/process/println-with-broken-pipe.run.stderr2
-rw-r--r--tests/ui/process/println-with-broken-pipe.run.stdout1
3 files changed, 47 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();
+}
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