Skip to content

Commit 7102eb0

Browse files
authored
wpt: run tests in parallel (2.5x speed improvement) (nodejs#1714)
1 parent 145358d commit 7102eb0

File tree

1 file changed

+27
-12
lines changed

1 file changed

+27
-12
lines changed

test/wpt/runner/runner/runner.mjs

+27-12
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { EventEmitter, once } from 'node:events'
1+
import { EventEmitter } from 'node:events'
22
import { readdirSync, readFileSync, statSync } from 'node:fs'
33
import { basename, isAbsolute, join, resolve } from 'node:path'
44
import { fileURLToPath } from 'node:url'
@@ -77,8 +77,10 @@ export class WPTRunner extends EventEmitter {
7777
return [...files]
7878
}
7979

80-
async run () {
80+
run () {
8181
const workerPath = fileURLToPath(join(import.meta.url, '../worker.mjs'))
82+
/** @type {Set<Worker>} */
83+
const activeWorkers = new Set()
8284

8385
for (const test of this.#files) {
8486
const code = test.includes('.sub.')
@@ -99,6 +101,8 @@ export class WPTRunner extends EventEmitter {
99101
}
100102
})
101103

104+
activeWorkers.add(worker)
105+
102106
worker.on('message', (message) => {
103107
if (message.type === 'result') {
104108
this.handleIndividualTestCompletion(message, basename(test))
@@ -107,17 +111,14 @@ export class WPTRunner extends EventEmitter {
107111
}
108112
})
109113

110-
await once(worker, 'exit')
111-
}
114+
worker.once('exit', () => {
115+
activeWorkers.delete(worker)
112116

113-
this.emit('completion')
114-
const { completed, failed, success, expectedFailures } = this.#stats
115-
console.log(
116-
`[${this.#folderName}]: ` +
117-
`Completed: ${completed}, failed: ${failed}, success: ${success}, ` +
118-
`expected failures: ${expectedFailures}, ` +
119-
`unexpected failures: ${failed - expectedFailures}`
120-
)
117+
if (activeWorkers.size === 0) {
118+
this.handleRunnerCompletion()
119+
}
120+
})
121+
}
121122
}
122123

123124
/**
@@ -156,6 +157,20 @@ export class WPTRunner extends EventEmitter {
156157
worker.terminate()
157158
}
158159

160+
/**
161+
* Called after every test has completed.
162+
*/
163+
handleRunnerCompletion () {
164+
this.emit('completion')
165+
const { completed, failed, success, expectedFailures } = this.#stats
166+
console.log(
167+
`[${this.#folderName}]: ` +
168+
`Completed: ${completed}, failed: ${failed}, success: ${success}, ` +
169+
`expected failures: ${expectedFailures}, ` +
170+
`unexpected failures: ${failed - expectedFailures}`
171+
)
172+
}
173+
159174
addInitScript (code) {
160175
this.#initScripts.push(code)
161176
}

0 commit comments

Comments
 (0)