diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-07-26 15:19:02 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-07-26 15:19:02 +0100 |
| commit | caa8d96e2d47301d4b0dfbc80dc63b5b5c990c82 (patch) | |
| tree | 3ec3268647d7e27e110b542f8e86a8f4b3ae2ce4 | |
| parent | 77b35839cb56bbe8cdbc1430abe53cdca21f437b (diff) | |
Support any length of stdout/stderr in test subprocess
| -rw-r--r-- | src/test/java/org/zwobble/hobgoblin/compiler/testing/TestProcessRunner.java | 43 |
1 files changed, 35 insertions, 8 deletions
diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/testing/TestProcessRunner.java b/src/test/java/org/zwobble/hobgoblin/compiler/testing/TestProcessRunner.java index f4074f8..ba234d5 100644 --- a/src/test/java/org/zwobble/hobgoblin/compiler/testing/TestProcessRunner.java +++ b/src/test/java/org/zwobble/hobgoblin/compiler/testing/TestProcessRunner.java @@ -1,10 +1,10 @@ package org.zwobble.hobgoblin.compiler.testing; import java.io.IOException; +import java.io.Reader; import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.util.List; -import java.util.stream.Collectors; public class TestProcessRunner { public static TestProcessRunner command(List<String> command) { @@ -30,16 +30,43 @@ public class TestProcessRunner { public ExecutionResult runCaptureOutput() throws IOException, InterruptedException { var process = this.processBuilder.start(); + var stdout = ThreadReader.start(process.inputReader(StandardCharsets.UTF_8)); + var stderr = ThreadReader.start(process.errorReader(StandardCharsets.UTF_8)); var exitCode = process.waitFor(); - try ( - var stdoutReader = process.inputReader(StandardCharsets.UTF_8); - var stderrReader = process.errorReader(StandardCharsets.UTF_8) - ) { - var stdout = stdoutReader.lines().collect(Collectors.joining("\n")); - var stderr = stderrReader.lines().collect(Collectors.joining("\n")); + return new ExecutionResult(exitCode, stdout.waitForString(), stderr.waitForString()); + } + + private static class ThreadReader { + public static ThreadReader start(Reader reader) { + var lock = new Object(); + var output = new String[1]; + Thread.startVirtualThread(() -> { + synchronized (lock) { + try (reader) { + output[0] = reader.readAllAsString(); + } catch (IOException exception) { + // TODO: handle this more elegantly. + throw new RuntimeException(exception); + } + } + }); + + return new ThreadReader(lock, output); + } + + private final Object lock; + private final String[] output; + + public ThreadReader(Object lock, String[] output) { + this.lock = lock; + this.output = output; + } - return new ExecutionResult(exitCode, stdout, stderr); + public String waitForString() { + synchronized (this.lock) { + return this.output[0]; + } } } } |
