diff --git a/plugin/pom.xml b/plugin/pom.xml index 74d5ca8c7..13181f08d 100644 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -5,7 +5,7 @@ org.jvnet.hudson.plugins analysis-pom - 5.19.0 + 5.22.0 @@ -30,7 +30,7 @@ 1.11.4-4 1.12.0 1.7.8 - 2.15.0 + 2.16.0 6.0.0-1 5.1.3-6 3.6.0-2 @@ -40,6 +40,7 @@ 2.9.0 1.26.0-2 1.11 + 1.16.3 @@ -216,37 +217,54 @@ - - org.jenkins-ci.test - docker-fixtures - ${docker-fixtures.version} + org.jenkins-ci.plugins + credentials test org.jenkins-ci.plugins - ssh-slaves + git test org.jenkins-ci.plugins - credentials + git-client test org.jenkins-ci.plugins - git + timestamper + 1.17 test + org.jenkins-ci.plugins - git-client + ssh-credentials test org.jenkins-ci.plugins - timestamper - 1.17 + ssh-slaves + test + + + org.testcontainers + testcontainers + ${testcontainers.version} + test + + + org.apache.commons + commons-compress + + + + + org.testcontainers + junit-jupiter + ${testcontainers.version} test diff --git a/plugin/src/main/resources/index.jelly b/plugin/src/main/resources/index.jelly index 086ce9c73..109e179e9 100644 --- a/plugin/src/main/resources/index.jelly +++ b/plugin/src/main/resources/index.jelly @@ -1,4 +1,4 @@
- This plugin serves as API to integrate and publish multiple coverage report types. + Collects code coverage results of different tools (JaCoCo, Cobertura, etc.) and visualizes the results.
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 063e39d66..ffb057aec 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 @@ -18,7 +18,7 @@ * * @author Ullrich Hafner */ -public class AbstractCoverageTest extends ResourceTest { +public abstract class AbstractCoverageTest extends ResourceTest { static final double PRECISION = 0.01; static final CoverageMetric MODULE = CoverageMetric.MODULE; static final CoverageMetric PACKAGE = CoverageMetric.PACKAGE; diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoveragePlugin0vsOkITest.java b/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoveragePlugin0vsOkITest.java index 411b6df54..dcf5df3cf 100644 --- a/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoveragePlugin0vsOkITest.java +++ b/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoveragePlugin0vsOkITest.java @@ -2,7 +2,7 @@ import java.util.Collections; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition; import org.jenkinsci.plugins.workflow.job.WorkflowJob; @@ -15,14 +15,14 @@ /** * Tests if 0 reports fail vs ok. */ -public class CoveragePlugin0vsOkITest extends IntegrationTestWithJenkinsPerSuite { +class CoveragePlugin0vsOkITest extends IntegrationTestWithJenkinsPerSuite { private static final String JACOCO_ANALYSIS_MODEL_FILE = "jacoco-analysis-model.xml"; /** * Adapter reads no file and failNoReports is set true in freestyle project. */ @Test - public void freeStyleNoFileAndFailNoReportsTrue() { + void freeStyleNoFileAndFailNoReportsTrue() { FreeStyleProject project = createFreeStyleProjectWithFailNoReports(true, ""); buildSuccessfully(project); @@ -32,7 +32,7 @@ public void freeStyleNoFileAndFailNoReportsTrue() { * Adapter reads no file and failNoReports is set false in freestyle project. */ @Test - public void freeStyleNoFileAndFailNoReportsFalse() { + void freeStyleNoFileAndFailNoReportsFalse() { FreeStyleProject project = createFreeStyleProjectWithFailNoReports(false, ""); buildSuccessfully(project); @@ -42,7 +42,7 @@ public void freeStyleNoFileAndFailNoReportsFalse() { * Adapter reads one file and failNoReports is set true in freestyle project. */ @Test - public void freeStyleWithFileAndFailNoReportsTrue() { + void freeStyleWithFileAndFailNoReportsTrue() { FreeStyleProject project = createFreeStyleProjectWithFailNoReports(true, JACOCO_ANALYSIS_MODEL_FILE); buildSuccessfully(project); @@ -52,7 +52,7 @@ public void freeStyleWithFileAndFailNoReportsTrue() { * Adapter reads one file and failNoReports is set false in freestyle project. */ @Test - public void freeStyleWithFileAndFailNoReportsFalse() { + void freeStyleWithFileAndFailNoReportsFalse() { FreeStyleProject project = createFreeStyleProjectWithFailNoReports(false, JACOCO_ANALYSIS_MODEL_FILE); buildSuccessfully(project); @@ -62,7 +62,7 @@ public void freeStyleWithFileAndFailNoReportsFalse() { * Adapter reads one file and failNoReports is set false in freestyle project. */ @Test - public void freeStyleWithFileWildcardAndFailNoReportsTrue() { + void freeStyleWithFileWildcardAndFailNoReportsTrue() { FreeStyleProject project = createFreeStyleProjectWithFailNoReports(true, "**/*.xml"); buildSuccessfully(project); @@ -72,7 +72,7 @@ public void freeStyleWithFileWildcardAndFailNoReportsTrue() { * Adapter reads one file and failNoReports is set false in freestyle project. */ @Test - public void freeStyleWithFileWildcardAndFailNoReportsFalse() { + void freeStyleWithFileWildcardAndFailNoReportsFalse() { FreeStyleProject project = createFreeStyleProjectWithFailNoReports(false, "**/*.xml"); buildSuccessfully(project); @@ -82,7 +82,7 @@ public void freeStyleWithFileWildcardAndFailNoReportsFalse() { * Adapter reads no file and failNoReports is set true in pipeline project. */ @Test - public void pipelineNoFileAndFailNoReportsTrue() { + void pipelineNoFileAndFailNoReportsTrue() { WorkflowJob job = getPipelineProjectWithJacoco(true, ""); buildSuccessfully(job); @@ -92,7 +92,7 @@ public void pipelineNoFileAndFailNoReportsTrue() { * Adapter reads no file and failNoReports is set false in pipeline project. */ @Test - public void pipelineNoFileAndFailNoReportsFalse() { + void pipelineNoFileAndFailNoReportsFalse() { WorkflowJob job = getPipelineProjectWithJacoco(false, ""); buildSuccessfully(job); @@ -102,7 +102,7 @@ public void pipelineNoFileAndFailNoReportsFalse() { * Adapter reads one file and failNoReports is set true in pipeline project. */ @Test - public void pipelineWithFileAndFailNoReportsTrue() { + void pipelineWithFileAndFailNoReportsTrue() { WorkflowJob job = getPipelineProjectWithJacoco(true, JACOCO_ANALYSIS_MODEL_FILE); buildSuccessfully(job); @@ -112,7 +112,7 @@ public void pipelineWithFileAndFailNoReportsTrue() { * Adapter reads one file and failNoReports is set false in pipeline project. */ @Test - public void pipelineWithFileAndFailNoReportsFalse() { + void pipelineWithFileAndFailNoReportsFalse() { WorkflowJob job = getPipelineProjectWithJacoco(false, JACOCO_ANALYSIS_MODEL_FILE); buildSuccessfully(job); @@ -122,7 +122,7 @@ public void pipelineWithFileAndFailNoReportsFalse() { * Adapter reads one file and failNoReports is set false in pipeline project. */ @Test - public void pipelineWithFileWildcardAndFailNoReportsTrue() { + void pipelineWithFileWildcardAndFailNoReportsTrue() { WorkflowJob job = getPipelineProjectWithJacoco(true, "**/*.xml"); buildSuccessfully(job); @@ -132,7 +132,7 @@ public void pipelineWithFileWildcardAndFailNoReportsTrue() { * Adapter reads one file and failNoReports is set false in pipeline project. */ @Test - public void pipelineWithFileWildcardAndFailNoReportsFalse() { + void pipelineWithFileWildcardAndFailNoReportsFalse() { WorkflowJob job = getPipelineProjectWithJacoco(false, "**/*.xml"); buildSuccessfully(job); diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoveragePluginITest.java b/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoveragePluginITest.java index 880048020..f86fff058 100644 --- a/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoveragePluginITest.java +++ b/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoveragePluginITest.java @@ -4,8 +4,8 @@ import java.util.Collections; import java.util.List; -import org.junit.Ignore; -import org.junit.Test; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; import org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition; import org.jenkinsci.plugins.workflow.job.WorkflowJob; @@ -25,7 +25,7 @@ /** * Integration test for different jacoco and cobertura files. */ -public class CoveragePluginITest extends IntegrationTestWithJenkinsPerSuite { +class CoveragePluginITest extends IntegrationTestWithJenkinsPerSuite { /** * Covered lines in {@value JACOCO_ANALYSIS_MODEL_FILE}. @@ -87,9 +87,9 @@ public class CoveragePluginITest extends IntegrationTestWithJenkinsPerSuite { /** * Pipeline integration test with no adapter. */ - @Ignore + @Disabled("Bug") @Test - public void pipelineForNoAdapter() { + void pipelineForNoAdapter() { WorkflowJob job = createPipeline(); job.setDefinition(new CpsFlowDefinition("node {" + " publishCoverage adapters: []" @@ -101,9 +101,9 @@ public void pipelineForNoAdapter() { /** * Freestyle integration test with no adapter. */ - @Ignore + @Disabled("Bug") @Test - public void freestyleForNoAdapter() { + void freestyleForNoAdapter() { FreeStyleProject project = createFreeStyleProject(); CoveragePublisher coveragePublisher = new CoveragePublisher(); project.getPublishersList().add(coveragePublisher); @@ -114,7 +114,7 @@ public void freestyleForNoAdapter() { * Pipeline integration test with no file. */ @Test - public void pipelineForNoJacoco() { + void pipelineForNoJacoco() { WorkflowJob job = createPipeline(); job.setDefinition(getCpsFlowDefinitionWithAdapter(JACOCO_ADAPTER)); @@ -123,7 +123,7 @@ public void pipelineForNoJacoco() { /** Example integration test for a pipeline with code coverage. */ @Test - public void pipelineForOneJacoco() { + void pipelineForOneJacoco() { WorkflowJob job = createPipelineWithWorkspaceFiles(JACOCO_ANALYSIS_MODEL_FILE); job.setDefinition(getCpsFlowDefinitionWithAdapter(JACOCO_ADAPTER)); @@ -134,7 +134,7 @@ public void pipelineForOneJacoco() { * Pipeline integration test with two jacoco files. */ @Test - public void pipelineForTwoJacoco() { + void pipelineForTwoJacoco() { WorkflowJob job = createPipelineWithWorkspaceFiles(JACOCO_ANALYSIS_MODEL_FILE, JACOCO_CODINGSTYLE_FILE); job.setDefinition(getCpsFlowDefinitionWithAdapter(JACOCO_ADAPTER)); @@ -145,7 +145,7 @@ public void pipelineForTwoJacoco() { * Freestyle integration test with no jacoco file. */ @Test - public void freestyleForNoJacoco() { + void freestyleForNoJacoco() { FreeStyleProject project = createFreeStyleProject(); CoveragePublisher coveragePublisher = new CoveragePublisher(); @@ -160,7 +160,7 @@ public void freestyleForNoJacoco() { * Freestyle integration test with one jacoco file. */ @Test - public void freestyleForOneJacoco() { + void freestyleForOneJacoco() { FreeStyleProject project = createFreeStyleProject(); copyFilesToWorkspace(project, JACOCO_ANALYSIS_MODEL_FILE); CoveragePublisher coveragePublisher = new CoveragePublisher(); @@ -175,7 +175,7 @@ public void freestyleForOneJacoco() { * Freestyle integration test with two jacoco files. */ @Test - public void freestyleForTwoJacoco() { + void freestyleForTwoJacoco() { FreeStyleProject project = createFreeStyleProject(); copyFilesToWorkspace(project, JACOCO_ANALYSIS_MODEL_FILE, JACOCO_CODINGSTYLE_FILE); @@ -196,7 +196,7 @@ public void freestyleForTwoJacoco() { * Pipeline integration test with no cobertura file. */ @Test - public void pipelineForNoCobertura() { + void pipelineForNoCobertura() { WorkflowJob job = createPipeline(); job.setDefinition(getCpsFlowDefinitionWithAdapter(COBERTURA_ADAPTER)); @@ -207,7 +207,7 @@ public void pipelineForNoCobertura() { * Pipeline integration test with one cobertura file. */ @Test - public void pipelineForOneCobertura() { + void pipelineForOneCobertura() { WorkflowJob job = createPipelineWithWorkspaceFiles(COBERTURA_HIGHER_COVERAGE_FILE); job.setDefinition(getCpsFlowDefinitionWithAdapter(COBERTURA_ADAPTER)); @@ -218,7 +218,7 @@ public void pipelineForOneCobertura() { * Pipeline integration test with two cobertura files. */ @Test - public void pipelineForTwoCobertura() { + void pipelineForTwoCobertura() { WorkflowJob job = createPipelineWithWorkspaceFiles(COBERTURA_HIGHER_COVERAGE_FILE, COBERTURA_WITH_LOTS_OF_DATA_FILE); @@ -231,7 +231,7 @@ public void pipelineForTwoCobertura() { * Freestyle integration test with no cobertura file. */ @Test - public void freestyleForNoCobertura() { + void freestyleForNoCobertura() { FreeStyleProject project = createFreeStyleProject(); CoveragePublisher coveragePublisher = new CoveragePublisher(); @@ -246,7 +246,7 @@ public void freestyleForNoCobertura() { * Freestyle integration test with one cobertura file. */ @Test - public void freestyleForOneCobertura() { + void freestyleForOneCobertura() { FreeStyleProject project = createFreeStyleProject(); copyFilesToWorkspace(project, COBERTURA_HIGHER_COVERAGE_FILE); CoveragePublisher coveragePublisher = new CoveragePublisher(); @@ -260,10 +260,9 @@ public void freestyleForOneCobertura() { /** * Freestyle integration test with two cobertura files. */ - @Ignore + @Disabled("Bug") @Test - public void freestyleForTwoCobertura() { - + void freestyleForTwoCobertura() { FreeStyleProject project = createFreeStyleProject(); copyFilesToWorkspace(project, COBERTURA_HIGHER_COVERAGE_FILE, COBERTURA_WITH_LOTS_OF_DATA_FILE); CoveragePublisher coveragePublisher = new CoveragePublisher(); @@ -285,7 +284,7 @@ public void freestyleForTwoCobertura() { * Pipeline integration test with one cobertura and one jacoco file. */ @Test - public void pipelineForOneCoberturaAndOneJacoco() { + void pipelineForOneCoberturaAndOneJacoco() { WorkflowJob job = createPipelineWithWorkspaceFiles(JACOCO_ANALYSIS_MODEL_FILE, COBERTURA_HIGHER_COVERAGE_FILE); job.setDefinition(new CpsFlowDefinition("node {" + " publishCoverage adapters: [jacocoAdapter('**/*.xml'), istanbulCoberturaAdapter('**/*.xml')]" @@ -298,7 +297,7 @@ public void pipelineForOneCoberturaAndOneJacoco() { * Freestyle integration test with one cobertura and one jacoco file. */ @Test - public void freestyleForOneCoberturaAndOneJacoco() { + void freestyleForOneCoberturaAndOneJacoco() { FreeStyleProject project = createFreeStyleProject(); copyFilesToWorkspace(project, JACOCO_ANALYSIS_MODEL_FILE, COBERTURA_HIGHER_COVERAGE_FILE); diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoveragePluginSourceITest.java b/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoveragePluginSourceITest.java index b57e9774b..adc62ed7c 100644 --- a/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoveragePluginSourceITest.java +++ b/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoveragePluginSourceITest.java @@ -7,28 +7,15 @@ import java.util.Collections; import java.util.Optional; -import org.junit.AssumptionViolatedException; -import org.junit.Rule; -import org.junit.Test; - -import com.cloudbees.plugins.credentials.CredentialsScope; -import com.cloudbees.plugins.credentials.SystemCredentialsProvider; -import com.cloudbees.plugins.credentials.domains.Domain; -import com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl; +import org.junit.jupiter.api.Test; import edu.hm.hafner.util.PathUtil; import org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition; import org.jenkinsci.plugins.workflow.job.WorkflowJob; -import org.jenkinsci.test.acceptance.docker.DockerContainer; -import org.jenkinsci.test.acceptance.docker.DockerRule; import hudson.model.FreeStyleProject; import hudson.model.Run; import hudson.model.TopLevelItem; -import hudson.plugins.sshslaves.SSHLauncher; -import hudson.slaves.DumbSlave; -import hudson.slaves.EnvironmentVariablesNodeProperty; -import hudson.slaves.EnvironmentVariablesNodeProperty.Entry; import jenkins.model.ParameterizedJobMixIn.ParameterizedJob; import io.jenkins.plugins.coverage.CoveragePublisher; @@ -38,7 +25,6 @@ import io.jenkins.plugins.util.IntegrationTestWithJenkinsPerSuite; import static org.assertj.core.api.Assertions.*; -import static org.assertj.core.api.Assumptions.*; /** * Integration tests for the coverage API plugin. @@ -46,23 +32,18 @@ * @author Ullrich Hafner */ @SuppressWarnings({"checkstyle:ClassDataAbstractionCoupling", "checkstyle:ClassFanOutComplexity"}) -public class CoveragePluginSourceITest extends IntegrationTestWithJenkinsPerSuite { +class CoveragePluginSourceITest extends IntegrationTestWithJenkinsPerSuite { private static final String ACU_COBOL_PARSER = "public class AcuCobolParser extends LookaheadParser {"; private static final String NO_SOURCE_CODE = "n/a"; private static final String SOURCE_FILE = "AcuCobolParser.java.txt"; private static final String PACKAGE_PATH = "edu/hm/hafner/analysis/parser/"; private static final String ACU_COBOL_PARSER_COVERAGE_REPORT = "jacoco-acu-cobol-parser.xml"; private static final PathUtil PATH_UTIL = new PathUtil(); - - /** Docker container for java-maven builds. Contains also git to check out from an SCM. */ - @Rule - public DockerRule javaDockerRule = new DockerRule<>(JavaGitContainer.class); - - private static final String FILE_NAME = "jacoco-analysis-model.xml"; + static final String FILE_NAME = "jacoco-analysis-model.xml"; /** Verifies that the plugin reads source code from the workspace root. */ @Test - public void coveragePluginPipelineWithSourceCode() { + void coveragePluginPipelineWithSourceCode() { Run workspace = runCoverageWithSourceCode("", ""); assertThat(getConsoleLog(workspace)).contains(createSingleMessage(workspace)); @@ -74,7 +55,7 @@ private String createSingleMessage(final Run workspace) { /** Verifies that the plugin reads source code in subdirectories of the workspace. */ @Test - public void coveragePluginPipelineWithSourceCodeInSubdirectory() { + void coveragePluginPipelineWithSourceCodeInSubdirectory() { Run workspace = runCoverageWithSourceCode("", ""); assertThat(getConsoleLog(workspace)).contains(createSingleMessage(workspace)); } @@ -86,7 +67,7 @@ private String createSingleDirectory(final Run workspace) { /** Verifies that the plugin reads source code in external but approved directories. */ @Test - public void coveragePluginPipelineWithSourceCodeInPermittedDirectory() throws IOException { + void coveragePluginPipelineWithSourceCodeInPermittedDirectory() throws IOException { String directory = createExternalSourceFolder(); PrismConfiguration.getInstance().setSourceDirectories(Collections.singletonList( new PermittedSourceCodeDirectory(directory))); @@ -100,11 +81,11 @@ public void coveragePluginPipelineWithSourceCodeInPermittedDirectory() throws IO /** Verifies that the plugin refuses source code in directories that are not approved in Jenkins' configuration. */ @Test - public void coveragePluginPipelineNotRegisteredSourceCodeDirectory() throws IOException { + void coveragePluginPipelineNotRegisteredSourceCodeDirectory() throws IOException { String sourceDirectory = createExternalSourceFolder(); WorkflowJob job = createPipelineWithWorkspaceFiles(ACU_COBOL_PARSER_COVERAGE_REPORT); - copyFileToWorkspace(job, SOURCE_FILE, "ignore" + PACKAGE_PATH + "AcuCobolParser.java"); + copyFileToWorkspace(job, SOURCE_FILE, "ignore/" + PACKAGE_PATH + "AcuCobolParser.java"); String sourceCodeRetention = "STORE_ALL_BUILD"; job.setDefinition(createPipelineWithSourceCode(sourceCodeRetention, sourceDirectory)); @@ -133,8 +114,7 @@ private String createExternalSourceFolder() throws IOException { copyFileToWorkspace(job, SOURCE_FILE, checkoutDirectory + PACKAGE_PATH + "AcuCobolParser.java"); String sourceCodeRetention = "STORE_ALL_BUILD"; - job.setDefinition(createPipelineWithSourceCode(sourceCodeRetention, sourceDirectory - )); + job.setDefinition(createPipelineWithSourceCode(sourceCodeRetention, sourceDirectory)); Run firstBuild = buildSuccessfully(job); @@ -147,8 +127,7 @@ private String createExternalSourceFolder() throws IOException { verifySourceCodeInBuild(secondBuild, ACU_COBOL_PARSER); verifySourceCodeInBuild(firstBuild, ACU_COBOL_PARSER); // should be still available - job.setDefinition(createPipelineWithSourceCode("STORE_LAST_BUILD", sourceDirectory - )); + job.setDefinition(createPipelineWithSourceCode("STORE_LAST_BUILD", sourceDirectory)); Run thirdBuild = buildSuccessfully(job); verifySourceCodeInBuild(thirdBuild, ACU_COBOL_PARSER); verifySourceCodeInBuild(firstBuild, NO_SOURCE_CODE); // should be still available @@ -198,7 +177,7 @@ private SourceViewModel verifySourceModel(final Run build) { /** Freestyle job integration test for a simple build with code coverage. */ @Test - public void coveragePluginFreestyleHelloWorld() { + void coveragePluginFreestyleHelloWorld() { FreeStyleProject project = createFreeStyleProject(); copyFilesToWorkspace(project, FILE_NAME); @@ -210,87 +189,8 @@ public void coveragePluginFreestyleHelloWorld() { verifySimpleCoverageNode(project); } - /** Integration test for a freestyle build with code coverage that runs on an agent. */ - @Test - public void coverageFreeStyleOnAgent() throws IOException, InterruptedException { - assumeThat(isWindows()).as("Running on Windows").isFalse(); - - DumbSlave agent = createDockerContainerAgent(javaDockerRule.get()); - FreeStyleProject project = createFreeStyleProject(); - project.setAssignedNode(agent); - - copySingleFileToAgentWorkspace(agent, project, FILE_NAME, FILE_NAME); - CoveragePublisher coveragePublisher = new CoveragePublisher(); - JacocoReportAdapter jacocoReportAdapter = new JacocoReportAdapter(FILE_NAME); - coveragePublisher.setAdapters(Collections.singletonList(jacocoReportAdapter)); - project.getPublishersList().add(coveragePublisher); - - verifySimpleCoverageNode(project); - } - - /** Integration test for a pipeline with code coverage that runs on an agent. */ - @Test - public void coveragePipelineOnAgentNode() throws IOException, InterruptedException { - assumeThat(isWindows()).as("Running on Windows").isFalse(); - - DumbSlave agent = createDockerContainerAgent(javaDockerRule.get()); - WorkflowJob project = createPipelineOnAgent(); - - copySingleFileToAgentWorkspace(agent, project, FILE_NAME, FILE_NAME); - - verifySimpleCoverageNode(project); - } - - private WorkflowJob createPipelineOnAgent() { - WorkflowJob job = createPipeline(); - job.setDefinition(new CpsFlowDefinition("node('docker') {" - + "timestamps {\n" - + " checkout([$class: 'GitSCM', " - + " branches: [[name: '6bd346bbcc9779467ce657b2618ab11e38e28c2c' ]],\n" - + " userRemoteConfigs: [[url: '" + "https://github.com/jenkinsci/analysis-model.git" + "']],\n" - + " extensions: [[$class: 'RelativeTargetDirectory', \n" - + " relativeTargetDir: 'checkout']]])\n" - + " publishCoverage adapters: [jacocoAdapter('" + FILE_NAME - + "')], sourceFileResolver: sourceFiles('STORE_ALL_BUILD')\n" - + "}" - + "}", true)); - - return job; - } - - /** - * Creates a docker container agent. - * - * @param dockerContainer - * the docker container of the agent - * - * @return A docker container agent. - */ - @SuppressWarnings({"PMD.AvoidCatchingThrowable", "IllegalCatch"}) - protected DumbSlave createDockerContainerAgent(final DockerContainer dockerContainer) { - try { - SystemCredentialsProvider.getInstance().getDomainCredentialsMap().put(Domain.global(), - Collections.singletonList( - new UsernamePasswordCredentialsImpl(CredentialsScope.SYSTEM, "dummyCredentialId", - null, "test", "test") - ) - ); - DumbSlave agent = new DumbSlave("docker", "/home/test", - new SSHLauncher(dockerContainer.ipBound(22), dockerContainer.port(22), "dummyCredentialId")); - agent.setNodeProperties(Collections.singletonList(new EnvironmentVariablesNodeProperty( - new Entry("JAVA_HOME", "/usr/lib/jvm/java-8-openjdk-amd64/jre")))); - getJenkins().jenkins.addNode(agent); - getJenkins().waitOnline(agent); - - return agent; - } - catch (Throwable e) { - throw new AssumptionViolatedException("Failed to create docker container", e); - } - } - @SuppressWarnings("PMD.SystemPrintln") - private void verifySimpleCoverageNode(final ParameterizedJob project) { + void verifySimpleCoverageNode(final ParameterizedJob project) { Run build = buildSuccessfully(project); assertThat(build.getNumber()).isEqualTo(1); @@ -299,5 +199,4 @@ private void verifySimpleCoverageNode(final ParameterizedJob project) { .isEqualTo(new Coverage(6083, 6368 - 6083)); System.out.println(getConsoleLog(build)); } - } diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoverageXmlStreamTest.java b/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoverageXmlStreamTest.java index c2c7c5adf..357e3c148 100644 --- a/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoverageXmlStreamTest.java +++ b/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoverageXmlStreamTest.java @@ -21,7 +21,7 @@ * * @author Ullrich Hafner */ -public class CoverageXmlStreamTest extends SerializableTest { +class CoverageXmlStreamTest extends SerializableTest { @Override protected CoverageNode createSerializable() { // TODO: replace with actual result diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/model/DeclarativePipelineSupportITest.java b/plugin/src/test/java/io/jenkins/plugins/coverage/model/DeclarativePipelineSupportITest.java index 0df9c3c46..ff09b475b 100644 --- a/plugin/src/test/java/io/jenkins/plugins/coverage/model/DeclarativePipelineSupportITest.java +++ b/plugin/src/test/java/io/jenkins/plugins/coverage/model/DeclarativePipelineSupportITest.java @@ -1,6 +1,6 @@ package io.jenkins.plugins.coverage.model; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition; import org.jenkinsci.plugins.workflow.job.WorkflowJob; @@ -13,14 +13,14 @@ /** * Integration test to check if declarative pipelines are supported. */ -public class DeclarativePipelineSupportITest extends IntegrationTestWithJenkinsPerSuite { +class DeclarativePipelineSupportITest extends IntegrationTestWithJenkinsPerSuite { private static final String JACOCO_ANALYSIS_MODEL_XML = "jacoco-analysis-model.xml"; /** * Check if code coverage is supported in declarative pipelines. */ @Test - public void declarativePipelineSupportJacoco() { + void declarativePipelineSupportJacoco() { WorkflowJob job = createPipelineWithWorkspaceFiles(JACOCO_ANALYSIS_MODEL_XML); job.setDefinition(new CpsFlowDefinition("pipeline {\n" @@ -40,7 +40,6 @@ public void declarativePipelineSupportJacoco() { assertThat(build.getAction(CoverageBuildAction.class).getLineCoverage()) .isEqualTo(new Coverage(6083, 6368 - 6083)); } - } diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/model/DeltaComputationVsReferenceBuildITest.java b/plugin/src/test/java/io/jenkins/plugins/coverage/model/DeltaComputationVsReferenceBuildITest.java index 3d5afe142..2ccdc7748 100644 --- a/plugin/src/test/java/io/jenkins/plugins/coverage/model/DeltaComputationVsReferenceBuildITest.java +++ b/plugin/src/test/java/io/jenkins/plugins/coverage/model/DeltaComputationVsReferenceBuildITest.java @@ -3,8 +3,8 @@ import java.io.IOException; import java.util.Collections; -import org.junit.Ignore; -import org.junit.Test; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; import org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition; import org.jenkinsci.plugins.workflow.job.WorkflowJob; @@ -24,8 +24,7 @@ /** * Integration test for delta computation of reference builds. */ -public class DeltaComputationVsReferenceBuildITest extends IntegrationTestWithJenkinsPerSuite { - +class DeltaComputationVsReferenceBuildITest extends IntegrationTestWithJenkinsPerSuite { private static final String JACOCO_ANALYSIS_MODEL_FILE = "jacoco-analysis-model.xml"; private static final String JACOCO_CODINGSTYLE_FILE = "jacoco-codingstyle.xml"; @@ -37,9 +36,9 @@ public class DeltaComputationVsReferenceBuildITest extends IntegrationTestWithJe * @throws ClassNotFoundException * when trying to recover coverage result */ - @Ignore + @Disabled("Bug") @Test - public void freestyleProjectTryCreatingReferenceBuildWithDeltaComputation() + void freestyleProjectTryCreatingReferenceBuildWithDeltaComputation() throws IOException, ClassNotFoundException { FreeStyleProject project = createFreeStyleProjectWithWorkspaceFiles(JACOCO_ANALYSIS_MODEL_FILE); @@ -108,7 +107,7 @@ private void verifyDeltaComputation(final Run firstBuild, final Run * when trying to recover coverage result */ @Test - public void pipelineCreatingReferenceBuildWithDeltaComputation() throws IOException, ClassNotFoundException { + void pipelineCreatingReferenceBuildWithDeltaComputation() throws IOException, ClassNotFoundException { WorkflowJob job = createPipelineWithWorkspaceFiles(JACOCO_ANALYSIS_MODEL_FILE); job.setDefinition(new CpsFlowDefinition("node {" + " publishCoverage adapters: [jacocoAdapter('" + JACOCO_ANALYSIS_MODEL_FILE diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/model/DockerAndSourceCodeRenderingITest.java b/plugin/src/test/java/io/jenkins/plugins/coverage/model/DockerAndSourceCodeRenderingITest.java index 17e3d4cd5..84a65272a 100644 --- a/plugin/src/test/java/io/jenkins/plugins/coverage/model/DockerAndSourceCodeRenderingITest.java +++ b/plugin/src/test/java/io/jenkins/plugins/coverage/model/DockerAndSourceCodeRenderingITest.java @@ -4,26 +4,16 @@ import java.util.Collections; import java.util.TreeMap; -import org.junit.AssumptionViolatedException; -import org.junit.Rule; -import org.junit.Test; - -import com.cloudbees.plugins.credentials.CredentialsScope; -import com.cloudbees.plugins.credentials.SystemCredentialsProvider; -import com.cloudbees.plugins.credentials.domains.Domain; -import com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl; +import org.junit.jupiter.api.Test; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; import org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition; import org.jenkinsci.plugins.workflow.job.WorkflowJob; -import org.jenkinsci.test.acceptance.docker.DockerContainer; -import org.jenkinsci.test.acceptance.docker.DockerRule; import hudson.model.FreeStyleProject; import hudson.model.HealthReport; +import hudson.model.Node; import hudson.model.Run; -import hudson.plugins.sshslaves.SSHLauncher; -import hudson.slaves.DumbSlave; -import hudson.slaves.EnvironmentVariablesNodeProperty; -import hudson.slaves.EnvironmentVariablesNodeProperty.Entry; import io.jenkins.plugins.coverage.CoveragePublisher; import io.jenkins.plugins.coverage.adapter.JacocoReportAdapter; @@ -33,27 +23,23 @@ import static org.assertj.core.api.Assumptions.*; /** - * Tests if source code Rendering and copying works with Docker and if freestyle-projects run successfully with Docker. + * Tests if source code copying and rendering and copying works on Docker agents. */ +@Testcontainers @SuppressWarnings("checkstyle:ClassDataAbstractionCoupling") -public class DockerAndSourceCodeRenderingITest extends IntegrationTestWithJenkinsPerSuite { +class DockerAndSourceCodeRenderingITest extends IntegrationTestWithJenkinsPerSuite { private static final String JACOCO_ANALYSIS_MODEL_FILE = "jacoco-analysis-model.xml"; private static final String COMMIT = "6bd346bbcc9779467ce657b2618ab11e38e28c2c"; private static final String REPOSITORY = "https://github.com/jenkinsci/analysis-model.git"; + @Container + private static final AgentContainer AGENT_CONTAINER = new AgentContainer(); - /** Docker container for java-maven builds. Contains also git to check out from an SCM. */ - @Rule - public DockerRule javaDockerRule = new DockerRule<>(JavaGitContainer.class); - - /** - * Integration test for a pipeline with sourcecode that runs on an agent. - */ @Test - public void copySourceCodeAndCodeRenderingPipelineOnAgent() throws IOException, InterruptedException { + void shouldCopyAndRenderSourceCodeAndRenderingInPipelineOnDockerAgent() { assumeThat(isWindows()).as("Running on Windows").isFalse(); - DumbSlave agent = createDockerContainerAgent(javaDockerRule.get()); - WorkflowJob project = createPipelineWithSCMandJacocoAdapter("node('docker')"); + Node agent = createDockerAgent(AGENT_CONTAINER); + WorkflowJob project = createPipelineWithGitAndJacocoAdapter("node('" + DOCKER_AGENT_NAME + "')"); copySingleFileToAgentWorkspace(agent, project, JACOCO_ANALYSIS_MODEL_FILE, JACOCO_ANALYSIS_MODEL_FILE); @@ -62,23 +48,27 @@ public void copySourceCodeAndCodeRenderingPipelineOnAgent() throws IOException, verifySourceCode(build); } - /** - * Integration test for a pipeline with sourcecode. - */ @Test - public void copySourceCodeAndCodeRenderingPipeline() { - WorkflowJob job = createPipelineWithSCMandJacocoAdapter("node"); - Run build = verifyGitRepository(job); + void shouldCopyAndRenderSourceCodeAndRenderingInFreestyleJobOnAgent() throws IOException { + assumeThat(isWindows()).as("Running on Windows").isFalse(); - verifySourceCode(build); + Node agent = createDockerAgent(AGENT_CONTAINER); + FreeStyleProject project = createFreeStyleProject(); + project.setAssignedNode(agent); + copySingleFileToAgentWorkspace(agent, project, JACOCO_ANALYSIS_MODEL_FILE, JACOCO_ANALYSIS_MODEL_FILE); + CoveragePublisher coveragePublisher = new CoveragePublisher(); + JacocoReportAdapter jacocoReportAdapter = new JacocoReportAdapter(JACOCO_ANALYSIS_MODEL_FILE); + coveragePublisher.setAdapters(Collections.singletonList(jacocoReportAdapter)); + project.getPublishersList().add(coveragePublisher); + Run build = buildSuccessfully(project); + + assertThat(build.getNumber()).isEqualTo(1); + + CoverageBuildAction coverageResult = build.getAction(CoverageBuildAction.class); + assertThat(coverageResult.getLineCoverage()) + .isEqualTo(new Coverage(6083, 6368 - 6083)); } - /** - * Verifies sourcecode is present in project. - * - * @param build - * job of the project - */ private void verifySourceCode(final Run build) { CoverageNode root = new CoverageNode(CoverageMetric.MODULE, "top-level"); @@ -89,14 +79,6 @@ private void verifySourceCode(final Run build) { assertThat(action.getTarget()).extracting(CoverageViewModel::getOwner).isEqualTo(build); } - /** - * Verifies clone of repository by checking console log. - * - * @param workflowJob - * job of the project - * - * @return build of {@link WorkflowJob} - */ private Run verifyGitRepository(final WorkflowJob workflowJob) { Run build = buildSuccessfully(workflowJob); @@ -109,38 +91,7 @@ private void verifySourceCode(final Run build) { return build; } - /** - * Creates a docker container agent. - * - * @param dockerContainer - * the docker container of the agent - * - * @return A docker container agent. - */ - @SuppressWarnings({"PMD.AvoidCatchingThrowable", "IllegalCatch"}) - protected DumbSlave createDockerContainerAgent(final DockerContainer dockerContainer) { - try { - SystemCredentialsProvider.getInstance().getDomainCredentialsMap().put(Domain.global(), - Collections.singletonList( - new UsernamePasswordCredentialsImpl(CredentialsScope.SYSTEM, "dummyCredentialId", - null, "test", "test") - ) - ); - DumbSlave agent = new DumbSlave("docker", "/home/test", - new SSHLauncher(dockerContainer.ipBound(22), dockerContainer.port(22), "dummyCredentialId")); - agent.setNodeProperties(Collections.singletonList(new EnvironmentVariablesNodeProperty( - new Entry("JAVA_HOME", "/usr/lib/jvm/java-8-openjdk-amd64/jre")))); - getJenkins().jenkins.addNode(agent); - getJenkins().waitOnline(agent); - - return agent; - } - catch (Throwable e) { - throw new AssumptionViolatedException("Failed to create docker container", e); - } - } - - private WorkflowJob createPipelineWithSCMandJacocoAdapter(final String node) { + private WorkflowJob createPipelineWithGitAndJacocoAdapter(final String node) { WorkflowJob job = createPipeline(); job.setDefinition(new CpsFlowDefinition(node + " {" + " checkout([$class: 'GitSCM', " @@ -154,33 +105,4 @@ private WorkflowJob createPipelineWithSCMandJacocoAdapter(final String node) { return job; } - - /** - * Tests if freestyle project is running successfully in docker. - * - * @throws IOException - * due to javaDockerRule.get() - * @throws InterruptedException - * to setAssignedNode() to project - */ - @Test - public void freestyleProjectCoverageOnAgentNode() throws IOException, InterruptedException { - assumeThat(isWindows()).as("Running on Windows").isFalse(); - - DumbSlave agent = createDockerContainerAgent(javaDockerRule.get()); - FreeStyleProject project = createFreeStyleProject(); - project.setAssignedNode(agent); - copySingleFileToAgentWorkspace(agent, project, JACOCO_ANALYSIS_MODEL_FILE, JACOCO_ANALYSIS_MODEL_FILE); - CoveragePublisher coveragePublisher = new CoveragePublisher(); - JacocoReportAdapter jacocoReportAdapter = new JacocoReportAdapter(JACOCO_ANALYSIS_MODEL_FILE); - coveragePublisher.setAdapters(Collections.singletonList(jacocoReportAdapter)); - project.getPublishersList().add(coveragePublisher); - Run build = buildSuccessfully(project); - - assertThat(build.getNumber()).isEqualTo(1); - - CoverageBuildAction coverageResult = build.getAction(CoverageBuildAction.class); - assertThat(coverageResult.getLineCoverage()) - .isEqualTo(new Coverage(6083, 6368 - 6083)); - } } diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/model/DockerCoveragePluginSourceITest.java b/plugin/src/test/java/io/jenkins/plugins/coverage/model/DockerCoveragePluginSourceITest.java new file mode 100644 index 000000000..031fba352 --- /dev/null +++ b/plugin/src/test/java/io/jenkins/plugins/coverage/model/DockerCoveragePluginSourceITest.java @@ -0,0 +1,77 @@ +package io.jenkins.plugins.coverage.model; + +import java.io.IOException; +import java.util.Collections; + +import org.junit.jupiter.api.Test; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; + +import org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition; +import org.jenkinsci.plugins.workflow.job.WorkflowJob; +import hudson.model.FreeStyleProject; +import hudson.model.Node; + +import io.jenkins.plugins.coverage.CoveragePublisher; +import io.jenkins.plugins.coverage.adapter.JacocoReportAdapter; + +import static org.assertj.core.api.Assumptions.*; + +/** + * Integration tests for the coverage API plugin. + * + * @author Ullrich Hafner + */ +@Testcontainers +class DockerCoveragePluginSourceITest extends CoveragePluginSourceITest { + @Container + private static final AgentContainer AGENT_CONTAINER = new AgentContainer(); + + /** Integration test for a freestyle build with code coverage that runs on an agent. */ + @Test + void coverageFreeStyleOnAgent() throws IOException { + assumeThat(isWindows()).as("Running on Windows").isFalse(); + + Node agent = createDockerAgent(AGENT_CONTAINER); + FreeStyleProject project = createFreeStyleProject(); + project.setAssignedNode(agent); + + copySingleFileToAgentWorkspace(agent, project, FILE_NAME, FILE_NAME); + CoveragePublisher coveragePublisher = new CoveragePublisher(); + JacocoReportAdapter jacocoReportAdapter = new JacocoReportAdapter(FILE_NAME); + coveragePublisher.setAdapters(Collections.singletonList(jacocoReportAdapter)); + project.getPublishersList().add(coveragePublisher); + + verifySimpleCoverageNode(project); + } + + /** Integration test for a pipeline with code coverage that runs on an agent. */ + @Test + void coveragePipelineOnAgentNode() { + assumeThat(isWindows()).as("Running on Windows").isFalse(); + + Node agent = createDockerAgent(AGENT_CONTAINER); + WorkflowJob project = createPipelineOnAgent(); + + copySingleFileToAgentWorkspace(agent, project, FILE_NAME, FILE_NAME); + + verifySimpleCoverageNode(project); + } + + private WorkflowJob createPipelineOnAgent() { + WorkflowJob job = createPipeline(); + job.setDefinition(new CpsFlowDefinition("node('" + DOCKER_AGENT_NAME + "') {" + + "timestamps {\n" + + " checkout([$class: 'GitSCM', " + + " branches: [[name: '6bd346bbcc9779467ce657b2618ab11e38e28c2c' ]],\n" + + " userRemoteConfigs: [[url: '" + "https://github.com/jenkinsci/analysis-model.git" + "']],\n" + + " extensions: [[$class: 'RelativeTargetDirectory', \n" + + " relativeTargetDir: 'checkout']]])\n" + + " publishCoverage adapters: [jacocoAdapter('" + FILE_NAME + + "')], sourceFileResolver: sourceFiles('STORE_ALL_BUILD')\n" + + "}" + + "}", true)); + + return job; + } +} diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/model/FailBuildIfCoverageDecreasesITest.java b/plugin/src/test/java/io/jenkins/plugins/coverage/model/FailBuildIfCoverageDecreasesITest.java index 1eb378324..5d24bb291 100644 --- a/plugin/src/test/java/io/jenkins/plugins/coverage/model/FailBuildIfCoverageDecreasesITest.java +++ b/plugin/src/test/java/io/jenkins/plugins/coverage/model/FailBuildIfCoverageDecreasesITest.java @@ -3,7 +3,7 @@ import java.io.IOException; import java.util.Collections; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition; import org.jenkinsci.plugins.workflow.job.WorkflowJob; @@ -14,12 +14,10 @@ import io.jenkins.plugins.coverage.adapter.CoberturaReportAdapter; import io.jenkins.plugins.util.IntegrationTestWithJenkinsPerSuite; -enum CoverageDecreasedAction { FAIL_BUILD, DONT_FAIL_BUILD} - /** * Integration test for checking if build failes when coverage decreases. */ -public class FailBuildIfCoverageDecreasesITest extends IntegrationTestWithJenkinsPerSuite { +class FailBuildIfCoverageDecreasesITest extends IntegrationTestWithJenkinsPerSuite { private static final String COBERTURA_HIGHER_COVERAGE = "cobertura-higher-coverage.xml"; private static final String COBERTURA_LOWER_COVERAGE = "cobertura-lower-coverage.xml"; @@ -30,7 +28,7 @@ public class FailBuildIfCoverageDecreasesITest extends IntegrationTestWithJenkin * if creating Project throws Exception */ @Test - public void freestyleProjectTestBuildResultDependingOnFailBuildIfCoverageDecreases() throws IOException { + void freestyleProjectTestBuildResultDependingOnFailBuildIfCoverageDecreases() throws IOException { FreeStyleProject freestyleProjectIfDecreasesSetFailTrue = createFreestyleProjectWithDecreasedCoverage( COBERTURA_HIGHER_COVERAGE, COBERTURA_LOWER_COVERAGE, CoverageDecreasedAction.FAIL_BUILD); @@ -46,7 +44,7 @@ public void freestyleProjectTestBuildResultDependingOnFailBuildIfCoverageDecreas * Integration test for pipeline projects for checking if build failes when coverage decreases. */ @Test - public void pipelineProjectTestBuildResultDependingOnFailBuildIfCoverageDecreases() { + void pipelineProjectTestBuildResultDependingOnFailBuildIfCoverageDecreases() { WorkflowJob pipelineProjectIfDecreasesSetFailTrue = createPipelineProjectWithDecreasedCoverage( COBERTURA_HIGHER_COVERAGE, COBERTURA_LOWER_COVERAGE, CoverageDecreasedAction.FAIL_BUILD); @@ -135,6 +133,7 @@ WorkflowJob createPipelineProjectWithDecreasedCoverage(final String filename, return job; } + enum CoverageDecreasedAction { FAIL_BUILD, DONT_FAIL_BUILD} } diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/model/HealthReportITest.java b/plugin/src/test/java/io/jenkins/plugins/coverage/model/HealthReportITest.java index 29c230143..7d061ef6c 100644 --- a/plugin/src/test/java/io/jenkins/plugins/coverage/model/HealthReportITest.java +++ b/plugin/src/test/java/io/jenkins/plugins/coverage/model/HealthReportITest.java @@ -4,7 +4,7 @@ import java.util.Collections; import java.util.List; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition; import org.jenkinsci.plugins.workflow.job.WorkflowJob; @@ -20,16 +20,10 @@ import static org.assertj.core.api.Assertions.*; -/** - * Enum for Thresholds being set or not to get different HealthReports in tests. - */ - -enum Thresholds { SET_THRESHOLDS_TO_RETURN_UNSTABLE_BUILD, DONT_SET_ANY_THRESHOLDS} - /** * Integration Test for HealthReports. */ -public class HealthReportITest extends IntegrationTestWithJenkinsPerSuite { +class HealthReportITest extends IntegrationTestWithJenkinsPerSuite { private static final String JACOCO_FILE_NAME = "jacoco-analysis-model.xml"; private static final int UNSTABLE_LINE_THRESHOLD = 100; @@ -37,7 +31,7 @@ public class HealthReportITest extends IntegrationTestWithJenkinsPerSuite { * No Build should succeed, no thresholds set, HealthScore should be 100%. */ @Test - public void freestyleProjectShouldReturnSuccess() { + void freestyleProjectShouldReturnSuccess() { FreeStyleProject project = createFreeStyleProject(Thresholds.DONT_SET_ANY_THRESHOLDS); Run build = buildWithResult(project, Result.SUCCESS); @@ -49,7 +43,7 @@ public void freestyleProjectShouldReturnSuccess() { * Build should be unstable, thresholds set, HealthScore is 0%. */ @Test - public void freestyleProjectShouldReturnUnstable() { + void freestyleProjectShouldReturnUnstable() { FreeStyleProject project = createFreeStyleProject(Thresholds.SET_THRESHOLDS_TO_RETURN_UNSTABLE_BUILD); Run build = buildWithResult(project, Result.UNSTABLE); @@ -86,7 +80,7 @@ private FreeStyleProject createFreeStyleProject(final Thresholds thresholdsAppli * Build of pipeline project should succeed and HealthScore is 100%. */ @Test - public void pipelineShouldReturnSuccess() { + void pipelineShouldReturnSuccess() { WorkflowJob job = createPipelineWithWorkspaceFiles(JACOCO_FILE_NAME); job.setDefinition(new CpsFlowDefinition("node {" + " publishCoverage adapters: [jacocoAdapter('" + JACOCO_FILE_NAME + "')]," @@ -102,7 +96,7 @@ public void pipelineShouldReturnSuccess() { * Build of pipeline project should be unstable and HealthScore is 0%. */ @Test - public void pipelineShouldReturnUnstable() { + void pipelineShouldReturnUnstable() { WorkflowJob job = createPipelineWithWorkspaceFiles(JACOCO_FILE_NAME); job.setDefinition(new CpsFlowDefinition("node {" + " publishCoverage adapters: [jacocoAdapter('" + JACOCO_FILE_NAME + "')]," @@ -136,4 +130,10 @@ private void verifyHealthReportBasedOnHighOrNoThresholdsSet(final Run buil assertThat(healthReport.getIconUrl()).isEqualTo("health-00to19.png"); } } + + /** + * Enum for Thresholds being set or not to get different HealthReports in tests. + */ + + enum Thresholds { SET_THRESHOLDS_TO_RETURN_UNSTABLE_BUILD, DONT_SET_ANY_THRESHOLDS} } diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/model/JavaGitContainer.java b/plugin/src/test/java/io/jenkins/plugins/coverage/model/JavaGitContainer.java deleted file mode 100644 index bb73203b1..000000000 --- a/plugin/src/test/java/io/jenkins/plugins/coverage/model/JavaGitContainer.java +++ /dev/null @@ -1,22 +0,0 @@ -package io.jenkins.plugins.coverage.model; - -import org.jenkinsci.test.acceptance.docker.DockerFixture; -import org.jenkinsci.test.acceptance.docker.fixtures.SshdContainer; - -/** - * Represents a server with SSHD, Java tooling, Maven and Git. - * - * @author Ullrich Hafner - */ -@DockerFixture(id = "java-git", ports = {22, 8080}) -public class JavaGitContainer extends SshdContainer { - /** - * Creates a new instance of {@link JavaGitContainer}. - */ - @SuppressWarnings("PMD.UnnecessaryConstructor") - public JavaGitContainer() { - super(); - - // required for dependency injection - } -} diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/model/MultipleInvocationsOfStepITest.java b/plugin/src/test/java/io/jenkins/plugins/coverage/model/MultipleInvocationsOfStepITest.java index 7fb5e135d..0b76a580d 100644 --- a/plugin/src/test/java/io/jenkins/plugins/coverage/model/MultipleInvocationsOfStepITest.java +++ b/plugin/src/test/java/io/jenkins/plugins/coverage/model/MultipleInvocationsOfStepITest.java @@ -2,8 +2,8 @@ import java.util.List; -import org.junit.Ignore; -import org.junit.Test; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; import org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition; import org.jenkinsci.plugins.workflow.job.WorkflowJob; @@ -17,7 +17,7 @@ /** * Test multiple invocations of step. */ -public class MultipleInvocationsOfStepITest extends IntegrationTestWithJenkinsPerSuite { +class MultipleInvocationsOfStepITest extends IntegrationTestWithJenkinsPerSuite { private static final String JACOCO_LOWER_BRANCH_COVERAGE = "jacoco-analysis-model.xml"; private static final String JACOCO_HIGHER_BRANCH_COVERAGE = "jacoco-codingstyle.xml"; private static final int JACOCO_HIGHER_BRANCH_COVERAGE_COVERED_VALUE = 109; @@ -29,7 +29,7 @@ public class MultipleInvocationsOfStepITest extends IntegrationTestWithJenkinsPe * Pipeline with multiple invocations of step, no tag set and higher coverage file first. */ @Test - public void withoutTagFirstHigherFile() { + void withoutTagFirstHigherFile() { WorkflowJob job = createPipelineWithWorkspaceFiles(JACOCO_LOWER_BRANCH_COVERAGE, JACOCO_HIGHER_BRANCH_COVERAGE); job.setDefinition(new CpsFlowDefinition("node {" @@ -56,7 +56,7 @@ private List getCoverageBuildActions(final WorkflowJob job, * Pipeline with multiple invocations of step, no tag set and lower coverage file first. */ @Test - public void withoutTagFirstLowerFile() { + void withoutTagFirstLowerFile() { WorkflowJob job = createPipelineWithWorkspaceFiles(JACOCO_LOWER_BRANCH_COVERAGE, JACOCO_HIGHER_BRANCH_COVERAGE); job.setDefinition(new CpsFlowDefinition("node {" @@ -74,8 +74,8 @@ public void withoutTagFirstLowerFile() { * Pipeline with multiple invocations of step and tag set. */ @Test - @Ignore - public void withDifferentTag() { + @Disabled("Bug") + void withDifferentTag() { WorkflowJob job = createPipelineWithAdaptersAndTags("t2"); List buildAction = getCoverageBuildActions(job, 2); @@ -91,7 +91,7 @@ public void withDifferentTag() { * Pipeline with multiple invocations of step and tag set. */ @Test - public void witSameTag() { + void witSameTag() { WorkflowJob job = createPipelineWithAdaptersAndTags("t1"); List buildAction = getCoverageBuildActions(job, 1); diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/model/PluginArchitectureTest.java b/plugin/src/test/java/io/jenkins/plugins/coverage/model/PluginArchitectureTest.java new file mode 100644 index 000000000..e09c8a548 --- /dev/null +++ b/plugin/src/test/java/io/jenkins/plugins/coverage/model/PluginArchitectureTest.java @@ -0,0 +1,61 @@ +package io.jenkins.plugins.coverage.model; + +import com.tngtech.archunit.junit.AnalyzeClasses; +import com.tngtech.archunit.junit.ArchTest; +import com.tngtech.archunit.lang.ArchRule; + +import edu.hm.hafner.util.ArchitectureRules; + +import io.jenkins.plugins.util.PluginArchitectureRules; + +/** + * Defines several architecture rules for the static analysis model and parsers. + * + * @author Ullrich Hafner + */ +@SuppressWarnings("hideutilityclassconstructor") +@AnalyzeClasses(packages = "io.jenkins.plugins.coverage.model") +class PluginArchitectureTest { + @ArchTest + static final ArchRule NO_EXCEPTIONS_WITH_NO_ARG_CONSTRUCTOR = ArchitectureRules.NO_EXCEPTIONS_WITH_NO_ARG_CONSTRUCTOR; + + @ArchTest + static final ArchRule NO_PUBLIC_TEST_CLASSES = ArchitectureRules.NO_PUBLIC_TEST_CLASSES; + + @ArchTest + static final ArchRule NO_PUBLIC_TEST_METHODS = ArchitectureRules.ONLY_PACKAGE_PRIVATE_TEST_METHODS; + + @ArchTest + static final ArchRule NO_TEST_API_CALLED = ArchitectureRules.NO_TEST_API_CALLED; + + @ArchTest + static final ArchRule NO_FORBIDDEN_ANNOTATION_USED = ArchitectureRules.NO_FORBIDDEN_ANNOTATION_USED; + + @ArchTest + static final ArchRule NO_FORBIDDEN_CLASSES_CALLED = ArchitectureRules.NO_FORBIDDEN_CLASSES_CALLED; + + @ArchTest + static final ArchRule NO_PUBLIC_ARCHITECTURE_TESTS = ArchitectureRules.NO_PUBLIC_ARCHITECTURE_TESTS; + + @ArchTest + static final ArchRule NO_JENKINS_INSTANCE_CALL = PluginArchitectureRules.NO_JENKINS_INSTANCE_CALL; + + @ArchTest + static final ArchRule NO_FORBIDDEN_PACKAGE_ACCESSED = PluginArchitectureRules.NO_FORBIDDEN_PACKAGE_ACCESSED; + + @ArchTest + static final ArchRule AJAX_PROXY_METHOD_MUST_BE_IN_PUBLIC_CLASS = PluginArchitectureRules.AJAX_PROXY_METHOD_MUST_BE_IN_PUBLIC_CLASS; + + @ArchTest + static final ArchRule DATA_BOUND_CONSTRUCTOR_MUST_BE_IN_PUBLIC_CLASS = PluginArchitectureRules.DATA_BOUND_CONSTRUCTOR_MUST_BE_IN_PUBLIC_CLASS; + + @ArchTest + static final ArchRule DATA_BOUND_SETTER_MUST_BE_IN_PUBLIC_CLASS = PluginArchitectureRules.DATA_BOUND_SETTER_MUST_BE_IN_PUBLIC_CLASS; + + @ArchTest + static final ArchRule USE_POST_FOR_VALIDATION_END_POINTS = PluginArchitectureRules.USE_POST_FOR_VALIDATION_END_POINTS; + + @ArchTest + static final ArchRule USE_POST_FOR_LIST_MODELS_RULE = PluginArchitectureRules.USE_POST_FOR_LIST_AND_COMBOBOX_FILL; + +} diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/model/QualityGatesITest.java b/plugin/src/test/java/io/jenkins/plugins/coverage/model/QualityGatesITest.java index ddb2b5a2e..87d177d03 100644 --- a/plugin/src/test/java/io/jenkins/plugins/coverage/model/QualityGatesITest.java +++ b/plugin/src/test/java/io/jenkins/plugins/coverage/model/QualityGatesITest.java @@ -4,7 +4,7 @@ import java.util.Collections; import java.util.List; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition; import org.jenkinsci.plugins.workflow.job.WorkflowJob; @@ -24,8 +24,7 @@ /** * Integration test for QualityGates/thresholds being respected. */ -public class QualityGatesITest extends IntegrationTestWithJenkinsPerSuite { - +class QualityGatesITest extends IntegrationTestWithJenkinsPerSuite { private static final float NOT_ACHIEVED_UNHEALTHY_THRESHOLD = 99.9f; private static final float NOT_ACHIEVED_UNSTABLE_THRESHOLD = 99.9f; private static final float ACHIEVED_UNHEALTHY_THRESHOLD = 50f; @@ -37,7 +36,7 @@ public class QualityGatesITest extends IntegrationTestWithJenkinsPerSuite { * Tests if when QualityGates being fulfilled, build returns success without failure message. */ @Test - public void freeStyleShouldMeetQualityTargets() { + void freeStyleShouldMeetQualityTargets() { FreeStyleProject project = createFreeStyleProjectWithOneLineThresholds(ACHIEVED_UNHEALTHY_THRESHOLD, ACHIEVED_UNSTABLE_THRESHOLD); buildWithSuccess(project); @@ -47,7 +46,7 @@ public void freeStyleShouldMeetQualityTargets() { * Tests if when QualityGates for unstable not being fulfilled, build returns unstable with failure message. */ @Test - public void freeStyleShouldNotMeetQualityTargets() { + void freeStyleShouldNotMeetQualityTargets() { FreeStyleProject project = createFreeStyleProjectWithOneLineThresholds(NOT_ACHIEVED_UNHEALTHY_THRESHOLD, NOT_ACHIEVED_UNSTABLE_THRESHOLD); @@ -99,7 +98,7 @@ List createThresholdsContainingOneLineThreshold(final float unhealthy * Tests if build succeeds, when line thresholds within range. */ @Test - public void pipelineShouldMeetQualityTargets() { + void pipelineShouldMeetQualityTargets() { WorkflowJob job = createPipelineWithLineThreshold(ACHIEVED_UNHEALTHY_THRESHOLD, ACHIEVED_UNSTABLE_THRESHOLD); buildWithSuccess(job); } @@ -108,7 +107,7 @@ public void pipelineShouldMeetQualityTargets() { * Tests if build is unstable, when line thresholds above coverage. */ @Test - public void pipelineShouldNotMeetQualityTargets() { + void pipelineShouldNotMeetQualityTargets() { WorkflowJob job = createPipelineWithLineThreshold(NOT_ACHIEVED_UNHEALTHY_THRESHOLD, NOT_ACHIEVED_UNSTABLE_THRESHOLD); diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/model/ReportAggregationITest.java b/plugin/src/test/java/io/jenkins/plugins/coverage/model/ReportAggregationITest.java index c74be7c6a..d3e118cb1 100644 --- a/plugin/src/test/java/io/jenkins/plugins/coverage/model/ReportAggregationITest.java +++ b/plugin/src/test/java/io/jenkins/plugins/coverage/model/ReportAggregationITest.java @@ -4,8 +4,8 @@ import java.util.ArrayList; import java.util.List; -import org.junit.Ignore; -import org.junit.Test; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; import org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition; import org.jenkinsci.plugins.workflow.job.WorkflowJob; @@ -24,16 +24,10 @@ import static org.assertj.core.api.Assertions.*; -/** - * Enum for setting adapter in freestyle and pipeline projects. - */ -enum UsedAdapter { COBERTURA, JACOCO} - /** * Integration test for report aggregation. */ -public class ReportAggregationITest extends IntegrationTestWithJenkinsPerSuite { - +class ReportAggregationITest extends IntegrationTestWithJenkinsPerSuite { private static final String COBERTURA_LOWER_COVERAGE_XML = "cobertura-lower-coverage.xml"; private static final String COBERTURA_LOTS_OF_DATA_XML = "cobertura-lots-of-data.xml"; @@ -49,7 +43,7 @@ public class ReportAggregationITest extends IntegrationTestWithJenkinsPerSuite { * due to verifyJacocoReportAggregation() */ @Test - public void freeStyleProjectCheckReportAggregationWithJacocoFiles() throws ClassNotFoundException, IOException { + void freeStyleProjectCheckReportAggregationWithJacocoFiles() throws ClassNotFoundException, IOException { FreeStyleProject project = createFreeStyleProjectWithSpecifiedAdapterAndFiles(UsedAdapter.JACOCO, JACOCO_CODINGSTYLE_XML, JACOCO_ANALYSIS_MODEL_XML); @@ -66,7 +60,7 @@ public void freeStyleProjectCheckReportAggregationWithJacocoFiles() throws Class * due to verifyJacocoReportAggregation() */ @Test - public void pipelineProjectCheckReportAggregationWithJacocoFiles() throws IOException, ClassNotFoundException { + void pipelineProjectCheckReportAggregationWithJacocoFiles() throws IOException, ClassNotFoundException { WorkflowJob job = createPipelineProjectWithSpecifiedAdapterAndFiles(UsedAdapter.JACOCO, JACOCO_CODINGSTYLE_XML, JACOCO_ANALYSIS_MODEL_XML); @@ -102,8 +96,8 @@ private void verifyJacocoReportAggregation(final Run build) throws IOExcep * due to verifyJacocoReportAggregation() */ @Test - @Ignore - public void freeStyleProjectCheckReportAggregationWithCoberturaFiles() throws IOException, ClassNotFoundException { + @Disabled("Bug") + void freeStyleProjectCheckReportAggregationWithCoberturaFiles() throws IOException, ClassNotFoundException { FreeStyleProject project = createFreeStyleProjectWithSpecifiedAdapterAndFiles(UsedAdapter.COBERTURA, COBERTURA_LOWER_COVERAGE_XML, COBERTURA_LOTS_OF_DATA_XML); Run build = buildSuccessfully(project); @@ -119,7 +113,7 @@ public void freeStyleProjectCheckReportAggregationWithCoberturaFiles() throws IO * due to verifyCoberturaReportAggregation() */ @Test - public void pipelineProjectCheckReportAggregationWithCoberturaFiles() throws IOException, ClassNotFoundException { + void pipelineProjectCheckReportAggregationWithCoberturaFiles() throws IOException, ClassNotFoundException { WorkflowJob job = createPipelineProjectWithSpecifiedAdapterAndFiles(UsedAdapter.COBERTURA, COBERTURA_LOWER_COVERAGE_XML, COBERTURA_LOTS_OF_DATA_XML); @@ -210,4 +204,9 @@ private WorkflowJob createPipelineProjectWithSpecifiedAdapterAndFiles(final Used + "}", true)); return job; } + + /** + * Enum for setting adapter in freestyle and pipeline projects. + */ + enum UsedAdapter { COBERTURA, JACOCO} } diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/model/SkipPublishingOfChecksITest.java b/plugin/src/test/java/io/jenkins/plugins/coverage/model/SkipPublishingOfChecksITest.java index ca141908e..7717e9bd7 100644 --- a/plugin/src/test/java/io/jenkins/plugins/coverage/model/SkipPublishingOfChecksITest.java +++ b/plugin/src/test/java/io/jenkins/plugins/coverage/model/SkipPublishingOfChecksITest.java @@ -2,7 +2,7 @@ import java.util.Collections; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition; import org.jenkinsci.plugins.workflow.job.WorkflowJob; @@ -15,22 +15,17 @@ import static org.assertj.core.api.Assertions.*; -/** - * Enum to set skipping of publishing of checks. - */ -enum Checks { PUBLISH_CHECKS, SKIP_CHECKS} - /** * Tests if publishing of checks can be skipped. */ -public class SkipPublishingOfChecksITest extends IntegrationTestWithJenkinsPerSuite { +class SkipPublishingOfChecksITest extends IntegrationTestWithJenkinsPerSuite { private static final String JACOCO_FILENAME = "jacoco-analysis-model.xml"; /** * Tests publishing of checks in freestyle-project when skip publishing checks is false. */ @Test - public void freeStylePublishingOfChecks() { + void freeStylePublishingOfChecks() { FreeStyleProject project = getFreeStyleProjectWithJacoco(Checks.PUBLISH_CHECKS); checkConsoleLog(buildSuccessfully(project), Checks.PUBLISH_CHECKS); } @@ -39,7 +34,7 @@ public void freeStylePublishingOfChecks() { * Tests publishing of checks in pipeline-project when skip publishing checks is false. */ @Test - public void pipelinePublishingOfChecks() { + void pipelinePublishingOfChecks() { WorkflowJob job = getPipelineProjectWithJacoco(Checks.PUBLISH_CHECKS); checkConsoleLog(buildSuccessfully(job), Checks.PUBLISH_CHECKS); } @@ -48,7 +43,7 @@ public void pipelinePublishingOfChecks() { * Tests publishing of checks in freestyle-project is skipped when skip publishing checks is true. */ @Test - public void freeStyleSkipPublishingOfChecks() { + void freeStyleSkipPublishingOfChecks() { FreeStyleProject project = getFreeStyleProjectWithJacoco(Checks.SKIP_CHECKS); checkConsoleLog(buildSuccessfully(project), Checks.SKIP_CHECKS); } @@ -57,7 +52,7 @@ public void freeStyleSkipPublishingOfChecks() { * Tests publishing of checks in pipeline-project is skipped when skip publishing checks is true. */ @Test - public void pipelineSkipPublishingOfChecks() { + void pipelineSkipPublishingOfChecks() { WorkflowJob job = getPipelineProjectWithJacoco(Checks.SKIP_CHECKS); checkConsoleLog(buildSuccessfully(job), Checks.SKIP_CHECKS); } @@ -134,4 +129,8 @@ else if (skipPublishingChecks == Checks.PUBLISH_CHECKS) { return job; } + /** + * Enum to set skipping of publishing of checks. + */ + enum Checks { PUBLISH_CHECKS, SKIP_CHECKS} } diff --git a/plugin/src/test/resources/io/jenkins/plugins/coverage/model/JavaGitContainer/Dockerfile b/plugin/src/test/resources/io/jenkins/plugins/coverage/model/JavaGitContainer/Dockerfile deleted file mode 100644 index cb82f6a31..000000000 --- a/plugin/src/test/resources/io/jenkins/plugins/coverage/model/JavaGitContainer/Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -# -# Container for running Java processes -# - -# sha1sum ../SshdContainer/Dockerfile | cut -c 1-12 -FROM jenkins/sshd:32edfdd58111 - -RUN apt-get update && \ - apt-get install --no-install-recommends -y \ - software-properties-common \ - openjdk-8-jre-headless \ - openjdk-8-jdk-headless \ - curl \ - ant \ - maven \ - git