c973a4f7b8faab55e8384006f922db7cb08a14e3
[libi2ncommon] / test / test_timefunc.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 time related functions.
22  *
23  * @copyright Copyright © 2001-2008 by Intra2net AG
24  *
25  */
26
27 #define BOOST_TEST_DYN_LINK
28 #include <boost/test/unit_test.hpp>
29
30 #include <timefunc.hxx>
31 #include <filefunc.hxx>
32
33 #include <unistd.h>
34 #include <set>
35
36 using namespace std;
37 using namespace I2n;
38 using namespace I2n::Time;
39
40 class TestTimeFuncFixture
41 {
42 protected:
43    typedef std::list< std::string > StringList;
44    std::set<std::string>  used_check_files;
45
46    std::string get_check_file_path(std::string tag)
47    {
48       std::string result;
49       result= "__unittest__" + tag + ".dat";
50       used_check_files.insert(result);
51       return result;
52    } // eo get_check_file_path
53
54    void remove_check_files()
55    {
56       for (std::set<std::string>::iterator it= used_check_files.begin();
57             it != used_check_files.end();
58             ++it)
59       {
60          std::string filepath(*it);
61          if (path_exists(filepath))
62          {
63             unlink(filepath);
64          }
65          //TODO
66       }
67       used_check_files.clear();
68    } // eo remove_check_files
69
70 public:
71     TestTimeFuncFixture()
72     {
73     }
74
75     ~TestTimeFuncFixture()
76     {
77         remove_check_files();
78     }
79 };
80
81 BOOST_FIXTURE_TEST_SUITE(TestTimeFunc, TestTimeFuncFixture)
82
83 BOOST_AUTO_TEST_CASE(AddIntervalsDisjoint)
84 {
85     Intervals intervals;
86
87     intervals.add( Interval( 10, 100 ) );
88     intervals.add( Interval( 600, 620 ) );
89
90     BOOST_CHECK_EQUAL( false, intervals.empty() );
91     BOOST_CHECK_EQUAL( 2u, intervals.size() );
92
93     BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
94     BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
95
96     BOOST_CHECK_EQUAL( 600u, intervals.back().lower_bound() );
97     BOOST_CHECK_EQUAL( 620u, intervals.back().upper_bound() );
98 } // eo AddIntervalsDisjoint()
99
100
101
102 BOOST_AUTO_TEST_CASE(AddIntervalsInclude)
103 {
104     Intervals intervals;
105
106     intervals.add( Interval( 10, 100 ) );
107     intervals.add( Interval( 10, 80 ) );
108
109     BOOST_CHECK_EQUAL( false, intervals.empty() );
110     BOOST_CHECK_EQUAL( 1u, intervals.size() );
111
112     BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
113     BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
114     BOOST_CHECK_EQUAL( false, intervals.front().changed() );
115 } // eo AddIntervalsInclude()
116
117
118
119 BOOST_AUTO_TEST_CASE(AddIntervalsEmbrace)
120 {
121     Intervals intervals;
122
123     intervals.add( Interval( 10, 100 ) );
124     intervals.add( Interval( 5, 120 ) );
125
126     BOOST_CHECK_EQUAL( false, intervals.empty() );
127     BOOST_CHECK_EQUAL( 1u, intervals.size() );
128
129     BOOST_CHECK_EQUAL( 5u, intervals.front().lower_bound() );
130     BOOST_CHECK_EQUAL( 120u, intervals.front().upper_bound() );
131     BOOST_CHECK_EQUAL( true, intervals.front().changed() );
132 } // eo AddIntervalsEmbrace()
133
134
135
136 BOOST_AUTO_TEST_CASE(AddIntervalsJoin1)
137 {
138     Intervals intervals;
139
140     intervals.add( Interval( 10, 100 ) );
141     intervals.add( Interval( 60, 120 ) );
142
143     BOOST_CHECK_EQUAL( false, intervals.empty() );
144     BOOST_CHECK_EQUAL( 1u, intervals.size() );
145
146     BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
147     BOOST_CHECK_EQUAL( 120u, intervals.front().upper_bound() );
148     BOOST_CHECK_EQUAL( true, intervals.front().changed() );
149 } // eo AddIntervalsJoin1()
150
151
152
153 BOOST_AUTO_TEST_CASE(AddIntervalsJoin1b)
154 {
155     Intervals intervals;
156
157     intervals.add( Interval( 10, 100 ) );
158     intervals.add( Interval( 100, 120 ) );
159
160     BOOST_CHECK_EQUAL( false, intervals.empty() );
161     BOOST_CHECK_EQUAL( 1u, intervals.size() );
162
163     BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
164     BOOST_CHECK_EQUAL( 120u, intervals.front().upper_bound() );
165     BOOST_CHECK_EQUAL( true, intervals.front().changed() );
166 } // eo AddIntervalsJoin1b()
167
168
169
170 BOOST_AUTO_TEST_CASE(AddIntervalsJoin2)
171 {
172     Intervals intervals;
173
174     intervals.add( Interval( 10, 100 ) );
175     intervals.add( Interval( 200, 250 ) );
176
177     BOOST_CHECK_EQUAL( false, intervals.empty() );
178     BOOST_CHECK_EQUAL( 2u, intervals.size() );
179
180     BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
181     BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
182     BOOST_CHECK_EQUAL( 200u, intervals.back().lower_bound() );
183     BOOST_CHECK_EQUAL( 250u, intervals.back().upper_bound() );
184
185     // now add the gap; the intervals should collapse to one covering all:
186     intervals.add( Interval(100, 200) );
187
188     BOOST_CHECK_EQUAL( false, intervals.empty() );
189     BOOST_CHECK_EQUAL( 1u, intervals.size() );
190
191     BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
192     BOOST_CHECK_EQUAL( 250u, intervals.front().upper_bound() );
193     BOOST_CHECK_EQUAL( true, intervals.front().changed() );
194 } // eo AddIntervalsJoin2()
195
196
197
198 BOOST_AUTO_TEST_CASE(SubIntervalsDisjoint)
199 {
200     Intervals intervals;
201
202     intervals.add( Interval(10, 100) );
203     intervals.sub( Interval(0, 10) );
204
205     BOOST_CHECK_EQUAL( false, intervals.empty() );
206     BOOST_CHECK_EQUAL( 1u, intervals.size() );
207
208     BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
209     BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
210     BOOST_CHECK_EQUAL( false, intervals.front().changed() );
211 } // eo SubIntervalsDisjoint()
212
213
214
215 BOOST_AUTO_TEST_CASE(SubIntervalsExact)
216 {
217     Intervals intervals;
218
219     intervals.add( Interval(10, 100) );
220     intervals.sub( Interval(10, 100) );
221
222     BOOST_CHECK_EQUAL( true, intervals.empty() );
223     BOOST_CHECK_EQUAL( 0u, intervals.size() );
224 } // eo SubIntervalsExact()
225
226
227
228 BOOST_AUTO_TEST_CASE(SubIntervalsSplit1)
229 {
230     Intervals intervals;
231
232     intervals.add( Interval(10, 100) );
233     intervals.sub( Interval(20, 40) );
234
235     BOOST_CHECK_EQUAL( false, intervals.empty() );
236     BOOST_CHECK_EQUAL( 2u, intervals.size() );
237
238     BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
239     BOOST_CHECK_EQUAL( 20u, intervals.front().upper_bound() );
240
241     BOOST_CHECK_EQUAL( 40u, intervals.back().lower_bound() );
242     BOOST_CHECK_EQUAL( 100u, intervals.back().upper_bound() );
243     BOOST_CHECK_EQUAL( false, intervals.front().changed() );
244     BOOST_CHECK_EQUAL( true, intervals.back().changed() );
245 } // eo SubIntervalsSplit1()
246
247
248 BOOST_AUTO_TEST_CASE(SubIntervalsCutFront)
249 {
250     Intervals intervals;
251
252     intervals.add( Interval(10, 100) );
253     intervals.sub( Interval(10, 20) );
254
255     BOOST_CHECK_EQUAL( false, intervals.empty() );
256     BOOST_CHECK_EQUAL( 1u, intervals.size() );
257
258     BOOST_CHECK_EQUAL( 20u, intervals.front().lower_bound() );
259     BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
260     BOOST_CHECK_EQUAL( true, intervals.front().changed() );
261 } // eo SubIntervalsCutFront()
262
263
264 BOOST_AUTO_TEST_CASE(SubIntervalsCutBack)
265 {
266     Intervals intervals;
267
268     intervals.add( Interval(10, 100) );
269     intervals.sub( Interval(87, 100) );
270
271     BOOST_CHECK_EQUAL( false, intervals.empty() );
272     BOOST_CHECK_EQUAL( 1u, intervals.size() );
273
274     BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
275     BOOST_CHECK_EQUAL( 87u, intervals.front().upper_bound() );
276     BOOST_CHECK_EQUAL( true, intervals.front().changed() );
277 } // eo SubIntervalsCutBack()
278
279
280
281 BOOST_AUTO_TEST_CASE(SubIntervalsCutMore)
282 {
283     Intervals intervals;
284
285     intervals.add( Interval( 10, 100) );
286     intervals.add( Interval(110, 200) );
287     intervals.add( Interval(210, 300) );
288
289     // this should remove the first 2 intervals and cut the third:
290     intervals.sub( Interval(8, 220) );
291
292     BOOST_CHECK_EQUAL( false, intervals.empty() );
293     BOOST_CHECK_EQUAL( 1u, intervals.size() );
294
295     BOOST_CHECK_EQUAL( 220u, intervals.front().lower_bound() );
296     BOOST_CHECK_EQUAL( 300u, intervals.front().upper_bound() );
297     BOOST_CHECK_EQUAL( true, intervals.front().changed() );
298 } // eo SubIntervalsCutMore()
299
300
301 BOOST_AUTO_TEST_CASE(IntervalComparisons)
302 {
303     Intervals intervals1;
304     Intervals intervals2;
305
306     intervals1.add( Interval( 10, 120) );
307
308     intervals2.add( Interval( 10, 110 ) );
309     intervals2.add( Interval( 100, 120 ) );
310
311     BOOST_CHECK_EQUAL( 1u, intervals2.size() );
312
313     BOOST_CHECK( intervals1 == intervals2 );
314     BOOST_CHECK_EQUAL( true, intervals1.contains( intervals2 ));
315     BOOST_CHECK_EQUAL( true, intervals2.contains( intervals1 ));
316
317     intervals2.sub( Interval( 40, 50) );
318
319     BOOST_CHECK( intervals1 != intervals2 );
320     BOOST_CHECK_EQUAL( true, intervals1.contains( intervals2 ));
321     BOOST_CHECK_EQUAL( false, intervals2.contains( intervals1 ));
322 } // eo IntervalComparisons()
323
324
325
326 BOOST_AUTO_TEST_CASE(MonotonicClock)
327 {
328     long sec0, nsec0;
329     long sec1, nsec1;
330
331     bool res = monotonic_clock_gettime(sec0,nsec0);
332     BOOST_CHECK_EQUAL( true, res );
333
334     usleep(250000);
335     res= monotonic_clock_gettime(sec1,nsec1);
336     BOOST_CHECK_EQUAL( true, res);
337
338     long delta_sec = sec1 - sec0;
339     long delta_nsec= nsec1 - nsec0;
340
341     long delta_millisec= ( delta_nsec / 1000000L) + delta_sec * 1000L;
342
343     BOOST_CHECK( delta_millisec >= 250 - /*fuzz*/ 1);
344     BOOST_CHECK( delta_millisec < 300 );
345 } // eo MonotonicClock()
346
347 BOOST_AUTO_TEST_CASE(WeekInvalid)
348 {
349     Week week("99999999");
350     BOOST_CHECK_EQUAL(false, week.is_valid());
351     BOOST_CHECK_EQUAL(string(""), week.get_displaystring());
352 }
353
354 BOOST_AUTO_TEST_CASE(WeekDisplayString1)
355 {
356     Week week("");
357     BOOST_CHECK_EQUAL(true, week.is_valid());
358     BOOST_CHECK_EQUAL(string(""), week.get_displaystring());
359 }
360
361 BOOST_AUTO_TEST_CASE(WeekDisplayString2)
362 {
363     Week week("0123456");
364     BOOST_CHECK_EQUAL(true, week.is_valid());
365     BOOST_CHECK_EQUAL(string("Mon-Sun"), week.get_displaystring());
366 }
367
368 BOOST_AUTO_TEST_CASE(WeekDisplayString3)
369 {
370     Week week("123456");
371     BOOST_CHECK_EQUAL(true, week.is_valid());
372     BOOST_CHECK_EQUAL(string("Mon-Sat"), week.get_displaystring());
373 }
374
375 BOOST_AUTO_TEST_CASE(WeekDisplayString4)
376 {
377     Week week("012345");
378     BOOST_CHECK_EQUAL(true, week.is_valid());
379     BOOST_CHECK_EQUAL(string("Mon-Fri, Sun"), week.get_displaystring());
380 }
381
382 BOOST_AUTO_TEST_CASE(WeekDisplayString5)
383 {
384     Week week("1256");
385     BOOST_CHECK_EQUAL(true, week.is_valid());
386     BOOST_CHECK_EQUAL(string("Mon, Tue, Fri, Sat"), week.get_displaystring());
387 }
388
389 BOOST_AUTO_TEST_CASE(WeekDisplayString6)
390 {
391     Week week("0246");
392     BOOST_CHECK_EQUAL(true, week.is_valid());
393     BOOST_CHECK_EQUAL(string("Tue, Thu, Sat, Sun"), week.get_displaystring());
394 }
395
396 BOOST_AUTO_TEST_CASE(WeekDisplayString7)
397 {
398     Week week("135");
399     BOOST_CHECK_EQUAL(true, week.is_valid());
400     BOOST_CHECK_EQUAL(string("Mon, Wed, Fri"), week.get_displaystring());
401 }
402
403 BOOST_AUTO_TEST_CASE(WeekDisplayString8)
404 {
405     Week week("15");
406     BOOST_CHECK_EQUAL(true, week.is_valid());
407     BOOST_CHECK_EQUAL(string("Mon, Fri"), week.get_displaystring());
408 }
409
410 BOOST_AUTO_TEST_CASE(WeekDisplayString9)
411 {
412     Week week("06");
413     BOOST_CHECK_EQUAL(true, week.is_valid());
414     BOOST_CHECK_EQUAL(string("Sat, Sun"), week.get_displaystring());
415 }
416
417 BOOST_AUTO_TEST_CASE(WeekDisplayString10)
418 {
419     Week week("056");
420     BOOST_CHECK_EQUAL(true, week.is_valid());
421     BOOST_CHECK_EQUAL(string("Fri-Sun"), week.get_displaystring());
422 }
423
424 BOOST_AUTO_TEST_CASE(WeekDisplayString11)
425 {
426     Week week("0");
427     BOOST_CHECK_EQUAL(true, week.is_valid());
428     BOOST_CHECK_EQUAL(string("Sun"), week.get_displaystring());
429 }
430
431 BOOST_AUTO_TEST_CASE(WeekDisplayString12)
432 {
433     Week week("6");
434     BOOST_CHECK_EQUAL(true, week.is_valid());
435     BOOST_CHECK_EQUAL(string("Sat"), week.get_displaystring());
436 }
437
438 BOOST_AUTO_TEST_CASE(WeekDisplayString13)
439 {
440     Week week("123");
441     BOOST_CHECK_EQUAL(true, week.is_valid());
442     BOOST_CHECK_EQUAL(string("Mon-Wed"), week.get_displaystring());
443 }
444
445 BOOST_AUTO_TEST_CASE(FormatFullTime)
446 {
447     time_t seconds = 1318844005;
448
449     BOOST_CHECK_EQUAL("17.10.2011 11:33", format_full_time(seconds));
450 }
451
452 BOOST_AUTO_TEST_CASE(DateToSeconds1)
453 {
454     // no DST
455     BOOST_CHECK_EQUAL(1325372400, date_to_seconds("2012-01-01"));
456 }
457
458 BOOST_AUTO_TEST_CASE(DateToSeconds2)
459 {
460     // DST
461     BOOST_CHECK_EQUAL(1341093600, date_to_seconds("2012-07-01"));
462 }
463
464 BOOST_AUTO_TEST_SUITE(Clock)
465
466     BOOST_AUTO_TEST_CASE(ctor_simple)
467     {
468         I2n::clock::Time t;
469
470         BOOST_CHECK_EQUAL(t.get_sec  (), 0);
471         BOOST_CHECK_EQUAL(t.get_nsec (), 0);
472     }
473
474     BOOST_AUTO_TEST_CASE(ctor_type)
475     {
476         I2n::clock::Time t (I2n::clock::type::real);
477
478         BOOST_CHECK_EQUAL(t.get_sec  (), 0);
479         BOOST_CHECK_EQUAL(t.get_nsec (), 0);
480     }
481
482     BOOST_AUTO_TEST_CASE(ctor_variant)
483     {
484         I2n::clock::Time t (I2n::clock::type::cpu,
485                             I2n::clock::type::thread);
486
487         BOOST_CHECK_EQUAL(t.get_sec  (), 0);
488         BOOST_CHECK_EQUAL(t.get_nsec (), 0);
489     }
490
491     BOOST_AUTO_TEST_CASE(initializer_now)
492     {
493         boost::optional<I2n::clock::Time> t = I2n::clock::now ();
494
495         BOOST_CHECK(t);
496         BOOST_CHECK_GT(t->get_sec (), 0);
497         BOOST_CHECK_EQUAL(t->err, 0);
498     }
499
500 BOOST_AUTO_TEST_SUITE_END()
501
502 BOOST_AUTO_TEST_SUITE_END()