Skip to content

Commit

Permalink
Merge branch 'master' into JENKINS-35210
Browse files Browse the repository at this point in the history
  • Loading branch information
amuniz committed Jun 6, 2016
2 parents 72cde84 + e9a370b commit 178a3a6
Show file tree
Hide file tree
Showing 2 changed files with 135 additions and 9 deletions.
15 changes: 7 additions & 8 deletions src/main/java/org/jenkinsci/plugins/p4/trigger/P4Trigger.java
Expand Up @@ -17,7 +17,6 @@
import hudson.Extension;
import hudson.Util;
import hudson.console.AnnotatedLargeText;
import hudson.model.AbstractProject;
import hudson.model.Action;
import hudson.model.Item;
import hudson.model.Job;
Expand Down Expand Up @@ -110,15 +109,15 @@ public File getLogFile() {
}

private boolean matchServer(Job<?, ?> job, String port) {
if (job instanceof AbstractProject) {
AbstractProject<?, ?> project = (AbstractProject<?, ?>) job;
SCM scm = project.getScm();

if (scm instanceof PerforceScm) {
PerforceScm p4scm = (PerforceScm) scm;
//Get all the trigger for this Job
SCMTriggerItem item = SCMTriggerItem.SCMTriggerItems.asSCMTriggerItem(job);
//As soon as we find a match, return
for (SCM scmTrigger : item.getSCMs()) {
if (scmTrigger instanceof PerforceScm) {
PerforceScm p4scm = (PerforceScm) scmTrigger;
String id = p4scm.getCredential();
P4BaseCredentials credential = ConnectionHelper.findCredential(id);
if (port.equals(credential.getP4port())) {
if (credential.getP4port().equals(port)) {
return true;
}
}
Expand Down
129 changes: 128 additions & 1 deletion src/test/java/org/jenkinsci/plugins/p4/client/ConnectionTest.java
Expand Up @@ -10,8 +10,8 @@
import java.net.InetAddress;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;

Expand All @@ -21,13 +21,15 @@
import org.jenkinsci.plugins.p4.PerforceScm.DescriptorImpl;
import org.jenkinsci.plugins.p4.browsers.P4WebBrowser;
import org.jenkinsci.plugins.p4.browsers.SwarmBrowser;
import org.jenkinsci.plugins.p4.changes.P4Revision;
import org.jenkinsci.plugins.p4.credentials.P4PasswordImpl;
import org.jenkinsci.plugins.p4.filters.Filter;
import org.jenkinsci.plugins.p4.filters.FilterPerChangeImpl;
import org.jenkinsci.plugins.p4.populate.AutoCleanImpl;
import org.jenkinsci.plugins.p4.populate.Populate;
import org.jenkinsci.plugins.p4.review.ReviewProp;
import org.jenkinsci.plugins.p4.review.SafeParametersAction;
import org.jenkinsci.plugins.p4.trigger.P4Trigger;
import org.jenkinsci.plugins.p4.workspace.ManualWorkspaceImpl;
import org.jenkinsci.plugins.p4.workspace.StaticWorkspaceImpl;
import org.jenkinsci.plugins.p4.workspace.StreamWorkspaceImpl;
Expand Down Expand Up @@ -63,6 +65,7 @@
import hudson.model.FreeStyleProject;
import hudson.model.ParameterValue;
import hudson.model.Result;
import hudson.model.Run;
import hudson.model.StringParameterValue;
import hudson.model.Cause.UserIdCause;
import hudson.scm.RepositoryBrowser;
Expand Down Expand Up @@ -692,6 +695,130 @@ public void testWorkflow() throws Exception {
jenkins.assertLogContains("P4 Task: reconcile files to changelist.", run);
}

@Test
public void shouldNotTriggerJobIfNoChange() throws Exception {
FreeStyleProject project = jenkins.createFreeStyleProject("Static-Change");
StaticWorkspaceImpl workspace = new StaticWorkspaceImpl("none", false, "test.ws");
Populate populate = new AutoCleanImpl(true, true, false, false, null, null);
PerforceScm scm = new PerforceScm(auth.getId(), workspace, populate);
project.setScm(scm);
P4Trigger trigger = new P4Trigger();
trigger.start(project, false);
project.addTrigger(trigger);
project.save();

//Run once
jenkins.assertBuildStatusSuccess(project.scheduleBuild2(0, new Cause.UserIdCause()));

//Test trigger
trigger.poke(project, auth.getP4port());

TimeUnit.SECONDS.sleep(project.getQuietPeriod());
jenkins.waitUntilNoActivity();

assertEquals("Shouldn't have triggered a build if no change", 1, project.getLastBuild().getNumber());
}

@Test
public void shouldTriggerJobIfChanges() throws Exception {
String client = "manual.ws";
String stream = null;
String line = "LOCAL";
String view = "//depot/... //" + client + "/...";
WorkspaceSpec spec = new WorkspaceSpec(false, false, false, false, false, false, stream, line, view);
FreeStyleProject project = jenkins.createFreeStyleProject("Manual-Head");
ManualWorkspaceImpl workspace = new ManualWorkspaceImpl("none", false, client, spec);
// Pin at label auto15
Populate populate = new AutoCleanImpl(true, true, false, false, null, null);
PerforceScm scm = new PerforceScm(auth.getId(), workspace, populate);
project.setScm(scm);
P4Trigger trigger = new P4Trigger();
trigger.start(project, false);
project.addTrigger(trigger);
project.save();

//Checkout at commit 9
List<ParameterValue> list = new ArrayList<ParameterValue>();
list.add(new StringParameterValue(ReviewProp.STATUS.toString(), "committed"));
list.add(new StringParameterValue(ReviewProp.CHANGE.toString(), "9"));
Action actions = new SafeParametersAction(new ArrayList<ParameterValue>(), list);

//Run once
Run lastRun = jenkins.assertBuildStatusSuccess(project.scheduleBuild2(0, new Cause.UserIdCause(), actions));
jenkins.waitUntilNoActivity();
jenkins.assertLogContains("P4 Task: syncing files at change", lastRun);

//Test trigger
trigger.poke(project, auth.getP4port());

TimeUnit.SECONDS.sleep(project.getQuietPeriod());
jenkins.waitUntilNoActivity();

assertEquals("Should have triggered a build on change", 2, project.getLastBuild().getNumber());
}

@Test
public void testShouldTriggerPipelineJobIfChanges() throws Exception {

WorkflowJob job = jenkins.jenkins.createProject(WorkflowJob.class, "demo");
job.setDefinition(new CpsFlowDefinition(""
+ "node {\n"
+ " p4sync credential: '" + auth.getId() + "', depotPath: '//depot', format: 'test.ws'\n"
+ "}"));

//Add a trigger
P4Trigger trigger = new P4Trigger();
trigger.start(job, false);
job.addTrigger(trigger);
job.save();

WorkflowRun lastRun = jenkins.assertBuildStatusSuccess(job.scheduleBuild2(0));
jenkins.waitUntilNoActivity();
jenkins.assertLogContains("P4 Task: syncing files at change", lastRun);

//Hack to make polling believe there are remote changes: sync the client 'test.ws' at an anterior revision to test the trigger
ClientHelper p4 = new ClientHelper(auth, null, "test.ws", "utf8");
Populate populate = new AutoCleanImpl(true, true, false, false, null, null);
p4.syncFiles(new P4Revision("9"), populate);

//Test trigger
trigger.poke(job, auth.getP4port());

TimeUnit.SECONDS.sleep(job.getQuietPeriod());
jenkins.waitUntilNoActivity();

assertEquals("Should have triggered a build on changes", 2, job.getLastBuild().getNumber());
}

@Test
public void testShouldNotTriggerPipelineIfNoChanges() throws Exception {

WorkflowJob job = jenkins.jenkins.createProject(WorkflowJob.class, "demo");
job.setDefinition(new CpsFlowDefinition(""
+ "node {\n"
+ " p4sync credential: '" + auth.getId() + "', template: 'test.ws'" + "\n"
+ "}"));

//Add a trigger
P4Trigger trigger = new P4Trigger();
trigger.start(job, false);
job.addTrigger(trigger);
job.save();

WorkflowRun lastRun = jenkins.assertBuildStatusSuccess(job.scheduleBuild2(0));

jenkins.waitUntilNoActivity();
jenkins.assertLogContains("P4 Task: syncing files at change", lastRun);

//Test trigger
trigger.poke(job, auth.getP4port());

TimeUnit.SECONDS.sleep(job.getQuietPeriod());
jenkins.waitUntilNoActivity();

assertEquals("Shouldn't have triggered a build as no changes", 1, job.getLastBuild().getNumber());
}

private static void startHttpServer(int port) throws Exception {
DummyServer server = new DummyServer(port);
new Thread(server).start();
Expand Down

0 comments on commit 178a3a6

Please sign in to comment.