Skip to content

Commit 789a4a0

Browse files
committed
Preserve stderr/stdout when the command fails early
1 parent 754c3c1 commit 789a4a0

File tree

2 files changed

+16
-4
lines changed

2 files changed

+16
-4
lines changed

lib/src/main/java/org/sonarsource/scanner/lib/internal/facade/forked/JavaRunner.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,15 +56,17 @@ public boolean execute(List<String> args, @Nullable String input, Consumer<Strin
5656
LOG.debug("Executing: {}", String.join(" ", command));
5757
}
5858
Process process = new ProcessBuilder(command).start();
59+
var stdoutConsummer = new StreamGobbler(process.getInputStream(), stdOutConsummer);
60+
var stdErrConsummer = new StreamGobbler(process.getErrorStream(), stderr -> LOG.error("[stderr] {}", stderr));
61+
stdErrConsummer.start();
62+
stdoutConsummer.start();
5963
if (input != null) {
6064
try (var stdin = process.getOutputStream(); var osw = new OutputStreamWriter(stdin, StandardCharsets.UTF_8)) {
6165
osw.write(input);
66+
} catch (IOException e) {
67+
LOG.debug("Failed to write to the Java command stdin", e);
6268
}
6369
}
64-
var stdoutConsummer = new StreamGobbler(process.getInputStream(), stdOutConsummer);
65-
var stdErrConsummer = new StreamGobbler(process.getErrorStream(), stderr -> LOG.error("[stderr] {}", stderr));
66-
stdErrConsummer.start();
67-
stdoutConsummer.start();
6870
var exitCode = process.waitFor();
6971
stdoutConsummer.join();
7072
stdErrConsummer.join();

lib/src/test/java/org/sonarsource/scanner/lib/internal/facade/forked/JavaRunnerTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,16 @@ void execute_whenInvalidRunner_shouldFail() {
6868
.hasMessageContaining("Failed to run the Java command");
6969
}
7070

71+
@Test
72+
void execute_whenReturnEarly_shouldLogUnableToWriteToStdin() {
73+
JavaRunner runner = new JavaRunner(Paths.get("java"), JreCacheHit.DISABLED);
74+
List<String> command = List.of("-xyz");
75+
assertThat(runner.execute(command, "test", stdOut::add)).isFalse();
76+
77+
assertThat(logTester.logs(Level.DEBUG)).isNotEmpty().contains("Failed to write to the Java command stdin");
78+
assertThat(logTester.logs(Level.ERROR)).isNotEmpty().anyMatch(s -> s.startsWith("[stderr] Unrecognized option: -xyz"));
79+
}
80+
7181
@Test
7282
void execute_shouldReturnFalseWhenNonZeroExitCode() {
7383
JavaRunner runner = new JavaRunner(Paths.get("java"), JreCacheHit.DISABLED);

0 commit comments

Comments
 (0)