/*
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.domain.task;
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.trigger.BuildPipelineTrigger;
import hudson.model.AbstractBuild;
import hudson.model.FreeStyleProject;
import hudson.tasks.BuildTrigger;
import org.junit.Rule;
import org.junit.Test;
import org.jvnet.hudson.test.FailureBuilder;
import org.jvnet.hudson.test.Issue;
import org.jvnet.hudson.test.JenkinsRule;
import org.jvnet.hudson.test.MockFolder;
import se.diabol.jenkins.pipeline.DeliveryPipelineView;
public class ManualStepTest {
@Rule
public JenkinsRule jenkins = new JenkinsRule();
@Test
public void testIsManualTriggerAndResolveManualStep() throws Exception {
final FreeStyleProject upstream = jenkins.createFreeStyleProject("upstream");
final FreeStyleProject downstreamManual = jenkins.createFreeStyleProject("downstreamManual");
upstream.getPublishersList().add(new BuildPipelineTrigger("downstreamManual", null));
final FreeStyleProject projectA = jenkins.createFreeStyleProject("a");
final FreeStyleProject projectB = jenkins.createFreeStyleProject("b");
projectA.getPublishersList().add(new BuildTrigger("b", false));
jenkins.getInstance().rebuildDependencyGraph();
assertTrue(ManualStep.isManualTrigger(downstreamManual));
assertFalse(ManualStep.isManualTrigger(upstream));
assertFalse(ManualStep.isManualTrigger(projectA));
assertFalse(ManualStep.isManualTrigger(projectB));
assertNull(ManualStep.resolveManualStep(projectA));
assertNull(ManualStep.resolveManualStep(projectB));
assertNull(ManualStep.resolveManualStep(upstream));
ManualStep step = ManualStep.resolveManualStep(downstreamManual);
assertNotNull(step);
assertNull(step.getUpstreamId());
assertFalse(step.isEnabled());
assertTrue(step.isPermission());
assertNull(step.getPossibleVersions());
assertEquals("downstreamManual", step.getUpstreamProject());
}
@Test
public void testGetManualStepLatest() throws Exception {
FreeStyleProject upstream = jenkins.createFreeStyleProject("upstream");
FreeStyleProject downstream = jenkins.createFreeStyleProject("downstream");
upstream.getPublishersList().add(new BuildPipelineTrigger("downstream", null));
jenkins.getInstance().rebuildDependencyGraph();
ManualStep step =
ManualStep.getManualStepLatest(downstream, downstream.getLastBuild(), upstream.getLastBuild());
assertNotNull(step);
assertEquals("upstream", step.getUpstreamProject());
assertNull(step.getUpstreamId());
assertFalse(step.isEnabled());
assertTrue(step.isPermission());
assertNull(step.getPossibleVersions());
jenkins.buildAndAssertSuccess(upstream);
step = ManualStep.getManualStepLatest(downstream, downstream.getLastBuild(), upstream.getLastBuild());
assertNotNull(step);
assertEquals("upstream", step.getUpstreamProject());
assertEquals("1", step.getUpstreamId());
assertTrue(step.isEnabled());
assertTrue(step.isPermission());
assertNull(step.getPossibleVersions());
downstream.getBuildersList().add(new FailureBuilder());
DeliveryPipelineView view = new DeliveryPipelineView("hej", jenkins.getInstance());
view.triggerManual("downstream", "upstream", "1");
jenkins.waitUntilNoActivity();
step = ManualStep.getManualStepLatest(downstream, downstream.getLastBuild(), upstream.getLastBuild());
assertNotNull(step);
assertEquals("upstream", step.getUpstreamProject());
assertEquals("1", step.getUpstreamId());
assertTrue(step.isEnabled());
assertTrue(step.isPermission());
assertNull(step.getPossibleVersions());
}
@Test
public void testGetManualStepLatestWithFolders() throws Exception {
MockFolder folder = jenkins.createFolder("folder");
FreeStyleProject upstream = folder.createProject(FreeStyleProject.class, "upstream");
FreeStyleProject downstream = folder.createProject(FreeStyleProject.class, "downstream");
upstream.getPublishersList().add(new BuildPipelineTrigger("folder/downstream", null));
jenkins.getInstance().rebuildDependencyGraph();
ManualStep step =
ManualStep.getManualStepLatest(downstream, downstream.getLastBuild(), upstream.getLastBuild());
assertNotNull(step);
assertEquals("folder/upstream", step.getUpstreamProject());
assertNull(step.getUpstreamId());
assertFalse(step.isEnabled());
assertTrue(step.isPermission());
assertNull(step.getPossibleVersions());
jenkins.buildAndAssertSuccess(upstream);
assertNull(downstream.getLastBuild());
DeliveryPipelineView view = new DeliveryPipelineView("hej", folder);
view.triggerManual("folder/downstream", "folder/upstream", "1");
jenkins.waitUntilNoActivity();
assertNotNull(downstream.getLastBuild());
}
@Test
public void testGetManualStepAggregated() throws Exception {
final FreeStyleProject upstream = jenkins.createFreeStyleProject("upstream");
final FreeStyleProject downstream = jenkins.createFreeStyleProject("downstream");
upstream.getPublishersList().add(new BuildPipelineTrigger("downstream", null));
jenkins.getInstance().rebuildDependencyGraph();
jenkins.setQuietPeriod(0);
ManualStep step = ManualStep.getManualStepAggregated(downstream, upstream);
assertNotNull(step);
assertEquals("upstream", step.getUpstreamProject());
assertNull(step.getUpstreamId());
assertFalse(step.isEnabled());
assertTrue(step.isPermission());
assertEquals(0, step.getPossibleVersions().size());
jenkins.buildAndAssertSuccess(upstream);
step = ManualStep.getManualStepAggregated(downstream, upstream);
assertNotNull(step);
assertEquals("upstream", step.getUpstreamProject());
assertNull(step.getUpstreamId());
assertTrue(step.isEnabled());
assertTrue(step.isPermission());
assertEquals(1, step.getPossibleVersions().size());
downstream.getBuildersList().add(new FailureBuilder());
DeliveryPipelineView view = new DeliveryPipelineView("hej", jenkins.getInstance());
view.triggerManual("downstream", "upstream", "1");
jenkins.waitUntilNoActivity();
step = ManualStep.getManualStepAggregated(downstream, upstream);
assertNotNull(step);
assertEquals("upstream", step.getUpstreamProject());
assertNull(step.getUpstreamId());
assertTrue(step.isEnabled());
assertTrue(step.isPermission());
assertEquals(1, step.getPossibleVersions().size());
jenkins.buildAndAssertSuccess(upstream);
step = ManualStep.getManualStepAggregated(downstream, upstream);
assertNotNull(step);
assertEquals("upstream", step.getUpstreamProject());
assertNull(step.getUpstreamId());
assertTrue(step.isEnabled());
assertTrue(step.isPermission());
assertEquals(2, step.getPossibleVersions().size());
}
@Test
public void getManualStepAggregatedNoTrigger() throws Exception {
final FreeStyleProject projectA = jenkins.createFreeStyleProject("a");
final FreeStyleProject projectB = jenkins.createFreeStyleProject("b");
assertNull(ManualStep.getManualStepAggregated(projectA, projectA));
projectA.getPublishersList().add(new BuildTrigger("b", false));
jenkins.getInstance().rebuildDependencyGraph();
assertNull(ManualStep.getManualStepAggregated(projectB, projectA));
}
@Test
public void getManualStepLatestWithMultipleManualTriggers() throws Exception {
final FreeStyleProject projectA = jenkins.createFreeStyleProject("A");
final FreeStyleProject projectB = jenkins.createFreeStyleProject("B");
final FreeStyleProject projectC = jenkins.createFreeStyleProject("C");
final FreeStyleProject projectD = jenkins.createFreeStyleProject("D");
projectA.getPublishersList().add(new BuildPipelineTrigger("B,C", null));
projectB.getPublishersList().add(new BuildPipelineTrigger("D", null));
projectC.getPublishersList().add(new BuildPipelineTrigger("D", null));
jenkins.getInstance().rebuildDependencyGraph();
jenkins.setQuietPeriod(0);
AbstractBuild firstBuild = jenkins.buildAndAssertSuccess(projectA);
DeliveryPipelineView view = new DeliveryPipelineView("hej", jenkins.getInstance());
view.triggerManual("C", "A", "1");
jenkins.waitUntilNoActivity();
ManualStep step = ManualStep.getManualStepLatest(projectD, null, firstBuild);
assertNotNull(step);
assertEquals("1", step.getUpstreamId());
assertEquals("C", step.getUpstreamProject());
assertTrue(step.isEnabled());
}
@Test
@Issue("JENKINS-27584")
public void getManualStepLatestUpstreamDeleted() throws Exception {
FreeStyleProject projectA = jenkins.createFreeStyleProject("A");
FreeStyleProject projectB = jenkins.createFreeStyleProject("B");
FreeStyleProject projectC = jenkins.createFreeStyleProject("C");
projectA.getPublishersList().add(new BuildTrigger("B", true));
projectB.getPublishersList().add(new BuildPipelineTrigger("C", null));
projectC.getBuildersList().add(new FailureBuilder());
jenkins.getInstance().rebuildDependencyGraph();
jenkins.setQuietPeriod(0);
final AbstractBuild firstBuild = jenkins.buildAndAssertSuccess(projectA);
jenkins.waitUntilNoActivity();
DeliveryPipelineView view = new DeliveryPipelineView("Pipeline", jenkins.getInstance());
view.triggerManual("C", "B", "1");
jenkins.waitUntilNoActivity();
ManualStep step = ManualStep.getManualStepLatest(projectC, null, firstBuild);
assertNotNull(step);
projectB.getLastBuild().delete();
assertNull(projectB.getLastBuild());
step = ManualStep.getManualStepLatest(projectC, projectC.getLastBuild(), firstBuild);
assertNotNull(step);
}
@Test
@Issue("JENKINS-28937")
public void testFailure() throws Exception {
final FreeStyleProject projectA = jenkins.createFreeStyleProject("A");
final FreeStyleProject projectB = jenkins.createFreeStyleProject("B");
final FreeStyleProject projectC = jenkins.createFreeStyleProject("C");
projectA.getPublishersList().add(new BuildPipelineTrigger("B", null));
projectB.getPublishersList().add(new BuildPipelineTrigger("C", null));
projectB.getBuildersList().add(new FailureBuilder());
jenkins.getInstance().rebuildDependencyGraph();
jenkins.setQuietPeriod(0);
final AbstractBuild firstBuild = jenkins.buildAndAssertSuccess(projectA);
jenkins.waitUntilNoActivity();
DeliveryPipelineView view = new DeliveryPipelineView("Pipeline", jenkins.getInstance());
view.triggerManual("B", "A", "1");
jenkins.waitUntilNoActivity();
ManualStep step = ManualStep.getManualStepLatest(projectC, null, firstBuild);
assertNotNull(step);
assertFalse(step.isEnabled());
}
}