package hudson.model; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import hudson.model.Queue.BlockedItem; import hudson.model.Queue.WaitingItem; import hudson.model.listeners.RunListener; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.SleepBuilder; public class JobQueueTest { @Rule public JenkinsRule j = new JenkinsRule(); private static volatile boolean fireCompletedFlag = false; private static volatile boolean fireFinalizeFlag = false; @Before public void setUp() { RunListener<Run> listener = new RunListener<Run>() { @Override public void onCompleted(Run r, TaskListener listener) { JobQueueTest.fireCompletedFlag = true; try { Thread.sleep(5000); } catch (InterruptedException e) { } } @Override public void onFinalized(Run r) { JobQueueTest.fireFinalizeFlag = true; try { Thread.sleep(2000); } catch (InterruptedException e) { } } }; RunListener.all().add(listener); } @Test public void buildPendingWhenBuildRunning() throws Exception { FreeStyleProject project = j.createFreeStyleProject("project"); project.getBuildersList().add(new SleepBuilder(2000)); //Kick the first Build project.scheduleBuild2(1); //Schedule another build project.scheduleBuild2(1); //The project should be in Queue when Run is in BUILDING stage assertTrue(project.isInQueue()); //Cancel the project from queue j.jenkins.getQueue().cancel(project.getQueueItem()); //Verify the project is removed from Queue assertTrue(j.jenkins.getQueue().isEmpty()); } @Test public void buildPendingWhenBuildInPostProduction() throws Exception { FreeStyleProject project = j.createFreeStyleProject("project"); project.getBuildersList().add(new SleepBuilder(1000)); //Kick the first Build project.scheduleBuild2(1); int count =0; //Now, Wait for run to be in POST_PRODUCTION stage while(!JobQueueTest.fireCompletedFlag && count<100) { Thread.sleep(100); count++; } if(JobQueueTest.fireCompletedFlag) { //Schedule the build for the project and this build should be in Queue since the state is POST_PRODUCTION project.scheduleBuild2(0); assertTrue(project.isInQueue()); //That means its pending or its waiting or blocked j.jenkins.getQueue().maintain(); while(j.jenkins.getQueue().getItem(project) instanceof WaitingItem) { System.out.println(j.jenkins.getQueue().getItem(project)); j.jenkins.getQueue().maintain(); Thread.sleep(10); } assertTrue(j.jenkins.getQueue().getItem(project) instanceof BlockedItem); //check is it is blocked } else { fail("The maximum attempts for checking if the job is in POST_PRODUCTION State have reached"); } count=0; while(!JobQueueTest.fireFinalizeFlag && count<100) { Thread.sleep(100); count++; } if(JobQueueTest.fireFinalizeFlag) { //Verify the build is removed from Queue since now it is in Completed state //it should be scheduled for run j.jenkins.getQueue().maintain(); assertFalse(j.jenkins.getQueue().getItem(project) instanceof BlockedItem); } else { fail("The maximum attempts for checking if the job is in COMPLETED State have reached"); } Thread.sleep(1000); //Sleep till job completes. } }