From 358a3a65d3ed4d1fa6f86f918dcda293a9e7096e Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Mon, 13 May 2024 15:27:00 -0700 Subject: [PATCH] fix incomplete coverage reports on macos (#212639) * eng: fix incomplete coverage reports on macos Wait for stdout to drain before exiting * better fix --- test/unit/electron/index.js | 25 ++++++++++++++++--------- test/unit/fullJsonStreamReporter.js | 26 +++++++++++++++----------- 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/test/unit/electron/index.js b/test/unit/electron/index.js index 908fb2de97d..09f573713a9 100644 --- a/test/unit/electron/index.js +++ b/test/unit/electron/index.js @@ -315,14 +315,18 @@ app.on('ready', () => { } }); + const reporters = []; + if (args.tfs) { - new mocha.reporters.Spec(runner); - new MochaJUnitReporter(runner, { - reporterOptions: { - testsuitesTitle: `${args.tfs} ${process.platform}`, - mochaFile: process.env.BUILD_ARTIFACTSTAGINGDIRECTORY ? path.join(process.env.BUILD_ARTIFACTSTAGINGDIRECTORY, `test-results/${process.platform}-${process.arch}-${args.tfs.toLowerCase().replace(/[^\w]/g, '-')}-results.xml`) : undefined - } - }); + reporters.push( + new mocha.reporters.Spec(runner), + new MochaJUnitReporter(runner, { + reporterOptions: { + testsuitesTitle: `${args.tfs} ${process.platform}`, + mochaFile: process.env.BUILD_ARTIFACTSTAGINGDIRECTORY ? path.join(process.env.BUILD_ARTIFACTSTAGINGDIRECTORY, `test-results/${process.platform}-${process.arch}-${args.tfs.toLowerCase().replace(/[^\w]/g, '-')}-results.xml`) : undefined + } + }), + ); } else { // mocha patches symbols to use windows escape codes, but it seems like // Electron mangles these in its output. @@ -334,10 +338,13 @@ app.on('ready', () => { }); } - applyReporter(runner, args); + reporters.push(applyReporter(runner, args)); } if (!args.dev) { - ipcMain.on('all done', () => app.exit(runner.didFail ? 1 : 0)); + ipcMain.on('all done', async () => { + await Promise.all(reporters.map(r => r.drain?.())); + app.exit(runner.didFail ? 1 : 0); + }); } }); diff --git a/test/unit/fullJsonStreamReporter.js b/test/unit/fullJsonStreamReporter.js index a130a36bf37..7b345ea70fb 100644 --- a/test/unit/fullJsonStreamReporter.js +++ b/test/unit/fullJsonStreamReporter.js @@ -26,15 +26,15 @@ module.exports = class FullJsonStreamReporter extends BaseRunner { super(runner, options); const total = runner.total; - runner.once(EVENT_RUN_BEGIN, () => writeEvent(['start', { total }])); - runner.once(EVENT_RUN_END, () => writeEvent(['end', this.stats])); + runner.once(EVENT_RUN_BEGIN, () => this.writeEvent(['start', { total }])); + runner.once(EVENT_RUN_END, () => this.writeEvent(['end', this.stats])); // custom coverage events: - runner.on('coverage init', (c) => writeEvent(['coverageInit', c])); - runner.on('coverage increment', (context, coverage) => writeEvent(['coverageIncrement', { ...context, coverage }])); + runner.on('coverage init', (c) => this.writeEvent(['coverageInit', c])); + runner.on('coverage increment', (context, coverage) => this.writeEvent(['coverageIncrement', { ...context, coverage }])); - runner.on(EVENT_TEST_BEGIN, test => writeEvent(['testStart', clean(test)])); - runner.on(EVENT_TEST_PASS, test => writeEvent(['pass', clean(test)])); + runner.on(EVENT_TEST_BEGIN, test => this.writeEvent(['testStart', clean(test)])); + runner.on(EVENT_TEST_PASS, test => this.writeEvent(['pass', clean(test)])); runner.on(EVENT_TEST_FAIL, (test, err) => { test = clean(test); test.actual = err.actual; @@ -44,14 +44,18 @@ module.exports = class FullJsonStreamReporter extends BaseRunner { test.snapshotPath = err.snapshotPath; test.err = err.message; test.stack = err.stack || null; - writeEvent(['fail', test]); + this.writeEvent(['fail', test]); }); } -}; -function writeEvent(event) { - process.stdout.write(JSON.stringify(event) + '\n'); -} + drain() { + return Promise.resolve(this.lastEvent); + } + + writeEvent(event) { + this.lastEvent = new Promise(r => process.stdout.write(JSON.stringify(event) + '\n', r)); + } +}; const clean = test => ({ title: test.title,