Ensure required-server-files test can exit cleanly (#66765)

When running `pnpm test-start
test/production/standalone-mode/required-server-files/required-server-files.test.ts`
locally, Jest hangs and prevents the process from exiting. In the CI,
the issue is masked because `run-tests.js` uses `--forceExit`.

The reason for the hanging process is that there are two server
instances started, and only the last one is killed. By starting and
killing the server for each test we can not only fix this, but also
prevent the `should run middleware correctly (without minimalMode, with
wasm)` test from affecting the other tests when flipping the
`minimalMode` flag in `server.js`.

I also reverted the darwin-specific overwrites of `appPort` that were
added in #65722 and #66724. I don't think those are needed because after
#65722 was created we did land #66285 which sets the hostname to be
compatible with ipv4 and ipv6. If there's still a need to keep this then
let me know, and I will restore it.
This commit is contained in:
Hendrik Liebau 2024-07-02 00:05:28 +02:00 committed by GitHub
parent ba97c7595f
commit 7523f327e0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 45 additions and 81 deletions

View file

@ -91,10 +91,6 @@ describe('required server files app router', () => {
cwd: next.testDir,
}
)
if (process.platform === 'darwin') {
appPort = `http://127.0.0.1:${appPort}`
}
}
beforeAll(async () => {

View file

@ -128,10 +128,6 @@ describe('required server files i18n', () => {
},
}
)
if (process.platform === 'darwin') {
appPort = `http://127.0.0.1:${appPort}`
}
})
afterAll(async () => {

View file

@ -101,10 +101,6 @@ describe('required server files app router', () => {
cwd: next.testDir,
}
)
if (process.platform === 'darwin') {
appPort = `http://127.0.0.1:${appPort}`
}
}
beforeAll(async () => {

View file

@ -24,14 +24,9 @@ describe('required server files', () => {
let errors = []
let stderr = ''
let requiredFilesManifest
let minimalMode = true
const setupNext = async ({
nextEnv,
minimalMode,
}: {
nextEnv?: boolean
minimalMode?: boolean
}) => {
const setupNext = async ({ nextEnv }: { nextEnv?: boolean }) => {
// test build against environment with next support
process.env.NOW_BUILDER = nextEnv ? '1' : ''
@ -109,18 +104,31 @@ describe('required server files', () => {
await fs.remove(join(next.testDir, '.next/server', file))
}
}
}
beforeAll(async () => {
await setupNext({ nextEnv: true })
})
beforeEach(async () => {
errors = []
stderr = ''
const testServerFilename = join(next.testDir, 'standalone/server.js')
const testServerContent = await fs.readFile(testServerFilename, 'utf8')
const testServer = join(next.testDir, 'standalone/server.js')
await fs.writeFile(
testServer,
(await fs.readFile(testServer, 'utf8')).replace(
'port:',
`minimalMode: ${minimalMode},port:`
testServerFilename,
testServerContent.replace(
/(startServer\({\s*)(minimalMode: (true|false),\n {2})?/,
`$1minimalMode: ${minimalMode},\n `
)
)
appPort = await findPort()
server = await initNextServerScript(
testServer,
testServerFilename,
/- Local:/,
{
...process.env,
@ -136,24 +144,14 @@ describe('required server files', () => {
},
}
)
if (process.platform === 'darwin') {
appPort = `http://127.0.0.1:${appPort}`
}
}
beforeAll(async () => {
await setupNext({ nextEnv: true, minimalMode: true })
})
beforeEach(() => {
errors = []
stderr = ''
afterEach(async () => {
await killApp(server)
})
afterAll(async () => {
await next.destroy()
if (server) await killApp(server)
})
it('should resolve correctly when a redirect is returned', async () => {
@ -1279,43 +1277,20 @@ describe('required server files', () => {
expect(envVariables.envFromHost).toBe('FOOBAR')
})
// FIXME: update to not mutate the global state
it('should run middleware correctly (without minimalMode, with wasm)', async () => {
describe('without minimalMode, with wasm', () => {
beforeAll(() => {
minimalMode = false
})
it('should run middleware correctly', async () => {
const standaloneDir = join(next.testDir, 'standalone')
const testServer = join(standaloneDir, 'server.js')
await fs.writeFile(
testServer,
(await fs.readFile(testServer, 'utf8')).replace(
'minimalMode: true',
'minimalMode: false'
)
)
appPort = await findPort()
server = await initNextServerScript(
testServer,
/- Local:/,
{
...process.env,
PORT: `${appPort}`,
},
undefined,
{
cwd: next.testDir,
onStderr(msg) {
errors.push(msg)
stderr += msg
},
}
)
const res = await fetchViaHTTP(appPort, '/')
expect(res.status).toBe(200)
expect(await res.text()).toContain('index page')
expect(fs.existsSync(join(standaloneDir, '.next/server/edge-chunks'))).toBe(
true
)
expect(
fs.existsSync(join(standaloneDir, '.next/server/edge-chunks'))
).toBe(true)
const resImageResponse = await fetchViaHTTP(
appPort,
@ -1325,6 +1300,7 @@ describe('required server files', () => {
expect(resImageResponse.status).toBe(200)
expect(resImageResponse.headers.get('content-type')).toBe('image/png')
})
})
it('should correctly handle a mismatch in buildIds when normalizing next data', async () => {
const res = await fetchViaHTTP(

View file

@ -16054,11 +16054,11 @@
"required server files should resolve correctly when a redirect is returned",
"required server files should return data correctly with x-matched-path",
"required server files should return data correctly with x-matched-path for optional catch-all route",
"required server files should run middleware correctly (without minimalMode, with wasm)",
"required server files should set correct SWR headers with notFound gsp",
"required server files should set correct SWR headers with notFound gssp",
"required server files should show invariant when an automatic static page is requested",
"required server files should warn when \"next\" is imported directly"
"required server files should warn when \"next\" is imported directly",
"required server files without minimalMode, with wasm should run middleware correctly"
],
"pending": [],
"flakey": [],