Commit | Line | Data |
---|---|---|
0e23f538 TJ |
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 | */ | |
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 | ||
36 | using namespace std; | |
37 | using namespace I2n::Time; | |
ac1367c0 | 38 | |
9fe0853b TJ |
39 | class TestCronPointFuncFixture |
40 | { | |
ac1367c0 | 41 | public: |
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 | 49 | BOOST_FIXTURE_TEST_SUITE(TestCronPointFunc, TestCronPointFuncFixture) |
ac1367c0 | 50 | |
9fe0853b TJ |
51 | ///////////////////////////////////////////////////// |
52 | // Points in time | |
53 | ///////////////////////////////////////////////////// | |
ac1367c0 | 54 | |
9fe0853b TJ |
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 | } | |
ac1367c0 | 60 | |
9fe0853b TJ |
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 | } | |
ac1367c0 | 66 | |
9fe0853b TJ |
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 | } | |
ac1367c0 | 72 | |
9fe0853b TJ |
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 | } | |
ac1367c0 | 78 | |
9fe0853b TJ |
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 | } | |
ac1367c0 | 84 | |
9fe0853b TJ |
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 | } | |
ac1367c0 | 90 | |
9fe0853b TJ |
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 | } | |
ac1367c0 | 96 | |
9fe0853b TJ |
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 | } | |
ac1367c0 | 102 | |
9fe0853b TJ |
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 | } | |
300d1c09 | 108 | |
9fe0853b TJ |
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 | } | |
ac1367c0 | 114 | |
9fe0853b TJ |
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 | } | |
ac1367c0 | 122 | |
9fe0853b TJ |
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 | } | |
ac1367c0 | 130 | |
9fe0853b TJ |
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 | } | |
ac1367c0 | 138 | |
9fe0853b TJ |
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 | } | |
ac1367c0 | 146 | |
9fe0853b TJ |
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 | } | |
ac1367c0 | 154 | |
9fe0853b TJ |
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 | } | |
ac1367c0 | 162 | |
9fe0853b TJ |
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 | } | |
ac1367c0 | 170 | |
9fe0853b TJ |
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 | } | |
ac1367c0 | 178 | |
9fe0853b TJ |
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 | } | |
ac1367c0 | 186 | |
9fe0853b TJ |
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 | } | |
1e372638 | 194 | |
9fe0853b TJ |
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 | } | |
ac1367c0 | 202 | |
9fe0853b TJ |
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 | } | |
300d1c09 | 210 | |
9fe0853b TJ |
211 | BOOST_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 |
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 | } | |
ac1367c0 | 227 | |
9fe0853b TJ |
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 | } | |
1e372638 | 235 | |
9fe0853b TJ |
236 | BOOST_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 |
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 | } | |
ac1367c0 | 252 | |
9fe0853b TJ |
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 | } | |
ac1367c0 | 260 | |
9fe0853b TJ |
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 | } | |
ac1367c0 | 268 | |
9fe0853b TJ |
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 | } | |
ac1367c0 | 276 | |
9fe0853b TJ |
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 | } | |
300d1c09 | 284 | |
9fe0853b TJ |
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 | } | |
ac1367c0 | 292 | |
9fe0853b TJ |
293 | BOOST_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 | 327 | BOOST_AUTO_TEST_SUITE_END() |