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 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   * @author Kristian Rosenvold
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=\"&lt;\" 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=\"&amp;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=\"&gt;\" 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=\"&quot;\" 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 }