1 package org.apache.maven.plugins.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.ByteArrayInputStream;
23 import java.io.File;
24 import java.io.InputStream;
25 import java.io.InputStreamReader;
26 import java.util.ArrayList;
27 import java.util.Collection;
28 import java.util.List;
29
30 import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
31 import org.junit.After;
32 import org.junit.Before;
33 import org.junit.Test;
34
35 import static java.nio.charset.StandardCharsets.UTF_8;
36 import static org.junit.Assert.assertNotNull;
37 import static org.junit.Assert.assertEquals;
38 import static org.junit.Assert.assertTrue;
39 import static org.junit.Assert.assertNull;
40 import static org.junit.Assert.assertFalse;
41 import static org.junit.Assume.assumeTrue;
42 import static org.hamcrest.Matchers.empty;
43 import static org.hamcrest.Matchers.is;
44 import static org.hamcrest.MatcherAssert.assertThat;
45
46
47
48
49 @SuppressWarnings( { "checkstyle:magicnumber", "checkstyle:linelength" } )
50 public class TestSuiteXmlParserTest
51 {
52 private static final String[] LINE_PATTERNS = {"at org.apache.Test.", "at org.apache.Test$"};
53
54 private final Collection<String> loggedErrors = new ArrayList<>();
55
56 private ConsoleLogger consoleLogger;
57
58 @Before
59 public void instantiateLogger()
60 {
61 consoleLogger = new ConsoleLogger()
62 {
63 @Override
64 public boolean isDebugEnabled()
65 {
66 return true;
67 }
68
69 @Override
70 public void debug( String message )
71 {
72 }
73
74 @Override
75 public boolean isInfoEnabled()
76 {
77 return true;
78 }
79
80 @Override
81 public void info( String message )
82 {
83 }
84
85 @Override
86 public boolean isWarnEnabled()
87 {
88 return true;
89 }
90
91 @Override
92 public void warning( String message )
93 {
94 loggedErrors.add( message );
95 }
96
97 @Override
98 public boolean isErrorEnabled()
99 {
100 return true;
101 }
102
103 @Override
104 public void error( String message )
105 {
106 loggedErrors.add( message );
107 }
108
109 @Override
110 public void error( String message, Throwable t )
111 {
112 loggedErrors.add( message );
113 }
114
115 @Override
116 public void error( Throwable t )
117 {
118 loggedErrors.add( t.getLocalizedMessage() );
119 }
120 };
121 }
122
123 @After
124 public void verifyErrorFreeLogger()
125 {
126 assertThat( loggedErrors, is( empty() ) );
127 }
128
129 @Test
130 public void testParse() throws Exception
131 {
132 TestSuiteXmlParser testSuiteXmlParser = new TestSuiteXmlParser( consoleLogger );
133 String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"
134 + "<testsuite failures=\"4\" time=\"0.005\" errors=\"0\" skipped=\"0\" tests=\"4\" name=\"wellFormedXmlFailures.TestSurefire3\">\n"
135 + " <properties>\n" + " <property name=\"java.runtime.name\" value=\"Java(TM) SE Runtime Environment\"/>\n"
136 + " <property name=\"sun.cpu.isalist\" value=\"amd64\"/>\n"
137 + " </properties>\n"
138 + " <testcase time=\"0.005\" classname=\"wellFormedXmlFailures.TestSurefire3\" name=\"testLower\">\n"
139 + " <failure message=\"<\" type=\"junit.framework.AssertionFailedError\"><![CDATA[junit.framework.AssertionFailedError: <\n"
140 + "\tat junit.framework.Assert.fail(Assert.java:47)\n"
141 + "\tat wellFormedXmlFailures.TestSurefire3.testLower(TestSurefire3.java:30)\n"
142 + "]]></failure>\n"
143 + " </testcase>\n"
144 + " <testcase time=\"0\" classname=\"wellFormedXmlFailures.TestSurefire3\" name=\"testU0000\">\n"
145 + " <failure message=\"&0#;\" type=\"junit.framework.AssertionFailedError\">junit.framework.AssertionFailedError: \n"
146 + "\tat junit.framework.Assert.fail(Assert.java:47)\n"
147 + "\tat wellFormedXmlFailures.TestSurefire3.testU0000(TestSurefire3.java:40)\n"
148 + "</failure>\n"
149 + " </testcase>\n"
150 + " <testcase time=\"0\" classname=\"wellFormedXmlFailures.TestSurefire3\" name=\"testGreater\">\n"
151 + " <failure message=\">\" type=\"junit.framework.AssertionFailedError\">junit.framework.AssertionFailedError: >\n"
152 + "\tat junit.framework.Assert.fail(Assert.java:47)\n"
153 + "\tat wellFormedXmlFailures.TestSurefire3.testGreater(TestSurefire3.java:35)\n"
154 + "</failure>\n"
155 + " </testcase>\n"
156 + " <testcase time=\"0\" classname=\"wellFormedXmlFailures.TestSurefire3\" name=\"testQuote\">\n"
157 + " <failure message=\""\" type=\"junit.framework.AssertionFailedError\">junit.framework.AssertionFailedError: \"\n"
158 + "\tat junit.framework.Assert.fail(Assert.java:47)\n"
159 + "\tat wellFormedXmlFailures.TestSurefire3.testQuote(TestSurefire3.java:25)\n"
160 + "</failure>\n"
161 + " </testcase>\n"
162 + "</testsuite>";
163 InputStream byteArrayIs = new ByteArrayInputStream( xml.getBytes() );
164 List<ReportTestSuite> parse = testSuiteXmlParser.parse( new InputStreamReader( byteArrayIs, UTF_8 ) );
165 assertThat( parse.size(), is( 1 ) );
166 ReportTestSuite report = parse.get( 0 );
167 assertThat( report.getFullClassName(), is( "wellFormedXmlFailures.TestSurefire3" ) );
168 assertThat( report.getName(), is( "TestSurefire3" ) );
169 assertThat( report.getPackageName(), is( "wellFormedXmlFailures" ) );
170 assertThat( report.getNumberOfTests(), is( 4 ) );
171 assertThat( report.getNumberOfSkipped(), is( 0 ) );
172 assertThat( report.getNumberOfErrors(), is( 0 ) );
173 assertThat( report.getNumberOfFailures(), is( 4 ) );
174 assertThat( report.getNumberOfFlakes(), is( 0 ) );
175 assertThat( report.getTimeElapsed(), is( 0.005f ) );
176 assertThat( report.getTestCases().size(), is( 4 ) );
177
178 List<ReportTestCase> tests = report.getTestCases();
179 assertThat( tests.get( 0 ).getFullClassName(), is( "wellFormedXmlFailures.TestSurefire3" ) );
180 assertThat( tests.get( 0 ).getName(), is( "testLower" ) );
181 assertThat( tests.get( 0 ).getFailureDetail(),
182 is( "junit.framework.AssertionFailedError: <\n"
183 + "\tat junit.framework.Assert.fail(Assert.java:47)\n"
184 + "\tat wellFormedXmlFailures.TestSurefire3.testLower(TestSurefire3.java:30)\n" ) );
185 assertThat( tests.get( 0 ).getClassName(), is( "TestSurefire3" ) );
186 assertThat( tests.get( 0 ).getTime(), is( 0.005f ) );
187 assertThat( tests.get( 0 ).getFailureErrorLine(), is( "30" ) );
188 assertThat( tests.get( 0 ).getFailureMessage(), is( "<" ) );
189 assertThat( tests.get( 0 ).getFullName(), is( "wellFormedXmlFailures.TestSurefire3.testLower" ) );
190 assertThat( tests.get( 0 ).getFailureType(), is( "junit.framework.AssertionFailedError" ) );
191 assertThat( tests.get( 0 ).hasError(), is( false ) );
192
193 assertThat( tests.get( 1 ).getFullClassName(), is( "wellFormedXmlFailures.TestSurefire3" ) );
194 assertThat( tests.get( 1 ).getName(), is( "testU0000" ) );
195 assertThat( tests.get( 1 ).getFailureDetail(),
196 is( "junit.framework.AssertionFailedError: \n" + "\tat junit.framework.Assert.fail(Assert.java:47)\n"
197 + "\tat wellFormedXmlFailures.TestSurefire3.testU0000(TestSurefire3.java:40)\n" ) );
198 assertThat( tests.get( 1 ).getClassName(), is( "TestSurefire3" ) );
199 assertThat( tests.get( 1 ).getTime(), is( 0f ) );
200 assertThat( tests.get( 1 ).getFailureErrorLine(), is( "40" ) );
201 assertThat( tests.get( 1 ).getFailureMessage(), is( "&0#;" ) );
202 assertThat( tests.get( 1 ).getFullName(), is( "wellFormedXmlFailures.TestSurefire3.testU0000" ) );
203 assertThat( tests.get( 1 ).getFailureType(), is( "junit.framework.AssertionFailedError" ) );
204 assertThat( tests.get( 1 ).hasError(), is( false ) );
205
206 assertThat( tests.get( 2 ).getFullClassName(), is( "wellFormedXmlFailures.TestSurefire3" ) );
207 assertThat( tests.get( 2 ).getName(), is( "testGreater" ) );
208 assertThat( tests.get( 2 ).getFailureDetail(),
209 is( "junit.framework.AssertionFailedError: >\n" + "\tat junit.framework.Assert.fail(Assert.java:47)\n"
210 + "\tat wellFormedXmlFailures.TestSurefire3.testGreater(TestSurefire3.java:35)\n" ) );
211 assertThat( tests.get( 2 ).getClassName(), is( "TestSurefire3" ) );
212 assertThat( tests.get( 2 ).getTime(), is( 0f ) );
213 assertThat( tests.get( 2 ).getFailureErrorLine(), is( "35" ) );
214 assertThat( tests.get( 2 ).getFailureMessage(), is( ">" ) );
215 assertThat( tests.get( 2 ).getFullName(), is( "wellFormedXmlFailures.TestSurefire3.testGreater" ) );
216 assertThat( tests.get( 2 ).getFailureType(), is( "junit.framework.AssertionFailedError" ) );
217 assertThat( tests.get( 2 ).hasError(), is( false ) );
218
219 assertThat( tests.get( 3 ).getFullClassName(), is( "wellFormedXmlFailures.TestSurefire3" ) );
220 assertThat( tests.get( 3 ).getName(), is( "testQuote" ) );
221 assertThat( tests.get( 3 ).getFailureDetail(),
222 is( "junit.framework.AssertionFailedError: \"\n" + "\tat junit.framework.Assert.fail(Assert.java:47)\n"
223 + "\tat wellFormedXmlFailures.TestSurefire3.testQuote(TestSurefire3.java:25)\n" ) );
224 assertThat( tests.get( 3 ).getClassName(), is( "TestSurefire3" ) );
225 assertThat( tests.get( 3 ).getTime(), is( 0f ) );
226 assertThat( tests.get( 3 ).getFailureErrorLine(), is( "25" ) );
227 assertThat( tests.get( 3 ).getFailureMessage(), is( "\"" ) );
228 assertThat( tests.get( 3 ).getFullName(), is( "wellFormedXmlFailures.TestSurefire3.testQuote" ) );
229 assertThat( tests.get( 3 ).getFailureType(), is( "junit.framework.AssertionFailedError" ) );
230 assertThat( tests.get( 3 ).hasError(), is( false ) );
231 }
232
233 @Test
234 public void testParser() throws Exception
235 {
236 TestSuiteXmlParser parser = new TestSuiteXmlParser( consoleLogger );
237
238 Collection<ReportTestSuite> oldResult = parser.parse(
239 "src/test/resources/fixture/testsuitexmlparser/TEST-org.apache.maven.surefire.test.FailingTest.xml" );
240
241 assertNotNull( oldResult );
242
243 assertEquals( 1, oldResult.size() );
244 ReportTestSuite next = oldResult.iterator().next();
245 assertEquals( 2, next.getNumberOfTests() );
246 }
247
248 @Test
249 public void successfulSurefireTestReport() throws Exception
250 {
251 TestSuiteXmlParser parser = new TestSuiteXmlParser( consoleLogger );
252 File surefireReport = new File( "src/test/resources/junit-pathWithÜmlaut/TEST-umlautTest.BasicTest.xml" );
253 assumeTrue( surefireReport.isFile() );
254 Collection<ReportTestSuite> suites = parser.parse( surefireReport.getCanonicalPath() );
255 assertNotNull( suites );
256 assertEquals( 1, suites.size() );
257 ReportTestSuite suite = suites.iterator().next();
258 assertThat( suite.getNumberOfTests(), is( 1 ) );
259 assertEquals( 1, suite.getNumberOfTests() );
260 assertEquals( 0, suite.getNumberOfFlakes() );
261 assertEquals( 0, suite.getNumberOfFailures() );
262 assertEquals( 0, suite.getNumberOfErrors() );
263 assertEquals( 0, suite.getNumberOfSkipped() );
264 assertThat( suite.getTimeElapsed(), is( 0.002f ) );
265 assertThat( suite.getFullClassName(), is( "umlautTest.BasicTest" ) );
266 assertThat( suite.getPackageName(), is( "umlautTest" ) );
267 assertThat( suite.getName(), is( "BasicTest" ) );
268 ReportTestCase test = suite.getTestCases().iterator().next();
269 assertTrue( test.isSuccessful() );
270 assertNull( test.getFailureDetail() );
271 assertNull( test.getFailureErrorLine() );
272 assertNull( test.getFailureType() );
273 assertThat( test.getTime(), is( 0.002f ) );
274 assertThat( test.getFullClassName(), is( "umlautTest.BasicTest" ) );
275 assertThat( test.getClassName(), is( "BasicTest" ) );
276 assertThat( test.getName(), is( "testSetUp" ) );
277 assertThat( test.getFullName(), is( "umlautTest.BasicTest.testSetUp" ) );
278 }
279
280 @Test
281 public void testParserHitsFailsafeSummary() throws Exception
282 {
283 TestSuiteXmlParser parser = new TestSuiteXmlParser( consoleLogger );
284
285 parser.parse( "src/test/resources/fixture/testsuitexmlparser/failsafe-summary.xml" );
286
287 assertFalse( parser.isValid() );
288
289 parser.parse(
290 "src/test/resources/fixture/testsuitexmlparser/TEST-org.apache.maven.surefire.test.FailingTest.xml" );
291
292 assertTrue( parser.isValid() );
293 }
294
295 @Test
296 public void lastIndexOfPatternOfOrdinalTest()
297 {
298 final StringBuilder stackTrace = new StringBuilder(
299 "\tat org.apache.Test.util(Test.java:60)\n" + "\tat org.apache.Test.test(Test.java:30)\n"
300 + "\tat com.sun.Impl.xyz(Impl.java:258)\n" );
301
302 int[] result = TestSuiteXmlParser.lastIndexOf( stackTrace, LINE_PATTERNS );
303 assertThat( result[0], is( 40 ) );
304 assertThat( result[1], is( 0 ) );
305 String errorLine = TestSuiteXmlParser.parseErrorLine( stackTrace, "org.apache.Test" );
306 assertThat( errorLine, is( "30" ) );
307 }
308
309 @Test
310 public void lastIndexOfPatternOfOrdinalTestWithCause()
311 {
312 final StringBuilder stackTrace = new StringBuilder(
313 "\tat org.apache.Test.util(Test.java:60)\n" + "\tat org.apache.Test.test(Test.java:30)\n"
314 + "\tat com.sun.Impl.xyz(Impl.java:258)\n"
315 + "\tat Caused by: java.lang.IndexOutOfBoundsException\n"
316 + "\tat org.apache.Test.util(Test.java:70)\n" );
317
318 int[] result = TestSuiteXmlParser.lastIndexOf( stackTrace, LINE_PATTERNS );
319 assertThat( result[0], is( 40 ) );
320 assertThat( result[1], is( 0 ) );
321 String errorLine = TestSuiteXmlParser.parseErrorLine( stackTrace, "org.apache.Test" );
322 assertThat( errorLine, is( "30" ) );
323 }
324
325 @Test
326 public void lastIndexOfPatternOfEnclosedTest()
327 {
328 final StringBuilder source = new StringBuilder(
329 "\tat org.apache.Test.util(Test.java:60)\n"
330 + "\tat org.apache.Test$Nested.test(Test.java:30)\n"
331 + "\tat com.sun.Impl.xyz(Impl.java:258)\n" );
332
333 int[] result = TestSuiteXmlParser.lastIndexOf( source, LINE_PATTERNS );
334 assertThat( result[0], is( 40 ) );
335 assertThat( result[1], is( 1 ) );
336 String errorLine = TestSuiteXmlParser.parseErrorLine( source, "org.apache.Test$Nested" );
337 assertThat( errorLine, is( "30" ) );
338 }
339
340 @Test
341 public void lastIndexOfPatternOfEnclosedTestWithCause()
342 {
343 final StringBuilder source = new StringBuilder(
344 "\tat org.apache.Test.util(Test.java:60)\n" + "\tat org.apache.Test$Nested.test(Test.java:30)\n"
345 + "\tat com.sun.Impl.xyz(Impl.java:258)\n"
346 + "\tat Caused by: java.lang.IndexOutOfBoundsException\n"
347 + "\tat org.apache.Test$Nested.util(Test.java:70)\n" );
348
349 int[] result = TestSuiteXmlParser.lastIndexOf( source, LINE_PATTERNS );
350 assertThat( result[0], is( 40 ) );
351 assertThat( result[1], is( 1 ) );
352 String errorLine = TestSuiteXmlParser.parseErrorLine( source, "org.apache.Test$Nested" );
353 assertThat( errorLine, is( "30" ) );
354 }
355
356 @Test
357 public void shouldParserEverythingInOrdinalTest() throws Exception
358 {
359 TestSuiteXmlParser parser = new TestSuiteXmlParser( consoleLogger );
360 List<ReportTestSuite> tests = parser.parse(
361 "src/test/resources/fixture/testsuitexmlparser/TEST-surefire.MyTest.xml" );
362 assertTrue( parser.isValid() );
363 assertThat( tests.size(), is( 1 ) );
364 assertThat( tests.get( 0 ).getFullClassName(), is( "surefire.MyTest" ) );
365 assertThat( tests.get( 0 ).getNumberOfErrors(), is( 1 ) );
366 assertThat( tests.get( 0 ).getNumberOfFlakes(), is( 0 ) );
367 assertThat( tests.get( 0 ).getNumberOfSkipped(), is( 0 ) );
368 assertThat( tests.get( 0 ).getNumberOfFailures(), is( 0 ) );
369 assertThat( tests.get( 0 ).getPackageName(), is( "surefire" ) );
370 assertThat( tests.get( 0 ).getNumberOfTests(), is( 1 ) );
371 assertThat( tests.get( 0 ).getTestCases().size(), is( 1 ) );
372 assertFalse( tests.get( 0 ).getTestCases().get( 0 ).isSuccessful() );
373 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFailureErrorLine(), is( "13" ) );
374 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFailureType(), is( "java.lang.RuntimeException" ) );
375 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFullClassName(), is( "surefire.MyTest" ) );
376 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getClassName(), is( "MyTest" ) );
377 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getName(), is( "test" ) );
378 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFullName(), is( "surefire.MyTest.test" ) );
379 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getTime(), is( 0.1f ) );
380 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFailureMessage(), is( "this is different message" ) );
381
382 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFailureDetail(),
383 is( "java.lang.RuntimeException: java.lang.IndexOutOfBoundsException\n"
384 + "\tat surefire.MyTest.rethrownDelegate(MyTest.java:24)\n"
385 + "\tat surefire.MyTest.newRethrownDelegate(MyTest.java:17)\n"
386 + "\tat surefire.MyTest.test(MyTest.java:13)\n" + "\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n"
387 + "\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)\n"
388 + "\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n"
389 + "\tat java.lang.reflect.Method.invoke(Method.java:606)\n"
390 + "\tat org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)\n"
391 + "\tat org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)\n"
392 + "\tat org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)\n"
393 + "\tat org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)\n"
394 + "\tat org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)\n"
395 + "\tat org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)\n"
396 + "\tat org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)\n"
397 + "\tat org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)\n"
398 + "\tat org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)\n"
399 + "\tat org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)\n"
400 + "\tat org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)\n"
401 + "\tat org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)\n"
402 + "\tat org.junit.runners.ParentRunner.run(ParentRunner.java:363)\n"
403 + "\tat org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:272)\n"
404 + "\tat org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:167)\n"
405 + "\tat org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:147)\n"
406 + "\tat org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:130)\n"
407 + "\tat org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:211)\n"
408 + "\tat org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:163)\n"
409 + "\tat org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:105)\n"
410 + "\tCaused by: java.lang.IndexOutOfBoundsException\n"
411 + "\tat surefire.MyTest.failure(MyTest.java:33)\n"
412 + "\tat surefire.MyTest.access$100(MyTest.java:9)\n"
413 + "\tat surefire.MyTest$Nested.run(MyTest.java:38)\n"
414 + "\tat surefire.MyTest.delegate(MyTest.java:29)\n"
415 + "\tat surefire.MyTest.rethrownDelegate(MyTest.java:22)" ) );
416 assertThat( tests.get( 0 ).getTestCases().get( 0 ).hasError(), is( true ) );
417 }
418
419 @Test
420 public void shouldParserEverythingInEnclosedTest() throws Exception
421 {
422 TestSuiteXmlParser parser = new TestSuiteXmlParser( consoleLogger );
423 List<ReportTestSuite> tests = parser.parse(
424 "src/test/resources/fixture/testsuitexmlparser/TEST-surefire.MyTest-enclosed.xml" );
425 assertTrue( parser.isValid() );
426 assertThat( tests.size(), is( 1 ) );
427 assertThat( tests.get( 0 ).getFullClassName(), is( "surefire.MyTest$A" ) );
428 assertThat( tests.get( 0 ).getNumberOfErrors(), is( 1 ) );
429 assertThat( tests.get( 0 ).getNumberOfFlakes(), is( 0 ) );
430 assertThat( tests.get( 0 ).getNumberOfSkipped(), is( 0 ) );
431 assertThat( tests.get( 0 ).getNumberOfFailures(), is( 0 ) );
432 assertThat( tests.get( 0 ).getPackageName(), is( "surefire" ) );
433 assertThat( tests.get( 0 ).getNumberOfTests(), is( 1 ) );
434 assertThat( tests.get( 0 ).getTestCases().size(), is( 1 ) );
435 assertFalse( tests.get( 0 ).getTestCases().get( 0 ).isSuccessful() );
436 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFailureErrorLine(), is( "45" ) );
437 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFailureType(), is( "java.lang.RuntimeException" ) );
438 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFullClassName(), is( "surefire.MyTest$A" ) );
439 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getClassName(), is( "MyTest$A" ) );
440 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getName(), is( "t" ) );
441 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFullName(), is( "surefire.MyTest$A.t" ) );
442 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getTime(), is( 0f ) );
443
444 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFailureMessage(),
445 is( "java.lang.IndexOutOfBoundsException" ) );
446
447 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFailureDetail(),
448 is( "java.lang.RuntimeException: java.lang.IndexOutOfBoundsException\n"
449 + "\tat surefire.MyTest.rethrownDelegate(MyTest.java:24)\n"
450 + "\tat surefire.MyTest.newRethrownDelegate(MyTest.java:17)\n"
451 + "\tat surefire.MyTest.access$200(MyTest.java:9)\n"
452 + "\tat surefire.MyTest$A.t(MyTest.java:45)\n"
453 + "\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n"
454 + "\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)\n"
455 + "\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n"
456 + "\tat java.lang.reflect.Method.invoke(Method.java:606)\n"
457 + "\tat org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)\n"
458 + "\tat org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)\n"
459 + "\tat org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)\n"
460 + "\tat org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)\n"
461 + "\tat org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)\n"
462 + "\tat org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)\n"
463 + "\tat org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)\n"
464 + "\tat org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)\n"
465 + "\tat org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)\n"
466 + "\tat org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)\n"
467 + "\tat org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)\n"
468 + "\tat org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)\n"
469 + "\tat org.junit.runners.ParentRunner.run(ParentRunner.java:363)\n"
470 + "\tat org.junit.runners.Suite.runChild(Suite.java:128)\n"
471 + "\tat org.junit.runners.Suite.runChild(Suite.java:27)\n"
472 + "\tat org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)\n"
473 + "\tat org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)\n"
474 + "\tat org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)\n"
475 + "\tat org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)\n"
476 + "\tat org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)\n"
477 + "\tat org.junit.runners.ParentRunner.run(ParentRunner.java:363)\n"
478 + "\tat org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:272)\n"
479 + "\tat org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:167)\n"
480 + "\tat org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:147)\n"
481 + "\tat org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:130)\n"
482 + "\tat org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:211)\n"
483 + "\tat org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:163)\n"
484 + "\tat org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:105)\n"
485 + "\tCaused by: java.lang.IndexOutOfBoundsException\n"
486 + "\tat surefire.MyTest.failure(MyTest.java:33)\n"
487 + "\tat surefire.MyTest.access$100(MyTest.java:9)\n"
488 + "\tat surefire.MyTest$Nested.run(MyTest.java:38)\n"
489 + "\tat surefire.MyTest.delegate(MyTest.java:29)\n"
490 + "\tat surefire.MyTest.rethrownDelegate(MyTest.java:22)\n" ) );
491 assertThat( tests.get( 0 ).getTestCases().get( 0 ).hasError(), is( true ) );
492 }
493
494 @Test
495 public void shouldParserEverythingInEnclosedTrimStackTraceTest() throws Exception
496 {
497 TestSuiteXmlParser parser = new TestSuiteXmlParser( consoleLogger );
498 List<ReportTestSuite> tests = parser.parse(
499 "src/test/resources/fixture/testsuitexmlparser/TEST-surefire.MyTest-enclosed-trimStackTrace.xml" );
500 assertTrue( parser.isValid() );
501 assertThat( tests.size(), is( 1 ) );
502 assertThat( tests.get( 0 ).getFullClassName(), is( "surefire.MyTest$A" ) );
503 assertThat( tests.get( 0 ).getNumberOfErrors(), is( 1 ) );
504 assertThat( tests.get( 0 ).getNumberOfFlakes(), is( 0 ) );
505 assertThat( tests.get( 0 ).getNumberOfSkipped(), is( 0 ) );
506 assertThat( tests.get( 0 ).getNumberOfFailures(), is( 0 ) );
507 assertThat( tests.get( 0 ).getPackageName(), is( "surefire" ) );
508 assertThat( tests.get( 0 ).getNumberOfTests(), is( 1 ) );
509 assertThat( tests.get( 0 ).getTestCases().size(), is( 1 ) );
510 assertFalse( tests.get( 0 ).getTestCases().get( 0 ).isSuccessful() );
511 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFailureErrorLine(), is( "45" ) );
512 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFailureType(), is( "java.lang.RuntimeException" ) );
513 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFullClassName(), is( "surefire.MyTest$A" ) );
514 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getClassName(), is( "MyTest$A" ) );
515 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getName(), is( "t" ) );
516 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFullName(), is( "surefire.MyTest$A.t" ) );
517 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getTime(), is( 0f ) );
518
519 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFailureMessage(),
520 is( "java.lang.IndexOutOfBoundsException" ) );
521
522 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFailureDetail(),
523 is( "java.lang.RuntimeException: java.lang.IndexOutOfBoundsException\n"
524 + "\tat surefire.MyTest.failure(MyTest.java:33)\n"
525 + "\tat surefire.MyTest.access$100(MyTest.java:9)\n"
526 + "\tat surefire.MyTest$Nested.run(MyTest.java:38)\n"
527 + "\tat surefire.MyTest.delegate(MyTest.java:29)\n"
528 + "\tat surefire.MyTest.rethrownDelegate(MyTest.java:22)\n"
529 + "\tat surefire.MyTest.newRethrownDelegate(MyTest.java:17)\n"
530 + "\tat surefire.MyTest.access$200(MyTest.java:9)\n"
531 + "\tat surefire.MyTest$A.t(MyTest.java:45)\n" ) );
532 assertThat( tests.get( 0 ).getTestCases().get( 0 ).hasError(), is( true ) );
533 }
534
535 @Test
536 public void shouldParserEverythingInNestedClassTest() throws Exception
537 {
538 TestSuiteXmlParser parser = new TestSuiteXmlParser( consoleLogger );
539 List<ReportTestSuite> tests = parser.parse(
540 "src/test/resources/fixture/testsuitexmlparser/TEST-surefire.MyTest-nestedClass.xml" );
541 assertTrue( parser.isValid() );
542 assertThat( tests.size(), is( 1 ) );
543 assertThat( tests.get( 0 ).getFullClassName(), is( "surefire.MyTest" ) );
544 assertThat( tests.get( 0 ).getNumberOfErrors(), is( 1 ) );
545 assertThat( tests.get( 0 ).getNumberOfFlakes(), is( 0 ) );
546 assertThat( tests.get( 0 ).getNumberOfSkipped(), is( 0 ) );
547 assertThat( tests.get( 0 ).getNumberOfFailures(), is( 0 ) );
548 assertThat( tests.get( 0 ).getPackageName(), is( "surefire" ) );
549 assertThat( tests.get( 0 ).getNumberOfTests(), is( 1 ) );
550 assertThat( tests.get( 0 ).getTestCases().size(), is( 1 ) );
551 assertFalse( tests.get( 0 ).getTestCases().get( 0 ).isSuccessful() );
552 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFailureErrorLine(), is( "13" ) );
553 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFailureType(), is( "java.lang.RuntimeException" ) );
554 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFullClassName(), is( "surefire.MyTest" ) );
555 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getClassName(), is( "MyTest" ) );
556 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getName(), is( "test" ) );
557 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFullName(), is( "surefire.MyTest.test" ) );
558 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getTime(), is( 0f ) );
559
560 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFailureMessage(),
561 is( "java.lang.IndexOutOfBoundsException" ) );
562
563 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFailureDetail(),
564 is( "java.lang.RuntimeException: java.lang.IndexOutOfBoundsException\n"
565 + "\tat surefire.MyTest.rethrownDelegate(MyTest.java:24)\n"
566 + "\tat surefire.MyTest.newRethrownDelegate(MyTest.java:17)\n"
567 + "\tat surefire.MyTest.test(MyTest.java:13)\n"
568 + "\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n"
569 + "\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)\n"
570 + "\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n"
571 + "\tat java.lang.reflect.Method.invoke(Method.java:606)\n"
572 + "\tat org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)\n"
573 + "\tat org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)\n"
574 + "\tat org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)\n"
575 + "\tat org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)\n"
576 + "\tat org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)\n"
577 + "\tat org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)\n"
578 + "\tat org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)\n"
579 + "\tat org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)\n"
580 + "\tat org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)\n"
581 + "\tat org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)\n"
582 + "\tat org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)\n"
583 + "\tat org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)\n"
584 + "\tat org.junit.runners.ParentRunner.run(ParentRunner.java:363)\n"
585 + "\tat org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:272)\n"
586 + "\tat org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:167)\n"
587 + "\tat org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:147)\n"
588 + "\tat org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:130)\n"
589 + "\tat org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:211)\n"
590 + "\tat org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:163)\n"
591 + "\tat org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:105)\n"
592 + "\tCaused by: java.lang.IndexOutOfBoundsException\n"
593 + "\tat surefire.MyTest.failure(MyTest.java:33)\n"
594 + "\tat surefire.MyTest.access$100(MyTest.java:9)\n"
595 + "\tat surefire.MyTest$Nested.run(MyTest.java:38)\n"
596 + "\tat surefire.MyTest.delegate(MyTest.java:29)\n"
597 + "\tat surefire.MyTest.rethrownDelegate(MyTest.java:22)" ) );
598 assertThat( tests.get( 0 ).getTestCases().get( 0 ).hasError(), is( true ) );
599 }
600
601 @Test
602 public void shouldParserEverythingInNestedClassTrimStackTraceTest() throws Exception
603 {
604 TestSuiteXmlParser parser = new TestSuiteXmlParser( consoleLogger );
605 List<ReportTestSuite> tests = parser.parse(
606 "src/test/resources/fixture/testsuitexmlparser/TEST-surefire.MyTest-nestedClass-trimStackTrace.xml" );
607 assertTrue( parser.isValid() );
608 assertThat( tests.size(), is( 1 ) );
609 assertThat( tests.get( 0 ).getFullClassName(), is( "surefire.MyTest" ) );
610 assertThat( tests.get( 0 ).getNumberOfErrors(), is( 1 ) );
611 assertThat( tests.get( 0 ).getNumberOfFlakes(), is( 0 ) );
612 assertThat( tests.get( 0 ).getNumberOfSkipped(), is( 0 ) );
613 assertThat( tests.get( 0 ).getNumberOfFailures(), is( 0 ) );
614 assertThat( tests.get( 0 ).getPackageName(), is( "surefire" ) );
615 assertThat( tests.get( 0 ).getNumberOfTests(), is( 1 ) );
616 assertThat( tests.get( 0 ).getTestCases().size(), is( 1 ) );
617 assertFalse( tests.get( 0 ).getTestCases().get( 0 ).isSuccessful() );
618 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFailureErrorLine(), is( "13" ) );
619 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFailureType(), is( "java.lang.RuntimeException" ) );
620 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFullClassName(), is( "surefire.MyTest" ) );
621 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getClassName(), is( "MyTest" ) );
622 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getName(), is( "test" ) );
623 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFullName(), is( "surefire.MyTest.test" ) );
624 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getTime(), is( 0f ) );
625
626 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFailureMessage(),
627 is( "java.lang.IndexOutOfBoundsException" ) );
628
629 assertThat( tests.get( 0 ).getTestCases().get( 0 ).getFailureDetail(),
630 is( "java.lang.RuntimeException: java.lang.IndexOutOfBoundsException\n"
631 + "\tat surefire.MyTest.rethrownDelegate(MyTest.java:24)\n"
632 + "\tat surefire.MyTest.newRethrownDelegate(MyTest.java:17)\n"
633 + "\tat surefire.MyTest.test(MyTest.java:13)\n"
634 + "\tCaused by: java.lang.IndexOutOfBoundsException\n"
635 + "\tat surefire.MyTest.failure(MyTest.java:33)\n"
636 + "\tat surefire.MyTest.access$100(MyTest.java:9)\n"
637 + "\tat surefire.MyTest$Nested.run(MyTest.java:38)\n"
638 + "\tat surefire.MyTest.delegate(MyTest.java:29)\n"
639 + "\tat surefire.MyTest.rethrownDelegate(MyTest.java:22)" ) );
640 assertThat( tests.get( 0 ).getTestCases().get( 0 ).hasError(), is( true ) );
641 }
642
643 @Test
644 public void shouldTestNotBlank()
645 {
646 assertFalse( TestSuiteXmlParser.isNotBlank( 1, 2, ' ', ' ', ' ', '\n' ) );
647 assertFalse( TestSuiteXmlParser.isNotBlank( 1, 2, ' ', '\t', ' ', '\n' ) );
648 assertFalse( TestSuiteXmlParser.isNotBlank( 1, 2, ' ', ' ', '\r', '\n' ) );
649 assertFalse( TestSuiteXmlParser.isNotBlank( 1, 2, ' ', ' ', '\f', '\n' ) );
650 assertTrue( TestSuiteXmlParser.isNotBlank( 1, 2, ' ', 'a', ' ', '\n' ) );
651 assertTrue( TestSuiteXmlParser.isNotBlank( 1, 2, ' ', ' ', 'a', '\n' ) );
652 assertTrue( TestSuiteXmlParser.isNotBlank( 1, 2, ' ', 'a', 'b', '\n' ) );
653 }
654
655 @Test
656 public void shouldTestIsNumeric()
657 {
658 assertFalse( TestSuiteXmlParser.isNumeric( new StringBuilder( "0?5142" ), 1, 3 ) );
659 assertTrue( TestSuiteXmlParser.isNumeric( new StringBuilder( "0?51M2" ), 2, 4 ) );
660 assertFalse( TestSuiteXmlParser.isNumeric( new StringBuilder( "0?51M2" ), 2, 5 ) );
661 }
662 }