1 package com.atlassian.scheduler.core.status;
2
3 import com.atlassian.scheduler.JobRunner;
4 import com.atlassian.scheduler.config.JobRunnerKey;
5 import com.atlassian.scheduler.config.Schedule;
6 import com.atlassian.scheduler.core.AbstractSchedulerService;
7 import com.atlassian.scheduler.core.util.ParameterMapSerializer;
8 import com.atlassian.scheduler.status.JobDetails;
9 import org.junit.Test;
10
11 import javax.annotation.Nonnull;
12 import javax.annotation.Nullable;
13 import java.util.Date;
14
15 import static com.atlassian.scheduler.config.RunMode.RUN_LOCALLY;
16 import static com.atlassian.scheduler.config.RunMode.RUN_ONCE_PER_CLUSTER;
17 import static com.atlassian.scheduler.config.Schedule.forInterval;
18 import static com.atlassian.scheduler.config.Schedule.runOnce;
19 import static com.atlassian.scheduler.core.Constants.BYTES_DEADF00D;
20 import static com.atlassian.scheduler.core.Constants.BYTES_PARAMETERS;
21 import static com.atlassian.scheduler.core.Constants.JOB_ID;
22 import static com.atlassian.scheduler.core.Constants.KEY;
23 import static com.atlassian.scheduler.core.Constants.PARAMETERS;
24 import static org.hamcrest.Matchers.is;
25 import static org.hamcrest.Matchers.nullValue;
26 import static org.junit.Assert.assertSame;
27 import static org.junit.Assert.assertThat;
28 import static org.mockito.Mockito.mock;
29 import static org.mockito.Mockito.when;
30
31
32
33
34 @SuppressWarnings({"ResultOfObjectAllocationIgnored", "ConstantConditions"})
35 public class AbstractJobDetailsFactoryTest {
36 @Test(expected = IllegalArgumentException.class)
37 public void testSchedulerServiceIsNull() {
38 new Fixture(null, 1L, KEY, runOnce(null), new Date(), null);
39 }
40
41 @Test(expected = IllegalArgumentException.class)
42 public void testJobIdNull() {
43 new Fixture(service(), 1L, KEY, runOnce(null), new Date(), null)
44 .buildJobDetails(null, 1L, RUN_LOCALLY);
45 }
46
47 @Test(expected = IllegalArgumentException.class)
48 public void testJobDataNull() {
49 new Fixture(service(), null, KEY, runOnce(null), new Date(), null)
50 .buildJobDetails(JOB_ID, null, RUN_LOCALLY);
51 }
52
53 @Test(expected = IllegalArgumentException.class)
54 public void testRunModeNull() {
55 new Fixture(service(), null, KEY, runOnce(null), new Date(), null)
56 .buildJobDetails(JOB_ID, 1L, null);
57 }
58
59 @Test(expected = IllegalArgumentException.class)
60 public void testJobRunnerKeyNull() {
61 new Fixture(service(), 1L, null, runOnce(null), new Date(), null)
62 .buildJobDetails(JOB_ID, 1L, RUN_LOCALLY);
63 }
64
65 @Test(expected = IllegalArgumentException.class)
66 public void testScheduleNull() {
67 new Fixture(service(), 1L, KEY, null, new Date(), null)
68 .buildJobDetails(JOB_ID, 1L, RUN_LOCALLY);
69 }
70
71 @Test
72 public void testNoJobRunner() {
73 final AbstractSchedulerService service = service();
74 final Date now = new Date();
75 final Fixture fixture = new Fixture(service, 1L, KEY, runOnce(now), null, null);
76 final JobDetails jobDetails = fixture.buildJobDetails(JOB_ID, 1L, RUN_LOCALLY);
77
78 assertThat(jobDetails.getJobId(), is(JOB_ID));
79 assertThat(jobDetails.getJobRunnerKey(), is(KEY));
80 assertThat(jobDetails.getNextRunTime(), nullValue());
81 assertThat(jobDetails.getRunMode(), is(RUN_LOCALLY));
82 assertThat(jobDetails.getSchedule(), is(runOnce(now)));
83 assertThat(jobDetails.isRunnable(), is(false));
84 }
85
86 @Test
87 public void testJobRunnerClassLoaderFails() {
88 final AbstractSchedulerService service = service();
89 final Date now = new Date();
90 final Fixture fixture = new Fixture(service, 2L, KEY, runOnce(now), null, BYTES_DEADF00D);
91 when(service.getJobRunner(KEY)).thenReturn(mock(JobRunner.class));
92
93 final JobDetails jobDetails = fixture.buildJobDetails(JOB_ID, 2L, RUN_LOCALLY);
94
95 assertThat(jobDetails.getJobId(), is(JOB_ID));
96 assertThat(jobDetails.getJobRunnerKey(), is(KEY));
97 assertThat(jobDetails.getNextRunTime(), nullValue());
98 assertThat(jobDetails.getRunMode(), is(RUN_LOCALLY));
99 assertThat(jobDetails.getSchedule(), is(runOnce(now)));
100 assertThat(jobDetails.isRunnable(), is(false));
101 }
102
103 @Test
104 public void testValues() {
105 final AbstractSchedulerService service = service();
106 final Date now = new Date();
107 final Fixture fixture = new Fixture(service, 3L, KEY, forInterval(60000L, now), null, BYTES_PARAMETERS);
108 when(service.getJobRunner(KEY)).thenReturn(mock(JobRunner.class));
109
110 final JobDetails jobDetails = fixture.buildJobDetails(JOB_ID, 3L, RUN_ONCE_PER_CLUSTER);
111
112 assertThat(jobDetails.getJobId(), is(JOB_ID));
113 assertThat(jobDetails.getJobRunnerKey(), is(KEY));
114 assertThat(jobDetails.getNextRunTime(), nullValue());
115 assertThat(jobDetails.getRunMode(), is(RUN_ONCE_PER_CLUSTER));
116 assertThat(jobDetails.getSchedule(), is(forInterval(60000L, now)));
117 assertThat(jobDetails.isRunnable(), is(true));
118 assertThat(jobDetails.getParameters(), is(PARAMETERS));
119 }
120
121 static AbstractSchedulerService service() {
122 final AbstractSchedulerService schedulerService = mock(AbstractSchedulerService.class);
123 when(schedulerService.getParameterMapSerializer()).thenReturn(new ParameterMapSerializer());
124 return schedulerService;
125 }
126
127 @SuppressWarnings({"AssignmentToDateFieldFromParameter", "AssignmentToCollectionOrArrayFieldFromParameter"})
128 static class Fixture extends AbstractJobDetailsFactory<Long> {
129 private final Long expected;
130 private final JobRunnerKey jobRunnerKey;
131 private final Schedule schedule;
132 private final Date nextRunTime;
133 private final byte[] parameters;
134
135 public Fixture(AbstractSchedulerService schedulerService, Long expected, JobRunnerKey jobRunnerKey,
136 Schedule schedule, Date nextRunTime, byte[] parameters) {
137 super(schedulerService);
138 this.expected = expected;
139 this.jobRunnerKey = jobRunnerKey;
140 this.schedule = schedule;
141 this.nextRunTime = nextRunTime;
142 this.parameters = parameters;
143 }
144
145 @Nonnull
146 @Override
147 protected JobRunnerKey getJobRunnerKey(Long jobData) {
148 assertSame(expected, jobData);
149 return jobRunnerKey;
150 }
151
152 @Nonnull
153 @Override
154 protected Schedule getSchedule(Long jobData) {
155 assertSame(expected, jobData);
156 return schedule;
157 }
158
159 @Nullable
160 @Override
161 protected Date getNextRunTime(Long jobData) {
162 assertSame(expected, jobData);
163 return nextRunTime;
164 }
165
166 @Nullable
167 @Override
168 protected byte[] getSerializedParameters(Long jobData) {
169 assertSame(expected, jobData);
170 return parameters;
171 }
172 }
173 }
174
175
176