From 3e65ef35cfe2a91a1943c256c49b3127f39db6b0 Mon Sep 17 00:00:00 2001 From: Thomas Scholtes Date: Mon, 4 Apr 2022 22:56:57 +0200 Subject: [PATCH] fix: wait for worker to be ready before initializing (#13270) fix: wait for worker to be ready before initializing The test dispatcher waits until a worker is ready before sending the `init` message. This guarantees that the worker process is listening for the message. Otherwise, the worker process might miss the `init` message and the subsequent `run` message would crash the worker. --- packages/playwright-test/src/dispatcher.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/playwright-test/src/dispatcher.ts b/packages/playwright-test/src/dispatcher.ts index b7c1907646..65c155ed28 100644 --- a/packages/playwright-test/src/dispatcher.ts +++ b/packages/playwright-test/src/dispatcher.ts @@ -466,6 +466,7 @@ class Worker extends EventEmitter { private _didSendStop = false; private _didFail = false; private didExit = false; + private _ready: Promise; constructor(hash: string, parallelIndex: number) { super(); @@ -494,9 +495,15 @@ class Worker extends EventEmitter { const { method, params } = message; this.emit(method, params); }); + + this._ready = new Promise((resolve, reject) => { + this.process.once('exit', () => reject(new Error('worker exited before it became ready'))); + this.once('ready', () => resolve()); + }); } async init(testGroup: TestGroup, loaderData: SerializedLoaderData) { + await this._ready; const params: WorkerInitParams = { workerIndex: this.workerIndex, parallelIndex: this.parallelIndex, @@ -505,7 +512,6 @@ class Worker extends EventEmitter { loader: loaderData, }; this.send({ method: 'init', params }); - await new Promise(f => this.process.once('message', f)); // Ready ack } run(testGroup: TestGroup) {