Replace inet_aton() with inet_pton() to parse IPs correctly (#8825)
[libi2ncommon] / test / test_cron_point.cpp
... / ...
CommitLineData
1/*
2The software in this package is distributed under the GNU General
3Public License version 2 (with a special exception described below).
4
5A copy of GNU General Public License (GPL) is included in this distribution,
6in the file COPYING.GPL.
7
8As a special exception, if other files instantiate templates or use macros
9or inline functions from this file, or you compile this file and link it
10with other works to produce a work based on this file, this file
11does not by itself cause the resulting work to be covered
12by the GNU General Public License.
13
14However the source code for this file must still be made available
15in accordance with section (3) of the GNU General Public License.
16
17This exception does not invalidate any other reasons why a work based
18on 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
36using namespace std;
37using namespace I2n::Time;
38
39class TestCronPointFuncFixture
40{
41public:
42 TestCronPointFuncFixture()
43 {
44 // our check-values are set for Germany
45 setenv("TZ",":Europe/Berlin",1);
46 }
47};
48
49BOOST_FIXTURE_TEST_SUITE(TestCronPointFunc, TestCronPointFuncFixture)
50
51/////////////////////////////////////////////////////
52// Points in time
53/////////////////////////////////////////////////////
54
55BOOST_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
61BOOST_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
67BOOST_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
73BOOST_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
79BOOST_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
85BOOST_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
91BOOST_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
97BOOST_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
103BOOST_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
109BOOST_AUTO_TEST_CASE(HalfOpenInterval)
110{
111 WeekCron cron("2345",86400);
112 BOOST_REQUIRE_THROW(cron.get_next_run(1233097200),std::runtime_error);
113}
114
115BOOST_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
123BOOST_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
131BOOST_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
139BOOST_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
147BOOST_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
155BOOST_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
163BOOST_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
171BOOST_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
179BOOST_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
187BOOST_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
195BOOST_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
203BOOST_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
211BOOST_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
220BOOST_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
228BOOST_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
236BOOST_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
245BOOST_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
253BOOST_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
261BOOST_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
269BOOST_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
277BOOST_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
285BOOST_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
293BOOST_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
327BOOST_AUTO_TEST_SUITE_END()