Skip to content

Commit 87bf5bf

Browse files
authored
Set RABBITMQ_DEFAULT_USER env var with withAdminUser (#9571)
Currently, `RabbitMQContainer` allow to customize the admin password. This commit allows to customize the user. Fixes #9570
1 parent 15a150a commit 87bf5bf

File tree

2 files changed

+75
-29
lines changed

2 files changed

+75
-29
lines changed

modules/rabbitmq/src/main/java/org/testcontainers/containers/RabbitMQContainer.java

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import org.testcontainers.utility.MountableFile;
1010

1111
import java.io.IOException;
12-
import java.time.Duration;
1312
import java.util.ArrayList;
1413
import java.util.Arrays;
1514
import java.util.List;
@@ -76,14 +75,16 @@ public RabbitMQContainer(final DockerImageName dockerImageName) {
7675

7776
addExposedPorts(DEFAULT_AMQP_PORT, DEFAULT_AMQPS_PORT, DEFAULT_HTTP_PORT, DEFAULT_HTTPS_PORT);
7877

79-
this.waitStrategy =
80-
Wait.forLogMessage(".*Server startup complete.*", 1).withStartupTimeout(Duration.ofSeconds(60));
78+
waitingFor(Wait.forLogMessage(".*Server startup complete.*", 1));
8179
}
8280

8381
@Override
8482
protected void configure() {
85-
if (adminPassword != null) {
86-
addEnv("RABBITMQ_DEFAULT_PASS", adminPassword);
83+
if (this.adminUsername != null) {
84+
addEnv("RABBITMQ_DEFAULT_USER", this.adminUsername);
85+
}
86+
if (this.adminPassword != null) {
87+
addEnv("RABBITMQ_DEFAULT_PASS", this.adminPassword);
8788
}
8889
}
8990

@@ -105,11 +106,14 @@ protected void containerIsStarted(InspectContainerResponse containerInfo) {
105106
* @return The admin password for the <code>admin</code> account
106107
*/
107108
public String getAdminPassword() {
108-
return adminPassword;
109+
return this.adminPassword;
109110
}
110111

112+
/**
113+
* @return The admin user for the <code>admin</code> account
114+
*/
111115
public String getAdminUsername() {
112-
return adminUsername;
116+
return this.adminUsername;
113117
}
114118

115119
public Integer getAmqpPort() {
@@ -156,6 +160,17 @@ public String getHttpsUrl() {
156160
return "https://" + getHost() + ":" + getHttpsPort();
157161
}
158162

163+
/**
164+
* Sets the user for the admin (default is <pre>guest</pre>)
165+
*
166+
* @param adminUsername The admin user.
167+
* @return This container.
168+
*/
169+
public RabbitMQContainer withAdminUser(final String adminUsername) {
170+
this.adminUsername = adminUsername;
171+
return this;
172+
}
173+
159174
/**
160175
* Sets the password for the admin (default is <pre>guest</pre>)
161176
*

modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQContainerTest.java

Lines changed: 53 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,23 @@
55
import com.rabbitmq.client.Channel;
66
import com.rabbitmq.client.Connection;
77
import com.rabbitmq.client.ConnectionFactory;
8+
import com.rabbitmq.client.DeliverCallback;
89
import org.junit.Test;
910
import org.testcontainers.containers.RabbitMQContainer.SslVerification;
1011
import org.testcontainers.utility.MountableFile;
1112

1213
import java.io.File;
13-
import java.io.FileInputStream;
1414
import java.io.IOException;
15+
import java.nio.charset.StandardCharsets;
16+
import java.nio.file.Files;
1517
import java.security.KeyManagementException;
1618
import java.security.KeyStore;
1719
import java.security.KeyStoreException;
1820
import java.security.NoSuchAlgorithmException;
1921
import java.security.UnrecoverableKeyException;
2022
import java.security.cert.CertificateException;
2123
import java.util.Collections;
24+
import java.util.concurrent.TimeoutException;
2225

2326
import javax.net.ssl.KeyManagerFactory;
2427
import javax.net.ssl.SSLContext;
@@ -40,32 +43,19 @@ public class RabbitMQContainerTest {
4043
@Test
4144
public void shouldCreateRabbitMQContainer() {
4245
try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) {
46+
container.start();
47+
4348
assertThat(container.getAdminPassword()).isEqualTo("guest");
4449
assertThat(container.getAdminUsername()).isEqualTo("guest");
4550

46-
container.start();
47-
4851
assertThat(container.getAmqpsUrl())
49-
.isEqualTo(
50-
String.format("amqps://%s:%d", container.getHost(), container.getMappedPort(DEFAULT_AMQPS_PORT))
51-
);
52+
.isEqualTo(String.format("amqps://%s:%d", container.getHost(), container.getAmqpsPort()));
5253
assertThat(container.getAmqpUrl())
53-
.isEqualTo(
54-
String.format("amqp://%s:%d", container.getHost(), container.getMappedPort(DEFAULT_AMQP_PORT))
55-
);
54+
.isEqualTo(String.format("amqp://%s:%d", container.getHost(), container.getAmqpPort()));
5655
assertThat(container.getHttpsUrl())
57-
.isEqualTo(
58-
String.format("https://%s:%d", container.getHost(), container.getMappedPort(DEFAULT_HTTPS_PORT))
59-
);
56+
.isEqualTo(String.format("https://%s:%d", container.getHost(), container.getHttpsPort()));
6057
assertThat(container.getHttpUrl())
61-
.isEqualTo(
62-
String.format("http://%s:%d", container.getHost(), container.getMappedPort(DEFAULT_HTTP_PORT))
63-
);
64-
65-
assertThat(container.getHttpsPort()).isEqualTo(container.getMappedPort(DEFAULT_HTTPS_PORT));
66-
assertThat(container.getHttpPort()).isEqualTo(container.getMappedPort(DEFAULT_HTTP_PORT));
67-
assertThat(container.getAmqpsPort()).isEqualTo(container.getMappedPort(DEFAULT_AMQPS_PORT));
68-
assertThat(container.getAmqpPort()).isEqualTo(container.getMappedPort(DEFAULT_AMQP_PORT));
58+
.isEqualTo(String.format("http://%s:%d", container.getHost(), container.getHttpPort()));
6959

7060
assertThat(container.getLivenessCheckPortNumbers())
7161
.containsExactlyInAnyOrder(
@@ -74,6 +64,24 @@ public void shouldCreateRabbitMQContainer() {
7464
container.getMappedPort(DEFAULT_HTTP_PORT),
7565
container.getMappedPort(DEFAULT_HTTPS_PORT)
7666
);
67+
68+
assertFunctionality(container);
69+
}
70+
}
71+
72+
@Test
73+
public void shouldCreateRabbitMQContainerWithCustomCredentials() {
74+
try (
75+
RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)
76+
.withAdminUser("admin")
77+
.withAdminPassword("admin")
78+
) {
79+
container.start();
80+
81+
assertThat(container.getAdminPassword()).isEqualTo("admin");
82+
assertThat(container.getAdminUsername()).isEqualTo("admin");
83+
84+
assertFunctionality(container);
7785
}
7886
}
7987

@@ -283,15 +291,15 @@ private SSLContext createSslContext(
283291

284292
KeyStore ks = KeyStore.getInstance("PKCS12");
285293
ks.load(
286-
new FileInputStream(new File(classLoader.getResource(keystoreFile).getFile())),
294+
Files.newInputStream(new File(classLoader.getResource(keystoreFile).getFile()).toPath()),
287295
keystorePassword.toCharArray()
288296
);
289297
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
290298
kmf.init(ks, "password".toCharArray());
291299

292300
KeyStore trustStore = KeyStore.getInstance("PKCS12");
293301
trustStore.load(
294-
new FileInputStream(new File(classLoader.getResource(truststoreFile).getFile())),
302+
Files.newInputStream(new File(classLoader.getResource(truststoreFile).getFile()).toPath()),
295303
truststorePassword.toCharArray()
296304
);
297305
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
@@ -301,4 +309,27 @@ private SSLContext createSslContext(
301309
c.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
302310
return c;
303311
}
312+
313+
private void assertFunctionality(RabbitMQContainer container) {
314+
String queueName = "test-queue";
315+
String text = "Hello World!";
316+
317+
ConnectionFactory factory = new ConnectionFactory();
318+
factory.setHost(container.getHost());
319+
factory.setPort(container.getAmqpPort());
320+
factory.setUsername(container.getAdminUsername());
321+
factory.setPassword(container.getAdminPassword());
322+
try (Connection connection = factory.newConnection(); Channel channel = connection.createChannel()) {
323+
channel.queueDeclare(queueName, false, false, false, null);
324+
channel.basicPublish("", queueName, null, text.getBytes());
325+
326+
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
327+
String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
328+
assertThat(message).isEqualTo(text);
329+
};
330+
channel.basicConsume(queueName, true, deliverCallback, consumerTag -> {});
331+
} catch (IOException | TimeoutException e) {
332+
throw new RuntimeException(e);
333+
}
334+
}
304335
}

0 commit comments

Comments
 (0)