diff --git a/cxx-sensors/src/main/java/org/sonar/cxx/sensors/coverage/CoberturaParser.java b/cxx-sensors/src/main/java/org/sonar/cxx/sensors/coverage/CoberturaParser.java index 7493ae0e66..0f339ea477 100644 --- a/cxx-sensors/src/main/java/org/sonar/cxx/sensors/coverage/CoberturaParser.java +++ b/cxx-sensors/src/main/java/org/sonar/cxx/sensors/coverage/CoberturaParser.java @@ -23,7 +23,6 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.Map; -import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.xml.stream.XMLStreamException; @@ -41,7 +40,7 @@ public class CoberturaParser extends CxxCoverageParser { private static final Logger LOG = Loggers.get(CoberturaParser.class); private static final Pattern CONDITION_PATTERN = Pattern.compile("\\((.*?)\\)"); - private Optional baseDir; + private Path baseDir = Paths.get("."); public CoberturaParser() { // no operation but necessary for list of coverage parsers @@ -79,7 +78,7 @@ private static void collectFileData(SMInputCursor clazz, CoverageMeasures builde public void processReport(File report, final Map coverageData) throws XMLStreamException { LOG.debug("Parsing 'Cobertura' format"); - baseDir = Optional.empty(); + baseDir = Paths.get("."); StaxParser sourceParser = new StaxParser((SMHierarchicCursor rootCursor) -> { rootCursor.advance(); @@ -103,7 +102,8 @@ private void readBaseDir(SMInputCursor source) throws XMLStreamException { while (source.getNext() != null) { String sourceValue = source.getElemStringValue().trim(); if (!sourceValue.isEmpty()) { - baseDir = Optional.of(Paths.get(sourceValue)); + // join with . to handle also special cases like drive letter only, e.g. C: + baseDir = Paths.get(sourceValue, ".").normalize(); break; } } @@ -116,24 +116,56 @@ private void collectPackageMeasures(SMInputCursor pack, Map coverageData) - throws XMLStreamException { + throws XMLStreamException { while (clazz.getNext() != null) { - String normalPath = buildPath(clazz.getAttrValue("filename")); - CoverageMeasures builder = coverageData.get(normalPath); - if (builder == null) { - builder = CoverageMeasures.create(); - coverageData.put(normalPath, builder); + String normalPath = join(baseDir, Paths.get(clazz.getAttrValue("filename"))); + if (!normalPath.isEmpty()) { + CoverageMeasures builder = coverageData.get(normalPath); + if (builder == null) { + builder = CoverageMeasures.create(); + coverageData.put(normalPath, builder); + } + collectFileData(clazz, builder); } - collectFileData(clazz, builder); } } diff --git a/cxx-sensors/src/test/java/org/sonar/cxx/sensors/coverage/CxxCoberturaSensorTest.java b/cxx-sensors/src/test/java/org/sonar/cxx/sensors/coverage/CxxCoberturaSensorTest.java index c8e16b1e89..5cfa68b358 100644 --- a/cxx-sensors/src/test/java/org/sonar/cxx/sensors/coverage/CxxCoberturaSensorTest.java +++ b/cxx-sensors/src/test/java/org/sonar/cxx/sensors/coverage/CxxCoberturaSensorTest.java @@ -20,6 +20,8 @@ package org.sonar.cxx.sensors.coverage; import java.io.File; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -56,6 +58,96 @@ public void setUp() { .thenReturn("sonar.cxx." + CxxCoverageSensor.REPORT_PATH_KEY); } + @Test + public void testPathJoin() { + Path empty = Paths.get(""); + String result; + /* + * path1 | path2 | result + * ---------|----------|------- + * empty | empty | empty + * empty | absolute | absolute path2 + * empty | relative | relative path2 + * absolute | empty | empty + * relative | empty | empty + * absolute | absolute | absolute path2 + * absolute | relative | absolute path1 + relative path2 + * relative | absolute | absolute path2 + * relative | relative | relative path1 + relative path2 + */ + + if (TestUtils.isWindows()) { + + // Windows + Path abs1 = Paths.get("c:\\test1"); + Path rel1 = Paths.get("\\test1"); + Path abs2 = Paths.get("c:\\test2\\report.txt"); + Path rel2 = Paths.get("\\test2\\report.txt"); + + result = CoberturaParser.join(empty, empty); + assertThat(result).isEqualTo(""); + + result = CoberturaParser.join(empty, abs2); + assertThat(result).isEqualTo("c:\\test2\\report.txt"); + + result = CoberturaParser.join(empty, rel2); + assertThat(result).isEqualTo(".\\test2\\report.txt"); + + result = CoberturaParser.join(abs1, empty); + assertThat(result).isEqualTo(""); + + result = CoberturaParser.join(rel1, empty); + assertThat(result).isEqualTo(""); + + result = CoberturaParser.join(abs1, abs2); + assertThat(result).isEqualTo("c:\\test2\\report.txt"); + + result = CoberturaParser.join(abs1, rel2); + assertThat(result).isEqualTo("c:\\test1\\test2\\report.txt"); + + result = CoberturaParser.join(rel1, abs2); + assertThat(result).isEqualTo("c:\\test2\\report.txt"); + + result = CoberturaParser.join(rel1, rel2); + assertThat(result).isEqualTo(".\\test1\\test2\\report.txt"); + } else { + + // Linux + Path abs1 = Paths.get("/home/test1"); + Path rel1 = Paths.get("test1"); + Path abs2 = Paths.get("/home/test2/report.txt"); + Path rel2 = Paths.get("test2/report.txt"); + + result = CoberturaParser.join(empty, empty); + assertThat(result).isEqualTo(""); + + result = CoberturaParser.join(empty, abs2); + assertThat(result).isEqualTo("/home/test2/report.txt"); + + result = CoberturaParser.join(empty, rel2); + assertThat(result).isEqualTo("./test2/report.txt"); + + result = CoberturaParser.join(abs1, empty); + assertThat(result).isEqualTo(""); + + result = CoberturaParser.join(rel1, empty); + assertThat(result).isEqualTo(""); + + result = CoberturaParser.join(abs1, abs2); + assertThat(result).isEqualTo("/home/test2/report.txt"); + + result = CoberturaParser.join(abs1, rel2); + assertThat(result).isEqualTo("/home/test1/test2/report.txt"); + + result = CoberturaParser.join(rel1, abs2); + assertThat(result).isEqualTo("/home/test2/report.txt"); + + result = CoberturaParser.join(rel1, rel2); + assertThat(result).isEqualTo("./test1/test2/report.txt"); + } + + } + @Test public void shouldReportCorrectCoverageForAllTypesOfCoverage() { SensorContextTester context = SensorContextTester.create(fs.baseDir());