This is an automated email from the ASF dual-hosted git repository. michaelo pushed a commit to branch use-renderer in repository https://gitbox.apache.org/repos/asf/maven-surefire.git
commit da5defa71e34c6248ecc64ce4b7b13de60bdce64 Author: Michael Osipov <micha...@apache.org> AuthorDate: Mon May 1 01:04:33 2023 +0200 [SUREFIRE-2153] Replace SurefireReportGenerator with SurefireReportRenderer This closes #625 --- .../report/AbstractSurefireReportMojo.java | 12 +- ...tGenerator.java => SurefireReportRenderer.java} | 220 ++++++++---------- .../plugins/surefire/report/Surefire597Test.java | 57 ++--- .../surefire/report/SurefireReportMojoTest.java | 247 +++++++++------------ .../resources/unit/surefire-1183/plugin-config.xml | 3 +- .../jiras/Surefire260TestWithIdenticalNamesIT.java | 5 +- .../surefire/report/SurefireReportParser.java | 47 ++-- .../surefire/report/SurefireReportParserTest.java | 41 ++-- 8 files changed, 282 insertions(+), 350 deletions(-) diff --git a/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/AbstractSurefireReportMojo.java b/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/AbstractSurefireReportMojo.java index eaaf294f1..44f107b01 100644 --- a/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/AbstractSurefireReportMojo.java +++ b/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/AbstractSurefireReportMojo.java @@ -126,9 +126,15 @@ public abstract class AbstractSurefireReportMojo extends AbstractMavenReport { return; } - new SurefireReportGenerator( - getReportsDirectories(), locale, showSuccess, determineXrefLocation(), getConsoleLogger()) - .doGenerateReport(getBundle(locale), getSink()); + SurefireReportRenderer r = new SurefireReportRenderer( + getSink(), + locale, + getBundle(locale), + getConsoleLogger(), + showSuccess, + getReportsDirectories(), + determineXrefLocation()); + r.render(); } @Override diff --git a/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/SurefireReportGenerator.java b/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/SurefireReportRenderer.java similarity index 77% rename from maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/SurefireReportGenerator.java rename to maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/SurefireReportRenderer.java index 09667a06a..9f09e6135 100644 --- a/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/SurefireReportGenerator.java +++ b/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/SurefireReportRenderer.java @@ -29,68 +29,64 @@ import org.apache.maven.doxia.sink.Sink; import org.apache.maven.doxia.sink.impl.SinkEventAttributeSet; import org.apache.maven.doxia.util.DoxiaUtils; import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; -import org.apache.maven.reporting.MavenReportException; +import org.apache.maven.reporting.AbstractMavenReportRenderer; import static org.apache.maven.doxia.markup.HtmlMarkup.A; -import static org.apache.maven.doxia.sink.Sink.JUSTIFY_LEFT; import static org.apache.maven.doxia.sink.SinkEventAttributes.CLASS; import static org.apache.maven.doxia.sink.SinkEventAttributes.HREF; import static org.apache.maven.doxia.sink.SinkEventAttributes.ID; import static org.apache.maven.doxia.sink.SinkEventAttributes.STYLE; -import static org.apache.maven.doxia.sink.SinkEventAttributes.TYPE; /** * This generator creates HTML Report from Surefire and Failsafe XML Report. */ -public final class SurefireReportGenerator { - private static final int LEFT = JUSTIFY_LEFT; +public class SurefireReportRenderer extends AbstractMavenReportRenderer { private static final Object[] TAG_TYPE_START = {HtmlMarkup.TAG_TYPE_START}; private static final Object[] TAG_TYPE_END = {HtmlMarkup.TAG_TYPE_END}; - private final SurefireReportParser report; + // Not used at the moment + private final Locale locale; + private final LocalizedProperties bundle; + + private final SurefireReportParser parser; private final boolean showSuccess; private final String xrefLocation; - private List<ReportTestSuite> testSuites; + private final List<ReportTestSuite> testSuites; - public SurefireReportGenerator( - List<File> reportsDirectories, + public SurefireReportRenderer( + Sink sink, Locale locale, + LocalizedProperties bundle, + ConsoleLogger consoleLogger, boolean showSuccess, - String xrefLocation, - ConsoleLogger consoleLogger) { - report = new SurefireReportParser(reportsDirectories, locale, consoleLogger); + List<File> reportsDirectories, + String xrefLocation) { + super(sink); + this.locale = locale; + this.bundle = bundle; + parser = new SurefireReportParser(reportsDirectories, consoleLogger); + testSuites = parser.parseXMLReportFiles(); this.showSuccess = showSuccess; this.xrefLocation = xrefLocation; } - public void doGenerateReport(LocalizedProperties bundle, Sink sink) throws MavenReportException { - testSuites = report.parseXMLReportFiles(); - - sink.head(); - - sink.title(); - sink.text(bundle.getReportHeader()); - sink.title_(); - - sink.head_(); - - sink.body(); - - SinkEventAttributeSet atts = new SinkEventAttributeSet(); - atts.addAttribute(TYPE, "application/javascript"); - sink.unknown("script", new Object[] {HtmlMarkup.TAG_TYPE_START}, atts); - sink.unknown("cdata", new Object[] {HtmlMarkup.CDATA_TYPE, javascriptToggleDisplayCode()}, null); - sink.unknown("script", new Object[] {HtmlMarkup.TAG_TYPE_END}, null); + @Override + public String getTitle() { + return bundle.getReportHeader(); + } + public void renderBody() { + sink.rawText(HtmlMarkup.EOL + "<script>" + HtmlMarkup.EOL + javascriptToggleDisplayCode() + HtmlMarkup.EOL + + "</script>" + HtmlMarkup.EOL); sink.section1(); sink.sectionTitle1(); - sink.text(bundle.getReportHeader()); + sink.text(getTitle()); sink.sectionTitle1_(); sink.section1_(); constructSummarySection(bundle, sink); - Map<String, List<ReportTestSuite>> suitePackages = report.getSuitesGroupByPackage(testSuites); + Map<String, List<ReportTestSuite>> suitePackages = parser.getSuitesGroupByPackage(testSuites); if (!suitePackages.isEmpty()) { constructPackagesSection(bundle, sink, suitePackages); } @@ -99,20 +95,17 @@ public final class SurefireReportGenerator { constructTestCasesSection(bundle, sink); } - List<ReportTestCase> failureList = report.getFailureDetails(testSuites); + List<ReportTestCase> failureList = parser.getFailureDetails(testSuites); if (!failureList.isEmpty()) { constructFailureDetails(sink, bundle, failureList); } - - sink.body_(); - - sink.flush(); - - sink.close(); } private void constructSummarySection(LocalizedProperties bundle, Sink sink) { - Map<String, String> summary = report.getSummary(testSuites); + Map<String, Object> summary = parser.getSummary(testSuites); + NumberFormat numberFormat = NumberFormat.getNumberInstance(locale); + NumberFormat percentFormat = NumberFormat.getPercentInstance(locale); + percentFormat.setMinimumFractionDigits(1); sink.section1(); sinkAnchor(sink, "Summary"); @@ -124,9 +117,7 @@ public final class SurefireReportGenerator { sinkLineBreak(sink); - sink.table(); - - sink.tableRows(new int[] {LEFT, LEFT, LEFT, LEFT, LEFT, LEFT}, false); + startTable(); sink.tableRow(); @@ -146,23 +137,21 @@ public final class SurefireReportGenerator { sink.tableRow(); - sinkCell(sink, summary.get("totalTests")); + sinkCell(sink, String.valueOf(summary.get("totalTests"))); - sinkCell(sink, summary.get("totalErrors")); + sinkCell(sink, String.valueOf(summary.get("totalErrors"))); - sinkCell(sink, summary.get("totalFailures")); + sinkCell(sink, String.valueOf(summary.get("totalFailures"))); - sinkCell(sink, summary.get("totalSkipped")); + sinkCell(sink, String.valueOf(summary.get("totalSkipped"))); - sinkCell(sink, summary.get("totalPercentage") + "%"); + sinkCell(sink, percentFormat.format(summary.get("totalPercentage"))); - sinkCell(sink, summary.get("totalElapsedTime")); + sinkCell(sink, numberFormat.format(summary.get("totalElapsedTime")) + " s"); sink.tableRow_(); - sink.tableRows_(); - - sink.table_(); + endTable(); sink.lineBreak(); @@ -177,7 +166,9 @@ public final class SurefireReportGenerator { private void constructPackagesSection( LocalizedProperties bundle, Sink sink, Map<String, List<ReportTestSuite>> suitePackages) { - NumberFormat numberFormat = report.getNumberFormat(); + NumberFormat numberFormat = NumberFormat.getNumberInstance(locale); + NumberFormat percentFormat = NumberFormat.getPercentInstance(locale); + percentFormat.setMinimumFractionDigits(1); sink.section1(); sinkAnchor(sink, "Package_List"); @@ -189,9 +180,7 @@ public final class SurefireReportGenerator { sinkLineBreak(sink); - sink.table(); - - sink.tableRows(new int[] {LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT}, false); + startTable(); sink.tableRow(); @@ -218,29 +207,26 @@ public final class SurefireReportGenerator { List<ReportTestSuite> testSuiteList = entry.getValue(); - Map<String, String> packageSummary = report.getSummary(testSuiteList); + Map<String, Object> packageSummary = parser.getSummary(testSuiteList); sinkCellLink(sink, packageName, "#" + packageName); - sinkCell(sink, packageSummary.get("totalTests")); + sinkCell(sink, String.valueOf(packageSummary.get("totalTests"))); - sinkCell(sink, packageSummary.get("totalErrors")); + sinkCell(sink, String.valueOf(packageSummary.get("totalErrors"))); - sinkCell(sink, packageSummary.get("totalFailures")); + sinkCell(sink, String.valueOf(packageSummary.get("totalFailures"))); - sinkCell(sink, packageSummary.get("totalSkipped")); + sinkCell(sink, String.valueOf(packageSummary.get("totalSkipped"))); - sinkCell(sink, packageSummary.get("totalPercentage") + "%"); + sinkCell(sink, percentFormat.format(packageSummary.get("totalPercentage"))); - sinkCell(sink, packageSummary.get("totalElapsedTime")); + sinkCell(sink, numberFormat.format(packageSummary.get("totalElapsedTime")) + " s"); sink.tableRow_(); } - sink.tableRows_(); - - sink.table_(); - + endTable(); sink.lineBreak(); sink.paragraph(); @@ -269,9 +255,7 @@ public final class SurefireReportGenerator { } if (showTable) { - sink.table(); - - sink.tableRows(new int[] {LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT}, false); + startTable(); sink.tableRow(); @@ -295,13 +279,11 @@ public final class SurefireReportGenerator { for (ReportTestSuite suite : testSuiteList) { if (showSuccess || suite.getNumberOfErrors() != 0 || suite.getNumberOfFailures() != 0) { - constructTestSuiteSection(sink, numberFormat, suite); + constructTestSuiteSection(sink, suite); } } - sink.tableRows_(); - - sink.table_(); + endTable(); } sink.section2_(); @@ -312,7 +294,11 @@ public final class SurefireReportGenerator { sink.section1_(); } - private void constructTestSuiteSection(Sink sink, NumberFormat numberFormat, ReportTestSuite suite) { + private void constructTestSuiteSection(Sink sink, ReportTestSuite suite) { + NumberFormat numberFormat = NumberFormat.getNumberInstance(locale); + NumberFormat percentFormat = NumberFormat.getPercentInstance(locale); + percentFormat.setMinimumFractionDigits(1); + sink.tableRow(); sink.tableCell(); @@ -343,19 +329,17 @@ public final class SurefireReportGenerator { sinkCell(sink, Integer.toString(suite.getNumberOfSkipped())); - String percentage = report.computePercentage( + float percentage = parser.computePercentage( suite.getNumberOfTests(), suite.getNumberOfErrors(), suite.getNumberOfFailures(), suite.getNumberOfSkipped()); - sinkCell(sink, percentage + "%"); + sinkCell(sink, percentFormat.format(percentage)); - sinkCell(sink, numberFormat.format(suite.getTimeElapsed())); + sinkCell(sink, numberFormat.format(suite.getTimeElapsed()) + " s"); sink.tableRow_(); } private void constructTestCasesSection(LocalizedProperties bundle, Sink sink) { - NumberFormat numberFormat = report.getNumberFormat(); - sink.section1(); sinkAnchor(sink, "Test_Cases"); sink.sectionTitle1(); @@ -385,19 +369,15 @@ public final class SurefireReportGenerator { } if (showTable) { - sink.table(); - - sink.tableRows(new int[] {LEFT, LEFT, LEFT}, false); + startTable(); for (ReportTestCase testCase : testCases) { if (!testCase.isSuccessful() || showSuccess) { - constructTestCaseSection(sink, numberFormat, testCase); + constructTestCaseSection(sink, testCase); } } - sink.tableRows_(); - - sink.table_(); + endTable(); } sink.section2_(); @@ -409,7 +389,9 @@ public final class SurefireReportGenerator { sink.section1_(); } - private static void constructTestCaseSection(Sink sink, NumberFormat numberFormat, ReportTestCase testCase) { + private void constructTestCaseSection(Sink sink, ReportTestCase testCase) { + NumberFormat numberFormat = NumberFormat.getNumberInstance(locale); + sink.tableRow(); sink.tableCell(); @@ -463,34 +445,35 @@ public final class SurefireReportGenerator { sinkCellAnchor(sink, testCase.getName(), "TC_" + toHtmlId(testCase.getFullName())); } - sinkCell(sink, numberFormat.format(testCase.getTime())); + sinkCell(sink, numberFormat.format(testCase.getTime()) + " s"); sink.tableRow_(); if (!testCase.isSuccessful()) { - sink.tableRow(); - - sinkCell(sink, ""); - sinkCell(sink, testCase.getFailureMessage()); - sinkCell(sink, ""); - sink.tableRow_(); - - String detail = testCase.getFailureDetail(); - if (detail != null) { + String message = testCase.getFailureMessage(); + if (message != null) { sink.tableRow(); sinkCell(sink, ""); + sinkCell(sink, message); + sinkCell(sink, ""); + sink.tableRow_(); + } - sink.tableCell(); + String detail = testCase.getFailureDetail(); + if (detail != null) { SinkEventAttributeSet atts = new SinkEventAttributeSet(); atts.addAttribute(ID, toHtmlId(testCase.getFullName()) + toHtmlIdFailure(testCase)); atts.addAttribute(STYLE, "display:none;"); - sink.unknown("div", TAG_TYPE_START, atts); + sink.tableRow(atts); + + sinkCell(sink, ""); + + sink.tableCell(); sink.verbatim(null); sink.text(detail); sink.verbatim_(); - sink.unknown("div", TAG_TYPE_END, null); sink.tableCell_(); sinkCell(sink, ""); @@ -515,26 +498,24 @@ public final class SurefireReportGenerator { sinkLineBreak(sink); - sink.table(); - - sink.tableRows(new int[] {LEFT, LEFT}, false); + startTable(); - for (ReportTestCase tCase : failures) { + for (ReportTestCase testCase : failures) { sink.tableRow(); sink.tableCell(); - String type = tCase.getFailureType(); + String type = testCase.getFailureType(); sinkIcon(type, sink); sink.tableCell_(); - sinkCellAnchor(sink, tCase.getName(), toHtmlId(tCase.getFullName())); + sinkCellAnchor(sink, testCase.getName(), toHtmlId(testCase.getFullName())); sink.tableRow_(); - String message = tCase.getFailureMessage(); + String message = testCase.getFailureMessage(); sink.tableRow(); @@ -544,7 +525,7 @@ public final class SurefireReportGenerator { sink.tableRow_(); - String detail = tCase.getFailureDetail(); + String detail = testCase.getFailureDetail(); if (detail != null) { sink.tableRow(); @@ -552,11 +533,11 @@ public final class SurefireReportGenerator { sink.tableCell(); SinkEventAttributeSet atts = new SinkEventAttributeSet(); - atts.addAttribute(ID, tCase.getName() + toHtmlIdFailure(tCase)); + atts.addAttribute(ID, testCase.getName() + toHtmlIdFailure(testCase)); sink.unknown("div", TAG_TYPE_START, atts); - String fullClassName = tCase.getFullClassName(); - String errorLineNumber = tCase.getFailureErrorLine(); + String fullClassName = testCase.getFullClassName(); + String errorLineNumber = testCase.getFailureErrorLine(); if (xrefLocation != null) { String path = fullClassName.replace('.', '/'); sink.link(xrefLocation + "/" + path + ".html#L" + errorLineNumber); @@ -574,9 +555,7 @@ public final class SurefireReportGenerator { } } - sink.tableRows_(); - - sink.table_(); + endTable(); sinkLineBreak(sink); @@ -671,11 +650,7 @@ public final class SurefireReportGenerator { } private static String javascriptToggleDisplayCode() { - - // the javascript code is emitted within a commented CDATA section - // so we have to start with a newline and comment the CDATA closing in the end - - return "\n" + "function toggleDisplay(elementId) {\n" + return "function toggleDisplay(elementId) {\n" + " var elm = document.getElementById(elementId + '-error');\n" + " if (elm == null) {\n" + " elm = document.getElementById(elementId + '-failure');\n" @@ -689,9 +664,8 @@ public final class SurefireReportGenerator { + " elm.style.display = \"none\";\n" + " document.getElementById(elementId + '-off').style.display = \"inline\";\n" + " document.getElementById(elementId + '-on').style.display = \"none\";\n" - + " } \n" - + " } \n" + + " }\n" + " }\n" - + "//"; + + " }"; } } diff --git a/maven-surefire-report-plugin/src/test/java/org/apache/maven/plugins/surefire/report/Surefire597Test.java b/maven-surefire-report-plugin/src/test/java/org/apache/maven/plugins/surefire/report/Surefire597Test.java index e3274f5b7..25a5579c5 100644 --- a/maven-surefire-report-plugin/src/test/java/org/apache/maven/plugins/surefire/report/Surefire597Test.java +++ b/maven-surefire-report-plugin/src/test/java/org/apache/maven/plugins/surefire/report/Surefire597Test.java @@ -24,11 +24,11 @@ import java.io.StringWriter; import junit.framework.TestCase; import org.apache.maven.doxia.module.xhtml5.Xhtml5Sink; import org.apache.maven.doxia.sink.Sink; +import org.apache.maven.doxia.tools.SiteTool; import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; import org.apache.maven.plugin.surefire.log.api.NullConsoleLogger; import static java.util.Collections.singletonList; -import static java.util.Locale.ENGLISH; import static org.apache.maven.plugins.surefire.report.Utils.toSystemNewLine; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.MatcherAssert.assertThat; @@ -41,11 +41,18 @@ public class Surefire597Test extends TestCase { public void testCorruptedTestCaseFailureWithMissingErrorTypeAndMessage() throws Exception { File basedir = new File(".").getCanonicalFile(); File report = new File(basedir, "target/test-classes/surefire-597"); - ConsoleLogger log = new NullConsoleLogger(); - SurefireReportGenerator gen = new SurefireReportGenerator(singletonList(report), ENGLISH, true, null, log); StringWriter writer = new StringWriter(); Sink sink = new Xhtml5Sink(writer) {}; - gen.doGenerateReport(new SurefireReportMojo().getBundle(ENGLISH), sink); + ConsoleLogger consoleLogger = new NullConsoleLogger(); + SurefireReportRenderer r = new SurefireReportRenderer( + sink, + SiteTool.DEFAULT_LOCALE, + new SurefireReportMojo().getBundle(SiteTool.DEFAULT_LOCALE), + consoleLogger, + true, + singletonList(report), + null); + r.render(); String xml = writer.toString(); assertThat( xml, @@ -59,11 +66,11 @@ public class Surefire597Test extends TestCase { + "<th>Time</th></tr>\n" + "<tr class=\"b\">\n" + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0%</td>\n" - + "<td align=\"left\">0</td>" + + "<td>1</td>\n" + + "<td>0</td>\n" + + "<td>0</td>\n" + + "<td>0.0%</td>\n" + + "<td>0 s</td>" + "</tr>" + "</table>"))); assertThat( @@ -79,12 +86,12 @@ public class Surefire597Test extends TestCase { + "<th>Time</th></tr>\n" + "<tr class=\"b\">\n" + "<td align=\"left\"><a href=\"#surefire\">surefire</a></td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0%</td>\n" - + "<td align=\"left\">0</td></tr></table>"))); + + "<td>1</td>\n" + + "<td>1</td>\n" + + "<td>0</td>\n" + + "<td>0</td>\n" + + "<td>0.0%</td>\n" + + "<td>0 s</td></tr></table>"))); assertThat( xml, containsString(toSystemNewLine("<table border=\"0\" class=\"bodyTable\">\n" @@ -99,25 +106,25 @@ public class Surefire597Test extends TestCase { + "<th>Time</th></tr>\n" + "<tr class=\"b\">\n" + "<td align=\"left\"><a href=\"#surefire.MyTest\"><img src=\"images/icon_error_sml.gif\" alt=\"\" /></a></td>\n" - + "<td align=\"left\"><a href=\"#surefire.MyTest\">MyTest</a></td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0%</td>\n" - + "<td align=\"left\">0</td></tr></table>"))); + + "<td><a href=\"#surefire.MyTest\">MyTest</a></td>\n" + + "<td>1</td>\n" + + "<td>1</td>\n" + + "<td>0</td>\n" + + "<td>0</td>\n" + + "<td>0.0%</td>\n" + + "<td>0 s</td></tr></table>"))); assertThat( xml, containsString(toSystemNewLine("<table border=\"0\" class=\"bodyTable\">\n" + "<tr class=\"a\">\n" + "<td align=\"left\"><img src=\"images/icon_error_sml.gif\" alt=\"\" /></td>\n" - + "<td align=\"left\"><a id=\"surefire.MyTest.test\"></a>test</td></tr>\n" + + "<td><a id=\"surefire.MyTest.test\"></a>test</td></tr>\n" + "<tr class=\"b\">\n" + "<td align=\"left\"></td>\n" - + "<td align=\"left\">java.lang.RuntimeException: java.lang.IndexOutOfBoundsException: msg</td></tr>\n" + + "<td>java.lang.RuntimeException: java.lang.IndexOutOfBoundsException: msg</td></tr>\n" + "<tr class=\"a\">\n" + "<td align=\"left\"></td>\n" - + "<td align=\"left\">\n" + + "<td>\n" + "<div id=\"test-error\">surefire.MyTest:13</div></td></tr></table>"))); } } diff --git a/maven-surefire-report-plugin/src/test/java/org/apache/maven/plugins/surefire/report/SurefireReportMojoTest.java b/maven-surefire-report-plugin/src/test/java/org/apache/maven/plugins/surefire/report/SurefireReportMojoTest.java index 14c1992da..4dfb98a51 100644 --- a/maven-surefire-report-plugin/src/test/java/org/apache/maven/plugins/surefire/report/SurefireReportMojoTest.java +++ b/maven-surefire-report-plugin/src/test/java/org/apache/maven/plugins/surefire/report/SurefireReportMojoTest.java @@ -19,26 +19,17 @@ package org.apache.maven.plugins.surefire.report; import java.io.File; -import java.io.IOException; import java.io.UnsupportedEncodingException; -import java.io.Writer; import java.net.URL; import java.net.URLDecoder; import java.util.Locale; -import org.apache.maven.doxia.site.decoration.DecorationModel; -import org.apache.maven.doxia.siterenderer.Renderer; -import org.apache.maven.doxia.siterenderer.RendererException; -import org.apache.maven.doxia.siterenderer.SiteRenderingContext; -import org.apache.maven.doxia.siterenderer.sink.SiteRendererSink; import org.apache.maven.plugin.LegacySupport; import org.apache.maven.plugin.testing.AbstractMojoTestCase; import org.apache.maven.plugin.testing.ArtifactStubFactory; import org.apache.maven.plugin.testing.stubs.MavenProjectStub; import org.apache.maven.plugins.surefire.report.stubs.DependencyArtifactStubFactory; -import org.apache.maven.shared.utils.WriterFactory; import org.apache.maven.shared.utils.io.FileUtils; -import org.apache.maven.shared.utils.io.IOUtil; import org.eclipse.aether.DefaultRepositorySystemSession; import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory; import org.eclipse.aether.repository.LocalRepository; @@ -54,15 +45,23 @@ import static org.hamcrest.MatcherAssert.assertThat; public class SurefireReportMojoTest extends AbstractMojoTestCase { private ArtifactStubFactory artifactStubFactory; - private Renderer renderer; + // Can be removed with Doxia 2.0.0 + private Locale origLocale; @Override protected void setUp() throws Exception { super.setUp(); - renderer = (Renderer) lookup(Renderer.ROLE); - artifactStubFactory = new DependencyArtifactStubFactory(getTestFile("target"), true, false); artifactStubFactory.getWorkingDir().mkdirs(); + + origLocale = Locale.getDefault(); + Locale.setDefault(Locale.ROOT); + } + + @Override + protected void tearDown() throws Exception { + Locale.setDefault(origLocale); + super.tearDown(); } protected SurefireReportMojo createReportMojo(File pluginXmlFile) throws Exception { @@ -105,7 +104,6 @@ public class SurefireReportMojoTest extends AbstractMojoTestCase { mojo.execute(); File report = new File(getBasedir(), "target/site/unit/basic-surefire-report-test/surefire-report.html"); - renderer(mojo, report); assertTrue(report.exists()); String htmlContent = FileUtils.fileRead(report); @@ -127,7 +125,6 @@ public class SurefireReportMojoTest extends AbstractMojoTestCase { mojo.execute(); File report = new File(getBasedir(), "target/site/unit/basic-surefire-report-success-false/surefire-report.html"); - renderer(mojo, report); assertTrue(report.exists()); String htmlContent = FileUtils.fileRead(report); @@ -142,8 +139,7 @@ public class SurefireReportMojoTest extends AbstractMojoTestCase { assertFalse(linkXRef); mojo.execute(); File report = - new File(getBasedir(), "target/site/unit/basic-surefire-report-success-false/surefire-report.html"); - renderer(mojo, report); + new File(getBasedir(), "target/site/unit/basic-surefire-report-linkxref-false/surefire-report.html"); assertTrue(report.exists()); String htmlContent = FileUtils.fileRead(report); @@ -157,7 +153,6 @@ public class SurefireReportMojoTest extends AbstractMojoTestCase { mojo.execute(); File report = new File(getBasedir(), "target/site/unit/basic-surefire-report-reporting-null/surefire-report.html"); - renderer(mojo, report); assertTrue(report.exists()); String htmlContent = FileUtils.fileRead(report); @@ -172,14 +167,13 @@ public class SurefireReportMojoTest extends AbstractMojoTestCase { mojo.execute(); File report = new File(getBasedir(), "target/site/unit/basic-surefire-report-anchor-test-cases/surefire-report.html"); - renderer(mojo, report); assertTrue(report.exists()); String htmlContent = FileUtils.fileRead(report); - int idx = htmlContent.indexOf("<td align=\"left\"><a id=\"TC_com.shape.CircleTest.testX\"></a>testX</td>"); + int idx = htmlContent.indexOf("<td><a id=\"TC_com.shape.CircleTest.testX\"></a>testX</td>"); assertTrue(idx > 0); - idx = htmlContent.indexOf("<td align=\"left\"><a id=\"TC_com.shape.CircleTest.testRadius\"></a>" + idx = htmlContent.indexOf("<td><a id=\"TC_com.shape.CircleTest.testRadius\"></a>" + "<a href=\"#com.shape.CircleTest.testRadius\">testRadius</a>"); assertTrue(idx > 0); } @@ -189,7 +183,6 @@ public class SurefireReportMojoTest extends AbstractMojoTestCase { SurefireReportMojo mojo = createReportMojo(testPom); mojo.execute(); File report = new File(getBasedir(), "target/site/unit/surefire-report-single-error/surefire-report.html"); - renderer(mojo, report); assertTrue(report.exists()); String htmlContent = FileUtils.fileRead(report); @@ -197,22 +190,22 @@ public class SurefireReportMojoTest extends AbstractMojoTestCase { htmlContent, containsString(toSystemNewLine("<tr class=\"b\">\n" + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0%</td>\n" - + "<td align=\"left\">0</td>"))); + + "<td>1</td>\n" + + "<td>0</td>\n" + + "<td>0</td>\n" + + "<td>0.0%</td>\n" + + "<td>0 s</td>"))); assertThat( htmlContent, containsString(toSystemNewLine("<tr class=\"b\">\n" + "<td align=\"left\"><a href=\"#surefire\">surefire</a></td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0%</td>\n" - + "<td align=\"left\">0</td></tr>"))); + + "<td>1</td>\n" + + "<td>1</td>\n" + + "<td>0</td>\n" + + "<td>0</td>\n" + + "<td>0.0%</td>\n" + + "<td>0 s</td></tr>"))); assertThat( htmlContent, containsString(toSystemNewLine("<tr class=\"b\">\n" @@ -221,13 +214,13 @@ public class SurefireReportMojoTest extends AbstractMojoTestCase { + "<img src=\"images/icon_error_sml.gif\" alt=\"\" />" + "</a>" + "</td>\n" - + "<td align=\"left\"><a href=\"#surefire.MyTest\">MyTest</a></td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0%</td>\n" - + "<td align=\"left\">0</td></tr>"))); + + "<td><a href=\"#surefire.MyTest\">MyTest</a></td>\n" + + "<td>1</td>\n" + + "<td>1</td>\n" + + "<td>0</td>\n" + + "<td>0</td>\n" + + "<td>0.0%</td>\n" + + "<td>0 s</td></tr>"))); assertThat(htmlContent, containsString(">surefire.MyTest:13</a>")); @@ -278,7 +271,6 @@ public class SurefireReportMojoTest extends AbstractMojoTestCase { mojo.execute(); File report = new File( getBasedir(), "target/site/unit/surefire-report-nestedClass-trimStackTrace/surefire-report.html"); - renderer(mojo, report); assertTrue(report.exists()); String htmlContent = FileUtils.fileRead(report); @@ -286,22 +278,22 @@ public class SurefireReportMojoTest extends AbstractMojoTestCase { htmlContent, containsString(toSystemNewLine("<tr class=\"b\">\n" + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0%</td>\n" - + "<td align=\"left\">0</td>"))); + + "<td>1</td>\n" + + "<td>0</td>\n" + + "<td>0</td>\n" + + "<td>0.0%</td>\n" + + "<td>0 s</td>"))); assertThat( htmlContent, containsString(toSystemNewLine("<tr class=\"b\">\n" + "<td align=\"left\"><a href=\"#surefire\">surefire</a></td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0%</td>\n" - + "<td align=\"left\">0</td></tr>"))); + + "<td>1</td>\n" + + "<td>1</td>\n" + + "<td>0</td>\n" + + "<td>0</td>\n" + + "<td>0.0%</td>\n" + + "<td>0 s</td></tr>"))); assertThat( htmlContent, containsString(toSystemNewLine("<tr class=\"b\">\n" @@ -310,13 +302,13 @@ public class SurefireReportMojoTest extends AbstractMojoTestCase { + "<img src=\"images/icon_error_sml.gif\" alt=\"\" />" + "</a>" + "</td>\n" - + "<td align=\"left\"><a href=\"#surefire.MyTest\">MyTest</a></td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0%</td>\n" - + "<td align=\"left\">0</td></tr>"))); + + "<td><a href=\"#surefire.MyTest\">MyTest</a></td>\n" + + "<td>1</td>\n" + + "<td>1</td>\n" + + "<td>0</td>\n" + + "<td>0</td>\n" + + "<td>0.0%</td>\n" + + "<td>0 s</td></tr>"))); assertThat(htmlContent, containsString(">surefire.MyTest:13</a>")); assertThat(htmlContent, containsString("./xref-test/surefire/MyTest.html#L13")); @@ -342,7 +334,6 @@ public class SurefireReportMojoTest extends AbstractMojoTestCase { SurefireReportMojo mojo = createReportMojo(testPom); mojo.execute(); File report = new File(getBasedir(), "target/site/unit/surefire-report-nestedClass/surefire-report.html"); - renderer(mojo, report); assertTrue(report.exists()); String htmlContent = FileUtils.fileRead(report); @@ -350,22 +341,22 @@ public class SurefireReportMojoTest extends AbstractMojoTestCase { htmlContent, containsString(toSystemNewLine("<tr class=\"b\">\n" + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0%</td>\n" - + "<td align=\"left\">0</td>"))); + + "<td>1</td>\n" + + "<td>0</td>\n" + + "<td>0</td>\n" + + "<td>0.0%</td>\n" + + "<td>0 s</td>"))); assertThat( htmlContent, containsString(toSystemNewLine("<tr class=\"b\">\n" + "<td align=\"left\"><a href=\"#surefire\">surefire</a></td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0%</td>\n" - + "<td align=\"left\">0</td></tr>"))); + + "<td>1</td>\n" + + "<td>1</td>\n" + + "<td>0</td>\n" + + "<td>0</td>\n" + + "<td>0.0%</td>\n" + + "<td>0 s</td></tr>"))); assertThat( htmlContent, containsString(toSystemNewLine("<tr class=\"b\">\n" @@ -374,13 +365,13 @@ public class SurefireReportMojoTest extends AbstractMojoTestCase { + "<img src=\"images/icon_error_sml.gif\" alt=\"\" />" + "</a>" + "</td>\n" - + "<td align=\"left\"><a href=\"#surefire.MyTest\">MyTest</a></td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0%</td>\n" - + "<td align=\"left\">0</td></tr>"))); + + "<td><a href=\"#surefire.MyTest\">MyTest</a></td>\n" + + "<td>1</td>\n" + + "<td>1</td>\n" + + "<td>0</td>\n" + + "<td>0</td>\n" + + "<td>0.0%</td>\n" + + "<td>0 s</td></tr>"))); assertThat(htmlContent, containsString(">surefire.MyTest:13</a>")); assertThat(htmlContent, containsString("./xref-test/surefire/MyTest.html#L13")); @@ -431,7 +422,6 @@ public class SurefireReportMojoTest extends AbstractMojoTestCase { mojo.execute(); File report = new File(getBasedir(), "target/site/unit/surefire-report-enclosed-trimStackTrace/surefire-report.html"); - renderer(mojo, report); assertTrue(report.exists()); String htmlContent = FileUtils.fileRead(report); @@ -439,22 +429,22 @@ public class SurefireReportMojoTest extends AbstractMojoTestCase { htmlContent, containsString(toSystemNewLine("<tr class=\"b\">\n" + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0%</td>\n" - + "<td align=\"left\">0</td>"))); + + "<td>1</td>\n" + + "<td>0</td>\n" + + "<td>0</td>\n" + + "<td>0.0%</td>\n" + + "<td>0 s</td>"))); assertThat( htmlContent, containsString(toSystemNewLine("<tr class=\"b\">\n" + "<td align=\"left\"><a href=\"#surefire\">surefire</a></td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0%</td>\n" - + "<td align=\"left\">0</td></tr>"))); + + "<td>1</td>\n" + + "<td>1</td>\n" + + "<td>0</td>\n" + + "<td>0</td>\n" + + "<td>0.0%</td>\n" + + "<td>0 s</td></tr>"))); assertThat( htmlContent, containsString(toSystemNewLine("<tr class=\"b\">\n" @@ -463,13 +453,13 @@ public class SurefireReportMojoTest extends AbstractMojoTestCase { + "<img src=\"images/icon_error_sml.gif\" alt=\"\" />" + "</a>" + "</td>\n" - + "<td align=\"left\"><a href=\"#surefire.MyTest$A\">MyTest$A</a></td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0%</td>\n" - + "<td align=\"left\">0</td></tr>"))); + + "<td><a href=\"#surefire.MyTest$A\">MyTest$A</a></td>\n" + + "<td>1</td>\n" + + "<td>1</td>\n" + + "<td>0</td>\n" + + "<td>0</td>\n" + + "<td>0.0%</td>\n" + + "<td>0 s</td></tr>"))); assertThat(htmlContent, containsString(">surefire.MyTest$A:45</a>")); @@ -495,7 +485,6 @@ public class SurefireReportMojoTest extends AbstractMojoTestCase { SurefireReportMojo mojo = createReportMojo(testPom); mojo.execute(); File report = new File(getBasedir(), "target/site/unit/surefire-report-enclosed/surefire-report.html"); - renderer(mojo, report); assertTrue(report.exists()); String htmlContent = FileUtils.fileRead(report); @@ -503,22 +492,22 @@ public class SurefireReportMojoTest extends AbstractMojoTestCase { htmlContent, containsString(toSystemNewLine("<tr class=\"b\">\n" + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0%</td>\n" - + "<td align=\"left\">0</td>"))); + + "<td>1</td>\n" + + "<td>0</td>\n" + + "<td>0</td>\n" + + "<td>0.0%</td>\n" + + "<td>0 s</td>"))); assertThat( htmlContent, containsString(toSystemNewLine("<tr class=\"b\">\n" + "<td align=\"left\"><a href=\"#surefire\">surefire</a></td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0%</td>\n" - + "<td align=\"left\">0</td></tr>"))); + + "<td>1</td>\n" + + "<td>1</td>\n" + + "<td>0</td>\n" + + "<td>0</td>\n" + + "<td>0.0%</td>\n" + + "<td>0 s</td></tr>"))); assertThat( htmlContent, containsString(toSystemNewLine("<tr class=\"b\">\n" @@ -527,13 +516,13 @@ public class SurefireReportMojoTest extends AbstractMojoTestCase { + "<img src=\"images/icon_error_sml.gif\" alt=\"\" />" + "</a>" + "</td>\n" - + "<td align=\"left\"><a href=\"#surefire.MyTest$A\">MyTest$A</a></td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">1</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0</td>\n" - + "<td align=\"left\">0%</td>\n" - + "<td align=\"left\">0</td></tr>"))); + + "<td><a href=\"#surefire.MyTest$A\">MyTest$A</a></td>\n" + + "<td>1</td>\n" + + "<td>1</td>\n" + + "<td>0</td>\n" + + "<td>0</td>\n" + + "<td>0.0%</td>\n" + + "<td>0 s</td></tr>"))); assertThat(htmlContent, containsString(">surefire.MyTest$A:45</a>")); @@ -609,37 +598,11 @@ public class SurefireReportMojoTest extends AbstractMojoTestCase { mojo.execute(); - File report = new File(getBasedir(), "target/site/acceptance-test-report.html"); - renderer(mojo, report); + File report = new File(getBasedir(), "target/site/unit/surefire-1183/acceptance-test-report.html"); assertTrue(report.exists()); String htmlContent = FileUtils.fileRead(report); assertTrue(htmlContent.contains("<h2><a name=\"Acceptance_Test\"></a>Acceptance Test</h2></section>")); } - - /** - * Renderer the sink from the report mojo. - * - * @param mojo not null - * @param outputHtml not null - * @throws RendererException if any - * @throws IOException if any - */ - private void renderer(SurefireReportMojo mojo, File outputHtml) throws RendererException, IOException { - Writer writer = null; - SiteRenderingContext context = new SiteRenderingContext(); - context.setDecoration(new DecorationModel()); - context.setTemplateName("org/apache/maven/doxia/siterenderer/resources/default-site.vm"); - context.setLocale(Locale.ENGLISH); - - try { - outputHtml.getParentFile().mkdirs(); - writer = WriterFactory.newXmlWriter(outputHtml); - - renderer.generateDocument(writer, (SiteRendererSink) mojo.getSink(), context); - } finally { - IOUtil.close(writer); - } - } } diff --git a/maven-surefire-report-plugin/src/test/resources/unit/surefire-1183/plugin-config.xml b/maven-surefire-report-plugin/src/test/resources/unit/surefire-1183/plugin-config.xml index 3166e7896..75ad4abd9 100644 --- a/maven-surefire-report-plugin/src/test/resources/unit/surefire-1183/plugin-config.xml +++ b/maven-surefire-report-plugin/src/test/resources/unit/surefire-1183/plugin-config.xml @@ -31,8 +31,7 @@ <outputName>acceptance-test-report</outputName> <localRepository>${localRepository}</localRepository> <outputDirectory>${basedir}/target/site/unit/surefire-1183</outputDirectory> - <reportsDirectory>${basedir}/src/test/resources/unit/surefire-1183/acceptancetest-reports - </reportsDirectory> + <reportsDirectory>${basedir}/src/test/resources/unit/surefire-1183/acceptancetest-reports</reportsDirectory> </configuration> </plugin> </plugins> diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/jiras/Surefire260TestWithIdenticalNamesIT.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/jiras/Surefire260TestWithIdenticalNamesIT.java index aca227760..5c473af91 100644 --- a/surefire-its/src/test/java/org/apache/maven/surefire/its/jiras/Surefire260TestWithIdenticalNamesIT.java +++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/jiras/Surefire260TestWithIdenticalNamesIT.java @@ -23,8 +23,9 @@ import java.net.URI; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlAnchor; -import com.gargoylesoftware.htmlunit.html.HtmlDivision; import com.gargoylesoftware.htmlunit.html.HtmlPage; +import com.gargoylesoftware.htmlunit.html.HtmlTableRow; + import org.apache.maven.surefire.its.fixture.OutputValidator; import org.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase; import org.apache.maven.surefire.its.fixture.TestFile; @@ -58,7 +59,7 @@ public class Surefire260TestWithIdenticalNamesIT extends SurefireJUnit4Integrati HtmlAnchor a = (HtmlAnchor) page.getByXPath("//a[@href = \"javascript:toggleDisplay('surefire260.TestB.testDup');\"]") .get(0); - HtmlDivision content = (HtmlDivision) page.getElementById("surefire260.TestB.testDup-failure"); + HtmlTableRow content = (HtmlTableRow) page.getElementById("surefire260.TestB.testDup-failure"); assertNotNull(content); assertTrue(content.getAttribute("style").contains("none")); a.click(); diff --git a/surefire-report-parser/src/main/java/org/apache/maven/plugins/surefire/report/SurefireReportParser.java b/surefire-report-parser/src/main/java/org/apache/maven/plugins/surefire/report/SurefireReportParser.java index 467d78487..230317647 100644 --- a/surefire-report-parser/src/main/java/org/apache/maven/plugins/surefire/report/SurefireReportParser.java +++ b/surefire-report-parser/src/main/java/org/apache/maven/plugins/surefire/report/SurefireReportParser.java @@ -22,16 +22,13 @@ import javax.xml.parsers.ParserConfigurationException; import java.io.File; import java.io.IOException; -import java.text.NumberFormat; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; -import java.util.Locale; import java.util.Map; import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; -import org.apache.maven.reporting.MavenReportException; import org.apache.maven.shared.utils.io.DirectoryScanner; import org.xml.sax.SAXException; @@ -46,23 +43,18 @@ public final class SurefireReportParser { private static final String EXCLUDES = "*.txt, testng-failed.xml, testng-failures.xml, testng-results.xml, failsafe-summary*.xml"; - private static final int PCENT = 100; - private final List<ReportTestSuite> testSuites = new ArrayList<>(); - private final NumberFormat numberFormat; - private final ConsoleLogger consoleLogger; private final List<File> reportsDirectories; - public SurefireReportParser(List<File> reportsDirectories, Locale locale, ConsoleLogger consoleLogger) { + public SurefireReportParser(List<File> reportsDirectories, ConsoleLogger consoleLogger) { this.reportsDirectories = reportsDirectories; - numberFormat = NumberFormat.getInstance(locale); this.consoleLogger = consoleLogger; } - public List<ReportTestSuite> parseXMLReportFiles() throws MavenReportException { + public List<ReportTestSuite> parseXMLReportFiles() { final Collection<File> xmlReportFiles = new ArrayList<>(); for (File reportsDirectory : reportsDirectories) { if (reportsDirectory.exists()) { @@ -76,19 +68,19 @@ public final class SurefireReportParser { try { testSuites.addAll(parser.parse(aXmlReportFileList.getAbsolutePath())); } catch (ParserConfigurationException e) { - throw new MavenReportException("Error setting up parser for JUnit XML report", e); + throw new RuntimeException("Error setting up parser for JUnit XML report", e); } catch (SAXException e) { - throw new MavenReportException("Error parsing JUnit XML report " + aXmlReportFileList, e); + throw new RuntimeException("Error parsing JUnit XML report " + aXmlReportFileList, e); } catch (IOException e) { - throw new MavenReportException("Error reading JUnit XML report " + aXmlReportFileList, e); + throw new RuntimeException("Error reading JUnit XML report " + aXmlReportFileList, e); } } return testSuites; } - public Map<String, String> getSummary(List<ReportTestSuite> suites) { - Map<String, String> totalSummary = new HashMap<>(); + public Map<String, Object> getSummary(List<ReportTestSuite> suites) { + Map<String, Object> totalSummary = new HashMap<>(); int totalNumberOfTests = 0; @@ -112,28 +104,24 @@ public final class SurefireReportParser { totalElapsedTime += suite.getTimeElapsed(); } - String totalPercentage = + float totalPercentage = computePercentage(totalNumberOfTests, totalNumberOfErrors, totalNumberOfFailures, totalNumberOfSkipped); - totalSummary.put("totalTests", Integer.toString(totalNumberOfTests)); + totalSummary.put("totalTests", totalNumberOfTests); - totalSummary.put("totalErrors", Integer.toString(totalNumberOfErrors)); + totalSummary.put("totalErrors", totalNumberOfErrors); - totalSummary.put("totalFailures", Integer.toString(totalNumberOfFailures)); + totalSummary.put("totalFailures", totalNumberOfFailures); - totalSummary.put("totalSkipped", Integer.toString(totalNumberOfSkipped)); + totalSummary.put("totalSkipped", totalNumberOfSkipped); - totalSummary.put("totalElapsedTime", numberFormat.format(totalElapsedTime)); + totalSummary.put("totalElapsedTime", totalElapsedTime); totalSummary.put("totalPercentage", totalPercentage); return totalSummary; } - public NumberFormat getNumberFormat() { - return numberFormat; - } - public Map<String, List<ReportTestSuite>> getSuitesGroupByPackage(List<ReportTestSuite> testSuitesList) { Map<String, List<ReportTestSuite>> suitePackage = new HashMap<>(); @@ -152,9 +140,12 @@ public final class SurefireReportParser { return suitePackage; } - public String computePercentage(int tests, int errors, int failures, int skipped) { - float percentage = tests == 0 ? 0 : ((float) (tests - errors - failures - skipped) / (float) tests) * PCENT; - return numberFormat.format(percentage); + /** + * @return a float between 0.0 and 1.0 + */ + public float computePercentage(int tests, int errors, int failures, int skipped) { + float percentage = tests == 0 ? 0 : ((float) (tests - errors - failures - skipped) / (float) tests); + return percentage; } public List<ReportTestCase> getFailureDetails(List<ReportTestSuite> testSuites) { diff --git a/surefire-report-parser/src/test/java/org/apache/maven/plugins/surefire/report/SurefireReportParserTest.java b/surefire-report-parser/src/test/java/org/apache/maven/plugins/surefire/report/SurefireReportParserTest.java index 4596f60ab..8a9240e11 100644 --- a/surefire-report-parser/src/test/java/org/apache/maven/plugins/surefire/report/SurefireReportParserTest.java +++ b/surefire-report-parser/src/test/java/org/apache/maven/plugins/surefire/report/SurefireReportParserTest.java @@ -22,7 +22,6 @@ import java.io.File; import java.io.UnsupportedEncodingException; import java.net.URL; import java.net.URLDecoder; -import java.text.NumberFormat; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -31,7 +30,6 @@ import junit.framework.TestCase; import org.apache.maven.plugin.surefire.log.api.NullConsoleLogger; import static java.util.Collections.singletonList; -import static java.util.Locale.ENGLISH; /** * @@ -39,10 +37,9 @@ import static java.util.Locale.ENGLISH; @SuppressWarnings("checkstyle:magicnumber") public class SurefireReportParserTest extends TestCase { public void testParseXMLReportFiles() throws Exception { - SurefireReportParser report = - new SurefireReportParser(singletonList(getTestDir()), ENGLISH, new NullConsoleLogger()); + SurefireReportParser parser = new SurefireReportParser(singletonList(getTestDir()), new NullConsoleLogger()); - List<ReportTestSuite> suites = report.parseXMLReportFiles(); + List<ReportTestSuite> suites = parser.parseXMLReportFiles(); assertEquals(8, suites.size()); @@ -80,23 +77,21 @@ public class SurefireReportParserTest extends TestCase { suites.add(tSuite2); - SurefireReportParser report = new SurefireReportParser(null, ENGLISH, new NullConsoleLogger()); + SurefireReportParser parser = new SurefireReportParser(null, new NullConsoleLogger()); - Map<String, String> testMap = report.getSummary(suites); + Map<String, Object> testMap = parser.getSummary(suites); - assertEquals(20, Integer.parseInt(testMap.get("totalErrors"))); + assertEquals(20, (int) testMap.get("totalErrors")); - assertEquals(40, Integer.parseInt(testMap.get("totalFailures"))); + assertEquals(40, (int) testMap.get("totalFailures")); - assertEquals(200, Integer.parseInt(testMap.get("totalTests"))); + assertEquals(200, (int) testMap.get("totalTests")); - assertEquals(4, Integer.parseInt(testMap.get("totalSkipped"))); + assertEquals(4, (int) testMap.get("totalSkipped")); - NumberFormat numberFormat = report.getNumberFormat(); + assertEquals(2.0f, (float) testMap.get("totalElapsedTime")); - assertEquals(2.0f, numberFormat.parse(testMap.get("totalElapsedTime")).floatValue(), 0.0f); - - assertEquals(68.00f, numberFormat.parse(testMap.get("totalPercentage")).floatValue(), 0); + assertEquals(0.68f, (float) testMap.get("totalPercentage")); } public void testGetSuitesGroupByPackage() { @@ -120,9 +115,9 @@ public class SurefireReportParserTest extends TestCase { suites.add(tSuite3); - SurefireReportParser report = new SurefireReportParser(null, ENGLISH, new NullConsoleLogger()); + SurefireReportParser parser = new SurefireReportParser(null, new NullConsoleLogger()); - Map<String, List<ReportTestSuite>> groupMap = report.getSuitesGroupByPackage(suites); + Map<String, List<ReportTestSuite>> groupMap = parser.getSuitesGroupByPackage(suites); assertEquals(2, groupMap.size()); @@ -134,13 +129,9 @@ public class SurefireReportParserTest extends TestCase { } public void testComputePercentage() throws Exception { - SurefireReportParser report = new SurefireReportParser(null, ENGLISH, new NullConsoleLogger()); - NumberFormat numberFormat = report.getNumberFormat(); + SurefireReportParser parser = new SurefireReportParser(null, new NullConsoleLogger()); - assertEquals( - 70.00f, - numberFormat.parse(report.computePercentage(100, 20, 10, 0)).floatValue(), - 0); + assertEquals(0.7f, (float) parser.computePercentage(100, 20, 10, 0)); } public void testGetFailureDetails() { @@ -178,9 +169,9 @@ public class SurefireReportParserTest extends TestCase { suites.add(tSuite2); - SurefireReportParser report = new SurefireReportParser(null, ENGLISH, new NullConsoleLogger()); + SurefireReportParser parser = new SurefireReportParser(null, new NullConsoleLogger()); - List<ReportTestCase> failures = report.getFailureDetails(suites); + List<ReportTestCase> failures = parser.getFailureDetails(suites); assertEquals(2, failures.size());