Skip to content

Commit 4a90dfd

Browse files
committed
test: add tests for getPort
1 parent de6be49 commit 4a90dfd

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
@@ -171,3 +171,96 @@ describe('getWorkflowRunStreamId', () => {
171171
expect(result.includes('_user')).toBe(true);
172172
});
173173
});
174+
175+
describe('getPort', () => {
176+
const createServer = () =>
177+
http.createServer((_request, response) => {
178+
response.end();
179+
});
180+
181+
const startServer = async (port: number, host = '127.0.0.1') => {
182+
const server = createServer().listen(port, host);
183+
await new Promise<void>((resolve) => {
184+
server.on('listening', resolve);
185+
});
186+
return server;
187+
};
188+
189+
it('should return undefined when process is not listening on any port', () => {
190+
// This test assumes the test process itself isn't listening on any port
191+
const port = getPort();
192+
expect(port).toBeUndefined();
193+
});
194+
195+
it('should detect port when server is listening', async () => {
196+
// Use a high port number to avoid conflicts
197+
const testPort = 50000 + Math.floor(Math.random() * 10000);
198+
const server = await startServer(testPort);
199+
200+
// Give the OS a moment to register the port
201+
await new Promise((resolve) => setTimeout(resolve, 100));
202+
203+
const detectedPort = getPort();
204+
expect(detectedPort).toBe(testPort);
205+
206+
server.close();
207+
});
208+
209+
it('should return smallest port when listening on multiple ports', async () => {
210+
const port1 = 50000 + Math.floor(Math.random() * 5000);
211+
const port2 = port1 + 100;
212+
const port3 = port1 + 200;
213+
214+
const server1 = await startServer(port1);
215+
const server2 = await startServer(port2);
216+
const server3 = await startServer(port3);
217+
218+
// Give the OS a moment to register the ports
219+
await new Promise((resolve) => setTimeout(resolve, 100));
220+
221+
const detectedPort = getPort();
222+
expect(detectedPort).toBe(port1); // Should return the smallest
223+
224+
server1.close();
225+
server2.close();
226+
server3.close();
227+
});
228+
229+
it('should work with IPv6 localhost', async () => {
230+
const testPort = 50000 + Math.floor(Math.random() * 10000);
231+
let server: http.Server | undefined;
232+
233+
try {
234+
server = await startServer(testPort, '::1');
235+
236+
// Give the OS a moment to register the port
237+
await new Promise((resolve) => setTimeout(resolve, 100));
238+
239+
const detectedPort = getPort();
240+
expect(detectedPort).toBe(testPort);
241+
} catch {
242+
// IPv6 might not be available on all systems, skip the test
243+
if (server) server.close();
244+
return;
245+
}
246+
247+
if (server) server.close();
248+
});
249+
250+
it('should handle 0.0.0.0 binding', async () => {
251+
const testPort = 50000 + Math.floor(Math.random() * 10000);
252+
const server = createServer().listen(testPort, '0.0.0.0');
253+
254+
await new Promise<void>((resolve) => {
255+
server.on('listening', resolve);
256+
});
257+
258+
// Give the OS a moment to register the port
259+
await new Promise((resolve) => setTimeout(resolve, 100));
260+
261+
const detectedPort = getPort();
262+
expect(detectedPort).toBe(testPort);
263+
264+
server.close();
265+
});
266+
});

0 commit comments

Comments
 (0)