Skip to content

Commit a939779

Browse files
authoredOct 16, 2024··
fix(browser): increment browser port automatically if there are several projects with browser.enabled (#6717)
1 parent da6d2ea commit a939779

File tree

8 files changed

+75
-6
lines changed

8 files changed

+75
-6
lines changed
 

‎.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,5 @@ docs/.vitepress/cache/
2626
!test/cli/fixtures/dotted-files/**/.cache
2727
test/**/__screenshots__/**/*
2828
test/browser/fixtures/update-snapshot/basic.test.ts
29+
test/cli/fixtures/browser-multiple/basic-*
2930
.vitest-reports

‎packages/browser/src/node/plugin.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import type { WorkspaceProject } from 'vitest/node'
88
import { getFilePoolName, resolveApiServerConfig, resolveFsAllow, distDir as vitestDist } from 'vitest/node'
99
import { type Plugin, coverageConfigDefaults } from 'vitest/config'
1010
import { toArray } from '@vitest/utils'
11-
import { defaultBrowserPort } from 'vitest/config'
1211
import { dynamicImportPlugin } from '@vitest/mocker/node'
1312
import MagicString from 'magic-string'
1413
import BrowserContext from './plugins/pluginContext'
@@ -328,14 +327,16 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
328327
viteConfig.esbuild.legalComments = 'inline'
329328
}
330329

330+
const defaultPort = project.ctx._browserLastPort++
331+
331332
const api = resolveApiServerConfig(
332333
viteConfig.test?.browser || {},
333-
defaultBrowserPort,
334+
defaultPort,
334335
)
335336

336337
viteConfig.server = {
337338
...viteConfig.server,
338-
port: defaultBrowserPort,
339+
port: defaultPort,
339340
...api,
340341
middlewareMode: false,
341342
open: false,

‎packages/vitest/src/node/core.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { noop, slash, toArray } from '@vitest/utils'
1212
import { getTasks, hasFailed } from '@vitest/runner/utils'
1313
import { version } from '../../package.json' with { type: 'json' }
1414
import { getCoverageProvider } from '../integrations/coverage'
15-
import { workspacesFiles as workspaceFiles } from '../constants'
15+
import { defaultBrowserPort, workspacesFiles as workspaceFiles } from '../constants'
1616
import { WebSocketReporter } from '../api/setup'
1717
import type { SerializedCoverageConfig } from '../runtime/config'
1818
import type { ArgumentsType, OnServerRestartHandler, ProvidedContext, UserConsoleLog } from '../types/general'
@@ -87,6 +87,9 @@ export class Vitest {
8787
/** @deprecated use `_cachedSpecs` */
8888
projectTestFiles = this._cachedSpecs
8989

90+
/** @private */
91+
public _browserLastPort = defaultBrowserPort
92+
9093
constructor(
9194
public readonly mode: VitestRunMode,
9295
options: VitestOptions = {},
@@ -104,6 +107,7 @@ export class Vitest {
104107
this.unregisterWatcher?.()
105108
clearTimeout(this._rerunTimer)
106109
this.restartsCount += 1
110+
this._browserLastPort = defaultBrowserPort
107111
this.pool?.close?.()
108112
this.pool = undefined
109113
this.coverageProvider = undefined
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"name": "browser-multiple"
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { resolve } from 'pathe';
2+
import { defineWorkspace } from 'vitest/config';
3+
4+
export default defineWorkspace([
5+
{
6+
cacheDir: resolve(import.meta.dirname, 'basic-1'),
7+
test: {
8+
name: 'basic-1',
9+
include: ['none'],
10+
browser: {
11+
enabled: true,
12+
name: 'chromium',
13+
provider: 'playwright',
14+
headless: true,
15+
}
16+
}
17+
},
18+
{
19+
cacheDir: resolve(import.meta.dirname, 'basic-2'),
20+
test: {
21+
name: 'basic-2',
22+
include: ['none'],
23+
browser: {
24+
enabled: true,
25+
name: 'chromium',
26+
provider: 'playwright',
27+
headless: true,
28+
}
29+
}
30+
},
31+
])
+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { resolve } from 'pathe'
2+
import { expect, it, onTestFinished, vi } from 'vitest'
3+
4+
import { runVitest } from '../../test-utils'
5+
6+
it('automatically assigns the port', async () => {
7+
const root = resolve(import.meta.dirname, '../fixtures/browser-multiple')
8+
const workspace = resolve(import.meta.dirname, '../fixtures/browser-multiple/vitest.workspace.ts')
9+
const spy = vi.spyOn(console, 'log')
10+
onTestFinished(() => spy.mockRestore())
11+
const { stderr, stdout } = await runVitest({
12+
root,
13+
workspace,
14+
dir: root,
15+
watch: false,
16+
})
17+
18+
expect(spy).not.toHaveBeenCalled()
19+
expect(stderr).not.toContain('is in use, trying another one...')
20+
expect(stdout).toContain('Browser runner started by playwright at http://localhost:63315/')
21+
expect(stdout).toContain('Browser runner started by playwright at http://localhost:63316/')
22+
})

‎test/cli/vitest.config.ts

+7
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,11 @@ export default defineConfig({
1414
truncateThreshold: 999,
1515
},
1616
},
17+
server: {
18+
watch: {
19+
ignored: [
20+
'**/fixtures/browser-multiple/**/*',
21+
],
22+
},
23+
},
1724
})

‎test/test-utils/index.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import { Readable, Writable } from 'node:stream'
22
import fs from 'node:fs'
33
import { fileURLToPath } from 'node:url'
44
import type { UserConfig as ViteUserConfig } from 'vite'
5-
import { type UserConfig, type VitestRunMode, type WorkerGlobalState, afterEach, onTestFinished } from 'vitest'
6-
import type { Vitest } from 'vitest/node'
5+
import { type WorkerGlobalState, afterEach, onTestFinished } from 'vitest'
6+
import type { UserConfig, Vitest, VitestRunMode } from 'vitest/node'
77
import { startVitest } from 'vitest/node'
88
import type { Options } from 'tinyexec'
99
import { x } from 'tinyexec'

0 commit comments

Comments
 (0)
Please sign in to comment.