From cd9000346ce74eb6d42494abfd2aff9f4c5341c3 Mon Sep 17 00:00:00 2001 From: Bodo Date: Fri, 22 Mar 2019 16:23:11 +0100 Subject: [PATCH 1/9] hostPort != containerPort --- .../main/java/org/testcontainers/Testcontainers.java | 12 +++++++++++- .../containers/PortForwardingContainer.java | 7 +++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/testcontainers/Testcontainers.java b/core/src/main/java/org/testcontainers/Testcontainers.java index 4d7f5af4753..f34c54977cf 100644 --- a/core/src/main/java/org/testcontainers/Testcontainers.java +++ b/core/src/main/java/org/testcontainers/Testcontainers.java @@ -1,8 +1,12 @@ package org.testcontainers; -import lombok.experimental.UtilityClass; +import java.util.Map; +import java.util.Map.Entry; + import org.testcontainers.containers.PortForwardingContainer; +import lombok.experimental.UtilityClass; + @UtilityClass public class Testcontainers { @@ -11,4 +15,10 @@ public void exposeHostPorts(int... ports) { PortForwardingContainer.INSTANCE.exposeHostPort(port); } } + + public void exposeHostPorts(Map ports) { + for(Entry entry : ports.entrySet()) { + PortForwardingContainer.INSTANCE.exposeHostPort(entry.getKey(), entry.getValue()); + } + } } diff --git a/core/src/main/java/org/testcontainers/containers/PortForwardingContainer.java b/core/src/main/java/org/testcontainers/containers/PortForwardingContainer.java index 576ac33d148..7d214d23478 100644 --- a/core/src/main/java/org/testcontainers/containers/PortForwardingContainer.java +++ b/core/src/main/java/org/testcontainers/containers/PortForwardingContainer.java @@ -60,6 +60,13 @@ public void exposeHostPort(int port) { getSshConnection().requestRemotePortForwarding("", port, "localhost", port); } } + + @SneakyThrows + public void exposeHostPort(int hostPort, int containerPort) { + if (exposedPorts.add(hostPort)) { + getSshConnection().requestRemotePortForwarding("", containerPort, "localhost", hostPort); + } + } Optional getNetwork() { return Optional.ofNullable(container) From 19d37c96df4d5cb0357b235abf50a6114d4f50c6 Mon Sep 17 00:00:00 2001 From: Bodo Date: Fri, 22 Mar 2019 17:17:06 +0100 Subject: [PATCH 2/9] hostPort != containerPort --- .../main/java/org/testcontainers/Testcontainers.java | 4 ++-- .../containers/PortForwardingContainer.java | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/org/testcontainers/Testcontainers.java b/core/src/main/java/org/testcontainers/Testcontainers.java index f34c54977cf..0f83725c55b 100644 --- a/core/src/main/java/org/testcontainers/Testcontainers.java +++ b/core/src/main/java/org/testcontainers/Testcontainers.java @@ -3,10 +3,10 @@ import java.util.Map; import java.util.Map.Entry; -import org.testcontainers.containers.PortForwardingContainer; - import lombok.experimental.UtilityClass; +import org.testcontainers.containers.PortForwardingContainer; + @UtilityClass public class Testcontainers { diff --git a/core/src/main/java/org/testcontainers/containers/PortForwardingContainer.java b/core/src/main/java/org/testcontainers/containers/PortForwardingContainer.java index 7d214d23478..852a986b58f 100644 --- a/core/src/main/java/org/testcontainers/containers/PortForwardingContainer.java +++ b/core/src/main/java/org/testcontainers/containers/PortForwardingContainer.java @@ -8,10 +8,12 @@ import org.testcontainers.utility.TestcontainersConfiguration; import java.time.Duration; +import java.util.AbstractMap; import java.util.Collections; import java.util.Optional; import java.util.Set; import java.util.UUID; +import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; public enum PortForwardingContainer { @@ -19,7 +21,7 @@ public enum PortForwardingContainer { private GenericContainer container; - private final Set exposedPorts = Collections.newSetFromMap(new ConcurrentHashMap<>()); + private final Set> exposedPorts = Collections.newSetFromMap(new ConcurrentHashMap<>()); @Getter(value = AccessLevel.PRIVATE, lazy = true) private final Connection sshConnection = createSSHSession(); @@ -56,17 +58,15 @@ private Connection createSSHSession() { @SneakyThrows public void exposeHostPort(int port) { - if (exposedPorts.add(port)) { - getSshConnection().requestRemotePortForwarding("", port, "localhost", port); - } + exposeHostPort(port, port); } @SneakyThrows public void exposeHostPort(int hostPort, int containerPort) { - if (exposedPorts.add(hostPort)) { + if (exposedPorts.add(new AbstractMap.SimpleEntry<>(hostPort, containerPort))) { getSshConnection().requestRemotePortForwarding("", containerPort, "localhost", hostPort); } - } + } Optional getNetwork() { return Optional.ofNullable(container) From 9c96b37df4105d83b10ef327f950eb65feed0e04 Mon Sep 17 00:00:00 2001 From: Bodo Date: Mon, 25 Mar 2019 14:40:53 +0100 Subject: [PATCH 3/9] hostPort != containerPort --- .../org/testcontainers/containers/ExposedHostTest.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java index 30bb6573533..49c7e52d694 100644 --- a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java +++ b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java @@ -9,6 +9,8 @@ import java.io.OutputStream; import java.net.InetSocketAddress; +import java.util.HashMap; +import java.util.Map; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; @@ -29,7 +31,10 @@ public static void setUpClass() throws Exception { }); server.start(); - Testcontainers.exposeHostPorts(server.getAddress().getPort()); + + Map portMapping = new HashMap<>(); + portMapping.put(server.getAddress().getPort(), 80); + Testcontainers.exposeHostPorts(portMapping); } @AfterClass @@ -54,7 +59,7 @@ protected void assertResponse(GenericContainer container) { try { container.start(); - String response = container.execInContainer("wget", "-O", "-", "http://host.testcontainers.internal:" + server.getAddress().getPort()).getStdout(); + String response = container.execInContainer("wget", "-O", "-", "http://host.testcontainers.internal").getStdout(); assertEquals("received response", "Hello World!", response); } finally { From abc0cffa7cca6793d615d011a584d630a4228a6d Mon Sep 17 00:00:00 2001 From: Bodo Date: Mon, 25 Mar 2019 15:09:40 +0100 Subject: [PATCH 4/9] hostPort != containerPort --- .../java/org/testcontainers/containers/ExposedHostTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java index 49c7e52d694..f5a3a64d2d8 100644 --- a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java +++ b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java @@ -59,7 +59,7 @@ protected void assertResponse(GenericContainer container) { try { container.start(); - String response = container.execInContainer("wget", "-O", "-", "http://host.testcontainers.internal").getStdout(); + String response = container.execInContainer("wget", "-O", "-", "http://host.testcontainers.internal:80").getStdout(); assertEquals("received response", "Hello World!", response); } finally { From 81d4732ca2ffdb2ba3555ee764c7834627516014 Mon Sep 17 00:00:00 2001 From: Bodo Date: Mon, 25 Mar 2019 15:42:29 +0100 Subject: [PATCH 5/9] hostPort != containerPort --- .../containers/ExposedHostMapTest.java | 69 +++++++++++++++++++ .../containers/ExposedHostTest.java | 9 +-- 2 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 core/src/test/java/org/testcontainers/containers/ExposedHostMapTest.java diff --git a/core/src/test/java/org/testcontainers/containers/ExposedHostMapTest.java b/core/src/test/java/org/testcontainers/containers/ExposedHostMapTest.java new file mode 100644 index 00000000000..32eb26ec438 --- /dev/null +++ b/core/src/test/java/org/testcontainers/containers/ExposedHostMapTest.java @@ -0,0 +1,69 @@ +package org.testcontainers.containers; + +import com.sun.net.httpserver.HttpServer; +import lombok.SneakyThrows; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.testcontainers.Testcontainers; + +import java.io.OutputStream; +import java.net.InetSocketAddress; +import java.util.HashMap; +import java.util.Map; + +import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; + +public class ExposedHostMapTest { + + private static HttpServer server; + + @BeforeClass + public static void setUpClass() throws Exception { + server = HttpServer.create(new InetSocketAddress(0), 0); + server.createContext("/", exchange -> { + byte[] content = "Hello World!".getBytes(); + exchange.sendResponseHeaders(200, content.length); + try (OutputStream responseBody = exchange.getResponseBody()) { + responseBody.write(content); + responseBody.flush(); + } + }); + + server.start(); + + Map portMapping = new HashMap<>(); + portMapping.put(server.getAddress().getPort(), 80); + Testcontainers.exposeHostPorts(portMapping); + } + + @AfterClass + public static void tearDownClass() throws Exception { + server.stop(0); + } + + @Test + public void testExposedHost() throws Exception { + assertResponse(new GenericContainer().withCommand("top")); + } + + @Test + public void testExposedHostWithNetwork() throws Exception { + try (Network network = Network.newNetwork()) { + assertResponse(new GenericContainer().withNetwork(network).withCommand("top")); + } + } + + @SneakyThrows + protected void assertResponse(GenericContainer container) { + try { + container.start(); + + String response = container.execInContainer("wget", "-O", "-", "http://host.testcontainers.internal").getStdout(); + + assertEquals("received response", "Hello World!", response); + } finally { + container.stop(); + } + } +} diff --git a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java index f5a3a64d2d8..30bb6573533 100644 --- a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java +++ b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java @@ -9,8 +9,6 @@ import java.io.OutputStream; import java.net.InetSocketAddress; -import java.util.HashMap; -import java.util.Map; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; @@ -31,10 +29,7 @@ public static void setUpClass() throws Exception { }); server.start(); - - Map portMapping = new HashMap<>(); - portMapping.put(server.getAddress().getPort(), 80); - Testcontainers.exposeHostPorts(portMapping); + Testcontainers.exposeHostPorts(server.getAddress().getPort()); } @AfterClass @@ -59,7 +54,7 @@ protected void assertResponse(GenericContainer container) { try { container.start(); - String response = container.execInContainer("wget", "-O", "-", "http://host.testcontainers.internal:80").getStdout(); + String response = container.execInContainer("wget", "-O", "-", "http://host.testcontainers.internal:" + server.getAddress().getPort()).getStdout(); assertEquals("received response", "Hello World!", response); } finally { From da28a40b0aa6d5158c8b9fd140bc767dbb9573f7 Mon Sep 17 00:00:00 2001 From: Bodo Date: Fri, 29 Mar 2019 15:37:03 +0100 Subject: [PATCH 6/9] hostPort != containerPort --- .../containers/ExposedHostMapTest.java | 69 ------------------- .../containers/ExposedHostTest.java | 39 +++++++++-- 2 files changed, 35 insertions(+), 73 deletions(-) delete mode 100644 core/src/test/java/org/testcontainers/containers/ExposedHostMapTest.java diff --git a/core/src/test/java/org/testcontainers/containers/ExposedHostMapTest.java b/core/src/test/java/org/testcontainers/containers/ExposedHostMapTest.java deleted file mode 100644 index 32eb26ec438..00000000000 --- a/core/src/test/java/org/testcontainers/containers/ExposedHostMapTest.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.testcontainers.containers; - -import com.sun.net.httpserver.HttpServer; -import lombok.SneakyThrows; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; -import org.testcontainers.Testcontainers; - -import java.io.OutputStream; -import java.net.InetSocketAddress; -import java.util.HashMap; -import java.util.Map; - -import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; - -public class ExposedHostMapTest { - - private static HttpServer server; - - @BeforeClass - public static void setUpClass() throws Exception { - server = HttpServer.create(new InetSocketAddress(0), 0); - server.createContext("/", exchange -> { - byte[] content = "Hello World!".getBytes(); - exchange.sendResponseHeaders(200, content.length); - try (OutputStream responseBody = exchange.getResponseBody()) { - responseBody.write(content); - responseBody.flush(); - } - }); - - server.start(); - - Map portMapping = new HashMap<>(); - portMapping.put(server.getAddress().getPort(), 80); - Testcontainers.exposeHostPorts(portMapping); - } - - @AfterClass - public static void tearDownClass() throws Exception { - server.stop(0); - } - - @Test - public void testExposedHost() throws Exception { - assertResponse(new GenericContainer().withCommand("top")); - } - - @Test - public void testExposedHostWithNetwork() throws Exception { - try (Network network = Network.newNetwork()) { - assertResponse(new GenericContainer().withNetwork(network).withCommand("top")); - } - } - - @SneakyThrows - protected void assertResponse(GenericContainer container) { - try { - container.start(); - - String response = container.execInContainer("wget", "-O", "-", "http://host.testcontainers.internal").getStdout(); - - assertEquals("received response", "Hello World!", response); - } finally { - container.stop(); - } - } -} diff --git a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java index 30bb6573533..a9eeb4f2380 100644 --- a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java +++ b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java @@ -9,12 +9,15 @@ import java.io.OutputStream; import java.net.InetSocketAddress; +import java.util.HashMap; +import java.util.Map; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; public class ExposedHostTest { private static HttpServer server; + private static HttpServer serverPortMapping; @BeforeClass public static void setUpClass() throws Exception { @@ -30,31 +33,59 @@ public static void setUpClass() throws Exception { server.start(); Testcontainers.exposeHostPorts(server.getAddress().getPort()); + + serverPortMapping = HttpServer.create(new InetSocketAddress(0), 0); + serverPortMapping.createContext("/", exchange -> { + byte[] content = "Hello World!".getBytes(); + exchange.sendResponseHeaders(200, content.length); + try (OutputStream responseBody = exchange.getResponseBody()) { + responseBody.write(content); + responseBody.flush(); + } + }); + + serverPortMapping.start(); + Map portMapping = new HashMap<>(); + portMapping.put(serverPortMapping.getAddress().getPort(), 80); + Testcontainers.exposeHostPorts(portMapping); } @AfterClass public static void tearDownClass() throws Exception { server.stop(0); + serverPortMapping.stop(0); } @Test public void testExposedHost() throws Exception { - assertResponse(new GenericContainer().withCommand("top")); + assertResponse(new GenericContainer().withCommand("top"), server.getAddress().getPort()); } @Test public void testExposedHostWithNetwork() throws Exception { try (Network network = Network.newNetwork()) { - assertResponse(new GenericContainer().withNetwork(network).withCommand("top")); + assertResponse(new GenericContainer().withNetwork(network).withCommand("top"), server.getAddress().getPort()); } } + + @Test + public void testExposedHostPortMapping() throws Exception { + assertResponse(new GenericContainer().withCommand("top"), 80); + } + + @Test + public void testExposedHostWithNetworkPortMapping() throws Exception { + try (Network network = Network.newNetwork()) { + assertResponse(new GenericContainer().withNetwork(network).withCommand("top"), 80); + } + } @SneakyThrows - protected void assertResponse(GenericContainer container) { + protected void assertResponse(GenericContainer container, int port) { try { container.start(); - String response = container.execInContainer("wget", "-O", "-", "http://host.testcontainers.internal:" + server.getAddress().getPort()).getStdout(); + String response = container.execInContainer("wget", "-O", "-", "http://host.testcontainers.internal:" + port).getStdout(); assertEquals("received response", "Hello World!", response); } finally { From f500620630af9a2e33706b60f4e7aa75af13a041 Mon Sep 17 00:00:00 2001 From: Bodo Date: Fri, 29 Mar 2019 16:57:32 +0100 Subject: [PATCH 7/9] hostPort != containerPort --- .../containers/ExposedHostTest.java | 37 +++++++++---------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java index a9eeb4f2380..f2eb41a6fa7 100644 --- a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java +++ b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java @@ -1,5 +1,6 @@ package org.testcontainers.containers; +import com.google.common.collect.ImmutableMap; import com.sun.net.httpserver.HttpServer; import lombok.SneakyThrows; import org.junit.AfterClass; @@ -9,15 +10,12 @@ import java.io.OutputStream; import java.net.InetSocketAddress; -import java.util.HashMap; -import java.util.Map; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; public class ExposedHostTest { private static HttpServer server; - private static HttpServer serverPortMapping; @BeforeClass public static void setUpClass() throws Exception { @@ -34,26 +32,13 @@ public static void setUpClass() throws Exception { server.start(); Testcontainers.exposeHostPorts(server.getAddress().getPort()); - serverPortMapping = HttpServer.create(new InetSocketAddress(0), 0); - serverPortMapping.createContext("/", exchange -> { - byte[] content = "Hello World!".getBytes(); - exchange.sendResponseHeaders(200, content.length); - try (OutputStream responseBody = exchange.getResponseBody()) { - responseBody.write(content); - responseBody.flush(); - } - }); - - serverPortMapping.start(); - Map portMapping = new HashMap<>(); - portMapping.put(serverPortMapping.getAddress().getPort(), 80); - Testcontainers.exposeHostPorts(portMapping); + Testcontainers.exposeHostPorts(ImmutableMap.of(server.getAddress().getPort(), 80)); + Testcontainers.exposeHostPorts(ImmutableMap.of(server.getAddress().getPort(), 81)); } @AfterClass public static void tearDownClass() throws Exception { server.stop(0); - serverPortMapping.stop(0); } @Test @@ -69,15 +54,27 @@ public void testExposedHostWithNetwork() throws Exception { } @Test - public void testExposedHostPortMapping() throws Exception { + public void testExposedHostPortMappingEighty() throws Exception { assertResponse(new GenericContainer().withCommand("top"), 80); } @Test - public void testExposedHostWithNetworkPortMapping() throws Exception { + public void testExposedHostWithNetworkPortMappingEighty() throws Exception { try (Network network = Network.newNetwork()) { assertResponse(new GenericContainer().withNetwork(network).withCommand("top"), 80); } + } + + @Test + public void testExposedHostPortMappingEightyOne() throws Exception { + assertResponse(new GenericContainer().withCommand("top"), 81); + } + + @Test + public void testExposedHostWithNetworkPortMappingEightyOne() throws Exception { + try (Network network = Network.newNetwork()) { + assertResponse(new GenericContainer().withNetwork(network).withCommand("top"), 81); + } } @SneakyThrows From a5255cffb9e3f84e46ad980fcb1ac93311bb1443 Mon Sep 17 00:00:00 2001 From: Sergei Egorov Date: Fri, 29 Mar 2019 17:03:29 +0100 Subject: [PATCH 8/9] Update ExposedHostTest.java --- .../containers/ExposedHostTest.java | 26 ++++--------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java index f2eb41a6fa7..ad17816be50 100644 --- a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java +++ b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java @@ -32,8 +32,10 @@ public static void setUpClass() throws Exception { server.start(); Testcontainers.exposeHostPorts(server.getAddress().getPort()); - Testcontainers.exposeHostPorts(ImmutableMap.of(server.getAddress().getPort(), 80)); - Testcontainers.exposeHostPorts(ImmutableMap.of(server.getAddress().getPort(), 81)); + Testcontainers.exposeHostPorts(ImmutableMap.of( + server.getAddress().getPort(), 80, + server.getAddress().getPort(), 81 + )); } @AfterClass @@ -54,27 +56,9 @@ public void testExposedHostWithNetwork() throws Exception { } @Test - public void testExposedHostPortMappingEighty() throws Exception { + public void testExposedHostPortOnFixedInternalPorts() throws Exception { assertResponse(new GenericContainer().withCommand("top"), 80); - } - - @Test - public void testExposedHostWithNetworkPortMappingEighty() throws Exception { - try (Network network = Network.newNetwork()) { - assertResponse(new GenericContainer().withNetwork(network).withCommand("top"), 80); - } - } - - @Test - public void testExposedHostPortMappingEightyOne() throws Exception { assertResponse(new GenericContainer().withCommand("top"), 81); - } - - @Test - public void testExposedHostWithNetworkPortMappingEightyOne() throws Exception { - try (Network network = Network.newNetwork()) { - assertResponse(new GenericContainer().withNetwork(network).withCommand("top"), 81); - } } @SneakyThrows From 5951a35cc0246acb1f473782950c248828d59940 Mon Sep 17 00:00:00 2001 From: Sergei Egorov Date: Fri, 29 Mar 2019 17:09:05 +0100 Subject: [PATCH 9/9] Do not use the two-keys Map because of the key conflicts --- .../java/org/testcontainers/containers/ExposedHostTest.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java index ad17816be50..8c98b0730b0 100644 --- a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java +++ b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java @@ -32,10 +32,8 @@ public static void setUpClass() throws Exception { server.start(); Testcontainers.exposeHostPorts(server.getAddress().getPort()); - Testcontainers.exposeHostPorts(ImmutableMap.of( - server.getAddress().getPort(), 80, - server.getAddress().getPort(), 81 - )); + Testcontainers.exposeHostPorts(ImmutableMap.of(server.getAddress().getPort(), 80)); + Testcontainers.exposeHostPorts(ImmutableMap.of(server.getAddress().getPort(), 81)); } @AfterClass