WangHan
2024-09-12 d5855a4926926698b740bc6c7ba489de47adb68b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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<TimingStrategyHandler> 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<String> 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<String> 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<String> 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<String> 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);
    }
}