From 7a658e0fb51a3b2f4d2975379010ca54b0e1b2d2 Mon Sep 17 00:00:00 2001 From: admin Date: Sat, 1 Aug 2026 15:22:16 +0200 Subject: [PATCH 1/2] feat(activemq): add execInArtemis helper to ArtemisContainer (#11589) Adds a convenience method that wraps execInContainer, prepending the Artemis CLI binary path and auto-injecting the configured user and password credentials, so callers no longer have to hard-code the container path or manually pass --user/--password on every invocation. Signed-off-by: klouds27 --- .../activemq/ArtemisContainer.java | 20 +++++++++++++++++++ .../activemq/ArtemisContainerTest.java | 14 +++++++++++++ 2 files changed, 34 insertions(+) diff --git a/modules/activemq/src/main/java/org/testcontainers/activemq/ArtemisContainer.java b/modules/activemq/src/main/java/org/testcontainers/activemq/ArtemisContainer.java index 82072993b48..0d934a92ec8 100644 --- a/modules/activemq/src/main/java/org/testcontainers/activemq/ArtemisContainer.java +++ b/modules/activemq/src/main/java/org/testcontainers/activemq/ArtemisContainer.java @@ -1,10 +1,13 @@ package org.testcontainers.activemq; +import lombok.SneakyThrows; +import org.testcontainers.containers.Container.ExecResult; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.utility.DockerImageName; import java.time.Duration; +import java.util.stream.Stream; /** * Testcontainers implementation for Apache ActiveMQ Artemis. @@ -43,6 +46,8 @@ public class ArtemisContainer extends GenericContainer { private static final int WS_PORT = 61614; + private static final String ARTEMIS_CLI = "/var/lib/artemis-instance/bin/artemis"; + private String username = "artemis"; private String password = "artemis"; @@ -86,4 +91,19 @@ public String getUser() { public String getPassword() { return getEnvMap().get("ARTEMIS_PASSWORD"); } + + /** + * Executes an Artemis CLI command inside the container, automatically prepending the binary + * path and injecting the configured user and password credentials. + * + * @param command the CLI arguments (e.g. {@code "queue", "create", "--name=myqueue"}) + * @return the result of the command execution + */ + @SneakyThrows + public ExecResult execInArtemis(String... command) { + String[] fullCommand = Stream + .concat(Stream.of(ARTEMIS_CLI), Stream.concat(Stream.of(command), Stream.of("--user=" + getUser(), "--password=" + getPassword()))) + .toArray(String[]::new); + return execInContainer(fullCommand); + } } diff --git a/modules/activemq/src/test/java/org/testcontainers/activemq/ArtemisContainerTest.java b/modules/activemq/src/test/java/org/testcontainers/activemq/ArtemisContainerTest.java index 74cdfa76da7..d7e3cbb0a7e 100644 --- a/modules/activemq/src/test/java/org/testcontainers/activemq/ArtemisContainerTest.java +++ b/modules/activemq/src/test/java/org/testcontainers/activemq/ArtemisContainerTest.java @@ -11,6 +11,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.testcontainers.containers.Container.ExecResult; import static org.assertj.core.api.Assertions.assertThat; @@ -62,6 +63,19 @@ void allowAnonymousLogin() { } } + @Test + @SneakyThrows + void execInArtemis() { + try (ArtemisContainer artemis = new ArtemisContainer("apache/activemq-artemis:2.32.0-alpine")) { + artemis.start(); + + ExecResult result = artemis.execInArtemis( + "queue", "create", "--name=exec-test-queue", "--auto-create-address", "--anycast", "--silent" + ); + assertThat(result.getExitCode()).isEqualTo(0); + } + } + @ParameterizedTest @ValueSource(strings = { "apache/activemq-artemis:2.32.0-alpine", "apache/artemis:2.53.0-alpine" }) void compatibility(String image) { From 862045da086a04a1cc89ff916866ae6ca1a298fb Mon Sep 17 00:00:00 2001 From: admin Date: Sun, 2 Aug 2026 13:37:57 +0200 Subject: [PATCH 2/2] Address review feedback on execInArtemis helper Conditional credential injection: --user and --password are only appended when the caller has not already supplied them, so passing explicit credentials no longer fails with a duplicate-option error. Stronger test: after creating the queue, queue stat verifies it actually exists rather than relying on exit code alone, which artemis returns as 0 even on some failures. Docs: add execInArtemis codeinclude section to activemq.md and mark the test block so the docs generator picks it up. Signed-off-by: klouds27 --- docs/modules/activemq.md | 6 +++++ .../activemq/ArtemisContainer.java | 25 ++++++++++++------- .../activemq/ArtemisContainerTest.java | 14 ++++++++--- 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/docs/modules/activemq.md b/docs/modules/activemq.md index 7959c47576a..b907480ae67 100644 --- a/docs/modules/activemq.md +++ b/docs/modules/activemq.md @@ -37,6 +37,12 @@ With anonymous login: [Allow anonymous login](../../modules/activemq/src/test/java/org/testcontainers/activemq/ArtemisContainerTest.java) inside_block:enableAnonymousLogin +Running an Artemis CLI command: + + +[Executing a CLI command](../../modules/activemq/src/test/java/org/testcontainers/activemq/ArtemisContainerTest.java) inside_block:execInArtemis + + ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: diff --git a/modules/activemq/src/main/java/org/testcontainers/activemq/ArtemisContainer.java b/modules/activemq/src/main/java/org/testcontainers/activemq/ArtemisContainer.java index 0d934a92ec8..1c1a5d08e42 100644 --- a/modules/activemq/src/main/java/org/testcontainers/activemq/ArtemisContainer.java +++ b/modules/activemq/src/main/java/org/testcontainers/activemq/ArtemisContainer.java @@ -7,7 +7,9 @@ import org.testcontainers.utility.DockerImageName; import java.time.Duration; -import java.util.stream.Stream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; /** * Testcontainers implementation for Apache ActiveMQ Artemis. @@ -93,17 +95,22 @@ public String getPassword() { } /** - * Executes an Artemis CLI command inside the container, automatically prepending the binary - * path and injecting the configured user and password credentials. + * Executes an Artemis CLI command, prepending the binary path and injecting credentials unless already supplied. * - * @param command the CLI arguments (e.g. {@code "queue", "create", "--name=myqueue"}) - * @return the result of the command execution + * @param command the CLI arguments (e.g. {@code "queue", "create", "--name=myqueue"}). + * @return the result of the command execution. */ @SneakyThrows public ExecResult execInArtemis(String... command) { - String[] fullCommand = Stream - .concat(Stream.of(ARTEMIS_CLI), Stream.concat(Stream.of(command), Stream.of("--user=" + getUser(), "--password=" + getPassword()))) - .toArray(String[]::new); - return execInContainer(fullCommand); + List fullCommand = new ArrayList<>(); + fullCommand.add(ARTEMIS_CLI); + fullCommand.addAll(Arrays.asList(command)); + if (Arrays.stream(command).noneMatch(arg -> arg.startsWith("--user"))) { + fullCommand.add("--user=" + getUser()); + } + if (Arrays.stream(command).noneMatch(arg -> arg.startsWith("--password"))) { + fullCommand.add("--password=" + getPassword()); + } + return execInContainer(fullCommand.toArray(new String[0])); } } diff --git a/modules/activemq/src/test/java/org/testcontainers/activemq/ArtemisContainerTest.java b/modules/activemq/src/test/java/org/testcontainers/activemq/ArtemisContainerTest.java index d7e3cbb0a7e..aa2528d70f1 100644 --- a/modules/activemq/src/test/java/org/testcontainers/activemq/ArtemisContainerTest.java +++ b/modules/activemq/src/test/java/org/testcontainers/activemq/ArtemisContainerTest.java @@ -69,10 +69,18 @@ void execInArtemis() { try (ArtemisContainer artemis = new ArtemisContainer("apache/activemq-artemis:2.32.0-alpine")) { artemis.start(); - ExecResult result = artemis.execInArtemis( - "queue", "create", "--name=exec-test-queue", "--auto-create-address", "--anycast", "--silent" + // execInArtemis { + artemis.execInArtemis( + "queue", + "create", + "--name=exec-test-queue", + "--auto-create-address", + "--anycast", + "--silent" ); - assertThat(result.getExitCode()).isEqualTo(0); + ExecResult stat = artemis.execInArtemis("queue", "stat", "--queueName=exec-test-queue"); + assertThat(stat.getStdout()).contains("exec-test-queue"); + // } } }