diff --git a/plugin/src/main/resources/coverage/configuration.jelly b/plugin/src/main/resources/coverage/configuration.jelly index 94448befa..5c655c327 100644 --- a/plugin/src/main/resources/coverage/configuration.jelly +++ b/plugin/src/main/resources/coverage/configuration.jelly @@ -39,6 +39,9 @@ + + + diff --git a/plugin/src/main/resources/coverage/configuration.properties b/plugin/src/main/resources/coverage/configuration.properties index 102bdf86f..6f0c7c57d 100644 --- a/plugin/src/main/resources/coverage/configuration.properties +++ b/plugin/src/main/resources/coverage/configuration.properties @@ -13,6 +13,7 @@ checksName.title=Checks name checksAnnotationScope.title=Select the scope of source code annotations failOnError.title=Fail the step if errors have been reported during the execution title.enabledForFailure=Enable recording for failed builds +title.ignoreParsingErrors=Ignore parsing errors during processing of the coverage reports title.skipSymbolicLinks=Skip symbolic links when searching for files sourceCodeRetention.title=Source Code Retention Strategy diff --git a/plugin/src/main/resources/io/jenkins/plugins/coverage/metrics/steps/CoverageRecorder/help-ignoreParsingErrors.html b/plugin/src/main/resources/io/jenkins/plugins/coverage/metrics/steps/CoverageRecorder/help-ignoreParsingErrors.html index f3dc7d47e..f18e1fe68 100644 --- a/plugin/src/main/resources/io/jenkins/plugins/coverage/metrics/steps/CoverageRecorder/help-ignoreParsingErrors.html +++ b/plugin/src/main/resources/io/jenkins/plugins/coverage/metrics/steps/CoverageRecorder/help-ignoreParsingErrors.html @@ -1,7 +1,7 @@
This toggle determines if the coverage plugin should ignore parsing errors during processing of the coverage - reports or if it should fail fast with an exception. By default this toggle is disabled and the + reports or if it should fail fast with an exception. By default, this toggle is disabled and the parsers will fail fast. This helps to identify bugs in the parser or in the coverage tool execution. - If you would rather like to ignore parsing errors, please tick this checkbox. Please note, that in this + If you would rather like to ignore parsing errors, please tick this checkbox. Please note that in this case the parser results might be incomplete or even wrong.
diff --git a/plugin/src/main/resources/io/jenkins/plugins/coverage/metrics/steps/CoverageStep/help-ignoreParsingErrors.html b/plugin/src/main/resources/io/jenkins/plugins/coverage/metrics/steps/CoverageStep/help-ignoreParsingErrors.html index f3dc7d47e..f18e1fe68 100644 --- a/plugin/src/main/resources/io/jenkins/plugins/coverage/metrics/steps/CoverageStep/help-ignoreParsingErrors.html +++ b/plugin/src/main/resources/io/jenkins/plugins/coverage/metrics/steps/CoverageStep/help-ignoreParsingErrors.html @@ -1,7 +1,7 @@
This toggle determines if the coverage plugin should ignore parsing errors during processing of the coverage - reports or if it should fail fast with an exception. By default this toggle is disabled and the + reports or if it should fail fast with an exception. By default, this toggle is disabled and the parsers will fail fast. This helps to identify bugs in the parser or in the coverage tool execution. - If you would rather like to ignore parsing errors, please tick this checkbox. Please note, that in this + If you would rather like to ignore parsing errors, please tick this checkbox. Please note that in this case the parser results might be incomplete or even wrong.
diff --git a/ui-tests/pom.xml b/ui-tests/pom.xml index 9b0a71e8e..f1d969320 100644 --- a/ui-tests/pom.xml +++ b/ui-tests/pom.xml @@ -155,7 +155,6 @@ org.apache.maven.plugins maven-surefire-plugin - true false false diff --git a/ui-tests/src/main/java/io/jenkins/plugins/coverage/CoveragePublisher/Threshold/AbstractThreshold.java b/ui-tests/src/main/java/io/jenkins/plugins/coverage/AbstractThreshold.java similarity index 96% rename from ui-tests/src/main/java/io/jenkins/plugins/coverage/CoveragePublisher/Threshold/AbstractThreshold.java rename to ui-tests/src/main/java/io/jenkins/plugins/coverage/AbstractThreshold.java index 399092ddc..02a5af531 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/coverage/CoveragePublisher/Threshold/AbstractThreshold.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/coverage/AbstractThreshold.java @@ -1,4 +1,4 @@ -package io.jenkins.plugins.coverage.CoveragePublisher.Threshold; +package io.jenkins.plugins.coverage; import org.jenkinsci.test.acceptance.po.Control; import org.jenkinsci.test.acceptance.po.PageArea; diff --git a/ui-tests/src/main/java/io/jenkins/plugins/coverage/CoveragePublisher/Adapter.java b/ui-tests/src/main/java/io/jenkins/plugins/coverage/Adapter.java similarity index 93% rename from ui-tests/src/main/java/io/jenkins/plugins/coverage/CoveragePublisher/Adapter.java rename to ui-tests/src/main/java/io/jenkins/plugins/coverage/Adapter.java index c93d502d4..783ad80d8 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/coverage/CoveragePublisher/Adapter.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/coverage/Adapter.java @@ -1,11 +1,10 @@ -package io.jenkins.plugins.coverage.CoveragePublisher; +package io.jenkins.plugins.coverage; import org.jenkinsci.test.acceptance.po.Control; import org.jenkinsci.test.acceptance.po.PageArea; import org.jenkinsci.test.acceptance.po.PageAreaImpl; -import io.jenkins.plugins.coverage.CoveragePublisher.Threshold.AdapterThreshold; -import io.jenkins.plugins.coverage.CoveragePublisher.Threshold.AdapterThreshold.AdapterThresholdTarget; +import io.jenkins.plugins.coverage.AdapterThreshold.AdapterThresholdTarget; /** * Adapter which can be added in the configuration of the {@link CoveragePublisher} of a FreeStyle Project. @@ -96,4 +95,4 @@ public void ensureAdvancedOptionsIsActivated() { public void deleteAdapter() { this.delete.click(); } -} \ No newline at end of file +} diff --git a/ui-tests/src/main/java/io/jenkins/plugins/coverage/CoveragePublisher/Threshold/AdapterThreshold.java b/ui-tests/src/main/java/io/jenkins/plugins/coverage/AdapterThreshold.java similarity index 90% rename from ui-tests/src/main/java/io/jenkins/plugins/coverage/CoveragePublisher/Threshold/AdapterThreshold.java rename to ui-tests/src/main/java/io/jenkins/plugins/coverage/AdapterThreshold.java index a6c5a286b..1d0015239 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/coverage/CoveragePublisher/Threshold/AdapterThreshold.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/coverage/AdapterThreshold.java @@ -1,7 +1,4 @@ -package io.jenkins.plugins.coverage.CoveragePublisher.Threshold; - -import io.jenkins.plugins.coverage.CoveragePublisher.Adapter; -import io.jenkins.plugins.coverage.CoveragePublisher.CoveragePublisher; +package io.jenkins.plugins.coverage; /** * Threshold used in {@link Adapter} in {@link CoveragePublisher}. diff --git a/ui-tests/src/main/java/io/jenkins/plugins/coverage/util/ChartUtil.java b/ui-tests/src/main/java/io/jenkins/plugins/coverage/ChartUtil.java similarity index 98% rename from ui-tests/src/main/java/io/jenkins/plugins/coverage/util/ChartUtil.java rename to ui-tests/src/main/java/io/jenkins/plugins/coverage/ChartUtil.java index f4d7e797e..7c52c5a26 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/coverage/util/ChartUtil.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/coverage/ChartUtil.java @@ -1,4 +1,4 @@ -package io.jenkins.plugins.coverage.util; +package io.jenkins.plugins.coverage; import java.util.Objects; diff --git a/ui-tests/src/main/java/io/jenkins/plugins/coverage/CoveragePublisher/CoveragePublisher.java b/ui-tests/src/main/java/io/jenkins/plugins/coverage/CoveragePublisher.java similarity index 76% rename from ui-tests/src/main/java/io/jenkins/plugins/coverage/CoveragePublisher/CoveragePublisher.java rename to ui-tests/src/main/java/io/jenkins/plugins/coverage/CoveragePublisher.java index c87446769..da544b9bf 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/coverage/CoveragePublisher/CoveragePublisher.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/coverage/CoveragePublisher.java @@ -1,4 +1,4 @@ -package io.jenkins.plugins.coverage.CoveragePublisher; +package io.jenkins.plugins.coverage; import org.jenkinsci.test.acceptance.po.AbstractStep; import org.jenkinsci.test.acceptance.po.Control; @@ -8,13 +8,13 @@ import org.jenkinsci.test.acceptance.po.PageAreaImpl; import org.jenkinsci.test.acceptance.po.PostBuildStep; -import io.jenkins.plugins.coverage.CoveragePublisher.Threshold.GlobalThreshold; -import io.jenkins.plugins.coverage.CoveragePublisher.Threshold.GlobalThreshold.GlobalThresholdTarget; +import io.jenkins.plugins.coverage.GlobalThreshold.GlobalThresholdTarget; /** * Coverage Publisher which can be added in the configuration of a FreeStyle Project. */ -@Describable("Publish Coverage Report") +@Describable("Record code coverage results") +@SuppressWarnings("PMD.TooManyFields") public class CoveragePublisher extends AbstractStep implements PostBuildStep { private final Control adapter = control("hetero-list-add[adapters]"); @@ -25,29 +25,60 @@ public class CoveragePublisher extends AbstractStep implements PostBuildStep { private final Control failNoReports = control("failNoReports"); private final Control failBuildIfCoverageDecreasedInChangeRequest = control( "failBuildIfCoverageDecreasedInChangeRequest"); - private final Control skipPublishingChecks = control("skipPublishingChecks"); private final Control sourceFileResolver = control("sourceFileResolver/level"); private final Control globalThreshold = control("repeatable-add"); - private final Control sourceCodeEncoding = control("sourceCodeEncoding"); private final Control sourceDirectories = findRepeatableAddButtonFor("sourceDirectories"); + + private final Control id = control("id"); + private final Control name = control("name"); + private final Control skipPublishingChecks = control("skipPublishingChecks"); private final Control checksName = control("checksName"); + private final Control checksAnnotationScope = control("checksAnnotationScope"); + private final Control ignoreParsingErrors = control("ignoreParsingErrors"); + private final Control failOnError = control("failOnError"); + private final Control enabledForFailure = control("enabledForFailure"); + private final Control skipSymbolicLinks = control("skipSymbolicLinks"); + private final Control scm = control("scm"); + private final Control sourceCodeEncoding = control("sourceCodeEncoding"); + private final Control sourceCodeRetention = control("sourceCodeRetention"); /** - * Constructor for CoveragePublisher. + * Creates a new page object for the {@link CoveragePublisher}. * * @param parent - * is the job which uses the CoveragePublisher + * the parent job * @param path - * on the parent page + * the path on the configuration page */ public CoveragePublisher(final Job parent, final String path) { super(parent, path); } + CoveragePublisher setIgnoreParsingErrors(final boolean ignoreParsingErrors) { + ensureAdvancedOptionsIsActivated(); + this.ignoreParsingErrors.check(ignoreParsingErrors); + + return this; + } + + CoveragePublisher setFailOnError(final boolean failOnError) { + ensureAdvancedOptionsIsActivated(); + this.failOnError.check(failOnError); + + return this; + } + private Control findRepeatableAddButtonFor(final String propertyName) { return control(by.xpath("//div[@id='" + propertyName + "']//button[contains(@path,'-add')]")); } + CoveragePublisher setTool(final String tool, final String pattern) { + var tools = new CoverageTool(this, "tools"); + tools.setTool("COBERTURA").setPattern(pattern); + + return this; + } + /** * Sets the encoding when reading source code files. * @@ -161,9 +192,9 @@ public void setChecksName(final String checksName) { } /** - * Ensures advanced options of CoveragePublisher is activated, so that values like {@link - * CoveragePublisher#setFailUnhealthy(boolean)} or {@link CoveragePublisher#setFailNoReports(boolean)} are visible - * and can be set. + * Ensures advanced options of CoveragePublisher is activated, so that values like + * {@link CoveragePublisher#setFailUnhealthy(boolean)} or {@link CoveragePublisher#setFailNoReports(boolean)} are + * visible and can be set. */ public void ensureAdvancedOptionsIsActivated() { if (advancedOptions.exists()) { @@ -278,6 +309,45 @@ public void setPath(final String path) { this.path.set(path); } } + + /** + * Page area of a coverage tool configuration. + */ + public static class CoverageTool extends PageAreaImpl { + private final Control tool = control(""); + private final Control pattern = control("pattern"); + + CoverageTool(final PageArea coverageRecorder, final String path) { + super(coverageRecorder, path); + } + + /** + * Sets the name of the tool. + * + * @param toolName + * the name of the tool, e.g., PIT, JACOCO, COBERTURA + * + * @return this + */ + public CoverageTool setTool(final String toolName) { + tool.select(toolName); + return this; + } + + /** + * Sets the pattern of the files to parse. + * + * @param pattern + * the pattern + * + * @return this + */ + public CoverageTool setPattern(final String pattern) { + this.pattern.set(pattern); + + return this; + } + } } diff --git a/ui-tests/src/main/java/io/jenkins/plugins/coverage/CoverageReport.java b/ui-tests/src/main/java/io/jenkins/plugins/coverage/CoverageReport.java index 471c0f554..6f63f2698 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/coverage/CoverageReport.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/coverage/CoverageReport.java @@ -11,7 +11,7 @@ import org.jenkinsci.test.acceptance.po.Build; import org.jenkinsci.test.acceptance.po.PageObject; -import static io.jenkins.plugins.coverage.util.ChartUtil.*; +import static io.jenkins.plugins.coverage.ChartUtil.*; /** * {@link PageObject} representing the Coverage Report. diff --git a/ui-tests/src/main/java/io/jenkins/plugins/coverage/CoveragePublisher/Threshold/GlobalThreshold.java b/ui-tests/src/main/java/io/jenkins/plugins/coverage/GlobalThreshold.java similarity index 93% rename from ui-tests/src/main/java/io/jenkins/plugins/coverage/CoveragePublisher/Threshold/GlobalThreshold.java rename to ui-tests/src/main/java/io/jenkins/plugins/coverage/GlobalThreshold.java index b6cd0b65d..02cefd4d0 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/coverage/CoveragePublisher/Threshold/GlobalThreshold.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/coverage/GlobalThreshold.java @@ -1,6 +1,4 @@ -package io.jenkins.plugins.coverage.CoveragePublisher.Threshold; - -import io.jenkins.plugins.coverage.CoveragePublisher.CoveragePublisher; +package io.jenkins.plugins.coverage; /** * Global Threshold used in {@link CoveragePublisher}. diff --git a/ui-tests/src/main/java/io/jenkins/plugins/coverage/MainPanel.java b/ui-tests/src/main/java/io/jenkins/plugins/coverage/MainPanel.java index 6d2a04641..046ad1a3a 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/coverage/MainPanel.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/coverage/MainPanel.java @@ -6,8 +6,6 @@ import org.jenkinsci.test.acceptance.po.Job; import org.jenkinsci.test.acceptance.po.PageObject; -import io.jenkins.plugins.coverage.util.ChartUtil; - /** * {@link PageObject} representing the Job status on the build page of a job. */ @@ -20,7 +18,7 @@ public class MainPanel extends PageObject { * @param parent * job of wanted MainPanel. */ - public MainPanel(Job parent) { + public MainPanel(final Job parent) { super(parent, parent.url); } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/coverage/CoveragePublisherTest.java b/ui-tests/src/test/java/io/jenkins/plugins/coverage/CoveragePublisherTest.java index a83463c66..dd0568999 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/coverage/CoveragePublisherTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/coverage/CoveragePublisherTest.java @@ -1,5 +1,9 @@ package io.jenkins.plugins.coverage; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + import org.junit.Ignore; import org.junit.Test; @@ -7,7 +11,7 @@ import org.jenkinsci.test.acceptance.po.Build; import org.jenkinsci.test.acceptance.po.FreeStyleJob; -import io.jenkins.plugins.coverage.CoveragePublisher.CoveragePublisher.SourceFileResolver; +import io.jenkins.plugins.coverage.CoveragePublisher.SourceFileResolver; import static org.assertj.core.api.AssertionsForClassTypes.*; @@ -16,6 +20,45 @@ * results. */ public class CoveragePublisherTest extends UiTest { + /** + * Creates two successful builds. Tests the reference values in summary, coverage report and main panel. + */ + @Test + public void testCodeCoveragePlugin() { + FreeStyleJob job = getJobWithFirstBuildAndDifferentReports(InCaseCoverageDecreasedConfiguration.DONT_FAIL); + Build secondBuild = buildSuccessfully(job); + + HashMap expectedCoverageFifthBuild = new HashMap<>(); + expectedCoverageFifthBuild.put("Line", 91.02); + expectedCoverageFifthBuild.put("Branch", 93.97); + List expectedReferenceCoverageFifthBuild = new ArrayList<>(); + expectedReferenceCoverageFifthBuild.add(-4.5); + expectedReferenceCoverageFifthBuild.add(5.38); + + CoverageSummaryTest.verifySummaryWithReferenceBuild(secondBuild, expectedCoverageFifthBuild, + expectedReferenceCoverageFifthBuild); + + CoverageReport report = new CoverageReport(secondBuild); + report.open(); + + FileCoverageTable fileCoverageTable = report.openFileCoverageTable(); + CoverageReportTest.verifyFileCoverageTableContent(fileCoverageTable, + new String[] {"edu.hm.hafner.util", "edu.hm.hafner.util", "edu.hm.hafner.util"}, + new String[] {"Ensure.java", "FilteredLog.java", "Generated.java"}, + new String[] {"80.00%", "100.00%", "n/a"}, + new String[] {"86.96%", "100.00%", "n/a"}); + CoverageReportTest.verifyFileCoverageTableNumberOfMaxEntries(fileCoverageTable, 10); + + String coverageTree = report.getCoverageTree(); + CoverageReportTest.verifyCoverageTreeAfterSomeBuildsWithReports(coverageTree); + + String coverageOverview = report.getCoverageOverview(); + CoverageReportTest.verifyCoverageOverviewAfterSomeBuildsWithReports(coverageOverview); + + MainPanel mainPanel = new MainPanel(job); + MainPanelTest.verifyTrendChartWithTwoReports(mainPanel, 1, 2); + } + /** * Verifies that job with no report fails when setFailNoReports(true). */ diff --git a/ui-tests/src/test/java/io/jenkins/plugins/coverage/CoverageReportTest.java b/ui-tests/src/test/java/io/jenkins/plugins/coverage/CoverageReportTest.java index d93e59df5..e58c6e5fa 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/coverage/CoverageReportTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/coverage/CoverageReportTest.java @@ -7,8 +7,6 @@ import org.jenkinsci.test.acceptance.po.Build; import org.jenkinsci.test.acceptance.po.FreeStyleJob; -import io.jenkins.plugins.coverage.CoveragePublisher.Adapter; -import io.jenkins.plugins.coverage.CoveragePublisher.CoveragePublisher; import io.jenkins.plugins.coverage.FileCoverageTable.Header; import static net.javacrumbs.jsonunit.assertj.JsonAssertions.*; diff --git a/ui-tests/src/test/java/io/jenkins/plugins/coverage/CoverageSummaryTest.java b/ui-tests/src/test/java/io/jenkins/plugins/coverage/CoverageSummaryTest.java index d5ce945e2..78b584c62 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/coverage/CoverageSummaryTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/coverage/CoverageSummaryTest.java @@ -10,9 +10,6 @@ import org.jenkinsci.test.acceptance.po.Build; import org.jenkinsci.test.acceptance.po.FreeStyleJob; -import io.jenkins.plugins.coverage.CoveragePublisher.Adapter; -import io.jenkins.plugins.coverage.CoveragePublisher.CoveragePublisher; - import static org.assertj.core.api.Assertions.*; /** diff --git a/ui-tests/src/test/java/io/jenkins/plugins/coverage/SmokeTests.java b/ui-tests/src/test/java/io/jenkins/plugins/coverage/SmokeTests.java index 1721be68d..2c70ae832 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/coverage/SmokeTests.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/coverage/SmokeTests.java @@ -1,56 +1,43 @@ package io.jenkins.plugins.coverage; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - import org.junit.Test; -import org.jenkinsci.test.acceptance.po.Build; import org.jenkinsci.test.acceptance.po.FreeStyleJob; /** - * Smoke Test to test the most used features of coverage plugin. + * Smoke Test for the most used features of the coverage plugin. */ public class SmokeTests extends UiTest { + /** Verifies that the toggle for failing builds is working when there are no reports. */ + @Test + public void shouldToggleFailingIfThereAreNoReportsFound() { + FreeStyleJob job = jenkins.getJobs().create(FreeStyleJob.class); + var publisher = job.addPublisher(CoveragePublisher.class); + job.save(); + + buildSuccessfully(job); + + job.configure(() -> publisher.setFailOnError(true)); + + buildWithErrors(job); + } - /** - * Creates two successful builds. Tests the reference values in summary, coverage report and main panel. - */ + /** Verifies that the toggle for ignoring parsing errors is working when a report with errors is read. */ @Test - public void testCodeCoveragePlugin() { - FreeStyleJob job = getJobWithFirstBuildAndDifferentReports(InCaseCoverageDecreasedConfiguration.DONT_FAIL); - Build secondBuild = buildSuccessfully(job); - - HashMap expectedCoverageFifthBuild = new HashMap<>(); - expectedCoverageFifthBuild.put("Line", 91.02); - expectedCoverageFifthBuild.put("Branch", 93.97); - List expectedReferenceCoverageFifthBuild = new ArrayList<>(); - expectedReferenceCoverageFifthBuild.add(-4.5); - expectedReferenceCoverageFifthBuild.add(5.38); - - CoverageSummaryTest.verifySummaryWithReferenceBuild(secondBuild, expectedCoverageFifthBuild, - expectedReferenceCoverageFifthBuild); - - CoverageReport report = new CoverageReport(secondBuild); - report.open(); - - FileCoverageTable fileCoverageTable = report.openFileCoverageTable(); - CoverageReportTest.verifyFileCoverageTableContent(fileCoverageTable, - new String[] {"edu.hm.hafner.util", "edu.hm.hafner.util", "edu.hm.hafner.util"}, - new String[] {"Ensure.java", "FilteredLog.java", "Generated.java"}, - new String[] {"80.00%", "100.00%", "n/a"}, - new String[] {"86.96%", "100.00%", "n/a"}); - CoverageReportTest.verifyFileCoverageTableNumberOfMaxEntries(fileCoverageTable, 10); - - String coverageTree = report.getCoverageTree(); - CoverageReportTest.verifyCoverageTreeAfterSomeBuildsWithReports(coverageTree); - - String coverageOverview = report.getCoverageOverview(); - CoverageReportTest.verifyCoverageOverviewAfterSomeBuildsWithReports(coverageOverview); - - MainPanel mainPanel = new MainPanel(job); - MainPanelTest.verifyTrendChartWithTwoReports(mainPanel, 1, 2); + public void shouldToggleFailingIfTheCoverageFileIsInvalid() { + FreeStyleJob job = jenkins.getJobs().create(FreeStyleJob.class); + + job.copyResource("/cobertura-duplicate-methods.xml"); + + var publisher = job.addPublisher(CoveragePublisher.class); + publisher.setTool("Cobertura", "cobertura-*.xml"); + job.save(); + + buildWithErrors(job); + + job.configure(() -> publisher.setIgnoreParsingErrors(true)); + + buildSuccessfully(job); } } diff --git a/ui-tests/src/test/java/io/jenkins/plugins/coverage/UiTest.java b/ui-tests/src/test/java/io/jenkins/plugins/coverage/UiTest.java index 3cb64d9ec..455ce067e 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/coverage/UiTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/coverage/UiTest.java @@ -6,11 +6,9 @@ import org.jenkinsci.test.acceptance.po.FreeStyleJob; import org.jenkinsci.test.acceptance.po.Job; -import io.jenkins.plugins.coverage.CoveragePublisher.Adapter; -import io.jenkins.plugins.coverage.CoveragePublisher.CoveragePublisher; -import io.jenkins.plugins.coverage.CoveragePublisher.CoveragePublisher.SourceFileResolver; -import io.jenkins.plugins.coverage.CoveragePublisher.Threshold.AdapterThreshold.AdapterThresholdTarget; -import io.jenkins.plugins.coverage.CoveragePublisher.Threshold.GlobalThreshold.GlobalThresholdTarget; +import io.jenkins.plugins.coverage.AdapterThreshold.AdapterThresholdTarget; +import io.jenkins.plugins.coverage.CoveragePublisher.SourceFileResolver; +import io.jenkins.plugins.coverage.GlobalThreshold.GlobalThresholdTarget; /** * Base class for all UI tests. Provides several helper methods that can be used by all tests. @@ -31,7 +29,7 @@ class UiTest extends AbstractJUnitTest { * * @return a job without any reports */ - FreeStyleJob getJobWithoutAnyReports(InCaseNoReportsConfiguration configuration) { + FreeStyleJob getJobWithoutAnyReports(final InCaseNoReportsConfiguration configuration) { if (configuration == InCaseNoReportsConfiguration.FAIL) { return createJobWithConfiguration(JobConfiguration.NO_REPORTS_SHOULD_FAIL); } @@ -92,8 +90,8 @@ FreeStyleJob getJobWithReportAndSourceCode(final SourceFileResolver sourceFileRe * * @return Job with threshold and jacoco adapter. */ - FreeStyleJob getJobWithAdapterThresholdAndFailOnUnhealthySetter(int unhealthyThreshold, int unstableThreshold, - boolean failUnhealthy, ThresholdLevel thresholdLevel) { + FreeStyleJob getJobWithAdapterThresholdAndFailOnUnhealthySetter(final int unhealthyThreshold, final int unstableThreshold, + final boolean failUnhealthy, final ThresholdLevel thresholdLevel) { FreeStyleJob job = jenkins.getJobs().create(FreeStyleJob.class); CoveragePublisher coveragePublisher = job.addPublisher(CoveragePublisher.class); Adapter jacocoAdapter = coveragePublisher.createAdapterPageArea("Jacoco"); diff --git a/ui-tests/src/test/resources/cobertura-duplicate-methods.xml b/ui-tests/src/test/resources/cobertura-duplicate-methods.xml new file mode 100644 index 000000000..0bb1324db --- /dev/null +++ b/ui-tests/src/test/resources/cobertura-duplicate-methods.xml @@ -0,0 +1,75 @@ + + + + /CoverageTest.Service/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +