Merge branch 'daemon-ext'
[libi2ncommon] / test / test_cron_point.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 TestCronPointFuncFixture
40 {
41 public:
42     TestCronPointFuncFixture()
43     {
44         // our check-values are set for Germany
45         setenv("TZ",":Europe/Berlin",1);
46     }
47 };
48
49 BOOST_FIXTURE_TEST_SUITE(TestCronPointFunc, TestCronPointFuncFixture)
50
51 /////////////////////////////////////////////////////
52 // Points in time
53 /////////////////////////////////////////////////////
54
55 BOOST_AUTO_TEST_CASE(NotYetToday)
56 {
57     WeekCron cron("2345",3600);
58     BOOST_CHECK_EQUAL( static_cast<time_t>(1233100800), cron.get_next_run(1233099657));
59 }
60
61 BOOST_AUTO_TEST_CASE(Now)
62 {
63     WeekCron cron("2345",3600);
64     BOOST_CHECK_EQUAL( static_cast<time_t>(1233187200), cron.get_next_run(1233100800));
65 }
66
67 BOOST_AUTO_TEST_CASE(LaterToday)
68 {
69     WeekCron cron("2345",3600);
70     BOOST_CHECK_EQUAL( static_cast<time_t>(1233187200), cron.get_next_run(1233100801));
71 }
72
73 BOOST_AUTO_TEST_CASE(Tomorrow)
74 {
75     WeekCron cron("45",3600);
76     BOOST_CHECK_EQUAL( static_cast<time_t>(1233187200), cron.get_next_run(1233099657));
77 }
78
79 BOOST_AUTO_TEST_CASE(NextWeek)
80 {
81     WeekCron cron("1",3600);
82     BOOST_CHECK_EQUAL( static_cast<time_t>(1233532800), cron.get_next_run(1233099657));
83 }
84
85 BOOST_AUTO_TEST_CASE(NextWeekFromToday)
86 {
87     WeekCron cron("13",3600);
88     BOOST_CHECK_EQUAL( static_cast<time_t>(1233532800), cron.get_next_run(1233100801));
89 }
90
91 BOOST_AUTO_TEST_CASE(StartMidnight)
92 {
93     WeekCron cron("2345",0);
94     BOOST_CHECK_EQUAL( static_cast<time_t>(1233097200), cron.get_next_run(1233097199));
95 }
96
97 BOOST_AUTO_TEST_CASE(StartMidnightTomorrow)
98 {
99     WeekCron cron("2345",0);
100     BOOST_CHECK_EQUAL( static_cast<time_t>(1233183600), cron.get_next_run(1233097200));
101 }
102
103 BOOST_AUTO_TEST_CASE(StartLastDaysec)
104 {
105     WeekCron cron("2345",86399);
106     BOOST_CHECK_EQUAL( static_cast<time_t>(1233183599), cron.get_next_run(1233097200));
107 }
108
109 BOOST_AUTO_TEST_CASE(HalfOpenInterval)
110 {
111     WeekCron cron("2345",86400);
112     BOOST_REQUIRE_THROW(cron.get_next_run(1233097200),std::runtime_error);
113 }
114
115 BOOST_AUTO_TEST_CASE(LongBeforeDSTBackwards)
116 {
117     WeekCron cron("0123456",75600);
118     // calc at: Sun Oct 26 00:00:00 CEST 2008
119     // expected next run: Sun Oct 26 21:00:00 CET 2008
120     BOOST_CHECK_EQUAL( static_cast<time_t>(1225051200), cron.get_next_run(1224972000));
121 }
122
123 BOOST_AUTO_TEST_CASE(BeforeDSTBackwards1)
124 {
125     WeekCron cron("0123456",7200);
126     // calc at: Sun Oct 26 01:59:59 CEST 2008
127     // expected next run: Sun Oct 26 02:00:00 CET 2008
128     BOOST_CHECK_EQUAL( static_cast<time_t>(1224982800), cron.get_next_run(1224979199));
129 }
130
131 BOOST_AUTO_TEST_CASE(BeforeDSTBackwards2)
132 {
133     WeekCron cron("0123456",7200);
134     // calc at: Sun Oct 26 02:59:59 CEST 2008
135     // expected next run: Sun Oct 26 02:00:00 CET 2008
136     BOOST_CHECK_EQUAL( static_cast<time_t>(1224982800), cron.get_next_run(1224982799));
137 }
138
139 BOOST_AUTO_TEST_CASE(AtDSTBackwards)
140 {
141     WeekCron cron("0123456",7200);
142     // calc at: Sun Oct 26 02:00:00 CET 2008
143     // expected next run: Mon Oct 27 02:00:00 CET 2008
144     BOOST_CHECK_EQUAL( static_cast<time_t>(1225069200), cron.get_next_run(1224982800));
145 }
146
147 BOOST_AUTO_TEST_CASE(DuringDSTBackwards)
148 {
149     WeekCron cron("0123456",7200);
150     // calc at: Sun Oct 26 02:00:01 CET 2008
151     // expected next run: Mon Oct 27 02:00:00 CET 2008
152     BOOST_CHECK_EQUAL( static_cast<time_t>(1225069200), cron.get_next_run(1224982801));
153 }
154
155 BOOST_AUTO_TEST_CASE(EndDSTBackwards1)
156 {
157     WeekCron cron("0123456",10800);
158     // calc at: Sun Oct 26 02:00:00 CEST 2008
159     // expected next run: Sun Oct 26 03:00:00 CET 2008
160     BOOST_CHECK_EQUAL( static_cast<time_t>(1224986400), cron.get_next_run(1224979200));
161 }
162
163 BOOST_AUTO_TEST_CASE(EndDSTBackwards2)
164 {
165     WeekCron cron("0123456",10800);
166     // calc at: Sun Oct 26 02:00:01 CEST 2008
167     // expected next run: Sun Oct 26 03:00:00 CET 2008
168     BOOST_CHECK_EQUAL( static_cast<time_t>(1224986400), cron.get_next_run(1224979201));
169 }
170
171 BOOST_AUTO_TEST_CASE(EndDSTBackwards3)
172 {
173     WeekCron cron("0123456",10799);
174     // calc at: Sun Oct 26 02:00:01 CEST 2008
175     // expected next run: Sun Oct 26 02:59:59 CET 2008
176     BOOST_CHECK_EQUAL( static_cast<time_t>(1224986399), cron.get_next_run(1224979201));
177 }
178
179 BOOST_AUTO_TEST_CASE(EndDSTBackwards4)
180 {
181     WeekCron cron("0123456",10799);
182     // calc at: Sun Oct 26 02:03:20 CET 2008
183     // expected next run: Sun Oct 26 02:59:59 CET 2008
184     BOOST_CHECK_EQUAL( static_cast<time_t>(1224986399), cron.get_next_run(1224983000));
185 }
186
187 BOOST_AUTO_TEST_CASE(OverDSTBackwards)
188 {
189     WeekCron cron("234",10800);
190     // calc at: Sat Oct 25 05:00:00 CEST 2008
191     // expected next run: Tue Oct 28 03:00:00 CET 2008
192     BOOST_CHECK_EQUAL( static_cast<time_t>(1225159200), cron.get_next_run(1224903600));
193 }
194
195 BOOST_AUTO_TEST_CASE(OverDSTBackwardsDaychange)
196 {
197     WeekCron cron("234",0);
198     // calc at: Sat Oct 25 00:00:00 CEST 2008
199     // expected next run: Tue Oct 28 00:00:00 CET 2008
200     BOOST_CHECK_EQUAL( static_cast<time_t>(1225148400), cron.get_next_run(1224885600));
201 }
202
203 BOOST_AUTO_TEST_CASE(LongBeforeDSTForward)
204 {
205     WeekCron cron("0123456",75600);
206     // calc at: Sat Mar 28 22:00:00 CET 2009
207     // expected next run: Sun Mar 29 21:00:00 CEST 2009
208     BOOST_CHECK_EQUAL( static_cast<time_t>(1238353200), cron.get_next_run(1238274000));
209 }
210
211 BOOST_AUTO_TEST_CASE(BeforeDSTForward1)
212 {
213     WeekCron cron("0123456",7200);
214     // calc at: Sun Mar 29 01:59:59 CET 2009
215     // expected next run: Sun Mar 29 03:00:00 CEST 2009
216     // glibc update: BOOST_CHECK_EQUAL( static_cast<time_t>(1238288400), cron.get_next_run(1238288399));
217     BOOST_CHECK_EQUAL( static_cast<time_t>(1238288400), cron.get_next_run(1238288399));
218 }
219
220 BOOST_AUTO_TEST_CASE(BeforeDSTForward2)
221 {
222     WeekCron cron("0123456",0);
223     // calc at: Sun Mar 29 01:59:59 CET 2009
224     // expected next run: Mon Mar 30 00:00:00 CEST 2009
225     BOOST_CHECK_EQUAL( static_cast<time_t>(1238364000), cron.get_next_run(1238288399));
226 }
227
228 BOOST_AUTO_TEST_CASE(AtDSTForward)
229 {
230     WeekCron cron("0123456",7200);
231     // calc at: Sun Mar 29 03:00:00 CEST 2009
232     // expected next run: Mon Mar 30 02:00:00 2009
233     BOOST_CHECK_EQUAL( static_cast<time_t>(1238371200), cron.get_next_run(1238288400));
234 }
235
236 BOOST_AUTO_TEST_CASE(DuringDSTForward)
237 {
238     WeekCron cron("0123456",9000);
239     // calc at: Sun Mar 29 01:59:59 CET 2009
240     // expected next run: Sun Mar 29 03:30:00 CEST 2009
241     // glibc update: BOOST_CHECK_EQUAL( static_cast<time_t>(1238290200), cron.get_next_run(1238288399));
242     BOOST_CHECK_EQUAL( static_cast<time_t>(1238290200), cron.get_next_run(1238288399));
243 }
244
245 BOOST_AUTO_TEST_CASE(EndDSTForward1)
246 {
247     WeekCron cron("0123456",10800);
248     // calc at: Sun Mar 29 01:59:59 CET 2009
249     // expected next run: Sun Mar 29 03:00:00 CEST 2009
250     BOOST_CHECK_EQUAL( static_cast<time_t>(1238288400), cron.get_next_run(1238288399));
251 }
252
253 BOOST_AUTO_TEST_CASE(EndDSTForward2)
254 {
255     WeekCron cron("0123456",10800);
256     // calc at: Sun Mar 29 03:00:00 CEST 2009
257     // expected next run: Mon Mar 30 03:00:00 CEST 2009
258     BOOST_CHECK_EQUAL( static_cast<time_t>(1238374800), cron.get_next_run(1238288400));
259 }
260
261 BOOST_AUTO_TEST_CASE(EndDSTForward3)
262 {
263     WeekCron cron("0123456",10800);
264     // calc at: Sun Mar 29 04:00:00 CEST 2009
265     // expected next run: Mon Mar 30 03:00:00 CEST 2009
266     BOOST_CHECK_EQUAL( static_cast<time_t>(1238374800), cron.get_next_run(1238292000));
267 }
268
269 BOOST_AUTO_TEST_CASE(EndDSTForward4)
270 {
271     WeekCron cron("0123456",86339);
272     // calc at: Sun Mar 29 11:42:06 CEST 2009
273     // expected next run: Sun Mar 29 23:58:59 CEST 2009
274     BOOST_CHECK_EQUAL( static_cast<time_t>(1238363939), cron.get_next_run(1238319726));
275 }
276
277 BOOST_AUTO_TEST_CASE(OverDSTForward)
278 {
279     WeekCron cron("234",10800);
280     // calc at: Sat Mar 28 23:00:00 CET 2009
281     // expected next run: Tue Mar 31 03:00:00 CEST 2009
282     BOOST_CHECK_EQUAL( static_cast<time_t>(1238461200), cron.get_next_run(1238277600));
283 }
284
285 BOOST_AUTO_TEST_CASE(OverDSTForwardDaychange)
286 {
287     WeekCron cron("1234",0);
288     // calc at: Sun Mar 29 00:00:00 CET 2009
289     // expected next run: Mon Mar 30 00:00:00 CEST 2009
290     BOOST_CHECK_EQUAL( static_cast<time_t>(1238364000), cron.get_next_run(1238281200));
291 }
292
293 BOOST_AUTO_TEST_CASE(StartHourStaysTheSameTill2038)
294 {
295     int daysec = 79200;
296
297     // Schedule daily at 22h from 1970 till 01.01.2038. Check every 90 minutes.
298     WeekCron cron("0123456", daysec);
299     for (time_t now = 86400*15; now < 2145916800; now += 90*60)
300     {
301         time_t result = cron.get_next_run(now);
302
303         // Calculate unix time for the begin of the day
304         struct tm calc_daybegin;
305         bool conversion_ok = (localtime_r(&result, &calc_daybegin) != NULL);
306         BOOST_CHECK_EQUAL(true, conversion_ok);
307
308         int remain=daysec;
309
310         calc_daybegin.tm_hour=remain/3600;
311         remain-=calc_daybegin.tm_hour*3600;
312
313         calc_daybegin.tm_min=remain/60;
314         remain-=calc_daybegin.tm_min*60;
315
316         calc_daybegin.tm_sec=remain;
317
318         // tm_isdst=-1 means to use the dst in use at the given time
319         calc_daybegin.tm_isdst=-1;
320
321         time_t daytime = mktime(&calc_daybegin);
322
323         BOOST_CHECK_EQUAL(daytime, result);
324     }
325 }
326
327 BOOST_AUTO_TEST_SUITE_END()