View Javadoc
1   package org.apache.maven.plugins.surefire.report;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *     http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
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   * @author Kristian Rosenvold
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=\"&lt;\" 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=\"&amp;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=\"&gt;\" 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=\"&quot;\" 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 }