Skip to content

Commit 89abfce

Browse files
committed
test: add tests for getPort
1 parent de7c0da commit 89abfce

File tree

1 file changed

+93
-0
lines changed

1 file changed

+93
-0
lines changed

packages/core/src/util.test.ts

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,3 +343,96 @@ describe('parseDurationToDate', () => {
343343
});
344344
});
345345
});
346+
347+
describe('getPort', () => {
348+
const createServer = () =>
349+
http.createServer((_request, response) => {
350+
response.end();
351+
});
352+
353+
const startServer = async (port: number, host = '127.0.0.1') => {
354+
const server = createServer().listen(port, host);
355+
await new Promise<void>((resolve) => {
356+
server.on('listening', resolve);
357+
});
358+
return server;
359+
};
360+
361+
it('should return undefined when process is not listening on any port', () => {
362+
// This test assumes the test process itself isn't listening on any port
363+
const port = getPort();
364+
expect(port).toBeUndefined();
365+
});
366+
367+
it('should detect port when server is listening', async () => {
368+
// Use a high port number to avoid conflicts
369+
const testPort = 50000 + Math.floor(Math.random() * 10000);
370+
const server = await startServer(testPort);
371+
372+
// Give the OS a moment to register the port
373+
await new Promise((resolve) => setTimeout(resolve, 100));
374+
375+
const detectedPort = getPort();
376+
expect(detectedPort).toBe(testPort);
377+
378+
server.close();
379+
});
380+
381+
it('should return smallest port when listening on multiple ports', async () => {
382+
const port1 = 50000 + Math.floor(Math.random() * 5000);
383+
const port2 = port1 + 100;
384+
const port3 = port1 + 200;
385+
386+
const server1 = await startServer(port1);
387+
const server2 = await startServer(port2);
388+
const server3 = await startServer(port3);
389+
390+
// Give the OS a moment to register the ports
391+
await new Promise((resolve) => setTimeout(resolve, 100));
392+
393+
const detectedPort = getPort();
394+
expect(detectedPort).toBe(port1); // Should return the smallest
395+
396+
server1.close();
397+
server2.close();
398+
server3.close();
399+
});
400+
401+
it('should work with IPv6 localhost', async () => {
402+
const testPort = 50000 + Math.floor(Math.random() * 10000);
403+
let server: http.Server | undefined;
404+
405+
try {
406+
server = await startServer(testPort, '::1');
407+
408+
// Give the OS a moment to register the port
409+
await new Promise((resolve) => setTimeout(resolve, 100));
410+
411+
const detectedPort = getPort();
412+
expect(detectedPort).toBe(testPort);
413+
} catch {
414+
// IPv6 might not be available on all systems, skip the test
415+
if (server) server.close();
416+
return;
417+
}
418+
419+
if (server) server.close();
420+
});
421+
422+
it('should handle 0.0.0.0 binding', async () => {
423+
const testPort = 50000 + Math.floor(Math.random() * 10000);
424+
const server = createServer().listen(testPort, '0.0.0.0');
425+
426+
await new Promise<void>((resolve) => {
427+
server.on('listening', resolve);
428+
});
429+
430+
// Give the OS a moment to register the port
431+
await new Promise((resolve) => setTimeout(resolve, 100));
432+
433+
const detectedPort = getPort();
434+
expect(detectedPort).toBe(testPort);
435+
436+
server.close();
437+
});
438+
});

0 commit comments

Comments
 (0)