std/net/get_available_port_test.ts
Michael Herzner 1cd35a6746
test(net): improve test coverage (#4709)
Co-authored-by: Asher Gomez <ashersaupingomez@gmail.com>
2024-05-13 07:17:22 +09:00

55 lines
1.7 KiB
TypeScript

// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
import { getAvailablePort } from "./get_available_port.ts";
import { assertEquals, assertNotEquals, assertThrows } from "@std/assert";
import { stub } from "@std/testing/mock";
/** Helper function to see if a port is indeed available for listening (race-y) */
async function testWithPort(port: number) {
const server = Deno.serve({
port,
async onListen() {
const resp = await fetch(`http://localhost:${port}`);
const text = await resp.text();
assertEquals(text, "hello");
server.shutdown();
},
}, () => new Response("hello"));
await server.finished;
}
Deno.test("getAvailablePort() gets an available port", async () => {
const port = getAvailablePort();
assertEquals(typeof port, "number");
await testWithPort(port);
});
Deno.test("getAvailablePort() gets an available port with a preferred port", async () => {
const preferredPort = 9563;
const port = getAvailablePort({ preferredPort });
assertEquals(port, preferredPort);
await testWithPort(port);
});
Deno.test("getAvailablePort() falls back to another port if preferred port is in use", async () => {
const preferredPort = 9563;
const server = Deno.serve(
{ port: preferredPort, onListen: () => {} },
() => new Response("hello"),
);
const port = getAvailablePort({ preferredPort });
assertEquals(typeof port, "number");
assertNotEquals(port, preferredPort);
server.shutdown();
await server.finished;
});
Deno.test("getAvailablePort() throws if error is not AddrInUse", () => {
using _ = stub(Deno, "listen", () => {
throw new Error();
});
const preferredPort = 9563;
assertThrows(() => getAvailablePort({ preferredPort }), Error);
});