fix incomplete coverage reports on macos (#212639)

* eng: fix incomplete coverage reports on macos

Wait for stdout to drain before exiting

* better fix
This commit is contained in:
Connor Peet 2024-05-13 15:27:00 -07:00 committed by GitHub
parent 39fc2dfefa
commit 358a3a65d3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 31 additions and 20 deletions

View File

@ -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);
});
}
});

View File

@ -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,