Skip to content

Commit

Permalink
Merge pull request #1709 from guwirth/OpenCppCoverage-support
Browse files Browse the repository at this point in the history
support OpenCppCoverage Corbertura file format
  • Loading branch information
guwirth authored Apr 17, 2019
2 parents 3491006 + e6b8334 commit 6f2bd6c
Show file tree
Hide file tree
Showing 2 changed files with 140 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<Path> baseDir;
private Path baseDir = Paths.get(".");

public CoberturaParser() {
// no operation but necessary for list of coverage parsers
Expand Down Expand Up @@ -79,7 +78,7 @@ private static void collectFileData(SMInputCursor clazz, CoverageMeasures builde
public void processReport(File report, final Map<String, CoverageMeasures> coverageData)
throws XMLStreamException {
LOG.debug("Parsing 'Cobertura' format");
baseDir = Optional.empty();
baseDir = Paths.get(".");

StaxParser sourceParser = new StaxParser((SMHierarchicCursor rootCursor) -> {
rootCursor.advance();
Expand All @@ -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;
}
}
Expand All @@ -116,24 +116,56 @@ private void collectPackageMeasures(SMInputCursor pack, Map<String, CoverageMeas
}
}

private String buildPath(String filename) {
Path result = Paths.get(filename);
if (baseDir.isPresent()) {
result = baseDir.get().resolve(result);
/**
* Join two paths
*
* 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
*
* @param path1 first path
* @param path2 second path to be joined to first path
* @return joined path as string
*/
public static String join(Path path1, Path path2) {
if (path2.toString().isEmpty()) {
return "";
}
if (!path1.isAbsolute()) {
path1 = Paths.get(".", path1.toString());
}
return result.normalize().toString();
if (!path2.isAbsolute()) {
path2 = Paths.get(".", path2.toString());
}

Path result = path1.resolve(path2).normalize();
if (!result.isAbsolute()) {
result = Paths.get(".", result.toString());
}

return result.toString();
}

private void collectFileMeasures(SMInputCursor clazz, Map<String, CoverageMeasures> 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);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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());
Expand Down

0 comments on commit 6f2bd6c

Please sign in to comment.