Some checks failed
Test examples / Test Examples (20) (push) Has been cancelled
Test examples / Test Examples (22) (push) Has been cancelled
Lock Threads / action (push) Has been cancelled
Trigger Release / start (push) Has been cancelled
Stale issue handler / stale (push) Has been cancelled
Update Font Data / create-pull-request (push) Has been cancelled
build-and-deploy / deploy-target (push) Has been cancelled
build-and-deploy / build (push) Has been cancelled
build-and-deploy / stable - aarch64-unknown-linux-musl - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-unknown-linux-musl - node@16 (push) Has been cancelled
build-and-deploy / stable - aarch64-unknown-linux-gnu - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-unknown-linux-gnu - node@16 (push) Has been cancelled
build-and-deploy / stable - aarch64-pc-windows-msvc - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-pc-windows-msvc - node@16 (push) Has been cancelled
build-and-deploy / stable - aarch64-apple-darwin - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-apple-darwin - node@16 (push) Has been cancelled
build-and-deploy / build-wasm (nodejs) (push) Has been cancelled
build-and-deploy / build-wasm (web) (push) Has been cancelled
build-and-deploy / Deploy preview tarball (push) Has been cancelled
build-and-deploy / Potentially publish release (push) Has been cancelled
build-and-deploy / publish-turbopack-npm-packages (push) Has been cancelled
build-and-deploy / Deploy examples (push) Has been cancelled
build-and-deploy / thank you, build (push) Has been cancelled
build-and-deploy / Upload Turbopack Bytesize metrics to Datadog (push) Has been cancelled
Rspack Next.js development integration tests / Rspack integration tests (push) Has been cancelled
Rspack Next.js production integration tests / Rspack integration tests (push) Has been cancelled
Turbopack Next.js development integration tests / Next.js integration tests (push) Has been cancelled
Turbopack Next.js production integration tests / Next.js integration tests (push) Has been cancelled
Update Rspack test manifest / Update and upload Rspack development test manifest (push) Has been cancelled
Update Rspack test manifest / Update and upload Rspack production test manifest (push) Has been cancelled
Upload bundler test manifests to areweturboyet.com / Upload test results (push) Has been cancelled
Update React / create-pull-request (push) Has been cancelled
test-e2e-project-reset-cron / reset-test-project (push) Has been cancelled
Notify about the top 15 issues/PRs/feature requests (most reacted) in the last 90 days / run (push) Has been cancelled
71 lines
2.3 KiB
TypeScript
71 lines
2.3 KiB
TypeScript
import { nextTestSetup } from 'e2e-utils'
|
|
import execa from 'execa'
|
|
import fs from 'fs'
|
|
import path from 'path'
|
|
import stripAnsi from 'strip-ansi'
|
|
|
|
describe('lockfile', () => {
|
|
const { next, isTurbopack, isRspack } = nextTestSetup({
|
|
files: __dirname,
|
|
})
|
|
|
|
it('only allows a single instance of `next dev` to run at a time', async () => {
|
|
const browser = await next.browser('/')
|
|
expect(await browser.elementByCss('p').text()).toBe('Page')
|
|
|
|
// Verify lockfile was created with server info inside it
|
|
// With isolatedDevBuild (default), distDir is .next/dev
|
|
const distDir = path.join(next.testDir, '.next', 'dev')
|
|
const lockfilePath = path.join(distDir, 'lock')
|
|
expect(fs.existsSync(lockfilePath)).toBe(true)
|
|
|
|
// Read server info from the lockfile itself
|
|
const serverInfo = JSON.parse(fs.readFileSync(lockfilePath, 'utf-8'))
|
|
expect(serverInfo).toMatchObject({
|
|
pid: expect.any(Number),
|
|
port: expect.any(Number),
|
|
hostname: expect.any(String),
|
|
appUrl: expect.any(String),
|
|
startedAt: expect.any(Number),
|
|
})
|
|
|
|
// Try to start another dev server - should fail with helpful error
|
|
const { stdout, stderr, exitCode } = await execa(
|
|
'pnpm',
|
|
[
|
|
'next',
|
|
'dev',
|
|
...(isRspack ? [] : [isTurbopack ? '--turbopack' : '--webpack']),
|
|
],
|
|
{
|
|
cwd: next.testDir,
|
|
env: next.env as NodeJS.ProcessEnv,
|
|
reject: false,
|
|
}
|
|
)
|
|
|
|
const output = stripAnsi(stdout + stderr)
|
|
|
|
// Match the whole error message pattern with fuzzy matching for dynamic parts
|
|
// The kill command varies by platform: `kill <pid>` on Unix, `taskkill /PID <pid> /F` on Windows
|
|
const killPattern =
|
|
process.platform === 'win32'
|
|
? 'Run taskkill /PID \\d+ /F to stop it\\.'
|
|
: 'Run kill \\d+ to stop it\\.'
|
|
const errorPattern = new RegExp(
|
|
'Another next dev server is already running\\.\\s*' +
|
|
'- Local:\\s+http://[^\\s]+\\s+' +
|
|
'- PID:\\s+\\d+\\s+' +
|
|
'- Dir:\\s+[^\\s]+\\s+' +
|
|
'- Log:\\s+\\.next/dev/logs/next-development\\.log\\s+' +
|
|
killPattern
|
|
)
|
|
expect(output).toMatch(errorPattern)
|
|
expect(exitCode).toBe(1)
|
|
|
|
// Make sure the other instance of `next dev` didn't mess anything up
|
|
await browser.refresh()
|
|
expect(await browser.elementByCss('p').text()).toBe('Page')
|
|
})
|
|
})
|