]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-2332 Filter unit tests files listed in surefire reports
authorsimonbrandhof <simon.brandhof@gmail.com>
Wed, 6 Apr 2011 14:25:45 +0000 (16:25 +0200)
committersimonbrandhof <simon.brandhof@gmail.com>
Wed, 6 Apr 2011 14:26:29 +0000 (16:26 +0200)
37 files changed:
plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/SurefirePlugin.java
plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/SurefireSensor.java
plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/TestCaseDetails.java [deleted file]
plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/TestSuiteParser.java [deleted file]
plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/TestSuiteReport.java [deleted file]
plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/api/AbstractSurefireParser.java
plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/data/SurefireStaxHandler.java [new file with mode: 0644]
plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/data/UnitTestClassReport.java [new file with mode: 0644]
plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/data/UnitTestIndex.java [new file with mode: 0644]
plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/data/UnitTestResult.java [new file with mode: 0644]
plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/SurefirePluginTest.java
plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/SurefireSensorTest.java
plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/api/AbstractSurefireParserTest.java [new file with mode: 0644]
plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest.java [new file with mode: 0644]
plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/data/UnitTestClassReportTest.java [new file with mode: 0644]
plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/data/UnitTestIndexTest.java [new file with mode: 0644]
plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/data/UnitTestResultTest.java [new file with mode: 0644]
plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/SurefireSensorTest/doNotInsertZeroTestsOnClasses/TEST-noTests.xml [deleted file]
plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/SurefireSensorTest/no-files/hack [deleted file]
plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/groovyAndJavaTests/TEST-groovy.xml [new file with mode: 0644]
plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/groovyAndJavaTests/TEST-java.xml [new file with mode: 0644]
plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/innerClasses/TEST-org.apache.commons.collections.TestAllPackages.xml [new file with mode: 0644]
plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.SonarMojoTest.xml [new file with mode: 0644]
plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.mc.CheckstyleCollectorTest.xml [new file with mode: 0644]
plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.mc.CloverCollectorTest.xml [new file with mode: 0644]
plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.mc.JDependsCollectorTest.xml [new file with mode: 0644]
plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.mc.JavaNCSSCollectorTest.xml [new file with mode: 0644]
plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/multipleReports/TEST-ch.hortis.sonar.mvn.mc.MetricsCollectorRegistryTest.xml [new file with mode: 0644]
plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/noReports/hack [new file with mode: 0644]
plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/noTests/TEST-noTests.xml [new file with mode: 0644]
plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/errorsAndFailures.xml [new file with mode: 0644]
plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/innerClasses.xml [new file with mode: 0644]
plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/multipleSuites.xml [new file with mode: 0644]
plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/rootPackage.xml [new file with mode: 0644]
plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/skippedTests.xml [new file with mode: 0644]
plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/suiteInnerClass.xml [new file with mode: 0644]
plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/data/SurefireStaxHandlerTest/zeroTests.xml [new file with mode: 0644]

index 6a637fcc1e1385a1ea63d0bbc5da43a780cc659f..8d217b135a3e43f3c2f675424d0d3feadeb8b870 100644 (file)
@@ -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<Class<? extends Extension>> getExtensions() {
-    List<Class<? extends Extension>> extensions = new ArrayList<Class<? extends Extension>>();
-    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);
   }
 
 }
index 668af1b8f954c8179033f18c9918ed7dfac8aa2a..4a2f9033bf876118334983874cb132c28250079f 100644 (file)
@@ -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 (file)
index 5209bcb..0000000
+++ /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/TestSuiteParser.java b/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/TestSuiteParser.java
deleted file mode 100644 (file)
index d701a74..0000000
+++ /dev/null
@@ -1,149 +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.text.ParseException;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-
-import javax.xml.stream.XMLStreamException;
-
-import org.apache.commons.lang.StringUtils;
-import org.codehaus.staxmate.in.ElementFilter;
-import org.codehaus.staxmate.in.SMEvent;
-import org.codehaus.staxmate.in.SMHierarchicCursor;
-import org.codehaus.staxmate.in.SMInputCursor;
-import org.sonar.api.utils.ParsingUtils;
-import org.sonar.api.utils.StaxParser.XmlStreamHandler;
-
-public class TestSuiteParser implements XmlStreamHandler {
-
-  private Map<String, TestSuiteReport> reportsPerClass = new HashMap<String, TestSuiteReport>();
-
-  public void stream(SMHierarchicCursor rootCursor) throws XMLStreamException {
-    SMInputCursor testSuite = rootCursor.constructDescendantCursor(new ElementFilter("testsuite"));
-    SMEvent testSuiteEvent;
-    while ((testSuiteEvent = testSuite.getNext()) != null) {
-      if (testSuiteEvent.compareTo(SMEvent.START_ELEMENT) == 0) {
-        String testSuiteClassName = testSuite.getAttrValue("name");
-        if (StringUtils.contains(testSuiteClassName, "$")) {
-          // test suites for inner classes are ignored
-          return;
-        }
-        SMInputCursor testCase = testSuite.childCursor(new ElementFilter("testcase"));
-        SMEvent event;
-        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);
-          }
-        }
-      }
-    }
-  }
-
-  public Collection<TestSuiteReport> 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;
-  }
-
-  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 setStackAndMessage(TestCaseDetails detail, SMInputCursor stackAndMessageCursor) throws XMLStreamException {
-    detail.setErrorMessage(stackAndMessageCursor.getAttrValue("message"));
-    String stack = stackAndMessageCursor.collectDescendantText();
-    detail.setStackTrace(stack);
-  }
-
-  private TestCaseDetails getTestCaseDetails(SMInputCursor testCaseCursor) throws XMLStreamException {
-    TestCaseDetails detail = new TestCaseDetails();
-    String name = getTestCaseName(testCaseCursor);
-    detail.setName(name);
-
-    String status = TestCaseDetails.STATUS_OK;
-    Double time = getTimeAttributeInMS(testCaseCursor);
-
-    SMInputCursor childNode = testCaseCursor.descendantElementCursor();
-    if (childNode.getNext() != null) {
-      String elementName = childNode.getLocalName();
-      if (elementName.equals("skipped")) {
-        status = TestCaseDetails.STATUS_SKIPPED;
-        // bug with surefire reporting wrong time for skipped tests
-        time = 0d;
-      } else if (elementName.equals("failure")) {
-        status = TestCaseDetails.STATUS_FAILURE;
-        setStackAndMessage(detail, childNode);
-      } else if (elementName.equals("error")) {
-        status = TestCaseDetails.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.setStatus(status);
-    return detail;
-  }
-
-  private Double 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;
-    } catch (ParseException e) {
-      throw new XMLStreamException(e);
-    }
-  }
-
-  private String getTestCaseName(SMInputCursor testCaseCursor) throws XMLStreamException {
-    String classname = testCaseCursor.getAttrValue("classname");
-    String name = testCaseCursor.getAttrValue("name");
-    if (StringUtils.contains(classname, "$")) {
-      return StringUtils.substringAfterLast(classname, "$") + "/" + name;
-    }
-    return name;
-  }
-
-}
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 (file)
index b5bd9ab..0000000
+++ /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<TestCaseDetails> details;
-  
-
-  public TestSuiteReport(String classKey) {
-    super();
-    this.classKey = classKey;
-    this.details = new ArrayList<TestCaseDetails>();
-  }
-
-  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<TestCaseDetails> getDetails() {
-    return details;
-  }
-
-  public void setDetails(List<TestCaseDetails> 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();
-  }
-}
index 215ed9c8f2371b764c1baf1ef283f212c737e5c1..b13e667ebe0f28db90b0a2271c71652731906a99 100644 (file)
@@ -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<TestSuiteReport> analyzedReports = new HashSet<TestSuiteReport>();
-    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("<tests-details>");
-    List<TestCaseDetails> details = fileReport.getDetails();
-    for (TestCaseDetails detail : details) {
-      testCaseDetails.append("<testcase status=\"").append(detail.getStatus())
-          .append("\" time=\"").append(detail.getTimeMS())
-          .append("\" name=\"").append(detail.getName()).append("\"");
-      boolean isError = detail.getStatus().equals(TestCaseDetails.STATUS_ERROR);
-      if (isError || detail.getStatus().equals(TestCaseDetails.STATUS_FAILURE)) {
-        testCaseDetails.append(">")
-            .append(isError ? "<error message=\"" : "<failure message=\"")
-            .append(StringEscapeUtils.escapeXml(detail.getErrorMessage())).append("\">")
-            .append("<![CDATA[").append(StringEscapeUtils.escapeXml(detail.getStackTrace())).append("]]>")
-            .append(isError ? "</error>" : "</failure>").append("</testcase>");
-      } else {
-        testCaseDetails.append("/>");
+  private void save(UnitTestIndex index, SensorContext context) {
+    for (Map.Entry<String, UnitTestClassReport> 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("</tests-details>");
-    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/data/SurefireStaxHandler.java b/plugins/sonar-surefire-plugin/src/main/java/org/sonar/plugins/surefire/data/SurefireStaxHandler.java
new file mode 100644 (file)
index 0000000..b9a0b3b
--- /dev/null
@@ -0,0 +1,133 @@
+/*
+ * 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 java.text.ParseException;
+import java.util.Locale;
+
+import javax.xml.stream.XMLStreamException;
+
+import org.apache.commons.lang.StringUtils;
+import org.codehaus.staxmate.in.ElementFilter;
+import org.codehaus.staxmate.in.SMEvent;
+import org.codehaus.staxmate.in.SMHierarchicCursor;
+import org.codehaus.staxmate.in.SMInputCursor;
+import org.sonar.api.utils.ParsingUtils;
+import org.sonar.api.utils.StaxParser.XmlStreamHandler;
+
+public class SurefireStaxHandler implements XmlStreamHandler {
+
+  private UnitTestIndex index;
+
+  public SurefireStaxHandler(UnitTestIndex index) {
+    this.index = index;
+  }
+
+  public void stream(SMHierarchicCursor rootCursor) throws XMLStreamException {
+    SMInputCursor testSuite = rootCursor.constructDescendantCursor(new ElementFilter("testsuite"));
+    SMEvent testSuiteEvent;
+    while ((testSuiteEvent = testSuite.getNext()) != null) {
+      if (testSuiteEvent.compareTo(SMEvent.START_ELEMENT) == 0) {
+        String testSuiteClassName = testSuite.getAttrValue("name");
+        if (StringUtils.contains(testSuiteClassName, "$")) {
+          // test suites for inner classes are ignored
+          return;
+        }
+        SMInputCursor testCase = testSuite.childCursor(new ElementFilter("testcase"));
+        SMEvent event;
+        while ((event = testCase.getNext()) != null) {
+          if (event.compareTo(SMEvent.START_ELEMENT) == 0) {
+            String testClassName = getClassname(testCase, testSuiteClassName);
+            UnitTestClassReport classReport = index.index(testClassName);
+            parseTestCase(testCase, classReport);
+          }
+        }
+      }
+    }
+  }
+
+  private String getClassname(SMInputCursor testCaseCursor, String defaultClassname) throws XMLStreamException {
+    String testClassName = testCaseCursor.getAttrValue("classname");
+    return StringUtils.defaultIfBlank(testClassName, defaultClassname);
+  }
+
+  private void parseTestCase(SMInputCursor testCaseCursor, UnitTestClassReport report) throws XMLStreamException {
+    report.add(parseTestResult(testCaseCursor));
+  }
+
+  private void setStackAndMessage(UnitTestResult result, SMInputCursor stackAndMessageCursor) throws XMLStreamException {
+    result.setMessage(stackAndMessageCursor.getAttrValue("message"));
+    String stack = stackAndMessageCursor.collectDescendantText();
+    result.setStackTrace(stack);
+  }
+
+  private UnitTestResult parseTestResult(SMInputCursor testCaseCursor) throws XMLStreamException {
+    UnitTestResult detail = new UnitTestResult();
+    String name = getTestCaseName(testCaseCursor);
+    detail.setName(name);
+
+    String status = UnitTestResult.STATUS_OK;
+    long duration = getTimeAttributeInMS(testCaseCursor);
+
+    SMInputCursor childNode = testCaseCursor.descendantElementCursor();
+    if (childNode.getNext() != null) {
+      String elementName = childNode.getLocalName();
+      if ("skipped".equals(elementName)) {
+        status = UnitTestResult.STATUS_SKIPPED;
+        // bug with surefire reporting wrong time for skipped tests
+        duration = 0L;
+
+      } else if ("failure".equals(elementName)) {
+        status = UnitTestResult.STATUS_FAILURE;
+        setStackAndMessage(detail, childNode);
+
+      } 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.setDurationMilliseconds(duration);
+    detail.setStatus(status);
+    return detail;
+  }
+
+  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) ? new Double(ParsingUtils.scaleValue(time * 1000, 3)).longValue() : 0L;
+    } catch (ParseException e) {
+      throw new XMLStreamException(e);
+    }
+  }
+
+  private String getTestCaseName(SMInputCursor testCaseCursor) throws XMLStreamException {
+    String classname = testCaseCursor.getAttrValue("classname");
+    String name = testCaseCursor.getAttrValue("name");
+    if (StringUtils.contains(classname, "$")) {
+      return StringUtils.substringAfterLast(classname, "$") + "/" + name;
+    }
+    return name;
+  }
+
+}
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 (file)
index 0000000..de6ac1a
--- /dev/null
@@ -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<UnitTestResult> 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<UnitTestResult> getResults() {
+    if (results==null) {
+      return Collections.emptyList();
+    }
+    return results;
+  }
+
+  public String toXml() {
+    StringBuilder sb = new StringBuilder(256);
+    sb.append("<tests-details>");
+    for (UnitTestResult result : results) {
+      result.appendXml(sb);
+    }
+    sb.append("</tests-details>");
+    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 (file)
index 0000000..350518b
--- /dev/null
@@ -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<String, UnitTestClassReport> 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<String> getClassnames() {
+    return Sets.newHashSet(indexByClassname.keySet());
+  }
+
+  public Map<String, UnitTestClassReport> 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 (file)
index 0000000..eba0f99
--- /dev/null
@@ -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("<testcase status=\"")
+        .append(status)
+        .append("\" time=\"")
+        .append(durationMilliseconds)
+        .append("\" name=\"")
+        .append(StringEscapeUtils.escapeXml(name))
+        .append("\"");
+
+    if (isErrorOrFailure()) {
+      sb
+          .append(">")
+          .append(isError() ? "<error message=\"" : "<failure message=\"")
+          .append(StringEscapeUtils.escapeXml(message))
+          .append("\">")
+          .append("<![CDATA[")
+          .append(StringEscapeUtils.escapeXml(stackTrace))
+          .append("]]>")
+          .append(isError() ? "</error>" : "</failure>")
+          .append("</testcase>");
+    } else {
+      sb.append("/>");
+    }
+    return sb;
+  }
+
+}
index a3d19a328c10a9f08836d3f540b45dd763d55a34..e027702aca443f54b2e59bf69fdfd364809ed5c4 100644 (file)
  */
 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));
   }
-
 }
