From a02e8c669505178bbea1acbe516df8d3a1bb6c86 Mon Sep 17 00:00:00 2001 From: Khafra Date: Thu, 26 Jan 2023 02:32:25 -0500 Subject: [PATCH] wpt: make runner more resilient (#1884) * wpt: make runner more resilient * wpt: cleaner exit, hopefully --- package.json | 2 +- test/wpt/runner/runner/runner.mjs | 13 ++++++++++--- test/wpt/server/server.mjs | 2 +- test/wpt/start-FileAPI.mjs | 8 +++++--- test/wpt/start-fetch.mjs | 8 +++++--- test/wpt/start-mimesniff.mjs | 8 +++++--- test/wpt/start-websockets.mjs | 4 ++-- 7 files changed, 29 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index 9c4d7dae93b..d84e47a9722 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "test:tdd": "tap test/*.js test/diagnostics-channel/*.js -w", "test:typescript": "tsd && tsc test/imports/undici-import.ts", "test:websocket": "node scripts/verifyVersion.js 18 || tap test/websocket/*.js", - "test:wpt": "node scripts/verifyVersion 18 || (node test/wpt/start-fetch.mjs && node test/wpt/start-FileAPI.mjs && node test/wpt/start-mimesniff.mjs && node test/wpt/start-xhr.mjs && node test/wpt/start-websockets.mjs)", + "test:wpt": "node scripts/verifyVersion 18 || (node test/wpt/start-fetch.mjs && node test/wpt/start-FileAPI.mjs && node test/wpt/start-mimesniff.mjs && node test/wpt/start-xhr.mjs && node --no-warnings test/wpt/start-websockets.mjs)", "coverage": "nyc --reporter=text --reporter=html npm run test", "coverage:ci": "nyc --reporter=lcov npm run test", "bench": "PORT=3042 concurrently -k -s first npm:bench:server npm:bench:run", diff --git a/test/wpt/runner/runner/runner.mjs b/test/wpt/runner/runner/runner.mjs index da5cb96899c..3e558de3e0b 100644 --- a/test/wpt/runner/runner/runner.mjs +++ b/test/wpt/runner/runner/runner.mjs @@ -1,6 +1,7 @@ import { deepStrictEqual } from 'node:assert' -import { EventEmitter } from 'node:events' +import { EventEmitter, once } from 'node:events' import { readdirSync, readFileSync, statSync } from 'node:fs' +import { cpus } from 'node:os' import { basename, isAbsolute, join, resolve } from 'node:path' import { fileURLToPath } from 'node:url' import { Worker } from 'node:worker_threads' @@ -82,10 +83,11 @@ export class WPTRunner extends EventEmitter { return [...files] } - run () { + async run () { const workerPath = fileURLToPath(join(import.meta.url, '../worker.mjs')) /** @type {Set} */ const activeWorkers = new Set() + let finishedFiles = 0 for (const test of this.#files) { const code = test.includes('.sub.') @@ -95,6 +97,7 @@ export class WPTRunner extends EventEmitter { if (this.#status[basename(test)]?.skip) { this.#stats.skipped += 1 + finishedFiles++ continue } @@ -131,10 +134,14 @@ export class WPTRunner extends EventEmitter { activeWorkers.delete(worker) clearTimeout(timeout) - if (activeWorkers.size === 0) { + if (++finishedFiles === this.#files.length) { this.handleRunnerCompletion() } }) + + if (activeWorkers.size === cpus().length) { + await once(worker, 'exit') + } } } diff --git a/test/wpt/server/server.mjs b/test/wpt/server/server.mjs index 13b8856a1f4..9df64e75010 100644 --- a/test/wpt/server/server.mjs +++ b/test/wpt/server/server.mjs @@ -354,7 +354,7 @@ send({ server: `http://localhost:${server.address().port}` }) process.on('message', (message) => { if (message === 'shutdown') { - server.close((err) => err ? send(err) : send({ message: 'shutdown' })) + server.close((err) => process.exit(err ? 1 : 0)) } }) diff --git a/test/wpt/start-FileAPI.mjs b/test/wpt/start-FileAPI.mjs index e601afc1120..fc85158ae13 100644 --- a/test/wpt/start-FileAPI.mjs +++ b/test/wpt/start-FileAPI.mjs @@ -10,15 +10,17 @@ const child = fork(serverPath, [], { stdio: ['pipe', 'pipe', 'pipe', 'ipc'] }) +child.on('exit', (code) => process.exit(code)) + for await (const [message] of on(child, 'message')) { if (message.server) { const runner = new WPTRunner('FileAPI', message.server) runner.run() runner.once('completion', () => { - child.send('shutdown') + if (child.connected) { + child.send('shutdown') + } }) - } else if (message.message === 'shutdown') { - process.exit() } } diff --git a/test/wpt/start-fetch.mjs b/test/wpt/start-fetch.mjs index 55d3f2e53ae..dbf66af59b8 100644 --- a/test/wpt/start-fetch.mjs +++ b/test/wpt/start-fetch.mjs @@ -10,15 +10,17 @@ const child = fork(serverPath, [], { stdio: ['pipe', 'pipe', 'pipe', 'ipc'] }) +child.on('exit', (code) => process.exit(code)) + for await (const [message] of on(child, 'message')) { if (message.server) { const runner = new WPTRunner('fetch', message.server) runner.run() runner.once('completion', () => { - child.send('shutdown') + if (child.connected) { + child.send('shutdown') + } }) - } else if (message.message === 'shutdown') { - process.exit() } } diff --git a/test/wpt/start-mimesniff.mjs b/test/wpt/start-mimesniff.mjs index 90e6bdd6c04..396e93dfa9a 100644 --- a/test/wpt/start-mimesniff.mjs +++ b/test/wpt/start-mimesniff.mjs @@ -10,15 +10,17 @@ const child = fork(serverPath, [], { stdio: ['pipe', 'pipe', 'pipe', 'ipc'] }) +child.on('exit', (code) => process.exit(code)) + for await (const [message] of on(child, 'message')) { if (message.server) { const runner = new WPTRunner('mimesniff', message.server) runner.run() runner.once('completion', () => { - child.send('shutdown') + if (child.connected) { + child.send('shutdown') + } }) - } else if (message.message === 'shutdown') { - process.exit() } } diff --git a/test/wpt/start-websockets.mjs b/test/wpt/start-websockets.mjs index a7078c6d8d3..603c2f31681 100644 --- a/test/wpt/start-websockets.mjs +++ b/test/wpt/start-websockets.mjs @@ -10,6 +10,8 @@ const child = fork(serverPath, [], { stdio: ['pipe', 'pipe', 'pipe', 'ipc'] }) +child.on('exit', (code) => process.exit(code)) + for await (const [message] of on(child, 'message')) { if (message.server) { const runner = new WPTRunner('websockets', message.server) @@ -20,7 +22,5 @@ for await (const [message] of on(child, 'message')) { child.send('shutdown') } }) - } else if (message.message === 'shutdown') { - process.exit() } }