From 34b264d1ab4a95a3826ba9294c9c43e2d87fdd2a Mon Sep 17 00:00:00 2001 From: Aiden Grossman Date: Sun, 2 Nov 2025 21:17:49 +0000 Subject: [PATCH 1/2] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20in?= =?UTF-8?q?itial=20version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Created using spr 1.3.7 --- .ci/generate_test_report_lib.py | 11 +++++--- .ci/generate_test_report_lib_test.py | 42 +++++++++++++++++++++++----- 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/.ci/generate_test_report_lib.py b/.ci/generate_test_report_lib.py index 36c95852452ac..d5fe437155a83 100644 --- a/.ci/generate_test_report_lib.py +++ b/.ci/generate_test_report_lib.py @@ -41,10 +41,13 @@ def _parse_ninja_log(ninja_log: list[str]) -> list[tuple[str, str]]: # touch test/4.stamp # # index will point to the line that starts with Failed:. The progress - # indicator is the line before this ([4/5] test/4.stamp) and contains a pretty - # printed version of the target being built (test/4.stamp). We use this line - # and remove the progress information to get a succinct name for the target. - failing_action = ninja_log[index - 1].split("] ")[1] + # indicator is sometimes the line before this ([4/5] test/4.stamp) and + # will contain a pretty printed version of the target being built + # (test/4.stamp) when accurate. We instead parse the failed line rather + # than the progress indicator as the progress indicator may not be + # aligned with the failure. + failing_action = ninja_log[index].split("FAILED: ")[1] + print(failing_action) failure_log = [] while ( index < len(ninja_log) diff --git a/.ci/generate_test_report_lib_test.py b/.ci/generate_test_report_lib_test.py index a8659e1d6a3e3..a8991f139e055 100644 --- a/.ci/generate_test_report_lib_test.py +++ b/.ci/generate_test_report_lib_test.py @@ -39,7 +39,7 @@ def test_find_failure_ninja_logs(self): self.assertEqual( failures[0], ( - "test/4.stamp", + "touch test/4.stamp", dedent( """\ FAILED: touch test/4.stamp @@ -77,7 +77,7 @@ def test_ninja_log_end(self): self.assertEqual( failures[0], ( - "test/3.stamp", + "touch test/3.stamp", dedent( """\ FAILED: touch test/3.stamp @@ -106,7 +106,7 @@ def test_ninja_log_multiple_failures(self): self.assertEqual( failures[0], ( - "test/2.stamp", + "touch test/2.stamp", dedent( """\ FAILED: touch test/2.stamp @@ -117,7 +117,7 @@ def test_ninja_log_multiple_failures(self): self.assertEqual( failures[1], ( - "test/4.stamp", + "touch test/4.stamp", dedent( """\ FAILED: touch test/4.stamp @@ -150,7 +150,7 @@ def test_ninja_log_runtimes_failure(self): self.assertEqual( failures[0], ( - "test/2.stamp", + "touch test/2.stamp", dedent( """\ FAILED: touch test/2.stamp @@ -159,6 +159,34 @@ def test_ninja_log_runtimes_failure(self): ), ) + # Test that we correctly handle cases where the FAILED: line does not + # match up with the progress indicator. + def test_ninja_log_mismatched_failed(self): + failures = generate_test_report_lib.find_failure_in_ninja_logs( + [ + [ + "[1/5] test/1.stamp", + "[2/5] test/2.stamp", + "ModuleNotFoundError: No module named 'mount_langley'", + "FAILED: tools/check-langley", + "Wow! This system is really broken!", + "[5/5] test/5.stamp", + ] + ] + ) + self.assertEqual(len(failures), 1) + self.assertEqual( + failures[0], + ( + "tools/check-langley", + dedent( + """\ + FAILED: tools/check-langley + Wow! This system is really broken!""" + ), + ), + ) + def test_title_only(self): self.assertEqual( generate_test_report_lib.generate_report("Foo", 0, [], []), @@ -449,7 +477,7 @@ def test_no_failures_multiple_build_failed_ninja_log(self): All tests passed but another part of the build **failed**. Click on a failure below to see the details.
- test/2.stamp + touch test/2.stamp ``` FAILED: touch test/2.stamp @@ -457,7 +485,7 @@ def test_no_failures_multiple_build_failed_ninja_log(self): ```
- test/4.stamp + touch test/4.stamp ``` FAILED: touch test/4.stamp From 0e0e75e3edbb1568a36e4adf26895e814ec51f94 Mon Sep 17 00:00:00 2001 From: Aiden Grossman Date: Sun, 2 Nov 2025 21:21:47 +0000 Subject: [PATCH 2/2] remove debug statement Created using spr 1.3.7 --- .ci/generate_test_report_lib.py | 1 - 1 file changed, 1 deletion(-) diff --git a/.ci/generate_test_report_lib.py b/.ci/generate_test_report_lib.py index d5fe437155a83..7820fbda803d7 100644 --- a/.ci/generate_test_report_lib.py +++ b/.ci/generate_test_report_lib.py @@ -47,7 +47,6 @@ def _parse_ninja_log(ninja_log: list[str]) -> list[tuple[str, str]]: # than the progress indicator as the progress indicator may not be # aligned with the failure. failing_action = ninja_log[index].split("FAILED: ")[1] - print(failing_action) failure_log = [] while ( index < len(ninja_log)