diff --git a/package.json b/package.json index b61275e..2080619 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,8 @@ "license": "GPL-3.0", "private": true, "scripts": { - "test": "jest --maxWorkers=3", - "test:verbose": "jest --maxWorkers=3 --verbose", + "test": "node script/lib/jest.js --maxWorkers=3", + "test:verbose": "node script/lib/jest.js --maxWorkers=3 --verbose", "build": "node build.js", "lint": "eslint . && prettier --check .", "fmt": "prettier --write .", diff --git a/script/lib/jest.js b/script/lib/jest.js new file mode 100644 index 0000000..1aa0511 --- /dev/null +++ b/script/lib/jest.js @@ -0,0 +1,33 @@ +// Runs jest with the arguments it is given, and fails the run when jest had to +// force-stop a worker. 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. + +"use strict"; + +const { spawn } = require("child_process"); + +// The start of the warning that jest prints on stderr after it force-stops a +// worker. +const WORKER_WARNING = "A worker process has failed to exit gracefully"; + +const jest = spawn("jest", process.argv.slice(2), { + stdio: ["inherit", "inherit", "pipe"], +}); + +let stderr = ""; +jest.stderr.on("data", (chunk) => { + process.stderr.write(chunk); + stderr += chunk; +}); + +jest.on("close", (code) => { + if (stderr.includes(WORKER_WARNING)) { + console.error( + "script/lib/jest.js: failing the run, because jest force-stopped " + + "a worker. A test left a timer or another open handle running.", + ); + process.exit(1); + } + process.exit(code ?? 1); +});