Skip to content

Commit 34e3290

Browse files
authored
fix(core): serialize reporter output on CI (#1304)
1 parent 91caeee commit 34e3290

11 files changed

Lines changed: 48 additions & 24 deletions

File tree

packages/browser/src/dispatchCapabilities.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@ type RunnerPayload<TType extends BrowserClientMessage['type']> =
1818
? TPayload
1919
: never;
2020

21-
type ReporterHookArg<THook extends keyof Reporter> = Parameters<
22-
NonNullable<Reporter[THook]>
23-
>[0];
21+
type ReporterHookArg<THook extends keyof Reporter> =
22+
NonNullable<Reporter[THook]> extends (...args: infer TArgs) => unknown
23+
? TArgs[0]
24+
: never;
2425

2526
type RunnerDispatchFileReadyPayload = ReporterHookArg<'onTestFileReady'>;
2627
type RunnerDispatchSuiteStartPayload = ReporterHookArg<'onTestSuiteStart'>;

packages/browser/src/hostController.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,9 +184,10 @@ type FatalPayload = {
184184
stack?: string;
185185
};
186186

187-
type ReporterHookArg<THook extends keyof Reporter> = Parameters<
188-
NonNullable<Reporter[THook]>
189-
>[0];
187+
type ReporterHookArg<THook extends keyof Reporter> =
188+
NonNullable<Reporter[THook]> extends (...args: infer TArgs) => unknown
189+
? TArgs[0]
190+
: never;
190191

191192
type TestFileReadyPayload = ReporterHookArg<'onTestFileReady'>;
192193
type TestSuiteStartPayload = ReporterHookArg<'onTestSuiteStart'>;

packages/core/src/core/mergeReports.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import type {
1313
TestResult,
1414
} from '../types';
1515
import type { CoverageMap } from '../types/coverage';
16-
import { color, logger, prettyTime } from '../utils';
16+
import { color, flushOutputStreams, logger, prettyTime } from '../utils';
1717
import type { Rstest } from './rstest';
1818

1919
const DEFAULT_BLOB_DIR = '.rstest-reports';
@@ -223,6 +223,9 @@ export async function mergeReports(
223223
: undefined,
224224
getSourcemap: async () => null,
225225
});
226+
if (reporter.flushOutputStreams !== false) {
227+
await flushOutputStreams();
228+
}
226229
}
227230

228231
if (

packages/core/src/core/runTests.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
getForceRerunTriggerMessage,
1818
getNoTestFilesMessage,
1919
isDebug,
20+
flushOutputStreams,
2021
logger,
2122
resolveShardedEntries,
2223
type TraceEvent,
@@ -141,6 +142,9 @@ const notifyReportersOnTestRunEnd = async ({
141142
getSourcemap,
142143
filterRerunTestPaths,
143144
});
145+
if (reporter.flushOutputStreams !== false) {
146+
await flushOutputStreams();
147+
}
144148
}
145149
};
146150

packages/core/src/reporter/dot.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ const COLOR_BY_STATUS: Record<
3232
};
3333

3434
export class DotReporter implements Reporter {
35+
readonly flushOutputStreams: boolean;
36+
3537
private readonly rootPath: string;
3638
private readonly options: Pick<DefaultReporterOptions, 'logger' | 'summary'>;
3739
private readonly outputStream: NonNullable<
@@ -53,6 +55,7 @@ export class DotReporter implements Reporter {
5355
}) {
5456
this.rootPath = rootPath;
5557
this.options = options;
58+
this.flushOutputStreams = !options.logger;
5659
this.outputStream = options.logger?.outputStream ?? process.stdout;
5760
this.getColumns =
5861
options.logger?.getColumns ??

packages/core/src/reporter/githubActions.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ import {
3030
} from './utils';
3131

3232
export class GithubActionsReporter {
33+
readonly flushOutputStreams = true;
34+
3335
private readonly onWritePath: (path: string) => string;
3436
private readonly rootPath: string;
3537
private readonly stepSummaryPath?: string;

packages/core/src/reporter/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import { printSummaryErrorLogs, printSummaryLog } from './summary';
1919
import { logCase, logFileTitle, logUserConsoleLog } from './utils';
2020

2121
export class DefaultReporter implements Reporter {
22+
readonly flushOutputStreams: boolean;
23+
2224
protected rootPath: string;
2325
protected config: NormalizedConfig;
2426
protected projectConfigs: Map<string, NormalizedProjectConfig>;
@@ -45,6 +47,7 @@ export class DefaultReporter implements Reporter {
4547
this.projectConfigs = projectConfigs ?? new Map();
4648
this.options = options;
4749
this.testState = testState;
50+
this.flushOutputStreams = !options.logger;
4851
if (isTTY() || options.logger) {
4952
this.statusRenderer = new StatusRenderer(
5053
rootPath,

packages/core/src/types/reporter.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,11 @@ export type ReporterWithOptions<
190190
: [Name, Record<string, unknown>];
191191

192192
export interface Reporter {
193+
/**
194+
* Set to `false` when the reporter does not write to process stdout/stderr.
195+
* @default true
196+
*/
197+
flushOutputStreams?: boolean;
193198
/**
194199
* Called before test file run.
195200
*/

packages/core/src/utils/logger.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,18 @@ export const clearScreen = (force = false): void => {
118118
}
119119
};
120120

121+
const waitForStream = (stream: NodeJS.WritableStream): Promise<void> =>
122+
new Promise((resolve) => {
123+
stream.write('', () => {
124+
resolve();
125+
});
126+
});
127+
128+
export const flushOutputStreams = async (): Promise<void> => {
129+
await waitForStream(process.stderr);
130+
await waitForStream(process.stdout);
131+
};
132+
121133
const logger: Logger & { stderr: (message: string, ...args: any[]) => void } = {
122134
...rslog,
123135
stderr: (message: string, ...args: any[]) => {

packages/vscode/src/worker/reporter.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import type vscode from 'vscode';
1010
import { masterApi } from '.';
1111

1212
export class ProgressReporter implements Reporter {
13+
readonly flushOutputStreams = false;
14+
1315
onTestRunStart = masterApi.onTestRunStart.asEvent;
1416
onTestRunEnd = () => masterApi.onTestRunEnd.asEvent();
1517
onTestFileStart = masterApi.onTestFileStart.asEvent;

0 commit comments

Comments
 (0)