From 5418870b5d5cb44be6a3cd4852b810c7d83acaf6 Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Mon, 19 Sep 2022 00:05:25 +0200 Subject: [PATCH] Try to expose NPE with Cobertura parser in #473. See https://github.com/jenkinsci/code-coverage-api-plugin/issues/473 Seems that our parser already handles that file correctly. --- .../coverage/model/AbstractCoverageTest.java | 22 +++ .../coverage/model/CoverageNodeTest.java | 26 +++ .../plugins/coverage/model/cobertura-npe.xml | 166 ++++++++++++++++++ 3 files changed, 214 insertions(+) create mode 100644 plugin/src/test/resources/io/jenkins/plugins/coverage/model/cobertura-npe.xml diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/model/AbstractCoverageTest.java b/plugin/src/test/java/io/jenkins/plugins/coverage/model/AbstractCoverageTest.java index d13610002..ebdb73f3f 100644 --- a/plugin/src/test/java/io/jenkins/plugins/coverage/model/AbstractCoverageTest.java +++ b/plugin/src/test/java/io/jenkins/plugins/coverage/model/AbstractCoverageTest.java @@ -4,6 +4,7 @@ import edu.hm.hafner.util.ResourceTest; +import io.jenkins.plugins.coverage.adapter.CoberturaReportAdapter; import io.jenkins.plugins.coverage.adapter.JacocoReportAdapter; import io.jenkins.plugins.coverage.adapter.JacocoReportAdapter.JacocoReportAdapterDescriptor; import io.jenkins.plugins.coverage.exception.CoverageException; @@ -47,6 +48,27 @@ public CoverageResult readResult(final String fileName) { } } + /** + * Reads the {@link CoverageResult} from a coverage report. + * + * @param fileName + * The name of the coverage report file + * + * @return the parsed coverage results + */ + public CoverageResult readCoberturaResult(final String fileName) { + try { + CoberturaReportAdapter parser = new CoberturaReportAdapter("unused"); + CoverageElementRegister.addCoverageElements(new CoberturaReportAdapter.CoberturaReportAdapterDescriptor().getCoverageElements()); + CoverageResult result = parser.getResult(getResourceAsFile(fileName).toFile()); + result.stripGroup(); + return result; + } + catch (CoverageException exception) { + throw new AssertionError(exception); + } + } + /** * Reads the {@link CoverageNode} from a coverage report. * diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoverageNodeTest.java b/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoverageNodeTest.java index 11ec7a198..7dce47922 100644 --- a/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoverageNodeTest.java +++ b/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoverageNodeTest.java @@ -12,6 +12,7 @@ import nl.jqno.equalsverifier.Warning; import io.jenkins.plugins.coverage.model.Coverage.CoverageBuilder; +import io.jenkins.plugins.coverage.targets.CoverageResult; import static io.jenkins.plugins.coverage.model.Assertions.*; import static org.mockito.Mockito.*; @@ -32,6 +33,31 @@ void shouldProvideEmptyPathForDefaultPackage() { assertThat(node.getPath()).isEqualTo(""); } + @Test + void shouldReturnCoberturaNpeReportIssue473() { + CoverageResult result = readCoberturaResult("cobertura-npe.xml"); + CoverageNode tree = new CoverageNodeConverter().convert(result); + + assertThat(tree.getAll(MODULE)).hasSize(1).extracting(CoverageNode::getName).containsOnly("cobertura: cobertura-npe.xml"); + assertThat(tree.getAll(PACKAGE)).hasSize(1).extracting(CoverageNode::getName).containsOnly("CoverageTest.Service"); + assertThat(tree.getAll(FILE)).hasSize(2).extracting(CoverageNode::getName).containsOnly("Program.cs", "Startup.cs"); + assertThat(tree.getAll(CLASS)).hasSize(2).extracting(CoverageNode::getName).containsOnly("Lisec.CoverageTest.Program", "Lisec.CoverageTest.Startup"); + + assertThat(tree).hasOnlyMetrics(MODULE, PACKAGE, FILE, CLASS, METHOD, LINE, BRANCH); + assertThat(tree.getMetricsDistribution()).containsExactly( + entry(MODULE, getCoverage(1, 0)), + entry(PACKAGE, getCoverage(1, 0)), + entry(FILE, getCoverage(2, 0)), + entry(CLASS, getCoverage(2, 0)), + entry(METHOD, getCoverage(4, 1)), + entry(LINE, getCoverage(44, 9)), + entry(BRANCH, getCoverage(3, 1))); + } + + private static Coverage getCoverage(final int covered, final int missed) { + return new CoverageBuilder().setCovered(covered).setMissed(missed).build(); + } + @Test void shouldReturnEmptyCoverageIfNotFound() { CoverageNode root = readExampleReport(); diff --git a/plugin/src/test/resources/io/jenkins/plugins/coverage/model/cobertura-npe.xml b/plugin/src/test/resources/io/jenkins/plugins/coverage/model/cobertura-npe.xml new file mode 100644 index 000000000..c119a9a15 --- /dev/null +++ b/plugin/src/test/resources/io/jenkins/plugins/coverage/model/cobertura-npe.xml @@ -0,0 +1,166 @@ + + + + /CoverageTest.Service/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +