From 094e48292c2a22cae4ae7580da3d1c91819287dc Mon Sep 17 00:00:00 2001 From: AriPerkkio Date: Mon, 25 Mar 2024 19:03:04 +0200 Subject: [PATCH] fix: prevent hang when `process` is mocked --- packages/vitest/src/runtime/workers/utils.ts | 8 ++++++-- test/core/test/mocked-process.test.ts | 7 +++++++ 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 test/core/test/mocked-process.test.ts diff --git a/packages/vitest/src/runtime/workers/utils.ts b/packages/vitest/src/runtime/workers/utils.ts index 9ffbf2b4983d..bef492bdbc54 100644 --- a/packages/vitest/src/runtime/workers/utils.ts +++ b/packages/vitest/src/runtime/workers/utils.ts @@ -6,6 +6,10 @@ import type { WorkerRpcOptions } from './types' const REGEXP_WRAP_PREFIX = '$$vitest:' +// Store global APIs in case process is overwritten by tests +const processSend = process.send?.bind(process) +const processOn = process.on?.bind(process) + export function createThreadsRpcOptions({ port }: WorkerContext): WorkerRpcOptions { return { post: (v) => { port.postMessage(v) }, @@ -17,9 +21,9 @@ export function createForksRpcOptions(nodeV8: typeof import('v8')): WorkerRpcOpt return { serialize: nodeV8.serialize, deserialize: v => nodeV8.deserialize(Buffer.from(v)), - post(v) { process.send!(v) }, + post(v) { processSend!(v) }, on(fn) { - process.on('message', (message: any, ...extras: any) => { + processOn('message', (message: any, ...extras: any) => { // Do not react on Tinypool's internal messaging if ((message as TinypoolWorkerMessage)?.__tinypool_worker_message__) return diff --git a/test/core/test/mocked-process.test.ts b/test/core/test/mocked-process.test.ts new file mode 100644 index 000000000000..380a8ad72a37 --- /dev/null +++ b/test/core/test/mocked-process.test.ts @@ -0,0 +1,7 @@ +import { expect, it, vi } from 'vitest' + +vi.stubGlobal('process', { badMock: true }) + +it('should not hang', () => { + expect(1).toBe(1) +})