diff --git a/core/src/main/java/org/testcontainers/containers/ExecInContainerPattern.java b/core/src/main/java/org/testcontainers/containers/ExecInContainerPattern.java index 1ed23224e5e..b0903095c8d 100644 --- a/core/src/main/java/org/testcontainers/containers/ExecInContainerPattern.java +++ b/core/src/main/java/org/testcontainers/containers/ExecInContainerPattern.java @@ -16,8 +16,10 @@ import java.io.IOException; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; +import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; /** @@ -199,7 +201,11 @@ public Container.ExecResult execInContainer( String containerId = containerInfo.getId(); String containerName = containerInfo.getName(); - String[] command = execConfig.getCommand(); + String[] command = Arrays + .stream(execConfig.getCommand()) + .filter(Objects::nonNull) + .filter(str -> !str.trim().isEmpty()) + .toArray(String[]::new); log.debug("{}: Running \"exec\" command: {}", containerName, String.join(" ", command)); final ExecCreateCmd execCreateCmd = dockerClient .execCreateCmd(containerId) diff --git a/core/src/test/java/org/testcontainers/junit/ExecInContainerTest.java b/core/src/test/java/org/testcontainers/junit/ExecInContainerTest.java index 365229e5909..ec7dc6375f7 100644 --- a/core/src/test/java/org/testcontainers/junit/ExecInContainerTest.java +++ b/core/src/test/java/org/testcontainers/junit/ExecInContainerTest.java @@ -3,6 +3,9 @@ import org.assertj.core.api.Assumptions; import org.junit.jupiter.api.AutoClose; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullSource; +import org.junit.jupiter.params.provider.ValueSource; import org.testcontainers.TestImages; import org.testcontainers.containers.ExecConfig; import org.testcontainers.containers.GenericContainer; @@ -36,6 +39,19 @@ void shouldExecuteCommand() throws Exception { // We expect to reach this point for modern Docker versions. } + @ParameterizedTest + @NullSource + @ValueSource(strings = { "", " ", " " }) + void shouldExecuteCommandAndSkipCommand(String commandParam) throws Exception { + Assumptions.assumeThat(TestEnvironment.dockerExecutionDriverSupportsExec()).isTrue(); + + final GenericContainer.ExecResult result = redis.execInContainer("redis-cli", commandParam, "role"); + assertThat(result.getStdout()) + .as("Output for \"redis-cli role\" command should start with \"master\"") + .startsWith("master"); + assertThat(result.getStderr()).as("Stderr for \"redis-cli role\" command should be empty").isEmpty(); + } + @Test void shouldExecuteCommandWithUser() throws Exception { // The older "lxc" execution driver doesn't support "exec". At the time of writing (2016/03/29),