Skip to content

Commit 62447b2

Browse files
authored
Add examples for port mapping
Closes #19
1 parent ba4661f commit 62447b2

File tree

3 files changed

+124
-4
lines changed

3 files changed

+124
-4
lines changed

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,13 @@ cartridge build at the image build stage.
232232

233233
An example of how to set the `TARANTOOL_CLUSTER_COOKIE` parameter: https://github.com/tarantool/testcontainers-java-tarantool/blob/355d1e985bd10beca83bc7ca77f919a288709419/src/test/java/org/testcontainers/containers/TarantoolCartridgeBootstrapFromLuaWithFixedPortsTest.java#L57-L82
234234

235+
##### Mapping ports
236+
237+
Often there is a need to connect to a container through a specific port. To achieve this goal it is necessary
238+
to know the mapped port specified in the Java code. To get the mapped port, use the getMappedPort(...)` method of
239+
testcontainers API. See examples: https://github.com/tarantool/testcontainers-java-tarantool/blob/ae580cb59d4621d7c11e5f80c394ec141d4c92b3/src/test/java/org/testcontainers/containers/TarantoolCartridgePortMappingTest.java#L22-L98
240+
241+
235242
## License
236243

237244
See [LICENSE](LICENSE).

pom.xml

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,17 +92,25 @@
9292
</dependency>
9393

9494
<!-- Test dependencies -->
95+
<dependency>
96+
<groupId>org.apache.httpcomponents</groupId>
97+
<artifactId>httpclient</artifactId>
98+
<version>4.5.1</version>
99+
<scope>test</scope>
100+
</dependency>
101+
95102
<dependency>
96103
<groupId>ch.qos.logback</groupId>
97104
<artifactId>logback-classic</artifactId>
98105
<version>1.3.4</version>
99106
<scope>test</scope>
100107
</dependency>
108+
101109
<dependency>
102-
<groupId>org.junit.jupiter</groupId>
103-
<artifactId>junit-jupiter</artifactId>
104-
<version>5.8.1</version>
105-
<scope>test</scope>
110+
<groupId>org.junit.jupiter</groupId>
111+
<artifactId>junit-jupiter</artifactId>
112+
<version>5.8.1</version>
113+
<scope>test</scope>
106114
</dependency>
107115
<dependency>
108116
<groupId>org.testcontainers</groupId>
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package org.testcontainers.containers;
2+
3+
import java.io.BufferedReader;
4+
import java.io.IOException;
5+
import java.io.InputStreamReader;
6+
import java.net.Socket;
7+
import java.net.URI;
8+
import java.net.URISyntaxException;
9+
import java.time.Duration;
10+
import java.util.concurrent.ThreadLocalRandom;
11+
12+
import org.apache.http.HttpResponse;
13+
import org.apache.http.client.methods.HttpGet;
14+
import org.apache.http.impl.client.CloseableHttpClient;
15+
import org.apache.http.impl.client.HttpClientBuilder;
16+
import org.junit.jupiter.api.Test;
17+
import org.slf4j.LoggerFactory;
18+
import org.testcontainers.containers.output.Slf4jLogConsumer;
19+
import org.testcontainers.junit.jupiter.Container;
20+
import static org.junit.jupiter.api.Assertions.assertEquals;
21+
import static org.junit.jupiter.api.Assertions.assertFalse;
22+
import static org.junit.jupiter.api.Assertions.assertTrue;
23+
24+
public class TarantoolCartridgePortMappingTest {
25+
26+
@Container
27+
private final static TarantoolCartridgeContainer container = new TarantoolCartridgeContainer(
28+
"Dockerfile",
29+
"mapping-ports-container",
30+
"cartridge/instances.yml",
31+
"cartridge/replicasets.yml")
32+
.withEnv(TarantoolCartridgeContainer.ENV_TARANTOOL_CLUSTER_COOKIE, "secret")
33+
.withRouterUsername("admin")
34+
.withRouterPassword("secret")
35+
.withStartupTimeout(Duration.ofMinutes(5))
36+
.withLogConsumer(new Slf4jLogConsumer(
37+
LoggerFactory.getLogger(TarantoolCartridgeBootstrapFromYamlTest.class)));
38+
39+
@Test
40+
void portMappingTest() throws IOException, URISyntaxException {
41+
42+
final int httpPortToFirstRouter = 8081;
43+
final int httpPortToSecondRouter = 8082;
44+
final int portToFirstRouter = 3301;
45+
final int portToSecondRouter = 3302;
46+
final String host = "localhost";
47+
final String schema = "http";
48+
49+
container.addExposedPorts(httpPortToFirstRouter, httpPortToSecondRouter, portToFirstRouter, portToSecondRouter);
50+
container.start();
51+
52+
URI firstRouterConnectionURI = new URI(schema, null, host,
53+
container.getMappedPort(httpPortToFirstRouter), null, null, null);
54+
55+
// send get request to first router via http
56+
HttpResponse response = sendCurlToRouterHttpAPI(firstRouterConnectionURI);
57+
assertEquals(200, response.getStatusLine().getStatusCode());
58+
59+
URI secondRouterConnectionURI = new URI(schema, null, host,
60+
container.getMappedPort(httpPortToSecondRouter), null, null, null);
61+
// send get request to second router via http
62+
response = sendCurlToRouterHttpAPI(secondRouterConnectionURI);
63+
assertEquals(200, response.getStatusLine().getStatusCode());
64+
65+
// connect to first router via socket
66+
URI firstRouterConnectionURIViaSocket = new URI(null, null, host,
67+
container.getMappedPort(portToFirstRouter), null, null, null);
68+
String result = connectToRouterViaSocket(firstRouterConnectionURIViaSocket);
69+
assertFalse(result.isEmpty());
70+
assertTrue(result.contains("Tarantool"));
71+
72+
// connect to second router via socket
73+
URI secondRouterConnectionURIViaSocket = new URI(null, null, host,
74+
container.getMappedPort(portToSecondRouter), null, null, null);
75+
result = connectToRouterViaSocket(secondRouterConnectionURIViaSocket);
76+
assertFalse(result.isEmpty());
77+
assertTrue(result.contains("Tarantool"));
78+
79+
// Connect to random port
80+
URI randomPortConnectionURIViaSocket = new URI(null, null, host,
81+
ThreadLocalRandom.current().nextInt(49152, 65535), null, null, null);
82+
result = connectToRouterViaSocket(randomPortConnectionURIViaSocket);
83+
assertTrue(result.isEmpty());
84+
}
85+
86+
private HttpResponse sendCurlToRouterHttpAPI(URI uri) throws IOException {
87+
try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
88+
HttpGet httpGetRequest = new HttpGet(uri);
89+
return httpClient.execute(httpGetRequest);
90+
}
91+
}
92+
93+
private String connectToRouterViaSocket(URI uri) {
94+
final String returnedString;
95+
96+
try (Socket socket = new Socket(uri.getHost(), uri.getPort());
97+
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
98+
99+
returnedString = in.readLine();
100+
} catch (IOException e) {
101+
return "";
102+
}
103+
return returnedString;
104+
}
105+
}

0 commit comments

Comments
 (0)