@Test public void shouldFindTheLatestJobWhenJobStatusIsRequested() throws Exception { JobInstance job = JobInstanceMother.buildEndingWithState(JobState.Rescheduled, JobResult.Unknown, "config"); job.assign("agent", new Date()); JobInstance newJob = JobInstanceMother.buildEndingWithState( JobState.Building, JobResult.Unknown, "another_config"); newJob.setId(2); newJob.assign("another_agent", new Date()); String pipelineName = job.getPipelineName(); String stageName = job.getStageName(); when(jobInstanceService.buildByIdWithTransitions(job.getId())).thenReturn(job); when(jobDetailService.findMostRecentBuild(job.getIdentifier())).thenReturn(newJob); when(stageService.getBuildDuration(pipelineName, stageName, newJob)) .thenReturn(new DurationBean(newJob.getId(), 5l)); ModelAndView modelAndView = jobController.handleRequest(pipelineName, stageName, job.getId(), response); verify(jobInstanceService).buildByIdWithTransitions(job.getId()); verify(jobDetailService).findMostRecentBuild(job.getIdentifier()); verify(stageService).getBuildDuration(pipelineName, stageName, newJob); JsonValue json = from(((JsonList) modelAndView.getModel().get("json")).getJsonMap(0)); JsonValue buildingInfo = json.getObject("building_info"); assertThat(buildingInfo.getString("id"), is("2")); assertThat(buildingInfo.getString("last_build_duration"), is("5")); }
@Test public void shouldNotReloadScheduledJobPlansWhenAgentWorkAssignmentIsInProgress() throws Exception { fixture.createPipelineWithFirstStageScheduled(); Pipeline pipeline = pipelineDao.mostRecentPipeline(fixture.pipelineName); JobInstance job = pipeline.getFirstStage().getJobInstances().first(); final JobInstanceService mockJobInstanceService = mock(JobInstanceService.class); final Pipeline pipeline1 = pipeline; final Semaphore sem = new Semaphore(1); sem.acquire(); when(mockJobInstanceService.orderedScheduledBuilds()) .thenReturn(jobInstanceService.orderedScheduledBuilds()); when(mockJobInstanceService.buildByIdWithTransitions(job.getId())) .thenReturn(jobInstanceService.buildByIdWithTransitions(job.getId())); ScheduledPipelineLoader scheduledPipelineLoader = new ScheduledPipelineLoader(null, null, null, null, null, null, null, null) { @Override public Pipeline pipelineWithPasswordAwareBuildCauseByBuildId(long buildId) { sem.release(); sleepQuietly(1000); verify(mockJobInstanceService, times(1)).orderedScheduledBuilds(); return pipeline1; } }; final BuildAssignmentService buildAssignmentServiceUnderTest = new BuildAssignmentService( goConfigService, mockJobInstanceService, scheduleService, agentService, environmentConfigService, timeProvider, transactionTemplate, scheduledPipelineLoader, pipelineService, builderFactory, agentRemoteHandler); final Throwable[] fromThread = new Throwable[1]; buildAssignmentServiceUnderTest.onTimer(); Thread assigner = new Thread( new Runnable() { public void run() { try { final AgentConfig agentConfig = AgentMother.localAgentWithResources("some-other-resource"); buildAssignmentServiceUnderTest.assignWorkToAgent(agent(agentConfig)); } catch (Throwable e) { e.printStackTrace(); fromThread[0] = e; } finally { } } }, "assignmentThread"); assigner.start(); sem.acquire(); buildAssignmentServiceUnderTest.onTimer(); assigner.join(); assertThat(fromThread[0], is(nullValue())); }