1 package org.apache.maven.surefire.api.report;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import javax.annotation.Nonnull;
23
24 import java.io.IOException;
25 import java.io.OutputStream;
26 import java.io.PrintStream;
27
28 import static java.lang.System.setErr;
29 import static java.lang.System.setOut;
30 import static org.apache.maven.surefire.api.report.TestOutputReportEntry.stdErr;
31 import static org.apache.maven.surefire.api.report.TestOutputReportEntry.stdErrln;
32 import static org.apache.maven.surefire.api.report.TestOutputReportEntry.stdOut;
33 import static org.apache.maven.surefire.api.report.TestOutputReportEntry.stdOutln;
34
35
36
37
38
39 public final class ConsoleOutputCapture
40 {
41 public static void startCapture( TestOutputReceiver<OutputReportEntry> target )
42 {
43 setOut( new ForwardingPrintStream( true, target ) );
44 setErr( new ForwardingPrintStream( false, target ) );
45 }
46
47 private static final class ForwardingPrintStream
48 extends PrintStream
49 {
50 private final boolean isStdout;
51 private final TestOutputReceiver<OutputReportEntry> target;
52
53 ForwardingPrintStream( boolean stdout, TestOutputReceiver<OutputReportEntry> target )
54 {
55 super( new NullOutputStream() );
56 isStdout = stdout;
57 this.target = target;
58 }
59
60 @Override
61 public void write( @Nonnull byte[] buf, int off, int len )
62 {
63 String log = new String( buf, off, len );
64 target.writeTestOutput( isStdout ? stdOut( log ) : stdErr( log ) );
65 }
66
67 public void write( @Nonnull byte[] b )
68 throws IOException
69 {
70 write( b, 0, b.length );
71 }
72
73 @Override
74 public void write( int b )
75 {
76 try
77 {
78 write( new byte[] { (byte) b } );
79 }
80 catch ( IOException e )
81 {
82 setError();
83 }
84 }
85
86 @Override
87 public void println( boolean x )
88 {
89 println( x ? "true" : "false" );
90 }
91
92 @Override
93 public void println( char x )
94 {
95 println( String.valueOf( x ) );
96 }
97
98 @Override
99 public void println( int x )
100 {
101 println( String.valueOf( x ) );
102 }
103
104 @Override
105 public void println( long x )
106 {
107 println( String.valueOf( x ) );
108 }
109
110 @Override
111 public void println( float x )
112 {
113 println( String.valueOf( x ) );
114 }
115
116 @Override
117 public void println( double x )
118 {
119 println( String.valueOf( x ) );
120 }
121
122 @Override
123 public void println( @Nonnull char[] x )
124 {
125 println( String.valueOf( x ) );
126 }
127
128 @Override
129 public void println( Object x )
130 {
131 println( String.valueOf( x ) );
132 }
133
134 @Override
135 public void println( String s )
136 {
137 String log = s == null ? "null" : s;
138 target.writeTestOutput( isStdout ? stdOutln( log ) : stdErrln( log ) );
139 }
140
141 @Override
142 public void println()
143 {
144 target.writeTestOutput( isStdout ? stdOutln( "" ) : stdErrln( "" ) );
145 }
146
147 @Override
148 public void print( boolean x )
149 {
150 print( x ? "true" : "false" );
151 }
152
153 @Override
154 public void print( char x )
155 {
156 print( String.valueOf( x ) );
157 }
158
159 @Override
160 public void print( int x )
161 {
162 print( String.valueOf( x ) );
163 }
164
165 @Override
166 public void print( long x )
167 {
168 print( String.valueOf( x ) );
169 }
170
171 @Override
172 public void print( float x )
173 {
174 print( String.valueOf( x ) );
175 }
176
177 @Override
178 public void print( double x )
179 {
180 print( String.valueOf( x ) );
181 }
182
183 @Override
184 public void print( @Nonnull char[] x )
185 {
186 print( String.valueOf( x ) );
187 }
188
189 @Override
190 public void print( Object x )
191 {
192 print( String.valueOf( x ) );
193 }
194
195 @Override
196 public void print( String s )
197 {
198 String log = s == null ? "null" : s;
199 target.writeTestOutput( isStdout ? stdOut( log ) : stdErr( log ) );
200 }
201
202 @Override
203 public PrintStream append( CharSequence csq )
204 {
205 print( csq == null ? "null" : csq.toString() );
206 return this;
207 }
208
209 @Override
210 public PrintStream append( CharSequence csq, int start, int end )
211 {
212 CharSequence s = csq == null ? "null" : csq;
213 print( s.subSequence( start, end ).toString() );
214 return this;
215 }
216
217 @Override
218 public PrintStream append( char c )
219 {
220 print( c );
221 return this;
222 }
223
224 @Override
225 public void close()
226 {
227 }
228
229 @Override
230 public void flush()
231 {
232 }
233 }
234
235 private static final class NullOutputStream
236 extends OutputStream
237 {
238 @Override
239 public void write( int b )
240 {
241 }
242 }
243 }