From 7523f327e0278c3cd5b43e2e76f582ee802c67d2 Mon Sep 17 00:00:00 2001 From: Hendrik Liebau Date: Tue, 2 Jul 2024 00:05:28 +0200 Subject: [PATCH] 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. --- .../required-server-files-app.test.ts | 4 - .../required-server-files-i18n.test.ts | 4 - .../required-server-files-ppr.test.ts | 4 - .../required-server-files.test.ts | 110 +++++++----------- test/turbopack-build-tests-manifest.json | 4 +- 5 files changed, 45 insertions(+), 81 deletions(-) diff --git a/test/production/standalone-mode/required-server-files/required-server-files-app.test.ts b/test/production/standalone-mode/required-server-files/required-server-files-app.test.ts index e2f45d7a2a..35e9aa9384 100644 --- a/test/production/standalone-mode/required-server-files/required-server-files-app.test.ts +++ b/test/production/standalone-mode/required-server-files/required-server-files-app.test.ts @@ -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 () => { diff --git a/test/production/standalone-mode/required-server-files/required-server-files-i18n.test.ts b/test/production/standalone-mode/required-server-files/required-server-files-i18n.test.ts index 941bd06e3b..22af48ce4b 100644 --- a/test/production/standalone-mode/required-server-files/required-server-files-i18n.test.ts +++ b/test/production/standalone-mode/required-server-files/required-server-files-i18n.test.ts @@ -128,10 +128,6 @@ describe('required server files i18n', () => { }, } ) - - if (process.platform === 'darwin') { - appPort = `http://127.0.0.1:${appPort}` - } }) afterAll(async () => { diff --git a/test/production/standalone-mode/required-server-files/required-server-files-ppr.test.ts b/test/production/standalone-mode/required-server-files/required-server-files-ppr.test.ts index d3a3fcc1a9..e0682a795a 100644 --- a/test/production/standalone-mode/required-server-files/required-server-files-ppr.test.ts +++ b/test/production/standalone-mode/required-server-files/required-server-files-ppr.test.ts @@ -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 () => { diff --git a/test/production/standalone-mode/required-server-files/required-server-files.test.ts b/test/production/standalone-mode/required-server-files/required-server-files.test.ts index 7f457ce3c8..1d99d8f7af 100644 --- a/test/production/standalone-mode/required-server-files/required-server-files.test.ts +++ b/test/production/standalone-mode/required-server-files/required-server-files.test.ts @@ -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,51 +1277,29 @@ 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 () => { - const standaloneDir = join(next.testDir, 'standalone') + describe('without minimalMode, with wasm', () => { + beforeAll(() => { + minimalMode = false + }) - const testServer = join(standaloneDir, 'server.js') - await fs.writeFile( - testServer, - (await fs.readFile(testServer, 'utf8')).replace( - 'minimalMode: true', - 'minimalMode: false' + it('should run middleware correctly', async () => { + const standaloneDir = join(next.testDir, 'standalone') + 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) + + const resImageResponse = await fetchViaHTTP( + appPort, + '/a-non-existent-page/to-test-with-middleware' ) - ) - 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 - ) - - const resImageResponse = await fetchViaHTTP( - appPort, - '/a-non-existent-page/to-test-with-middleware' - ) - - expect(resImageResponse.status).toBe(200) - expect(resImageResponse.headers.get('content-type')).toBe('image/png') + 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 () => { diff --git a/test/turbopack-build-tests-manifest.json b/test/turbopack-build-tests-manifest.json index 26cd246d94..0f49ccf836 100644 --- a/test/turbopack-build-tests-manifest.json +++ b/test/turbopack-build-tests-manifest.json @@ -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": [],