diff --git a/core/src/main/java/org/testcontainers/containers/GenericContainer.java b/core/src/main/java/org/testcontainers/containers/GenericContainer.java index 211ad2f59cb..63191998db4 100644 --- a/core/src/main/java/org/testcontainers/containers/GenericContainer.java +++ b/core/src/main/java/org/testcontainers/containers/GenericContainer.java @@ -77,6 +77,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -118,7 +119,7 @@ public class GenericContainer> * Default settings */ @NonNull - private List exposedPorts = new ArrayList<>(); + private LinkedHashSet exposedPorts = new LinkedHashSet<>(); @NonNull private List portBindings = new ArrayList<>(); @@ -256,6 +257,16 @@ public void setImage(Future image) { this.image = new RemoteDockerImage(image); } + @Override + public List getExposedPorts() { + return new ArrayList<>(exposedPorts); + } + + @Override + public void setExposedPorts(List exposedPorts) { + this.exposedPorts = new LinkedHashSet<>(exposedPorts); + } + /** * @see #dependsOn(Iterable) */ @@ -672,8 +683,9 @@ protected void containerIsStopped(InspectContainerResponse containerInfo) { @Deprecated protected Integer getLivenessCheckPort() { // legacy implementation for backwards compatibility - if (exposedPorts.size() > 0) { - return getMappedPort(exposedPorts.get(0)); + Iterator exposedPortsIterator = exposedPorts.iterator(); + if (exposedPortsIterator.hasNext()) { + return getMappedPort(exposedPortsIterator.next()); } else if (portBindings.size() > 0) { return Integer.valueOf(PortBinding.parse(portBindings.get(0)).getBinding().getHostPortSpec()); } else { diff --git a/core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java b/core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java index 6c51713b6b1..3170e34a3ec 100644 --- a/core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java +++ b/core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java @@ -379,6 +379,15 @@ public void addExposedPortAfterWithExposedPortsTest() { assertTrue("addExposedPort should be exposed", redis.getExposedPorts().contains(8987)); } + @Test + public void addingExposedPortTwiceShouldNotFail() { + redis.addExposedPort(8987); + redis.addExposedPort(8987); + assertThat("Both ports should be exposed", redis.getExposedPorts().size(), equalTo(2)); // 2 ports = de-duplicated port 8897 and original port 6379 + assertTrue("withExposedPort should be exposed", redis.getExposedPorts().contains(REDIS_PORT)); + assertTrue("addExposedPort should be exposed", redis.getExposedPorts().contains(8987)); + } + @Test public void sharedMemorySetTest() { try (GenericContainer containerWithSharedMemory = new GenericContainer()