Skip to content

Commit

Permalink
feat: add getAvailablePort helper function
Browse files Browse the repository at this point in the history
  • Loading branch information
jsjoeio committed Jul 27, 2021
1 parent 49bb2fd commit 07f6647
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 5 deletions.
15 changes: 14 additions & 1 deletion test/unit/helpers.test.ts
Original file line number Diff line number Diff line change
@@ -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).
Expand Down Expand Up @@ -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)
})
})
11 changes: 7 additions & 4 deletions test/unit/proxy.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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, {
Expand Down
21 changes: 21 additions & 0 deletions test/utils/helpers.ts
Original file line number Diff line number Diff line change
@@ -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.
Expand Down Expand Up @@ -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)
})
})
})

0 comments on commit 07f6647

Please sign in to comment.