change permissions before fsync()
[libi2ncommon] / test / test_cron_point.cpp
CommitLineData
0e23f538
TJ
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*/
ac1367c0
GE
20/** @file
21 * @brief unit test for cron functions.
22 *
23 * @copyright Copyright © 2009 by Intra2net AG
ac1367c0
GE
24 *
25 */
26
9fe0853b
TJ
27#define BOOST_TEST_DYN_LINK
28#include <boost/test/unit_test.hpp>
ac1367c0
GE
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;
ac1367c0 38
9fe0853b
TJ
39class TestCronPointFuncFixture
40{
ac1367c0 41public:
9fe0853b 42 TestCronPointFuncFixture()
ac1367c0
GE
43 {
44 // our check-values are set for Germany
45 setenv("TZ",":Europe/Berlin",1);
46 }
9fe0853b 47};
ac1367c0 48
9fe0853b 49BOOST_FIXTURE_TEST_SUITE(TestCronPointFunc, TestCronPointFuncFixture)
ac1367c0 50
9fe0853b
TJ
51/////////////////////////////////////////////////////
52// Points in time
53/////////////////////////////////////////////////////
ac1367c0 54
9fe0853b
TJ
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}
ac1367c0 60
9fe0853b
TJ
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}
ac1367c0 66
9fe0853b
TJ
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}
ac1367c0 72
9fe0853b
TJ
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}
ac1367c0 78
9fe0853b
TJ
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}
ac1367c0 84
9fe0853b
TJ
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}
ac1367c0 90
9fe0853b
TJ
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}
ac1367c0 96
9fe0853b
TJ
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}
ac1367c0 102
9fe0853b
TJ
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}
300d1c09 108
9fe0853b
TJ
109BOOST_AUTO_TEST_CASE(HalfOpenInterval)
110{
111 WeekCron cron("2345",86400);
112 BOOST_REQUIRE_THROW(cron.get_next_run(1233097200),std::runtime_error);
113}
ac1367c0 114
9fe0853b
TJ
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}
ac1367c0 122
9fe0853b
TJ
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}
ac1367c0 130
9fe0853b
TJ
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}
ac1367c0 138
9fe0853b
TJ
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}
ac1367c0 146
9fe0853b
TJ
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}
ac1367c0 154
9fe0853b
TJ
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}
ac1367c0 162
9fe0853b
TJ
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}
ac1367c0 170
9fe0853b
TJ
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}
ac1367c0 178
9fe0853b
TJ
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}
ac1367c0 186
9fe0853b
TJ
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}
1e372638 194
9fe0853b
TJ
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}
ac1367c0 202
9fe0853b
TJ
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}
300d1c09 210
9fe0853b
TJ
211BOOST_AUTO_TEST_CASE(BeforeDSTForward1)
212{
9fe0853b
TJ
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));
0bd1e98c 217 BOOST_CHECK_EQUAL( static_cast<time_t>(1238288400), cron.get_next_run(1238288399));
9fe0853b 218}
ac1367c0 219
9fe0853b
TJ
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}
ac1367c0 227
9fe0853b
TJ
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}
1e372638 235
9fe0853b
TJ
236BOOST_AUTO_TEST_CASE(DuringDSTForward)
237{
9fe0853b
TJ
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));
0bd1e98c 242 BOOST_CHECK_EQUAL( static_cast<time_t>(1238290200), cron.get_next_run(1238288399));
9fe0853b 243}
ac1367c0 244
9fe0853b
TJ
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}
ac1367c0 252
9fe0853b
TJ
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}
ac1367c0 260
9fe0853b
TJ
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}
ac1367c0 268
9fe0853b
TJ
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}
ac1367c0 276
9fe0853b
TJ
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}
300d1c09 284
9fe0853b
TJ
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}
ac1367c0 292
9fe0853b
TJ
293BOOST_AUTO_TEST_CASE(StartHourStaysTheSameTill2038)
294{
295 int daysec = 79200;
ac1367c0 296
9fe0853b
TJ
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)
ac1367c0 300 {
9fe0853b 301 time_t result = cron.get_next_run(now);
ac1367c0 302
9fe0853b
TJ
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);
ac1367c0 307
9fe0853b 308 int remain=daysec;
64004424 309
9fe0853b
TJ
310 calc_daybegin.tm_hour=remain/3600;
311 remain-=calc_daybegin.tm_hour*3600;
64004424 312
9fe0853b
TJ
313 calc_daybegin.tm_min=remain/60;
314 remain-=calc_daybegin.tm_min*60;
64004424 315
9fe0853b 316 calc_daybegin.tm_sec=remain;
64004424 317
9fe0853b
TJ
318 // tm_isdst=-1 means to use the dst in use at the given time
319 calc_daybegin.tm_isdst=-1;
ac1367c0 320
9fe0853b 321 time_t daytime = mktime(&calc_daybegin);
ac1367c0 322
9fe0853b 323 BOOST_CHECK_EQUAL(daytime, result);
ac1367c0 324 }
9fe0853b 325}
ac1367c0 326
9fe0853b 327BOOST_AUTO_TEST_SUITE_END()