Skip to content

Commit 05baff3

Browse files
Remove unnecessary unique port generator
The RandomPortGenerator now always returns an available port, so it doesn't matter if it's unique.
1 parent cbf237d commit 05baff3

File tree

6 files changed

+29
-34
lines changed

6 files changed

+29
-34
lines changed

packages/testcontainers/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export { CommitOptions, Content, ExecOptions, ExecResult, InspectResult } from "
2222
export { BoundPorts } from "./utils/bound-ports";
2323
export { LABEL_TESTCONTAINERS_SESSION_ID } from "./utils/labels";
2424
export { PortWithBinding, PortWithOptionalBinding, getContainerPort, hasHostBinding } from "./utils/port";
25-
export { PortGenerator, RandomUniquePortGenerator } from "./utils/port-generator";
25+
export { PortGenerator, RandomPortGenerator } from "./utils/port-generator";
2626
export { ImagePullPolicy, PullPolicy } from "./utils/pull-policy";
2727
export { HttpWaitStrategyOptions } from "./wait-strategies/http-wait-strategy";
2828
export { StartupCheckStrategy, StartupStatus } from "./wait-strategies/startup-check-strategy";

packages/testcontainers/src/port-forwarder/port-forwarder-reuse.test.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import { GenericContainer } from "../generic-container/generic-container";
2-
import { RandomUniquePortGenerator } from "../utils/port-generator";
2+
import { RandomPortGenerator } from "../utils/port-generator";
33
import { createTestServer } from "../utils/test-helper";
44

55
describe("Port Forwarder reuse", { timeout: 180_000 }, () => {
6-
it("should expose additional ports", async () => {
7-
const portGen = new RandomUniquePortGenerator();
6+
const portGen = new RandomPortGenerator();
87

8+
it("should expose additional ports", async () => {
99
const { TestContainers: TC1 } = await import("../test-containers");
1010
const { PortForwarderInstance: PFI1 } = await import("../port-forwarder/port-forwarder");
1111
const port1 = await portGen.generatePort();
@@ -35,7 +35,6 @@ describe("Port Forwarder reuse", { timeout: 180_000 }, () => {
3535
});
3636

3737
it("should reuse same ports", async () => {
38-
const portGen = new RandomUniquePortGenerator();
3938
const port = await portGen.generatePort();
4039
const server = await createTestServer(port);
4140

packages/testcontainers/src/port-forwarder/port-forwarder.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@ import { Server } from "http";
22
import { GenericContainer } from "../generic-container/generic-container";
33
import { Network } from "../network/network";
44
import { TestContainers } from "../test-containers";
5-
import { RandomUniquePortGenerator } from "../utils/port-generator";
5+
import { RandomPortGenerator } from "../utils/port-generator";
66
import { createTestServer } from "../utils/test-helper";
77

88
describe("PortForwarder", { timeout: 180_000 }, () => {
99
let randomPort: number;
1010
let server: Server;
1111

1212
beforeEach(async () => {
13-
randomPort = await new RandomUniquePortGenerator().generatePort();
13+
randomPort = await new RandomPortGenerator().generatePort();
1414
server = await createTestServer(randomPort);
1515
});
1616

packages/testcontainers/src/reaper/reaper.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { ContainerRuntimeClient, getContainerRuntimeClient } from "../container-runtime";
2-
import { RandomUniquePortGenerator } from "../utils/port-generator";
2+
import { RandomPortGenerator } from "../utils/port-generator";
33

44
describe("Reaper", { timeout: 120_000 }, () => {
55
let client: ContainerRuntimeClient;
@@ -54,7 +54,7 @@ describe("Reaper", { timeout: 120_000 }, () => {
5454
});
5555

5656
it("should use custom port when TESTCONTAINERS_RYUK_PORT is set", async () => {
57-
const customPort = (await new RandomUniquePortGenerator().generatePort()).toString();
57+
const customPort = (await new RandomPortGenerator().generatePort()).toString();
5858
vi.stubEnv("TESTCONTAINERS_RYUK_PORT", customPort);
5959
vi.spyOn(client.container, "list").mockResolvedValue([]);
6060

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,25 @@
1-
import { FixedPortGenerator, RandomUniquePortGenerator } from "./port-generator";
1+
import { FixedPortGenerator, RandomPortGenerator } from "./port-generator";
22

33
describe("PortGenerator", () => {
4-
describe("RandomUniquePortGenerator", () => {
5-
it("should generate a random and unique port across all instances", async () => {
6-
const fixedPortGenerator = new FixedPortGenerator([1000, 1000, 1001]);
7-
expect(await new RandomUniquePortGenerator(fixedPortGenerator).generatePort()).toBe(1000);
8-
expect(await new RandomUniquePortGenerator(fixedPortGenerator).generatePort()).toBe(1001);
4+
describe("FixedPortGenerator", () => {
5+
it("should return pre-determined ports", async () => {
6+
const fixedPortGenerator = new FixedPortGenerator([1000, 1001]);
7+
8+
await expect(fixedPortGenerator.generatePort()).resolves.toBe(1000);
9+
await expect(fixedPortGenerator.generatePort()).resolves.toBe(1001);
10+
});
11+
});
12+
13+
describe("RandomPortGenerator", () => {
14+
it("should generate a random available port", async () => {
15+
const randomPortGenerator = new RandomPortGenerator();
16+
17+
const port1 = await randomPortGenerator.generatePort();
18+
const port2 = await randomPortGenerator.generatePort();
19+
20+
expect(port1).toBeDefined();
21+
expect(port2).toBeDefined();
22+
expect(port1).not.toBe(port2);
923
});
1024
});
1125
});

packages/testcontainers/src/utils/port-generator.ts

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,13 @@ export interface PortGenerator {
22
generatePort(): Promise<number>;
33
}
44

5-
class RandomPortGenerator {
5+
export class RandomPortGenerator {
66
public async generatePort(): Promise<number> {
77
const { default: getPort } = await import("get-port");
88
return getPort();
99
}
1010
}
1111

12-
export class RandomUniquePortGenerator implements PortGenerator {
13-
private static readonly assignedPorts = new Set();
14-
15-
constructor(private readonly portGenerator: PortGenerator = new RandomPortGenerator()) {}
16-
17-
public async generatePort(): Promise<number> {
18-
let port: number;
19-
20-
do {
21-
port = await this.portGenerator.generatePort();
22-
} while (RandomUniquePortGenerator.assignedPorts.has(port));
23-
24-
RandomUniquePortGenerator.assignedPorts.add(port);
25-
26-
return port;
27-
}
28-
}
29-
3012
export class FixedPortGenerator implements PortGenerator {
3113
private portIndex = 0;
3214

0 commit comments

Comments
 (0)