1 package org.apache.maven.surefire.suite;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.ByteArrayOutputStream;
23 import java.io.PrintWriter;
24
25
26
27
28
29
30
31
32
33 public class RunResult
34 {
35 private final int completedCount;
36
37 private final int errors;
38
39 private final int failures;
40
41 private final int skipped;
42
43 private final int flakes;
44
45 private final String failure;
46
47 private final boolean timeout;
48
49 public static final int SUCCESS = 0;
50
51 private static final int FAILURE = 255;
52
53 private static final int NO_TESTS = 254;
54
55 public static RunResult timeout( RunResult accumulatedAtTimeout )
56 {
57 return errorCode( accumulatedAtTimeout, accumulatedAtTimeout.getFailure(), true );
58 }
59
60 public static RunResult failure( RunResult accumulatedAtTimeout, Exception cause )
61 {
62 return errorCode( accumulatedAtTimeout, getStackTrace( cause ), accumulatedAtTimeout.isTimeout() );
63 }
64
65 private static RunResult errorCode( RunResult other, String failure, boolean timeout )
66 {
67 return new RunResult( other.getCompletedCount(), other.getErrors(), other.getFailures(), other.getSkipped(),
68 failure, timeout );
69 }
70
71 public RunResult( int completedCount, int errors, int failures, int skipped )
72 {
73 this( completedCount, errors, failures, skipped, null, false );
74 }
75
76 public RunResult( int completedCount, int errors, int failures, int skipped, int flakes )
77 {
78 this( completedCount, errors, failures, skipped, flakes, null, false );
79 }
80
81 public RunResult( int completedCount, int errors, int failures, int skipped, String failure, boolean timeout )
82 {
83 this( completedCount, errors, failures, skipped, 0, failure, timeout );
84 }
85
86 public RunResult( int completedCount, int errors, int failures, int skipped, int flakes, String failure,
87 boolean timeout )
88 {
89 this.completedCount = completedCount;
90 this.errors = errors;
91 this.failures = failures;
92 this.skipped = skipped;
93 this.failure = failure;
94 this.timeout = timeout;
95 this.flakes = flakes;
96 }
97
98 private static String getStackTrace( Exception e )
99 {
100 if ( e == null )
101 {
102 return null;
103 }
104 ByteArrayOutputStream out = new ByteArrayOutputStream();
105 PrintWriter pw = new PrintWriter( out );
106 try
107 {
108 e.printStackTrace( pw );
109 pw.flush();
110 }
111 finally
112 {
113 pw.close();
114 }
115 return new String( out.toByteArray() );
116 }
117
118 public int getCompletedCount()
119 {
120 return completedCount;
121 }
122
123 public int getErrors()
124 {
125 return errors;
126 }
127
128 public int getFlakes()
129 {
130 return flakes;
131 }
132
133 public int getFailures()
134 {
135 return failures;
136 }
137
138 public int getSkipped()
139 {
140 return skipped;
141 }
142
143 public Integer getFailsafeCode()
144 {
145 if ( completedCount == 0 )
146 {
147 return NO_TESTS;
148 }
149 if ( !isErrorFree() )
150 {
151 return FAILURE;
152 }
153 return null;
154 }
155
156
157 public boolean isErrorFree()
158 {
159 return getFailures() == 0 && getErrors() == 0 && !isFailure();
160 }
161
162 public boolean isInternalError()
163 {
164 return getFailures() == 0 && getErrors() == 0 && isFailure();
165 }
166
167
168 public boolean isFailureOrTimeout()
169 {
170 return isTimeout() || isFailure();
171 }
172
173 public boolean isFailure()
174 {
175 return failure != null;
176 }
177
178 public String getFailure()
179 {
180 return failure;
181 }
182
183 public boolean isTimeout()
184 {
185 return timeout;
186 }
187
188 public RunResult aggregate( RunResult other )
189 {
190 String failureMessage = getFailure() != null ? getFailure() : other.getFailure();
191 boolean timeout = isTimeout() || other.isTimeout();
192 int completed = getCompletedCount() + other.getCompletedCount();
193 int fail = getFailures() + other.getFailures();
194 int ign = getSkipped() + other.getSkipped();
195 int err = getErrors() + other.getErrors();
196 int flakes = getFlakes() + other.getFlakes();
197 return new RunResult( completed, err, fail, ign, flakes, failureMessage, timeout );
198 }
199
200 public static RunResult noTestsRun()
201 {
202 return new RunResult( 0, 0, 0, 0 );
203 }
204
205 @SuppressWarnings( "RedundantIfStatement" )
206 public boolean equals( Object o )
207 {
208 if ( this == o )
209 {
210 return true;
211 }
212 if ( o == null || getClass() != o.getClass() )
213 {
214 return false;
215 }
216
217 RunResult runResult = (RunResult) o;
218
219 if ( completedCount != runResult.completedCount )
220 {
221 return false;
222 }
223 if ( errors != runResult.errors )
224 {
225 return false;
226 }
227 if ( failures != runResult.failures )
228 {
229 return false;
230 }
231 if ( skipped != runResult.skipped )
232 {
233 return false;
234 }
235 if ( timeout != runResult.timeout )
236 {
237 return false;
238 }
239 if ( failure != null ? !failure.equals( runResult.failure ) : runResult.failure != null )
240 {
241 return false;
242 }
243
244 return true;
245 }
246
247 public int hashCode()
248 {
249 int result = completedCount;
250 result = 31 * result + errors;
251 result = 31 * result + failures;
252 result = 31 * result + skipped;
253 result = 31 * result + ( failure != null ? failure.hashCode() : 0 );
254 result = 31 * result + ( timeout ? 1 : 0 );
255 return result;
256 }
257 }