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