Skip to content

Commit 1e6deb1

Browse files
rnortheuonymos
andauthored
Filter mapped ports when port numbers are not specified (replaces #3948) (#3979)
Co-authored-by: Ilia Rodionov <[email protected]>
1 parent 8533e9b commit 1e6deb1

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
1313
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
1414
import org.apache.commons.compress.utils.IOUtils;
15+
import org.apache.commons.lang.math.NumberUtils;
1516
import org.slf4j.Logger;
1617
import org.slf4j.LoggerFactory;
1718
import org.testcontainers.DockerClientFactory;
@@ -181,7 +182,9 @@ default List<Integer> getBoundPortNumbers() {
181182
.map(PortBinding::getBinding)
182183
.map(Ports.Binding::getHostPortSpec)
183184
.filter(Objects::nonNull)
185+
.filter(NumberUtils::isNumber)
184186
.map(Integer::valueOf)
187+
.filter(port -> port > 0)
185188
.collect(Collectors.toList());
186189
}
187190

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package org.testcontainers.containers;
2+
3+
import org.assertj.core.api.Assertions;
4+
import org.junit.Test;
5+
import org.junit.runner.RunWith;
6+
import org.junit.runners.Parameterized;
7+
8+
import java.util.List;
9+
10+
import static java.util.Collections.emptyList;
11+
import static java.util.Collections.singletonList;
12+
import static org.mockito.Mockito.doCallRealMethod;
13+
import static org.mockito.Mockito.mock;
14+
import static org.mockito.Mockito.when;
15+
16+
@RunWith(Parameterized.class)
17+
public class ContainerStateTest {
18+
19+
@Parameterized.Parameters(name = "{0} ({1} -> {2})")
20+
public static Object[][] params() {
21+
return new Object[][]{
22+
new Object[]{"regular mapping", "80:8080/tcp", singletonList(80),},
23+
new Object[]{"regular mapping with host", "127.0.0.1:80:8080/tcp", singletonList(80),},
24+
new Object[]{"zero port without host", ":0:8080/tcp", emptyList(),},
25+
new Object[]{"missing port with host", "0.0.0.0:0:8080/tcp", emptyList(),},
26+
new Object[]{"zero port (synthetic case)", "0:8080/tcp", emptyList(),},
27+
new Object[]{"missing port", ":8080/tcp", emptyList(),
28+
}
29+
};
30+
}
31+
32+
@Parameterized.Parameter(0)
33+
public String name;
34+
@Parameterized.Parameter(1)
35+
public String testSet;
36+
@Parameterized.Parameter(2)
37+
public List<Integer> expectedResult;
38+
39+
@Test
40+
public void test() {
41+
ContainerState containerState = mock(ContainerState.class);
42+
doCallRealMethod().when(containerState).getBoundPortNumbers();
43+
44+
when(containerState.getPortBindings()).thenReturn(singletonList(testSet));
45+
46+
List<Integer> result = containerState.getBoundPortNumbers();
47+
Assertions.assertThat(result).hasSameElementsAs(expectedResult);
48+
}
49+
}

0 commit comments

Comments
 (0)