1 package com.atlassian.scheduler.core;
2
3 import com.atlassian.scheduler.config.JobConfig;
4 import com.atlassian.scheduler.config.JobId;
5 import com.atlassian.scheduler.config.JobRunnerKey;
6 import com.atlassian.scheduler.config.Schedule;
7 import com.atlassian.scheduler.core.impl.MemoryRunDetailsDao;
8 import com.atlassian.scheduler.status.JobDetails;
9 import com.google.common.collect.ImmutableList;
10 import com.google.common.collect.ImmutableSet;
11 import org.hamcrest.Matchers;
12
13 import javax.annotation.Nonnull;
14 import javax.annotation.Nullable;
15 import java.util.Arrays;
16 import java.util.Date;
17 import java.util.List;
18 import java.util.Set;
19 import java.util.concurrent.atomic.AtomicInteger;
20
21 import static java.util.concurrent.TimeUnit.MILLISECONDS;
22 import static org.junit.Assert.assertThat;
23
24
25
26
27
28
29 class SchedulerServiceFixture extends AbstractSchedulerService {
30 private static final long HACK_NANO_STEP = MILLISECONDS.toNanos(30L);
31
32 final AtomicInteger startImplCalls = new AtomicInteger();
33 final AtomicInteger standbyImplCalls = new AtomicInteger();
34 final AtomicInteger shutdownImplCalls = new AtomicInteger();
35
36 private volatile boolean hackAwaitNanos;
37
38 SchedulerServiceFixture() {
39 super(new MemoryRunDetailsDao());
40 }
41
42 @Override
43 protected void startImpl() {
44 startImplCalls.incrementAndGet();
45 }
46
47 @Override
48 protected void standbyImpl() {
49 standbyImplCalls.incrementAndGet();
50 }
51
52 @Override
53 protected void shutdownImpl() {
54 shutdownImplCalls.incrementAndGet();
55 }
56
57 @Nonnull
58 @Override
59 public Set<JobRunnerKey> getJobRunnerKeysForAllScheduledJobs() {
60 return ImmutableSet.of();
61 }
62
63 @Override
64 public void scheduleJob(JobId jobId, JobConfig jobConfig) {
65 }
66
67 @Override
68 public void unscheduleJob(JobId jobId) {
69 }
70
71 @Nullable
72 @Override
73 public Date calculateNextRunTime(Schedule schedule) {
74 return null;
75 }
76
77 @Override
78 public JobDetails getJobDetails(JobId jobId) {
79 return null;
80 }
81
82 @Nonnull
83 @Override
84 public List<JobDetails> getJobsByJobRunnerKey(JobRunnerKey jobRunnerKey) {
85 return ImmutableList.of();
86 }
87
88 @Override
89 long awaitNanos(long nanosLeft) throws InterruptedException {
90 if (hackAwaitNanos) {
91 return nanosLeft - HACK_NANO_STEP;
92 }
93 return super.awaitNanos(nanosLeft);
94 }
95
96 void hackAwaitNanos() {
97 hackAwaitNanos = true;
98 }
99
100 void assertState(int expectedStartCount, int expectedStandbyCount, int expectedShutdownCount, State state) {
101 assertThat("assertState(start, standby, shutdown, state)",
102 Arrays.<Object>asList(startImplCalls.get(), standbyImplCalls.get(), shutdownImplCalls.get(), getState()),
103 Matchers.<Object>contains(expectedStartCount, expectedStandbyCount, expectedShutdownCount, state));
104 }
105
106 }