2 The software in this package is distributed under the GNU General
3 Public License version 2 (with a special exception described below).
5 A copy of GNU General Public License (GPL) is included in this distribution,
6 in the file COPYING.GPL.
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.
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.
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.
21 * @brief unit test for cron functions.
23 * @copyright Copyright © 2009 by Intra2net AG
27 #define BOOST_TEST_DYN_LINK
28 #include <boost/test/unit_test.hpp>
37 using namespace I2n::Time;
39 class TestCronPointFuncFixture
42 TestCronPointFuncFixture()
44 // our check-values are set for Germany
45 setenv("TZ",":Europe/Berlin",1);
49 BOOST_FIXTURE_TEST_SUITE(TestCronPointFunc, TestCronPointFuncFixture)
51 /////////////////////////////////////////////////////
53 /////////////////////////////////////////////////////
55 BOOST_AUTO_TEST_CASE(NotYetToday)
57 WeekCron cron("2345",3600);
58 BOOST_CHECK_EQUAL( static_cast<time_t>(1233100800), cron.get_next_run(1233099657));
61 BOOST_AUTO_TEST_CASE(Now)
63 WeekCron cron("2345",3600);
64 BOOST_CHECK_EQUAL( static_cast<time_t>(1233187200), cron.get_next_run(1233100800));
67 BOOST_AUTO_TEST_CASE(LaterToday)
69 WeekCron cron("2345",3600);
70 BOOST_CHECK_EQUAL( static_cast<time_t>(1233187200), cron.get_next_run(1233100801));
73 BOOST_AUTO_TEST_CASE(Tomorrow)
75 WeekCron cron("45",3600);
76 BOOST_CHECK_EQUAL( static_cast<time_t>(1233187200), cron.get_next_run(1233099657));
79 BOOST_AUTO_TEST_CASE(NextWeek)
81 WeekCron cron("1",3600);
82 BOOST_CHECK_EQUAL( static_cast<time_t>(1233532800), cron.get_next_run(1233099657));
85 BOOST_AUTO_TEST_CASE(NextWeekFromToday)
87 WeekCron cron("13",3600);
88 BOOST_CHECK_EQUAL( static_cast<time_t>(1233532800), cron.get_next_run(1233100801));
91 BOOST_AUTO_TEST_CASE(StartMidnight)
93 WeekCron cron("2345",0);
94 BOOST_CHECK_EQUAL( static_cast<time_t>(1233097200), cron.get_next_run(1233097199));
97 BOOST_AUTO_TEST_CASE(StartMidnightTomorrow)
99 WeekCron cron("2345",0);
100 BOOST_CHECK_EQUAL( static_cast<time_t>(1233183600), cron.get_next_run(1233097200));
103 BOOST_AUTO_TEST_CASE(StartLastDaysec)
105 WeekCron cron("2345",86399);
106 BOOST_CHECK_EQUAL( static_cast<time_t>(1233183599), cron.get_next_run(1233097200));
109 BOOST_AUTO_TEST_CASE(HalfOpenInterval)
111 WeekCron cron("2345",86400);
112 BOOST_REQUIRE_THROW(cron.get_next_run(1233097200),std::runtime_error);
115 BOOST_AUTO_TEST_CASE(LongBeforeDSTBackwards)
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));
123 BOOST_AUTO_TEST_CASE(BeforeDSTBackwards1)
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));
131 BOOST_AUTO_TEST_CASE(BeforeDSTBackwards2)
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));
139 BOOST_AUTO_TEST_CASE(AtDSTBackwards)
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));
147 BOOST_AUTO_TEST_CASE(DuringDSTBackwards)
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));
155 BOOST_AUTO_TEST_CASE(EndDSTBackwards1)
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));
163 BOOST_AUTO_TEST_CASE(EndDSTBackwards2)
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));
171 BOOST_AUTO_TEST_CASE(EndDSTBackwards3)
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));
179 BOOST_AUTO_TEST_CASE(EndDSTBackwards4)
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));
187 BOOST_AUTO_TEST_CASE(OverDSTBackwards)
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));
195 BOOST_AUTO_TEST_CASE(OverDSTBackwardsDaychange)
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));
203 BOOST_AUTO_TEST_CASE(LongBeforeDSTForward)
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));
211 BOOST_AUTO_TEST_CASE(BeforeDSTForward1)
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));
220 BOOST_AUTO_TEST_CASE(BeforeDSTForward2)
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));
228 BOOST_AUTO_TEST_CASE(AtDSTForward)
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));
236 BOOST_AUTO_TEST_CASE(DuringDSTForward)
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));
245 BOOST_AUTO_TEST_CASE(EndDSTForward1)
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));
253 BOOST_AUTO_TEST_CASE(EndDSTForward2)
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));
261 BOOST_AUTO_TEST_CASE(EndDSTForward3)
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));
269 BOOST_AUTO_TEST_CASE(EndDSTForward4)
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));
277 BOOST_AUTO_TEST_CASE(OverDSTForward)
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));
285 BOOST_AUTO_TEST_CASE(OverDSTForwardDaychange)
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));
293 BOOST_AUTO_TEST_CASE(StartHourStaysTheSameTill2038)
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)
301 time_t result = cron.get_next_run(now);
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);
310 calc_daybegin.tm_hour=remain/3600;
311 remain-=calc_daybegin.tm_hour*3600;
313 calc_daybegin.tm_min=remain/60;
314 remain-=calc_daybegin.tm_min*60;
316 calc_daybegin.tm_sec=remain;
318 // tm_isdst=-1 means to use the dst in use at the given time
319 calc_daybegin.tm_isdst=-1;
321 time_t daytime = mktime(&calc_daybegin);
323 BOOST_CHECK_EQUAL(daytime, result);
327 BOOST_AUTO_TEST_SUITE_END()