feat: add getAvailablePort helper function
This commit is contained in:
parent
42cfa4a7ca
commit
9137816e33
@ -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)
|
||||
})
|
||||
})
|
||||
|
@ -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, {
|
||||
|
@ -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<number> =>
|
||||
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)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
Reference in New Issue
Block a user