Skip to content

Commit 26ce88d

Browse files
authored
fix(pool): assign envs before running tests to keep in sync with process.env (#8769)
1 parent 1a290f8 commit 26ce88d

File tree

7 files changed

+50
-15
lines changed

7 files changed

+50
-15
lines changed

packages/vitest/src/node/pool.ts

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ export function createPool(ctx: Vitest): ProcessPool {
8989
const environments = await getSpecificationsEnvironments(specs)
9090
const groups = groupSpecs(sorted)
9191

92+
const projectEnvs = new WeakMap<TestProject, Partial<NodeJS.ProcessEnv>>()
93+
const projectExecArgvs = new WeakMap<TestProject, string[]>()
94+
9295
for (const group of groups) {
9396
if (!group) {
9497
continue
@@ -114,6 +117,33 @@ export function createPool(ctx: Vitest): ProcessPool {
114117
throw new Error(`Cannot find the environment. This is a bug in Vitest.`)
115118
}
116119

120+
let env = projectEnvs.get(project)
121+
if (!env) {
122+
env = {
123+
...process.env,
124+
...options.env,
125+
...ctx.config.env,
126+
...project.config.env,
127+
}
128+
129+
// env are case-insensitive on Windows, but spawned processes don't support it
130+
if (isWindows) {
131+
for (const name in env) {
132+
env[name.toUpperCase()] = env[name]
133+
}
134+
}
135+
projectEnvs.set(project, env)
136+
}
137+
138+
let execArgv = projectExecArgvs.get(project)
139+
if (!execArgv) {
140+
execArgv = [
141+
...options.execArgv,
142+
...project.config.execArgv,
143+
]
144+
projectExecArgvs.set(project, execArgv)
145+
}
146+
117147
taskGroup.push({
118148
context: {
119149
pool,
@@ -126,8 +156,8 @@ export function createPool(ctx: Vitest): ProcessPool {
126156
workerId: workerId++,
127157
},
128158
project,
129-
env: { ...options.env, ...project.config.env },
130-
execArgv: [...options.execArgv, ...project.config.execArgv],
159+
env,
160+
execArgv,
131161
worker: pool,
132162
isolate: project.config.isolate,
133163
memoryLimit: getMemoryLimit(ctx.config, pool) ?? null,
@@ -250,18 +280,9 @@ function resolveOptions(ctx: Vitest) {
250280
NODE_ENV: process.env.NODE_ENV || 'test',
251281
VITEST_MODE: ctx.config.watch ? 'WATCH' : 'RUN',
252282
FORCE_TTY: isatty(1) ? 'true' : '',
253-
...process.env,
254-
...ctx.config.env,
255283
},
256284
}
257285

258-
// env are case-insensitive on Windows, but spawned processes don't support it
259-
if (isWindows) {
260-
for (const name in options.env) {
261-
options.env[name.toUpperCase()] = options.env[name]
262-
}
263-
}
264-
265286
return options
266287
}
267288

packages/vitest/src/node/pools/types.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,15 @@ export interface PoolTask {
4141
worker: 'forks' | 'threads' | 'vmForks' | 'vmThreads' | (string & {})
4242
project: TestProject
4343
isolate: boolean
44+
/**
45+
* Custom `process.env`. All tasks in the same project will reference the same object,
46+
* so modifying it once will modify it for every task.
47+
*/
4448
env: Partial<NodeJS.ProcessEnv>
49+
/**
50+
* Custom `execArgv`. All tasks in the same project will reference the same array,
51+
* so modifying it once will modify it for every task.
52+
*/
4553
execArgv: string[]
4654
context: ContextRPC
4755
memoryLimit: number | null

packages/vitest/src/node/pools/workers/vmForksWorker.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ export class VmForksPoolWorker extends ForksPoolWorker {
99
protected readonly entrypoint: string
1010

1111
constructor(options: PoolOptions) {
12-
super(options)
13-
this.execArgv.push('--experimental-vm-modules')
12+
super({ ...options, execArgv: [...options.execArgv, '--experimental-vm-modules'] })
1413

1514
/** Loads {@link file://./../../../runtime/workers/vmForks.ts} */
1615
this.entrypoint = resolve(options.distPath, 'workers/vmForks.js')

packages/vitest/src/node/pools/workers/vmThreadsWorker.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ export class VmThreadsPoolWorker extends ThreadsPoolWorker {
99
protected readonly entrypoint: string
1010

1111
constructor(options: PoolOptions) {
12-
super(options)
13-
this.execArgv.push('--experimental-vm-modules')
12+
super({ ...options, execArgv: [...options.execArgv, '--experimental-vm-modules'] })
1413

1514
/** Loads {@link file://./../../../runtime/workers/vmThreads.ts} */
1615
this.entrypoint = resolve(options.distPath, 'workers/vmThreads.js')
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export default () => {
2+
process.env.NEW_VALUE = 'true'
3+
}

test/global-setup/test/setup-files.test.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,7 @@ test('setup file has been loaded without relative path prefix', () => {
1111
const result = loaded
1212
expect(result).toBeTruthy()
1313
})
14+
15+
test('the process.env is injected correctly', () => {
16+
expect(process.env.NEW_VALUE).toBe('true')
17+
})

test/global-setup/vitest.config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export default defineConfig({
2020
'./globalSetup/named-exports.js',
2121
'./globalSetup/ts-with-imports.ts',
2222
'./globalSetup/another-vite-instance.ts',
23+
'./globalSetup/update-env.ts',
2324
],
2425
},
2526
})

0 commit comments

Comments
 (0)