diff --git a/test/unit/helpers.test.ts b/test/unit/helpers.test.ts index 55187788..e3de12e2 100644 --- a/test/unit/helpers.test.ts +++ b/test/unit/helpers.test.ts @@ -1,5 +1,5 @@ import { promises as fs } from "fs" -import { tmpdir, useEnv } from "../../test/utils/helpers" +import { getAvailablePort, tmpdir, useEnv } from "../../test/utils/helpers" /** * This file is for testing test helpers (not core code). @@ -39,3 +39,16 @@ describe("useEnv", () => { expect(process.env[envKey]).toEqual("test environment variable") }) }) + +describe("getAvailablePort", () => { + it("should return a valid port", async () => { + const port = await getAvailablePort() + expect(port).toBeGreaterThan(0) + expect(port).toBeLessThanOrEqual(65535) + }) + it("should return different ports for different calls", async () => { + const portOne = await getAvailablePort() + const portTwo = await getAvailablePort() + expect(portOne).not.toEqual(portTwo) + }) +}) diff --git a/test/unit/node/proxy.test.ts b/test/unit/node/proxy.test.ts index b40819cc..dc019c45 100644 --- a/test/unit/node/proxy.test.ts +++ b/test/unit/node/proxy.test.ts @@ -6,6 +6,7 @@ import { HttpCode } from "../../../src/common/http" import { proxy } from "../../../src/node/proxy" import * as httpserver from "../../utils/httpserver" import * as integration from "../../utils/integration" +import { getAvailablePort } from "../../utils/helpers" describe("proxy", () => { const nhooyrDevServer = new httpserver.HttpServer() @@ -166,14 +167,16 @@ describe("proxy", () => { // src/node/proxy.ts, you should probably add it to // this test suite. describe("proxy (standalone)", () => { - const PORT = 9003 - const PROXY_PORT = 8003 - const URL = `http://localhost:${PORT}` - const PROXY_URL = `http://localhost:${PROXY_PORT}` + let URL = "" + let PROXY_URL = "" let testServer: http.Server let proxyTarget: http.Server beforeEach(async () => { + const PORT = await getAvailablePort() + const PROXY_PORT = await getAvailablePort() + URL = `http://localhost:${PORT}` + PROXY_URL = `http://localhost:${PROXY_PORT}` // Define server and a proxy server testServer = http.createServer((req, res) => { proxy.web(req, res, { diff --git a/test/utils/helpers.ts b/test/utils/helpers.ts index a7b7a6dd..a4d4055c 100644 --- a/test/utils/helpers.ts +++ b/test/utils/helpers.ts @@ -1,6 +1,7 @@ import { promises as fs } from "fs" import * as os from "os" import * as path from "path" +import * as net from "net" /** * Return a mock of @coder/logger. @@ -61,3 +62,23 @@ export function useEnv(key: string): [(nextValue: string | undefined) => string return [setValue, resetValue] } + +/** + * Helper function to get a random port. + * + * Source: https://github.com/sindresorhus/get-port/blob/main/index.js#L23-L33 + */ +export const getAvailablePort = (options?: net.ListenOptions): Promise => + new Promise((resolve, reject) => { + const server = net.createServer() + server.unref() + server.on("error", reject) + server.listen(options, () => { + // NOTE@jsjoeio: not a huge fan of the type assertion + // but it works for now. + const { port } = server.address() as net.AddressInfo + server.close(() => { + resolve(port) + }) + }) + })