about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2023-06-12 14:34:20 +0000
committerbors <bors@rust-lang.org>2023-06-12 14:34:20 +0000
commitb963a57205e548e8538a8182b1c273ea75007614 (patch)
tree1db4cb282486768759b0975c89e05d8328466c4d
parentcb882fa998571e8a7ec1c06bb5d9dd9bc3423629 (diff)
parent6c966dc6565fadade975ec7e85d637578cea4e60 (diff)
downloadrust-b963a57205e548e8538a8182b1c273ea75007614.tar.gz
rust-b963a57205e548e8538a8182b1c273ea75007614.zip
Auto merge of #112541 - ozkanonur:gtfx, r=clubby789
implement stdout streaming in `render_tests::Renderer`

This way, we can show the test dot characters on the console immediately, without having to wait for the entire line to finish.

cc `@GuillaumeGomez`
-rw-r--r--src/bootstrap/render_tests.rs34
-rw-r--r--src/bootstrap/test.rs6
2 files changed, 31 insertions, 9 deletions
diff --git a/src/bootstrap/render_tests.rs b/src/bootstrap/render_tests.rs
index 06ab820953d..98a468c883d 100644
--- a/src/bootstrap/render_tests.rs
+++ b/src/bootstrap/render_tests.rs
@@ -7,7 +7,7 @@
 //! to reimplement all the rendering logic in this module because of that.
 
 use crate::builder::Builder;
-use std::io::{BufRead, BufReader, Write};
+use std::io::{BufRead, BufReader, Read, Write};
 use std::process::{ChildStdout, Command, Stdio};
 use std::time::Duration;
 use termcolor::{Color, ColorSpec, WriteColor};
@@ -20,15 +20,15 @@ pub(crate) fn add_flags_and_try_run_tests(builder: &Builder<'_>, cmd: &mut Comma
     }
     cmd.args(&["-Z", "unstable-options", "--format", "json"]);
 
-    try_run_tests(builder, cmd)
+    try_run_tests(builder, cmd, false)
 }
 
-pub(crate) fn try_run_tests(builder: &Builder<'_>, cmd: &mut Command) -> bool {
+pub(crate) fn try_run_tests(builder: &Builder<'_>, cmd: &mut Command, stream: bool) -> bool {
     if builder.config.dry_run() {
         return true;
     }
 
-    if !run_tests(builder, cmd) {
+    if !run_tests(builder, cmd, stream) {
         if builder.fail_fast {
             crate::detail_exit_macro!(1);
         } else {
@@ -41,7 +41,7 @@ pub(crate) fn try_run_tests(builder: &Builder<'_>, cmd: &mut Command) -> bool {
     }
 }
 
-fn run_tests(builder: &Builder<'_>, cmd: &mut Command) -> bool {
+fn run_tests(builder: &Builder<'_>, cmd: &mut Command, stream: bool) -> bool {
     cmd.stdout(Stdio::piped());
 
     builder.verbose(&format!("running: {cmd:?}"));
@@ -50,7 +50,12 @@ fn run_tests(builder: &Builder<'_>, cmd: &mut Command) -> bool {
 
     // This runs until the stdout of the child is closed, which means the child exited. We don't
     // run this on another thread since the builder is not Sync.
-    Renderer::new(process.stdout.take().unwrap(), builder).render_all();
+    let renderer = Renderer::new(process.stdout.take().unwrap(), builder);
+    if stream {
+        renderer.stream_all();
+    } else {
+        renderer.render_all();
+    }
 
     let result = process.wait_with_output().unwrap();
     if !result.status.success() && builder.is_verbose() {
@@ -112,6 +117,23 @@ impl<'a> Renderer<'a> {
         }
     }
 
+    /// Renders the stdout characters one by one
+    fn stream_all(mut self) {
+        let mut buffer = [0; 1];
+        loop {
+            match self.stdout.read(&mut buffer) {
+                Ok(0) => break,
+                Ok(_) => {
+                    let mut stdout = std::io::stdout();
+                    stdout.write_all(&buffer).unwrap();
+                    let _ = stdout.flush();
+                }
+                Err(err) if err.kind() == std::io::ErrorKind::UnexpectedEof => break,
+                Err(err) => panic!("failed to read output of test runner: {err}"),
+            }
+        }
+    }
+
     fn render_test_outcome(&mut self, outcome: Outcome<'_>, test: &TestOutcome) {
         self.executed_tests += 1;
 
diff --git a/src/bootstrap/test.rs b/src/bootstrap/test.rs
index f31ba946099..cde77f4720b 100644
--- a/src/bootstrap/test.rs
+++ b/src/bootstrap/test.rs
@@ -1035,7 +1035,7 @@ impl Step for RustdocGUI {
         }
 
         let _time = util::timeit(&builder);
-        crate::render_tests::try_run_tests(builder, &mut cmd);
+        crate::render_tests::try_run_tests(builder, &mut cmd, true);
     }
 }
 
@@ -1732,7 +1732,7 @@ note: if you're sure you want to do this, please open an issue as to why. In the
             suite, mode, &compiler.host, target
         ));
         let _time = util::timeit(&builder);
-        crate::render_tests::try_run_tests(builder, &mut cmd);
+        crate::render_tests::try_run_tests(builder, &mut cmd, false);
 
         if let Some(compare_mode) = compare_mode {
             cmd.arg("--compare-mode").arg(compare_mode);
@@ -1755,7 +1755,7 @@ note: if you're sure you want to do this, please open an issue as to why. In the
                 suite, mode, compare_mode, &compiler.host, target
             ));
             let _time = util::timeit(&builder);
-            crate::render_tests::try_run_tests(builder, &mut cmd);
+            crate::render_tests::try_run_tests(builder, &mut cmd, false);
         }
     }
 }