From 5d0585bd81e240fbb72a7140dd73a982b4f92424 Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Thu, 13 Apr 2023 17:04:11 +0200 Subject: [PATCH 1/3] Fix count of covered lines in summary. --- .../metrics/steps/CoverageChecksPublisher.java | 11 ++++++++--- .../coverage-publisher-summary.checks-expected-result | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageChecksPublisher.java b/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageChecksPublisher.java index 1993be0b6..8024bd3a5 100644 --- a/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageChecksPublisher.java +++ b/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageChecksPublisher.java @@ -10,6 +10,7 @@ import java.util.Optional; import java.util.Set; import java.util.TreeSet; +import java.util.function.Function; import java.util.stream.Collector; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -163,7 +164,7 @@ private String getAnnotationSummary() { } private void createTotalLinesSummary(final List modifiedFiles, final StringBuilder summary) { - var total = modifiedFiles.stream().map(FileNode::getModifiedLines).mapToInt(Set::size).sum(); + var total = countLines(modifiedFiles, FileNode::getModifiedLines); if (total == 1) { summary.append("- 1 line has been modified"); } @@ -173,8 +174,12 @@ private void createTotalLinesSummary(final List modifiedFiles, final S summary.append(NEW_LINE); } + private int countLines(final List modifiedFiles, final Function> linesGetter) { + return modifiedFiles.stream().map(linesGetter).mapToInt(Collection::size).sum(); + } + private void createLineCoverageSummary(final List modifiedFiles, final StringBuilder summary) { - var missed = modifiedFiles.stream().map(FileNode::getMissedLines).map(Set::size).count(); + var missed = countLines(modifiedFiles, FileNode::getMissedLines); if (missed == 0) { summary.append("- all lines are covered"); } @@ -213,7 +218,7 @@ private void createMutationCoverageSummary(final Node filteredRoot, final List Date: Thu, 13 Apr 2023 19:39:33 +0200 Subject: [PATCH 2/3] Fix missing `else` when creating the mutation summary. --- .../plugins/coverage/metrics/steps/CoverageChecksPublisher.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageChecksPublisher.java b/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageChecksPublisher.java index 8024bd3a5..a36690636 100644 --- a/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageChecksPublisher.java +++ b/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageChecksPublisher.java @@ -227,7 +227,7 @@ private void createMutationCoverageSummary(final Node filteredRoot, final List Date: Thu, 13 Apr 2023 21:48:16 +0200 Subject: [PATCH 3/3] Add testcase that checks for mutation annotations. --- .../steps/CoverageChecksPublisherTest.java | 44 ++++++++++++++++--- ...blisher-summary.checks-expected-result-pit | 20 +++++++++ 2 files changed, 58 insertions(+), 6 deletions(-) create mode 100644 plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/coverage-publisher-summary.checks-expected-result-pit diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/metrics/steps/CoverageChecksPublisherTest.java b/plugin/src/test/java/io/jenkins/plugins/coverage/metrics/steps/CoverageChecksPublisherTest.java index 9fa656e9d..adead503d 100644 --- a/plugin/src/test/java/io/jenkins/plugins/coverage/metrics/steps/CoverageChecksPublisherTest.java +++ b/plugin/src/test/java/io/jenkins/plugins/coverage/metrics/steps/CoverageChecksPublisherTest.java @@ -1,6 +1,5 @@ package io.jenkins.plugins.coverage.metrics.steps; -import java.io.IOException; import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -78,6 +77,35 @@ void shouldShowProjectBaselineForPit() { assertThatTitleIs(publisher, "Line Coverage: 93.84%, Mutation Coverage: 90.24%"); } + @ParameterizedTest(name = "should create checks (scope = {0}, expected annotations = {1})") + @CsvSource({"SKIP, 0", "ALL_LINES, 18", "MODIFIED_LINES, 1"}) + void shouldCreateChecksReportPit(final ChecksAnnotationScope scope, final int expectedAnnotations) { + var result = readResult("mutations.xml", new PitestParser()); + + var publisher = new CoverageChecksPublisher(createCoverageBuildAction(result), result, REPORT_NAME, + scope, createJenkins()); + + assertThat(publisher.extractChecksDetails().getOutput()).isPresent().get().satisfies(output -> { + assertSummary(output, "coverage-publisher-summary.checks-expected-result-pit"); + assertMutationAnnotations(output, expectedAnnotations); + }); + } + + private void assertMutationAnnotations(final ChecksOutput output, final int expectedAnnotations) { + assertThat(output.getChecksAnnotations()).hasSize(expectedAnnotations); + if (expectedAnnotations == 1) { + assertThat(output.getChecksAnnotations()).satisfiesExactly( + annotation -> { + assertThat(annotation.getTitle()).contains("Mutation survived"); + assertThat(annotation.getAnnotationLevel()).isEqualTo(ChecksAnnotationLevel.WARNING); + assertThat(annotation.getPath()).contains("edu/hm/hafner/coverage/parser/CoberturaParser.java"); + assertThat(annotation.getMessage()).contains("One mutation survived in line 251"); + assertThat(annotation.getStartLine()).isPresent().get().isEqualTo(251); + assertThat(annotation.getEndLine()).isPresent().get().isEqualTo(251); + }); + } + } + private void assertThatTitleIs(final CoverageChecksPublisher publisher, final String expectedTitle) { var checkDetails = publisher.extractChecksDetails(); assertThat(checkDetails.getOutput()).isPresent().get().satisfies(output -> { @@ -89,7 +117,7 @@ private void assertThatTitleIs(final CoverageChecksPublisher publisher, final St @ParameterizedTest(name = "should create checks (scope = {0}, expected annotations = {1})") @CsvSource({"SKIP, 0", "ALL_LINES, 36", "MODIFIED_LINES, 3"}) - void shouldCreateChecksReport(final ChecksAnnotationScope scope, final int expectedAnnotations) { + void shouldCreateChecksReportJaCoCo(final ChecksAnnotationScope scope, final int expectedAnnotations) { var result = readJacocoResult("jacoco-codingstyle.xml"); var publisher = new CoverageChecksPublisher(createCoverageBuildAction(result), result, REPORT_NAME, scope, createJenkins()); @@ -113,15 +141,14 @@ private void assertThatDetailsAreCorrect(final ChecksDetails checkDetails, final var expectedDetails = toString("coverage-publisher-details.checks-expected-result"); assertThat(output.getText()).isPresent().get().asString().isEqualToNormalizingWhitespace(expectedDetails); assertChecksAnnotations(output, expectedAnnotations); - assertSummary(output); + assertSummary(output, "coverage-publisher-summary.checks-expected-result"); }); } - private void assertSummary(final ChecksOutput checksOutput) throws IOException { - var expectedContent = toString("coverage-publisher-summary.checks-expected-result"); + private void assertSummary(final ChecksOutput checksOutput, final String fileName) { assertThat(checksOutput.getSummary()).isPresent() .get() - .asString().isEqualToNormalizingWhitespace(expectedContent); + .asString().isEqualToNormalizingWhitespace(toString(fileName)); } private void assertChecksAnnotations(final ChecksOutput checksOutput, final int expectedAnnotations) { @@ -179,6 +206,11 @@ private CoverageBuildAction createCoverageBuildAction(final Node result) { assertThat(file.getPartiallyCoveredLines()).contains(entry(113, 1)); file.addModifiedLines(61, 62, 113); }); + result.findFile("CoberturaParser.java") + .ifPresent(file -> { + assertThat(file.getSurvivedMutations()).containsKey(251); + file.addModifiedLines(251); + }); return new CoverageBuildAction(run, COVERAGE_ID, REPORT_NAME, StringUtils.EMPTY, result, new QualityGateResult(), null, "refId", diff --git a/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/coverage-publisher-summary.checks-expected-result-pit b/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/coverage-publisher-summary.checks-expected-result-pit new file mode 100644 index 000000000..efbb67bf7 --- /dev/null +++ b/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/coverage-publisher-summary.checks-expected-result-pit @@ -0,0 +1,20 @@ +#### Summary for modified lines +- 1 line has been modified +- all lines are covered +- 1 mutation survived (of 3) +#### Overview by baseline + +* **[Overall project (difference to reference job)](http://127.0.0.1:8080/job/pipeline-coding-style/job/5/coverage#overview)** + * Line Coverage: 93.84% (198/211) - Delta: +50.00% + * Mutation Coverage: 90.24% (222/246) + * Lines of Code: 211 +* **[Modified files (difference to overall project)](http://127.0.0.1:8080/job/pipeline-coding-style/job/5/coverage#modifiedFilesCoverage)** + * Line Coverage: 50.00% (1/2) - Delta: +50.00% +* **[Modified code lines (difference to modified files)](http://127.0.0.1:8080/job/pipeline-coding-style/job/5/coverage#modifiedLinesCoverage)** + * Line Coverage: 50.00% (1/2) - Delta: +50.00% +* **[Indirect changes](http://127.0.0.1:8080/job/pipeline-coding-style/job/5/coverage#indirectCoverage)** + * Line Coverage: 50.00% (1/2) + +#### Quality Gates Summary + +No active quality gates.