summaryrefslogtreecommitdiff
path: root/src/main/java/testing/CleanHeadlessRunner.java
blob: 94b478439811739b544fe9dfa66ffc05e4a70f0a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
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();
        }
    }
}