View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.plugins.surefire.report;
20  
21  import java.io.File;
22  import java.util.Collections;
23  import java.util.List;
24  
25  import org.apache.maven.model.Plugin;
26  import org.apache.maven.plugin.LegacySupport;
27  import org.apache.maven.plugin.MojoExecution;
28  import org.apache.maven.plugin.descriptor.MojoDescriptor;
29  import org.apache.maven.plugin.descriptor.PluginDescriptor;
30  import org.apache.maven.plugin.testing.AbstractMojoTestCase;
31  import org.apache.maven.plugin.testing.ArtifactStubFactory;
32  import org.apache.maven.plugin.testing.stubs.MavenProjectStub;
33  import org.apache.maven.plugins.surefire.report.stubs.DependencyArtifactStubFactory;
34  import org.apache.maven.project.MavenProject;
35  import org.apache.maven.shared.utils.io.FileUtils;
36  import org.eclipse.aether.DefaultRepositorySystemSession;
37  import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
38  import org.eclipse.aether.repository.LocalRepository;
39  
40  import static org.apache.maven.plugins.surefire.report.Utils.toSystemNewLine;
41  import static org.hamcrest.CoreMatchers.containsString;
42  import static org.hamcrest.MatcherAssert.assertThat;
43  
44  /**
45   * @author <a href="mailto:aramirez@apache.org">Allan Ramirez</a>
46   */
47  @SuppressWarnings("checkstyle:linelength")
48  public class SurefireReportTest extends AbstractMojoTestCase {
49      private ArtifactStubFactory artifactStubFactory;
50  
51      @Override
52      protected void setUp() throws Exception {
53          super.setUp();
54          artifactStubFactory = new DependencyArtifactStubFactory(getTestFile("target"), true, false);
55          artifactStubFactory.getWorkingDir().mkdirs();
56      }
57  
58      protected File getPluginXmlFile(String projectDirName) {
59          return new File(getBasedir(), "src/test/resources/unit/" + projectDirName + "/plugin-config.xml");
60      }
61  
62      protected SurefireReport createReportMojo(File pluginXmlFile) throws Exception {
63          SurefireReport mojo = (SurefireReport) lookupMojo("report", pluginXmlFile);
64          assertNotNull("Mojo not found.", mojo);
65  
66          LegacySupport legacySupport = lookup(LegacySupport.class);
67          legacySupport.setSession(newMavenSession(new MavenProjectStub()));
68          DefaultRepositorySystemSession repoSession =
69                  (DefaultRepositorySystemSession) legacySupport.getRepositorySession();
70          repoSession.setLocalRepositoryManager(new SimpleLocalRepositoryManagerFactory()
71                  .newInstance(repoSession, new LocalRepository(artifactStubFactory.getWorkingDir())));
72  
73          List<MavenProject> reactorProjects =
74                  mojo.getReactorProjects() != null ? mojo.getReactorProjects() : Collections.emptyList();
75  
76          setVariableValueToObject(mojo, "mojoExecution", getMockMojoExecution());
77          // setVariableValueToObject(mojo, "session", legacySupport.getSession());
78          setVariableValueToObject(mojo, "repoSession", legacySupport.getRepositorySession());
79          setVariableValueToObject(mojo, "reactorProjects", reactorProjects);
80          setVariableValueToObject(
81                  mojo, "remoteProjectRepositories", mojo.getProject().getRemoteProjectRepositories());
82          setVariableValueToObject(
83                  mojo, "siteDirectory", new File(mojo.getProject().getBasedir(), "src/site"));
84          return mojo;
85      }
86  
87      public void testBasicSurefireReport() throws Exception {
88          File testPom = getPluginXmlFile("basic-surefire-report-test");
89          SurefireReport mojo = createReportMojo(testPom);
90          File outputDir = (File) getVariableValueFromObject(mojo, "outputDirectory");
91          boolean showSuccess = (Boolean) getVariableValueFromObject(mojo, "showSuccess");
92          File reportsDir = (File) getVariableValueFromObject(mojo, "reportsDirectory");
93          String outputName = (String) getVariableValueFromObject(mojo, "outputName");
94          File xrefTestLocation = (File) getVariableValueFromObject(mojo, "xrefTestLocation");
95          boolean linkXRef = (Boolean) getVariableValueFromObject(mojo, "linkXRef");
96  
97          assertEquals(new File(getBasedir() + "/target/site/unit/basic-surefire-report-test"), outputDir);
98          assertTrue(showSuccess);
99          assertEquals(
100                 new File(getBasedir() + "/src/test/resources/unit/basic-surefire-report-test/surefire-reports")
101                         .getAbsolutePath(),
102                 reportsDir.getAbsolutePath());
103         assertEquals("surefire", outputName);
104         assertEquals(
105                 new File(getBasedir() + "/target/site/unit/basic-surefire-report-test/xref-test").getAbsolutePath(),
106                 xrefTestLocation.getAbsolutePath());
107         assertTrue(linkXRef);
108 
109         mojo.execute();
110         File report = new File(getBasedir(), "target/site/unit/basic-surefire-report-test/surefire.html");
111         assertTrue(report.exists());
112         String htmlContent = FileUtils.fileRead(report);
113 
114         int idx = htmlContent.indexOf("images/icon_success_sml.gif");
115         assertTrue(idx >= 0);
116     }
117 
118     private MojoExecution getMockMojoExecution() {
119         MojoDescriptor md = new MojoDescriptor();
120         md.setGoal("report");
121 
122         MojoExecution me = new MojoExecution(md);
123 
124         PluginDescriptor pd = new PluginDescriptor();
125         Plugin p = new Plugin();
126         p.setGroupId("org.apache.maven.plugins");
127         p.setArtifactId("maven-surefire-report-plugin");
128         pd.setPlugin(p);
129         md.setPluginDescriptor(pd);
130 
131         return me;
132     }
133 
134     public void testBasicSurefireReportIfShowSuccessIsFalse() throws Exception {
135         File testPom = getPluginXmlFile("basic-surefire-report-success-false");
136         SurefireReport mojo = createReportMojo(testPom);
137         boolean showSuccess = (Boolean) getVariableValueFromObject(mojo, "showSuccess");
138         assertFalse(showSuccess);
139         mojo.execute();
140         File report = new File(getBasedir(), "target/site/unit/basic-surefire-report-success-false/surefire.html");
141         assertTrue(report.exists());
142         String htmlContent = FileUtils.fileRead(report);
143 
144         int idx = htmlContent.indexOf("images/icon_success_sml.gif");
145         assertTrue(idx < 0);
146     }
147 
148     public void testBasicSurefireReportIfLinkXrefIsFalse() throws Exception {
149         File testPom = getPluginXmlFile("basic-surefire-report-linkxref-false");
150         SurefireReport mojo = createReportMojo(testPom);
151         boolean linkXRef = (Boolean) getVariableValueFromObject(mojo, "linkXRef");
152         assertFalse(linkXRef);
153         mojo.execute();
154         File report = new File(getBasedir(), "target/site/unit/basic-surefire-report-linkxref-false/surefire.html");
155         assertTrue(report.exists());
156         String htmlContent = FileUtils.fileRead(report);
157 
158         int idx = htmlContent.indexOf("./xref-test/com/shape/CircleTest.html#L44");
159         assertTrue(idx == -1);
160     }
161 
162     public void testBasicSurefireReportIfReportingIsNull() throws Exception {
163         File testPom = getPluginXmlFile("basic-surefire-report-reporting-null");
164         SurefireReport mojo = createReportMojo(testPom);
165         mojo.execute();
166         File report = new File(getBasedir(), "target/site/unit/basic-surefire-report-reporting-null/surefire.html");
167         assertTrue(report.exists());
168         String htmlContent = FileUtils.fileRead(report);
169 
170         int idx = htmlContent.indexOf("./xref-test/com/shape/CircleTest.html#L44");
171         assertTrue(idx < 0);
172     }
173 
174     @SuppressWarnings("checkstyle:methodname")
175     public void testBasicSurefireReport_AnchorTestCases() throws Exception {
176         File testPom = getPluginXmlFile("basic-surefire-report-anchor-test-cases");
177         SurefireReport mojo = createReportMojo(testPom);
178         mojo.execute();
179         File report = new File(getBasedir(), "target/site/unit/basic-surefire-report-anchor-test-cases/surefire.html");
180         assertTrue(report.exists());
181         String htmlContent = FileUtils.fileRead(report);
182 
183         int idx = htmlContent.indexOf("<td><a id=\"TC_com.shape.CircleTest.testX\"></a>testX</td>");
184         assertTrue(idx > 0);
185 
186         idx = htmlContent.indexOf("<td><a id=\"TC_com.shape.CircleTest.testRadius\"></a>"
187                 + "<a href=\"#com.shape.CircleTest.testRadius\">testRadius</a>");
188         assertTrue(idx > 0);
189     }
190 
191     public void testSurefireReportSingleError() throws Exception {
192         File testPom = getPluginXmlFile("surefire-report-single-error");
193         SurefireReport mojo = createReportMojo(testPom);
194         mojo.execute();
195         File report = new File(getBasedir(), "target/site/unit/surefire-report-single-error/surefire.html");
196         assertTrue(report.exists());
197         String htmlContent = FileUtils.fileRead(report);
198 
199         assertThat(
200                 htmlContent,
201                 containsString(toSystemNewLine("<tr class=\"b\">\n"
202                         + "<td>1</td>\n"
203                         + "<td>1</td>\n"
204                         + "<td>0</td>\n"
205                         + "<td>0</td>\n"
206                         + "<td>0%</td>\n"
207                         + "<td>0 s</td>")));
208 
209         assertThat(
210                 htmlContent,
211                 containsString(toSystemNewLine("<tr class=\"b\">\n"
212                         + "<td><a href=\"#surefire\">surefire</a></td>\n"
213                         + "<td>1</td>\n"
214                         + "<td>1</td>\n"
215                         + "<td>0</td>\n"
216                         + "<td>0</td>\n"
217                         + "<td>0%</td>\n"
218                         + "<td>0 s</td></tr>")));
219         assertThat(
220                 htmlContent,
221                 containsString(toSystemNewLine("<tr class=\"b\">\n"
222                         + "<td>"
223                         + "<a href=\"#surefire.MyTest\">"
224                         + "<img src=\"images/icon_error_sml.gif\" />"
225                         + "</a>"
226                         + "</td>\n"
227                         + "<td><a href=\"#surefire.MyTest\">MyTest</a></td>\n"
228                         + "<td>1</td>\n"
229                         + "<td>1</td>\n"
230                         + "<td>0</td>\n"
231                         + "<td>0</td>\n"
232                         + "<td>0%</td>\n"
233                         + "<td>0 s</td></tr>")));
234 
235         assertThat(htmlContent, containsString(">surefire.MyTest:13</a>"));
236 
237         assertThat(htmlContent, containsString("./xref-test/surefire/MyTest.html#L13"));
238 
239         assertThat(
240                 htmlContent,
241                 containsString(toSystemNewLine("<pre>"
242                         + "java.lang.RuntimeException: java.lang.IndexOutOfBoundsException\n"
243                         + "\tat surefire.MyTest.rethrownDelegate(MyTest.java:24)\n"
244                         + "\tat surefire.MyTest.newRethrownDelegate(MyTest.java:17)\n"
245                         + "\tat surefire.MyTest.test(MyTest.java:13)\n"
246                         + "\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n"
247                         + "\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)\n"
248                         + "\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n"
249                         + "\tat java.lang.reflect.Method.invoke(Method.java:606)\n"
250                         + "\tat org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)\n"
251                         + "\tat org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)\n"
252                         + "\tat org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)\n"
253                         + "\tat org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)\n"
254                         + "\tat org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)\n"
255                         + "\tat org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)\n"
256                         + "\tat org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)\n"
257                         + "\tat org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)\n"
258                         + "\tat org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)\n"
259                         + "\tat org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)\n"
260                         + "\tat org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)\n"
261                         + "\tat org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)\n"
262                         + "\tat org.junit.runners.ParentRunner.run(ParentRunner.java:363)\n"
263                         + "\tat org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:272)\n"
264                         + "\tat org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:167)\n"
265                         + "\tat org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:147)\n"
266                         + "\tat org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:130)\n"
267                         + "\tat org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:211)\n"
268                         + "\tat org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:163)\n"
269                         + "\tat org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:105)\n"
270                         + "\tCaused by: java.lang.IndexOutOfBoundsException\n"
271                         + "\tat surefire.MyTest.failure(MyTest.java:33)\n"
272                         + "\tat surefire.MyTest.access$100(MyTest.java:9)\n"
273                         + "\tat surefire.MyTest$Nested.run(MyTest.java:38)\n"
274                         + "\tat surefire.MyTest.delegate(MyTest.java:29)\n"
275                         + "\tat surefire.MyTest.rethrownDelegate(MyTest.java:22)" + "</pre>")));
276     }
277 
278     public void testSurefireReportNestedClassTrimStackTrace() throws Exception {
279         File testPom = getPluginXmlFile("surefire-report-nestedClass-trimStackTrace");
280         SurefireReport mojo = createReportMojo(testPom);
281         mojo.execute();
282         File report =
283                 new File(getBasedir(), "target/site/unit/surefire-report-nestedClass-trimStackTrace/surefire.html");
284         assertTrue(report.exists());
285         String htmlContent = FileUtils.fileRead(report);
286 
287         assertThat(
288                 htmlContent,
289                 containsString(toSystemNewLine("<tr class=\"b\">\n"
290                         + "<td>1</td>\n"
291                         + "<td>1</td>\n"
292                         + "<td>0</td>\n"
293                         + "<td>0</td>\n"
294                         + "<td>0%</td>\n"
295                         + "<td>0 s</td>")));
296 
297         assertThat(
298                 htmlContent,
299                 containsString(toSystemNewLine("<tr class=\"b\">\n"
300                         + "<td><a href=\"#surefire\">surefire</a></td>\n"
301                         + "<td>1</td>\n"
302                         + "<td>1</td>\n"
303                         + "<td>0</td>\n"
304                         + "<td>0</td>\n"
305                         + "<td>0%</td>\n"
306                         + "<td>0 s</td></tr>")));
307         assertThat(
308                 htmlContent,
309                 containsString(toSystemNewLine("<tr class=\"b\">\n"
310                         + "<td>"
311                         + "<a href=\"#surefire.MyTest\">"
312                         + "<img src=\"images/icon_error_sml.gif\" />"
313                         + "</a>"
314                         + "</td>\n"
315                         + "<td><a href=\"#surefire.MyTest\">MyTest</a></td>\n"
316                         + "<td>1</td>\n"
317                         + "<td>1</td>\n"
318                         + "<td>0</td>\n"
319                         + "<td>0</td>\n"
320                         + "<td>0%</td>\n"
321                         + "<td>0 s</td></tr>")));
322         assertThat(htmlContent, containsString(">surefire.MyTest:13</a>"));
323 
324         assertThat(htmlContent, containsString("./xref-test/surefire/MyTest.html#L13"));
325 
326         assertThat(
327                 htmlContent,
328                 containsString(toSystemNewLine("<pre>"
329                         + "java.lang.RuntimeException: java.lang.IndexOutOfBoundsException\n"
330                         + "\tat surefire.MyTest.rethrownDelegate(MyTest.java:24)\n"
331                         + "\tat surefire.MyTest.newRethrownDelegate(MyTest.java:17)\n"
332                         + "\tat surefire.MyTest.test(MyTest.java:13)\n"
333                         + "\tCaused by: java.lang.IndexOutOfBoundsException\n"
334                         + "\tat surefire.MyTest.failure(MyTest.java:33)\n"
335                         + "\tat surefire.MyTest.access$100(MyTest.java:9)\n"
336                         + "\tat surefire.MyTest$Nested.run(MyTest.java:38)\n"
337                         + "\tat surefire.MyTest.delegate(MyTest.java:29)\n"
338                         + "\tat surefire.MyTest.rethrownDelegate(MyTest.java:22)"
339                         + "</pre>")));
340     }
341 
342     public void testSurefireReportNestedClass() throws Exception {
343         File testPom = getPluginXmlFile("surefire-report-nestedClass");
344         SurefireReport mojo = createReportMojo(testPom);
345         mojo.execute();
346         File report = new File(getBasedir(), "target/site/unit/surefire-report-nestedClass/surefire.html");
347         assertTrue(report.exists());
348         String htmlContent = FileUtils.fileRead(report);
349 
350         assertThat(
351                 htmlContent,
352                 containsString(toSystemNewLine("<tr class=\"b\">\n"
353                         + "<td>1</td>\n"
354                         + "<td>1</td>\n"
355                         + "<td>0</td>\n"
356                         + "<td>0</td>\n"
357                         + "<td>0%</td>\n"
358                         + "<td>0 s</td>")));
359 
360         assertThat(
361                 htmlContent,
362                 containsString(toSystemNewLine("<tr class=\"b\">\n"
363                         + "<td><a href=\"#surefire\">surefire</a></td>\n"
364                         + "<td>1</td>\n"
365                         + "<td>1</td>\n"
366                         + "<td>0</td>\n"
367                         + "<td>0</td>\n"
368                         + "<td>0%</td>\n"
369                         + "<td>0 s</td></tr>")));
370         assertThat(
371                 htmlContent,
372                 containsString(toSystemNewLine("<tr class=\"b\">\n"
373                         + "<td>"
374                         + "<a href=\"#surefire.MyTest\">"
375                         + "<img src=\"images/icon_error_sml.gif\" />"
376                         + "</a>"
377                         + "</td>\n"
378                         + "<td><a href=\"#surefire.MyTest\">MyTest</a></td>\n"
379                         + "<td>1</td>\n"
380                         + "<td>1</td>\n"
381                         + "<td>0</td>\n"
382                         + "<td>0</td>\n"
383                         + "<td>0%</td>\n"
384                         + "<td>0 s</td></tr>")));
385         assertThat(htmlContent, containsString(">surefire.MyTest:13</a>"));
386 
387         assertThat(htmlContent, containsString("./xref-test/surefire/MyTest.html#L13"));
388 
389         assertThat(
390                 htmlContent,
391                 containsString(toSystemNewLine("<pre>"
392                         + "java.lang.RuntimeException: java.lang.IndexOutOfBoundsException\n"
393                         + "\tat surefire.MyTest.rethrownDelegate(MyTest.java:24)\n"
394                         + "\tat surefire.MyTest.newRethrownDelegate(MyTest.java:17)\n"
395                         + "\tat surefire.MyTest.test(MyTest.java:13)\n"
396                         + "\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n"
397                         + "\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)\n"
398                         + "\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n"
399                         + "\tat java.lang.reflect.Method.invoke(Method.java:606)\n"
400                         + "\tat org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)\n"
401                         + "\tat org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)\n"
402                         + "\tat org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)\n"
403                         + "\tat org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)\n"
404                         + "\tat org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)\n"
405                         + "\tat org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)\n"
406                         + "\tat org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)\n"
407                         + "\tat org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)\n"
408                         + "\tat org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)\n"
409                         + "\tat org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)\n"
410                         + "\tat org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)\n"
411                         + "\tat org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)\n"
412                         + "\tat org.junit.runners.ParentRunner.run(ParentRunner.java:363)\n"
413                         + "\tat org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:272)\n"
414                         + "\tat org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:167)\n"
415                         + "\tat org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:147)\n"
416                         + "\tat org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:130)\n"
417                         + "\tat org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:211)\n"
418                         + "\tat org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:163)\n"
419                         + "\tat org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:105)\n"
420                         + "\tCaused by: java.lang.IndexOutOfBoundsException\n"
421                         + "\tat surefire.MyTest.failure(MyTest.java:33)\n"
422                         + "\tat surefire.MyTest.access$100(MyTest.java:9)\n"
423                         + "\tat surefire.MyTest$Nested.run(MyTest.java:38)\n"
424                         + "\tat surefire.MyTest.delegate(MyTest.java:29)\n"
425                         + "\tat surefire.MyTest.rethrownDelegate(MyTest.java:22)"
426                         + "</pre>")));
427     }
428 
429     public void testSurefireReportEnclosedTrimStackTrace() throws Exception {
430         File testPom = getPluginXmlFile("surefire-report-enclosed-trimStackTrace");
431         SurefireReport mojo = createReportMojo(testPom);
432         mojo.execute();
433         File report = new File(getBasedir(), "target/site/unit/surefire-report-enclosed-trimStackTrace/surefire.html");
434         assertTrue(report.exists());
435         String htmlContent = FileUtils.fileRead(report);
436 
437         assertThat(
438                 htmlContent,
439                 containsString(toSystemNewLine("<tr class=\"b\">\n"
440                         + "<td>1</td>\n"
441                         + "<td>1</td>\n"
442                         + "<td>0</td>\n"
443                         + "<td>0</td>\n"
444                         + "<td>0%</td>\n"
445                         + "<td>0 s</td>")));
446 
447         assertThat(
448                 htmlContent,
449                 containsString(toSystemNewLine("<tr class=\"b\">\n"
450                         + "<td><a href=\"#surefire\">surefire</a></td>\n"
451                         + "<td>1</td>\n"
452                         + "<td>1</td>\n"
453                         + "<td>0</td>\n"
454                         + "<td>0</td>\n"
455                         + "<td>0%</td>\n"
456                         + "<td>0 s</td></tr>")));
457         assertThat(
458                 htmlContent,
459                 containsString(toSystemNewLine("<tr class=\"b\">\n"
460                         + "<td>"
461                         + "<a href=\"#surefire.MyTest$A\">"
462                         + "<img src=\"images/icon_error_sml.gif\" />"
463                         + "</a>"
464                         + "</td>\n"
465                         + "<td><a href=\"#surefire.MyTest$A\">MyTest$A</a></td>\n"
466                         + "<td>1</td>\n"
467                         + "<td>1</td>\n"
468                         + "<td>0</td>\n"
469                         + "<td>0</td>\n"
470                         + "<td>0%</td>\n"
471                         + "<td>0 s</td></tr>")));
472 
473         assertThat(htmlContent, containsString(">surefire.MyTest$A:45</a>"));
474 
475         assertThat(htmlContent, containsString("./xref-test/surefire/MyTest$A.html#L45"));
476 
477         assertThat(
478                 htmlContent,
479                 containsString(toSystemNewLine("<pre>"
480                         + "java.lang.RuntimeException: java.lang.IndexOutOfBoundsException\n"
481                         + "\tat surefire.MyTest.failure(MyTest.java:33)\n"
482                         + "\tat surefire.MyTest.access$100(MyTest.java:9)\n"
483                         + "\tat surefire.MyTest$Nested.run(MyTest.java:38)\n"
484                         + "\tat surefire.MyTest.delegate(MyTest.java:29)\n"
485                         + "\tat surefire.MyTest.rethrownDelegate(MyTest.java:22)\n"
486                         + "\tat surefire.MyTest.newRethrownDelegate(MyTest.java:17)\n"
487                         + "\tat surefire.MyTest.access$200(MyTest.java:9)\n"
488                         + "\tat surefire.MyTest$A.t(MyTest.java:45)\n"
489                         + "</pre>")));
490     }
491 
492     public void testSurefireReportEnclosed() throws Exception {
493         File testPom = getPluginXmlFile("surefire-report-enclosed");
494         SurefireReport mojo = createReportMojo(testPom);
495         mojo.execute();
496         File report = new File(getBasedir(), "target/site/unit/surefire-report-enclosed/surefire.html");
497         assertTrue(report.exists());
498         String htmlContent = FileUtils.fileRead(report);
499 
500         assertThat(
501                 htmlContent,
502                 containsString(toSystemNewLine("<tr class=\"b\">\n"
503                         + "<td>1</td>\n"
504                         + "<td>1</td>\n"
505                         + "<td>0</td>\n"
506                         + "<td>0</td>\n"
507                         + "<td>0%</td>\n"
508                         + "<td>0 s</td>")));
509 
510         assertThat(
511                 htmlContent,
512                 containsString(toSystemNewLine("<tr class=\"b\">\n"
513                         + "<td><a href=\"#surefire\">surefire</a></td>\n"
514                         + "<td>1</td>\n"
515                         + "<td>1</td>\n"
516                         + "<td>0</td>\n"
517                         + "<td>0</td>\n"
518                         + "<td>0%</td>\n"
519                         + "<td>0 s</td></tr>")));
520         assertThat(
521                 htmlContent,
522                 containsString(toSystemNewLine("<tr class=\"b\">\n"
523                         + "<td>"
524                         + "<a href=\"#surefire.MyTest$A\">"
525                         + "<img src=\"images/icon_error_sml.gif\" />"
526                         + "</a>"
527                         + "</td>\n"
528                         + "<td><a href=\"#surefire.MyTest$A\">MyTest$A</a></td>\n"
529                         + "<td>1</td>\n"
530                         + "<td>1</td>\n"
531                         + "<td>0</td>\n"
532                         + "<td>0</td>\n"
533                         + "<td>0%</td>\n"
534                         + "<td>0 s</td></tr>")));
535 
536         assertThat(htmlContent, containsString(">surefire.MyTest$A:45</a>"));
537 
538         assertThat(htmlContent, containsString("./xref-test/surefire/MyTest$A.html#L45"));
539 
540         assertThat(
541                 htmlContent,
542                 containsString(
543                         toSystemNewLine("<pre>" + "java.lang.RuntimeException: java.lang.IndexOutOfBoundsException\n"
544                                 + "\tat surefire.MyTest.rethrownDelegate(MyTest.java:24)\n"
545                                 + "\tat surefire.MyTest.newRethrownDelegate(MyTest.java:17)\n"
546                                 + "\tat surefire.MyTest.access$200(MyTest.java:9)\n"
547                                 + "\tat surefire.MyTest$A.t(MyTest.java:45)\n"
548                                 + "\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n"
549                                 + "\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)\n"
550                                 + "\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n"
551                                 + "\tat java.lang.reflect.Method.invoke(Method.java:606)\n"
552                                 + "\tat org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)\n"
553                                 + "\tat org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)\n"
554                                 + "\tat org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)\n"
555                                 + "\tat org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)\n"
556                                 + "\tat org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)\n"
557                                 + "\tat org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)\n"
558                                 + "\tat org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)\n"
559                                 + "\tat org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)\n"
560                                 + "\tat org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)\n"
561                                 + "\tat org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)\n"
562                                 + "\tat org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)\n"
563                                 + "\tat org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)\n"
564                                 + "\tat org.junit.runners.ParentRunner.run(ParentRunner.java:363)\n"
565                                 + "\tat org.junit.runners.Suite.runChild(Suite.java:128)\n"
566                                 + "\tat org.junit.runners.Suite.runChild(Suite.java:27)\n"
567                                 + "\tat org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)\n"
568                                 + "\tat org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)\n"
569                                 + "\tat org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)\n"
570                                 + "\tat org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)\n"
571                                 + "\tat org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)\n"
572                                 + "\tat org.junit.runners.ParentRunner.run(ParentRunner.java:363)\n"
573                                 + "\tat org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:272)\n"
574                                 + "\tat org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:167)\n"
575                                 + "\tat org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:147)\n"
576                                 + "\tat org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:130)\n"
577                                 + "\tat org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:211)\n"
578                                 + "\tat org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:163)\n"
579                                 + "\tat org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:105)\n"
580                                 + "\tCaused by: java.lang.IndexOutOfBoundsException\n"
581                                 + "\tat surefire.MyTest.failure(MyTest.java:33)\n"
582                                 + "\tat surefire.MyTest.access$100(MyTest.java:9)\n"
583                                 + "\tat surefire.MyTest$Nested.run(MyTest.java:38)\n"
584                                 + "\tat surefire.MyTest.delegate(MyTest.java:29)\n"
585                                 + "\tat surefire.MyTest.rethrownDelegate(MyTest.java:22)\n"
586                                 + "</pre>")));
587     }
588 
589     public void testCustomTitleAndDescriptionReport() throws Exception {
590         File testPom = getPluginXmlFile("surefire-1183");
591         SurefireReport mojo = createReportMojo(testPom);
592 
593         File outputDir = (File) getVariableValueFromObject(mojo, "outputDirectory");
594         String outputName = (String) getVariableValueFromObject(mojo, "outputName");
595         File reportsDir = (File) getVariableValueFromObject(mojo, "reportsDirectory");
596 
597         assertEquals(new File(getBasedir() + "/target/site/unit/surefire-1183"), outputDir);
598         assertEquals(
599                 new File(getBasedir() + "/src/test/resources/unit/surefire-1183/acceptancetest-reports")
600                         .getAbsolutePath(),
601                 reportsDir.getAbsolutePath());
602         assertEquals("acceptance-test", outputName);
603 
604         mojo.execute();
605 
606         File report = new File(getBasedir(), "target/site/unit/surefire-1183/acceptance-test.html");
607 
608         assertTrue(report.exists());
609 
610         String htmlContent = FileUtils.fileRead(report);
611         assertThat(
612                 htmlContent,
613                 containsString(toSystemNewLine("<section><a id=\"Acceptance_Test\"></a>\n<h1>Acceptance Test</h1>")));
614     }
615 }