Switch license from Intranator license to GPLv2 + linking exception (ACKed by Steffen)
[libi2ncommon] / test / test_cron_interval.cpp
1 /*
2 The software in this package is distributed under the GNU General
3 Public License version 2 (with a special exception described below).
4
5 A copy of GNU General Public License (GPL) is included in this distribution,
6 in the file COPYING.GPL.
7
8 As a special exception, if other files instantiate templates or use macros
9 or inline functions from this file, or you compile this file and link it
10 with other works to produce a work based on this file, this file
11 does not by itself cause the resulting work to be covered
12 by the GNU General Public License.
13
14 However the source code for this file must still be made available
15 in accordance with section (3) of the GNU General Public License.
16
17 This exception does not invalidate any other reasons why a work based
18 on this file might be covered by the GNU General Public License.
19 */
20 /** @file
21  * @brief unit test for cron functions.
22  *
23  * @copyright Copyright © 2009 by Intra2net AG
24  *
25  */
26
27 #define BOOST_TEST_DYN_LINK
28 #include <boost/test/unit_test.hpp>
29
30 #include <time.h>
31 #include <stdlib.h>
32 #include <stdexcept>
33
34 #include <cron.hpp>
35
36 using namespace std;
37 using namespace I2n::Time;
38
39 class TestCronIntervalFuncFixture
40 {
41 public:
42     TestCronIntervalFuncFixture()
43     {
44         // our check-values are set for Germany
45         setenv("TZ",":Europe/Berlin",1);
46     }
47 };
48
49 BOOST_FIXTURE_TEST_SUITE(TestCronIntervalFunc, TestCronIntervalFuncFixture)
50
51 BOOST_AUTO_TEST_CASE(IntervalBeginToday)
52 {
53     WeekCron cron("2345",3600,7200,10);
54     BOOST_CHECK_EQUAL( static_cast<time_t>(1233100800), cron.get_next_run(1233099657));
55 }
56
57 BOOST_AUTO_TEST_CASE(IntervalDoneToday)
58 {
59     WeekCron cron("2345",3600);
60     BOOST_CHECK_EQUAL( static_cast<time_t>(1233187200), cron.get_next_run(1233150000));
61 }
62
63 BOOST_AUTO_TEST_CASE(IntervalBeginNow)
64 {
65     WeekCron cron("2345",3600,7200,10);
66     BOOST_CHECK_EQUAL( static_cast<time_t>(1233100810), cron.get_next_run(1233100800));
67 }
68
69 BOOST_AUTO_TEST_CASE(IntervalBeginStep)
70 {
71     WeekCron cron("2345",3600,7200,10);
72     BOOST_CHECK_EQUAL( static_cast<time_t>(1233100820), cron.get_next_run(1233100810));
73 }
74
75 BOOST_AUTO_TEST_CASE(IntervalWithin)
76 {
77     WeekCron cron("2345",3600,7200,10);
78     BOOST_CHECK_EQUAL( static_cast<time_t>(1233100830), cron.get_next_run(1233100822));
79 }
80
81 BOOST_AUTO_TEST_CASE(IntervalLaststep1)
82 {
83     WeekCron cron("2345",3600,7200,11);
84     BOOST_CHECK_EQUAL( static_cast<time_t>(1233187200), cron.get_next_run(1233104399));
85 }
86
87 BOOST_AUTO_TEST_CASE(IntervalLaststep2)
88 {
89     WeekCron cron("2345",3600,7200,11);
90     BOOST_CHECK_EQUAL( static_cast<time_t>(1233187200), cron.get_next_run(1233104398));
91 }
92
93 BOOST_AUTO_TEST_CASE(IntervalLaststep3)
94 {
95     WeekCron cron("2345",3600,7199,10);
96     BOOST_CHECK_EQUAL( static_cast<time_t>(1233187200), cron.get_next_run(1233104397));
97 }
98
99 BOOST_AUTO_TEST_CASE(IntervalLaststep4)
100 {
101     WeekCron cron("2345",3600,7200,3599);
102     BOOST_CHECK_EQUAL( static_cast<time_t>(1233104399), cron.get_next_run(1233104398));
103 }
104
105 BOOST_AUTO_TEST_CASE(IntervalLaststep5)
106 {
107     WeekCron cron("2345",3600,7200,3598);
108     BOOST_CHECK_EQUAL( static_cast<time_t>(1233187200), cron.get_next_run(1233104398));
109 }
110
111 BOOST_AUTO_TEST_CASE(IntervalLaststepMatch)
112 {
113     WeekCron cron("2345",3600,7200,10);
114     BOOST_CHECK_EQUAL( static_cast<time_t>(1233187200), cron.get_next_run(1233104399));
115 }
116
117 BOOST_AUTO_TEST_CASE(IntervalEnd)
118 {
119     WeekCron cron("2345",3600,7200,10);
120     BOOST_CHECK_EQUAL( static_cast<time_t>(1233187200), cron.get_next_run(1233104400));
121 }
122
123 BOOST_AUTO_TEST_CASE(IntervalBigstep)
124 {
125     WeekCron cron("2345",3600,7200,10000);
126     BOOST_CHECK_EQUAL( static_cast<time_t>(1233187200), cron.get_next_run(1233100800));
127 }
128
129 BOOST_AUTO_TEST_CASE(IntervalWholeDayStart)
130 {
131     WeekCron cron("345",0,86400,10);
132     BOOST_CHECK_EQUAL( static_cast<time_t>(1233097200), cron.get_next_run(1233097199));
133 }
134
135 BOOST_AUTO_TEST_CASE(IntervalWholeDayStartNow)
136 {
137     WeekCron cron("345",0,86400,10);
138     BOOST_CHECK_EQUAL( static_cast<time_t>(1233097210), cron.get_next_run(1233097200));
139 }
140
141 BOOST_AUTO_TEST_CASE(IntervalWholeDayEnd)
142 {
143     WeekCron cron("2",0,86400,10);
144     BOOST_CHECK_EQUAL( static_cast<time_t>(1233615600), cron.get_next_run(1233097199));
145 }
146
147 BOOST_AUTO_TEST_CASE(IntervalWholeDayWithin1)
148 {
149     WeekCron cron("2345",0,86400,10);
150     BOOST_CHECK_EQUAL( static_cast<time_t>(1233097230), cron.get_next_run(1233097220));
151 }
152
153 BOOST_AUTO_TEST_CASE(IntervalWholeDayWithin2)
154 {
155     WeekCron cron("2345",0,86400,10);
156     BOOST_CHECK_EQUAL( static_cast<time_t>(1233097230), cron.get_next_run(1233097229));
157 }
158
159 BOOST_AUTO_TEST_CASE(IntervalWholeDayWithinBoundary)
160 {
161     WeekCron cron("2345",0,86400,10);
162     BOOST_CHECK_EQUAL( static_cast<time_t>(1233097200), cron.get_next_run(1233097199));
163 }
164
165 BOOST_AUTO_TEST_CASE(IntervalBeforeOnce)
166 {
167     WeekCron cron("2345",0,3600,3600);
168     BOOST_CHECK_EQUAL( static_cast<time_t>(1233183600), cron.get_next_run(1233100799));
169 }
170
171 BOOST_AUTO_TEST_CASE(IntervalBeforeOnceBig)
172 {
173     WeekCron cron("2345",0,3600,86400);
174     BOOST_CHECK_EQUAL( static_cast<time_t>(1233183600), cron.get_next_run(1233100799));
175 }
176
177 BOOST_AUTO_TEST_CASE(IntervalAfterOnce)
178 {
179     WeekCron cron("2345",0,3600,86400);
180     BOOST_CHECK_EQUAL( static_cast<time_t>(1233183600), cron.get_next_run(1233097200));
181 }
182
183 BOOST_AUTO_TEST_CASE(IntervalOnceShort)
184 {
185     WeekCron cron("2345",0,1,86400);
186     BOOST_CHECK_EQUAL( static_cast<time_t>(1233097200), cron.get_next_run(1233097199));
187 }
188
189 BOOST_AUTO_TEST_CASE(IntervalTooShort)
190 {
191     WeekCron cron("2345",0,0,86400);
192     BOOST_CHECK_EQUAL( static_cast<time_t>(1233183600), cron.get_next_run(1233097200));
193 }
194
195 BOOST_AUTO_TEST_CASE(IntervalOverDSTBackwards1)
196 {
197     WeekCron cron("0123456",0,14400,60);
198     // calc at: Sun Oct 26 01:59:59 CEST 2008
199     // expected next run: Sun Oct 26 02:00:00 CEST 2008
200     BOOST_CHECK_EQUAL( static_cast<time_t>(1224979200), cron.get_next_run(1224979199));
201 }
202
203 BOOST_AUTO_TEST_CASE(IntervalOverDSTBackwards2)
204 {
205     WeekCron cron("0123456",0,14400,60);
206     // calc at: Sun Oct 26 02:29:59 CEST 2008
207     // expected next run: Sun Oct 26 02:30:00 CEST 2008
208     BOOST_CHECK_EQUAL( static_cast<time_t>(1224981000), cron.get_next_run(1224980999));
209 }
210
211 BOOST_AUTO_TEST_CASE(IntervalOverDSTBackwards3)
212 {
213     WeekCron cron("0123456",0,14400,60);
214     // calc at: Sun Oct 26 02:59:59 CEST 2008
215     // expected next run: Sun Oct 26 02:00:00 CET 2008
216     BOOST_CHECK_EQUAL( static_cast<time_t>(1224982800), cron.get_next_run(1224982799));
217 }
218
219 BOOST_AUTO_TEST_CASE(IntervalOverDSTBackwards4)
220 {
221     WeekCron cron("0123456",0,14400,60);
222     // calc at: Sun Oct 26 02:59:59 CET 2008
223     // expected next run: Sun Oct 26 03:00:00 CET 2008
224     BOOST_CHECK_EQUAL( static_cast<time_t>(1224986400), cron.get_next_run(1224986399));
225 }
226
227 BOOST_AUTO_TEST_CASE(IntervalInFirstDSTBackwards1)
228 {
229     WeekCron cron("0123456",0,9000,60);
230     // calc at: Sun Oct 26 02:28:59 CEST 2008
231     // expected next run: Sun Oct 26 02:29:00 CEST 2008
232     BOOST_CHECK_EQUAL( static_cast<time_t>(1224980940), cron.get_next_run(1224980939));
233 }
234
235 BOOST_AUTO_TEST_CASE(IntervalInFirstDSTBackwards2)
236 {
237     WeekCron cron("0123456",0,9000,60);
238     // calc at: Sun Oct 26 02:29:01 CEST 2008
239     // expected next run: Mon Oct 27 00:00:00 CET 2008
240     BOOST_CHECK_EQUAL( static_cast<time_t>(1225062000), cron.get_next_run(1224980941));
241 }
242
243 BOOST_AUTO_TEST_CASE(IntervalInSecondDSTBackwards1)
244 {
245     WeekCron cron("0123456",0,12600,60);
246     // calc at: Sun Oct 26 02:28:59 CET 2008
247     // expected next run: Sun Oct 26 02:29:00 CET 2008
248     BOOST_CHECK_EQUAL( static_cast<time_t>(1224984540), cron.get_next_run(1224984539));
249 }
250
251 BOOST_AUTO_TEST_CASE(IntervalInSecondDSTBackwards2)
252 {
253     WeekCron cron("0123456",0,12600,60);
254     // calc at: Sun Oct 26 02:29:01 CET 2008
255     // expected next run: Sun Oct 26 02:30:00 CET 2008
256     BOOST_CHECK_EQUAL( static_cast<time_t>(1224984600), cron.get_next_run(1224984541));
257 }
258
259 BOOST_AUTO_TEST_CASE(IntervalOutFirstDSTBackwards1)
260 {
261     WeekCron cron("0123456",9000,18000,60);
262     // calc at: Sun Oct 26 02:29:00 CEST 2008
263     // expected next run: Sun Oct 26 02:30:00 CET 2008
264     BOOST_CHECK_EQUAL( static_cast<time_t>(1224984600), cron.get_next_run(1224980940));
265 }
266
267 BOOST_AUTO_TEST_CASE(IntervalOutFirstDSTBackwards2)
268 {
269     WeekCron cron("0123456",9000,18000,60);
270     // calc at: Sun Oct 26 02:29:00 CET 2008
271     // expected next run: Sun Oct 26 02:30:00 CET 2008
272     BOOST_CHECK_EQUAL( static_cast<time_t>(1224984600), cron.get_next_run(1224984540));
273 }
274
275 BOOST_AUTO_TEST_CASE(IntervalOutSecondDSTBackwards1)
276 {
277     WeekCron cron("0123456",12600,18000,60);
278     // calc at: Sun Oct 26 02:29:59 CET 2008
279     // expected next run: Sun Oct 26 03:30:00 CET 2008
280     BOOST_CHECK_EQUAL( static_cast<time_t>(1224988200), cron.get_next_run(1224984599));
281 }
282
283 BOOST_AUTO_TEST_CASE(IntervalDSTBackwardsWholeday1)
284 {
285     WeekCron cron("0123456",0,86400,60);
286     // calc at: Sun Oct 26 22:58:59 CET 2008
287     // expected next run: Sun Oct 26 22:59:00 CET 2008
288     BOOST_CHECK_EQUAL( static_cast<time_t>(1225058340), cron.get_next_run(1225058339));
289 }
290
291 BOOST_AUTO_TEST_CASE(IntervalDSTBackwardsWholeday2)
292 {
293     WeekCron cron("0123456",0,86400,60);
294     // calc at: Sun Oct 26 22:59:59 CET 2008
295     // expected next run: Sun Oct 26 23:00:00 CET 2008
296     BOOST_CHECK_EQUAL( static_cast<time_t>(1225058400), cron.get_next_run(1225058399));
297 }
298
299 BOOST_AUTO_TEST_CASE(IntervalDSTBackwardsWholeday3)
300 {
301     WeekCron cron("0123456",0,86400,60);
302     // calc at: Sun Oct 26 23:30:00 CET 2008
303     // expected next run: Sun Oct 26 23:31:00 CET 2008
304     BOOST_CHECK_EQUAL( static_cast<time_t>(1225060260), cron.get_next_run(1225060200));
305 }
306
307 BOOST_AUTO_TEST_CASE(IntervalOverDSTForward1)
308 {
309     WeekCron cron("0123456",0,14400,60);
310     // calc at: Sun Mar 29 01:59:59 CET 2009
311     // expected next run: Sun Mar 29 03:00:00 CEST 2009
312     BOOST_CHECK_EQUAL( static_cast<time_t>(1238288400), cron.get_next_run(1238288399));
313 }
314
315 BOOST_AUTO_TEST_CASE(IntervalOverDSTForward2)
316 {
317     WeekCron cron("0123456",0,14400,60);
318     // calc at: Sun Mar 29 03:58:59 CEST 2009
319     // expected next run: Sun Mar 29 03:59:00 CEST 2009
320     BOOST_CHECK_EQUAL( static_cast<time_t>(1238291940), cron.get_next_run(1238291939));
321 }
322
323 BOOST_AUTO_TEST_CASE(IntervalOverDSTForward3)
324 {
325     WeekCron cron("0123456",0,14400,60);
326     // calc at: Sun Mar 29 03:59:59 CEST 2009
327     // expected next run: Mon Mar 30 00:00:00 CEST 2009
328     BOOST_CHECK_EQUAL( static_cast<time_t>(1238364000), cron.get_next_run(1238291999));
329 }
330
331 BOOST_AUTO_TEST_CASE(IntervalInDSTForward1)
332 {
333     WeekCron cron("0123456",3600,9000,60);
334     // calc at: Sun Mar 29 01:59:59 CET 2009
335     // expected next run: Sun Mar 29 03:00:00 CEST 2009
336     BOOST_CHECK_EQUAL( static_cast<time_t>(1238288400), cron.get_next_run(1238288399));
337 }
338
339 BOOST_AUTO_TEST_CASE(IntervalInDSTForward2)
340 {
341     WeekCron cron("0123456",3600,9000,60);
342     // calc at: Sun Mar 29 03:29:59 CEST 2009
343     // expected next run: Mon Mar 30 01:00:00 CEST 2009
344     BOOST_CHECK_EQUAL( static_cast<time_t>(1238367600), cron.get_next_run(1238290199));
345 }
346
347 BOOST_AUTO_TEST_CASE(IntervalInDSTForward3)
348 {
349     WeekCron cron("0123456",7200,9000,60);
350     // calc at: Sun Mar 29 01:59:59 CET 2009
351     // expected next run: Sun Mar 29 03:00:00 CEST 2009
352     BOOST_CHECK_EQUAL( static_cast<time_t>(1238288400), cron.get_next_run(1238288399));
353 }
354
355 BOOST_AUTO_TEST_CASE(IntervalOutDSTForward)
356 {
357     WeekCron cron("0123456",9000,14400,60);
358     // calc at: Sun Mar 29 03:29:59 CEST 2009
359     // expected next run: Sun Mar 29 03:30:30 CEST 2009
360     BOOST_CHECK_EQUAL( static_cast<time_t>(1238290200), cron.get_next_run(1238290199));
361 }
362
363 BOOST_AUTO_TEST_CASE(IntervalDuringDSTForward)
364 {
365     WeekCron cron("0123456",7200,10800,60);
366     // calc at: Sun Mar 29 01:59:59 CET 2009
367     // expected next run: Sun Mar 29 03:00:00 CEST 2009
368     BOOST_CHECK_EQUAL( static_cast<time_t>(1238288400), cron.get_next_run(1238288399));
369 }
370
371 BOOST_AUTO_TEST_CASE(IntervalDSTForwardWholeday1)
372 {
373     WeekCron cron("03",0,86400,60);
374     // calc at: Sun Mar 29 23:59:59 CEST 2009
375     // expected next run: Wed Apr  1 00:00:00 CEST 2009
376     BOOST_CHECK_EQUAL( static_cast<time_t>(1238536800), cron.get_next_run(1238363999));
377 }
378
379 BOOST_AUTO_TEST_CASE(IntervalDSTForwardWholeday2)
380 {
381     WeekCron cron("03",0,86400,60);
382     // calc at: Mon Mar 30 00:59:59 CEST 2009
383     // expected next run: Wed Apr  1 00:00:00 CEST 2009
384     BOOST_CHECK_EQUAL( static_cast<time_t>(1238536800), cron.get_next_run(1238367599));
385 }
386
387 BOOST_AUTO_TEST_CASE(IntervalDSTForwardWholeday3)
388 {
389     WeekCron cron("0123456",0,86340,60);
390     // calc at: Sun Mar 29 11:42:06 CEST 2009
391     // expected next run: Sun Mar 29 11:43:00 CEST 2009
392     BOOST_CHECK_EQUAL( static_cast<time_t>(1238319780), cron.get_next_run(1238319726));
393 }
394
395 BOOST_AUTO_TEST_CASE(IntervalDSTForwardWholeday4)
396 {
397     WeekCron cron("0123456",3599,86340,60);
398     // calc at: Sun Mar 29 11:42:06 CEST 2009
399     // expected next run: Sun Mar 29 11:42:59 CEST 2009
400     BOOST_CHECK_EQUAL( static_cast<time_t>(1238319779), cron.get_next_run(1238319726));
401 }
402
403 BOOST_AUTO_TEST_CASE(IntervalDSTForwardWholeday5)
404 {
405     WeekCron cron("0123456",3600,86340,60);
406     // calc at: Sun Mar 29 11:42:06 CEST 2009
407     // expected next run: Sun Mar 29 11:43:00 CEST 2009
408     BOOST_CHECK_EQUAL( static_cast<time_t>(1238319780), cron.get_next_run(1238319726));
409 }
410
411 BOOST_AUTO_TEST_SUITE_END()