diff --git a/e2e/cases/server/strict-port/index.test.ts b/e2e/cases/server/strict-port/index.test.ts new file mode 100644 index 0000000000..6fa7e74287 --- /dev/null +++ b/e2e/cases/server/strict-port/index.test.ts @@ -0,0 +1,49 @@ +import net from 'node:net'; +import { stripVTControlCharacters as stripAnsi } from 'node:util'; +import { expect, getRandomPort, test } from '@e2e/helper'; + +const HOST = '0.0.0.0'; + +const occupyPort = async () => { + const port = await getRandomPort(); + const blocker = net.createServer(); + + await new Promise((resolve, reject) => { + blocker.once('error', reject); + blocker.listen({ port, host: HOST }, resolve); + }); + + return { + port, + close: () => + new Promise((resolve) => { + blocker.close(() => resolve()); + }), + }; +}; + +test('should throw when strictPort is enabled and port is taken', async ({ + devOnly, +}) => { + const blocker = await occupyPort(); + + let message = ''; + try { + await devOnly({ + config: { + server: { + host: HOST, + port: blocker.port, + strictPort: true, + }, + }, + }); + } catch (error) { + if (error instanceof Error) { + message = error.message; + } + } + + expect(stripAnsi(message)).toContain(`Port ${blocker.port} is occupied`); + await blocker.close(); +}); diff --git a/e2e/cases/server/strict-port/src/index.ts b/e2e/cases/server/strict-port/src/index.ts new file mode 100644 index 0000000000..8b1a393741 --- /dev/null +++ b/e2e/cases/server/strict-port/src/index.ts @@ -0,0 +1 @@ +// empty