Skip to content

Commit 94e4c85

Browse files
eddumelendezJenoDK
andauthored
Clear docker compose initialization (#9370)
Currently, an instance of `DockerComposeContainer` and `ComposeContainer` keep information from previous initialization which causes issues when running the instance more than once. Fixes #7443 --------- Co-authored-by: jenodekeyzer <[email protected]>
1 parent 49b13d8 commit 94e4c85

File tree

7 files changed

+78
-5
lines changed

7 files changed

+78
-5
lines changed

core/src/main/java/org/testcontainers/containers/ComposeCommand.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
package org.testcontainers.containers;
22

3-
import org.apache.commons.lang3.StringUtils;
4-
53
import java.util.Set;
64

75
class ComposeCommand {
86

97
static String getDownCommand(ComposeDelegate.ComposeVersion composeVersion, Set<String> options) {
108
String composeOptions = optionsAsString(options);
11-
if (composeOptions == null || composeOptions.equals("")) {
9+
if (composeOptions.isEmpty()) {
1210
return composeVersion == ComposeDelegate.ComposeVersion.V1 ? "down" : "compose down";
1311
}
1412
String cmd = composeVersion == ComposeDelegate.ComposeVersion.V1 ? "%s down" : "compose %s down";
@@ -17,7 +15,7 @@ static String getDownCommand(ComposeDelegate.ComposeVersion composeVersion, Set<
1715

1816
static String getUpCommand(ComposeDelegate.ComposeVersion composeVersion, Set<String> options) {
1917
String composeOptions = optionsAsString(options);
20-
if (composeOptions == null || composeOptions.equals("")) {
18+
if (composeOptions.isEmpty()) {
2119
return composeVersion == ComposeDelegate.ComposeVersion.V1 ? "up -d" : "compose up -d";
2220
}
2321
String cmd = composeVersion == ComposeDelegate.ComposeVersion.V1 ? "%s up -d" : "compose %s up -d";
@@ -31,7 +29,7 @@ private static String optionsAsString(final Set<String> options) {
3129
return optionsString;
3230
} else {
3331
// otherwise two spaces would appear between 'docker-compose' and 'up'
34-
return StringUtils.EMPTY;
32+
return "";
3533
}
3634
}
3735
}

core/src/main/java/org/testcontainers/containers/ComposeContainer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ public void stop() {
171171
}
172172
this.composeDelegate.runWithCompose(this.localCompose, cmd, this.env, this.filesInDirectory);
173173
} finally {
174+
this.composeDelegate.clear();
174175
this.project = this.composeDelegate.randomProjectId();
175176
}
176177
}

core/src/main/java/org/testcontainers/containers/ComposeDelegate.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,13 @@ String getServiceHost() {
386386
return this.ambassadorContainer.getHost();
387387
}
388388

389+
void clear() {
390+
this.logConsumers.clear();
391+
this.ambassadorPortMappings.clear();
392+
this.serviceInstanceMap.clear();
393+
this.waitStrategyMap.clear();
394+
}
395+
389396
enum ComposeVersion {
390397
V1("_"),
391398

core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ public void stop() {
177177
}
178178
this.composeDelegate.runWithCompose(this.localCompose, cmd, this.env, this.filesInDirectory);
179179
} finally {
180+
this.composeDelegate.clear();
180181
this.project = this.composeDelegate.randomProjectId();
181182
}
182183
}

core/src/test/java/org/testcontainers/containers/ComposeContainerWithServicesTest.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ public class ComposeContainerWithServicesTest {
2323
"src/test/resources/compose-with-inline-scale-test.yml"
2424
);
2525

26+
public static final File COMPOSE_FILE_WITH_HEALTHCHECK = new File(
27+
"src/test/resources/docker-compose-healthcheck.yml"
28+
);
29+
2630
@Test
2731
public void testDesiredSubsetOfServicesAreStarted() {
2832
try (ComposeContainer compose = new ComposeContainer(SIMPLE_COMPOSE_FILE).withServices("redis")) {
@@ -108,6 +112,32 @@ public void testStartupTimeoutSetsTheHighestTimeout() {
108112
.isInstanceOf(TimeoutException.class);
109113
}
110114

115+
@Test
116+
public void testWaitingForHealthcheck() {
117+
try (
118+
ComposeContainer compose = new ComposeContainer(COMPOSE_FILE_WITH_HEALTHCHECK)
119+
.waitingFor("redis", Wait.forHealthcheck().withStartupTimeout(Duration.ofMinutes(2)))
120+
) {
121+
compose.start();
122+
123+
verifyStartedContainers(compose, "redis-1");
124+
}
125+
}
126+
127+
@Test
128+
public void testWaitingForHealthcheckWithRestartDoesNotCrash() {
129+
try (
130+
ComposeContainer compose = new ComposeContainer(COMPOSE_FILE_WITH_HEALTHCHECK)
131+
.waitingFor("redis", Wait.forHealthcheck().withStartupTimeout(Duration.ofMinutes(1)))
132+
) {
133+
compose.start();
134+
compose.stop();
135+
compose.start();
136+
137+
verifyStartedContainers(compose, "redis-1");
138+
}
139+
}
140+
111141
private void verifyStartedContainers(final ComposeContainer compose, final String... names) {
112142
final List<String> containerNames = compose
113143
.listChildContainers()

core/src/test/java/org/testcontainers/containers/DockerComposeContainerWithServicesTest.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ public class DockerComposeContainerWithServicesTest {
2323
"src/test/resources/compose-with-inline-scale-test.yml"
2424
);
2525

26+
public static final File COMPOSE_FILE_WITH_HEALTHCHECK = new File(
27+
"src/test/resources/docker-compose-healthcheck.yml"
28+
);
29+
2630
@Test
2731
public void testDesiredSubsetOfServicesAreStarted() {
2832
try (
@@ -113,6 +117,32 @@ public void testStartupTimeoutSetsTheHighestTimeout() {
113117
.isInstanceOf(TimeoutException.class);
114118
}
115119

120+
@Test
121+
public void testWaitingForHealthcheck() {
122+
try (
123+
DockerComposeContainer<?> compose = new DockerComposeContainer<>(COMPOSE_FILE_WITH_HEALTHCHECK)
124+
.waitingFor("redis", Wait.forHealthcheck().withStartupTimeout(Duration.ofMinutes(2)))
125+
) {
126+
compose.start();
127+
128+
verifyStartedContainers(compose, "redis_1");
129+
}
130+
}
131+
132+
@Test
133+
public void testWaitingForHealthcheckWithRestartDoesNotCrash() {
134+
try (
135+
DockerComposeContainer<?> compose = new DockerComposeContainer<>(COMPOSE_FILE_WITH_HEALTHCHECK)
136+
.waitingFor("redis", Wait.forHealthcheck().withStartupTimeout(Duration.ofMinutes(1)))
137+
) {
138+
compose.start();
139+
compose.stop();
140+
compose.start();
141+
142+
verifyStartedContainers(compose, "redis_1");
143+
}
144+
}
145+
116146
private void verifyStartedContainers(final DockerComposeContainer<?> compose, final String... names) {
117147
final List<String> containerNames = compose
118148
.listChildContainers()
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
version: "3.9"
2+
services:
3+
redis:
4+
image: redis:alpine
5+
healthcheck:
6+
test: [ "CMD", "redis-cli", "--raw", "incr", "ping" ]

0 commit comments

Comments
 (0)