diff options
Diffstat (limited to 'src/main/java/testing/CleanHeadlessRunner.java')
| -rw-r--r-- | src/main/java/testing/CleanHeadlessRunner.java | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/src/main/java/testing/CleanHeadlessRunner.java b/src/main/java/testing/CleanHeadlessRunner.java new file mode 100644 index 0000000..94b4784 --- /dev/null +++ b/src/main/java/testing/CleanHeadlessRunner.java @@ -0,0 +1,109 @@ +package testing; + +import java.io.*; + +/** + * A clean headless test runner that suppresses ALL GUI-related errors internally. + */ +public class CleanHeadlessRunner { + + public static void main(String[] args) { + // Redirect stderr to filter out GUI errors + PrintStream originalErr = System.err; + FilteringPrintStream filteringErr = new FilteringPrintStream(originalErr); + System.setErr(filteringErr); + + try { + // Run the actual tests + ProtocolTestRunnerWithLogs.main(args); + } finally { + // Restore original stderr + System.setErr(originalErr); + } + } + + /** + * A PrintStream that filters out GUI-related error messages. + */ + private static class FilteringPrintStream extends PrintStream { + private final PrintStream original; + private boolean inStackTrace = false; + + public FilteringPrintStream(PrintStream original) { + super(new FilteringOutputStream(original)); + this.original = original; + ((FilteringOutputStream) out).setPrintStream(this); + } + + @Override + public void println(String x) { + if (shouldFilter(x)) { + inStackTrace = true; + return; + } + if (inStackTrace && (x == null || x.trim().isEmpty() || !x.startsWith("\tat"))) { + inStackTrace = false; + } + if (!inStackTrace) { + super.println(x); + } + } + + @Override + public void print(String s) { + if (!inStackTrace && !shouldFilter(s)) { + super.print(s); + } + } + + private boolean shouldFilter(String message) { + if (message == null) return false; + + return message.contains("Component must have a valid peer") || + message.contains("java.lang.IllegalStateException") || + message.contains("createBufferStrategy") || + message.contains("FlipBufferStrategy") || + message.contains("at java.desktop/") || + message.contains("at simulator.VSSimulatorVisualization.paint") || + message.contains("VSMessageLine.<init>") || + message.contains("Error during simulation: null") || + (message.startsWith("java.lang.") && + message.contains("InvocationTargetException")); + } + } + + /** + * Custom OutputStream for filtering. + */ + private static class FilteringOutputStream extends OutputStream { + private final PrintStream target; + private final ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + private FilteringPrintStream parent; + + public FilteringOutputStream(PrintStream target) { + this.target = target; + } + + public void setPrintStream(FilteringPrintStream parent) { + this.parent = parent; + } + + @Override + public void write(int b) throws IOException { + buffer.write(b); + if (b == '\n') { + String line = buffer.toString(); + buffer.reset(); + + if (parent != null && !parent.shouldFilter(line)) { + target.print(line); + } + } + } + + @Override + public void flush() throws IOException { + target.flush(); + } + } +}
\ No newline at end of file |
