/*
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;
import hudson.model.AbstractBuild;
import hudson.model.Cause;
import hudson.model.CauseAction;
import hudson.model.FreeStyleProject;
import hudson.model.Run;
import hudson.triggers.SCMTrigger;
import hudson.triggers.TimerTrigger;
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.WithoutJenkins;
import se.diabol.jenkins.pipeline.test.FakeRepositoryBrowserSCM;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
public class TriggerCauseTest {
@Rule
public JenkinsRule jenkins = new JenkinsRule();
@Test
public void testGetTriggeredBy() throws Exception {
FreeStyleProject project = jenkins.createFreeStyleProject("build");
jenkins.setQuietPeriod(0);
project.scheduleBuild(new Cause.UserIdCause());
jenkins.waitUntilNoActivity();
List<TriggerCause> triggeredBy = TriggerCause.getTriggeredBy(project, project.getLastBuild());
assertEquals(1, triggeredBy.size());
assertEquals(TriggerCause.TYPE_MANUAL, triggeredBy.iterator().next().getType());
}
@Test
public void testGetTriggeredByWithChangeLog() throws Exception {
FreeStyleProject project = jenkins.createFreeStyleProject("build");
FakeRepositoryBrowserSCM scm = new FakeRepositoryBrowserSCM();
scm.addChange().withAuthor("test-user").withMsg("Fixed bug");
project.setScm(scm);
jenkins.setQuietPeriod(0);
project.scheduleBuild(new Cause.UserIdCause());
jenkins.waitUntilNoActivity();
List<TriggerCause> triggeredBy = TriggerCause.getTriggeredBy(project, project.getLastBuild());
assertEquals(1, triggeredBy.size());
assertEquals(TriggerCause.TYPE_MANUAL, triggeredBy.iterator().next().getType());
}
@Test
public void testGetTriggeredByWithNoUserIdCause() throws Exception {
FreeStyleProject project = jenkins.createFreeStyleProject("build");
jenkins.setQuietPeriod(0);
jenkins.buildAndAssertSuccess(project);
List<TriggerCause> triggeredBy = TriggerCause.getTriggeredBy(project, project.getLastBuild());
assertEquals(1, triggeredBy.size());
assertEquals(TriggerCause.TYPE_UNKNOWN, triggeredBy.iterator().next().getType());
}
@Test
public void testGetTriggeredByTimer() throws Exception {
FreeStyleProject project = jenkins.createFreeStyleProject("build");
FakeRepositoryBrowserSCM scm = new FakeRepositoryBrowserSCM();
scm.addChange().withAuthor("test-user").withMsg("Fixed bug");
jenkins.setQuietPeriod(0);
project.setScm(scm);
project.scheduleBuild(new TimerTrigger.TimerTriggerCause());
jenkins.waitUntilNoActivity();
List<TriggerCause> triggeredBy = TriggerCause.getTriggeredBy(project, project.getLastBuild());
assertEquals(1, triggeredBy.size());
assertEquals(TriggerCause.TYPE_TIMER, triggeredBy.iterator().next().getType());
}
@Test
public void testGetTriggeredBySCMChange() throws Exception {
FreeStyleProject project = jenkins.createFreeStyleProject("build");
FakeRepositoryBrowserSCM scm = new FakeRepositoryBrowserSCM();
scm.addChange().withAuthor("test-user").withMsg("Fixed bug");
project.setScm(scm);
jenkins.setQuietPeriod(0);
project.scheduleBuild(new SCMTrigger.SCMTriggerCause("SCM"));
jenkins.waitUntilNoActivity();
List<TriggerCause> triggeredBy = TriggerCause.getTriggeredBy(project, project.getLastBuild());
assertEquals(1, triggeredBy.size());
assertEquals(TriggerCause.TYPE_SCM, triggeredBy.iterator().next().getType());
}
@Test
public void testGetTriggeredBySCMChangeQueued() throws Exception {
FreeStyleProject project = jenkins.createFreeStyleProject("build");
FakeRepositoryBrowserSCM scm = new FakeRepositoryBrowserSCM();
scm.addChange().withAuthor("test-user").withMsg("Fixed bug");
project.setScm(scm);
jenkins.setQuietPeriod(0);
jenkins.getInstance().setNumExecutors(0);
project.scheduleBuild(0, new SCMTrigger.SCMTriggerCause("SCM"));
//jenkins.waitUntilNoActivity();
List<TriggerCause> triggeredBy = TriggerCause.getTriggeredBy(project, null);
assertEquals(1, triggeredBy.size());
assertEquals(TriggerCause.TYPE_SCM, triggeredBy.iterator().next().getType());
}
@Test
@Issue("JENKINS-22611")
public void testGetTriggeredByMultipleSCMChange() throws Exception {
FreeStyleProject project = jenkins.createFreeStyleProject("build");
FakeRepositoryBrowserSCM scm = new FakeRepositoryBrowserSCM();
scm.addChange().withAuthor("test-user").withMsg("Fixed bug");
project.setScm(scm);
jenkins.setQuietPeriod(0);
CauseAction action = new CauseAction(new SCMTrigger.SCMTriggerCause(""));
action.getCauses().add(new SCMTrigger.SCMTriggerCause(""));
action.getCauses().add(new SCMTrigger.SCMTriggerCause(""));
action.getCauses().add(new SCMTrigger.SCMTriggerCause(""));
project.scheduleBuild(0, null, action);
jenkins.waitUntilNoActivity();
List<TriggerCause> triggeredBy = TriggerCause.getTriggeredBy(project, project.getLastBuild());
assertEquals(1, triggeredBy.size());
assertEquals(TriggerCause.TYPE_SCM, triggeredBy.iterator().next().getType());
}
@Test
public void testGetTriggeredByRemoteCause() throws Exception {
FreeStyleProject project = jenkins.createFreeStyleProject("build");
jenkins.setQuietPeriod(0);
project.scheduleBuild(new Cause.RemoteCause("localhost", "Remote"));
jenkins.waitUntilNoActivity();
List<TriggerCause> triggeredBy = TriggerCause.getTriggeredBy(project, project.getLastBuild());
assertEquals(1, triggeredBy.size());
assertEquals(TriggerCause.TYPE_REMOTE, triggeredBy.iterator().next().getType());
}
@Test
public void testGetTriggeredByDeeplyNestedUpstreamCause() throws Exception {
FreeStyleProject project = jenkins.createFreeStyleProject("build");
jenkins.setQuietPeriod(0);
project.scheduleBuild(new Cause.UpstreamCause.DeeplyNestedUpstreamCause());
jenkins.waitUntilNoActivity();
List<TriggerCause> triggeredBy = TriggerCause.getTriggeredBy(project, project.getLastBuild());
assertEquals(1, triggeredBy.size());
assertEquals(TriggerCause.TYPE_UPSTREAM, triggeredBy.iterator().next().getType());
}
@Test
public void testGetTriggeredByUpStreamJob() throws Exception {
FreeStyleProject upstream = jenkins.createFreeStyleProject("up");
jenkins.setQuietPeriod(0);
jenkins.buildAndAssertSuccess(upstream);
FreeStyleProject project = jenkins.createFreeStyleProject("build");
FakeRepositoryBrowserSCM scm = new FakeRepositoryBrowserSCM();
scm.addChange().withAuthor("test-user").withMsg("Fixed bug");
project.setScm(scm);
project.scheduleBuild(new Cause.UpstreamCause((Run)upstream.getLastBuild()));
jenkins.waitUntilNoActivity();
List<TriggerCause> triggeredBy = TriggerCause.getTriggeredBy(project, project.getLastBuild());
assertEquals(1, triggeredBy.size());
assertEquals(TriggerCause.TYPE_UPSTREAM, triggeredBy.iterator().next().getType());
assertEquals("upstream project up build #1", triggeredBy.iterator().next().getDescription());
}
@Test
public void testGetTriggeredByUpStreamJobNotExists() throws Exception {
FreeStyleProject upstream = jenkins.createFreeStyleProject("up");
jenkins.setQuietPeriod(0);
jenkins.buildAndAssertSuccess(upstream);
FreeStyleProject project = jenkins.createFreeStyleProject("build");
project.scheduleBuild(new Cause.UpstreamCause((Run)upstream.getLastBuild()));
jenkins.waitUntilNoActivity();
upstream.delete();
List<TriggerCause> triggeredBy = TriggerCause.getTriggeredBy(project, project.getLastBuild());
assertEquals(1, triggeredBy.size());
assertEquals(TriggerCause.TYPE_UPSTREAM, triggeredBy.iterator().next().getType());
assertEquals("upstream project", triggeredBy.iterator().next().getDescription());
}
@Test
public void testGetTriggeredByUpStreamJobBuildNotExist() throws Exception {
FreeStyleProject upstream = jenkins.createFreeStyleProject("up");
jenkins.setQuietPeriod(0);
jenkins.buildAndAssertSuccess(upstream);
FreeStyleProject project = jenkins.createFreeStyleProject("build");
project.scheduleBuild(new Cause.UpstreamCause((Run)upstream.getLastBuild()));
jenkins.waitUntilNoActivity();
upstream.getLastBuild().delete();
List<TriggerCause> triggeredBy = TriggerCause.getTriggeredBy(project, project.getLastBuild());
assertEquals(1, triggeredBy.size());
assertEquals(TriggerCause.TYPE_UPSTREAM, triggeredBy.iterator().next().getType());
assertEquals("upstream project up", triggeredBy.iterator().next().getDescription());
}
@Test
public void testGetTriggeredByWithCulprits() throws Exception {
FreeStyleProject project = jenkins.createFreeStyleProject("build");
FakeRepositoryBrowserSCM scm = new FakeRepositoryBrowserSCM();
scm.addChange().withAuthor("test-user-fail").withMsg("Fixed bug");
scm.addChange().withAuthor("test-user-fail2").withMsg("Fixed bug");
project.setScm(scm);
jenkins.setQuietPeriod(0);
project.getBuildersList().add(new FailureBuilder());
project.scheduleBuild2(0);
jenkins.waitUntilNoActivity();
scm = new FakeRepositoryBrowserSCM();
scm.addChange().withAuthor("test-user").withMsg("Fixed bug");
project.setScm(scm);
project.scheduleBuild(new Cause.UserIdCause());
jenkins.waitUntilNoActivity();
AbstractBuild build = project.getLastBuild();
assertEquals(3, build.getCulprits().size());
List<TriggerCause> triggeredBy = TriggerCause.getTriggeredBy(project, project.getLastBuild());
assertEquals(1, triggeredBy.size());
assertEquals(TriggerCause.TYPE_MANUAL, triggeredBy.iterator().next().getType());
}
@Test
public void testGetTriggeredByNullBuild() throws Exception {
FreeStyleProject project = jenkins.createFreeStyleProject("build");
List<TriggerCause> triggeredBy = TriggerCause.getTriggeredBy(project, null);
assertTrue(triggeredBy.isEmpty());
}
@Test
@WithoutJenkins
public void testHashcodeEquals() {
TriggerCause trigger1 = new TriggerCause(TriggerCause.TYPE_MANUAL, "manual trigger");
TriggerCause trigger2 = new TriggerCause(TriggerCause.TYPE_MANUAL, "manual trigger");
TriggerCause trigger3 = new TriggerCause(TriggerCause.TYPE_MANUAL, "manual");
TriggerCause trigger4 = new TriggerCause(TriggerCause.TYPE_SCM, "manual");
assertEquals(trigger1, trigger1);
assertEquals(trigger1, trigger2);
assertEquals(trigger1.hashCode(), trigger2.hashCode());
assertNotEquals(trigger1, trigger3);
assertNotEquals(trigger3, trigger4);
assertNotEquals(trigger3, null);
assertNotEquals(trigger3, "");
assertNotEquals(trigger1.hashCode(), trigger3.hashCode());
}
}