feat(port-management): add findFreePort method for automatic port discovery within a range
Some checks failed
Default (tags) / security (push) Successful in 46s
Default (tags) / test (push) Failing after 6m10s
Default (tags) / release (push) Has been skipped
Default (tags) / metadata (push) Has been skipped

This commit is contained in:
Juergen Kunz
2025-07-31 22:04:20 +00:00
parent 9cf4e433bf
commit d1ab85cbb3
5 changed files with 329 additions and 82 deletions

View File

@@ -168,6 +168,70 @@ tap.test('isLocalPortUnused should detect used local port', async () => {
expect(inUse).toBeFalse();
await new Promise<void>((resolve) => server.close(() => resolve()));
});
// findFreePort tests
tap.test('findFreePort should find an available port in range', async () => {
const sn = new SmartNetwork();
const freePort = await sn.findFreePort(49152, 49200);
expect(freePort).toBeGreaterThanOrEqual(49152);
expect(freePort).toBeLessThanOrEqual(49200);
// Verify the port is actually free
const isUnused = await sn.isLocalPortUnused(freePort);
expect(isUnused).toBeTrue();
});
tap.test('findFreePort should return null when all ports are occupied', async () => {
const sn = new SmartNetwork();
// Create servers to occupy a small range
const servers = [];
const startPort = 49300;
const endPort = 49302;
for (let port = startPort; port <= endPort; port++) {
const server = net.createServer();
await new Promise<void>((res) => server.listen(port, res));
servers.push(server);
}
// Now all ports in range should be occupied
const freePort = await sn.findFreePort(startPort, endPort);
expect(freePort).toBeNull();
// Clean up servers
await Promise.all(servers.map(s => new Promise<void>((res) => s.close(() => res()))));
});
tap.test('findFreePort should validate port range', async () => {
const sn = new SmartNetwork();
// Test invalid port numbers
try {
await sn.findFreePort(0, 100);
throw new Error('Expected error for port < 1');
} catch (err: any) {
expect(err).toBeInstanceOf(NetworkError);
expect(err.code).toEqual('EINVAL');
}
try {
await sn.findFreePort(100, 70000);
throw new Error('Expected error for port > 65535');
} catch (err: any) {
expect(err).toBeInstanceOf(NetworkError);
expect(err.code).toEqual('EINVAL');
}
// Test startPort > endPort
try {
await sn.findFreePort(200, 100);
throw new Error('Expected error for startPort > endPort');
} catch (err: any) {
expect(err).toBeInstanceOf(NetworkError);
expect(err.code).toEqual('EINVAL');
}
});
// Real traceroute integration test (skipped if `traceroute` binary is unavailable)
tap.test('traceroute real integration against google.com', async () => {
const sn = new SmartNetwork();