package org.terracotta.jenkins.plugins.acceleratedbuildnow.it;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import hudson.model.FreeStyleBuild;
import hudson.model.Result;
import hudson.model.Cause;
import hudson.model.FreeStyleProject;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import jenkins.model.Jenkins;
import org.junit.Test;
import org.jvnet.hudson.test.HudsonTestCase;
import org.jvnet.hudson.test.SleepBuilder;
import org.jvnet.hudson.test.recipes.LocalData;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.terracotta.jenkins.plugins.acceleratedbuildnow.AcceleratedBuildNowAction;
public class CantAbortHumanBuildTest extends HudsonTestCase {
@Test
@LocalData
public void test_dont_abort_build_if_started_by_user() throws Exception {
System.out.println("I have : " + Jenkins.getInstance().getNumExecutors() + " executor(s) available");
FreeStyleProject job1 = Jenkins.getInstance().getAllItems(FreeStyleProject.class).get(0);
assertThat(job1.getName(), equalTo("simpleJobWithParameters"));
job1.getBuildersList().add(new SleepBuilder(3000));
httpPostBuildToJenkins("job/simpleJobWithParameters/buildWithParameters", "stringParameterName=Value&.crumb=test");
FreeStyleProject acceleratedJob = createFreeStyleProject("acceleratedJob");
acceleratedJob.getBuildersList().add(new SleepBuilder(3000));
AcceleratedBuildNowAction acceleratedBuildNowAction = new AcceleratedBuildNowAction(acceleratedJob);
StaplerRequest request = mock(StaplerRequest.class);
when(request.getContextPath()).thenReturn("");
StaplerResponse response = mock(StaplerResponse.class);
doNothing().when(response).sendRedirect(anyString());
acceleratedBuildNowAction.doBuild(request, response);
while (!Jenkins.getInstance().getQueue().isEmpty()) {
Thread.sleep(1000);
System.out.println("Waiting for the queue to empty");
}
assertEquals(3, job1.getBuilds().size());
FreeStyleBuild job1FirstBuild = job1.getBuilds().get(1);
assertBuildStatus(Result.SUCCESS, job1FirstBuild);
job1FirstBuild.getCauses();
for (Cause cause : job1FirstBuild.getCauses()) {
System.out.println("the cause is : " + cause.getShortDescription());
System.out.println("the cause class is : " + cause.getClass().getName());
}
assertEquals(1, acceleratedJob.getBuilds().size());
FreeStyleBuild acceleratedJobOnlyBuild = acceleratedJob.getBuilds().getLastBuild();
assertBuildStatus(Result.SUCCESS, acceleratedJobOnlyBuild);
// job1firstBuild started before acceleratedJobOnlyBuild
assertTrue(job1FirstBuild.getStartTimeInMillis() < acceleratedJobOnlyBuild.getStartTimeInMillis());
}
private void httpPostBuildToJenkins(String urlSuffix, String urlParameters) throws MalformedURLException,
IOException, ProtocolException {
String url = Jenkins.getInstance().getRootUrl() + urlSuffix;
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
con.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.writeBytes(urlParameters);
wr.flush();
wr.close();
int responseCode = con.getResponseCode();
System.out.println("\nSending 'POST' request to URL : " + url);
System.out.println("Post parameters : " + urlParameters);
System.out.println("Response Code : " + responseCode);
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer testResponse = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
testResponse.append(inputLine);
}
in.close();
// print result
// System.out.println(testResponse.toString());
}
}