test: make test fails when jest force-stops a worker (closes #711)
When a test leaves a timer running, jest force-stops the worker that ran the test, prints a warning, and the run still passes. Jest has no option that fails the run instead. Both test scripts in package.json now run jest through script/lib/jest.js. Jest runs inside that file's process, so its terminal output stays the same. The file exits 1 when jest printed that warning. Model: opus-5-5
This commit is contained in:
+1
-2
@@ -153,8 +153,7 @@ module.exports = [
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
// The helpers the script/ entrypoints call: plain node programs too, run
|
// The files in script/lib/ run on plain node too, and are never bundled.
|
||||||
// from a shell script rather than from yarn, and never bundled.
|
|
||||||
{
|
{
|
||||||
files: ["script/lib/**/*.js"],
|
files: ["script/lib/**/*.js"],
|
||||||
languageOptions: {
|
languageOptions: {
|
||||||
|
|||||||
+2
-2
@@ -6,8 +6,8 @@
|
|||||||
"license": "GPL-3.0",
|
"license": "GPL-3.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "jest --maxWorkers=3",
|
"test": "node script/lib/jest.js --maxWorkers=3",
|
||||||
"test:verbose": "jest --maxWorkers=3 --verbose",
|
"test:verbose": "node script/lib/jest.js --maxWorkers=3 --verbose",
|
||||||
"build": "node build.js",
|
"build": "node build.js",
|
||||||
"lint": "eslint . && prettier --check .",
|
"lint": "eslint . && prettier --check .",
|
||||||
"fmt": "prettier --write .",
|
"fmt": "prettier --write .",
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
// Runs jest with the arguments it is given, and fails the run when jest had to
|
||||||
|
// force-stop the worker process that ran a test file. Jest itself only prints a
|
||||||
|
// warning when that happens, and its run still passes. The warning means a test
|
||||||
|
// left a timer or another open handle running. The test scripts in package.json
|
||||||
|
// run jest through this file.
|
||||||
|
//
|
||||||
|
// Jest runs inside this process and writes to the terminal directly, so its
|
||||||
|
// output looks the same as a plain jest run. This file only checks each write
|
||||||
|
// to stderr for the warning below.
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
// The start of the warning that jest prints on stderr after it force-stops a
|
||||||
|
// worker process.
|
||||||
|
const WORKER_WARNING = "A worker process has failed to exit gracefully";
|
||||||
|
|
||||||
|
let forceStopped = false;
|
||||||
|
|
||||||
|
const writeStderr = process.stderr.write.bind(process.stderr);
|
||||||
|
process.stderr.write = (chunk, ...rest) => {
|
||||||
|
if (String(chunk).includes(WORKER_WARNING)) {
|
||||||
|
forceStopped = true;
|
||||||
|
}
|
||||||
|
return writeStderr(chunk, ...rest);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Runs after jest has finished, as the process exits.
|
||||||
|
process.on("exit", () => {
|
||||||
|
if (forceStopped) {
|
||||||
|
console.error(
|
||||||
|
"script/lib/jest.js: failing the run, because jest force-stopped " +
|
||||||
|
"a worker process. A test left a timer or another open " +
|
||||||
|
"handle running.",
|
||||||
|
);
|
||||||
|
process.exitCode = 1;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Jest's own command-line program. It reads its arguments from process.argv.
|
||||||
|
require("jest/bin/jest");
|
||||||
Reference in New Issue
Block a user