package de.otto.edison.jobs.service; import de.otto.edison.jobs.domain.JobInfo; import de.otto.edison.jobs.repository.JobRepository; import de.otto.edison.testsupport.TestServer; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.time.Clock; import java.time.OffsetDateTime; import java.util.Optional; import static de.otto.edison.jobs.domain.JobInfo.JobStatus.DEAD; import static de.otto.edison.jobs.domain.JobInfo.JobStatus.OK; import static de.otto.edison.jobs.domain.JobInfo.newJobInfo; import static java.time.Instant.now; import static java.time.ZoneId.systemDefault; import static java.time.temporal.ChronoUnit.SECONDS; import static java.util.Collections.emptyList; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.core.Is.is; @RunWith(SpringRunner.class) @SpringBootTest(classes = TestServer.class) public class JobServiceIntegrationTest { @Autowired JobService jobService; @Autowired JobRepository jobRepository; final Clock clock = Clock.systemDefaultZone(); @Test public void shouldFindJobService() { assertThat(jobService, is(notNullValue())); } @Test public void shouldKillJobsWithoutUpdateSince() { JobInfo toBeKilled = defaultJobInfo("toBeKilled", 75); jobRepository.createOrUpdate(toBeKilled); jobService.killJobsDeadSince(60); Optional<JobInfo> expectedKilledJob = jobRepository.findOne(toBeKilled.getJobId()); assertThat(expectedKilledJob.get().isStopped(), is(true)); assertThat(expectedKilledJob.get().getStatus(), is(DEAD)); } @Test public void shouldNotKillJobsThatHaveRecentlyBeenUpdated() { JobInfo notToBeKilled = defaultJobInfo("notToBeKilled", 45); jobRepository.createOrUpdate(notToBeKilled); jobService.killJobsDeadSince(60); Optional<JobInfo> expectedRunningJob = jobRepository.findOne(notToBeKilled.getJobId()); assertThat(expectedRunningJob.get().isStopped(), is(false)); assertThat(expectedRunningJob.get().getStatus(), is(OK)); } private JobInfo defaultJobInfo(String jobId, int secondsAgo) { OffsetDateTime lastUpdated = OffsetDateTime.ofInstant(now(clock).minus(secondsAgo, SECONDS), systemDefault()); return newJobInfo(jobId, "someJobType", OffsetDateTime.MIN, lastUpdated, Optional.empty(), OK, emptyList(), clock, "someHostname"); } }