/* This file is part of Delivery Pipeline Plugin. Delivery Pipeline Plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Delivery Pipeline Plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Delivery Pipeline Plugin. If not, see <http://www.gnu.org/licenses/>. */ package se.diabol.jenkins.pipeline; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import au.com.centrumsystems.hudson.plugin.buildpipeline.BuildPipelineView; import au.com.centrumsystems.hudson.plugin.buildpipeline.DownstreamProjectGridBuilder; import au.com.centrumsystems.hudson.plugin.buildpipeline.trigger.BuildPipelineTrigger; import hudson.EnvVars; import hudson.Launcher; import hudson.cli.BuildCommand; import hudson.model.AbstractBuild; import hudson.model.BuildListener; import hudson.model.FreeStyleBuild; import hudson.model.FreeStyleProject; import hudson.model.ParametersAction; import hudson.model.ParametersDefinitionProperty; import hudson.model.StringParameterDefinition; import hudson.model.StringParameterValue; import hudson.plugins.parameterizedtrigger.AbstractBuildParameters; import hudson.plugins.parameterizedtrigger.BooleanParameterConfig; import hudson.plugins.parameterizedtrigger.BooleanParameters; import hudson.tasks.BuildTrigger; import hudson.util.StreamTaskListener; import org.apache.commons.io.FileUtils; import org.jenkinsci.plugins.buildnamesetter.BuildNameSetter; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestBuilder; import java.io.IOException; import java.util.Arrays; public class PipelineVersionContributorTest { private static final String PIPELINE_VERSION = "PIPELINE_VERSION"; @Rule public JenkinsRule jenkins = new JenkinsRule(); @Test public void testVersionContributorNotConfigured() throws Exception { final FreeStyleProject firstProject = jenkins.createFreeStyleProject("firstProject"); final FreeStyleProject secondProject = jenkins.createFreeStyleProject("secondProject"); firstProject.getPublishersList().add(new BuildTrigger("secondProject", false)); firstProject.save(); firstProject.getBuildersList().add(new AssertNoPipelineVersion()); secondProject.getBuildersList().add(new AssertNoPipelineVersion()); jenkins.setQuietPeriod(0); jenkins.getInstance().rebuildDependencyGraph(); jenkins.buildAndAssertSuccess(firstProject); jenkins.waitUntilNoActivity(); assertNotNull(firstProject.getLastBuild()); assertNotNull(secondProject.getLastBuild()); } @Test public void testVersionNoDisplayname() throws Exception { FreeStyleProject firstProject = jenkins.createFreeStyleProject("firstProject"); FreeStyleProject secondProject = jenkins.createFreeStyleProject("secondProject"); firstProject.getPublishersList().add(new BuildTrigger("secondProject", false)); firstProject.getBuildWrappersList().add(new PipelineVersionContributor(false, "1.0.0.${BUILD_NUMBER}")); firstProject.getBuildersList().add(new AssertPipelineVersion("1.0.0.1")); secondProject.getBuildersList().add(new AssertPipelineVersion("1.0.0.1")); jenkins.setQuietPeriod(0); jenkins.getInstance().rebuildDependencyGraph(); jenkins.buildAndAssertSuccess(firstProject); jenkins.waitUntilNoActivity(); assertNotNull(firstProject.getLastBuild()); assertNotNull(secondProject.getLastBuild()); assertEquals("#1", firstProject.getLastBuild().getDisplayName()); } @Test public void testVersionContributorConfigured() throws Exception { FreeStyleProject firstProject = jenkins.createFreeStyleProject("firstProject"); FreeStyleProject secondProject = jenkins.createFreeStyleProject("secondProject"); firstProject.getPublishersList().add(new BuildTrigger("secondProject", false)); firstProject.getBuildWrappersList().add(new PipelineVersionContributor(true, "1.0.0.${BUILD_NUMBER}")); firstProject.getBuildersList().add(new AssertPipelineVersion("1.0.0.1")); secondProject.getBuildersList().add(new AssertPipelineVersion("1.0.0.1")); jenkins.setQuietPeriod(0); jenkins.getInstance().rebuildDependencyGraph(); jenkins.buildAndAssertSuccess(firstProject); jenkins.waitUntilNoActivity(); assertNotNull(firstProject.getLastBuild()); assertNotNull(secondProject.getLastBuild()); assertEquals("1.0.0.1", firstProject.getLastBuild().getDisplayName()); } @Test public void testVersionContributorConfiguredManualTrigger() throws Exception { FreeStyleProject firstProject = jenkins.createFreeStyleProject("firstProject"); FreeStyleProject secondProject = jenkins.createFreeStyleProject("secondProject"); firstProject.getPublishersList().add(new BuildPipelineTrigger("secondProject", null)); firstProject.save(); firstProject.getBuildWrappersList().add(new PipelineVersionContributor(true, "1.0.0.${BUILD_NUMBER}")); firstProject.getBuildersList().add(new AssertPipelineVersion("1.0.0.1")); secondProject.getBuildersList().add(new AssertNoPipelineVersion()); jenkins.setQuietPeriod(0); jenkins.getInstance().rebuildDependencyGraph(); jenkins.buildAndAssertSuccess(firstProject); jenkins.waitUntilNoActivity(); assertNotNull(firstProject.getLastBuild()); assertNull(secondProject.getLastBuild()); assertEquals("1.0.0.1", firstProject.getLastBuild().getDisplayName()); secondProject.getBuildersList().clear(); secondProject.getBuildersList().add(new AssertPipelineVersion("1.0.0.1")); BuildPipelineView view = new BuildPipelineView("", "", new DownstreamProjectGridBuilder("firstProject"), "1", false, null); view.triggerManualBuild(1, "secondProject", "firstProject"); jenkins.waitUntilNoActivity(); assertNotNull(secondProject.getLastBuild()); } @Test public void testIsApplicable() throws Exception { PipelineVersionContributor.DescriptorImpl d = new PipelineVersionContributor.DescriptorImpl(); assertTrue(d.isApplicable(jenkins.createFreeStyleProject("a"))); } @Test @Issue("JENKINS-21070") public void testVersionContributorErrorInPattern() throws Exception { FreeStyleProject project = jenkins.createFreeStyleProject("firstProject"); project.getBuildWrappersList().add(new PipelineVersionContributor(true, "${GFGFGFG}")); FreeStyleBuild build = project.scheduleBuild2(0).get(); assertNotNull(build); assertEquals("#1", project.getLastBuild().getDisplayName()); String log = FileUtils.readFileToString(build.getLogFile()); assertTrue(log.contains("Error creating version")); } @Test @Issue("JENKINS-34805") public void shouldGetPipelineVersionFromBuildAction() throws Exception { FreeStyleProject project = jenkins.createFreeStyleProject("firstProject"); FreeStyleBuild build = project.scheduleBuild2(0, new BuildCommand.CLICause(), new ParametersAction(new StringParameterValue("HEPP", "HOPP")), new PipelineVersionContributor.PipelineVersionAction("1.1")).get(); assertEquals("1.1", PipelineVersionContributor.getVersion(build)); } @Test public void testGetVersionNotFound() throws Exception { FreeStyleProject project = jenkins.createFreeStyleProject("firstProject"); FreeStyleBuild build = project.scheduleBuild2(0, new BuildCommand.CLICause(), new ParametersAction(new StringParameterValue("HEPP", "HOPP"))).get(); assertNull(PipelineVersionContributor.getVersion(build)); } @Test @Issue("JENKINS-28848") public void testWithBuildNameSetterPluginAndAdditionalParameters() throws Exception { FreeStyleProject a = jenkins.createFreeStyleProject("a"); FreeStyleProject b = jenkins.createFreeStyleProject("b"); a.addProperty(new ParametersDefinitionProperty(new StringParameterDefinition("BUILD_VERSION", "DEFAULT_VALUE"))); a.getPublishersList().add(new BuildTrigger("b", false)); a.getBuildWrappersList().add(new PipelineVersionContributor(true, "1.0.0.$BUILD_NUMBER")); b.getBuildWrappersList().add(new BuildNameSetter("$PIPELINE_VERSION")); jenkins.getInstance().rebuildDependencyGraph(); jenkins.setQuietPeriod(0); jenkins.buildAndAssertSuccess(a); jenkins.waitUntilNoActivity(); assertEquals("1.0.0.1", a.getLastBuild().getDisplayName()); assertEquals("1.0.0.1", b.getLastBuild().getDisplayName()); assertEquals("1.0.0.1", a.getLastBuild().getBuildVariableResolver().resolve(PIPELINE_VERSION)); assertEquals("1.0.0.1", b.getLastBuild().getBuildVariableResolver().resolve(PIPELINE_VERSION)); } @Test public void testVersionContributorIsNotBreakingParametersPassing() throws Exception { FreeStyleProject firstProject = jenkins.createFreeStyleProject("firstProject"); FreeStyleProject secondProject = jenkins.createFreeStyleProject("secondProject"); firstProject.getPublishersList().add( new BuildPipelineTrigger("secondProject", Arrays.<AbstractBuildParameters>asList(new BooleanParameters(Arrays.asList(new BooleanParameterConfig("test", true)))))); firstProject.save(); firstProject.getBuildWrappersList().add(new PipelineVersionContributor(true, "1.0.0.${BUILD_NUMBER}")); firstProject.getBuildersList().add(new AssertPipelineVersion("1.0.0.1")); secondProject.getBuildersList().add(new AssertNoPipelineVersion()); jenkins.setQuietPeriod(0); jenkins.getInstance().rebuildDependencyGraph(); jenkins.buildAndAssertSuccess(firstProject); jenkins.waitUntilNoActivity(); assertNotNull(firstProject.getLastBuild()); assertNull(secondProject.getLastBuild()); assertEquals("1.0.0.1", firstProject.getLastBuild().getDisplayName()); secondProject.getBuildersList().clear(); secondProject.getBuildersList().add(new AssertPipelineVersion("1.0.0.1")); BuildPipelineView view = new BuildPipelineView("", "", new DownstreamProjectGridBuilder("firstProject"), "1", false, null); view.triggerManualBuild(1, "secondProject", "firstProject"); jenkins.waitUntilNoActivity(); assertNotNull(secondProject.getLastBuild()); assertEquals("true", secondProject.getLastBuild().getBuildVariableResolver().resolve("test")); } private class AssertNoPipelineVersion extends TestBuilder { public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { EnvVars env = build.getEnvironment(new StreamTaskListener(System.out, null)); assertFalse(env.containsKey(PIPELINE_VERSION)); return true; } } private class AssertPipelineVersion extends TestBuilder { private String version; private AssertPipelineVersion(String version) { this.version = version; } public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { EnvVars env = build.getEnvironment(new StreamTaskListener(System.out, null)); PipelineVersionContributor.PipelineVersionAction versionAction = build.getAction(PipelineVersionContributor.PipelineVersionAction.class); assertNotNull(versionAction); assertEquals(version, versionAction.getVersion()); return true; } } }