summaryrefslogtreecommitdiff
path: root/src/test/java/org
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-07-26 15:19:02 +0100
committerMichael Williamson <mike@zwobble.org>2026-07-26 15:19:02 +0100
commitcaa8d96e2d47301d4b0dfbc80dc63b5b5c990c82 (patch)
tree3ec3268647d7e27e110b542f8e86a8f4b3ae2ce4 /src/test/java/org
parent77b35839cb56bbe8cdbc1430abe53cdca21f437b (diff)
Support any length of stdout/stderr in test subprocess
Diffstat (limited to 'src/test/java/org')
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/testing/TestProcessRunner.java43
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];
+ }
}
}
}