Skip to content

Commit 2779730

Browse files
Add default wait strategy hook
1 parent 73864d3 commit 2779730

4 files changed

Lines changed: 37 additions & 1 deletion

File tree

docs/features/containers.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,24 @@ class CustomStartedContainer extends AbstractStartedContainer {
582582
}
583583
```
584584

585+
### Default wait strategy for custom containers
586+
587+
Custom containers can define a fallback wait strategy by overriding `getDefaultWaitStrategy`. Testcontainers uses this when the user has not explicitly set a wait strategy and neither the container nor its image defines a health check:
588+
589+
```ts
590+
import { GenericContainer, Wait, WaitStrategy } from "testcontainers";
591+
592+
class CustomContainer extends GenericContainer {
593+
constructor() {
594+
super("custom/image:1.0.0");
595+
}
596+
597+
protected override getDefaultWaitStrategy(): WaitStrategy {
598+
return Wait.forLogMessage("ready");
599+
}
600+
}
601+
```
602+
585603
## Exposing container ports
586604

587605
Specify which container ports you want accessible by the host:

packages/testcontainers/src/generic-container/generic-container.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ export class GenericContainer implements TestContainer {
8787

8888
protected containerStarting?(inspectResult: InspectResult, reused: boolean): Promise<void>;
8989

90+
protected getDefaultWaitStrategy?(): WaitStrategy;
91+
9092
public async start(): Promise<StartedTestContainer> {
9193
const client = await getContainerRuntimeClient();
9294
await client.image.pull(this.imageName, {
@@ -132,6 +134,7 @@ export class GenericContainer implements TestContainer {
132134
waitStrategy,
133135
healthCheck: this.healthCheck,
134136
imageNames: [this.imageName.string],
137+
defaultWaitStrategy: this.getDefaultWaitStrategy?.(),
135138
});
136139
}
137140

packages/testcontainers/src/wait-strategies/utils/wait-strategy-selector.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,19 @@ describe("wait strategy selector", () => {
136136
).resolves.toBeInstanceOf(HostPortWaitStrategy);
137137
});
138138

139+
it("should select the default wait strategy when no healthcheck is configured", async () => {
140+
const defaultWaitStrategy = Wait.forLogMessage("ready");
141+
142+
await expect(
143+
selectWaitStrategy({
144+
client: client({} as ImageInspectInfo),
145+
inspectResult: containerInspectResult(),
146+
imageNames: ["image:latest"],
147+
defaultWaitStrategy,
148+
})
149+
).resolves.toBe(defaultWaitStrategy);
150+
});
151+
139152
it("should select image healthcheck when container inspect omits healthcheck config", async () => {
140153
await expect(
141154
selectWaitStrategy({

packages/testcontainers/src/wait-strategies/utils/wait-strategy-selector.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ type WaitStrategySelectorOptions = {
1717
waitStrategy?: WaitStrategy;
1818
healthCheck?: HealthCheck;
1919
imageNames?: string[];
20+
defaultWaitStrategy?: WaitStrategy;
2021
};
2122

2223
export const selectWaitStrategy = async ({
@@ -25,13 +26,14 @@ export const selectWaitStrategy = async ({
2526
waitStrategy,
2627
healthCheck,
2728
imageNames = getImageNames(inspectResult),
29+
defaultWaitStrategy = Wait.forListeningPorts(),
2830
}: WaitStrategySelectorOptions): Promise<WaitStrategy> => {
2931
if (waitStrategy) return waitStrategy;
3032
if (hasHealthCheck(healthCheck)) return Wait.forHealthCheck();
3133
if (hasDisabledHealthCheckConfig(inspectResult)) return Wait.forListeningPorts();
3234
if (hasHealthCheckConfig(inspectResult) || hasHealthCheckStatus(inspectResult)) return Wait.forHealthCheck();
3335
if (await imageHasHealthCheck(client, imageNames)) return Wait.forHealthCheck();
34-
return Wait.forListeningPorts();
36+
return defaultWaitStrategy;
3537
};
3638

3739
const getImageNames = (inspectResult: ContainerInspectInfo): string[] => {

0 commit comments

Comments
 (0)