Skip to content

Commit

Permalink
feat: allow percent value in poolOptions too
Browse files Browse the repository at this point in the history
  • Loading branch information
syi0808 committed Jun 30, 2024
1 parent 2022340 commit b81b684
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 18 deletions.
67 changes: 54 additions & 13 deletions packages/vitest/src/node/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import {
} from '../constants'
import { benchmarkConfigDefaults, configDefaults } from '../defaults'
import { isCI, stdProvider, toArray } from '../utils'
import type { BuiltinPool } from '../types/pool-options'
import type { BuiltinPool, ForksOptions, PoolOptions, ThreadsOptions } from '../types/pool-options'
import { getWorkersCountByPercentage } from '../utils/workers'
import { VitestCache } from './cache'
import { BaseSequencer } from './sequencers/BaseSequencer'
Expand Down Expand Up @@ -98,6 +98,15 @@ export function resolveApiServerConfig<Options extends ApiConfig & UserConfig>(
return api
}

function resolveInlineWorkerOption(value: string | number): number {
if (typeof value === 'string' && value.trim().endsWith('%')) {
return getWorkersCountByPercentage(value)
}
else {
return Number(value)
}
}

export function resolveConfig(
mode: VitestRunMode,
options: UserConfig,
Expand Down Expand Up @@ -177,21 +186,11 @@ export function resolveConfig(
}

if (resolved.maxWorkers) {
if (typeof options.maxWorkers === 'string' && options.maxWorkers.trim().endsWith('%')) {
resolved.maxWorkers = getWorkersCountByPercentage(options.maxWorkers)
}
else {
resolved.maxWorkers = Number(resolved.maxWorkers)
}
resolved.maxWorkers = resolveInlineWorkerOption(resolved.maxWorkers)
}

if (resolved.minWorkers) {
if (typeof options.minWorkers === 'string' && options.minWorkers.trim().endsWith('%')) {
resolved.minWorkers = getWorkersCountByPercentage(options.minWorkers)
}
else {
resolved.minWorkers = Number(resolved.minWorkers)
}
resolved.minWorkers = resolveInlineWorkerOption(resolved.minWorkers)
}

resolved.browser ??= {} as any
Expand Down Expand Up @@ -447,6 +446,48 @@ export function resolveConfig(
}
}

const poolThreadsOptions = [
['threads', 'minThreads'],
['threads', 'maxThreads'],
['vmThreads', 'minThreads'],
['vmThreads', 'maxThreads'],
] satisfies [keyof PoolOptions, keyof ThreadsOptions][]

for (const [poolOptionKey, workerOptionKey] of poolThreadsOptions) {
const workerInlineOption = resolved.poolOptions?.[poolOptionKey]?.[workerOptionKey]

if (workerInlineOption) {
resolved.poolOptions = {
...resolved.poolOptions,
[poolOptionKey]: {
...resolved.poolOptions?.[poolOptionKey],
[workerOptionKey]: resolveInlineWorkerOption(workerInlineOption),
},
}
}
}

const poolForksOptions = [
['forks', 'minForks'],
['forks', 'maxForks'],
['vmForks', 'minForks'],
['vmForks', 'maxForks'],
] satisfies [keyof PoolOptions, keyof ForksOptions][]

for (const [poolOptionKey, workerOptionKey] of poolForksOptions) {
const workerInlineOption = resolved.poolOptions?.[poolOptionKey]?.[workerOptionKey]

if (workerInlineOption) {
resolved.poolOptions = {
...resolved.poolOptions,
[poolOptionKey]: {
...resolved.poolOptions?.[poolOptionKey],
[workerOptionKey]: resolveInlineWorkerOption(workerInlineOption),
},
}
}
}

if (resolved.workspace) {
// if passed down from the CLI and it's relative, resolve relative to CWD
resolved.workspace
Expand Down
10 changes: 5 additions & 5 deletions packages/vitest/src/types/pool-options.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ export type BuiltinPool =
| 'typescript'
export type Pool = BuiltinPool | (string & {})

export interface PoolOptions extends Record<string, unknown> {
export interface PoolOptions {
/**
* Run tests in `node:worker_threads`.
*
Expand Down Expand Up @@ -44,10 +44,10 @@ export interface PoolOptions extends Record<string, unknown> {

export interface ThreadsOptions {
/** Minimum amount of threads to use */
minThreads?: number
minThreads?: number | string

/** Maximum amount of threads to use */
maxThreads?: number
maxThreads?: number | string

/**
* Run tests inside a single thread.
Expand All @@ -68,10 +68,10 @@ export interface ThreadsOptions {

export interface ForksOptions {
/** Minimum amount of child processes to use */
minForks?: number
minForks?: number | string

/** Maximum amount of child processes to use */
maxForks?: number
maxForks?: number | string

/**
* Run tests inside a single fork.
Expand Down
21 changes: 21 additions & 0 deletions test/config/test/workers-option.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,24 @@ test('workers percent argument should not throw error', async () => {

expect(stderr).toBe('')
})

test.each([
{ poolOption: 'threads' },
{ poolOption: 'vmThreads' },
{ poolOption: 'forks' },
{ poolOption: 'vmForks' },
] as const)('workers percent argument in $poolOption should not throw error', async ({ poolOption }) => {
let workerOptions = {}

if (poolOption.toLowerCase().includes('threads')) {
workerOptions = { maxThreads: '100%', minThreads: '10%' }
}

if (poolOption.toLowerCase().includes('forks')) {
workerOptions = { maxForks: '100%', minForks: '10%' }
}

const { stderr } = await runVitest({ poolOptions: { [poolOption]: workerOptions } })

expect(stderr).toBe('')
})

0 comments on commit b81b684

Please sign in to comment.