1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package org.htmlunit;
16
17 import java.io.ByteArrayOutputStream;
18 import java.io.OutputStream;
19 import java.io.PrintStream;
20 import java.util.regex.Pattern;
21
22 import org.apache.commons.lang3.StringUtils;
23 import org.junit.rules.MethodRule;
24 import org.junit.runners.model.FrameworkMethod;
25 import org.junit.runners.model.Statement;
26
27
28
29
30
31
32
33
34
35
36
37 public class ErrorOutputChecker implements MethodRule {
38 private PrintStream originalErr_;
39 private final ByteArrayOutputStream baos_ = new ByteArrayOutputStream();
40 private static final Pattern[] PATTERNS = {
41
42 Pattern.compile(".*Logging initialized .* to org.eclipse.jetty.util.log.StdErrLog.*\r?\n"),
43
44
45 Pattern.compile("SLF4J\\(I\\): .*\r?\n"),
46
47
48 Pattern.compile(".*com.caucho.quercus.servlet.QuercusServlet initImpl\r?\n"),
49 Pattern.compile(".*QuercusServlet starting as QuercusServletImpl\r?\n"),
50 Pattern.compile(".*Quercus finished initialization in \\d*ms\r?\n"),
51 };
52
53
54
55
56 @Override
57 public Statement apply(final Statement base, final FrameworkMethod method, final Object target) {
58 if (target instanceof WebDriverTestCase) {
59 final WebDriverTestCase testCase = (WebDriverTestCase) target;
60 if (testCase.useRealBrowser()) {
61 return base;
62 }
63 }
64
65 return new Statement() {
66 @Override
67 public void evaluate() throws Throwable {
68 wrapSystemErr();
69 try {
70 base.evaluate();
71 verifyNoOutput();
72 }
73 finally {
74 restoreSystemErr();
75 }
76 }
77 };
78 }
79
80 void verifyNoOutput() {
81 if (baos_.size() != 0) {
82 String output = baos_.toString();
83
84
85 for (final Pattern pattern : PATTERNS) {
86 output = pattern.matcher(output).replaceAll("");
87 }
88
89 if (!output.isEmpty()) {
90 if (output.contains("ChromeDriver")) {
91 throw new RuntimeException("Outdated Chrome driver version: " + output);
92 }
93 if (output.contains("geckodriver")) {
94 throw new RuntimeException("Outdated Gecko driver version: " + output);
95 }
96 output = StringUtils.replaceEach(output, new String[] {"\n", "\r"}, new String[]{"\\n", "\\r"});
97 throw new RuntimeException("Test has produced output to System.err: " + output);
98 }
99 }
100 }
101
102 private void wrapSystemErr() {
103 originalErr_ = System.err;
104 System.setErr(new NSAPrintStreamWrapper(originalErr_, baos_));
105 }
106
107 void restoreSystemErr() {
108 System.setErr(originalErr_);
109 }
110 }
111
112
113
114
115
116
117 class NSAPrintStreamWrapper extends PrintStream {
118 private PrintStream wrapped_;
119
120 NSAPrintStreamWrapper(final PrintStream original, final OutputStream spyOut) {
121 super(spyOut, true);
122 wrapped_ = original;
123 }
124
125
126
127
128 @Override
129 public int hashCode() {
130 return wrapped_.hashCode();
131 }
132
133
134
135
136 @Override
137 public boolean equals(final Object obj) {
138 return wrapped_.equals(obj);
139 }
140
141
142
143
144 @Override
145 public String toString() {
146 return wrapped_.toString();
147 }
148
149
150
151
152 @Override
153 public void flush() {
154 super.flush();
155 wrapped_.flush();
156 }
157
158
159
160
161 @Override
162 public void close() {
163 super.close();
164 wrapped_.close();
165 }
166
167
168
169
170 @Override
171 public boolean checkError() {
172 super.checkError();
173 return wrapped_.checkError();
174 }
175
176
177
178
179 @Override
180 public void write(final int b) {
181 super.write(b);
182 wrapped_.write(b);
183 }
184
185
186
187
188 @Override
189 public void write(final byte[] buf, final int off, final int len) {
190 super.write(buf, off, len);
191 wrapped_.write(buf, off, len);
192 }
193 }