From 8f9799307b59d91e350bf1239ba20ec24a47b58d Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 23 Mar 2026 19:34:48 -0700 Subject: [PATCH] test: print failed test lane output tails --- scripts/test-parallel-utils.mjs | 14 ++++++++++++++ scripts/test-parallel.mjs | 7 +++++++ 2 files changed, 21 insertions(+) diff --git a/scripts/test-parallel-utils.mjs b/scripts/test-parallel-utils.mjs index 3f815a5036d..591be46a34e 100644 --- a/scripts/test-parallel-utils.mjs +++ b/scripts/test-parallel-utils.mjs @@ -22,6 +22,20 @@ export function hasFatalTestRunOutput(output) { return fatalOutputPatterns.some((pattern) => pattern.test(output)); } +export function formatCapturedOutputTail(output, maxLines = 60, maxChars = 6000) { + const trimmed = output.trim(); + if (!trimmed) { + return ""; + } + const lines = trimmed.split(/\r?\n/u); + const tailLines = lines.slice(-maxLines); + const tail = tailLines.join("\n"); + if (tail.length <= maxChars) { + return tail; + } + return tail.slice(-maxChars); +} + export function resolveTestRunExitCode({ code, signal, output, fatalSeen = false, childError }) { if (typeof code === "number" && code !== 0) { return code; diff --git a/scripts/test-parallel.mjs b/scripts/test-parallel.mjs index ed3cc6ca534..b1b42c7a2f8 100644 --- a/scripts/test-parallel.mjs +++ b/scripts/test-parallel.mjs @@ -11,6 +11,7 @@ import { } from "./test-parallel-memory.mjs"; import { appendCapturedOutput, + formatCapturedOutputTail, hasFatalTestRunOutput, resolveTestRunExitCode, } from "./test-parallel-utils.mjs"; @@ -1296,6 +1297,12 @@ const runOnce = (entry, extraArgs = []) => children.delete(child); const resolvedCode = resolveTestRunExitCode({ code, signal, output, fatalSeen, childError }); logMemoryTraceSummary(); + if (resolvedCode !== 0) { + const failureTail = formatCapturedOutputTail(output); + if (failureTail) { + console.error(`[test-parallel] failure tail ${entry.name}\n${failureTail}`); + } + } console.log( `[test-parallel] done ${entry.name} code=${String(resolvedCode)} elapsed=${formatElapsedMs(Date.now() - startedAt)}`, );