fix(#4012): make the artifact say whether the reporter ever loaded
Down to 3 remote failures, all one chain. The explicit no-events reporting is working — the diagnostic now states the events file does not exist, instead of silently printing the generic message. But it then ASSERTED a cause: "the child was killed before the reporter wrote even one event (process/spawn startup stall, not a test hang)". That was a guess dressed as a finding, and the fixture contradicts it: it starts a real test, so test:start should fire in milliseconds against a 2000ms budget. Two hypotheses remained and I could not separate them locally, because the local test runner is hook-blocked here: either the custom reporter never LOADS in the child, or it loads and no event reaches it before the SIGKILL. Rather than guess a third time, the artifact now answers it. The reporter appends a reporter:init line as its first action, before consuming anything, so the file's contents discriminate: absent means the reporter never loaded; init-only means it loaded and saw no test events; init plus events means it works. The diagnostic has a branch for each and, where the cause is genuinely unresolved, names both possibilities instead of picking one. Also passes the reporter as a file:// URL via pathToFileURL. Node documents the --test-reporter value as an import()-style specifier, and a bare absolute path is not a portable one — notably on Windows. That is a correctness fix whichever hypothesis holds, and it is a live candidate for the first. FIXED_OVERHEAD is derived by reducing over the actual argv strings, so the longer URL is accounted automatically. Verified by execution, not assumption: composing the reporter against an EMPTY event stream writes exactly one line, the init marker. That is the whole point of the marker, so it is pinned by a test rather than left to inspection. T1 stays red and untouched. Verification runs on the remote runner. Refs #4012
This commit is contained in:
@@ -57,6 +57,23 @@
|
||||
// never leaves more than one dangling unparsable trailing line.
|
||||
module.exports = async function ndjsonEventReporter(source) {
|
||||
const eventsPath = process.env.GSD_RUN_TESTS_EVENTS_FILE;
|
||||
// #3889: an init marker, written as this reporter's FIRST action — before
|
||||
// the `for await` loop even begins consuming the event stream — so the
|
||||
// events file's mere existence (and its exact contents) can distinguish
|
||||
// "the reporter module never loaded in the child at all" (file absent)
|
||||
// from "it loaded fine but no test:start reached it before the kill"
|
||||
// (file contains only this one line) from "it's working" (file contains
|
||||
// more than this line). Same appendFileSync durability rationale as every
|
||||
// other write in this file: synchronous and unbuffered, so it survives an
|
||||
// uncatchable SIGKILL landing a moment later.
|
||||
if (eventsPath) {
|
||||
try {
|
||||
require('fs').appendFileSync(eventsPath, `${JSON.stringify({ type: 'reporter:init', ts: Date.now() })}\n`);
|
||||
} catch {
|
||||
// Best-effort, same as every other write below — must never crash the
|
||||
// test run this reporter is only observing.
|
||||
}
|
||||
}
|
||||
for await (const event of source) {
|
||||
if (!eventsPath) continue; // no destination configured — nothing to record
|
||||
if (
|
||||
|
||||
Reference in New Issue
Block a user