Skip to content

Commit 1eef935

Browse files
bsideuprnorth
andauthored
Store GenericContainer#exposedPorts as an order-preserving Set (#2613)
* Store `GenericContainer#exposedPorts` as an order-preserving `Set` * Update core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java Co-authored-by: Richard North <[email protected]> Co-authored-by: Richard North <[email protected]>
1 parent 672cbee commit 1eef935

File tree

2 files changed

+24
-3
lines changed

2 files changed

+24
-3
lines changed

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

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
import java.util.Collections;
7878
import java.util.HashMap;
7979
import java.util.HashSet;
80+
import java.util.Iterator;
8081
import java.util.LinkedHashSet;
8182
import java.util.List;
8283
import java.util.Map;
@@ -118,7 +119,7 @@ public class GenericContainer<SELF extends GenericContainer<SELF>>
118119
* Default settings
119120
*/
120121
@NonNull
121-
private List<Integer> exposedPorts = new ArrayList<>();
122+
private LinkedHashSet<Integer> exposedPorts = new LinkedHashSet<>();
122123

123124
@NonNull
124125
private List<String> portBindings = new ArrayList<>();
@@ -256,6 +257,16 @@ public void setImage(Future<String> image) {
256257
this.image = new RemoteDockerImage(image);
257258
}
258259

260+
@Override
261+
public List<Integer> getExposedPorts() {
262+
return new ArrayList<>(exposedPorts);
263+
}
264+
265+
@Override
266+
public void setExposedPorts(List<Integer> exposedPorts) {
267+
this.exposedPorts = new LinkedHashSet<>(exposedPorts);
268+
}
269+
259270
/**
260271
* @see #dependsOn(Iterable)
261272
*/
@@ -671,8 +682,9 @@ protected void containerIsStopped(InspectContainerResponse containerInfo) {
671682
@Deprecated
672683
protected Integer getLivenessCheckPort() {
673684
// legacy implementation for backwards compatibility
674-
if (exposedPorts.size() > 0) {
675-
return getMappedPort(exposedPorts.get(0));
685+
Iterator<Integer> exposedPortsIterator = exposedPorts.iterator();
686+
if (exposedPortsIterator.hasNext()) {
687+
return getMappedPort(exposedPortsIterator.next());
676688
} else if (portBindings.size() > 0) {
677689
return Integer.valueOf(PortBinding.parse(portBindings.get(0)).getBinding().getHostPortSpec());
678690
} else {

core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,15 @@ public void addExposedPortAfterWithExposedPortsTest() {
379379
assertTrue("addExposedPort should be exposed", redis.getExposedPorts().contains(8987));
380380
}
381381

382+
@Test
383+
public void addingExposedPortTwiceShouldNotFail() {
384+
redis.addExposedPort(8987);
385+
redis.addExposedPort(8987);
386+
assertThat("Both ports should be exposed", redis.getExposedPorts().size(), equalTo(2)); // 2 ports = de-duplicated port 8897 and original port 6379
387+
assertTrue("withExposedPort should be exposed", redis.getExposedPorts().contains(REDIS_PORT));
388+
assertTrue("addExposedPort should be exposed", redis.getExposedPorts().contains(8987));
389+
}
390+
382391
@Test
383392
public void sharedMemorySetTest() {
384393
try (GenericContainer containerWithSharedMemory = new GenericContainer()

0 commit comments

Comments
 (0)