package org.jooby.internal.quartz;
import static org.easymock.EasyMock.expect;
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.Date;
import java.util.Map.Entry;
import org.jooby.quartz.Scheduled;
import org.jooby.test.MockUnit;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import com.typesafe.config.Config;
import com.typesafe.config.ConfigException;
@RunWith(PowerMockRunner.class)
@PrepareForTest({JobExpander.class, System.class })
public class JobExpanderTest {
public static class NoScheduled implements Job {
@Override
public void execute(final JobExecutionContext context) throws JobExecutionException {
}
}
public static class IntervalJob implements Job {
@Override
@Scheduled("5s")
public void execute(final JobExecutionContext context) throws JobExecutionException {
}
}
public static class IntervalJobUnknownAttribute implements Job {
@Override
@Scheduled("5s; x= 1")
public void execute(final JobExecutionContext context) throws JobExecutionException {
}
}
public static class IntervalJobWithDelay implements Job {
@Override
@Scheduled("3s; delay = 1s")
public void execute(final JobExecutionContext context) throws JobExecutionException {
}
}
public static class IntervalJobWithDelayAndRepeat implements Job {
@Override
@Scheduled("3s; delay = 1s; repeat =repeat.prop")
public void execute(final JobExecutionContext context) throws JobExecutionException {
}
}
public static class IntervalJobWithRepeat implements Job {
@Override
@Scheduled("3s; repeat = 10")
public void execute(final JobExecutionContext context) throws JobExecutionException {
}
}
public static class IntervalJobWithRepeatForEver implements Job {
@Override
@Scheduled("3s; repeat=*")
public void execute(final JobExecutionContext context) throws JobExecutionException {
}
}
public static class CronJob implements Job {
@Override
@Scheduled("0/3 * * * * ?")
public void execute(final JobExecutionContext context) throws JobExecutionException {
}
}
public static class InvervalPropertyRefJob implements Job {
@Override
@Scheduled("job.scheduled")
public void execute(final JobExecutionContext context) throws JobExecutionException {
}
}
public static class InvervalCronRefJob implements Job {
@Override
@Scheduled("job.scheduled")
public void execute(final JobExecutionContext context) throws JobExecutionException {
}
}
@Test
public void sillyJacocoThinkWeNeedToInstantiateJobExpender() throws Exception {
new JobExpander();
}
@Test(expected = IllegalArgumentException.class)
public void shouldFailWhenAnnotationIsMissing() throws Exception {
new MockUnit(Config.class)
.expect(unit -> {
})
.run(unit -> {
JobExpander.jobs(unit.get(Config.class), Arrays.asList(NoScheduled.class));
});
}
@Test
public void shouldBuildIntervalJob() throws Exception {
long date = 1429984623207L;
new MockUnit(Config.class)
.expect(unit -> {
Config config = unit.get(Config.class);
expect(config.getString("5s")).andThrow(new ConfigException.BadPath("5s", "5s"));
})
.expect(unit -> {
unit.mockStatic(System.class);
expect(System.currentTimeMillis()).andReturn(date);
})
.run(unit -> {
Entry<JobDetail, Trigger> entry = JobExpander
.jobs(unit.get(Config.class), Arrays.asList(IntervalJob.class)).entrySet()
.iterator().next();
JobDetail job = entry.getKey();
assertEquals(IntervalJob.class, job.getJobClass());
assertEquals(IntervalJob.class.getPackage().getName(), job.getKey().getGroup());
assertEquals(IntervalJob.class.getSimpleName(), job.getKey().getName());
SimpleTrigger trigger = (SimpleTrigger) entry.getValue();
assertEquals(5000L, trigger.getRepeatInterval());
assertEquals(new Date(date), trigger.getStartTime());
assertEquals(-1, trigger.getRepeatCount());
assertEquals(IntervalJob.class.getPackage().getName(), trigger.getKey().getGroup());
assertEquals(IntervalJob.class.getSimpleName(), trigger.getKey().getName());
});
}
@Test(expected = IllegalArgumentException.class)
public void shouldBuildIntervalJobUnknownAttribute() throws Exception {
long date = 1429984623207L;
new MockUnit(Config.class)
.expect(unit -> {
Config config = unit.get(Config.class);
expect(config.getString("5s; x= 1")).andThrow(new ConfigException.BadPath("5s", "5s"));
})
.expect(unit -> {
unit.mockStatic(System.class);
expect(System.currentTimeMillis()).andReturn(date);
})
.run(unit -> {
Entry<JobDetail, Trigger> entry = JobExpander
.jobs(unit.get(Config.class), Arrays.asList(IntervalJobUnknownAttribute.class))
.entrySet()
.iterator().next();
SimpleTrigger trigger = (SimpleTrigger) entry.getValue();
assertEquals(5000L, trigger.getRepeatInterval());
assertEquals(new Date(date), trigger.getStartTime());
assertEquals(-1, trigger.getRepeatCount());
});
}
@Test
public void shouldBuildIntervalJobWithDelay() throws Exception {
long date = 1429984623207L;
new MockUnit(Config.class)
.expect(unit -> {
Config config = unit.get(Config.class);
expect(config.getString("3s; delay = 1s"))
.andThrow(new ConfigException.BadPath("bad", "bad"));
expect(config.getString("1s"))
.andThrow(new ConfigException.BadPath("bad", "bad"));
})
.expect(unit -> {
unit.mockStatic(System.class);
expect(System.currentTimeMillis()).andReturn(date);
})
.run(
unit -> {
Entry<JobDetail, Trigger> entry = JobExpander
.jobs(unit.get(Config.class), Arrays.asList(IntervalJobWithDelay.class))
.entrySet()
.iterator().next();
JobDetail job = entry.getKey();
assertEquals(IntervalJobWithDelay.class, job.getJobClass());
assertEquals(IntervalJobWithDelay.class.getPackage().getName(), job.getKey()
.getGroup());
assertEquals(IntervalJobWithDelay.class.getSimpleName(), job.getKey().getName());
SimpleTrigger trigger = (SimpleTrigger) entry.getValue();
assertEquals(3000L, trigger.getRepeatInterval());
assertEquals(new Date(date + 1000L), trigger.getStartTime());
assertEquals(-1, trigger.getRepeatCount());
assertEquals(IntervalJobWithDelay.class.getPackage().getName(), trigger.getKey()
.getGroup());
assertEquals(IntervalJobWithDelay.class.getSimpleName(), trigger.getKey().getName());
});
}
@Test
public void shouldBuildIntervalJobWithDelayAndRepeat() throws Exception {
long date = 1429984623207L;
new MockUnit(Config.class)
.expect(unit -> {
Config config = unit.get(Config.class);
expect(config.getString("3s; delay = 1s; repeat =repeat.prop"))
.andThrow(new ConfigException.BadPath("bad", "bad"));
expect(config.getString("1s"))
.andThrow(new ConfigException.BadPath("bad", "bad"));
expect(config.getString("repeat.prop")).andReturn("1");
})
.expect(unit -> {
unit.mockStatic(System.class);
expect(System.currentTimeMillis()).andReturn(date);
})
.run(
unit -> {
Entry<JobDetail, Trigger> entry = JobExpander
.jobs(unit.get(Config.class), Arrays.asList(IntervalJobWithDelayAndRepeat.class))
.entrySet()
.iterator().next();
SimpleTrigger trigger = (SimpleTrigger) entry.getValue();
assertEquals(3000L, trigger.getRepeatInterval());
assertEquals(new Date(date + 1000L), trigger.getStartTime());
assertEquals(1, trigger.getRepeatCount());
});
}
@Test
public void shouldBuildIntervalJobWithRepeat() throws Exception {
long date = 1429984623207L;
new MockUnit(Config.class)
.expect(unit -> {
Config config = unit.get(Config.class);
expect(config.getString("3s; repeat = 10"))
.andThrow(new ConfigException.BadPath("bad", "bad"));
expect(config.getString("10"))
.andThrow(new ConfigException.BadPath("bad", "bad"));
})
.expect(unit -> {
unit.mockStatic(System.class);
expect(System.currentTimeMillis()).andReturn(date);
})
.run(
unit -> {
Entry<JobDetail, Trigger> entry = JobExpander
.jobs(unit.get(Config.class), Arrays.asList(IntervalJobWithRepeat.class))
.entrySet()
.iterator().next();
JobDetail job = entry.getKey();
assertEquals(IntervalJobWithRepeat.class, job.getJobClass());
assertEquals(IntervalJobWithRepeat.class.getPackage().getName(), job.getKey()
.getGroup());
assertEquals(IntervalJobWithRepeat.class.getSimpleName(), job.getKey().getName());
SimpleTrigger trigger = (SimpleTrigger) entry.getValue();
assertEquals(3000L, trigger.getRepeatInterval());
assertEquals(new Date(date), trigger.getStartTime());
assertEquals(10, trigger.getRepeatCount());
assertEquals(IntervalJobWithRepeat.class.getPackage().getName(), trigger.getKey()
.getGroup());
assertEquals(IntervalJobWithRepeat.class.getSimpleName(), trigger.getKey().getName());
});
}
@Test
public void shouldBuildIntervalJobWithRepeatForEver() throws Exception {
long date = 1429984623207L;
new MockUnit(Config.class)
.expect(unit -> {
Config config = unit.get(Config.class);
expect(config.getString("3s; repeat=*"))
.andThrow(new ConfigException.BadPath("bad", "bad"));
})
.expect(unit -> {
unit.mockStatic(System.class);
expect(System.currentTimeMillis()).andReturn(date);
})
.run(
unit -> {
Entry<JobDetail, Trigger> entry = JobExpander
.jobs(unit.get(Config.class), Arrays.asList(IntervalJobWithRepeatForEver.class))
.entrySet()
.iterator().next();
JobDetail job = entry.getKey();
assertEquals(IntervalJobWithRepeatForEver.class, job.getJobClass());
assertEquals(IntervalJobWithRepeatForEver.class.getPackage().getName(), job.getKey()
.getGroup());
assertEquals(IntervalJobWithRepeatForEver.class.getSimpleName(), job.getKey()
.getName());
SimpleTrigger trigger = (SimpleTrigger) entry.getValue();
assertEquals(3000L, trigger.getRepeatInterval());
assertEquals(new Date(date), trigger.getStartTime());
assertEquals(-1, trigger.getRepeatCount());
assertEquals(IntervalJobWithRepeatForEver.class.getPackage().getName(), trigger
.getKey().getGroup());
assertEquals(IntervalJobWithRepeatForEver.class.getSimpleName(), trigger.getKey()
.getName());
});
}
@Test
public void shouldBuildCronJob() throws Exception {
new MockUnit(Config.class)
.expect(
unit -> {
Config config = unit.get(Config.class);
expect(config.getString("0/3 * * * * ?")).andThrow(
new ConfigException.BadPath("0/3 * * * * ?", "0/3 * * * * ?"));
})
.run(unit -> {
Entry<JobDetail, Trigger> entry = JobExpander
.jobs(unit.get(Config.class), Arrays.asList(CronJob.class)).entrySet()
.iterator().next();
JobDetail job = entry.getKey();
assertEquals(CronJob.class, job.getJobClass());
assertEquals(CronJob.class.getPackage().getName(), job.getKey().getGroup());
assertEquals(CronJob.class.getSimpleName(), job.getKey().getName());
CronTrigger trigger = (CronTrigger) entry.getValue();
assertEquals("0/3 * * * * ?", trigger.getCronExpression());
assertEquals(CronJob.class.getPackage().getName(), trigger.getKey().getGroup());
assertEquals(CronJob.class.getSimpleName(), trigger.getKey().getName());
});
}
@Test
public void shouldBuildInvervalJobWithPropertyRef() throws Exception {
new MockUnit(Config.class)
.expect(
unit -> {
Config config = unit.get(Config.class);
expect(config.getString("job.scheduled")).andReturn("3000");
})
.run(
unit -> {
Entry<JobDetail, Trigger> entry = JobExpander
.jobs(unit.get(Config.class), Arrays.asList(InvervalPropertyRefJob.class))
.entrySet()
.iterator().next();
JobDetail job = entry.getKey();
assertEquals(InvervalPropertyRefJob.class, job.getJobClass());
assertEquals(InvervalPropertyRefJob.class.getPackage().getName(), job.getKey()
.getGroup());
assertEquals(InvervalPropertyRefJob.class.getSimpleName(), job.getKey().getName());
SimpleTrigger trigger = (SimpleTrigger) entry.getValue();
assertEquals(3000L, trigger.getRepeatInterval());
assertEquals(InvervalPropertyRefJob.class.getPackage().getName(), trigger.getKey()
.getGroup());
assertEquals(InvervalPropertyRefJob.class.getSimpleName(), trigger.getKey().getName());
});
}
@Test
public void shouldBuildCronJobWithPropertyRef() throws Exception {
new MockUnit(Config.class)
.expect(
unit -> {
Config config = unit.get(Config.class);
expect(config.getString("job.scheduled")).andReturn("0/3 * * * * ?");
})
.run(unit -> {
Entry<JobDetail, Trigger> entry = JobExpander
.jobs(unit.get(Config.class), Arrays.asList(InvervalCronRefJob.class))
.entrySet()
.iterator().next();
JobDetail job = entry.getKey();
assertEquals(InvervalCronRefJob.class, job.getJobClass());
assertEquals(InvervalCronRefJob.class.getPackage().getName(), job.getKey()
.getGroup());
assertEquals(InvervalCronRefJob.class.getSimpleName(), job.getKey().getName());
CronTrigger trigger = (CronTrigger) entry.getValue();
assertEquals("0/3 * * * * ?", trigger.getCronExpression());
assertEquals(InvervalCronRefJob.class.getPackage().getName(), trigger.getKey()
.getGroup());
assertEquals(InvervalCronRefJob.class.getSimpleName(), trigger.getKey().getName());
});
}
}