From a225619c7f9268e082ff7bd6f4ac70e25ade0dc2 Mon Sep 17 00:00:00 2001 From: simonbrandhof Date: Wed, 6 Apr 2011 16:25:45 +0200 Subject: [PATCH] SONAR-2332 Filter unit tests files listed in surefire reports --- .../plugins/surefire/SurefirePlugin.java | 21 ++- .../plugins/surefire/SurefireSensor.java | 9 +- .../plugins/surefire/TestCaseDetails.java | 75 -------- .../plugins/surefire/TestSuiteReport.java | 120 ------------- .../surefire/api/AbstractSurefireParser.java | 127 +++++++------- .../SurefireStaxHandler.java} | 78 ++++----- .../surefire/data/UnitTestClassReport.java | 97 +++++++++++ .../plugins/surefire/data/UnitTestIndex.java | 79 +++++++++ .../plugins/surefire/data/UnitTestResult.java | 113 +++++++++++++ .../plugins/surefire/SurefirePluginTest.java | 10 +- .../plugins/surefire/SurefireSensorTest.java | 92 ++-------- .../api/AbstractSurefireParserTest.java | 148 ++++++++++++++++ .../data/SurefireStaxHandlerTest.java | 127 ++++++++++++++ .../data/UnitTestClassReportTest.java | 64 +++++++ .../surefire/data/UnitTestIndexTest.java | 115 +++++++++++++ .../surefire/data/UnitTestResultTest.java | 72 ++++++++ .../surefire/SurefireSensorTest/no-files/hack | 1 - .../groovyAndJavaTests/TEST-groovy.xml | 76 +++++++++ .../groovyAndJavaTests/TEST-java.xml | 76 +++++++++ ...he.commons.collections.TestAllPackages.xml | 71 ++++++++ ...TEST-ch.hortis.sonar.mvn.SonarMojoTest.xml | 83 +++++++++ ...s.sonar.mvn.mc.CheckstyleCollectorTest.xml | 76 +++++++++ ...ortis.sonar.mvn.mc.CloverCollectorTest.xml | 77 +++++++++ ...tis.sonar.mvn.mc.JDependsCollectorTest.xml | 86 ++++++++++ ...tis.sonar.mvn.mc.JavaNCSSCollectorTest.xml | 88 ++++++++++ ...ar.mvn.mc.MetricsCollectorRegistryTest.xml | 74 ++++++++ .../AbstractSurefireParserTest/noReports/hack | 0 .../noTests}/TEST-noTests.xml | 0 .../errorsAndFailures.xml | 160 ++++++++++++++++++ .../SurefireStaxHandlerTest/innerClasses.xml | 71 ++++++++ .../multipleSuites.xml | 24 +++ .../SurefireStaxHandlerTest/rootPackage.xml | 94 ++++++++++ .../SurefireStaxHandlerTest/skippedTests.xml | 133 +++++++++++++++ .../suiteInnerClass.xml | 70 ++++++++ .../SurefireStaxHandlerTest/zeroTests.xml | 70 ++++++++ 35 files changed, 2279 insertions(+), 398 deletions(-) delete mode 100644 plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/TestCaseDetails.java delete mode 100644 plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/TestSuiteReport.java rename plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/{TestSuiteParser.java => data/SurefireStaxHandler.java} (59%) create mode 100644 plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/data/UnitTestClassReport.java create mode 100644 plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/data/UnitTestIndex.java create mode 100644 plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/data/UnitTestResult.java create mode 100644 plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/api/AbstractSurefireParserTest.java create mode 100644 plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest.java create mode 100644 plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/data/UnitTestClassReportTest.java create mode 100644 plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/data/UnitTestIndexTest.java create mode 100644 plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/data/UnitTestResultTest.java delete mode 100644 plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/SurefireSensorTest/no-files/hack create mode 100644 plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/groovyAndJavaTests/TEST-groovy.xml create mode 100644 plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/groovyAndJavaTests/TEST-java.xml create mode 100644 plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/innerClasses/TEST-org.apache.commons.collections.TestAllPackages.xml create mode 100644 plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.SonarMojoTest.xml create mode 100644 plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.mc.CheckstyleCollectorTest.xml create mode 100644 plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.mc.CloverCollectorTest.xml create mode 100644 plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.mc.JDependsCollectorTest.xml create mode 100644 plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.mc.JavaNCSSCollectorTest.xml create mode 100644 plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.mc.MetricsCollectorRegistryTest.xml create mode 100644 plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/noReports/hack rename plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/{SurefireSensorTest/doNotInsertZeroTestsOnClasses => api/AbstractSurefireParserTest/noTests}/TEST-noTests.xml (100%) create mode 100644 plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/errorsAndFailures.xml create mode 100644 plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/innerClasses.xml create mode 100644 plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/multipleSuites.xml create mode 100644 plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/rootPackage.xml create mode 100644 plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/skippedTests.xml create mode 100644 plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/suiteInnerClass.xml create mode 100644 plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/zeroTests.xml diff --git a/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/SurefirePlugin.java b/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/SurefirePlugin.java index 6a637fcc1e1..8d217b135a3 100644 --- a/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/SurefirePlugin.java +++ b/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/SurefirePlugin.java @@ -22,6 +22,7 @@ package org.sonar.plugins.surefire; import org.sonar.api.*; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; @Properties({ @@ -32,12 +33,22 @@ import java.util.List; project = true, global = false) }) -public class SurefirePlugin extends SonarPlugin { +public class SurefirePlugin implements Plugin { - public List> getExtensions() { - List> extensions = new ArrayList>(); - extensions.add(SurefireSensor.class); - return extensions; + public String getKey() { + return CoreProperties.SUREFIRE_PLUGIN; + } + + public String getName() { + return "Surefire"; + } + + public String getDescription() { + return "Support of JUnit and TestNG unit test frameworks"; + } + + public List getExtensions() { + return Arrays.asList(SurefireSensor.class); } } diff --git a/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/SurefireSensor.java b/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/SurefireSensor.java index 668af1b8f95..4a2f9033bf8 100644 --- a/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/SurefireSensor.java +++ b/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/SurefireSensor.java @@ -19,6 +19,7 @@ */ package org.sonar.plugins.surefire; +import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sonar.api.batch.AbstractCoverageExtension; @@ -39,7 +40,7 @@ public class SurefireSensor implements Sensor { private static Logger logger = LoggerFactory.getLogger(SurefireSensor.class); @DependsUpon - public Class dependsUponCoverageSensors() { + public Class dependsUponCoverageSensors() { return AbstractCoverageExtension.class; } @@ -57,7 +58,11 @@ public class SurefireSensor implements Sensor { new AbstractSurefireParser() { @Override protected Resource getUnitTestResource(String classKey) { - return new JavaFile(classKey, true); + if (!StringUtils.contains(classKey, "$")) { + // temporary hack waiting for http://jira.codehaus.org/browse/SONAR-1865 + return new JavaFile(classKey, true); + } + return null; } }.collect(project, context, reportsDir); } diff --git a/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/TestCaseDetails.java b/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/TestCaseDetails.java deleted file mode 100644 index 5209bcbde4f..00000000000 --- a/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/TestCaseDetails.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2011 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.surefire; - -public class TestCaseDetails { - - public final static String STATUS_OK = "ok"; - public final static String STATUS_ERROR = "error"; - public final static String STATUS_FAILURE = "failure"; - public final static String STATUS_SKIPPED = "skipped"; - - private String name; - private String status; - private String stackTrace; - private String errorMessage; - private int timeMS = 0; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - public String getStackTrace() { - return stackTrace; - } - - public void setStackTrace(String stackTrace) { - this.stackTrace = stackTrace; - } - - public String getErrorMessage() { - return errorMessage; - } - - public void setErrorMessage(String errorMessage) { - this.errorMessage = errorMessage; - } - - public int getTimeMS() { - return timeMS; - } - - public void setTimeMS(int timeMS) { - this.timeMS = timeMS; - } - -} diff --git a/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/TestSuiteReport.java b/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/TestSuiteReport.java deleted file mode 100644 index b5bd9abe14d..00000000000 --- a/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/TestSuiteReport.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2011 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.surefire; - -import java.util.ArrayList; -import java.util.List; - -public class TestSuiteReport { - - private String classKey; - private int errors = 0; - private int skipped = 0; - private int tests = 0; - private int timeMS = 0; - private int failures = 0; - - private List details; - - - public TestSuiteReport(String classKey) { - super(); - this.classKey = classKey; - this.details = new ArrayList(); - } - - public String getClassKey() { - return classKey; - } - - public int getErrors() { - return errors; - } - - public void setErrors(int errors) { - this.errors = errors; - } - - public int getSkipped() { - return skipped; - } - - public void setSkipped(int skipped) { - this.skipped = skipped; - } - - public int getTests() { - return tests; - } - - public void setTests(int tests) { - this.tests = tests; - } - - public int getTimeMS() { - return timeMS; - } - - public void setTimeMS(int timeMS) { - this.timeMS = timeMS; - } - - public int getFailures() { - return failures; - } - - public void setFailures(int failures) { - this.failures = failures; - } - - public List getDetails() { - return details; - } - - public void setDetails(List details) { - this.details = details; - } - - public boolean isValid() { - return classKey!=null && !isInnerClass(); - } - - private boolean isInnerClass() { - return classKey!=null && classKey.contains("$"); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - TestSuiteReport that = (TestSuiteReport) o; - return classKey.equals(that.classKey); - } - - @Override - public int hashCode() { - return classKey.hashCode(); - } -} diff --git a/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/api/AbstractSurefireParser.java b/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/api/AbstractSurefireParser.java index 215ed9c8f23..b13e667ebe0 100644 --- a/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/api/AbstractSurefireParser.java +++ b/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/api/AbstractSurefireParser.java @@ -19,7 +19,6 @@ */ package org.sonar.plugins.surefire.api; -import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.StringUtils; import org.sonar.api.batch.SensorContext; import org.sonar.api.measures.CoreMetrics; @@ -28,19 +27,16 @@ import org.sonar.api.measures.Metric; import org.sonar.api.resources.Project; import org.sonar.api.resources.Resource; import org.sonar.api.utils.ParsingUtils; +import org.sonar.api.utils.SonarException; import org.sonar.api.utils.StaxParser; -import org.sonar.api.utils.XmlParserException; -import org.sonar.plugins.surefire.TestCaseDetails; -import org.sonar.plugins.surefire.TestSuiteParser; -import org.sonar.plugins.surefire.TestSuiteReport; +import org.sonar.plugins.surefire.data.SurefireStaxHandler; +import org.sonar.plugins.surefire.data.UnitTestClassReport; +import org.sonar.plugins.surefire.data.UnitTestIndex; +import javax.xml.stream.XMLStreamException; import java.io.File; import java.io.FilenameFilter; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import javax.xml.transform.TransformerException; +import java.util.Map; /** * @since 2.4 @@ -68,76 +64,85 @@ public abstract class AbstractSurefireParser { }); } - private void insertZeroWhenNoReports(Project pom, SensorContext context) { - if ( !StringUtils.equalsIgnoreCase("pom", pom.getPackaging())) { + private void insertZeroWhenNoReports(Project project, SensorContext context) { + if (!StringUtils.equalsIgnoreCase("pom", project.getPackaging())) { context.saveMeasure(CoreMetrics.TESTS, 0.0); } } private void parseFiles(SensorContext context, File[] reports) { - Set analyzedReports = new HashSet(); - try { - for (File report : reports) { - TestSuiteParser parserHandler = new TestSuiteParser(); - StaxParser parser = new StaxParser(parserHandler, false); + UnitTestIndex index = new UnitTestIndex(); + parseFiles(reports, index); + sanitize(index, context); + save(index, context); + + } + + private void parseFiles(File[] reports, UnitTestIndex index) { + SurefireStaxHandler staxParser = new SurefireStaxHandler(index); + StaxParser parser = new StaxParser(staxParser, false); + for (File report : reports) { + try { parser.parse(report); + } catch (XMLStreamException e) { + throw new SonarException("Fail to parse the Surefire report: " + report, e); + } + } + } + + private void sanitize(UnitTestIndex index, SensorContext context) { + for (String classname : index.getClassnames()) { + Resource resource = getUnitTestResource(classname); + if (resource != null && context.isIndexed(resource, false)) { + // ok - for (TestSuiteReport fileReport : parserHandler.getParsedReports()) { - if ( !fileReport.isValid() || analyzedReports.contains(fileReport)) { - continue; - } - if (fileReport.getTests() > 0) { - double testsCount = fileReport.getTests() - fileReport.getSkipped(); - saveClassMeasure(context, fileReport, CoreMetrics.SKIPPED_TESTS, fileReport.getSkipped()); - saveClassMeasure(context, fileReport, CoreMetrics.TESTS, testsCount); - saveClassMeasure(context, fileReport, CoreMetrics.TEST_ERRORS, fileReport.getErrors()); - saveClassMeasure(context, fileReport, CoreMetrics.TEST_FAILURES, fileReport.getFailures()); - saveClassMeasure(context, fileReport, CoreMetrics.TEST_EXECUTION_TIME, fileReport.getTimeMS()); - double passedTests = testsCount - fileReport.getErrors() - fileReport.getFailures(); - if (testsCount > 0) { - double percentage = passedTests * 100d / testsCount; - saveClassMeasure(context, fileReport, CoreMetrics.TEST_SUCCESS_DENSITY, ParsingUtils.scaleValue(percentage)); - } - saveTestsDetails(context, fileReport); - analyzedReports.add(fileReport); - } + } else if (StringUtils.contains(classname, "$")) { + // Java inner class + String parentClassName = StringUtils.substringBeforeLast(classname, "$"); + Resource parentResource = getUnitTestResource(parentClassName); + if (parentResource != null && context.isIndexed(parentResource, false)) { + index.merge(classname, parentClassName); + } else { + index.remove(classname); } + } else { + index.remove(classname); } - - } catch (Exception e) { - throw new XmlParserException("Can not parse surefire reports", e); } } - private void saveTestsDetails(SensorContext context, TestSuiteReport fileReport) throws TransformerException { - StringBuilder testCaseDetails = new StringBuilder(256); - testCaseDetails.append(""); - List details = fileReport.getDetails(); - for (TestCaseDetails detail : details) { - testCaseDetails.append("") - .append(isError ? "") - .append("") - .append(isError ? "" : "").append(""); - } else { - testCaseDetails.append("/>"); + private void save(UnitTestIndex index, SensorContext context) { + for (Map.Entry entry : index.getIndexByClassname().entrySet()) { + UnitTestClassReport report = entry.getValue(); + if (report.getTests() > 0) { + Resource resource = getUnitTestResource(entry.getKey()); + double testsCount = report.getTests() - report.getSkipped(); + saveMeasure(context, resource, CoreMetrics.SKIPPED_TESTS, report.getSkipped()); + saveMeasure(context, resource, CoreMetrics.TESTS, testsCount); + saveMeasure(context, resource, CoreMetrics.TEST_ERRORS, report.getErrors()); + saveMeasure(context, resource, CoreMetrics.TEST_FAILURES, report.getFailures()); + saveMeasure(context, resource, CoreMetrics.TEST_EXECUTION_TIME, report.getDurationMilliseconds()); + double passedTests = testsCount - report.getErrors() - report.getFailures(); + if (testsCount > 0) { + double percentage = passedTests * 100d / testsCount; + saveMeasure(context, resource, CoreMetrics.TEST_SUCCESS_DENSITY, ParsingUtils.scaleValue(percentage)); + } + saveResults(context, resource, report); } } - testCaseDetails.append(""); - context.saveMeasure(getUnitTestResource(fileReport.getClassKey()), new Measure(CoreMetrics.TEST_DATA, testCaseDetails.toString())); } - private void saveClassMeasure(SensorContext context, TestSuiteReport fileReport, Metric metric, double value) { - if ( !Double.isNaN(value)) { - context.saveMeasure(getUnitTestResource(fileReport.getClassKey()), metric, value); + + private void saveMeasure(SensorContext context, Resource resource, Metric metric, double value) { + if (!Double.isNaN(value)) { + context.saveMeasure(resource, metric, value); } } + private void saveResults(SensorContext context, Resource resource, UnitTestClassReport report) { + context.saveMeasure(resource, new Measure(CoreMetrics.TEST_DATA, report.toXml())); + } + protected abstract Resource getUnitTestResource(String classKey); } diff --git a/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/TestSuiteParser.java b/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/data/SurefireStaxHandler.java similarity index 59% rename from plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/TestSuiteParser.java rename to plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/data/SurefireStaxHandler.java index d701a7407fb..b9a0b3b9e41 100644 --- a/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/TestSuiteParser.java +++ b/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/data/SurefireStaxHandler.java @@ -17,13 +17,10 @@ * License along with Sonar; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 */ -package org.sonar.plugins.surefire; +package org.sonar.plugins.surefire.data; import java.text.ParseException; -import java.util.Collection; -import java.util.HashMap; import java.util.Locale; -import java.util.Map; import javax.xml.stream.XMLStreamException; @@ -35,9 +32,13 @@ import org.codehaus.staxmate.in.SMInputCursor; import org.sonar.api.utils.ParsingUtils; import org.sonar.api.utils.StaxParser.XmlStreamHandler; -public class TestSuiteParser implements XmlStreamHandler { +public class SurefireStaxHandler implements XmlStreamHandler { - private Map reportsPerClass = new HashMap(); + private UnitTestIndex index; + + public SurefireStaxHandler(UnitTestIndex index) { + this.index = index; + } public void stream(SMHierarchicCursor rootCursor) throws XMLStreamException { SMInputCursor testSuite = rootCursor.constructDescendantCursor(new ElementFilter("testsuite")); @@ -54,84 +55,67 @@ public class TestSuiteParser implements XmlStreamHandler { while ((event = testCase.getNext()) != null) { if (event.compareTo(SMEvent.START_ELEMENT) == 0) { String testClassName = getClassname(testCase, testSuiteClassName); - TestSuiteReport report = reportsPerClass.get(testClassName); - if (report == null) { - report = new TestSuiteReport(testClassName); - reportsPerClass.put(testClassName, report); - } - cumulateTestCaseDetails(testCase, report); + UnitTestClassReport classReport = index.index(testClassName); + parseTestCase(testCase, classReport); } } } } } - public Collection getParsedReports() { - return reportsPerClass.values(); - } - private String getClassname(SMInputCursor testCaseCursor, String defaultClassname) throws XMLStreamException { String testClassName = testCaseCursor.getAttrValue("classname"); - testClassName = StringUtils.substringBeforeLast(testClassName, "$"); - return testClassName == null ? defaultClassname : testClassName; + return StringUtils.defaultIfBlank(testClassName, defaultClassname); } - private void cumulateTestCaseDetails(SMInputCursor testCaseCursor, TestSuiteReport report) throws XMLStreamException { - TestCaseDetails detail = getTestCaseDetails(testCaseCursor); - if (detail.getStatus().equals(TestCaseDetails.STATUS_SKIPPED)) { - report.setSkipped(report.getSkipped() + 1); - } else if (detail.getStatus().equals(TestCaseDetails.STATUS_FAILURE)) { - report.setFailures(report.getFailures() + 1); - } else if (detail.getStatus().equals(TestCaseDetails.STATUS_ERROR)) { - report.setErrors(report.getErrors() + 1); - } - report.setTests(report.getTests() + 1); - report.setTimeMS(report.getTimeMS() + detail.getTimeMS()); - report.getDetails().add(detail); + private void parseTestCase(SMInputCursor testCaseCursor, UnitTestClassReport report) throws XMLStreamException { + report.add(parseTestResult(testCaseCursor)); } - private void setStackAndMessage(TestCaseDetails detail, SMInputCursor stackAndMessageCursor) throws XMLStreamException { - detail.setErrorMessage(stackAndMessageCursor.getAttrValue("message")); + private void setStackAndMessage(UnitTestResult result, SMInputCursor stackAndMessageCursor) throws XMLStreamException { + result.setMessage(stackAndMessageCursor.getAttrValue("message")); String stack = stackAndMessageCursor.collectDescendantText(); - detail.setStackTrace(stack); + result.setStackTrace(stack); } - private TestCaseDetails getTestCaseDetails(SMInputCursor testCaseCursor) throws XMLStreamException { - TestCaseDetails detail = new TestCaseDetails(); + private UnitTestResult parseTestResult(SMInputCursor testCaseCursor) throws XMLStreamException { + UnitTestResult detail = new UnitTestResult(); String name = getTestCaseName(testCaseCursor); detail.setName(name); - String status = TestCaseDetails.STATUS_OK; - Double time = getTimeAttributeInMS(testCaseCursor); + String status = UnitTestResult.STATUS_OK; + long duration = getTimeAttributeInMS(testCaseCursor); SMInputCursor childNode = testCaseCursor.descendantElementCursor(); if (childNode.getNext() != null) { String elementName = childNode.getLocalName(); - if (elementName.equals("skipped")) { - status = TestCaseDetails.STATUS_SKIPPED; + if ("skipped".equals(elementName)) { + status = UnitTestResult.STATUS_SKIPPED; // bug with surefire reporting wrong time for skipped tests - time = 0d; - } else if (elementName.equals("failure")) { - status = TestCaseDetails.STATUS_FAILURE; + duration = 0L; + + } else if ("failure".equals(elementName)) { + status = UnitTestResult.STATUS_FAILURE; setStackAndMessage(detail, childNode); - } else if (elementName.equals("error")) { - status = TestCaseDetails.STATUS_ERROR; + + } else if ("error".equals(elementName)) { + status = UnitTestResult.STATUS_ERROR; setStackAndMessage(detail, childNode); } } while (childNode.getNext() != null) { // make sure we loop till the end of the elements cursor } - detail.setTimeMS(time.intValue()); + detail.setDurationMilliseconds(duration); detail.setStatus(status); return detail; } - private Double getTimeAttributeInMS(SMInputCursor testCaseCursor) throws XMLStreamException { + private long getTimeAttributeInMS(SMInputCursor testCaseCursor) throws XMLStreamException { // hardcoded to Locale.ENGLISH see http://jira.codehaus.org/browse/SONAR-602 try { Double time = ParsingUtils.parseNumber(testCaseCursor.getAttrValue("time"), Locale.ENGLISH); - return !Double.isNaN(time) ? ParsingUtils.scaleValue(time * 1000, 3) : 0; + return !Double.isNaN(time) ? new Double(ParsingUtils.scaleValue(time * 1000, 3)).longValue() : 0L; } catch (ParseException e) { throw new XMLStreamException(e); } diff --git a/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/data/UnitTestClassReport.java b/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/data/UnitTestClassReport.java new file mode 100644 index 00000000000..de6ac1a5f21 --- /dev/null +++ b/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/data/UnitTestClassReport.java @@ -0,0 +1,97 @@ +/* + * Sonar, open source software quality management tool. + * Copyright (C) 2008-2011 SonarSource + * mailto:contact AT sonarsource DOT com + * + * Sonar is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * Sonar is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Sonar; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 + */ +package org.sonar.plugins.surefire.data; + +import com.google.common.collect.Lists; + +import java.util.Collections; +import java.util.List; + +public final class UnitTestClassReport { + private long errors = 0L, failures = 0L, skipped = 0L, tests = 0L, durationMilliseconds = 0L; + private List results = null; + + public UnitTestClassReport add(UnitTestClassReport other) { + for (UnitTestResult otherResult : other.getResults()) { + add(otherResult); + } + return this; + } + + public UnitTestClassReport add(UnitTestResult result) { + initResults(); + results.add(result); + if (result.getStatus().equals(UnitTestResult.STATUS_SKIPPED)) { + skipped += 1; + + } else if (result.getStatus().equals(UnitTestResult.STATUS_FAILURE)) { + failures += 1; + + } else if (result.getStatus().equals(UnitTestResult.STATUS_ERROR)) { + errors += 1; + } + tests += 1; + durationMilliseconds += result.getDurationMilliseconds(); + return this; + } + + private void initResults() { + if (results == null) { + results = Lists.newArrayList(); + } + } + + public long getErrors() { + return errors; + } + + public long getFailures() { + return failures; + } + + public long getSkipped() { + return skipped; + } + + public long getTests() { + return tests; + } + + public long getDurationMilliseconds() { + return durationMilliseconds; + } + + public List getResults() { + if (results==null) { + return Collections.emptyList(); + } + return results; + } + + public String toXml() { + StringBuilder sb = new StringBuilder(256); + sb.append(""); + for (UnitTestResult result : results) { + result.appendXml(sb); + } + sb.append(""); + return sb.toString(); + } +} diff --git a/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/data/UnitTestIndex.java b/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/data/UnitTestIndex.java new file mode 100644 index 00000000000..350518b3813 --- /dev/null +++ b/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/data/UnitTestIndex.java @@ -0,0 +1,79 @@ +/* + * Sonar, open source software quality management tool. + * Copyright (C) 2008-2011 SonarSource + * mailto:contact AT sonarsource DOT com + * + * Sonar is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * Sonar is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Sonar; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 + */ +package org.sonar.plugins.surefire.data; + +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; + +import java.util.*; + +/** + * @since 2.8 + */ +public class UnitTestIndex { + + private Map indexByClassname; + + public UnitTestIndex() { + this.indexByClassname = Maps.newHashMap(); + } + + public UnitTestClassReport index(String classname) { + UnitTestClassReport classReport = indexByClassname.get(classname); + if (classReport == null) { + classReport = new UnitTestClassReport(); + indexByClassname.put(classname, classReport); + } + return classReport; + } + + public UnitTestClassReport get(String classname) { + return indexByClassname.get(classname); + } + + public Set getClassnames() { + return Sets.newHashSet(indexByClassname.keySet()); + } + + public Map getIndexByClassname() { + return indexByClassname; + } + + public int size() { + return indexByClassname.size(); + } + + public UnitTestClassReport merge(String classname, String intoClassname) { + UnitTestClassReport from = indexByClassname.get(classname); + if (from!=null) { + UnitTestClassReport to = index(intoClassname); + to.add(from); + indexByClassname.remove(classname); + return to; + } + return null; + } + + public void remove(String classname) { + indexByClassname.remove(classname); + } + + +} diff --git a/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/data/UnitTestResult.java b/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/data/UnitTestResult.java new file mode 100644 index 00000000000..eba0f99f56e --- /dev/null +++ b/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/data/UnitTestResult.java @@ -0,0 +1,113 @@ +/* + * Sonar, open source software quality management tool. + * Copyright (C) 2008-2011 SonarSource + * mailto:contact AT sonarsource DOT com + * + * Sonar is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * Sonar is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Sonar; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 + */ +package org.sonar.plugins.surefire.data; + +import org.apache.commons.lang.StringEscapeUtils; + +public final class UnitTestResult { + public final static String STATUS_OK = "ok"; + public final static String STATUS_ERROR = "error"; + public final static String STATUS_FAILURE = "failure"; + public final static String STATUS_SKIPPED = "skipped"; + + private String name, status, stackTrace, message; + private long durationMilliseconds = 0L; + + public String getName() { + return name; + } + + public UnitTestResult setName(String name) { + this.name = name; + return this; + } + + public String getStatus() { + return status; + } + + public UnitTestResult setStatus(String status) { + this.status = status; + return this; + } + + public UnitTestResult setStackTrace(String stackTrace) { + this.stackTrace = stackTrace; + return this; + } + + public String getMessage() { + return message; + } + + public UnitTestResult setMessage(String message) { + this.message = message; + return this; + } + + public long getDurationMilliseconds() { + return durationMilliseconds; + } + + public UnitTestResult setDurationMilliseconds(long l) { + this.durationMilliseconds = l; + return this; + } + + public boolean isErrorOrFailure() { + return STATUS_ERROR.equals(status) || STATUS_FAILURE.equals(status); + } + + public boolean isError() { + return STATUS_ERROR.equals(status); + } + + public String toXml() { + StringBuilder sb = new StringBuilder(); + return appendXml(sb).toString(); + } + public StringBuilder appendXml(StringBuilder sb) { + sb + .append("") + .append(isError() ? "") + .append("") + .append(isError() ? "" : "") + .append(""); + } else { + sb.append("/>"); + } + return sb; + } + +} diff --git a/plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/SurefirePluginTest.java b/plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/SurefirePluginTest.java index a3d19a328c1..e027702aca4 100644 --- a/plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/SurefirePluginTest.java +++ b/plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/SurefirePluginTest.java @@ -19,17 +19,15 @@ */ package org.sonar.plugins.surefire; +import org.junit.Test; + import static org.hamcrest.Matchers.greaterThan; import static org.junit.Assert.assertThat; -import org.junit.Test; - public class SurefirePluginTest { @Test - public void testGetExtensions() { - SurefirePlugin plugin = new SurefirePlugin(); - assertThat(plugin.getExtensions().size(), greaterThan(0)); + public void shouldGetExtensions() { + assertThat(new SurefirePlugin().getExtensions().size(), greaterThan(0)); } - } diff --git a/plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/SurefireSensorTest.java b/plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/SurefireSensorTest.java index 37accaa32ef..15b007f9018 100644 --- a/plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/SurefireSensorTest.java +++ b/plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/SurefireSensorTest.java @@ -30,10 +30,7 @@ import org.sonar.api.batch.SensorContext; import org.sonar.api.measures.CoreMetrics; import org.sonar.api.measures.Measure; import org.sonar.api.measures.Metric; -import org.sonar.api.resources.Java; -import org.sonar.api.resources.JavaFile; -import org.sonar.api.resources.Project; -import org.sonar.api.resources.Qualifiers; +import org.sonar.api.resources.*; import org.sonar.api.test.IsMeasure; import org.sonar.api.test.IsResource; import org.sonar.api.test.MavenTestUtils; @@ -76,70 +73,16 @@ public class SurefireSensorTest { new SurefireSensor().collect(project, mock(SensorContext.class), new File("unknown")); } - @Test - public void zeroTestsIfNoFiles() throws URISyntaxException { - SensorContext context = mock(SensorContext.class); - new SurefireSensor().collect(newJarProject(), context, new File(getClass().getResource( - "/org/sonar/plugins/surefire/SurefireSensorTest/no-files/").toURI())); - verify(context).saveMeasure(CoreMetrics.TESTS, 0.0); - } - - @Test - public void doNotInsertZeroTestsOnClasses() throws URISyntaxException { + private SensorContext mockContext() { SensorContext context = mock(SensorContext.class); - new SurefireSensor().collect(newJarProject(), context, new File(getClass().getResource( - "/org/sonar/plugins/surefire/SurefireSensorTest/doNotInsertZeroTestsOnClasses/").toURI())); - - verify(context, never()).saveMeasure(argThat(new IsResource(JavaFile.SCOPE_ENTITY, Qualifiers.UNIT_TEST_FILE)), - (Metric) anyObject(), anyDouble()); - } - - @Test - public void doNotInsertMeasuresOnPomProjects() throws URISyntaxException { - SensorContext context = mock(SensorContext.class); - new SurefireSensor().collect(newPomProject(), context, new File(getClass().getResource( - "/org/sonar/plugins/surefire/SurefireSensorTest/no-files/").toURI())); - - verify(context, never()).saveMeasure(eq(CoreMetrics.TESTS), anyDouble()); - } - - @Test - public void shouldHandleMultipleTestSuites() throws URISyntaxException { - SensorContext context = mock(SensorContext.class); - new SurefireSensor().collect(newPomProject(), context, new File(getClass().getResource( - "/org/sonar/plugins/surefire/SurefireSensorTest/shouldHandleMultipleSuitesInSameFile/").toURI())); - - verify(context).saveMeasure(eq(new JavaFile("org.sonar.JavaNCSSCollectorTest", true)), eq(CoreMetrics.TESTS), eq(11d)); - verify(context).saveMeasure(eq(new JavaFile("org.sonar.SecondTest", true)), eq(CoreMetrics.TESTS), eq(4d)); - } - - @Test - public void shouldSaveClassMeasures() throws URISyntaxException { - SensorContext context = mock(SensorContext.class); - new SurefireSensor().collect(newJarProject(), context, new File(getClass().getResource( - "/org/sonar/plugins/surefire/SurefireSensorTest/many-results/").toURI())); - - verify(context, times(6)).saveMeasure(argThat(new IsResource(JavaFile.SCOPE_ENTITY, Qualifiers.UNIT_TEST_FILE)), - eq(CoreMetrics.TESTS), anyDouble()); - verify(context, times(36)).saveMeasure(argThat(new IsResource(JavaFile.SCOPE_ENTITY, Qualifiers.UNIT_TEST_FILE)), - (Metric) anyObject(), anyDouble()); - verify(context, times(6)).saveMeasure(argThat(new IsResource(JavaFile.SCOPE_ENTITY, Qualifiers.UNIT_TEST_FILE)), - argThat(new IsMeasure(CoreMetrics.TEST_DATA))); - - verify(context) - .saveMeasure(new JavaFile("ch.hortis.sonar.mvn.mc.CheckstyleCollectorTest", true), CoreMetrics.TEST_EXECUTION_TIME, 694d); - verify(context).saveMeasure(new JavaFile("ch.hortis.sonar.mvn.mc.CheckstyleCollectorTest", true), CoreMetrics.TEST_ERRORS, 0d); - verify(context).saveMeasure(new JavaFile("ch.hortis.sonar.mvn.mc.CheckstyleCollectorTest", true), CoreMetrics.TEST_FAILURES, 0d); - verify(context).saveMeasure(new JavaFile("ch.hortis.sonar.mvn.mc.CheckstyleCollectorTest", true), CoreMetrics.TESTS, 6d); - verify(context).saveMeasure(new JavaFile("ch.hortis.sonar.mvn.mc.CheckstyleCollectorTest", true), CoreMetrics.SKIPPED_TESTS, 0d); - verify(context).saveMeasure(eq(new JavaFile("ch.hortis.sonar.mvn.mc.CheckstyleCollectorTest", true)), - argThat(new IsMeasure(CoreMetrics.TEST_DATA))); + when(context.isIndexed(any(Resource.class), eq(false))).thenReturn(true); + return context; } @Test public void shouldHandleTestSuiteDetails() throws URISyntaxException { - SensorContext context = mock(SensorContext.class); + SensorContext context = mockContext(); new SurefireSensor().collect(newJarProject(), context, new File(getClass().getResource( "/org/sonar/plugins/surefire/SurefireSensorTest/shouldHandleTestSuiteDetails/").toURI())); @@ -183,7 +126,7 @@ public class SurefireSensorTest { @Test public void shouldSaveErrorsAndFailuresInXML() throws URISyntaxException { - SensorContext context = mock(SensorContext.class); + SensorContext context = mockContext(); new SurefireSensor().collect(newJarProject(), context, new File(getClass().getResource( "/org/sonar/plugins/surefire/SurefireSensorTest/shouldSaveErrorsAndFailuresInXML/").toURI())); @@ -204,7 +147,7 @@ public class SurefireSensorTest { @Test public void shouldManageClassesWithDefaultPackage() throws URISyntaxException { - SensorContext context = mock(SensorContext.class); + SensorContext context = mockContext(); new SurefireSensor().collect(newJarProject(), context, new File(getClass().getResource( "/org/sonar/plugins/surefire/SurefireSensorTest/shouldManageClassesWithDefaultPackage/").toURI())); @@ -213,7 +156,7 @@ public class SurefireSensorTest { @Test public void successRatioIsZeroWhenAllTestsFail() throws URISyntaxException { - SensorContext context = mock(SensorContext.class); + SensorContext context = mockContext(); new SurefireSensor().collect(newJarProject(), context, new File(getClass().getResource( "/org/sonar/plugins/surefire/SurefireSensorTest/successRatioIsZeroWhenAllTestsFail/").toURI())); @@ -225,7 +168,7 @@ public class SurefireSensorTest { @Test public void measuresShouldNotIncludeSkippedTests() throws URISyntaxException { - SensorContext context = mock(SensorContext.class); + SensorContext context = mockContext(); new SurefireSensor().collect(newJarProject(), context, new File(getClass().getResource( "/org/sonar/plugins/surefire/SurefireSensorTest/measuresShouldNotIncludeSkippedTests/").toURI())); @@ -238,7 +181,7 @@ public class SurefireSensorTest { @Test public void noSuccessRatioIfNoTests() throws URISyntaxException { - SensorContext context = mock(SensorContext.class); + SensorContext context = mockContext(); new SurefireSensor().collect(newJarProject(), context, new File(getClass().getResource( "/org/sonar/plugins/surefire/SurefireSensorTest/noSuccessRatioIfNoTests/").toURI())); @@ -249,22 +192,9 @@ public class SurefireSensorTest { verify(context, never()).saveMeasure(eq(new JavaFile("org.sonar.Foo")), eq(CoreMetrics.TEST_SUCCESS_DENSITY), anyDouble()); } - @Test - public void doNotSaveInnerClasses() throws URISyntaxException { - SensorContext context = mock(SensorContext.class); - new SurefireSensor().collect(newJarProject(), context, new File(getClass().getResource( - "/org/sonar/plugins/surefire/SurefireSensorTest/doNotSaveInnerClasses/").toURI())); - verify(context).saveMeasure(eq(new JavaFile("org.apache.commons.collections.bidimap.AbstractTestBidiMap")), eq(CoreMetrics.TESTS), - eq(7.0)); - verify(context).saveMeasure(eq(new JavaFile("org.apache.commons.collections.bidimap.AbstractTestBidiMap")), - eq(CoreMetrics.TEST_ERRORS), eq(1.0)); - verify(context).saveMeasure(eq(new JavaFile("org.apache.commons.collections.bidimap.AbstractTestBidiMap")), - eq(CoreMetrics.TEST_EXECUTION_TIME), eq(45.0)); - } - @Test public void ignoreSuiteAsInnerClass() throws URISyntaxException { - SensorContext context = mock(SensorContext.class); + SensorContext context = mockContext(); new SurefireSensor().collect(newJarProject(), context, new File(getClass().getResource( "/org/sonar/plugins/surefire/SurefireSensorTest/ignoreSuiteAsInnerClass/").toURI())); diff --git a/plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/api/AbstractSurefireParserTest.java b/plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/api/AbstractSurefireParserTest.java new file mode 100644 index 00000000000..84fef260f4f --- /dev/null +++ b/plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/api/AbstractSurefireParserTest.java @@ -0,0 +1,148 @@ +/* + * Sonar, open source software quality management tool. + * Copyright (C) 2008-2011 SonarSource + * mailto:contact AT sonarsource DOT com + * + * Sonar is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * Sonar is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Sonar; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 + */ +package org.sonar.plugins.surefire.api; + +import org.hamcrest.BaseMatcher; +import org.hamcrest.Description; +import org.junit.Test; +import org.mockito.internal.matchers.StartsWith; +import org.sonar.api.batch.SensorContext; +import org.sonar.api.measures.CoreMetrics; +import org.sonar.api.measures.Metric; +import org.sonar.api.resources.*; +import org.sonar.api.resources.File; +import org.sonar.api.test.IsMeasure; +import org.sonar.api.test.IsResource; + +import java.net.URISyntaxException; + +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyDouble; +import static org.mockito.Matchers.argThat; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.*; + +public class AbstractSurefireParserTest { + + @Test + public void shouldAggregateReports() throws URISyntaxException { + AbstractSurefireParser parser = newParser(); + SensorContext context = mockContext(); + + parser.collect(new Project("foo"), context, getDir("multipleReports")); + + verify(context, times(6)).saveMeasure(argThat(new IsResource(Scopes.FILE, Qualifiers.FILE)), eq(CoreMetrics.TESTS), anyDouble()); + verify(context, times(6)).saveMeasure(argThat(new IsResource(Scopes.FILE, Qualifiers.FILE)), eq(CoreMetrics.TEST_ERRORS), anyDouble()); + verify(context, times(6)).saveMeasure(argThat(new IsResource(Scopes.FILE, Qualifiers.FILE)), argThat(new IsMeasure(CoreMetrics.TEST_DATA))); + } + + @Test + public void shouldNotFailIfNoReports() throws URISyntaxException { + AbstractSurefireParser parser = newParser(); + SensorContext context = mockContext(); + + parser.collect(new Project("foo"), context, getDir("noReports")); + + verify(context).saveMeasure(CoreMetrics.TESTS, 0.0); + } + + @Test + public void shouldNotInsertZeroOnFiles() throws URISyntaxException { + AbstractSurefireParser parser = newParser(); + SensorContext context = mockContext(); + + parser.collect(new Project("foo"), context, getDir("noTests")); + + verify(context, never()).saveMeasure(any(Resource.class),(Metric)anyObject(), anyDouble()); + } + + @Test + public void shouldNotInsertMeasuresOnPomProjects() throws URISyntaxException { + AbstractSurefireParser parser = newParser(); + SensorContext context = mockContext(); + + parser.collect(new Project("foo").setPackaging("pom"), context, getDir("noReports")); + + verify(context, never()).saveMeasure(eq(CoreMetrics.TESTS), anyDouble()); + } + + /** + * This use-case occurs in projects mixing Groovy and Java tests. All test files are listed in surefire reports, + * but only Java files are indexed into sonar. + */ + @Test + public void shouldIgnoreNonIndexedFiles() throws URISyntaxException { + AbstractSurefireParser parser = newParser(); + + SensorContext context = mock(SensorContext.class); + when(context.isIndexed(argThat(new BaseMatcher(){ + public boolean matches(Object o) { + return ((Resource)o).getName().startsWith("java"); + } + public void describeTo(Description description) { + } + }), eq(false))).thenReturn(true); + + parser.collect(new Project("foo"), context, getDir("groovyAndJavaTests")); + + verify(context).saveMeasure(argThat(new IsResource(Scopes.FILE, Qualifiers.FILE, "java.Foo")), eq(CoreMetrics.TESTS), eq(6.0)); + verify(context, never()).saveMeasure(argThat(new IsResource(Scopes.FILE, Qualifiers.FILE, "groovy.Foo")), any(Metric.class), anyDouble()); + } + + @Test + public void shouldMergeInnerClasses() throws URISyntaxException { + AbstractSurefireParser parser = newParser(); + + SensorContext context = mock(SensorContext.class); + when(context.isIndexed(argThat(new BaseMatcher(){ + public boolean matches(Object o) { + return !((Resource)o).getName().contains("$"); + } + public void describeTo(Description description) { + } + }), eq(false))).thenReturn(true); + + parser.collect(new Project("foo"), context, getDir("innerClasses")); + + verify(context).saveMeasure(argThat(new IsResource(Scopes.FILE, Qualifiers.FILE, "org.apache.commons.collections.bidimap.AbstractTestBidiMap")), eq(CoreMetrics.TESTS), eq(7.0)); + verify(context).saveMeasure(argThat(new IsResource(Scopes.FILE, Qualifiers.FILE, "org.apache.commons.collections.bidimap.AbstractTestBidiMap")), eq(CoreMetrics.TEST_ERRORS), eq(1.0)); + verify(context, never()).saveMeasure(argThat(new IsResource(Scopes.FILE, Qualifiers.FILE, "org.apache.commons.collections.bidimap.AbstractTestBidiMap$TestBidiMapEntrySet")), any(Metric.class), anyDouble()); + } + + + private AbstractSurefireParser newParser() { + return new AbstractSurefireParser() { + @Override + protected Resource getUnitTestResource(String classKey) { + return new File(classKey); + } + }; + } + + private java.io.File getDir(String dirname) throws URISyntaxException { + return new java.io.File(getClass().getResource("/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/" + dirname).toURI()); + } + + private SensorContext mockContext() { + SensorContext context = mock(SensorContext.class); + when(context.isIndexed(any(Resource.class), eq(false))).thenReturn(true); + return context; + } +} diff --git a/plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest.java b/plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest.java new file mode 100644 index 00000000000..567e75a2779 --- /dev/null +++ b/plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest.java @@ -0,0 +1,127 @@ +/* + * Sonar, open source software quality management tool. + * Copyright (C) 2008-2011 SonarSource + * mailto:contact AT sonarsource DOT com + * + * Sonar is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * Sonar is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Sonar; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 + */ +package org.sonar.plugins.surefire.data; + +import org.junit.Before; +import org.junit.Test; +import org.sonar.api.measures.CoreMetrics; +import org.sonar.api.resources.JavaFile; +import org.sonar.api.utils.StaxParser; +import org.sonar.test.TestUtils; + +import javax.xml.stream.XMLStreamException; +import java.io.File; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.Matchers.startsWith; +import static org.junit.Assert.assertThat; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.verify; + +public class SurefireStaxHandlerTest { + + private UnitTestIndex index; + + @Before + public void setUp() { + index = new UnitTestIndex(); + } + + @Test + public void shouldLoadInnerClasses() throws XMLStreamException { + parse("innerClasses.xml"); + + UnitTestClassReport publicClass = index.get("org.apache.commons.collections.bidimap.AbstractTestBidiMap"); + assertThat(publicClass.getTests(), is(2L)); + + UnitTestClassReport innerClass1 = index.get("org.apache.commons.collections.bidimap.AbstractTestBidiMap$TestBidiMapEntrySet"); + assertThat(innerClass1.getTests(), is(2L)); + + UnitTestClassReport innerClass2 = index.get("org.apache.commons.collections.bidimap.AbstractTestBidiMap$TestInverseBidiMap"); + assertThat(innerClass2.getTests(), is(3L)); + assertThat(innerClass2.getDurationMilliseconds(), is(30 + 1L)); + assertThat(innerClass2.getErrors(), is(1L)); + } + + @Test + public void shouldSuiteAsInnerClass() throws XMLStreamException { + parse("suiteInnerClass.xml"); + assertThat(index.size(), is(0)); + } + + @Test + public void shouldHaveSkippedTests() throws XMLStreamException { + parse("skippedTests.xml"); + UnitTestClassReport report = index.get("org.sonar.Foo"); + assertThat(report.getTests(), is(3L)); + assertThat(report.getSkipped(), is(1L)); + } + + @Test + public void shouldHaveZeroTests() throws XMLStreamException { + parse("zeroTests.xml"); + assertThat(index.size(), is(0)); + } + + @Test + public void shouldHaveTestOnRootPackage() throws XMLStreamException { + parse("rootPackage.xml"); + assertThat(index.size(), is(1)); + UnitTestClassReport report = index.get("NoPackagesTest"); + assertThat(report.getTests(), is(2L)); + } + + @Test + public void shouldHaveErrorsAndFailures() throws XMLStreamException { + parse("errorsAndFailures.xml"); + UnitTestClassReport report = index.get("org.sonar.Foo"); + assertThat(report.getErrors(), is(1L)); + assertThat(report.getFailures(), is(1L)); + assertThat(report.getResults().size(), is(2)); + + // failure + UnitTestResult failure = report.getResults().get(0); + assertThat(failure.getDurationMilliseconds(), is(5L)); + assertThat(failure.getStatus(), is(UnitTestResult.STATUS_FAILURE)); + assertThat(failure.getName(), is("testOne")); + assertThat(failure.getMessage(), startsWith("expected")); + + // error + UnitTestResult error = report.getResults().get(1); + assertThat(error.getDurationMilliseconds(), is(0L)); + assertThat(error.getStatus(), is(UnitTestResult.STATUS_ERROR)); + assertThat(error.getName(), is("testTwo")); + } + + @Test + public void shouldSupportMultipleSuitesInSameReport() throws XMLStreamException { + parse("multipleSuites.xml"); + + assertThat(index.get("org.sonar.JavaNCSSCollectorTest").getTests(), is(11L)); + assertThat(index.get("org.sonar.SecondTest").getTests(), is(4L)); + } + + private void parse(String path) throws XMLStreamException { + File xml = TestUtils.getResource(getClass(), path); + SurefireStaxHandler staxParser = new SurefireStaxHandler(index); + StaxParser parser = new StaxParser(staxParser, false); + parser.parse(xml); + } +} diff --git a/plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/data/UnitTestClassReportTest.java b/plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/data/UnitTestClassReportTest.java new file mode 100644 index 00000000000..700e854ac9e --- /dev/null +++ b/plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/data/UnitTestClassReportTest.java @@ -0,0 +1,64 @@ +/* + * Sonar, open source software quality management tool. + * Copyright (C) 2008-2011 SonarSource + * mailto:contact AT sonarsource DOT com + * + * Sonar is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * Sonar is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Sonar; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 + */ +package org.sonar.plugins.surefire.data; + +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; + +public class UnitTestClassReportTest { + @Test + public void shouldExportToXml() { + UnitTestClassReport report = new UnitTestClassReport(); + report.add(new UnitTestResult().setStatus(UnitTestResult.STATUS_ERROR).setDurationMilliseconds(500L)); + report.add(new UnitTestResult().setStatus(UnitTestResult.STATUS_OK).setDurationMilliseconds(200L)); + + String xml = report.toXml(); + + assertThat(xml, is("")); + } + + @Test + public void shouldIncrementCounters() { + UnitTestClassReport report = new UnitTestClassReport(); + report.add(new UnitTestResult().setStatus(UnitTestResult.STATUS_ERROR).setDurationMilliseconds(500L)); + report.add(new UnitTestResult().setStatus(UnitTestResult.STATUS_OK).setDurationMilliseconds(200L)); + report.add(new UnitTestResult().setStatus(UnitTestResult.STATUS_SKIPPED)); + + assertThat(report.getResults().size(), is(3)); + assertThat(report.getSkipped(), is(1L)); + assertThat(report.getTests(), is(3L)); + assertThat(report.getDurationMilliseconds(), is(500L + 200L)); + assertThat(report.getErrors(), is(1L)); + assertThat(report.getFailures(), is(0L)); + } + + @Test + public void shouldHaveEmptyReport() { + UnitTestClassReport report = new UnitTestClassReport(); + assertThat(report.getResults().size(), is(0)); + assertThat(report.getSkipped(), is(0L)); + assertThat(report.getTests(), is(0L)); + assertThat(report.getDurationMilliseconds(), is(0L)); + assertThat(report.getErrors(), is(0L)); + assertThat(report.getFailures(), is(0L)); + } +} diff --git a/plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/data/UnitTestIndexTest.java b/plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/data/UnitTestIndexTest.java new file mode 100644 index 00000000000..0e85ac1d149 --- /dev/null +++ b/plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/data/UnitTestIndexTest.java @@ -0,0 +1,115 @@ +/* + * Sonar, open source software quality management tool. + * Copyright (C) 2008-2011 SonarSource + * mailto:contact AT sonarsource DOT com + * + * Sonar is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * Sonar is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Sonar; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 + */ +package org.sonar.plugins.surefire.data; + +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertSame; + +public class UnitTestIndexTest { + + @Test + public void shouldIndexNewClassname() { + UnitTestIndex index = new UnitTestIndex(); + + UnitTestClassReport report = index.index("org.sonar.Foo"); + + assertThat(report.getTests(), is(0L)); + assertThat(index.size(), is(1)); + assertSame(index.get("org.sonar.Foo"), report); + } + + @Test + public void shouldNotReIndex() { + UnitTestIndex index = new UnitTestIndex(); + + UnitTestClassReport report1 = index.index("org.sonar.Foo"); + UnitTestClassReport report2 = index.index("org.sonar.Foo"); + + assertSame(report1, report2); + assertThat(report1.getTests(), is(0L)); + assertThat(index.size(), is(1)); + assertSame(index.get("org.sonar.Foo"), report1); + } + + @Test + public void shouldRemoveClassname() { + UnitTestIndex index = new UnitTestIndex(); + + index.index("org.sonar.Foo"); + index.remove("org.sonar.Foo"); + + assertThat(index.size(), is(0)); + assertThat(index.get("org.sonar.Foo"), nullValue()); + } + + @Test + public void shouldMergeClasses() { + UnitTestIndex index = new UnitTestIndex(); + UnitTestClassReport innerClass = index.index("org.sonar.Foo$Bar"); + innerClass.add(new UnitTestResult().setStatus(UnitTestResult.STATUS_ERROR).setDurationMilliseconds(500L)); + innerClass.add(new UnitTestResult().setStatus(UnitTestResult.STATUS_OK).setDurationMilliseconds(200L)); + UnitTestClassReport publicClass = index.index("org.sonar.Foo"); + publicClass.add(new UnitTestResult().setStatus(UnitTestResult.STATUS_ERROR).setDurationMilliseconds(1000L)); + publicClass.add(new UnitTestResult().setStatus(UnitTestResult.STATUS_FAILURE).setDurationMilliseconds(350L)); + + index.merge("org.sonar.Foo$Bar", "org.sonar.Foo"); + + assertThat(index.size(), is(1)); + UnitTestClassReport report = index.get("org.sonar.Foo"); + assertThat(report.getTests(), is(4L)); + assertThat(report.getFailures(), is(1L)); + assertThat(report.getErrors(), is(2L)); + assertThat(report.getSkipped(), is(0L)); + assertThat(report.getResults().size(), is(4)); + assertThat(report.getDurationMilliseconds(), is(500L + 200L + 1000L + 350L)); + } + + @Test + public void shouldRenameClassWhenMergingToNewClass() { + UnitTestIndex index = new UnitTestIndex(); + UnitTestClassReport innerClass = index.index("org.sonar.Foo$Bar"); + innerClass.add(new UnitTestResult().setStatus(UnitTestResult.STATUS_ERROR).setDurationMilliseconds(500L)); + innerClass.add(new UnitTestResult().setStatus(UnitTestResult.STATUS_OK).setDurationMilliseconds(200L)); + + index.merge("org.sonar.Foo$Bar", "org.sonar.Foo"); + + assertThat(index.size(), is(1)); + UnitTestClassReport report = index.get("org.sonar.Foo"); + assertThat(report.getTests(), is(2L)); + assertThat(report.getFailures(), is(0L)); + assertThat(report.getErrors(), is(1L)); + assertThat(report.getSkipped(), is(0L)); + assertThat(report.getResults().size(), is(2)); + assertThat(report.getDurationMilliseconds(), is(500L + 200L)); + } + + @Test + public void shouldNotFailWhenMergingUnknownClass() { + UnitTestIndex index = new UnitTestIndex(); + + index.merge("org.sonar.Foo$Bar", "org.sonar.Foo"); + + assertThat(index.size(), is(0)); + } +} diff --git a/plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/data/UnitTestResultTest.java b/plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/data/UnitTestResultTest.java new file mode 100644 index 00000000000..3095d70df36 --- /dev/null +++ b/plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/data/UnitTestResultTest.java @@ -0,0 +1,72 @@ +/* + * Sonar, open source software quality management tool. + * Copyright (C) 2008-2011 SonarSource + * mailto:contact AT sonarsource DOT com + * + * Sonar is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * Sonar is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Sonar; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 + */ +package org.sonar.plugins.surefire.data; + +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +public class UnitTestResultTest { + + @Test + public void shouldBeError() { + UnitTestResult result = new UnitTestResult().setStatus(UnitTestResult.STATUS_ERROR); + assertThat(result.getStatus(), is(UnitTestResult.STATUS_ERROR)); + assertThat(result.isError(), is(true)); + assertThat(result.isErrorOrFailure(), is(true)); + } + + @Test + public void shouldBeFailure() { + UnitTestResult result = new UnitTestResult().setStatus(UnitTestResult.STATUS_FAILURE); + assertThat(result.getStatus(), is(UnitTestResult.STATUS_FAILURE)); + assertThat(result.isError(), is(false)); + assertThat(result.isErrorOrFailure(), is(true)); + } + + @Test + public void shouldBeSuccess() { + UnitTestResult result = new UnitTestResult().setStatus(UnitTestResult.STATUS_OK); + assertThat(result.getStatus(), is(UnitTestResult.STATUS_OK)); + assertThat(result.isError(), is(false)); + assertThat(result.isErrorOrFailure(), is(false)); + } + + @Test + public void shouldExportSuccessToXml() { + UnitTestResult result = new UnitTestResult().setStatus(UnitTestResult.STATUS_OK); + result.setDurationMilliseconds(520L); + result.setName("testOne"); + + assertThat(result.toXml(), is("")); + } + + @Test + public void shouldExportErrorToXml() { + UnitTestResult result = new UnitTestResult().setStatus(UnitTestResult.STATUS_ERROR); + result.setDurationMilliseconds(580L); + result.setName("testOne"); + result.setStackTrace("java.lang.RuntimeException"); + result.setMessage("expected xxx"); + + assertThat(result.toXml(), is("")); + } +} diff --git a/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/SurefireSensorTest/no-files/hack b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/SurefireSensorTest/no-files/hack deleted file mode 100644 index cbaa7ba71ed..00000000000 --- a/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/SurefireSensorTest/no-files/hack +++ /dev/null @@ -1 +0,0 @@ -hack to find the directory from the CLASSPATH. See the unit test. \ No newline at end of file diff --git a/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/groovyAndJavaTests/TEST-groovy.xml b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/groovyAndJavaTests/TEST-groovy.xml new file mode 100644 index 00000000000..42a888e131a --- /dev/null +++ b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/groovyAndJavaTests/TEST-groovy.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/groovyAndJavaTests/TEST-java.xml b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/groovyAndJavaTests/TEST-java.xml new file mode 100644 index 00000000000..2d6bb0c72a3 --- /dev/null +++ b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/groovyAndJavaTests/TEST-java.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/innerClasses/TEST-org.apache.commons.collections.TestAllPackages.xml b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/innerClasses/TEST-org.apache.commons.collections.TestAllPackages.xml new file mode 100644 index 00000000000..e3f5933ba48 --- /dev/null +++ b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/innerClasses/TEST-org.apache.commons.collections.TestAllPackages.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + java.io.InvalidClassException: + org.apache.commons.collections.FastArrayList; + local class incompatible: stream classdesc serialVersionUID = 1566341225434603896, local class serialVersionUID = + 7918928878747177577 + at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:562) + at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1583) + at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496) + at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732) + at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) + at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) + at org.apache.commons.collections.AbstractTestObject.readExternalFormFromStream(AbstractTestObject.java:326) + at org.apache.commons.collections.AbstractTestObject.readExternalFormFromDisk(AbstractTestObject.java:301) + at org.apache.commons.collections.list.AbstractTestList.testEmptyListCompatibility(AbstractTestList.java:1077) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) + at java.lang.reflect.Method.invoke(Method.java:597) + at junit.framework.TestCase.runTest(TestCase.java:154) + at junit.framework.TestCase.runBare(TestCase.java:127) + at junit.framework.TestResult$1.protect(TestResult.java:106) + at junit.framework.TestResult.runProtected(TestResult.java:124) + at junit.framework.TestResult.run(TestResult.java:109) + at junit.framework.TestCase.run(TestCase.java:118) + at junit.framework.TestSuite.runTest(TestSuite.java:208) + at junit.framework.TestSuite.run(TestSuite.java:203) + at junit.framework.TestSuite.runTest(TestSuite.java:208) + at junit.framework.TestSuite.run(TestSuite.java:203) + at junit.framework.TestSuite.runTest(TestSuite.java:208) + at junit.framework.TestSuite.run(TestSuite.java:203) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) + at java.lang.reflect.Method.invoke(Method.java:597) + at org.apache.maven.surefire.junit.JUnitTestSet.execute(JUnitTestSet.java:213) + at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140) + at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127) + at org.apache.maven.surefire.Surefire.run(Surefire.java:177) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) + at java.lang.reflect.Method.invoke(Method.java:597) + at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:345) + at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1009) + + + \ No newline at end of file diff --git a/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.SonarMojoTest.xml b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.SonarMojoTest.xml new file mode 100644 index 00000000000..c11af664afb --- /dev/null +++ b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.SonarMojoTest.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.mc.CheckstyleCollectorTest.xml b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.mc.CheckstyleCollectorTest.xml new file mode 100644 index 00000000000..71e443db9e4 --- /dev/null +++ b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.mc.CheckstyleCollectorTest.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.mc.CloverCollectorTest.xml b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.mc.CloverCollectorTest.xml new file mode 100644 index 00000000000..f803b695a45 --- /dev/null +++ b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.mc.CloverCollectorTest.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.mc.JDependsCollectorTest.xml b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.mc.JDependsCollectorTest.xml new file mode 100644 index 00000000000..0fc45fcaaf6 --- /dev/null +++ b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.mc.JDependsCollectorTest.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.mc.JavaNCSSCollectorTest.xml b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.mc.JavaNCSSCollectorTest.xml new file mode 100644 index 00000000000..693f3fa3bf8 --- /dev/null +++ b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.mc.JavaNCSSCollectorTest.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.mc.MetricsCollectorRegistryTest.xml b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.mc.MetricsCollectorRegistryTest.xml new file mode 100644 index 00000000000..dc3b31ac1da --- /dev/null +++ b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.mc.MetricsCollectorRegistryTest.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/noReports/hack b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/noReports/hack new file mode 100644 index 00000000000..e69de29bb2d diff --git a/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/SurefireSensorTest/doNotInsertZeroTestsOnClasses/TEST-noTests.xml b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/noTests/TEST-noTests.xml similarity index 100% rename from plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/SurefireSensorTest/doNotInsertZeroTestsOnClasses/TEST-noTests.xml rename to plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/noTests/TEST-noTests.xml diff --git a/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/errorsAndFailures.xml b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/errorsAndFailures.xml new file mode 100644 index 00000000000..950b8474621 --- /dev/null +++ b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/errorsAndFailures.xml @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + java.lang.AssertionError: + expected:<2> but was:<1> + at org.junit.Assert.fail(Assert.java:74) + at org.junit.Assert.failNotEquals(Assert.java:448) + at org.junit.Assert.assertEquals(Assert.java:102) + at org.junit.Assert.assertEquals(Assert.java:323) + at org.junit.Assert.assertEquals(Assert.java:319) + at org.sonar.core.ExtensionsFinderTest.shouldFindJdbcDrivers(ExtensionsFinderTest.java:45) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) + at java.lang.reflect.Method.invoke(Method.java:585) + at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:59) + at org.junit.internal.runners.MethodRoadie.runTestMethod(MethodRoadie.java:98) + at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:79) + at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:87) + at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:77) + at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:42) + at org.junit.internal.runners.JUnit4ClassRunner.invokeTestMethod(JUnit4ClassRunner.java:88) + at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51) + at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44) + at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27) + at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37) + at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42) + at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:62) + at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140) + at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127) + at org.apache.maven.surefire.Surefire.run(Surefire.java:177) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) + at java.lang.reflect.Method.invoke(Method.java:585) + at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:338) + at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:997) + + + + java.lang.RuntimeException: TEST + at org.sonar.core.ExtensionsFinderTest.shouldFindPlugins(ExtensionsFinderTest.java:57) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) + at java.lang.reflect.Method.invoke(Method.java:585) + at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:59) + at org.junit.internal.runners.MethodRoadie.runTestMethod(MethodRoadie.java:98) + at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:79) + at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:87) + at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:77) + at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:42) + at org.junit.internal.runners.JUnit4ClassRunner.invokeTestMethod(JUnit4ClassRunner.java:88) + at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51) + at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44) + at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27) + at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37) + at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42) + at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:62) + at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140) + at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127) + at org.apache.maven.surefire.Surefire.run(Surefire.java:177) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) + at java.lang.reflect.Method.invoke(Method.java:585) + at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:338) + at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:997) + + + \ No newline at end of file diff --git a/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/innerClasses.xml b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/innerClasses.xml new file mode 100644 index 00000000000..e3f5933ba48 --- /dev/null +++ b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/innerClasses.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + java.io.InvalidClassException: + org.apache.commons.collections.FastArrayList; + local class incompatible: stream classdesc serialVersionUID = 1566341225434603896, local class serialVersionUID = + 7918928878747177577 + at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:562) + at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1583) + at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496) + at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732) + at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) + at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) + at org.apache.commons.collections.AbstractTestObject.readExternalFormFromStream(AbstractTestObject.java:326) + at org.apache.commons.collections.AbstractTestObject.readExternalFormFromDisk(AbstractTestObject.java:301) + at org.apache.commons.collections.list.AbstractTestList.testEmptyListCompatibility(AbstractTestList.java:1077) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) + at java.lang.reflect.Method.invoke(Method.java:597) + at junit.framework.TestCase.runTest(TestCase.java:154) + at junit.framework.TestCase.runBare(TestCase.java:127) + at junit.framework.TestResult$1.protect(TestResult.java:106) + at junit.framework.TestResult.runProtected(TestResult.java:124) + at junit.framework.TestResult.run(TestResult.java:109) + at junit.framework.TestCase.run(TestCase.java:118) + at junit.framework.TestSuite.runTest(TestSuite.java:208) + at junit.framework.TestSuite.run(TestSuite.java:203) + at junit.framework.TestSuite.runTest(TestSuite.java:208) + at junit.framework.TestSuite.run(TestSuite.java:203) + at junit.framework.TestSuite.runTest(TestSuite.java:208) + at junit.framework.TestSuite.run(TestSuite.java:203) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) + at java.lang.reflect.Method.invoke(Method.java:597) + at org.apache.maven.surefire.junit.JUnitTestSet.execute(JUnitTestSet.java:213) + at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140) + at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127) + at org.apache.maven.surefire.Surefire.run(Surefire.java:177) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) + at java.lang.reflect.Method.invoke(Method.java:597) + at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:345) + at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1009) + + + \ No newline at end of file diff --git a/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/multipleSuites.xml b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/multipleSuites.xml new file mode 100644 index 00000000000..e5bd8c0cdf2 --- /dev/null +++ b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/multipleSuites.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/rootPackage.xml b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/rootPackage.xml new file mode 100644 index 00000000000..d3bb90a58f8 --- /dev/null +++ b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/rootPackage.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/skippedTests.xml b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/skippedTests.xml new file mode 100644 index 00000000000..7268a352cdc --- /dev/null +++ b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/skippedTests.xml @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + java.lang.AssertionError: + expected:<2> but was:<1> + at org.junit.Assert.fail(Assert.java:74) + at org.junit.Assert.failNotEquals(Assert.java:448) + at org.junit.Assert.assertEquals(Assert.java:102) + at org.junit.Assert.assertEquals(Assert.java:323) + at org.junit.Assert.assertEquals(Assert.java:319) + at org.sonar.core.ExtensionsFinderTest.shouldFindJdbcDrivers(ExtensionsFinderTest.java:45) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) + at java.lang.reflect.Method.invoke(Method.java:585) + at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:59) + at org.junit.internal.runners.MethodRoadie.runTestMethod(MethodRoadie.java:98) + at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:79) + at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:87) + at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:77) + at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:42) + at org.junit.internal.runners.JUnit4ClassRunner.invokeTestMethod(JUnit4ClassRunner.java:88) + at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51) + at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44) + at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27) + at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37) + at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42) + at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:62) + at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140) + at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127) + at org.apache.maven.surefire.Surefire.run(Surefire.java:177) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) + at java.lang.reflect.Method.invoke(Method.java:585) + at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:338) + at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:997) + + + + + + + \ No newline at end of file diff --git a/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/suiteInnerClass.xml b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/suiteInnerClass.xml new file mode 100644 index 00000000000..9984c04df8d --- /dev/null +++ b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/suiteInnerClass.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/zeroTests.xml b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/zeroTests.xml new file mode 100644 index 00000000000..fb55bf567aa --- /dev/null +++ b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/zeroTests.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file -- 2.39.5