From 472d6b6af8f53b9b43d1df994d189aed8e0bc276 Mon Sep 17 00:00:00 2001 From: Mohammed Daudali Date: Mon, 9 Feb 2026 22:30:04 +0000 Subject: [PATCH] add stderr --- .../docker/compose/execution/Command.java | 12 +++++- .../compose/execution/CommandShould.java | 41 ++++++++++++++++++- 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/docker-compose-rule-core/src/main/java/com/palantir/docker/compose/execution/Command.java b/docker-compose-rule-core/src/main/java/com/palantir/docker/compose/execution/Command.java index 1abe44cc0..6594e1a69 100644 --- a/docker-compose-rule-core/src/main/java/com/palantir/docker/compose/execution/Command.java +++ b/docker-compose-rule-core/src/main/java/com/palantir/docker/compose/execution/Command.java @@ -80,10 +80,20 @@ private ProcessResult run(String... commands) throws IOException, InterruptedExc } private String processOutputFrom(Process process) { - return asReader(process.getInputStream()) + String stdout = asReader(process.getInputStream()) .lines() .peek(logConsumer) .collect(Collectors.joining(System.lineSeparator())); + + String stderr = asReader(process.getErrorStream()) + .lines() + .peek(logConsumer) + .collect(Collectors.joining(System.lineSeparator())); + + return String.format( + "STDERR: %s\n\n------\n\nSTDOUT: %s\n", + stderr.isEmpty() ? "" : stderr, + stdout.isEmpty() ? "" : stdout); } private static String waitForResultFrom(Future outputProcessing) { diff --git a/docker-compose-rule-core/src/test/java/com/palantir/docker/compose/execution/CommandShould.java b/docker-compose-rule-core/src/test/java/com/palantir/docker/compose/execution/CommandShould.java index ced6ed63e..512f3886a 100644 --- a/docker-compose-rule-core/src/test/java/com/palantir/docker/compose/execution/CommandShould.java +++ b/docker-compose-rule-core/src/test/java/com/palantir/docker/compose/execution/CommandShould.java @@ -53,6 +53,7 @@ public void before() throws IOException { dockerComposeCommand = new Command(dockerComposeExecutable, logConsumer); givenTheUnderlyingProcessHasOutput(""); + givenTheUnderlyingProcessHasError(""); givenTheUnderlyingProcessTerminatesWithAnExitCodeOf(0); } @@ -72,7 +73,7 @@ public void return_output_when_exit_code_of_the_executed_process_is_non_0() givenTheUnderlyingProcessHasOutput(expectedOutput); String commandOutput = dockerComposeCommand.execute(errorHandler, "rm", "-f"); - assertThat(commandOutput).isEqualTo(expectedOutput); + assertThat(commandOutput).isEqualTo("STDERR: \n\n------\n\nSTDOUT: " + expectedOutput + "\n"); } @Test @@ -81,7 +82,29 @@ public void return_output_when_exit_code_of_the_executed_process_is_0() throws I givenTheUnderlyingProcessHasOutput(expectedOutput); String commandOutput = dockerComposeCommand.execute(errorHandler, "rm", "-f"); - assertThat(commandOutput).isEqualTo(expectedOutput); + assertThat(commandOutput).isEqualTo("STDERR: \n\n------\n\nSTDOUT: " + expectedOutput + "\n"); + } + + @Test + public void return_output_when_only_stderr_is_present() throws IOException, InterruptedException { + String expectedStderr = "error output"; + givenTheUnderlyingProcessHasError(expectedStderr); + String commandOutput = dockerComposeCommand.execute(errorHandler, "rm", "-f"); + + assertThat(commandOutput) + .isEqualTo("STDERR: " + expectedStderr + "\n\n------\n\nSTDOUT: \n"); + } + + @Test + public void return_output_containing_both_stderr_and_stdout() throws IOException, InterruptedException { + String expectedStdout = "standard output"; + String expectedStderr = "error output"; + givenTheUnderlyingProcessHasOutput(expectedStdout); + givenTheUnderlyingProcessHasError(expectedStderr); + String commandOutput = dockerComposeCommand.execute(errorHandler, "rm", "-f"); + + assertThat(commandOutput) + .isEqualTo("STDERR: " + expectedStderr + "\n\n------\n\nSTDOUT: " + expectedStdout + "\n"); } @Test @@ -94,6 +117,16 @@ public void give_the_output_to_the_specified_consumer_as_it_is_available() assertThat(consumedLogLines).containsExactly("line 1", "line 2"); } + @Test + public void give_both_stdout_and_stderr_to_the_specified_consumer() throws IOException, InterruptedException { + givenTheUnderlyingProcessHasOutput("stdout line"); + givenTheUnderlyingProcessHasError("stderr line"); + + dockerComposeCommand.execute(errorHandler, "rm", "-f"); + + assertThat(consumedLogLines).containsExactly("stdout line", "stderr line"); + } + // flaky test: https://circleci.com/gh/palantir/docker-compose-rule/378, 370, 367, 366 @Ignore @Test @@ -110,6 +143,10 @@ private void givenTheUnderlyingProcessHasOutput(String output) { when(executedProcess.getInputStream()).thenReturn(toInputStream(output)); } + private void givenTheUnderlyingProcessHasError(String error) { + when(executedProcess.getErrorStream()).thenReturn(toInputStream(error)); + } + private void givenTheUnderlyingProcessTerminatesWithAnExitCodeOf(int exitCode) { when(executedProcess.exitValue()).thenReturn(exitCode); }