From 4b67557b058a50604098f254e34c212bbb28cf0d Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Sun, 19 Mar 2023 17:37:16 +0100 Subject: [PATCH 1/6] Fix broken tables in details. Fixes https://github.com/jenkinsci/code-coverage-api-plugin/issues/577. --- .../coverage/deprecated-coverage-table.jelly | 61 +++++++++++++++++++ .../model/CoverageViewModel/index.jelly | 6 +- 2 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 plugin/src/main/resources/coverage/deprecated-coverage-table.jelly diff --git a/plugin/src/main/resources/coverage/deprecated-coverage-table.jelly b/plugin/src/main/resources/coverage/deprecated-coverage-table.jelly new file mode 100644 index 000000000..dc4f28985 --- /dev/null +++ b/plugin/src/main/resources/coverage/deprecated-coverage-table.jelly @@ -0,0 +1,61 @@ + + + + + Provides a table to render the file coverage nodes without the source code. + + The ID of the table. + + + +
+ + +
+ + + +
+
+ + + +
+
+ +
+ +
+
+
+
+ +
+
+
${%Please select a file in the table to open the source code}
+
+
+
+
+ +
+
+
${%No source code available for this file}
+
+
+
+
+
+ +
+ + + +
+ +
+
+
+ +
diff --git a/plugin/src/main/resources/io/jenkins/plugins/coverage/model/CoverageViewModel/index.jelly b/plugin/src/main/resources/io/jenkins/plugins/coverage/model/CoverageViewModel/index.jelly index 5de9cfb4c..ad5b54f12 100644 --- a/plugin/src/main/resources/io/jenkins/plugins/coverage/model/CoverageViewModel/index.jelly +++ b/plugin/src/main/resources/io/jenkins/plugins/coverage/model/CoverageViewModel/index.jelly @@ -77,18 +77,18 @@
- +
- +
- +
From bb34f9fe249112f52eed32f4b133fd6dead46787 Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Sun, 19 Mar 2023 21:41:36 +0100 Subject: [PATCH 2/6] Improve test so that no disk file will be read. Fix some warnings. --- .../steps/CoverageChecksPublisher.java | 14 +++++----- .../metrics/steps/CoverageRecorder.java | 9 +++---- .../coverage/metrics/steps/CoverageTool.java | 11 +------- .../metrics/steps/CoverageXmlStream.java | 2 +- .../steps/CoverageChecksPublisherTest.java | 12 ++++++--- .../metrics/steps/CoveragePluginITest.java | 27 +++++++++---------- .../metrics/steps/GitForensicsITest.java | 1 - .../coverage/metrics/steps/JobDslITest.java | 4 +-- 8 files changed, 37 insertions(+), 43 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 3b54cfc3a..3d43eead2 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 @@ -44,18 +44,20 @@ class CoverageChecksPublisher { private static final ElementFormatter FORMATTER = new ElementFormatter(); private final CoverageBuildAction action; + private final Node rootNode; private final JenkinsFacade jenkinsFacade; private final String checksName; private final ChecksAnnotationScope annotationScope; - CoverageChecksPublisher(final CoverageBuildAction action, final String checksName, + CoverageChecksPublisher(final CoverageBuildAction action, final Node rootNode, final String checksName, final ChecksAnnotationScope annotationScope) { - this(action, checksName, annotationScope, new JenkinsFacade()); + this(action, rootNode, checksName, annotationScope, new JenkinsFacade()); } @VisibleForTesting - CoverageChecksPublisher(final CoverageBuildAction action, - final String checksName, final ChecksAnnotationScope annotationScope, final JenkinsFacade jenkinsFacade) { + CoverageChecksPublisher(final CoverageBuildAction action, final Node rootNode, final String checksName, + final ChecksAnnotationScope annotationScope, final JenkinsFacade jenkinsFacade) { + this.rootNode = rootNode; this.jenkinsFacade = jenkinsFacade; this.action = action; this.checksName = checksName; @@ -97,7 +99,7 @@ private String getChecksTitle() { } private String getSummary() { - var root = action.getResult(); + var root = rootNode; return getOverallCoverageSummary(root) + "\n\n" + getQualityGatesSummary() + "\n\n" + getProjectMetricsSummary(root); @@ -108,7 +110,7 @@ private List getAnnotations() { return List.of(); } - var tree = action.getResult(); + var tree = rootNode; Node filtered; if (annotationScope == ChecksAnnotationScope.ALL_LINES) { filtered = tree; diff --git a/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageRecorder.java b/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageRecorder.java index c982fc929..ec9ac0a85 100644 --- a/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageRecorder.java +++ b/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageRecorder.java @@ -391,13 +391,12 @@ private void perform(final Run run, final FilePath workspace, final TaskLi if (!results.isEmpty()) { CoverageReporter reporter = new CoverageReporter(); - var action = reporter.publishAction(getActualId(), getName(), getIcon(), - Node.merge(results), run, workspace, taskListener, - getQualityGates(), - getScm(), getSourceDirectoriesPaths(), + var rootNode = Node.merge(results); + var action = reporter.publishAction(getActualId(), getName(), getIcon(), rootNode, run, + workspace, taskListener, getQualityGates(), getScm(), getSourceDirectoriesPaths(), getSourceCodeEncoding(), getSourceCodeRetention(), resultHandler); if (!skipPublishingChecks) { - var checksPublisher = new CoverageChecksPublisher(action, getChecksName(), getChecksAnnotationScope()); + var checksPublisher = new CoverageChecksPublisher(action, rootNode, getChecksName(), getChecksAnnotationScope()); checksPublisher.publishCoverageReport(taskListener); } } diff --git a/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageTool.java b/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageTool.java index 581d19bdf..73c483aa4 100644 --- a/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageTool.java +++ b/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageTool.java @@ -132,18 +132,9 @@ public String getDisplayName() { /** Descriptor for {@link CoverageTool}. **/ @Extension - public static class CoverageToolDescriptor extends Descriptor { + public static class CoverageToolDescriptor extends Descriptor { private static final JenkinsFacade JENKINS = new JenkinsFacade(); - /** - * Creates a new instance of {@link CoverageToolDescriptor}. - */ - public CoverageToolDescriptor() { - super(); - - // empty constructor required for stapler - } - /** * Returns a model with all {@link SourceCodeRetention} strategies. * diff --git a/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageXmlStream.java b/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageXmlStream.java index 477b0afec..5eb9b5a5c 100644 --- a/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageXmlStream.java +++ b/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageXmlStream.java @@ -44,7 +44,7 @@ /** * Configures the XML stream for the coverage tree, which consists of {@link Node}s. */ -@SuppressWarnings("CouplingBetweenObjects") +@SuppressWarnings("PMD.CouplingBetweenObjects") class CoverageXmlStream extends AbstractXmlStream { private static final Collector ARRAY_JOINER = Collectors.joining(", ", "[", "]"); 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 db3af08b6..7a993ad75 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 @@ -14,6 +14,7 @@ import edu.hm.hafner.coverage.Coverage.CoverageBuilder; import edu.hm.hafner.coverage.Metric; +import edu.hm.hafner.coverage.Node; import hudson.model.Run; @@ -36,11 +37,14 @@ class CoverageChecksPublisherTest extends AbstractCoverageTest { private static final String BUILD_LINK = "job/pipeline-coding-style/job/5"; private static final String COVERAGE_ID = "coverage"; private static final String REPORT_NAME = "Name"; + private static final int ANNOTATIONS_COUNT_FOR_MODIFIED = 3; @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) { - var publisher = new CoverageChecksPublisher(createCoverageBuildAction(), REPORT_NAME, scope, createJenkins()); + var result = readJacocoResult("jacoco-codingstyle.xml"); + + var publisher = new CoverageChecksPublisher(createCoverageBuildAction(result), result, REPORT_NAME, scope, createJenkins()); var checkDetails = publisher.extractChecksDetails(); @@ -72,7 +76,7 @@ private void assertSummary(final ChecksOutput checksOutput) throws IOException { } private void assertChecksAnnotations(final ChecksOutput checksOutput, final int expectedAnnotations) { - if (expectedAnnotations == 3) { + if (expectedAnnotations == ANNOTATIONS_COUNT_FOR_MODIFIED) { assertThat(checksOutput.getChecksAnnotations()).hasSize(expectedAnnotations).satisfiesExactly( annotation -> { assertThat(annotation.getTitle()).contains("Not covered line"); @@ -108,7 +112,7 @@ private JenkinsFacade createJenkins() { return jenkinsFacade; } - private CoverageBuildAction createCoverageBuildAction() { + private CoverageBuildAction createCoverageBuildAction(final Node result) { var testCoverage = new CoverageBuilder().setMetric(Metric.LINE) .setCovered(1) .setMissed(1) @@ -116,7 +120,7 @@ private CoverageBuildAction createCoverageBuildAction() { var run = mock(Run.class); when(run.getUrl()).thenReturn(BUILD_LINK); - var result = readJacocoResult("jacoco-codingstyle.xml"); + result.findFile("TreeStringBuilder.java") .ifPresent(file -> { assertThat(file.getMissedLines()).contains(61, 62); diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/metrics/steps/CoveragePluginITest.java b/plugin/src/test/java/io/jenkins/plugins/coverage/metrics/steps/CoveragePluginITest.java index 1d5f0b31e..dcbb1947b 100644 --- a/plugin/src/test/java/io/jenkins/plugins/coverage/metrics/steps/CoveragePluginITest.java +++ b/plugin/src/test/java/io/jenkins/plugins/coverage/metrics/steps/CoveragePluginITest.java @@ -23,7 +23,6 @@ import io.jenkins.plugins.coverage.metrics.model.Baseline; import io.jenkins.plugins.coverage.metrics.steps.CoverageTool.Parser; -import static edu.hm.hafner.coverage.Metric.*; import static io.jenkins.plugins.coverage.metrics.AbstractCoverageTest.*; import static org.assertj.core.api.Assertions.*; @@ -143,19 +142,19 @@ private void verifyOneJacocoResult(final ParameterizedJob project) { private static void verifyJaCoCoAction(final CoverageBuildAction coverageResult) { assertThat(coverageResult.getAllValues(Baseline.PROJECT)).extracting(Value::getMetric) - .containsExactly(MODULE, - PACKAGE, + .containsExactly(Metric.MODULE, + Metric.PACKAGE, Metric.FILE, Metric.CLASS, - METHOD, - LINE, - BRANCH, - INSTRUCTION, - COMPLEXITY, - COMPLEXITY_DENSITY, - LOC); + Metric.METHOD, + Metric.LINE, + Metric.BRANCH, + Metric.INSTRUCTION, + Metric.COMPLEXITY, + Metric.COMPLEXITY_DENSITY, + Metric.LOC); assertThat(coverageResult.getMetricsForSummary()) - .containsExactly(Metric.LINE, Metric.BRANCH, Metric.MUTATION, COMPLEXITY_DENSITY, Metric.LOC); + .containsExactly(Metric.LINE, Metric.BRANCH, Metric.MUTATION, Metric.COMPLEXITY_DENSITY, Metric.LOC); assertThat(coverageResult.getAllValues(Baseline.PROJECT)) .contains(createLineCoverageBuilder() .setCovered(JACOCO_ANALYSIS_MODEL_COVERED) @@ -238,11 +237,11 @@ void shouldRecordCoberturaAndJacocoResultsInFreestyleJob() { CoverageRecorder recorder = new CoverageRecorder(); - var cobertura = new io.jenkins.plugins.coverage.metrics.steps.CoverageTool(); + var cobertura = new CoverageTool(); cobertura.setParser(Parser.COBERTURA); cobertura.setPattern(COBERTURA_HIGHER_COVERAGE_FILE); - var jacoco = new io.jenkins.plugins.coverage.metrics.steps.CoverageTool(); + var jacoco = new CoverageTool(); jacoco.setParser(Parser.JACOCO); jacoco.setPattern(JACOCO_ANALYSIS_MODEL_FILE); @@ -309,7 +308,7 @@ private void verifyOnePitResult(final ParameterizedJob project) { CoverageBuildAction coverageResult = build.getAction(CoverageBuildAction.class); assertThat(coverageResult.getAllValues(Baseline.PROJECT)) - .filteredOn(Value::getMetric, MUTATION) + .filteredOn(Value::getMetric, Metric.MUTATION) .first() .isInstanceOfSatisfying(Coverage.class, m -> { assertThat(m.getCovered()).isEqualTo(222); diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/metrics/steps/GitForensicsITest.java b/plugin/src/test/java/io/jenkins/plugins/coverage/metrics/steps/GitForensicsITest.java index 905acea54..de09947c4 100644 --- a/plugin/src/test/java/io/jenkins/plugins/coverage/metrics/steps/GitForensicsITest.java +++ b/plugin/src/test/java/io/jenkins/plugins/coverage/metrics/steps/GitForensicsITest.java @@ -79,7 +79,6 @@ void shouldComputeDeltaInPipelineOnDockerAgent(final SourceCodeRetention sourceC Run build = buildSuccessfully(project); verifyGitRepositoryForCommit(build, COMMIT); - System.out.println(getConsoleLog(build)); verifyGitIntegration(build, referenceBuild); assertThat(getConsoleLog(build)).contains( diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/metrics/steps/JobDslITest.java b/plugin/src/test/java/io/jenkins/plugins/coverage/metrics/steps/JobDslITest.java index 5d8fd25fa..a17a206f5 100644 --- a/plugin/src/test/java/io/jenkins/plugins/coverage/metrics/steps/JobDslITest.java +++ b/plugin/src/test/java/io/jenkins/plugins/coverage/metrics/steps/JobDslITest.java @@ -73,8 +73,8 @@ void shouldCreateFreestyleJobFromYamlConfiguration() { private void assertRecorderProperties(final CoverageRecorder recorder) { assertThat(recorder.getTools()).hasSize(2).usingRecursiveFieldByFieldElementComparator() .containsExactly( - new io.jenkins.plugins.coverage.metrics.steps.CoverageTool(Parser.JACOCO, "jacoco-pattern.*"), - new io.jenkins.plugins.coverage.metrics.steps.CoverageTool(Parser.COBERTURA, "cobertura-pattern.*")); + new CoverageTool(Parser.JACOCO, "jacoco-pattern.*"), + new CoverageTool(Parser.COBERTURA, "cobertura-pattern.*")); assertThat(recorder.getQualityGates()).hasSize(2).usingRecursiveFieldByFieldElementComparator() .containsExactly( new CoverageQualityGate(70.0, Metric.LINE, Baseline.PROJECT, QualityGateCriticality.UNSTABLE), From f0b68f8d72aadf02f7ec5661ee695df283df0cf2 Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Sun, 19 Mar 2023 19:42:40 +0100 Subject: [PATCH 3/6] Fix 2 warnings. --- .../coverage/metrics/steps/CoverageChecksPublisherTest.java | 2 +- ...ary.md => coverage-publisher-summary.checks-expected-result} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/{coverage-publisher-summary.md => coverage-publisher-summary.checks-expected-result} (100%) 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 7a993ad75..9a95061f7 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 @@ -69,7 +69,7 @@ private void assertThatDetailsAreCorrect(final ChecksDetails checkDetails, final } private void assertSummary(final ChecksOutput checksOutput) throws IOException { - var expectedContent = Files.readString(getResourceAsFile("coverage-publisher-summary.md")); + var expectedContent = Files.readString(getResourceAsFile("coverage-publisher-summary.checks-expected-result")); assertThat(checksOutput.getSummary()).isPresent() .get() .isEqualTo(expectedContent); diff --git a/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/coverage-publisher-summary.md b/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/coverage-publisher-summary.checks-expected-result similarity index 100% rename from plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/coverage-publisher-summary.md rename to plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/coverage-publisher-summary.checks-expected-result From 4413f2251770b2ac6424c7607fd4e8c11dd799ae Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Sun, 19 Mar 2023 22:00:19 +0100 Subject: [PATCH 4/6] Bump version of kentaro-m/auto-assign-action to v1.2.5 --- .github/workflows/assign-pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/assign-pr.yml b/.github/workflows/assign-pr.yml index 64ffa369f..c2a46d406 100644 --- a/.github/workflows/assign-pr.yml +++ b/.github/workflows/assign-pr.yml @@ -6,6 +6,6 @@ jobs: add-reviews: runs-on: ubuntu-latest steps: - - uses: kentaro-m/auto-assign-action@v1.2.4 + - uses: kentaro-m/auto-assign-action@v1.2.5 with: repo-token: "${{ secrets.GITHUB_TOKEN }}" From 146d4e1cb825124e986794c799ca865657846314 Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Sun, 19 Mar 2023 22:20:26 +0100 Subject: [PATCH 5/6] Fix broken workflows. --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 87b666f1f..f8005e118 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,9 +15,9 @@ jobs: platform: [ubuntu-latest, macos-latest, windows-latest] jdk: [17] include: - - os: ubuntu-latest + - platform: ubuntu-latest jdk: 11 - - os: macos-latest + - platform: macos-latest jdk: 11 runs-on: ${{ matrix.platform }} From 7998cddddb35af4a8b11396b2278f86b8c8fe3a6 Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Sun, 19 Mar 2023 23:01:10 +0100 Subject: [PATCH 6/6] Remove println. --- .../plugins/coverage/metrics/source/SourceCodeITest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/metrics/source/SourceCodeITest.java b/plugin/src/test/java/io/jenkins/plugins/coverage/metrics/source/SourceCodeITest.java index 9c7e4b876..b8b5492e2 100644 --- a/plugin/src/test/java/io/jenkins/plugins/coverage/metrics/source/SourceCodeITest.java +++ b/plugin/src/test/java/io/jenkins/plugins/coverage/metrics/source/SourceCodeITest.java @@ -159,8 +159,6 @@ private CpsFlowDefinition createPipelineWithSourceCode(final SourceCodeRetention private void verifySourceCodeInBuild(final Run build, final String acuCobolParserSourceCodeSnippet, final String pathUtilSourceCodeSnippet) { - System.out.println(getConsoleLog(build)); - List actions = build.getActions(CoverageBuildAction.class); var builder = new CoverageBuilder().setMetric(Metric.LINE).setMissed(0); assertThat(actions).hasSize(2).satisfiesExactly(