diff options
Diffstat (limited to 'src/test/java/org/zwobble')
| -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]; + } } } } |
