package tech.powerjob.server.core.scheduler; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import tech.powerjob.common.enums.TimeExpressionType; import tech.powerjob.common.exception.PowerJobException; import tech.powerjob.server.core.scheduler.auxiliary.TimingStrategyHandler; import tech.powerjob.server.core.scheduler.auxiliary.impl.*; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.util.ArrayList; import java.util.List; /** * @author Echo009 * @since 2022/3/29 */ public class TimingStrategyServiceTest { private final TimingStrategyService timingStrategyService; public TimingStrategyServiceTest() { List timingStrategyHandlers = new ArrayList<>(); timingStrategyHandlers.add(new CronTimingStrategyHandler()); timingStrategyHandlers.add(new ApiTimingStrategyHandler()); timingStrategyHandlers.add(new FixedDelayTimingStrategyHandler()); timingStrategyHandlers.add(new FixedRateTimingStrategyHandler()); timingStrategyHandlers.add(new WorkflowTimingStrategyHandler()); timingStrategyService = new TimingStrategyService(timingStrategyHandlers); } @Test public void testApiAndWorkflow() { // api Assertions.assertDoesNotThrow(() -> timingStrategyService.validate(TimeExpressionType.API, "", null, null)); List triggerTimes = timingStrategyService.calculateNextTriggerTimes(TimeExpressionType.API, "", null, null); Assertions.assertEquals(1, triggerTimes.size()); // workflow Assertions.assertDoesNotThrow(() -> timingStrategyService.validate(TimeExpressionType.WORKFLOW, "", null, null)); triggerTimes = timingStrategyService.calculateNextTriggerTimes(TimeExpressionType.WORKFLOW, "", null, null); Assertions.assertEquals(1, triggerTimes.size()); } @Test public void testFixedRate() { // fixed rate Assertions.assertThrows(PowerJobException.class, () -> timingStrategyService.validate(TimeExpressionType.FIXED_RATE, "-0", null, null)); Assertions.assertThrows(PowerJobException.class, () -> timingStrategyService.validate(TimeExpressionType.FIXED_RATE, "FFF", null, null)); Assertions.assertThrows(PowerJobException.class, () -> timingStrategyService.validate(TimeExpressionType.FIXED_RATE, "300000", null, null)); Assertions.assertDoesNotThrow(() -> timingStrategyService.validate(TimeExpressionType.FIXED_RATE, "10000", null, null)); long timeParam = 1000; List triggerTimes = timingStrategyService.calculateNextTriggerTimes(TimeExpressionType.FIXED_RATE, String.valueOf(timeParam), null, null); Assertions.assertEquals(5, triggerTimes.size()); Long startTime = System.currentTimeMillis() + timeParam; Long endTime = System.currentTimeMillis() + timeParam * 3; triggerTimes = timingStrategyService.calculateNextTriggerTimes(TimeExpressionType.FIXED_RATE, String.valueOf(timeParam), startTime, endTime); Assertions.assertEquals(3, triggerTimes.size()); } @Test public void testFixedDelay() { // fixed delay Assertions.assertThrows(PowerJobException.class, () -> timingStrategyService.validate(TimeExpressionType.FIXED_DELAY, "-0", null, null)); Assertions.assertThrows(PowerJobException.class, () -> timingStrategyService.validate(TimeExpressionType.FIXED_DELAY, "FFF", null, null)); Assertions.assertThrows(PowerJobException.class, () -> timingStrategyService.validate(TimeExpressionType.FIXED_DELAY, "300000", null, null)); Assertions.assertDoesNotThrow(() -> timingStrategyService.validate(TimeExpressionType.FIXED_DELAY, "10000", null, null)); List triggerTimes = timingStrategyService.calculateNextTriggerTimes(TimeExpressionType.FIXED_DELAY, "1", null, null); Assertions.assertEquals(1, triggerTimes.size()); } @Test public void testCron() { Assertions.assertThrows(IllegalArgumentException.class, () -> timingStrategyService.validate(TimeExpressionType.CRON, "00 00 07 8-14,22-28 * 8", null, null)); Assertions.assertDoesNotThrow(() -> timingStrategyService.validate(TimeExpressionType.CRON, "00 00 07 8-14,22-28 * 2", null, null)); // https://github.com/PowerJob/PowerJob/issues/382 // 支持同时指定 day-of-week 、day-of-month // 每隔一周的周一早上 7 点执行一次 LocalDateTime start = LocalDateTime.of(2088, 5, 24, 7, 0, 0); LocalDateTime end = LocalDateTime.of(2088, 7, 12, 7, 0, 0); List triggerTimes = timingStrategyService.calculateNextTriggerTimes(TimeExpressionType.CRON, "0 0 7 8-14,22-28 * 2", start.toEpochSecond(ZoneOffset.of("+8")) * 1000, end.toEpochSecond(ZoneOffset.of("+8")) * 1000); Assertions.assertNotNull(triggerTimes); } }