View Javadoc

1   package com.atlassian.core.cron.parser;
2   
3   import com.atlassian.core.cron.CronEditorBean;
4   import com.atlassian.core.util.DateUtils;
5   import junit.framework.TestCase;
6   
7   /**
8    *
9    */
10  public class TestCronExpressionParser extends TestCase
11  {
12  
13      public void testDailySpecOncePerDay()
14      {
15          String twoAmOncePerDay = "0 0 2 * * *";
16          CronExpressionParser cronExpressionParser = new CronExpressionParser(twoAmOncePerDay);
17          assertTrue(cronExpressionParser.isDailyMode());
18          assertFalse(cronExpressionParser.isDayPerWeekMode());
19          assertFalse(cronExpressionParser.isDaysPerMonthMode());
20          assertTrue((cronExpressionParser.isValidForEditor()));
21          assertEquals(2, cronExpressionParser.getHoursEntry().getRunOnce());
22          assertEquals(DateUtils.AM, cronExpressionParser.getHoursEntry().getRunOnceMeridian());
23          assertEquals(-1, cronExpressionParser.getHoursEntry().getFrom());
24          assertNull(cronExpressionParser.getHoursEntry().getFromMeridian());
25          assertEquals(-1, cronExpressionParser.getHoursEntry().getTo());
26          assertNull(cronExpressionParser.getHoursEntry().getToMeridian());
27          assertEquals(0, cronExpressionParser.getIncrementInMinutes());
28      }
29  
30      public void testDailySpecEvery15MinutesForOneHourOnly()
31      {
32          String twoAmEvery15Minutes = "0 0/15 2 * * *";
33          CronExpressionParser cronExpressionParser = new CronExpressionParser(twoAmEvery15Minutes);
34          assertFalse(cronExpressionParser.isDailyMode());
35          assertFalse(cronExpressionParser.isDayPerWeekMode());
36          assertFalse(cronExpressionParser.isDaysPerMonthMode());
37          assertTrue(cronExpressionParser.isAdvancedMode());
38  
39          // because the cron expression is too complex we dont need to know if its a range because the user can only edit
40          // via the advanced tab in the ui.
41          assertFalse(cronExpressionParser.isValidForEditor());
42  
43          final CronEditorBean cronEditorBean = cronExpressionParser.getCronEditorBean();
44          assertTrue(cronEditorBean.isAdvancedMode());
45          assertFalse(cronEditorBean.isDailyMode());
46          assertFalse(cronEditorBean.isDayOfWeekOfMonth());
47          assertFalse(cronEditorBean.isDayPerWeekMode());
48          assertFalse(cronEditorBean.isDaysPerMonthMode());
49      }
50  
51      public void testDailySpecEvery15MinutesForOneHourOnlyUsingRange()
52      {
53          String twoAmEvery15Minutes = "0 0/15 8-8 * * *";
54          CronExpressionParser cronExpressionParser = new CronExpressionParser(twoAmEvery15Minutes);
55          assertTrue(cronExpressionParser.isDailyMode());
56          assertFalse(cronExpressionParser.isDayPerWeekMode());
57          assertFalse(cronExpressionParser.isDaysPerMonthMode());
58          assertFalse(cronExpressionParser.isAdvancedMode());
59          assertTrue(cronExpressionParser.isValidForEditor());
60  
61          assertEquals(-1, cronExpressionParser.getHoursEntry().getRunOnce());
62          assertNull(cronExpressionParser.getHoursEntry().getRunOnceMeridian());
63          assertEquals(8, cronExpressionParser.getHoursEntry().getFrom());
64          assertEquals(DateUtils.AM, cronExpressionParser.getHoursEntry().getFromMeridian());
65          assertEquals(9, cronExpressionParser.getHoursEntry().getTo());
66          assertEquals(DateUtils.AM, cronExpressionParser.getHoursEntry().getToMeridian());
67          assertEquals(15, cronExpressionParser.getIncrementInMinutes());
68  
69          final CronEditorBean cronEditorBean = cronExpressionParser.getCronEditorBean();
70          assertFalse(cronEditorBean.isAdvancedMode());
71          assertTrue(cronEditorBean.isDailyMode());
72          assertFalse(cronEditorBean.isDayOfWeekOfMonth());
73          assertFalse(cronEditorBean.isDayPerWeekMode());
74          assertFalse(cronEditorBean.isDaysPerMonthMode());
75      }
76  
77      public void testDailySpecEveryTwoHoursInRange()
78      {
79          String oneToFourEveryTwoHours = "0 0 1-4/2 ? * *";
80          CronExpressionParser cronExpressionParser = new CronExpressionParser(oneToFourEveryTwoHours);
81          assertTrue(cronExpressionParser.isDailyMode());
82          assertFalse(cronExpressionParser.isDayPerWeekMode());
83          assertFalse(cronExpressionParser.isDaysPerMonthMode());
84          assertEquals(120, cronExpressionParser.getIncrementInMinutes());
85          assertEquals(-1, cronExpressionParser.getHoursEntry().getRunOnce());
86          assertNull(cronExpressionParser.getHoursEntry().getRunOnceMeridian());
87          assertEquals(1, cronExpressionParser.getHoursEntry().getFrom());
88          assertEquals(DateUtils.AM, cronExpressionParser.getHoursEntry().getFromMeridian());
89          assertEquals(5, cronExpressionParser.getHoursEntry().getTo());
90          assertEquals(DateUtils.AM, cronExpressionParser.getHoursEntry().getToMeridian());
91          assertTrue(cronExpressionParser.isValidForEditor());
92          assertFalse(cronExpressionParser.getCronEditorBean().is24HourRange());
93      }
94  
95      public void testDailySpecEveryFifteenMinutesOfEverySecondHourAllDay()
96      {
97          String everyFiftenMinutesEverySecondHour = "0 0/15 */2 ? * *";
98          CronExpressionParser cronExpressionParser = new CronExpressionParser(everyFiftenMinutesEverySecondHour);
99          assertFalse(cronExpressionParser.isDailyMode());
100         assertFalse(cronExpressionParser.isDayPerWeekMode());
101         assertFalse(cronExpressionParser.isDaysPerMonthMode());
102         assertTrue(cronExpressionParser.isAdvancedMode());
103 
104         assertEquals(0, cronExpressionParser.getIncrementInMinutes());
105 
106         // because the cron expression is too complex we dont need to know if its a range because the user can only edit
107         // via the advanced tab in the ui.
108         assertFalse(cronExpressionParser.isValidForEditor());
109 
110         final CronEditorBean cronEditorBean = cronExpressionParser.getCronEditorBean();
111         assertTrue(cronEditorBean.isAdvancedMode());
112         assertFalse(cronEditorBean.isDailyMode());
113         assertFalse(cronEditorBean.isDayOfWeekOfMonth());
114         assertFalse(cronEditorBean.isDayPerWeekMode());
115         assertFalse(cronEditorBean.isDaysPerMonthMode());
116     }
117 
118     public void testDailySpecEveryTwoHoursAllDay()
119     {
120         String oneToFourEveryTwoHours = "0 0 */2 ? * *";
121         CronExpressionParser cronExpressionParser = new CronExpressionParser(oneToFourEveryTwoHours);
122         assertTrue(cronExpressionParser.isDailyMode());
123         assertFalse(cronExpressionParser.isDayPerWeekMode());
124         assertFalse(cronExpressionParser.isDaysPerMonthMode());
125         assertEquals(120, cronExpressionParser.getIncrementInMinutes());
126         assertEquals(-1, cronExpressionParser.getHoursEntry().getRunOnce());
127         assertNull(cronExpressionParser.getHoursEntry().getRunOnceMeridian());
128         assertEquals(12, cronExpressionParser.getHoursEntry().getFrom());
129         assertEquals(DateUtils.AM, cronExpressionParser.getHoursEntry().getFromMeridian());
130         assertEquals(12, cronExpressionParser.getHoursEntry().getTo());
131         assertEquals(DateUtils.AM, cronExpressionParser.getHoursEntry().getToMeridian());
132         assertTrue(cronExpressionParser.isValidForEditor());
133         assertTrue(cronExpressionParser.getCronEditorBean().is24HourRange());
134     }
135 
136     public void testDailySpecWithInvalidFrequency()
137     {
138         String oneToFourEveryFiveHours = "0 0 1-4/5 * * *";
139         CronExpressionParser cronExpressionParser = new CronExpressionParser(oneToFourEveryFiveHours);
140         assertFalse(cronExpressionParser.isValidForEditor());
141     }
142 
143     public void testMonthEntryIsInvalid()
144     {
145         String everyTwoMonths = "0 10 6 * */2 ?";
146         CronExpressionParser cronExpressionParser = new CronExpressionParser(everyTwoMonths);
147         assertFalse(cronExpressionParser.isValidForEditor());
148     }
149 
150     public void testDayOfWeekOfMonth()
151     {
152         String secondMondayOfMonth = "0 30 20 ? * 2#2";
153         CronExpressionParser cronExpressionParser = new CronExpressionParser(secondMondayOfMonth);
154         assertTrue(cronExpressionParser.isValidForEditor());
155         assertTrue(cronExpressionParser.isDaysPerMonthMode());
156         assertTrue(cronExpressionParser.isDayOfWeekOfMonth()); // sub mode
157         assertFalse(cronExpressionParser.isDayPerWeekMode());
158     }
159 
160     public void testDaysOfWeekIsValid()
161     {
162         String everySecondMondayOfTheMonth = "0 0 1 ? * 2#2";
163         CronExpressionParser cronExpressionParser = new CronExpressionParser(everySecondMondayOfTheMonth);
164         assertTrue(cronExpressionParser.isValidForEditor());
165         assertTrue(cronExpressionParser.isDaysPerMonthMode());
166         assertTrue(cronExpressionParser.isDayOfWeekOfMonth()); // sub mode
167         assertFalse(cronExpressionParser.isDayPerWeekMode());
168     }
169 
170     public void testInvalidCronStringPassesBackDefaultCronStrings()
171     {
172         String oneToFourEveryFiveHours = "0 0 1-4/5 * * *";
173         CronExpressionParser cronExpressionParser = new CronExpressionParser(oneToFourEveryFiveHours);
174         assertFalse(cronExpressionParser.isValidForEditor());
175         assertEquals(oneToFourEveryFiveHours, cronExpressionParser.getCronString());
176 
177         assertTrue(cronExpressionParser.getDaysOfWeekEntry().isValid());
178     }
179 
180     public void testInvalidCronStringGoesToAdvancedMode()
181     {
182         String oneToFourEveryFiveHours = "0 0 1-4/5 * * *";
183         CronExpressionParser cronExpressionParser = new CronExpressionParser(oneToFourEveryFiveHours);
184         assertFalse(cronExpressionParser.isValidForEditor());
185         assertTrue(cronExpressionParser.isAdvancedMode());
186     }
187 
188     public void testInvalidCronStringHourContainsComma()
189     {
190         String atOneTwoAndThree = "0 0 1,2,3 * * *";
191         CronExpressionParser cronExpressionParser = new CronExpressionParser(atOneTwoAndThree);
192         assertFalse(cronExpressionParser.isValidForEditor());
193         assertTrue(cronExpressionParser.isAdvancedMode());
194     }
195 
196     public void testDayOfMonthIsValid()
197     {
198         String thirtiethOfEachMonth = "0 0 1 30 * ?";
199         CronExpressionParser cronExpressionParser = new CronExpressionParser(thirtiethOfEachMonth);
200         assertTrue(cronExpressionParser.isValidForEditor());
201         assertTrue(cronExpressionParser.isDaysPerMonthMode());
202         assertFalse(cronExpressionParser.isDayOfWeekOfMonth());
203         assertFalse(cronExpressionParser.isDayPerWeekMode());
204     }
205 
206     public void testSingleDayOfWeek()
207     {
208         String everySecondMondayOfTheMonth = "0 0 1 ? * 2";
209         CronExpressionParser cronExpressionParser = new CronExpressionParser(everySecondMondayOfTheMonth);
210         assertTrue(cronExpressionParser.isValidForEditor());
211         assertFalse(cronExpressionParser.isDaysPerMonthMode());
212         assertTrue(cronExpressionParser.isDayPerWeekMode());
213         assertEquals(1, cronExpressionParser.getHoursEntry().getRunOnce());
214         assertNull(cronExpressionParser.getDaysOfWeekEntry().getDayInMonthOrdinal());
215         assertEquals("2", cronExpressionParser.getDaysOfWeekEntry().getDaysAsNumbers());
216     }
217 
218     public void testDefaultCronString()
219     {
220         CronExpressionParser cronExpressionParser = new CronExpressionParser();
221         CronEditorBean cronEditorBean = cronExpressionParser.getCronEditorBean();
222         assertTrue(cronEditorBean.isDailyMode());
223     }
224 
225     public void testEvery3Days()
226     {
227         CronExpressionParser cronExpressionParser = new CronExpressionParser("0 0 10 1/3 * ?");
228         CronEditorBean cronEditorBean = cronExpressionParser.getCronEditorBean();
229         assertFalse(cronEditorBean.isDailyMode());
230         assertFalse(cronEditorBean.isDayPerWeekMode());
231         assertFalse(cronEditorBean.isDaysPerMonthMode());
232         assertTrue(cronEditorBean.isAdvancedMode());
233     }
234 
235     public void testDaily10am()
236     {
237         //Note that 0 0 10 * * ? is not the preferred daily form of the generator.
238         //The parser should still be able to interpret it as daily however.
239         CronExpressionParser cronExpressionParser = new CronExpressionParser("0 0 10 * * ?");
240         CronEditorBean cronEditorBean = cronExpressionParser.getCronEditorBean();
241         assertTrue(cronEditorBean.isDailyMode());
242         assertFalse(cronEditorBean.isDayPerWeekMode());
243         assertFalse(cronEditorBean.isDaysPerMonthMode());
244         assertFalse(cronEditorBean.isAdvancedMode());
245     }
246 
247     public void testSecondsImpliesAdvanced()
248     {
249 
250         String fourtyFourSecsAfterMidnight = "44 0 0 * * ?";
251         CronExpressionParser cronExpressionParser = new CronExpressionParser(fourtyFourSecsAfterMidnight);
252         CronEditorBean cronEditorBean = cronExpressionParser.getCronEditorBean();
253         assertFalse(cronEditorBean.isDailyMode());
254         assertFalse(cronEditorBean.isDayPerWeekMode());
255         assertFalse(cronEditorBean.isDaysPerMonthMode());
256         assertTrue(cronEditorBean.isAdvancedMode());
257     }
258 
259     public void testYearIsAdvanced()
260     {
261         CronExpressionParser cronExpressionParser = new CronExpressionParser("0 0 1 * * ? 2007");
262         CronEditorBean cronEditorBean = cronExpressionParser.getCronEditorBean();
263         assertFalse(cronEditorBean.isDailyMode());
264         assertFalse(cronEditorBean.isDayPerWeekMode());
265         assertFalse(cronEditorBean.isDaysPerMonthMode());
266         assertTrue(cronEditorBean.isAdvancedMode());
267     }
268 
269 }