Skip to content

Commit cce90eb

Browse files
[Enhancement]: Update waiting strategy for Mockserver container (#6951)
Replace `Wait.forHttp` for `Wait.forLogMessage`. This change will allow Mockserver to work with HTTP and HTTPS requests. Fixes #6647
1 parent ab90c0f commit cce90eb

File tree

3 files changed

+74
-1
lines changed

3 files changed

+74
-1
lines changed

modules/mockserver/src/main/java/org/testcontainers/containers/MockServerContainer.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public MockServerContainer(DockerImageName dockerImageName) {
3636
super(dockerImageName);
3737
dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME, DockerImageName.parse("mockserver/mockserver"));
3838

39-
waitingFor(Wait.forHttp("/mockserver/status").withMethod("PUT").forStatusCode(200));
39+
waitingFor(Wait.forLogMessage(".*started on port: " + PORT + ".*", 1));
4040

4141
withCommand("-serverPort " + PORT);
4242
addExposedPorts(PORT);
@@ -46,6 +46,10 @@ public String getEndpoint() {
4646
return String.format("http://%s:%d", getHost(), getMappedPort(PORT));
4747
}
4848

49+
public String getSecureEndpoint() {
50+
return String.format("https://%s:%d", getHost(), getMappedPort(PORT));
51+
}
52+
4953
public Integer getServerPort() {
5054
return getMappedPort(PORT);
5155
}

modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerTest.java

+47
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,53 @@ public void shouldCallActualMockserverVersion() throws Exception {
3333
}
3434
}
3535

36+
@Test
37+
public void shouldCallMockserverUsingTlsProtocol() throws Exception {
38+
try (MockServerContainer mockServer = new MockServerContainer(MOCKSERVER_IMAGE)) {
39+
mockServer.start();
40+
41+
String expectedBody = "Hello World!";
42+
43+
try (
44+
MockServerClient client = new MockServerClient(mockServer.getHost(), mockServer.getServerPort())
45+
.withSecure(true)
46+
) {
47+
assertThat(client.hasStarted()).as("Mockserver running").isTrue();
48+
49+
client.when(request().withPath("/hello")).respond(response().withBody(expectedBody));
50+
51+
assertThat(SimpleHttpClient.secureResponseFromMockserver(mockServer, "/hello"))
52+
.as("MockServer returns correct result")
53+
.isEqualTo(expectedBody);
54+
}
55+
}
56+
}
57+
58+
@Test
59+
public void shouldCallMockserverUsingMutualTlsProtocol() throws Exception {
60+
try (
61+
MockServerContainer mockServer = new MockServerContainer(MOCKSERVER_IMAGE)
62+
.withEnv("MOCKSERVER_TLS_MUTUAL_AUTHENTICATION_REQUIRED", "true")
63+
) {
64+
mockServer.start();
65+
66+
String expectedBody = "Hello World!";
67+
68+
try (
69+
MockServerClient client = new MockServerClient(mockServer.getHost(), mockServer.getServerPort())
70+
.withSecure(true)
71+
) {
72+
assertThat(client.hasStarted()).as("Mockserver running").isTrue();
73+
74+
client.when(request().withPath("/hello")).respond(response().withBody(expectedBody));
75+
76+
assertThat(SimpleHttpClient.secureResponseFromMockserver(mockServer, "/hello"))
77+
.as("MockServer returns correct result")
78+
.isEqualTo(expectedBody);
79+
}
80+
}
81+
}
82+
3683
@Test
3784
public void newVersionStartsWithDefaultWaitStrategy() {
3885
try (MockServerContainer mockServer = new MockServerContainer(MOCKSERVER_IMAGE)) {

modules/mockserver/src/test/java/org/testcontainers/containers/SimpleHttpClient.java

+22
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
package org.testcontainers.containers;
22

33
import lombok.Cleanup;
4+
import org.mockserver.configuration.Configuration;
5+
import org.mockserver.logging.MockServerLogger;
6+
import org.mockserver.socket.tls.KeyStoreFactory;
47

58
import java.io.BufferedReader;
69
import java.io.IOException;
710
import java.io.InputStreamReader;
811
import java.net.URL;
912
import java.net.URLConnection;
1013

14+
import javax.net.ssl.HttpsURLConnection;
15+
1116
public class SimpleHttpClient {
1217

1318
public static String responseFromMockserver(MockServerContainer mockServer, String path) throws IOException {
@@ -16,4 +21,21 @@ public static String responseFromMockserver(MockServerContainer mockServer, Stri
1621
BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
1722
return reader.readLine();
1823
}
24+
25+
public static String secureResponseFromMockserver(MockServerContainer mockServer, String path) throws IOException {
26+
HttpsURLConnection httpUrlConnection = (HttpsURLConnection) new URL(mockServer.getSecureEndpoint() + path)
27+
.openConnection();
28+
try {
29+
httpUrlConnection.setSSLSocketFactory(
30+
new KeyStoreFactory(Configuration.configuration(), new MockServerLogger())
31+
.sslContext()
32+
.getSocketFactory()
33+
);
34+
@Cleanup
35+
BufferedReader reader = new BufferedReader(new InputStreamReader(httpUrlConnection.getInputStream()));
36+
return reader.readLine();
37+
} finally {
38+
httpUrlConnection.disconnect();
39+
}
40+
}
1941
}

0 commit comments

Comments
 (0)