about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorRoss Sullivan <rosssullivan101@gmail.com>2025-01-11 17:19:40 +0900
committerRoss Sullivan <rosssullivan101@gmail.com>2025-01-11 20:43:17 +0900
commitdc11857ee77cf022ce23c39e303cf1dfd6a40834 (patch)
tree0e4ae31ba346fe22767efaa77049c4214697985c /src
parent252b07bba419a075acfa1fa85d66683e9623c281 (diff)
downloadrust-dc11857ee77cf022ce23c39e303cf1dfd6a40834.tar.gz
rust-dc11857ee77cf022ce23c39e303cf1dfd6a40834.zip
ci: added ci format to test_render
Diffstat (limited to 'src')
-rw-r--r--src/bootstrap/src/utils/render_tests.rs52
1 files changed, 49 insertions, 3 deletions
diff --git a/src/bootstrap/src/utils/render_tests.rs b/src/bootstrap/src/utils/render_tests.rs
index 46b250555f2..42b444464e5 100644
--- a/src/bootstrap/src/utils/render_tests.rs
+++ b/src/bootstrap/src/utils/render_tests.rs
@@ -10,6 +10,7 @@ use std::io::{BufRead, BufReader, Read, Write};
 use std::process::{ChildStdout, Stdio};
 use std::time::Duration;
 
+use build_helper::ci::CiEnv;
 use termcolor::{Color, ColorSpec, WriteColor};
 
 use crate::core::builder::Builder;
@@ -91,7 +92,9 @@ struct Renderer<'a> {
     /// Number of tests that were skipped due to already being up-to-date
     /// (i.e. no relevant changes occurred since they last ran).
     up_to_date_tests: usize,
+    ignored_tests: usize,
     terse_tests_in_line: usize,
+    ci_latest_logged_percentage: f64,
 }
 
 impl<'a> Renderer<'a> {
@@ -104,7 +107,9 @@ impl<'a> Renderer<'a> {
             tests_count: None,
             executed_tests: 0,
             up_to_date_tests: 0,
+            ignored_tests: 0,
             terse_tests_in_line: 0,
+            ci_latest_logged_percentage: 0.0,
         }
     }
 
@@ -159,9 +164,12 @@ impl<'a> Renderer<'a> {
     fn render_test_outcome(&mut self, outcome: Outcome<'_>, test: &TestOutcome) {
         self.executed_tests += 1;
 
-        // Keep this in sync with the "up-to-date" ignore message inserted by compiletest.
-        if let Outcome::Ignored { reason: Some("up-to-date") } = outcome {
-            self.up_to_date_tests += 1;
+        if let Outcome::Ignored { reason } = outcome {
+            self.ignored_tests += 1;
+            // Keep this in sync with the "up-to-date" ignore message inserted by compiletest.
+            if reason == Some("up-to-date") {
+                self.up_to_date_tests += 1;
+            }
         }
 
         #[cfg(feature = "build-metrics")]
@@ -179,6 +187,8 @@ impl<'a> Renderer<'a> {
 
         if self.builder.config.verbose_tests {
             self.render_test_outcome_verbose(outcome, test);
+        } else if CiEnv::is_ci() {
+            self.render_test_outcome_ci(outcome, test);
         } else {
             self.render_test_outcome_terse(outcome, test);
         }
@@ -209,6 +219,31 @@ impl<'a> Renderer<'a> {
         let _ = std::io::stdout().flush();
     }
 
+    fn render_test_outcome_ci(&mut self, outcome: Outcome<'_>, test: &TestOutcome) {
+        if let Some(total) = self.tests_count {
+            let percent = self.executed_tests as f64 / total as f64;
+
+            if self.ci_latest_logged_percentage + 0.10 < percent {
+                let total = total.to_string();
+                let executed = format!("{:>width$}", self.executed_tests, width = total.len());
+                let pretty_percent = format!("{:.0}%", percent * 100.0);
+                let passed_tests = self.executed_tests - (self.failures.len() + self.ignored_tests);
+                println!(
+                    "{:<4} -- {executed}/{total}, {:>total_indent$} passed, {} failed, {} ignored",
+                    pretty_percent,
+                    passed_tests,
+                    self.failures.len(),
+                    self.ignored_tests,
+                    total_indent = total.len()
+                );
+                self.ci_latest_logged_percentage += 0.10;
+            }
+        }
+
+        self.builder.colored_stdout(|stdout| outcome.write_ci(stdout, &test.name)).unwrap();
+        let _ = std::io::stdout().flush();
+    }
+
     fn render_suite_outcome(&self, outcome: Outcome<'_>, suite: &SuiteOutcome) {
         // The terse output doesn't end with a newline, so we need to add it ourselves.
         if !self.builder.config.verbose_tests {
@@ -378,6 +413,17 @@ impl Outcome<'_> {
         }
         writer.reset()
     }
+
+    fn write_ci(&self, writer: &mut dyn WriteColor, name: &str) -> Result<(), std::io::Error> {
+        match self {
+            Outcome::Ok | Outcome::BenchOk | Outcome::Ignored { .. } => {}
+            Outcome::Failed => {
+                writer.set_color(ColorSpec::new().set_fg(Some(Color::Red)))?;
+                writeln!(writer, "   {name} ... FAILED")?;
+            }
+        }
+        writer.reset()
+    }
 }
 
 #[derive(serde_derive::Deserialize)]