1 package org.apache.maven.plugin.surefire.report;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.IOException;
23 import java.util.ArrayList;
24 import java.util.List;
25
26 import org.apache.maven.plugin.surefire.runorder.StatisticsReporter;
27 import org.apache.maven.surefire.report.ConsoleLogger;
28 import org.apache.maven.surefire.report.ConsoleOutputReceiver;
29 import org.apache.maven.surefire.report.ReportEntry;
30 import org.apache.maven.surefire.report.RunListener;
31
32
33
34
35
36
37
38 public class TestSetRunListener
39 implements RunListener, ConsoleOutputReceiver, ConsoleLogger
40 {
41 private final TestSetStats detailsForThis;
42
43 private List<TestMethodStats> testMethodStats;
44
45 private Utf8RecodingDeferredFileOutputStream testStdOut = initDeferred( "stdout" );
46
47 private Utf8RecodingDeferredFileOutputStream testStdErr = initDeferred( "stderr" );
48
49 private Utf8RecodingDeferredFileOutputStream initDeferred( String channel )
50 {
51 return new Utf8RecodingDeferredFileOutputStream( channel );
52 }
53
54 private final TestcycleConsoleOutputReceiver consoleOutputReceiver;
55
56 private final boolean briefOrPlainFormat;
57
58 private final StatelessXmlReporter simpleXMLReporter;
59
60 private final ConsoleReporter consoleReporter;
61
62 private final FileReporter fileReporter;
63
64 private final StatisticsReporter statisticsReporter;
65
66 @SuppressWarnings( "checkstyle:parameternumber" )
67 public TestSetRunListener( ConsoleReporter consoleReporter, FileReporter fileReporter,
68 StatelessXmlReporter simpleXMLReporter,
69 TestcycleConsoleOutputReceiver consoleOutputReceiver,
70 StatisticsReporter statisticsReporter, boolean trimStackTrace,
71 boolean isPlainFormat, boolean briefOrPlainFormat )
72 {
73 this.consoleReporter = consoleReporter;
74 this.fileReporter = fileReporter;
75 this.statisticsReporter = statisticsReporter;
76 this.simpleXMLReporter = simpleXMLReporter;
77 this.consoleOutputReceiver = consoleOutputReceiver;
78 this.briefOrPlainFormat = briefOrPlainFormat;
79 this.detailsForThis = new TestSetStats( trimStackTrace, isPlainFormat );
80 this.testMethodStats = new ArrayList<TestMethodStats>( );
81 }
82
83 public void info( String message )
84 {
85 if ( consoleReporter != null )
86 {
87 consoleReporter.writeMessage( message );
88 }
89 }
90
91 public void writeTestOutput( byte[] buf, int off, int len, boolean stdout )
92 {
93 try
94 {
95 if ( stdout )
96 {
97 testStdOut.write( buf, off, len );
98 }
99 else
100 {
101 testStdErr.write( buf, off, len );
102 }
103 }
104 catch ( IOException e )
105 {
106 throw new RuntimeException( e );
107 }
108 consoleOutputReceiver.writeTestOutput( buf, off, len, stdout );
109 }
110
111 public void testSetStarting( ReportEntry report )
112 {
113 detailsForThis.testSetStart();
114 if ( consoleReporter != null )
115 {
116 consoleReporter.testSetStarting( report );
117 }
118 consoleOutputReceiver.testSetStarting( report );
119 }
120
121 public void clearCapture()
122 {
123 testStdOut = initDeferred( "stdout" );
124 testStdErr = initDeferred( "stderr" );
125 }
126
127 public void testSetCompleted( ReportEntry report )
128 {
129 WrappedReportEntry wrap = wrapTestSet( report );
130 List<String> testResults = briefOrPlainFormat ? detailsForThis.getTestResults() : null;
131 if ( fileReporter != null )
132 {
133 fileReporter.testSetCompleted( wrap, detailsForThis, testResults );
134 }
135 if ( simpleXMLReporter != null )
136 {
137 simpleXMLReporter.testSetCompleted( wrap, detailsForThis );
138 }
139 if ( statisticsReporter != null )
140 {
141 statisticsReporter.testSetCompleted();
142 }
143 if ( consoleReporter != null )
144 {
145 consoleReporter.testSetCompleted( wrap, detailsForThis, testResults );
146 }
147 consoleOutputReceiver.testSetCompleted( wrap );
148 if ( consoleReporter != null )
149 {
150 consoleReporter.reset();
151 }
152
153 wrap.getStdout().free();
154 wrap.getStdErr().free();
155
156 addTestMethodStats();
157 detailsForThis.reset();
158
159 }
160
161
162
163
164
165 public void testStarting( ReportEntry report )
166 {
167 detailsForThis.testStart();
168
169 }
170
171 public void testSucceeded( ReportEntry reportEntry )
172 {
173 WrappedReportEntry wrapped = wrap( reportEntry, ReportEntryType.SUCCESS );
174 detailsForThis.testSucceeded( wrapped );
175 if ( statisticsReporter != null )
176 {
177 statisticsReporter.testSucceeded( reportEntry );
178 }
179 clearCapture();
180 }
181
182 public void testError( ReportEntry reportEntry )
183 {
184 WrappedReportEntry wrapped = wrap( reportEntry, ReportEntryType.ERROR );
185 detailsForThis.testError( wrapped );
186 if ( statisticsReporter != null )
187 {
188 statisticsReporter.testError( reportEntry );
189 }
190 clearCapture();
191 }
192
193 public void testFailed( ReportEntry reportEntry )
194 {
195 WrappedReportEntry wrapped = wrap( reportEntry, ReportEntryType.FAILURE );
196 detailsForThis.testFailure( wrapped );
197 if ( statisticsReporter != null )
198 {
199 statisticsReporter.testFailed( reportEntry );
200 }
201 clearCapture();
202 }
203
204
205
206
207
208 public void testSkipped( ReportEntry reportEntry )
209 {
210 WrappedReportEntry wrapped = wrap( reportEntry, ReportEntryType.SKIPPED );
211
212 detailsForThis.testSkipped( wrapped );
213 if ( statisticsReporter != null )
214 {
215 statisticsReporter.testSkipped( reportEntry );
216 }
217 clearCapture();
218 }
219
220 public void testExecutionSkippedByUser()
221 {
222 }
223
224 public void testAssumptionFailure( ReportEntry report )
225 {
226 testSkipped( report );
227 }
228
229 private WrappedReportEntry wrap( ReportEntry other, ReportEntryType reportEntryType )
230 {
231 final int estimatedElapsed;
232 if ( reportEntryType != ReportEntryType.SKIPPED )
233 {
234 if ( other.getElapsed() != null )
235 {
236 estimatedElapsed = other.getElapsed();
237 }
238 else
239 {
240 estimatedElapsed = detailsForThis.getElapsedSinceLastStart();
241 }
242 }
243 else
244 {
245 estimatedElapsed = 0;
246 }
247
248 return new WrappedReportEntry( other, reportEntryType, estimatedElapsed, testStdOut, testStdErr );
249 }
250
251 private WrappedReportEntry wrapTestSet( ReportEntry other )
252 {
253 return new WrappedReportEntry( other, null, other.getElapsed() != null
254 ? other.getElapsed()
255 : detailsForThis.getElapsedSinceTestSetStart(), testStdOut, testStdErr );
256 }
257
258 public void close()
259 {
260 if ( consoleOutputReceiver != null )
261 {
262 consoleOutputReceiver.close();
263 }
264 }
265
266 public void addTestMethodStats()
267 {
268 for ( WrappedReportEntry reportEntry : detailsForThis.getReportEntries() )
269 {
270 TestMethodStats methodStats =
271 new TestMethodStats( reportEntry.getClassMethodName(), reportEntry.getReportEntryType(),
272 reportEntry.getStackTraceWriter() );
273 testMethodStats.add( methodStats );
274 }
275 }
276
277 public List<TestMethodStats> getTestMethodStats()
278 {
279 return testMethodStats;
280 }
281 }