index 37accaa32efd080f0046cc9befd4afe0f341def0..15b007f9018679ac3a5932499f1885617dbc4c7a 100644 (file)
@@ -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 (file)
index 0000000..84fef26
--- /dev/null
@@ -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<Resource>(){
+      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<Resource>(){
+      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 (file)
index 0000000..567e75a
--- /dev/null
@@ -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 (file)
index 0000000..700e854
--- /dev/null
@@ -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("<tests-details><testcase status=\"error\" time=\"500\" name=\"null\"><error message=\"null\"><![CDATA[null]]></error></testcase><testcase status=\"ok\" time=\"200\" name=\"null\"/></tests-details>"));
+  }
+
+  @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 (file)
index 0000000..0e85ac1
--- /dev/null
@@ -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 (file)
index 0000000..3095d70
--- /dev/null
@@ -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("<testcase status=\"ok\" time=\"520\" name=\"testOne\"/>"));
+  }
+
+  @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("<testcase status=\"error\" time=\"580\" name=\"testOne\"><error message=\"expected xxx\"><![CDATA[java.lang.RuntimeException]]></error></testcase>"));
+  }
+}
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/SurefireSensorTest/doNotInsertZeroTestsOnClasses/TEST-noTests.xml
deleted file mode 100644 (file)
index fb55bf5..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<testsuite errors="0" skipped="0" tests="0" time="1,134.193" failures="0"
-           name="ch.hortis.sonar.mvn.mc.CheckstyleCollectorTest">
-  <properties>
-    <property value="Java(TM) 2 Runtime Environment, Standard Edition" name="java.runtime.name"/>
-    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Libraries"
-              name="sun.boot.library.path"/>
-    <property value="1.5.0_06-64" name="java.vm.version"/>
-    <property value="true" name="awt.nativeDoubleBuffering"/>
-    <property value="false" name="gopherProxySet"/>
-    <property value="&quot;Apple Computer, Inc.&quot;" name="java.vm.vendor"/>
-    <property value="http://apple.com/" name="java.vendor.url"/>
-    <property value=":" name="path.separator"/>
-    <property value="Java HotSpot(TM) Client VM" name="java.vm.name"/>
-    <property value="sun.io" name="file.encoding.pkg"/>
-    <property value="FR" name="user.country"/>
-    <property value="unknown" name="sun.os.patch.level"/>
-    <property value="Java Virtual Machine Specification" name="java.vm.specification.name"/>
-    <property value="/Users/cmunger/Documents/workspace/sonar/sonar-maven-plugin" name="user.dir"/>
-    <property value="1.5.0_06-112" name="java.runtime.version"/>
-    <property value="apple.awt.CGraphicsEnvironment" name="java.awt.graphicsenv"/>
-    <property value="/Users/cmunger/Documents/workspace/sonar/sonar-maven-plugin" name="basedir"/>
-    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/endorsed"
-              name="java.endorsed.dirs"/>
-    <property value="ppc" name="os.arch"/>
-    <property value="/tmp" name="java.io.tmpdir"/>
-    <property value="
-" name="line.separator"/>
-    <property value="Sun Microsystems Inc." name="java.vm.specification.vendor"/>
-    <property value="Mac OS X" name="os.name"/>
-    <property value="MacRoman" name="sun.jnu.encoding"/>
-    <property value=".:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java"
-              name="java.library.path"/>
-    <property value="Java Platform API Specification" name="java.specification.name"/>
-    <property value="49.0" name="java.class.version"/>
-    <property value="HotSpot Client Compiler" name="sun.management.compiler"/>
-    <property value="10.4.8" name="os.version"/>
-    <property value="/Users/cmunger" name="user.home"/>
-    <property value="" name="user.timezone"/>
-    <property value="apple.awt.CPrinterJob" name="java.awt.printerjob"/>
-    <property value="MacRoman" name="file.encoding"/>
-    <property value="1.5" name="java.specification.version"/>
-    <property value="cmunger" name="user.name"/>
-    <property
-        value="/Users/cmunger/.m2/repository/org/apache/maven/surefire/surefire-api/2.0/surefire-api-2.0.jar:/Users/cmunger/.m2/repository/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.jar:/Users/cmunger/.m2/repository/org/apache/maven/surefire/surefire-booter/2.0/surefire-booter-2.0.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/.compatibility/14compatibility.jar"
-        name="java.class.path"/>
-    <property value="1.0" name="java.vm.specification.version"/>
-    <property value="32" name="sun.arch.data.model"/>
-    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home" name="java.home"/>
-    <property value="Sun Microsystems Inc." name="java.specification.vendor"/>
-    <property value="fr" name="user.language"/>
-    <property value="apple.awt.CToolkit" name="awt.toolkit"/>
-    <property value="mixed mode, sharing" name="java.vm.info"/>
-    <property value="1.5.0_06" name="java.version"/>
-    <property
-        value="/Library/Java/Extensions:/System/Library/Java/Extensions:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/ext"
-        name="java.ext.dirs"/>
-    <property
-        value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/classes.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/ui.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/laf.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/sunrsasign.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jsse.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jce.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/charsets.jar"
-        name="sun.boot.class.path"/>
-    <property value="Apple Computer, Inc." name="java.vendor"/>
-    <property value="/Users/cmunger/.m2/repository" name="localRepository"/>
-    <property value="/" name="file.separator"/>
-    <property value="http://developer.apple.com/java/" name="java.vendor.url.bug"/>
-    <property value="big" name="sun.cpu.endian"/>
-    <property value="UnicodeBig" name="sun.io.unicode.encoding"/>
-    <property value="1040.1.5.0_06-112" name="mrj.version"/>
-    <property value="" name="sun.cpu.isalist"/>
-  </properties>
-</testsuite>
\ No newline at end of file
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 (file)
index cbaa7ba..0000000
+++ /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 (file)
index 0000000..42a888e
--- /dev/null
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<testsuite errors="0" skipped="0" tests="2" time="1,134.193" failures="0"
+           name="groovy.Foo">
+  <properties>
+    <property value="Java(TM) 2 Runtime Environment, Standard Edition" name="java.runtime.name"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Libraries"
+              name="sun.boot.library.path"/>
+    <property value="1.5.0_06-64" name="java.vm.version"/>
+    <property value="true" name="awt.nativeDoubleBuffering"/>
+    <property value="false" name="gopherProxySet"/>
+    <property value="&quot;Apple Computer, Inc.&quot;" name="java.vm.vendor"/>
+    <property value="http://apple.com/" name="java.vendor.url"/>
+    <property value=":" name="path.separator"/>
+    <property value="Java HotSpot(TM) Client VM" name="java.vm.name"/>
+    <property value="sun.io" name="file.encoding.pkg"/>
+    <property value="FR" name="user.country"/>
+    <property value="unknown" name="sun.os.patch.level"/>
+    <property value="Java Virtual Machine Specification" name="java.vm.specification.name"/>
+    <property value="/Users/cmunger/Documents/workspace/sonar/sonar-maven-plugin" name="user.dir"/>
+    <property value="1.5.0_06-112" name="java.runtime.version"/>
+    <property value="apple.awt.CGraphicsEnvironment" name="java.awt.graphicsenv"/>
+    <property value="/Users/cmunger/Documents/workspace/sonar/sonar-maven-plugin" name="basedir"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/endorsed"
+              name="java.endorsed.dirs"/>
+    <property value="ppc" name="os.arch"/>
+    <property value="/tmp" name="java.io.tmpdir"/>
+    <property value="
+" name="line.separator"/>
+    <property value="Sun Microsystems Inc." name="java.vm.specification.vendor"/>
+    <property value="Mac OS X" name="os.name"/>
+    <property value="MacRoman" name="sun.jnu.encoding"/>
+    <property value=".:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java"
+              name="java.library.path"/>
+    <property value="Java Platform API Specification" name="java.specification.name"/>
+    <property value="49.0" name="java.class.version"/>
+    <property value="HotSpot Client Compiler" name="sun.management.compiler"/>
+    <property value="10.4.8" name="os.version"/>
+    <property value="/Users/cmunger" name="user.home"/>
+    <property value="" name="user.timezone"/>
+    <property value="apple.awt.CPrinterJob" name="java.awt.printerjob"/>
+    <property value="MacRoman" name="file.encoding"/>
+    <property value="1.5" name="java.specification.version"/>
+    <property value="cmunger" name="user.name"/>
+    <property
+        value="/Users/cmunger/.m2/repository/org/apache/maven/surefire/surefire-api/2.0/surefire-api-2.0.jar:/Users/cmunger/.m2/repository/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.jar:/Users/cmunger/.m2/repository/org/apache/maven/surefire/surefire-booter/2.0/surefire-booter-2.0.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/.compatibility/14compatibility.jar"
+        name="java.class.path"/>
+    <property value="1.0" name="java.vm.specification.version"/>
+    <property value="32" name="sun.arch.data.model"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home" name="java.home"/>
+    <property value="Sun Microsystems Inc." name="java.specification.vendor"/>
+    <property value="fr" name="user.language"/>
+    <property value="apple.awt.CToolkit" name="awt.toolkit"/>
+    <property value="mixed mode, sharing" name="java.vm.info"/>
+    <property value="1.5.0_06" name="java.version"/>
+    <property
+        value="/Library/Java/Extensions:/System/Library/Java/Extensions:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/ext"
+        name="java.ext.dirs"/>
+    <property
+        value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/classes.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/ui.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/laf.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/sunrsasign.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jsse.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jce.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/charsets.jar"
+        name="sun.boot.class.path"/>
+    <property value="Apple Computer, Inc." name="java.vendor"/>
+    <property value="/Users/cmunger/.m2/repository" name="localRepository"/>
+    <property value="/" name="file.separator"/>
+    <property value="http://developer.apple.com/java/" name="java.vendor.url.bug"/>
+    <property value="big" name="sun.cpu.endian"/>
+    <property value="UnicodeBig" name="sun.io.unicode.encoding"/>
+    <property value="1040.1.5.0_06-112" name="mrj.version"/>
+    <property value="" name="sun.cpu.isalist"/>
+  </properties>
+  <testcase time="0.035" name="testGetUnKnownCollector"/>
+  <testcase time="0" name="testGetJDependsCollector"/>
+  <testcase time="0" name="testGetJavaNCSSCollector"/>
+  <testcase time="0" name="testGetCloverCollector"/>
+  <testcase time="0.644" name="testCollectWithoutPluginConfiguration"/>
+  <testcase time="0.015" name="testCollectWithPluginConfiguration"/>
+</testsuite>
\ 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 (file)
index 0000000..2d6bb0c
--- /dev/null
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<testsuite errors="0" skipped="0" tests="2" time="1,134.193" failures="0"
+           name="java.Foo">
+  <properties>
+    <property value="Java(TM) 2 Runtime Environment, Standard Edition" name="java.runtime.name"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Libraries"
+              name="sun.boot.library.path"/>
+    <property value="1.5.0_06-64" name="java.vm.version"/>
+    <property value="true" name="awt.nativeDoubleBuffering"/>
+    <property value="false" name="gopherProxySet"/>
+    <property value="&quot;Apple Computer, Inc.&quot;" name="java.vm.vendor"/>
+    <property value="http://apple.com/" name="java.vendor.url"/>
+    <property value=":" name="path.separator"/>
+    <property value="Java HotSpot(TM) Client VM" name="java.vm.name"/>
+    <property value="sun.io" name="file.encoding.pkg"/>
+    <property value="FR" name="user.country"/>
+    <property value="unknown" name="sun.os.patch.level"/>
+    <property value="Java Virtual Machine Specification" name="java.vm.specification.name"/>
+    <property value="/Users/cmunger/Documents/workspace/sonar/sonar-maven-plugin" name="user.dir"/>
+    <property value="1.5.0_06-112" name="java.runtime.version"/>
+    <property value="apple.awt.CGraphicsEnvironment" name="java.awt.graphicsenv"/>
+    <property value="/Users/cmunger/Documents/workspace/sonar/sonar-maven-plugin" name="basedir"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/endorsed"
+              name="java.endorsed.dirs"/>
+    <property value="ppc" name="os.arch"/>
+    <property value="/tmp" name="java.io.tmpdir"/>
+    <property value="
+" name="line.separator"/>
+    <property value="Sun Microsystems Inc." name="java.vm.specification.vendor"/>
+    <property value="Mac OS X" name="os.name"/>
+    <property value="MacRoman" name="sun.jnu.encoding"/>
+    <property value=".:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java"
+              name="java.library.path"/>
+    <property value="Java Platform API Specification" name="java.specification.name"/>
+    <property value="49.0" name="java.class.version"/>
+    <property value="HotSpot Client Compiler" name="sun.management.compiler"/>
+    <property value="10.4.8" name="os.version"/>
+    <property value="/Users/cmunger" name="user.home"/>
+    <property value="" name="user.timezone"/>
+    <property value="apple.awt.CPrinterJob" name="java.awt.printerjob"/>
+    <property value="MacRoman" name="file.encoding"/>
+    <property value="1.5" name="java.specification.version"/>
+    <property value="cmunger" name="user.name"/>
+    <property
+        value="/Users/cmunger/.m2/repository/org/apache/maven/surefire/surefire-api/2.0/surefire-api-2.0.jar:/Users/cmunger/.m2/repository/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.jar:/Users/cmunger/.m2/repository/org/apache/maven/surefire/surefire-booter/2.0/surefire-booter-2.0.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/.compatibility/14compatibility.jar"
+        name="java.class.path"/>
+    <property value="1.0" name="java.vm.specification.version"/>
+    <property value="32" name="sun.arch.data.model"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home" name="java.home"/>
+    <property value="Sun Microsystems Inc." name="java.specification.vendor"/>
+    <property value="fr" name="user.language"/>
+    <property value="apple.awt.CToolkit" name="awt.toolkit"/>
+    <property value="mixed mode, sharing" name="java.vm.info"/>
+    <property value="1.5.0_06" name="java.version"/>
+    <property
+        value="/Library/Java/Extensions:/System/Library/Java/Extensions:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/ext"
+        name="java.ext.dirs"/>
+    <property
+        value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/classes.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/ui.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/laf.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/sunrsasign.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jsse.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jce.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/charsets.jar"
+        name="sun.boot.class.path"/>
+    <property value="Apple Computer, Inc." name="java.vendor"/>
+    <property value="/Users/cmunger/.m2/repository" name="localRepository"/>
+    <property value="/" name="file.separator"/>
+    <property value="http://developer.apple.com/java/" name="java.vendor.url.bug"/>
+    <property value="big" name="sun.cpu.endian"/>
+    <property value="UnicodeBig" name="sun.io.unicode.encoding"/>
+    <property value="1040.1.5.0_06-112" name="mrj.version"/>
+    <property value="" name="sun.cpu.isalist"/>
+  </properties>
+  <testcase time="0.035" name="testGetUnKnownCollector"/>
+  <testcase time="0" name="testGetJDependsCollector"/>
+  <testcase time="0" name="testGetJavaNCSSCollector"/>
+  <testcase time="0" name="testGetCloverCollector"/>
+  <testcase time="0.644" name="testCollectWithoutPluginConfiguration"/>
+  <testcase time="0.015" name="testCollectWithPluginConfiguration"/>
+</testsuite>
\ 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 (file)
index 0000000..e3f5933
--- /dev/null
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<testsuite failures="0" time="157.199" errors="18" skipped="0" tests="13025"
+           name="org.apache.commons.collections.TestAllPackages">
+  <properties>
+    <property name="java.runtime.name" value="Java(TM) SE Runtime Environment"/>
+    <property name="sun.boot.library.path"
+              value="/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Libraries"/>
+    <property name="java.vm.version" value="11.3-b02-83"/>
+  </properties>
+  <testcase time="0.012" classname="org.apache.commons.collections.bidimap.AbstractTestBidiMap"
+            name="testMapEntrySetIteratorEntrySetValueCrossCheck"/>
+  <testcase time="0.001" classname="org.apache.commons.collections.bidimap.AbstractTestBidiMap"
+            name="testMapEntrySetIteratorEntry"/>
+  <testcase time="0.001" classname="org.apache.commons.collections.bidimap.AbstractTestBidiMap$TestBidiMapEntrySet"
+            name="testCanonicalEmptyCollectionExists"/>
+  <testcase time="0" classname="org.apache.commons.collections.bidimap.AbstractTestBidiMap$TestBidiMapEntrySet"
+            name="testCanonicalFullCollectionExists"/>
+  <testcase time="0.03" classname="org.apache.commons.collections.bidimap.AbstractTestBidiMap$TestInverseBidiMap"
+            name="testMapPut"/>
+  <testcase time="0" classname="org.apache.commons.collections.bidimap.AbstractTestBidiMap$TestInverseBidiMap"
+            name="testMapPutNullKey"/>
+  <testcase time="0.001" classname="org.apache.commons.collections.bidimap.AbstractTestBidiMap$TestInverseBidiMap"
+            name="testMapPutNullValue">
+    <error
+        message="org.apache.commons.collections.FastArrayList; local class incompatible: stream classdesc serialVersionUID = 1566341225434603896, local class serialVersionUID = 7918928878747177577"
+        type="java.io.InvalidClassException">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)
+    </error>
+  </testcase>
+</testsuite>
\ 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 (file)
index 0000000..c11af66
--- /dev/null
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<testsuite errors="0" skipped="0" tests="5" time="9.138" failures="0" name="ch.hortis.sonar.mvn.SonarMojoTest">
+  <properties>
+    <property value="Java(TM) 2 Runtime Environment, Standard Edition" name="java.runtime.name"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Libraries"
+              name="sun.boot.library.path"/>
+    <property value="1.5.0_06-64" name="java.vm.version"/>
+    <property value="true" name="awt.nativeDoubleBuffering"/>
+    <property value="false" name="gopherProxySet"/>
+    <property value="&quot;Apple Computer, Inc.&quot;" name="java.vm.vendor"/>
+    <property value="http://apple.com/" name="java.vendor.url"/>
+    <property value=":" name="path.separator"/>
+    <property value="Java HotSpot(TM) Client VM" name="java.vm.name"/>
+    <property value="sun.io" name="file.encoding.pkg"/>
+    <property value="FR" name="user.country"/>
+    <property value="unknown" name="sun.os.patch.level"/>
+    <property value="Java Virtual Machine Specification" name="java.vm.specification.name"/>
+    <property value="/Users/cmunger/Documents/workspace/sonar/sonar-maven-plugin" name="user.dir"/>
+    <property value="1.5.0_06-112" name="java.runtime.version"/>
+    <property value="apple.awt.CGraphicsEnvironment" name="java.awt.graphicsenv"/>
+    <property value="/Users/cmunger/Documents/workspace/sonar/sonar-maven-plugin" name="basedir"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/endorsed"
+              name="java.endorsed.dirs"/>
+    <property value="ppc" name="os.arch"/>
+    <property value="/tmp" name="java.io.tmpdir"/>
+    <property value="
+" name="line.separator"/>
+    <property value="Sun Microsystems Inc." name="java.vm.specification.vendor"/>
+    <property value="Mac OS X" name="os.name"/>
+    <property value="MacRoman" name="sun.jnu.encoding"/>
+    <property value=".:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java"
+              name="java.library.path"/>
+    <property value="Java Platform API Specification" name="java.specification.name"/>
+    <property value="49.0" name="java.class.version"/>
+    <property value="HotSpot Client Compiler" name="sun.management.compiler"/>
+    <property value="10.4.8" name="os.version"/>
+    <property value="/Users/cmunger" name="user.home"/>
+    <property value="Europe/Zurich" name="user.timezone"/>
+    <property value="apple.awt.CPrinterJob" name="java.awt.printerjob"/>
+    <property value="MacRoman" name="file.encoding"/>
+    <property value="1.5" name="java.specification.version"/>
+    <property value="cmunger" name="user.name"/>
+    <property
+        value="/Users/cmunger/.m2/repository/org/apache/maven/surefire/surefire-api/2.0/surefire-api-2.0.jar:/Users/cmunger/.m2/repository/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.jar:/Users/cmunger/.m2/repository/org/apache/maven/surefire/surefire-booter/2.0/surefire-booter-2.0.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/.compatibility/14compatibility.jar"
+        name="java.class.path"/>
+    <property value="1.0" name="java.vm.specification.version"/>
+    <property value="32" name="sun.arch.data.model"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home" name="java.home"/>
+    <property value="Sun Microsystems Inc." name="java.specification.vendor"/>
+    <property value="fr" name="user.language"/>
+    <property value="apple.awt.CToolkit" name="awt.toolkit"/>
+    <property value="mixed mode, sharing" name="java.vm.info"/>
+    <property value="1.5.0_06" name="java.version"/>
+    <property
+        value="/Library/Java/Extensions:/System/Library/Java/Extensions:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/ext"
+        name="java.ext.dirs"/>
+    <property
+        value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/classes.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/ui.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/laf.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/sunrsasign.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jsse.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jce.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/charsets.jar"
+        name="sun.boot.class.path"/>
+    <property value="Apple Computer, Inc." name="java.vendor"/>
+    <property value="/Users/cmunger/.m2/repository" name="localRepository"/>
+    <property value="/" name="file.separator"/>
+    <property value="http://developer.apple.com/java/" name="java.vendor.url.bug"/>
+    <property value="big" name="sun.cpu.endian"/>
+    <property value="UnicodeBig" name="sun.io.unicode.encoding"/>
+    <property value="1040.1.5.0_06-112" name="mrj.version"/>
+    <property value="" name="sun.cpu.isalist"/>
+  </properties>
+  <testcase time="0.035" name="testGetUnKnownCollector"/>
+  <testcase time="0" name="testGetJDependsCollector"/>
+  <testcase time="0" name="testGetJavaNCSSCollector"/>
+  <testcase time="0" name="testGetCloverCollector"/>
+  <testcase time="0.644" name="testCollectWithoutPluginConfiguration"/>
+  <testcase time="0.015" name="testCollectWithPluginConfiguration"/>
+  <testcase time="0.044" name="testCollectWithoutPluginConfiguration"/>
+  <testcase time="0.013" name="testCollectWithPluginConfiguration"/>
+  <testcase time="0.024" name="testGetEmptyJdbcPassword"/>
+  <testcase time="6.889" name="testPopulateWithoutAnyReport"/>
+  <testcase time="0.697" name="testPopulateWithJavaNcssReport"/>
+  <testcase time="0.665" name="testPopulateWithJDependsReport"/>
+  <testcase time="0.283" name="testPopulateWithCloverReport"/>
+  <testcase time="0.592" name="testPopulateWithCheckstyleReport"/>
+</testsuite>
\ 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 (file)
index 0000000..71e443d
--- /dev/null
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<testsuite errors="0" skipped="0" tests="2" time="1,134.193" failures="0"
+           name="ch.hortis.sonar.mvn.mc.CheckstyleCollectorTest">
+  <properties>
+    <property value="Java(TM) 2 Runtime Environment, Standard Edition" name="java.runtime.name"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Libraries"
+              name="sun.boot.library.path"/>
+    <property value="1.5.0_06-64" name="java.vm.version"/>
+    <property value="true" name="awt.nativeDoubleBuffering"/>
+    <property value="false" name="gopherProxySet"/>
+    <property value="&quot;Apple Computer, Inc.&quot;" name="java.vm.vendor"/>
+    <property value="http://apple.com/" name="java.vendor.url"/>
+    <property value=":" name="path.separator"/>
+    <property value="Java HotSpot(TM) Client VM" name="java.vm.name"/>
+    <property value="sun.io" name="file.encoding.pkg"/>
+    <property value="FR" name="user.country"/>
+    <property value="unknown" name="sun.os.patch.level"/>
+    <property value="Java Virtual Machine Specification" name="java.vm.specification.name"/>
+    <property value="/Users/cmunger/Documents/workspace/sonar/sonar-maven-plugin" name="user.dir"/>
+    <property value="1.5.0_06-112" name="java.runtime.version"/>
+    <property value="apple.awt.CGraphicsEnvironment" name="java.awt.graphicsenv"/>
+    <property value="/Users/cmunger/Documents/workspace/sonar/sonar-maven-plugin" name="basedir"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/endorsed"
+              name="java.endorsed.dirs"/>
+    <property value="ppc" name="os.arch"/>
+    <property value="/tmp" name="java.io.tmpdir"/>
+    <property value="
+" name="line.separator"/>
+    <property value="Sun Microsystems Inc." name="java.vm.specification.vendor"/>
+    <property value="Mac OS X" name="os.name"/>
+    <property value="MacRoman" name="sun.jnu.encoding"/>
+    <property value=".:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java"
+              name="java.library.path"/>
+    <property value="Java Platform API Specification" name="java.specification.name"/>
+    <property value="49.0" name="java.class.version"/>
+    <property value="HotSpot Client Compiler" name="sun.management.compiler"/>
+    <property value="10.4.8" name="os.version"/>
+    <property value="/Users/cmunger" name="user.home"/>
+    <property value="" name="user.timezone"/>
+    <property value="apple.awt.CPrinterJob" name="java.awt.printerjob"/>
+    <property value="MacRoman" name="file.encoding"/>
+    <property value="1.5" name="java.specification.version"/>
+    <property value="cmunger" name="user.name"/>
+    <property
+        value="/Users/cmunger/.m2/repository/org/apache/maven/surefire/surefire-api/2.0/surefire-api-2.0.jar:/Users/cmunger/.m2/repository/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.jar:/Users/cmunger/.m2/repository/org/apache/maven/surefire/surefire-booter/2.0/surefire-booter-2.0.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/.compatibility/14compatibility.jar"
+        name="java.class.path"/>
+    <property value="1.0" name="java.vm.specification.version"/>
+    <property value="32" name="sun.arch.data.model"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home" name="java.home"/>
+    <property value="Sun Microsystems Inc." name="java.specification.vendor"/>
+    <property value="fr" name="user.language"/>
+    <property value="apple.awt.CToolkit" name="awt.toolkit"/>
+    <property value="mixed mode, sharing" name="java.vm.info"/>
+    <property value="1.5.0_06" name="java.version"/>
+    <property
+        value="/Library/Java/Extensions:/System/Library/Java/Extensions:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/ext"
+        name="java.ext.dirs"/>
+    <property
+        value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/classes.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/ui.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/laf.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/sunrsasign.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jsse.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jce.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/charsets.jar"
+        name="sun.boot.class.path"/>
+    <property value="Apple Computer, Inc." name="java.vendor"/>
+    <property value="/Users/cmunger/.m2/repository" name="localRepository"/>
+    <property value="/" name="file.separator"/>
+    <property value="http://developer.apple.com/java/" name="java.vendor.url.bug"/>
+    <property value="big" name="sun.cpu.endian"/>
+    <property value="UnicodeBig" name="sun.io.unicode.encoding"/>
+    <property value="1040.1.5.0_06-112" name="mrj.version"/>
+    <property value="" name="sun.cpu.isalist"/>
+  </properties>
+  <testcase time="0.035" name="testGetUnKnownCollector"/>
+  <testcase time="0" name="testGetJDependsCollector"/>
+  <testcase time="0" name="testGetJavaNCSSCollector"/>
+  <testcase time="0" name="testGetCloverCollector"/>
+  <testcase time="0.644" name="testCollectWithoutPluginConfiguration"/>
+  <testcase time="0.015" name="testCollectWithPluginConfiguration"/>
+</testsuite>
\ 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 (file)
index 0000000..f803b69
--- /dev/null
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<testsuite errors="0" skipped="0" tests="2" time="0.061" failures="0" name="ch.hortis.sonar.mvn.mc.CloverCollectorTest">
+  <properties>
+    <property value="Java(TM) 2 Runtime Environment, Standard Edition" name="java.runtime.name"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Libraries"
+              name="sun.boot.library.path"/>
+    <property value="1.5.0_06-64" name="java.vm.version"/>
+    <property value="true" name="awt.nativeDoubleBuffering"/>
+    <property value="false" name="gopherProxySet"/>
+    <property value="&quot;Apple Computer, Inc.&quot;" name="java.vm.vendor"/>
+    <property value="http://apple.com/" name="java.vendor.url"/>
+    <property value=":" name="path.separator"/>
+    <property value="Java HotSpot(TM) Client VM" name="java.vm.name"/>
+    <property value="sun.io" name="file.encoding.pkg"/>
+    <property value="FR" name="user.country"/>
+    <property value="unknown" name="sun.os.patch.level"/>
+    <property value="Java Virtual Machine Specification" name="java.vm.specification.name"/>
+    <property value="/Users/cmunger/Documents/workspace/sonar/sonar-maven-plugin" name="user.dir"/>
+    <property value="1.5.0_06-112" name="java.runtime.version"/>
+    <property value="apple.awt.CGraphicsEnvironment" name="java.awt.graphicsenv"/>
+    <property value="/Users/cmunger/Documents/workspace/sonar/sonar-maven-plugin" name="basedir"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/endorsed"
+              name="java.endorsed.dirs"/>
+    <property value="ppc" name="os.arch"/>
+    <property value="/tmp" name="java.io.tmpdir"/>
+    <property value="
+" name="line.separator"/>
+    <property value="Sun Microsystems Inc." name="java.vm.specification.vendor"/>
+    <property value="Mac OS X" name="os.name"/>
+    <property value="MacRoman" name="sun.jnu.encoding"/>
+    <property value=".:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java"
+              name="java.library.path"/>
+    <property value="Java Platform API Specification" name="java.specification.name"/>
+    <property value="49.0" name="java.class.version"/>
+    <property value="HotSpot Client Compiler" name="sun.management.compiler"/>
+    <property value="10.4.8" name="os.version"/>
+    <property value="/Users/cmunger" name="user.home"/>
+    <property value="" name="user.timezone"/>
+    <property value="apple.awt.CPrinterJob" name="java.awt.printerjob"/>
+    <property value="MacRoman" name="file.encoding"/>
+    <property value="1.5" name="java.specification.version"/>
+    <property value="cmunger" name="user.name"/>
+    <property
+        value="/Users/cmunger/.m2/repository/org/apache/maven/surefire/surefire-api/2.0/surefire-api-2.0.jar:/Users/cmunger/.m2/repository/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.jar:/Users/cmunger/.m2/repository/org/apache/maven/surefire/surefire-booter/2.0/surefire-booter-2.0.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/.compatibility/14compatibility.jar"
+        name="java.class.path"/>
+    <property value="1.0" name="java.vm.specification.version"/>
+    <property value="32" name="sun.arch.data.model"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home" name="java.home"/>
+    <property value="Sun Microsystems Inc." name="java.specification.vendor"/>
+    <property value="fr" name="user.language"/>
+    <property value="apple.awt.CToolkit" name="awt.toolkit"/>
+    <property value="mixed mode, sharing" name="java.vm.info"/>
+    <property value="1.5.0_06" name="java.version"/>
+    <property
+        value="/Library/Java/Extensions:/System/Library/Java/Extensions:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/ext"
+        name="java.ext.dirs"/>
+    <property
+        value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/classes.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/ui.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/laf.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/sunrsasign.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jsse.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jce.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/charsets.jar"
+        name="sun.boot.class.path"/>
+    <property value="Apple Computer, Inc." name="java.vendor"/>
+    <property value="/Users/cmunger/.m2/repository" name="localRepository"/>
+    <property value="/" name="file.separator"/>
+    <property value="http://developer.apple.com/java/" name="java.vendor.url.bug"/>
+    <property value="big" name="sun.cpu.endian"/>
+    <property value="UnicodeBig" name="sun.io.unicode.encoding"/>
+    <property value="1040.1.5.0_06-112" name="mrj.version"/>
+    <property value="" name="sun.cpu.isalist"/>
+  </properties>
+  <testcase time="0.035" name="testGetUnKnownCollector"/>
+  <testcase time="0" name="testGetJDependsCollector"/>
+  <testcase time="0" name="testGetJavaNCSSCollector"/>
+  <testcase time="0" name="testGetCloverCollector"/>
+  <testcase time="0.644" name="testCollectWithoutPluginConfiguration"/>
+  <testcase time="0.015" name="testCollectWithPluginConfiguration"/>
+  <testcase time="0.044" name="testCollectWithoutPluginConfiguration"/>
+  <testcase time="0.013" name="testCollectWithPluginConfiguration"/>
+</testsuite>
\ 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 (file)
index 0000000..0fc45fc
--- /dev/null
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<testsuite errors="0" skipped="0" tests="2" time="0.031" failures="0"
+           name="ch.hortis.sonar.mvn.mc.JDependsCollectorTest">
+  <properties>
+    <property value="Java(TM) 2 Runtime Environment, Standard Edition" name="java.runtime.name"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Libraries"
+              name="sun.boot.library.path"/>
+    <property value="1.5.0_06-64" name="java.vm.version"/>
+    <property value="true" name="awt.nativeDoubleBuffering"/>
+    <property value="false" name="gopherProxySet"/>
+    <property value="&quot;Apple Computer, Inc.&quot;" name="java.vm.vendor"/>
+    <property value="http://apple.com/" name="java.vendor.url"/>
+    <property value=":" name="path.separator"/>
+    <property value="Java HotSpot(TM) Client VM" name="java.vm.name"/>
+    <property value="sun.io" name="file.encoding.pkg"/>
+    <property value="FR" name="user.country"/>
+    <property value="unknown" name="sun.os.patch.level"/>
+    <property value="Java Virtual Machine Specification" name="java.vm.specification.name"/>
+    <property value="/Users/cmunger/Documents/workspace/sonar/sonar-maven-plugin" name="user.dir"/>
+    <property value="1.5.0_06-112" name="java.runtime.version"/>
+    <property value="apple.awt.CGraphicsEnvironment" name="java.awt.graphicsenv"/>
+    <property value="/Users/cmunger/Documents/workspace/sonar/sonar-maven-plugin" name="basedir"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/endorsed"
+              name="java.endorsed.dirs"/>
+    <property value="ppc" name="os.arch"/>
+    <property value="/tmp" name="java.io.tmpdir"/>
+    <property value="
+" name="line.separator"/>
+    <property value="Sun Microsystems Inc." name="java.vm.specification.vendor"/>
+    <property value="Mac OS X" name="os.name"/>
+    <property value="MacRoman" name="sun.jnu.encoding"/>
+    <property value=".:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java"
+              name="java.library.path"/>
+    <property value="Java Platform API Specification" name="java.specification.name"/>
+    <property value="49.0" name="java.class.version"/>
+    <property value="HotSpot Client Compiler" name="sun.management.compiler"/>
+    <property value="10.4.8" name="os.version"/>
+    <property value="/Users/cmunger" name="user.home"/>
+    <property value="Europe/Zurich" name="user.timezone"/>
+    <property value="apple.awt.CPrinterJob" name="java.awt.printerjob"/>
+    <property value="MacRoman" name="file.encoding"/>
+    <property value="1.5" name="java.specification.version"/>
+    <property value="cmunger" name="user.name"/>
+    <property
+        value="/Users/cmunger/.m2/repository/org/apache/maven/surefire/surefire-api/2.0/surefire-api-2.0.jar:/Users/cmunger/.m2/repository/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.jar:/Users/cmunger/.m2/repository/org/apache/maven/surefire/surefire-booter/2.0/surefire-booter-2.0.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/.compatibility/14compatibility.jar"
+        name="java.class.path"/>
+    <property value="1.0" name="java.vm.specification.version"/>
+    <property value="32" name="sun.arch.data.model"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home" name="java.home"/>
+    <property value="Sun Microsystems Inc." name="java.specification.vendor"/>
+    <property value="fr" name="user.language"/>
+    <property value="apple.awt.CToolkit" name="awt.toolkit"/>
+    <property value="mixed mode, sharing" name="java.vm.info"/>
+    <property value="1.5.0_06" name="java.version"/>
+    <property
+        value="/Library/Java/Extensions:/System/Library/Java/Extensions:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/ext"
+        name="java.ext.dirs"/>
+    <property
+        value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/classes.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/ui.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/laf.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/sunrsasign.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jsse.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jce.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/charsets.jar"
+        name="sun.boot.class.path"/>
+    <property value="Apple Computer, Inc." name="java.vendor"/>
+    <property value="/Users/cmunger/.m2/repository" name="localRepository"/>
+    <property value="/" name="file.separator"/>
+    <property value="http://developer.apple.com/java/" name="java.vendor.url.bug"/>
+    <property value="big" name="sun.cpu.endian"/>
+    <property value="UnicodeBig" name="sun.io.unicode.encoding"/>
+    <property value="1040.1.5.0_06-112" name="mrj.version"/>
+    <property value="" name="sun.cpu.isalist"/>
+  </properties>
+  <testcase time="0.035" name="testGetUnKnownCollector"/>
+  <testcase time="0" name="testGetJDependsCollector"/>
+  <testcase time="0" name="testGetJavaNCSSCollector"/>
+  <testcase time="0" name="testGetCloverCollector"/>
+  <testcase time="0.644" name="testCollectWithoutPluginConfiguration"/>
+  <testcase time="0.015" name="testCollectWithPluginConfiguration"/>
+  <testcase time="0.044" name="testCollectWithoutPluginConfiguration"/>
+  <testcase time="0.013" name="testCollectWithPluginConfiguration"/>
+  <testcase time="0.024" name="testGetEmptyJdbcPassword"/>
+  <testcase time="6.889" name="testPopulateWithoutAnyReport"/>
+  <testcase time="0.697" name="testPopulateWithJavaNcssReport"/>
+  <testcase time="0.665" name="testPopulateWithJDependsReport"/>
+  <testcase time="0.283" name="testPopulateWithCloverReport"/>
+  <testcase time="0.592" name="testPopulateWithCheckstyleReport"/>
+  <testcase time="0.014" name="testCollectWithoutPluginConfiguration"/>
+  <testcase time="0.001" name="testCollectWithPluginConfiguration"/>
+</testsuite>
\ 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 (file)
index 0000000..693f3fa
--- /dev/null
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<testsuite errors="0" skipped="0" tests="2" time="0.08" failures="0"
+           name="ch.hortis.sonar.mvn.mc.JavaNCSSCollectorTest">
+  <properties>
+    <property value="Java(TM) 2 Runtime Environment, Standard Edition" name="java.runtime.name"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Libraries"
+              name="sun.boot.library.path"/>
+    <property value="1.5.0_06-64" name="java.vm.version"/>
+    <property value="true" name="awt.nativeDoubleBuffering"/>
+    <property value="false" name="gopherProxySet"/>
+    <property value="&quot;Apple Computer, Inc.&quot;" name="java.vm.vendor"/>
+    <property value="http://apple.com/" name="java.vendor.url"/>
+    <property value=":" name="path.separator"/>
+    <property value="Java HotSpot(TM) Client VM" name="java.vm.name"/>
+    <property value="sun.io" name="file.encoding.pkg"/>
+    <property value="FR" name="user.country"/>
+    <property value="unknown" name="sun.os.patch.level"/>
+    <property value="Java Virtual Machine Specification" name="java.vm.specification.name"/>
+    <property value="/Users/cmunger/Documents/workspace/sonar/sonar-maven-plugin" name="user.dir"/>
+    <property value="1.5.0_06-112" name="java.runtime.version"/>
+    <property value="apple.awt.CGraphicsEnvironment" name="java.awt.graphicsenv"/>
+    <property value="/Users/cmunger/Documents/workspace/sonar/sonar-maven-plugin" name="basedir"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/endorsed"
+              name="java.endorsed.dirs"/>
+    <property value="ppc" name="os.arch"/>
+    <property value="/tmp" name="java.io.tmpdir"/>
+    <property value="
+" name="line.separator"/>
+    <property value="Sun Microsystems Inc." name="java.vm.specification.vendor"/>
+    <property value="Mac OS X" name="os.name"/>
+    <property value="MacRoman" name="sun.jnu.encoding"/>
+    <property value=".:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java"
+              name="java.library.path"/>
+    <property value="Java Platform API Specification" name="java.specification.name"/>
+    <property value="49.0" name="java.class.version"/>
+    <property value="HotSpot Client Compiler" name="sun.management.compiler"/>
+    <property value="10.4.8" name="os.version"/>
+    <property value="/Users/cmunger" name="user.home"/>
+    <property value="Europe/Zurich" name="user.timezone"/>
+    <property value="apple.awt.CPrinterJob" name="java.awt.printerjob"/>
+    <property value="MacRoman" name="file.encoding"/>
+    <property value="1.5" name="java.specification.version"/>
+    <property value="cmunger" name="user.name"/>
+    <property
+        value="/Users/cmunger/.m2/repository/org/apache/maven/surefire/surefire-api/2.0/surefire-api-2.0.jar:/Users/cmunger/.m2/repository/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.jar:/Users/cmunger/.m2/repository/org/apache/maven/surefire/surefire-booter/2.0/surefire-booter-2.0.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/.compatibility/14compatibility.jar"
+        name="java.class.path"/>
+    <property value="1.0" name="java.vm.specification.version"/>
+    <property value="32" name="sun.arch.data.model"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home" name="java.home"/>
+    <property value="Sun Microsystems Inc." name="java.specification.vendor"/>
+    <property value="fr" name="user.language"/>
+    <property value="apple.awt.CToolkit" name="awt.toolkit"/>
+    <property value="mixed mode, sharing" name="java.vm.info"/>
+    <property value="1.5.0_06" name="java.version"/>
+    <property
+        value="/Library/Java/Extensions:/System/Library/Java/Extensions:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/ext"
+        name="java.ext.dirs"/>
+    <property
+        value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/classes.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/ui.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/laf.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/sunrsasign.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jsse.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jce.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/charsets.jar"
+        name="sun.boot.class.path"/>
+    <property value="Apple Computer, Inc." name="java.vendor"/>
+    <property value="/Users/cmunger/.m2/repository" name="localRepository"/>
+    <property value="/" name="file.separator"/>
+    <property value="http://developer.apple.com/java/" name="java.vendor.url.bug"/>
+    <property value="big" name="sun.cpu.endian"/>
+    <property value="UnicodeBig" name="sun.io.unicode.encoding"/>
+    <property value="1040.1.5.0_06-112" name="mrj.version"/>
+    <property value="" name="sun.cpu.isalist"/>
+  </properties>
+  <testcase time="0.035" name="testGetUnKnownCollector"/>
+  <testcase time="0" name="testGetJDependsCollector"/>
+  <testcase time="0" name="testGetJavaNCSSCollector"/>
+  <testcase time="0" name="testGetCloverCollector"/>
+  <testcase time="0.644" name="testCollectWithoutPluginConfiguration"/>
+  <testcase time="0.015" name="testCollectWithPluginConfiguration"/>
+  <testcase time="0.044" name="testCollectWithoutPluginConfiguration"/>
+  <testcase time="0.013" name="testCollectWithPluginConfiguration"/>
+  <testcase time="0.024" name="testGetEmptyJdbcPassword"/>
+  <testcase time="6.889" name="testPopulateWithoutAnyReport"/>
+  <testcase time="0.697" name="testPopulateWithJavaNcssReport"/>
+  <testcase time="0.665" name="testPopulateWithJDependsReport"/>
+  <testcase time="0.283" name="testPopulateWithCloverReport"/>
+  <testcase time="0.592" name="testPopulateWithCheckstyleReport"/>
+  <testcase time="0.014" name="testCollectWithoutPluginConfiguration"/>
+  <testcase time="0.001" name="testCollectWithPluginConfiguration"/>
+  <testcase time="0.074" name="testCollectWithoutPluginConfiguration"/>
+  <testcase time="0.003" name="testCollectWithPluginConfiguration"/>
+</testsuite>
\ 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 (file)
index 0000000..dc3b31a
--- /dev/null
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<testsuite errors="0" skipped="0" tests="4" time="0.078" failures="0"
+           name="ch.hortis.sonar.mvn.mc.MetricsCollectorRegistryTest">
+  <properties>
+    <property value="Java(TM) 2 Runtime Environment, Standard Edition" name="java.runtime.name"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Libraries"
+              name="sun.boot.library.path"/>
+    <property value="1.5.0_06-64" name="java.vm.version"/>
+    <property value="true" name="awt.nativeDoubleBuffering"/>
+    <property value="false" name="gopherProxySet"/>
+    <property value="&quot;Apple Computer, Inc.&quot;" name="java.vm.vendor"/>
+    <property value="http://apple.com/" name="java.vendor.url"/>
+    <property value=":" name="path.separator"/>
+    <property value="Java HotSpot(TM) Client VM" name="java.vm.name"/>
+    <property value="sun.io" name="file.encoding.pkg"/>
+    <property value="FR" name="user.country"/>
+    <property value="unknown" name="sun.os.patch.level"/>
+    <property value="Java Virtual Machine Specification" name="java.vm.specification.name"/>
+    <property value="/Users/cmunger/Documents/workspace/sonar/sonar-maven-plugin" name="user.dir"/>
+    <property value="1.5.0_06-112" name="java.runtime.version"/>
+    <property value="apple.awt.CGraphicsEnvironment" name="java.awt.graphicsenv"/>
+    <property value="/Users/cmunger/Documents/workspace/sonar/sonar-maven-plugin" name="basedir"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/endorsed"
+              name="java.endorsed.dirs"/>
+    <property value="ppc" name="os.arch"/>
+    <property value="/tmp" name="java.io.tmpdir"/>
+    <property value="
+" name="line.separator"/>
+    <property value="Sun Microsystems Inc." name="java.vm.specification.vendor"/>
+    <property value="Mac OS X" name="os.name"/>
+    <property value="MacRoman" name="sun.jnu.encoding"/>
+    <property value=".:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java"
+              name="java.library.path"/>
+    <property value="Java Platform API Specification" name="java.specification.name"/>
+    <property value="49.0" name="java.class.version"/>
+    <property value="HotSpot Client Compiler" name="sun.management.compiler"/>
+    <property value="10.4.8" name="os.version"/>
+    <property value="/Users/cmunger" name="user.home"/>
+    <property value="" name="user.timezone"/>
+    <property value="apple.awt.CPrinterJob" name="java.awt.printerjob"/>
+    <property value="MacRoman" name="file.encoding"/>
+    <property value="1.5" name="java.specification.version"/>
+    <property value="cmunger" name="user.name"/>
+    <property
+        value="/Users/cmunger/.m2/repository/org/apache/maven/surefire/surefire-api/2.0/surefire-api-2.0.jar:/Users/cmunger/.m2/repository/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.jar:/Users/cmunger/.m2/repository/org/apache/maven/surefire/surefire-booter/2.0/surefire-booter-2.0.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/.compatibility/14compatibility.jar"
+        name="java.class.path"/>
+    <property value="1.0" name="java.vm.specification.version"/>
+    <property value="32" name="sun.arch.data.model"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home" name="java.home"/>
+    <property value="Sun Microsystems Inc." name="java.specification.vendor"/>
+    <property value="fr" name="user.language"/>
+    <property value="apple.awt.CToolkit" name="awt.toolkit"/>
+    <property value="mixed mode, sharing" name="java.vm.info"/>
+    <property value="1.5.0_06" name="java.version"/>
+    <property
+        value="/Library/Java/Extensions:/System/Library/Java/Extensions:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/ext"
+        name="java.ext.dirs"/>
+    <property
+        value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/classes.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/ui.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/laf.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/sunrsasign.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jsse.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jce.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/charsets.jar"
+        name="sun.boot.class.path"/>
+    <property value="Apple Computer, Inc." name="java.vendor"/>
+    <property value="/Users/cmunger/.m2/repository" name="localRepository"/>
+    <property value="/" name="file.separator"/>
+    <property value="http://developer.apple.com/java/" name="java.vendor.url.bug"/>
+    <property value="big" name="sun.cpu.endian"/>
+    <property value="UnicodeBig" name="sun.io.unicode.encoding"/>
+    <property value="1040.1.5.0_06-112" name="mrj.version"/>
+    <property value="" name="sun.cpu.isalist"/>
+  </properties>
+  <testcase time="0.035" name="testGetUnKnownCollector"/>
+  <testcase time="0" name="testGetJDependsCollector"/>
+  <testcase time="0" name="testGetJavaNCSSCollector"/>
+  <testcase time="0" name="testGetCloverCollector"/>
+</testsuite>
\ 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 (file)
index 0000000..e69de29
diff --git a/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/noTests/TEST-noTests.xml b/plugins/sonar-surefire-plugin/src/test/resources/org/sonar/plugins/surefire/api/AbstractSurefireParserTest/noTests/TEST-noTests.xml
new file mode 100644 (file)
index 0000000..fb55bf5
--- /dev/null
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<testsuite errors="0" skipped="0" tests="0" time="1,134.193" failures="0"
+           name="ch.hortis.sonar.mvn.mc.CheckstyleCollectorTest">
+  <properties>
+    <property value="Java(TM) 2 Runtime Environment, Standard Edition" name="java.runtime.name"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Libraries"
+              name="sun.boot.library.path"/>
+    <property value="1.5.0_06-64" name="java.vm.version"/>
+    <property value="true" name="awt.nativeDoubleBuffering"/>
+    <property value="false" name="gopherProxySet"/>
+    <property value="&quot;Apple Computer, Inc.&quot;" name="java.vm.vendor"/>
+    <property value="http://apple.com/" name="java.vendor.url"/>
+    <property value=":" name="path.separator"/>
+    <property value="Java HotSpot(TM) Client VM" name="java.vm.name"/>
+    <property value="sun.io" name="file.encoding.pkg"/>
+    <property value="FR" name="user.country"/>
+    <property value="unknown" name="sun.os.patch.level"/>
+    <property value="Java Virtual Machine Specification" name="java.vm.specification.name"/>
+    <property value="/Users/cmunger/Documents/workspace/sonar/sonar-maven-plugin" name="user.dir"/>
+    <property value="1.5.0_06-112" name="java.runtime.version"/>
+    <property value="apple.awt.CGraphicsEnvironment" name="java.awt.graphicsenv"/>
+    <property value="/Users/cmunger/Documents/workspace/sonar/sonar-maven-plugin" name="basedir"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/endorsed"
+              name="java.endorsed.dirs"/>
+    <property value="ppc" name="os.arch"/>
+    <property value="/tmp" name="java.io.tmpdir"/>
+    <property value="
+" name="line.separator"/>
+    <property value="Sun Microsystems Inc." name="java.vm.specification.vendor"/>
+    <property value="Mac OS X" name="os.name"/>
+    <property value="MacRoman" name="sun.jnu.encoding"/>
+    <property value=".:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java"
+              name="java.library.path"/>
+    <property value="Java Platform API Specification" name="java.specification.name"/>
+    <property value="49.0" name="java.class.version"/>
+    <property value="HotSpot Client Compiler" name="sun.management.compiler"/>
+    <property value="10.4.8" name="os.version"/>
+    <property value="/Users/cmunger" name="user.home"/>
+    <property value="" name="user.timezone"/>
+    <property value="apple.awt.CPrinterJob" name="java.awt.printerjob"/>
+    <property value="MacRoman" name="file.encoding"/>
+    <property value="1.5" name="java.specification.version"/>
+    <property value="cmunger" name="user.name"/>
+    <property
+        value="/Users/cmunger/.m2/repository/org/apache/maven/surefire/surefire-api/2.0/surefire-api-2.0.jar:/Users/cmunger/.m2/repository/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.jar:/Users/cmunger/.m2/repository/org/apache/maven/surefire/surefire-booter/2.0/surefire-booter-2.0.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/.compatibility/14compatibility.jar"
+        name="java.class.path"/>
+    <property value="1.0" name="java.vm.specification.version"/>
+    <property value="32" name="sun.arch.data.model"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home" name="java.home"/>
+    <property value="Sun Microsystems Inc." name="java.specification.vendor"/>
+    <property value="fr" name="user.language"/>
+    <property value="apple.awt.CToolkit" name="awt.toolkit"/>
+    <property value="mixed mode, sharing" name="java.vm.info"/>
+    <property value="1.5.0_06" name="java.version"/>
+    <property
+        value="/Library/Java/Extensions:/System/Library/Java/Extensions:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/ext"
+        name="java.ext.dirs"/>
+    <property
+        value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/classes.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/ui.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/laf.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/sunrsasign.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jsse.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jce.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/charsets.jar"
+        name="sun.boot.class.path"/>
+    <property value="Apple Computer, Inc." name="java.vendor"/>
+    <property value="/Users/cmunger/.m2/repository" name="localRepository"/>
+    <property value="/" name="file.separator"/>
+    <property value="http://developer.apple.com/java/" name="java.vendor.url.bug"/>
+    <property value="big" name="sun.cpu.endian"/>
+    <property value="UnicodeBig" name="sun.io.unicode.encoding"/>
+    <property value="1040.1.5.0_06-112" name="mrj.version"/>
+    <property value="" name="sun.cpu.isalist"/>
+  </properties>
+</testsuite>
\ No newline at end of file
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 (file)
index 0000000..950b847
--- /dev/null
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<testsuite errors="1" skipped="0" tests="2" time="0.032" failures="1" name="org.sonar.Foo">
+  <properties>
+    <property value="Apple Inc." name="java.vendor"/>
+    <property value="/Users/cmunger/.m2/repository" name="localRepository"/>
+    <property value="../Resources/Eclipse.icns" name="env.APP_ICON_175"/>
+    <property value="SUN_STANDARD" name="sun.java.launcher"/>
+    <property value="HotSpot Client Compiler" name="sun.management.compiler"/>
+    <property value="6b0270" name="env.SECURITYSESSIONID"/>
+    <property value="Mac OS X" name="os.name"/>
+    <property
+        value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/classes.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/ui.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/laf.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/sunrsasign.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jsse.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jce.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/charsets.jar"
+        name="sun.boot.class.path"/>
+    <property value="/var/folders/Ea/Ea1AbxXfF6u1WpNRWAq8q++++TI/-Tmp-/" name="env.TMPDIR"/>
+    <property value="Sun Microsystems Inc." name="java.vm.specification.vendor"/>
+    <property value="1.5.0_16-b06-284" name="java.runtime.version"/>
+    <property value="/tmp/launch-sNnktt/Render" name="env.Apple_PubSub_Socket_Render"/>
+    <property value="/tmp/launch-fxz1jZ/:0" name="env.DISPLAY"/>
+    <property value="cmunger" name="user.name"/>
+    <property value="cmunger" name="env.USER"/>
+    <property value="/bin/bash" name="env.SHELL"/>
+    <property value="0x1F5:0:0" name="env.__CF_USER_TEXT_ENCODING"/>
+    <property value="true" name="awt.nativeDoubleBuffering"/>
+    <property value="/usr/bin:/bin:/usr/sbin:/sbin" name="env.PATH"/>
+    <property value="en" name="user.language"/>
+    <property value="./testDBStop52578" name="derby.system.home"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Libraries"
+              name="sun.boot.library.path"/>
+    <property value="/usr/share/apache-maven-2.0.9/bin/m2.conf" name="classworlds.conf"/>
+    <property value="1.5.0_16" name="java.version"/>
+    <property value="Europe/Zurich" name="user.timezone"/>
+    <property value="32" name="sun.arch.data.model"/>
+    <property value="local|*.local|169.254/16|*.169.254/16" name="http.nonProxyHosts"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/endorsed"
+              name="java.endorsed.dirs"/>
+    <property value="" name="sun.cpu.isalist"/>
+    <property value="MacRoman" name="sun.jnu.encoding"/>
+    <property value="sun.io" name="file.encoding.pkg"/>
+    <property value="/" name="file.separator"/>
+    <property value="Java Platform API Specification" name="java.specification.name"/>
+    <property value="49.0" name="java.class.version"/>
+    <property value="US" name="user.country"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home" name="java.home"/>
+    <property value="mixed mode, sharing" name="java.vm.info"/>
+    <property value="cmunger" name="env.LOGNAME"/>
+    <property value="10.5.6" name="os.version"/>
+    <property value=":" name="path.separator"/>
+    <property value="org.codehaus.classworlds.Launcher" name="env.JAVA_MAIN_CLASS_1410"/>
+    <property value="1.5.0_16-133" name="java.vm.version"/>
+    <property value="apple.awt.CPrinterJob" name="java.awt.printerjob"/>
+    <property value="UnicodeLittle" name="sun.io.unicode.encoding"/>
+    <property value="apple.awt.CToolkit" name="awt.toolkit"/>
+    <property value="local|*.local|169.254/16|*.169.254/16" name="socksNonProxyHosts"/>
+    <property value="1" name="env.JAVA_STARTED_ON_FIRST_THREAD_175"/>
+    <property value="local|*.local|169.254/16|*.169.254/16" name="ftp.nonProxyHosts"/>
+    <property value="/Users/cmunger" name="user.home"/>
+    <property value="Sun Microsystems Inc." name="java.specification.vendor"/>
+    <property value=".:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java"
+              name="java.library.path"/>
+    <property value="http://www.apple.com/" name="java.vendor.url"/>
+    <property value="Apple Inc." name="java.vm.vendor"/>
+    <property value="false" name="gopherProxySet"/>
+    <property value="/usr/share/apache-maven-2.0.9" name="maven.home"/>
+    <property value="Java(TM) 2 Runtime Environment, Standard Edition" name="java.runtime.name"/>
+    <property value="/usr/share/apache-maven-2.0.9/boot/classworlds-1.1.jar" name="java.class.path"/>
+    <property value="Java Virtual Machine Specification" name="java.vm.specification.name"/>
+    <property value="1.0" name="java.vm.specification.version"/>
+    <property value="little" name="sun.cpu.endian"/>
+    <property value="unknown" name="sun.os.patch.level"/>
+    <property value="/Users/cmunger" name="env.HOME"/>
+    <property
+        value="/Users/cmunger/dev/workspace/sonar/sonar-core/target/test-classes:/Users/cmunger/dev/workspace/sonar/sonar-core/target/classes:/Users/cmunger/.m2/repository/org/codehaus/sonar/sonar-commons/1.7-SNAPSHOT/sonar-commons-1.7-SNAPSHOT.jar:/Users/cmunger/.m2/repository/org/picocontainer/picocontainer/2.7/picocontainer-2.7.jar:/Users/cmunger/.m2/repository/org/slf4j/slf4j-api/1.5.0/slf4j-api-1.5.0.jar:/Users/cmunger/.m2/repository/org/slf4j/jcl104-over-slf4j/1.4.3/jcl104-over-slf4j-1.4.3.jar:/Users/cmunger/.m2/repository/ch/qos/logback/logback-classic/0.9.9/logback-classic-0.9.9.jar:/Users/cmunger/.m2/repository/ch/qos/logback/logback-core/0.9.9/logback-core-0.9.9.jar:/Users/cmunger/.m2/repository/geronimo-spec/geronimo-spec-jta/1.0-M1/geronimo-spec-jta-1.0-M1.jar:/Users/cmunger/.m2/repository/org/hibernate/hibernate/3.2.6.ga/hibernate-3.2.6.ga.jar:/Users/cmunger/.m2/repository/net/sf/ehcache/ehcache/1.2.3/ehcache-1.2.3.jar:/Users/cmunger/.m2/repository/commons-collections/commons-collections/3.2.1/commons-collections-3.2.1.jar:/Users/cmunger/.m2/repository/asm/asm-attrs/1.5.3/asm-attrs-1.5.3.jar:/Users/cmunger/.m2/repository/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar:/Users/cmunger/.m2/repository/antlr/antlr/2.7.6/antlr-2.7.6.jar:/Users/cmunger/.m2/repository/cglib/cglib/2.1_3/cglib-2.1_3.jar:/Users/cmunger/.m2/repository/asm/asm/1.5.3/asm-1.5.3.jar:/Users/cmunger/.m2/repository/org/hibernate/hibernate-annotations/3.3.1.GA/hibernate-annotations-3.3.1.GA.jar:/Users/cmunger/.m2/repository/org/hibernate/hibernate-commons-annotations/3.3.0.ga/hibernate-commons-annotations-3.3.0.ga.jar:/Users/cmunger/.m2/repository/commons-logging/commons-logging/1.1/commons-logging-1.1.jar:/Users/cmunger/.m2/repository/org/hibernate/ejb3-persistence/1.0.1.GA/ejb3-persistence-1.0.1.GA.jar:/Users/cmunger/.m2/repository/javax/persistence/persistence-api/1.0/persistence-api-1.0.jar:/Users/cmunger/.m2/repository/org/hibernate/hibernate-entitymanager/3.3.1.ga/hibernate-entitymanager-3.3.1.ga.jar:/Users/cmunger/.m2/repository/org/hibernate/hibernate-validator/3.0.0.ga/hibernate-validator-3.0.0.ga.jar:/Users/cmunger/.m2/repository/jboss/javassist/3.3.ga/javassist-3.3.ga.jar:/Users/cmunger/.m2/repository/jboss/jboss-common-core/2.0.4.GA/jboss-common-core-2.0.4.GA.jar:/Users/cmunger/.m2/repository/commons-configuration/commons-configuration/1.5/commons-configuration-1.5.jar:/Users/cmunger/.m2/repository/commons-lang/commons-lang/2.4/commons-lang-2.4.jar:/Users/cmunger/.m2/repository/commons-digester/commons-digester/1.8/commons-digester-1.8.jar:/Users/cmunger/.m2/repository/commons-beanutils/commons-beanutils/1.7.0/commons-beanutils-1.7.0.jar:/Users/cmunger/.m2/repository/commons-beanutils/commons-beanutils-core/1.7.0/commons-beanutils-core-1.7.0.jar:/Users/cmunger/.m2/repository/commons-io/commons-io/1.4/commons-io-1.4.jar:/Users/cmunger/.m2/repository/commons-dbcp/commons-dbcp/1.2.1/commons-dbcp-1.2.1.jar:/Users/cmunger/.m2/repository/commons-pool/commons-pool/1.2/commons-pool-1.2.jar:/Users/cmunger/.m2/repository/xerces/xercesImpl/2.8.1/xercesImpl-2.8.1.jar:/Users/cmunger/.m2/repository/xml-apis/xml-apis/1.3.03/xml-apis-1.3.03.jar:/Users/cmunger/.m2/repository/org/codehaus/sonar/sonar-commons/1.7-SNAPSHOT/sonar-commons-1.7-SNAPSHOT-tests.jar:/Users/cmunger/.m2/repository/org/codehaus/sonar/sonar-plugin-api/1.7-SNAPSHOT/sonar-plugin-api-1.7-SNAPSHOT.jar:/Users/cmunger/.m2/repository/commons-codec/commons-codec/1.3/commons-codec-1.3.jar:/Users/cmunger/.m2/repository/jfree/jfreechart/1.0.9/jfreechart-1.0.9.jar:/Users/cmunger/.m2/repository/jfree/jcommon/1.0.12/jcommon-1.0.12.jar:/Users/cmunger/.m2/repository/com/thoughtworks/xstream/xstream/1.3/xstream-1.3.jar:/Users/cmunger/.m2/repository/xpp3/xpp3/1.1.3.3/xpp3-1.1.3.3.jar:/Users/cmunger/.m2/repository/org/codehaus/sonar/plugins/sonar-plugin-core/1.7-SNAPSHOT/sonar-plugin-core-1.7-SNAPSHOT.jar:/Users/cmunger/.m2/repository/org/codehaus/sonar/sonar-plugin-api/1.7-SNAPSHOT/sonar-plugin-api-1.7-SNAPSHOT-tests.jar:/Users/cmunger/.m2/repository/mysql/mysql-connector-java/5.0.8/mysql-connector-java-5.0.8.jar:/Users/cmunger/.m2/repository/log4j/log4j/1.2.12/log4j-1.2.12.jar:/Users/cmunger/.m2/repository/logkit/logkit/1.0.1/logkit-1.0.1.jar:/Users/cmunger/.m2/repository/avalon-framework/avalon-framework/4.1.3/avalon-framework-4.1.3.jar:/Users/cmunger/.m2/repository/javax/servlet/servlet-api/2.3/servlet-api-2.3.jar:/Users/cmunger/.m2/repository/org/apache/derby/derby/10.4.1.3/derby-10.4.1.3.jar:/Users/cmunger/.m2/repository/org/apache/derby/derbynet/10.4.1.3/derbynet-10.4.1.3.jar:/Users/cmunger/.m2/repository/junit/junit/4.4/junit-4.4.jar:/Users/cmunger/.m2/repository/org/hamcrest/hamcrest-all/1.1/hamcrest-all-1.1.jar:/Users/cmunger/.m2/repository/org/dbunit/dbunit/2.2/dbunit-2.2.jar:/Users/cmunger/.m2/repository/junit-addons/junit-addons/1.4/junit-addons-1.4.jar:/Users/cmunger/.m2/repository/poi/poi/2.5.1-final-20040804/poi-2.5.1-final-20040804.jar:/Users/cmunger/.m2/repository/hsqldb/hsqldb/1.8.0.7/hsqldb-1.8.0.7.jar:/Users/cmunger/.m2/repository/org/apache/derby/derbyclient/10.4.1.3/derbyclient-10.4.1.3.jar:/Users/cmunger/.m2/repository/org/easymock/easymock/2.3/easymock-2.3.jar:/Users/cmunger/.m2/repository/org/easymock/easymockclassextension/2.3/easymockclassextension-2.3.jar:/Users/cmunger/.m2/repository/cglib/cglib-nodep/2.1_3/cglib-nodep-2.1_3.jar:/Users/cmunger/.m2/repository/xmlunit/xmlunit/1.2/xmlunit-1.2.jar:/Users/cmunger/.m2/repository/org/mockito/mockito-all/1.5/mockito-all-1.5.jar:"
+        name="surefire.test.class.path"/>
+    <property value="/tmp" name="java.io.tmpdir"/>
+    <property value="http://bugreport.apple.com/" name="java.vendor.url.bug"/>
+    <property value="/tmp/launch-a2Hs8j/Listeners" name="env.SSH_AUTH_SOCK"/>
+    <property value="legacy" name="env.COMMAND_MODE"/>
+    <property value="i386" name="os.arch"/>
+    <property value="apple.awt.CGraphicsEnvironment" name="java.awt.graphicsenv"/>
+    <property
+        value="/Library/Java/Extensions:/System/Library/Java/Extensions:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/ext"
+        name="java.ext.dirs"/>
+    <property value="/Users/cmunger/dev/workspace/sonar/sonar-core" name="user.dir"/>
+    <property value="1050.1.5.0_16-284" name="mrj.version"/>
+    <property value="
+" name="line.separator"/>
+    <property value="Java HotSpot(TM) Client VM" name="java.vm.name"/>
+    <property value="/Users/cmunger/dev/workspace/sonar/sonar-core" name="basedir"/>
+    <property value="MacRoman" name="file.encoding"/>
+    <property value="1.5" name="java.specification.version"/>
+  </properties>
+  <testcase classname="org.sonar.Foo" time="0.005" name="testOne">
+    <failure type="java.lang.AssertionError" message="expected:&lt;2&gt; but was:&lt;1&gt;">java.lang.AssertionError:
+      expected:&lt;2&gt; but was:&lt;1&gt;
+      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)
+    </failure>
+  </testcase>
+  <testcase classname="org.sonar.Foo" time="0" name="testTwo">
+    <error type="java.lang.RuntimeException" message="TEST">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)
+    </error>
+  </testcase>
+</testsuite>
\ 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 (file)
index 0000000..e3f5933
--- /dev/null
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<testsuite failures="0" time="157.199" errors="18" skipped="0" tests="13025"
+           name="org.apache.commons.collections.TestAllPackages">
+  <properties>
+    <property name="java.runtime.name" value="Java(TM) SE Runtime Environment"/>
+    <property name="sun.boot.library.path"
+              value="/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Libraries"/>
+    <property name="java.vm.version" value="11.3-b02-83"/>
+  </properties>
+  <testcase time="0.012" classname="org.apache.commons.collections.bidimap.AbstractTestBidiMap"
+            name="testMapEntrySetIteratorEntrySetValueCrossCheck"/>
+  <testcase time="0.001" classname="org.apache.commons.collections.bidimap.AbstractTestBidiMap"
+            name="testMapEntrySetIteratorEntry"/>
+  <testcase time="0.001" classname="org.apache.commons.collections.bidimap.AbstractTestBidiMap$TestBidiMapEntrySet"
+            name="testCanonicalEmptyCollectionExists"/>
+  <testcase time="0" classname="org.apache.commons.collections.bidimap.AbstractTestBidiMap$TestBidiMapEntrySet"
+            name="testCanonicalFullCollectionExists"/>
+  <testcase time="0.03" classname="org.apache.commons.collections.bidimap.AbstractTestBidiMap$TestInverseBidiMap"
+            name="testMapPut"/>
+  <testcase time="0" classname="org.apache.commons.collections.bidimap.AbstractTestBidiMap$TestInverseBidiMap"
+            name="testMapPutNullKey"/>
+  <testcase time="0.001" classname="org.apache.commons.collections.bidimap.AbstractTestBidiMap$TestInverseBidiMap"
+            name="testMapPutNullValue">
+    <error
+        message="org.apache.commons.collections.FastArrayList; local class incompatible: stream classdesc serialVersionUID = 1566341225434603896, local class serialVersionUID = 7918928878747177577"
+        type="java.io.InvalidClassException">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)
+    </error>
+  </testcase>
+</testsuite>
\ 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 (file)
index 0000000..e5bd8c0
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<testsuites>
+<testsuite errors="0" skipped="1" tests="11" time="0.08" failures="0"
+           name="org.sonar.JavaNCSSCollectorTest">
+  <testcase time="0.013" name="testCollectWithPluginConfiguration"/>
+  <testcase time="0.024" name="testGetEmptyJdbcPassword"/>
+  <testcase time="6.889" name="testPopulateWithoutAnyReport"/>
+  <testcase time="0.697" name="testPopulateWithJavaNcssReport"/>
+  <testcase time="0.665" name="testPopulateWithJDependsReport"/>
+  <testcase time="0.283" name="testPopulateWithCloverReport"/>
+  <testcase time="0.592" name="testPopulateWithCheckstyleReport"/>
+  <testcase time="0.014" name="testCollectWithoutPluginConfiguration"/>
+  <testcase time="0.001" name="testCollectWithPluginConfiguration"/>
+  <testcase time="0.074" name="testCollectWithoutPluginConfiguration"/>
+  <testcase time="0.003" name="testCollectWithPluginConfiguration"/>
+</testsuite>
+<testsuite errors="0" skipped="1" tests="4" time="0.08" failures="0"
+           name="org.sonar.SecondTest">
+  <testcase time="0.014" name="testCollectWithoutPluginConfiguration"/>
+  <testcase time="0.001" name="testCollectWithPluginConfiguration"/>
+  <testcase time="0.074" name="testCollectWithoutPluginConfiguration"/>
+  <testcase time="0.003" name="testCollectWithPluginConfiguration"/>
+</testsuite>
+</testsuites>
\ 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 (file)
index 0000000..d3bb90a
--- /dev/null
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<testsuite errors="0" skipped="0" tests="2" time="0.032" failures="0" name="NoPackagesTest">
+  <properties>
+    <property value="Apple Inc." name="java.vendor"/>
+    <property value="/Users/cmunger/.m2/repository" name="localRepository"/>
+    <property value="../Resources/Eclipse.icns" name="env.APP_ICON_175"/>
+    <property value="SUN_STANDARD" name="sun.java.launcher"/>
+    <property value="HotSpot Client Compiler" name="sun.management.compiler"/>
+    <property value="6b0270" name="env.SECURITYSESSIONID"/>
+    <property value="Mac OS X" name="os.name"/>
+    <property
+        value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/classes.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/ui.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/laf.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/sunrsasign.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jsse.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jce.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/charsets.jar"
+        name="sun.boot.class.path"/>
+    <property value="/var/folders/Ea/Ea1AbxXfF6u1WpNRWAq8q++++TI/-Tmp-/" name="env.TMPDIR"/>
+    <property value="Sun Microsystems Inc." name="java.vm.specification.vendor"/>
+    <property value="1.5.0_16-b06-284" name="java.runtime.version"/>
+    <property value="/tmp/launch-sNnktt/Render" name="env.Apple_PubSub_Socket_Render"/>
+    <property value="/tmp/launch-fxz1jZ/:0" name="env.DISPLAY"/>
+    <property value="cmunger" name="user.name"/>
+    <property value="cmunger" name="env.USER"/>
+    <property value="/bin/bash" name="env.SHELL"/>
+    <property value="0x1F5:0:0" name="env.__CF_USER_TEXT_ENCODING"/>
+    <property value="true" name="awt.nativeDoubleBuffering"/>
+    <property value="/usr/bin:/bin:/usr/sbin:/sbin" name="env.PATH"/>
+    <property value="en" name="user.language"/>
+    <property value="./testDBStop52578" name="derby.system.home"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Libraries"
+              name="sun.boot.library.path"/>
+    <property value="/usr/share/apache-maven-2.0.9/bin/m2.conf" name="classworlds.conf"/>
+    <property value="1.5.0_16" name="java.version"/>
+    <property value="Europe/Zurich" name="user.timezone"/>
+    <property value="32" name="sun.arch.data.model"/>
+    <property value="local|*.local|169.254/16|*.169.254/16" name="http.nonProxyHosts"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/endorsed"
+              name="java.endorsed.dirs"/>
+    <property value="" name="sun.cpu.isalist"/>
+    <property value="MacRoman" name="sun.jnu.encoding"/>
+    <property value="sun.io" name="file.encoding.pkg"/>
+    <property value="/" name="file.separator"/>
+    <property value="Java Platform API Specification" name="java.specification.name"/>
+    <property value="49.0" name="java.class.version"/>
+    <property value="US" name="user.country"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home" name="java.home"/>
+    <property value="mixed mode, sharing" name="java.vm.info"/>
+    <property value="cmunger" name="env.LOGNAME"/>
+    <property value="10.5.6" name="os.version"/>
+    <property value=":" name="path.separator"/>
+    <property value="org.codehaus.classworlds.Launcher" name="env.JAVA_MAIN_CLASS_1410"/>
+    <property value="1.5.0_16-133" name="java.vm.version"/>
+    <property value="apple.awt.CPrinterJob" name="java.awt.printerjob"/>
+    <property value="UnicodeLittle" name="sun.io.unicode.encoding"/>
+    <property value="apple.awt.CToolkit" name="awt.toolkit"/>
+    <property value="local|*.local|169.254/16|*.169.254/16" name="socksNonProxyHosts"/>
+    <property value="1" name="env.JAVA_STARTED_ON_FIRST_THREAD_175"/>
+    <property value="local|*.local|169.254/16|*.169.254/16" name="ftp.nonProxyHosts"/>
+    <property value="/Users/cmunger" name="user.home"/>
+    <property value="Sun Microsystems Inc." name="java.specification.vendor"/>
+    <property value=".:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java"
+              name="java.library.path"/>
+    <property value="http://www.apple.com/" name="java.vendor.url"/>
+    <property value="Apple Inc." name="java.vm.vendor"/>
+    <property value="false" name="gopherProxySet"/>
+    <property value="/usr/share/apache-maven-2.0.9" name="maven.home"/>
+    <property value="Java(TM) 2 Runtime Environment, Standard Edition" name="java.runtime.name"/>
+    <property value="/usr/share/apache-maven-2.0.9/boot/classworlds-1.1.jar" name="java.class.path"/>
+    <property value="Java Virtual Machine Specification" name="java.vm.specification.name"/>
+    <property value="1.0" name="java.vm.specification.version"/>
+    <property value="little" name="sun.cpu.endian"/>
+    <property value="unknown" name="sun.os.patch.level"/>
+    <property value="/Users/cmunger" name="env.HOME"/>
+    <property
+        value="/Users/cmunger/dev/workspace/sonar/sonar-core/target/test-classes:/Users/cmunger/dev/workspace/sonar/sonar-core/target/classes:/Users/cmunger/.m2/repository/org/codehaus/sonar/sonar-commons/1.7-SNAPSHOT/sonar-commons-1.7-SNAPSHOT.jar:/Users/cmunger/.m2/repository/org/picocontainer/picocontainer/2.7/picocontainer-2.7.jar:/Users/cmunger/.m2/repository/org/slf4j/slf4j-api/1.5.0/slf4j-api-1.5.0.jar:/Users/cmunger/.m2/repository/org/slf4j/jcl104-over-slf4j/1.4.3/jcl104-over-slf4j-1.4.3.jar:/Users/cmunger/.m2/repository/ch/qos/logback/logback-classic/0.9.9/logback-classic-0.9.9.jar:/Users/cmunger/.m2/repository/ch/qos/logback/logback-core/0.9.9/logback-core-0.9.9.jar:/Users/cmunger/.m2/repository/geronimo-spec/geronimo-spec-jta/1.0-M1/geronimo-spec-jta-1.0-M1.jar:/Users/cmunger/.m2/repository/org/hibernate/hibernate/3.2.6.ga/hibernate-3.2.6.ga.jar:/Users/cmunger/.m2/repository/net/sf/ehcache/ehcache/1.2.3/ehcache-1.2.3.jar:/Users/cmunger/.m2/repository/commons-collections/commons-collections/3.2.1/commons-collections-3.2.1.jar:/Users/cmunger/.m2/repository/asm/asm-attrs/1.5.3/asm-attrs-1.5.3.jar:/Users/cmunger/.m2/repository/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar:/Users/cmunger/.m2/repository/antlr/antlr/2.7.6/antlr-2.7.6.jar:/Users/cmunger/.m2/repository/cglib/cglib/2.1_3/cglib-2.1_3.jar:/Users/cmunger/.m2/repository/asm/asm/1.5.3/asm-1.5.3.jar:/Users/cmunger/.m2/repository/org/hibernate/hibernate-annotations/3.3.1.GA/hibernate-annotations-3.3.1.GA.jar:/Users/cmunger/.m2/repository/org/hibernate/hibernate-commons-annotations/3.3.0.ga/hibernate-commons-annotations-3.3.0.ga.jar:/Users/cmunger/.m2/repository/commons-logging/commons-logging/1.1/commons-logging-1.1.jar:/Users/cmunger/.m2/repository/org/hibernate/ejb3-persistence/1.0.1.GA/ejb3-persistence-1.0.1.GA.jar:/Users/cmunger/.m2/repository/javax/persistence/persistence-api/1.0/persistence-api-1.0.jar:/Users/cmunger/.m2/repository/org/hibernate/hibernate-entitymanager/3.3.1.ga/hibernate-entitymanager-3.3.1.ga.jar:/Users/cmunger/.m2/repository/org/hibernate/hibernate-validator/3.0.0.ga/hibernate-validator-3.0.0.ga.jar:/Users/cmunger/.m2/repository/jboss/javassist/3.3.ga/javassist-3.3.ga.jar:/Users/cmunger/.m2/repository/jboss/jboss-common-core/2.0.4.GA/jboss-common-core-2.0.4.GA.jar:/Users/cmunger/.m2/repository/commons-configuration/commons-configuration/1.5/commons-configuration-1.5.jar:/Users/cmunger/.m2/repository/commons-lang/commons-lang/2.4/commons-lang-2.4.jar:/Users/cmunger/.m2/repository/commons-digester/commons-digester/1.8/commons-digester-1.8.jar:/Users/cmunger/.m2/repository/commons-beanutils/commons-beanutils/1.7.0/commons-beanutils-1.7.0.jar:/Users/cmunger/.m2/repository/commons-beanutils/commons-beanutils-core/1.7.0/commons-beanutils-core-1.7.0.jar:/Users/cmunger/.m2/repository/commons-io/commons-io/1.4/commons-io-1.4.jar:/Users/cmunger/.m2/repository/commons-dbcp/commons-dbcp/1.2.1/commons-dbcp-1.2.1.jar:/Users/cmunger/.m2/repository/commons-pool/commons-pool/1.2/commons-pool-1.2.jar:/Users/cmunger/.m2/repository/xerces/xercesImpl/2.8.1/xercesImpl-2.8.1.jar:/Users/cmunger/.m2/repository/xml-apis/xml-apis/1.3.03/xml-apis-1.3.03.jar:/Users/cmunger/.m2/repository/org/codehaus/sonar/sonar-commons/1.7-SNAPSHOT/sonar-commons-1.7-SNAPSHOT-tests.jar:/Users/cmunger/.m2/repository/org/codehaus/sonar/sonar-plugin-api/1.7-SNAPSHOT/sonar-plugin-api-1.7-SNAPSHOT.jar:/Users/cmunger/.m2/repository/commons-codec/commons-codec/1.3/commons-codec-1.3.jar:/Users/cmunger/.m2/repository/jfree/jfreechart/1.0.9/jfreechart-1.0.9.jar:/Users/cmunger/.m2/repository/jfree/jcommon/1.0.12/jcommon-1.0.12.jar:/Users/cmunger/.m2/repository/com/thoughtworks/xstream/xstream/1.3/xstream-1.3.jar:/Users/cmunger/.m2/repository/xpp3/xpp3/1.1.3.3/xpp3-1.1.3.3.jar:/Users/cmunger/.m2/repository/org/codehaus/sonar/plugins/sonar-plugin-core/1.7-SNAPSHOT/sonar-plugin-core-1.7-SNAPSHOT.jar:/Users/cmunger/.m2/repository/org/codehaus/sonar/sonar-plugin-api/1.7-SNAPSHOT/sonar-plugin-api-1.7-SNAPSHOT-tests.jar:/Users/cmunger/.m2/repository/mysql/mysql-connector-java/5.0.8/mysql-connector-java-5.0.8.jar:/Users/cmunger/.m2/repository/log4j/log4j/1.2.12/log4j-1.2.12.jar:/Users/cmunger/.m2/repository/logkit/logkit/1.0.1/logkit-1.0.1.jar:/Users/cmunger/.m2/repository/avalon-framework/avalon-framework/4.1.3/avalon-framework-4.1.3.jar:/Users/cmunger/.m2/repository/javax/servlet/servlet-api/2.3/servlet-api-2.3.jar:/Users/cmunger/.m2/repository/org/apache/derby/derby/10.4.1.3/derby-10.4.1.3.jar:/Users/cmunger/.m2/repository/org/apache/derby/derbynet/10.4.1.3/derbynet-10.4.1.3.jar:/Users/cmunger/.m2/repository/junit/junit/4.4/junit-4.4.jar:/Users/cmunger/.m2/repository/org/hamcrest/hamcrest-all/1.1/hamcrest-all-1.1.jar:/Users/cmunger/.m2/repository/org/dbunit/dbunit/2.2/dbunit-2.2.jar:/Users/cmunger/.m2/repository/junit-addons/junit-addons/1.4/junit-addons-1.4.jar:/Users/cmunger/.m2/repository/poi/poi/2.5.1-final-20040804/poi-2.5.1-final-20040804.jar:/Users/cmunger/.m2/repository/hsqldb/hsqldb/1.8.0.7/hsqldb-1.8.0.7.jar:/Users/cmunger/.m2/repository/org/apache/derby/derbyclient/10.4.1.3/derbyclient-10.4.1.3.jar:/Users/cmunger/.m2/repository/org/easymock/easymock/2.3/easymock-2.3.jar:/Users/cmunger/.m2/repository/org/easymock/easymockclassextension/2.3/easymockclassextension-2.3.jar:/Users/cmunger/.m2/repository/cglib/cglib-nodep/2.1_3/cglib-nodep-2.1_3.jar:/Users/cmunger/.m2/repository/xmlunit/xmlunit/1.2/xmlunit-1.2.jar:/Users/cmunger/.m2/repository/org/mockito/mockito-all/1.5/mockito-all-1.5.jar:"
+        name="surefire.test.class.path"/>
+    <property value="/tmp" name="java.io.tmpdir"/>
+    <property value="http://bugreport.apple.com/" name="java.vendor.url.bug"/>
+    <property value="/tmp/launch-a2Hs8j/Listeners" name="env.SSH_AUTH_SOCK"/>
+    <property value="legacy" name="env.COMMAND_MODE"/>
+    <property value="i386" name="os.arch"/>
+    <property value="apple.awt.CGraphicsEnvironment" name="java.awt.graphicsenv"/>
+    <property
+        value="/Library/Java/Extensions:/System/Library/Java/Extensions:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/ext"
+        name="java.ext.dirs"/>
+    <property value="/Users/cmunger/dev/workspace/sonar/sonar-core" name="user.dir"/>
+    <property value="1050.1.5.0_16-284" name="mrj.version"/>
+    <property value="
+" name="line.separator"/>
+    <property value="Java HotSpot(TM) Client VM" name="java.vm.name"/>
+    <property value="/Users/cmunger/dev/workspace/sonar/sonar-core" name="basedir"/>
+    <property value="MacRoman" name="file.encoding"/>
+    <property value="1.5" name="java.specification.version"/>
+  </properties>
+  <testcase classname="NoPackagesTest" time="0.001" name="test1"/>
+  <testcase classname="NoPackagesTest" time="0.001" name="test2"/>
+</testsuite>
\ 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 (file)
index 0000000..7268a35
--- /dev/null
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<testsuite errors="0" skipped="1" tests="3" time="0.032" failures="1" name="org.sonar.Foo">
+  <properties>
+    <property value="Apple Inc." name="java.vendor"/>
+    <property value="/Users/cmunger/.m2/repository" name="localRepository"/>
+    <property value="../Resources/Eclipse.icns" name="env.APP_ICON_175"/>
+    <property value="SUN_STANDARD" name="sun.java.launcher"/>
+    <property value="HotSpot Client Compiler" name="sun.management.compiler"/>
+    <property value="6b0270" name="env.SECURITYSESSIONID"/>
+    <property value="Mac OS X" name="os.name"/>
+    <property
+        value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/classes.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/ui.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/laf.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/sunrsasign.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jsse.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jce.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/charsets.jar"
+        name="sun.boot.class.path"/>
+    <property value="/var/folders/Ea/Ea1AbxXfF6u1WpNRWAq8q++++TI/-Tmp-/" name="env.TMPDIR"/>
+    <property value="Sun Microsystems Inc." name="java.vm.specification.vendor"/>
+    <property value="1.5.0_16-b06-284" name="java.runtime.version"/>
+    <property value="/tmp/launch-sNnktt/Render" name="env.Apple_PubSub_Socket_Render"/>
+    <property value="/tmp/launch-fxz1jZ/:0" name="env.DISPLAY"/>
+    <property value="cmunger" name="user.name"/>
+    <property value="cmunger" name="env.USER"/>
+    <property value="/bin/bash" name="env.SHELL"/>
+    <property value="0x1F5:0:0" name="env.__CF_USER_TEXT_ENCODING"/>
+    <property value="true" name="awt.nativeDoubleBuffering"/>
+    <property value="/usr/bin:/bin:/usr/sbin:/sbin" name="env.PATH"/>
+    <property value="en" name="user.language"/>
+    <property value="./testDBStop52578" name="derby.system.home"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Libraries"
+              name="sun.boot.library.path"/>
+    <property value="/usr/share/apache-maven-2.0.9/bin/m2.conf" name="classworlds.conf"/>
+    <property value="1.5.0_16" name="java.version"/>
+    <property value="Europe/Zurich" name="user.timezone"/>
+    <property value="32" name="sun.arch.data.model"/>
+    <property value="local|*.local|169.254/16|*.169.254/16" name="http.nonProxyHosts"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/endorsed"
+              name="java.endorsed.dirs"/>
+    <property value="" name="sun.cpu.isalist"/>
+    <property value="MacRoman" name="sun.jnu.encoding"/>
+    <property value="sun.io" name="file.encoding.pkg"/>
+    <property value="/" name="file.separator"/>
+    <property value="Java Platform API Specification" name="java.specification.name"/>
+    <property value="49.0" name="java.class.version"/>
+    <property value="US" name="user.country"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home" name="java.home"/>
+    <property value="mixed mode, sharing" name="java.vm.info"/>
+    <property value="cmunger" name="env.LOGNAME"/>
+    <property value="10.5.6" name="os.version"/>
+    <property value=":" name="path.separator"/>
+    <property value="org.codehaus.classworlds.Launcher" name="env.JAVA_MAIN_CLASS_1410"/>
+    <property value="1.5.0_16-133" name="java.vm.version"/>
+    <property value="apple.awt.CPrinterJob" name="java.awt.printerjob"/>
+    <property value="UnicodeLittle" name="sun.io.unicode.encoding"/>
+    <property value="apple.awt.CToolkit" name="awt.toolkit"/>
+    <property value="local|*.local|169.254/16|*.169.254/16" name="socksNonProxyHosts"/>
+    <property value="1" name="env.JAVA_STARTED_ON_FIRST_THREAD_175"/>
+    <property value="local|*.local|169.254/16|*.169.254/16" name="ftp.nonProxyHosts"/>
+    <property value="/Users/cmunger" name="user.home"/>
+    <property value="Sun Microsystems Inc." name="java.specification.vendor"/>
+    <property value=".:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java"
+              name="java.library.path"/>
+    <property value="http://www.apple.com/" name="java.vendor.url"/>
+    <property value="Apple Inc." name="java.vm.vendor"/>
+    <property value="false" name="gopherProxySet"/>
+    <property value="/usr/share/apache-maven-2.0.9" name="maven.home"/>
+    <property value="Java(TM) 2 Runtime Environment, Standard Edition" name="java.runtime.name"/>
+    <property value="/usr/share/apache-maven-2.0.9/boot/classworlds-1.1.jar" name="java.class.path"/>
+    <property value="Java Virtual Machine Specification" name="java.vm.specification.name"/>
+    <property value="1.0" name="java.vm.specification.version"/>
+    <property value="little" name="sun.cpu.endian"/>
+    <property value="unknown" name="sun.os.patch.level"/>
+    <property value="/Users/cmunger" name="env.HOME"/>
+    <property
+        value="/Users/cmunger/dev/workspace/sonar/sonar-core/target/test-classes:/Users/cmunger/dev/workspace/sonar/sonar-core/target/classes:/Users/cmunger/.m2/repository/org/codehaus/sonar/sonar-commons/1.7-SNAPSHOT/sonar-commons-1.7-SNAPSHOT.jar:/Users/cmunger/.m2/repository/org/picocontainer/picocontainer/2.7/picocontainer-2.7.jar:/Users/cmunger/.m2/repository/org/slf4j/slf4j-api/1.5.0/slf4j-api-1.5.0.jar:/Users/cmunger/.m2/repository/org/slf4j/jcl104-over-slf4j/1.4.3/jcl104-over-slf4j-1.4.3.jar:/Users/cmunger/.m2/repository/ch/qos/logback/logback-classic/0.9.9/logback-classic-0.9.9.jar:/Users/cmunger/.m2/repository/ch/qos/logback/logback-core/0.9.9/logback-core-0.9.9.jar:/Users/cmunger/.m2/repository/geronimo-spec/geronimo-spec-jta/1.0-M1/geronimo-spec-jta-1.0-M1.jar:/Users/cmunger/.m2/repository/org/hibernate/hibernate/3.2.6.ga/hibernate-3.2.6.ga.jar:/Users/cmunger/.m2/repository/net/sf/ehcache/ehcache/1.2.3/ehcache-1.2.3.jar:/Users/cmunger/.m2/repository/commons-collections/commons-collections/3.2.1/commons-collections-3.2.1.jar:/Users/cmunger/.m2/repository/asm/asm-attrs/1.5.3/asm-attrs-1.5.3.jar:/Users/cmunger/.m2/repository/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar:/Users/cmunger/.m2/repository/antlr/antlr/2.7.6/antlr-2.7.6.jar:/Users/cmunger/.m2/repository/cglib/cglib/2.1_3/cglib-2.1_3.jar:/Users/cmunger/.m2/repository/asm/asm/1.5.3/asm-1.5.3.jar:/Users/cmunger/.m2/repository/org/hibernate/hibernate-annotations/3.3.1.GA/hibernate-annotations-3.3.1.GA.jar:/Users/cmunger/.m2/repository/org/hibernate/hibernate-commons-annotations/3.3.0.ga/hibernate-commons-annotations-3.3.0.ga.jar:/Users/cmunger/.m2/repository/commons-logging/commons-logging/1.1/commons-logging-1.1.jar:/Users/cmunger/.m2/repository/org/hibernate/ejb3-persistence/1.0.1.GA/ejb3-persistence-1.0.1.GA.jar:/Users/cmunger/.m2/repository/javax/persistence/persistence-api/1.0/persistence-api-1.0.jar:/Users/cmunger/.m2/repository/org/hibernate/hibernate-entitymanager/3.3.1.ga/hibernate-entitymanager-3.3.1.ga.jar:/Users/cmunger/.m2/repository/org/hibernate/hibernate-validator/3.0.0.ga/hibernate-validator-3.0.0.ga.jar:/Users/cmunger/.m2/repository/jboss/javassist/3.3.ga/javassist-3.3.ga.jar:/Users/cmunger/.m2/repository/jboss/jboss-common-core/2.0.4.GA/jboss-common-core-2.0.4.GA.jar:/Users/cmunger/.m2/repository/commons-configuration/commons-configuration/1.5/commons-configuration-1.5.jar:/Users/cmunger/.m2/repository/commons-lang/commons-lang/2.4/commons-lang-2.4.jar:/Users/cmunger/.m2/repository/commons-digester/commons-digester/1.8/commons-digester-1.8.jar:/Users/cmunger/.m2/repository/commons-beanutils/commons-beanutils/1.7.0/commons-beanutils-1.7.0.jar:/Users/cmunger/.m2/repository/commons-beanutils/commons-beanutils-core/1.7.0/commons-beanutils-core-1.7.0.jar:/Users/cmunger/.m2/repository/commons-io/commons-io/1.4/commons-io-1.4.jar:/Users/cmunger/.m2/repository/commons-dbcp/commons-dbcp/1.2.1/commons-dbcp-1.2.1.jar:/Users/cmunger/.m2/repository/commons-pool/commons-pool/1.2/commons-pool-1.2.jar:/Users/cmunger/.m2/repository/xerces/xercesImpl/2.8.1/xercesImpl-2.8.1.jar:/Users/cmunger/.m2/repository/xml-apis/xml-apis/1.3.03/xml-apis-1.3.03.jar:/Users/cmunger/.m2/repository/org/codehaus/sonar/sonar-commons/1.7-SNAPSHOT/sonar-commons-1.7-SNAPSHOT-tests.jar:/Users/cmunger/.m2/repository/org/codehaus/sonar/sonar-plugin-api/1.7-SNAPSHOT/sonar-plugin-api-1.7-SNAPSHOT.jar:/Users/cmunger/.m2/repository/commons-codec/commons-codec/1.3/commons-codec-1.3.jar:/Users/cmunger/.m2/repository/jfree/jfreechart/1.0.9/jfreechart-1.0.9.jar:/Users/cmunger/.m2/repository/jfree/jcommon/1.0.12/jcommon-1.0.12.jar:/Users/cmunger/.m2/repository/com/thoughtworks/xstream/xstream/1.3/xstream-1.3.jar:/Users/cmunger/.m2/repository/xpp3/xpp3/1.1.3.3/xpp3-1.1.3.3.jar:/Users/cmunger/.m2/repository/org/codehaus/sonar/plugins/sonar-plugin-core/1.7-SNAPSHOT/sonar-plugin-core-1.7-SNAPSHOT.jar:/Users/cmunger/.m2/repository/org/codehaus/sonar/sonar-plugin-api/1.7-SNAPSHOT/sonar-plugin-api-1.7-SNAPSHOT-tests.jar:/Users/cmunger/.m2/repository/mysql/mysql-connector-java/5.0.8/mysql-connector-java-5.0.8.jar:/Users/cmunger/.m2/repository/log4j/log4j/1.2.12/log4j-1.2.12.jar:/Users/cmunger/.m2/repository/logkit/logkit/1.0.1/logkit-1.0.1.jar:/Users/cmunger/.m2/repository/avalon-framework/avalon-framework/4.1.3/avalon-framework-4.1.3.jar:/Users/cmunger/.m2/repository/javax/servlet/servlet-api/2.3/servlet-api-2.3.jar:/Users/cmunger/.m2/repository/org/apache/derby/derby/10.4.1.3/derby-10.4.1.3.jar:/Users/cmunger/.m2/repository/org/apache/derby/derbynet/10.4.1.3/derbynet-10.4.1.3.jar:/Users/cmunger/.m2/repository/junit/junit/4.4/junit-4.4.jar:/Users/cmunger/.m2/repository/org/hamcrest/hamcrest-all/1.1/hamcrest-all-1.1.jar:/Users/cmunger/.m2/repository/org/dbunit/dbunit/2.2/dbunit-2.2.jar:/Users/cmunger/.m2/repository/junit-addons/junit-addons/1.4/junit-addons-1.4.jar:/Users/cmunger/.m2/repository/poi/poi/2.5.1-final-20040804/poi-2.5.1-final-20040804.jar:/Users/cmunger/.m2/repository/hsqldb/hsqldb/1.8.0.7/hsqldb-1.8.0.7.jar:/Users/cmunger/.m2/repository/org/apache/derby/derbyclient/10.4.1.3/derbyclient-10.4.1.3.jar:/Users/cmunger/.m2/repository/org/easymock/easymock/2.3/easymock-2.3.jar:/Users/cmunger/.m2/repository/org/easymock/easymockclassextension/2.3/easymockclassextension-2.3.jar:/Users/cmunger/.m2/repository/cglib/cglib-nodep/2.1_3/cglib-nodep-2.1_3.jar:/Users/cmunger/.m2/repository/xmlunit/xmlunit/1.2/xmlunit-1.2.jar:/Users/cmunger/.m2/repository/org/mockito/mockito-all/1.5/mockito-all-1.5.jar:"
+        name="surefire.test.class.path"/>
+    <property value="/tmp" name="java.io.tmpdir"/>
+    <property value="http://bugreport.apple.com/" name="java.vendor.url.bug"/>
+    <property value="/tmp/launch-a2Hs8j/Listeners" name="env.SSH_AUTH_SOCK"/>
+    <property value="legacy" name="env.COMMAND_MODE"/>
+    <property value="i386" name="os.arch"/>
+    <property value="apple.awt.CGraphicsEnvironment" name="java.awt.graphicsenv"/>
+    <property
+        value="/Library/Java/Extensions:/System/Library/Java/Extensions:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/ext"
+        name="java.ext.dirs"/>
+    <property value="/Users/cmunger/dev/workspace/sonar/sonar-core" name="user.dir"/>
+    <property value="1050.1.5.0_16-284" name="mrj.version"/>
+    <property value="
+" name="line.separator"/>
+    <property value="Java HotSpot(TM) Client VM" name="java.vm.name"/>
+    <property value="/Users/cmunger/dev/workspace/sonar/sonar-core" name="basedir"/>
+    <property value="MacRoman" name="file.encoding"/>
+    <property value="1.5" name="java.specification.version"/>
+  </properties>
+  <testcase classname="org.sonar.Foo" time="0.005" name="testOne">
+    <failure type="java.lang.AssertionError" message="expected:&lt;2&gt; but was:&lt;1&gt;">java.lang.AssertionError:
+      expected:&lt;2&gt; but was:&lt;1&gt;
+      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)
+    </failure>
+  </testcase>
+  <testcase classname="org.sonar.Foo" time="0.20" name="testTwo"/>
+  <testcase classname="org.sonar.Foo" time="0.10" name="skippedTest">
+    <skipped/>
+  </testcase>
+</testsuite>
\ 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 (file)
index 0000000..9984c04
--- /dev/null
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<testsuite errors="0" skipped="1" tests="1" time="0" failures="0" name="org.apache.shindig.protocol.TestHandler$Input">
+  <properties>
+    <property value="Java(TM) 2 Runtime Environment, Standard Edition" name="java.runtime.name"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Libraries" name="sun.boot.library.path"/>
+    <property value="1.5.0_19-137" name="java.vm.version"/>
+    <property value="true" name="awt.nativeDoubleBuffering"/>
+    <property value="false" name="gopherProxySet"/>
+    <property value="Apple Inc." name="java.vm.vendor"/>
+    <property value="http://www.apple.com/" name="java.vendor.url"/>
+    <property value=":" name="path.separator"/>
+    <property value="Java HotSpot(TM) Client VM" name="java.vm.name"/>
+    <property value="sun.io" name="file.encoding.pkg"/>
+    <property value="target/test-classes/logging.properties" name="java.util.logging.config.file"/>
+    <property value="US" name="user.country"/>
+    <property value="SUN_STANDARD" name="sun.java.launcher"/>
+    <property value="unknown" name="sun.os.patch.level"/>
+    <property value="Java Virtual Machine Specification" name="java.vm.specification.name"/>
+    <property value="/Users/simon/projects/shindig/java/common" name="user.dir"/>
+    <property value="1.5.0_19-b02-304" name="java.runtime.version"/>
+    <property value="apple.awt.CGraphicsEnvironment" name="java.awt.graphicsenv"/>
+    <property value="/Users/simon/projects/shindig/java/common" name="basedir"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/endorsed" name="java.endorsed.dirs"/>
+    <property value="i386" name="os.arch"/>
+    <property value="/var/folders/uV/uVfBAWUpFX0gPfeUuu2yaU+++TI/-Tmp-/surefirebooter4356411895122546772.jar" name="surefire.real.class.path"/>
+    <property value="/var/folders/uV/uVfBAWUpFX0gPfeUuu2yaU+++TI/-Tmp-/" name="java.io.tmpdir"/>
+    <property value="
+" name="line.separator"/>
+    <property value="Sun Microsystems Inc." name="java.vm.specification.vendor"/>
+    <property value="Mac OS X" name="os.name"/>
+    <property value="MacRoman" name="sun.jnu.encoding"/>
+    <property value="/Applications/jprofiler5/bin/macos:.:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java" name="java.library.path"/>
+    <property value="/Users/simon/projects/shindig/java/common/target/test-classes:/Users/simon/projects/shindig/java/common/target/generated-classes/cobertura:/Users/simon/.m2/repository/net/oauth/core/oauth/20090531/oauth-20090531.jar:/Users/simon/.m2/repository/commons-codec/commons-codec/1.3/commons-codec-1.3.jar:/Users/simon/.m2/repository/aopalliance/aopalliance/1.0/aopalliance-1.0.jar:/Users/simon/.m2/repository/commons-lang/commons-lang/2.4/commons-lang-2.4.jar:/Users/simon/.m2/repository/javax/servlet/servlet-api/2.4/servlet-api-2.4.jar:/Users/simon/.m2/repository/net/sourceforge/cobertura/cobertura/1.9/cobertura-1.9.jar:/Users/simon/.m2/repository/org/apache/ant/ant/1.7.0/ant-1.7.0.jar:/Users/simon/.m2/repository/org/apache/ant/ant-launcher/1.7.0/ant-launcher-1.7.0.jar:/Users/simon/.m2/repository/joda-time/joda-time/1.6/joda-time-1.6.jar:/Users/simon/.m2/repository/net/sf/ehcache/ehcache/1.6.1/ehcache-1.6.1.jar:/Users/simon/.m2/repository/xml-apis/xml-apis/1.3.04/xml-apis-1.3.04.jar:/Users/simon/.m2/repository/de/odysseus/juel/juel-impl/2.1.2/juel-impl-2.1.2.jar:/Users/simon/.m2/repository/de/odysseus/juel/juel-api/2.1.2/juel-api-2.1.2.jar:/Users/simon/.m2/repository/commons-fileupload/commons-fileupload/1.2/commons-fileupload-1.2.jar:/Users/simon/.m2/repository/org/json/json/20070829/json-20070829.jar:/Users/simon/.m2/repository/commons-io/commons-io/1.4/commons-io-1.4.jar:/Users/simon/.m2/repository/com/thoughtworks/xstream/xstream/1.3.1/xstream-1.3.1.jar:/Users/simon/.m2/repository/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.jar:/Users/simon/.m2/repository/xmlunit/xmlunit/1.2/xmlunit-1.2.jar:/Users/simon/.m2/repository/org/easymock/easymockclassextension/2.4/easymockclassextension-2.4.jar:/Users/simon/.m2/repository/org/easymock/easymock/2.5.1/easymock-2.5.1.jar:/Users/simon/.m2/repository/cglib/cglib-nodep/2.1_3/cglib-nodep-2.1_3.jar:/Users/simon/.m2/repository/junit/junit/4.5/junit-4.5.jar:/Users/simon/.m2/repository/junit-addons/junit-addons/1.4/junit-addons-1.4.jar:/Users/simon/.m2/repository/xerces/xercesImpl/2.9.1/xercesImpl-2.9.1.jar:/Users/simon/.m2/repository/xerces/xmlParserAPIs/2.6.2/xmlParserAPIs-2.6.2.jar:/Users/simon/.m2/repository/com/google/collections/google-collections/1.0-rc2/google-collections-1.0-rc2.jar:/Users/simon/.m2/repository/com/google/code/guice/guice/2.0/guice-2.0.jar:/Users/simon/.m2/repository/commons-betwixt/commons-betwixt/0.8/commons-betwixt-0.8.jar:/Users/simon/.m2/repository/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar:/Users/simon/.m2/repository/commons-beanutils/commons-beanutils-core/1.7.0/commons-beanutils-core-1.7.0.jar:/Users/simon/.m2/repository/commons-collections/commons-collections/3.2.1/commons-collections-3.2.1.jar:/Users/simon/.m2/repository/commons-digester/commons-digester/1.7/commons-digester-1.7.jar:/Users/simon/.m2/repository/commons-beanutils/commons-beanutils/1.6/commons-beanutils-1.6.jar:" name="surefire.test.class.path"/>
+    <property value="Java Platform API Specification" name="java.specification.name"/>
+    <property value="49.0" name="java.class.version"/>
+    <property value="HotSpot Client Compiler" name="sun.management.compiler"/>
+    <property value="10.5.8" name="os.version"/>
+    <property value="local|*.local|169.254/16|*.169.254/16" name="http.nonProxyHosts"/>
+    <property value="/Users/simon" name="user.home"/>
+    <property value="Europe/Zurich" name="user.timezone"/>
+    <property value="apple.awt.CPrinterJob" name="java.awt.printerjob"/>
+    <property value="1.5" name="java.specification.version"/>
+    <property value="MacRoman" name="file.encoding"/>
+    <property value="simon" name="user.name"/>
+    <property value="/Users/simon/projects/shindig/java/common/target/test-classes:/Users/simon/projects/shindig/java/common/target/generated-classes/cobertura:/Users/simon/.m2/repository/net/oauth/core/oauth/20090531/oauth-20090531.jar:/Users/simon/.m2/repository/commons-codec/commons-codec/1.3/commons-codec-1.3.jar:/Users/simon/.m2/repository/aopalliance/aopalliance/1.0/aopalliance-1.0.jar:/Users/simon/.m2/repository/commons-lang/commons-lang/2.4/commons-lang-2.4.jar:/Users/simon/.m2/repository/javax/servlet/servlet-api/2.4/servlet-api-2.4.jar:/Users/simon/.m2/repository/net/sourceforge/cobertura/cobertura/1.9/cobertura-1.9.jar:/Users/simon/.m2/repository/org/apache/ant/ant/1.7.0/ant-1.7.0.jar:/Users/simon/.m2/repository/org/apache/ant/ant-launcher/1.7.0/ant-launcher-1.7.0.jar:/Users/simon/.m2/repository/joda-time/joda-time/1.6/joda-time-1.6.jar:/Users/simon/.m2/repository/net/sf/ehcache/ehcache/1.6.1/ehcache-1.6.1.jar:/Users/simon/.m2/repository/xml-apis/xml-apis/1.3.04/xml-apis-1.3.04.jar:/Users/simon/.m2/repository/de/odysseus/juel/juel-impl/2.1.2/juel-impl-2.1.2.jar:/Users/simon/.m2/repository/de/odysseus/juel/juel-api/2.1.2/juel-api-2.1.2.jar:/Users/simon/.m2/repository/commons-fileupload/commons-fileupload/1.2/commons-fileupload-1.2.jar:/Users/simon/.m2/repository/org/json/json/20070829/json-20070829.jar:/Users/simon/.m2/repository/commons-io/commons-io/1.4/commons-io-1.4.jar:/Users/simon/.m2/repository/com/thoughtworks/xstream/xstream/1.3.1/xstream-1.3.1.jar:/Users/simon/.m2/repository/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.jar:/Users/simon/.m2/repository/xmlunit/xmlunit/1.2/xmlunit-1.2.jar:/Users/simon/.m2/repository/org/easymock/easymockclassextension/2.4/easymockclassextension-2.4.jar:/Users/simon/.m2/repository/org/easymock/easymock/2.5.1/easymock-2.5.1.jar:/Users/simon/.m2/repository/cglib/cglib-nodep/2.1_3/cglib-nodep-2.1_3.jar:/Users/simon/.m2/repository/junit/junit/4.5/junit-4.5.jar:/Users/simon/.m2/repository/junit-addons/junit-addons/1.4/junit-addons-1.4.jar:/Users/simon/.m2/repository/xerces/xercesImpl/2.9.1/xercesImpl-2.9.1.jar:/Users/simon/.m2/repository/xerces/xmlParserAPIs/2.6.2/xmlParserAPIs-2.6.2.jar:/Users/simon/.m2/repository/com/google/collections/google-collections/1.0-rc2/google-collections-1.0-rc2.jar:/Users/simon/.m2/repository/com/google/code/guice/guice/2.0/guice-2.0.jar:/Users/simon/.m2/repository/commons-betwixt/commons-betwixt/0.8/commons-betwixt-0.8.jar:/Users/simon/.m2/repository/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar:/Users/simon/.m2/repository/commons-beanutils/commons-beanutils-core/1.7.0/commons-beanutils-core-1.7.0.jar:/Users/simon/.m2/repository/commons-collections/commons-collections/3.2.1/commons-collections-3.2.1.jar:/Users/simon/.m2/repository/commons-digester/commons-digester/1.7/commons-digester-1.7.jar:/Users/simon/.m2/repository/commons-beanutils/commons-beanutils/1.6/commons-beanutils-1.6.jar:" name="java.class.path"/>
+    <property value="1.0" name="java.vm.specification.version"/>
+    <property value="32" name="sun.arch.data.model"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home" name="java.home"/>
+    <property value="Sun Microsystems Inc." name="java.specification.vendor"/>
+    <property value="en" name="user.language"/>
+    <property value="apple.awt.CToolkit" name="awt.toolkit"/>
+    <property value="mixed mode, sharing" name="java.vm.info"/>
+    <property value="1.5.0_19" name="java.version"/>
+    <property value="/Library/Java/Extensions:/System/Library/Java/Extensions:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/ext" name="java.ext.dirs"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jsfd.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/classes.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/ui.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/laf.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/sunrsasign.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jsse.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jce.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/charsets.jar" name="sun.boot.class.path"/>
+    <property value="Apple Inc." name="java.vendor"/>
+    <property value="/Users/simon/.m2/repository" name="localRepository"/>
+    <property value="/" name="file.separator"/>
+    <property value="http://bugreport.apple.com/" name="java.vendor.url.bug"/>
+    <property value="little" name="sun.cpu.endian"/>
+    <property value="UnicodeLittle" name="sun.io.unicode.encoding"/>
+    <property value="1050.1.5.0_19-304" name="mrj.version"/>
+    <property value="local|*.local|169.254/16|*.169.254/16" name="socksNonProxyHosts"/>
+    <property value="local|*.local|169.254/16|*.169.254/16" name="ftp.nonProxyHosts"/>
+    <property value="" name="sun.cpu.isalist"/>
+  </properties>
+  <testcase classname="org.apache.shindig.protocol.TestHandler$Input" time="0.007" name="org.apache.shindig.protocol.TestHandler$Input">
+    <skipped/>
+  </testcase>
+</testsuite>
\ 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 (file)
index 0000000..fb55bf5
--- /dev/null
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<testsuite errors="0" skipped="0" tests="0" time="1,134.193" failures="0"
+           name="ch.hortis.sonar.mvn.mc.CheckstyleCollectorTest">
+  <properties>
+    <property value="Java(TM) 2 Runtime Environment, Standard Edition" name="java.runtime.name"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Libraries"
+              name="sun.boot.library.path"/>
+    <property value="1.5.0_06-64" name="java.vm.version"/>
+    <property value="true" name="awt.nativeDoubleBuffering"/>
+    <property value="false" name="gopherProxySet"/>
+    <property value="&quot;Apple Computer, Inc.&quot;" name="java.vm.vendor"/>
+    <property value="http://apple.com/" name="java.vendor.url"/>
+    <property value=":" name="path.separator"/>
+    <property value="Java HotSpot(TM) Client VM" name="java.vm.name"/>
+    <property value="sun.io" name="file.encoding.pkg"/>
+    <property value="FR" name="user.country"/>
+    <property value="unknown" name="sun.os.patch.level"/>
+    <property value="Java Virtual Machine Specification" name="java.vm.specification.name"/>
+    <property value="/Users/cmunger/Documents/workspace/sonar/sonar-maven-plugin" name="user.dir"/>
+    <property value="1.5.0_06-112" name="java.runtime.version"/>
+    <property value="apple.awt.CGraphicsEnvironment" name="java.awt.graphicsenv"/>
+    <property value="/Users/cmunger/Documents/workspace/sonar/sonar-maven-plugin" name="basedir"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/endorsed"
+              name="java.endorsed.dirs"/>
+    <property value="ppc" name="os.arch"/>
+    <property value="/tmp" name="java.io.tmpdir"/>
+    <property value="
+" name="line.separator"/>
+    <property value="Sun Microsystems Inc." name="java.vm.specification.vendor"/>
+    <property value="Mac OS X" name="os.name"/>
+    <property value="MacRoman" name="sun.jnu.encoding"/>
+    <property value=".:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java"
+              name="java.library.path"/>
+    <property value="Java Platform API Specification" name="java.specification.name"/>
+    <property value="49.0" name="java.class.version"/>
+    <property value="HotSpot Client Compiler" name="sun.management.compiler"/>
+    <property value="10.4.8" name="os.version"/>
+    <property value="/Users/cmunger" name="user.home"/>
+    <property value="" name="user.timezone"/>
+    <property value="apple.awt.CPrinterJob" name="java.awt.printerjob"/>
+    <property value="MacRoman" name="file.encoding"/>
+    <property value="1.5" name="java.specification.version"/>
+    <property value="cmunger" name="user.name"/>
+    <property
+        value="/Users/cmunger/.m2/repository/org/apache/maven/surefire/surefire-api/2.0/surefire-api-2.0.jar:/Users/cmunger/.m2/repository/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.jar:/Users/cmunger/.m2/repository/org/apache/maven/surefire/surefire-booter/2.0/surefire-booter-2.0.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/.compatibility/14compatibility.jar"
+        name="java.class.path"/>
+    <property value="1.0" name="java.vm.specification.version"/>
+    <property value="32" name="sun.arch.data.model"/>
+    <property value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home" name="java.home"/>
+    <property value="Sun Microsystems Inc." name="java.specification.vendor"/>
+    <property value="fr" name="user.language"/>
+    <property value="apple.awt.CToolkit" name="awt.toolkit"/>
+    <property value="mixed mode, sharing" name="java.vm.info"/>
+    <property value="1.5.0_06" name="java.version"/>
+    <property
+        value="/Library/Java/Extensions:/System/Library/Java/Extensions:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/ext"
+        name="java.ext.dirs"/>
+    <property
+        value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/classes.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/ui.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/laf.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/sunrsasign.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jsse.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jce.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/charsets.jar"
+        name="sun.boot.class.path"/>
+    <property value="Apple Computer, Inc." name="java.vendor"/>
+    <property value="/Users/cmunger/.m2/repository" name="localRepository"/>
+    <property value="/" name="file.separator"/>
+    <property value="http://developer.apple.com/java/" name="java.vendor.url.bug"/>
+    <property value="big" name="sun.cpu.endian"/>
+    <property value="UnicodeBig" name="sun.io.unicode.encoding"/>
+    <property value="1040.1.5.0_06-112" name="mrj.version"/>
+    <property value="" name="sun.cpu.isalist"/>
+  </properties>
+</testsuite>
\ No newline at end of file