Fix some signed/unsigned issues in Week
[libi2ncommon] / test / test_timefunc.cpp
CommitLineData
8d2b7645
TJ
1/** @file
2 * @brief unit test for time related functions.
3 *
4 * @copyright Copyright © 2001-2008 by Intra2net AG
5 * @license commercial
6 * @contact info@intra2net.com
7 *
8 */
9
10#include <cppunit/extensions/TestFactoryRegistry.h>
11#include <cppunit/ui/text/TestRunner.h>
12#include <cppunit/extensions/HelperMacros.h>
13
14#include <timefunc.hxx>
15#include <filefunc.hxx>
16
96d0be2e
TJ
17#include <unistd.h>
18
19
8d2b7645
TJ
20using namespace std;
21using namespace I2n;
22using namespace CppUnit;
23
24namespace
25{
26
27
28} // eo namespace <anonymous>
29
30
31class TestTimeFunc : public TestFixture
32{
33 CPPUNIT_TEST_SUITE(TestTimeFunc);
34
35 CPPUNIT_TEST(AddIntervalsDisjoint);
36 CPPUNIT_TEST(AddIntervalsInclude);
37 CPPUNIT_TEST(AddIntervalsEmbrace);
38 CPPUNIT_TEST(AddIntervalsJoin1);
39 CPPUNIT_TEST(AddIntervalsJoin1b);
40 CPPUNIT_TEST(AddIntervalsJoin2);
41
42 CPPUNIT_TEST(SubIntervalsDisjoint);
43 CPPUNIT_TEST(SubIntervalsExact);
44 CPPUNIT_TEST(SubIntervalsSplit1);
45 CPPUNIT_TEST(SubIntervalsCutFront);
46 CPPUNIT_TEST(SubIntervalsCutBack);
47 CPPUNIT_TEST(SubIntervalsCutMore);
48
49 CPPUNIT_TEST(IntervalComparisons);
50
96d0be2e
TJ
51 CPPUNIT_TEST(MonotonicClock);
52
8d2b7645
TJ
53 CPPUNIT_TEST_SUITE_END();
54
55protected:
56
57 typedef std::list< std::string > StringList;
58
59 std::set<std::string> used_check_files;
60
61 std::string get_check_file_path(std::string tag)
62 {
63 std::string result;
64 result= "__unittest__" + tag + ".dat";
65 used_check_files.insert(result);
66 return result;
67 } // eo get_check_file_path
68
69
70 void remove_check_files()
71 {
72 for (std::set<std::string>::iterator it= used_check_files.begin();
73 it != used_check_files.end();
74 ++it)
75 {
76 std::string filepath(*it);
77 if (path_exists(filepath))
78 {
79 unlink(filepath);
80 }
81 //TODO
82 }
83 used_check_files.clear();
84 } // eo remove_check_files
85
86
87
88public:
89
90 void setUp()
91 {
92 } // eo setUp
93
94
95 void tearDown()
96 {
97 remove_check_files();
98 } // eo tearDown
99
100
101 /*
102 * the tests:
103 */
104
105
106 void AddIntervalsDisjoint()
107 {
108 Intervals intervals;
109
110 intervals.add( Interval( 10, 100 ) );
111 intervals.add( Interval( 600, 620 ) );
112
113 CPPUNIT_ASSERT_EQUAL( false, intervals.empty() );
114 CPPUNIT_ASSERT_EQUAL( 2u, intervals.size() );
115
116 CPPUNIT_ASSERT_EQUAL( 10u, intervals.front().lower_bound() );
117 CPPUNIT_ASSERT_EQUAL( 100u, intervals.front().upper_bound() );
118
119 CPPUNIT_ASSERT_EQUAL( 600u, intervals.back().lower_bound() );
120 CPPUNIT_ASSERT_EQUAL( 620u, intervals.back().upper_bound() );
121 } // eo AddIntervalsDisjoint()
122
123
124
125 void AddIntervalsInclude()
126 {
127 Intervals intervals;
128
129 intervals.add( Interval( 10, 100 ) );
130 intervals.add( Interval( 10, 80 ) );
131
132 CPPUNIT_ASSERT_EQUAL( false, intervals.empty() );
133 CPPUNIT_ASSERT_EQUAL( 1u, intervals.size() );
134
135 CPPUNIT_ASSERT_EQUAL( 10u, intervals.front().lower_bound() );
136 CPPUNIT_ASSERT_EQUAL( 100u, intervals.front().upper_bound() );
80f30818 137 CPPUNIT_ASSERT_EQUAL( false, intervals.front().changed() );
8d2b7645
TJ
138 } // eo AddIntervalsInclude()
139
140
141
142 void AddIntervalsEmbrace()
143 {
144 Intervals intervals;
145
146 intervals.add( Interval( 10, 100 ) );
147 intervals.add( Interval( 5, 120 ) );
148
149 CPPUNIT_ASSERT_EQUAL( false, intervals.empty() );
150 CPPUNIT_ASSERT_EQUAL( 1u, intervals.size() );
151
152 CPPUNIT_ASSERT_EQUAL( 5u, intervals.front().lower_bound() );
153 CPPUNIT_ASSERT_EQUAL( 120u, intervals.front().upper_bound() );
80f30818 154 CPPUNIT_ASSERT_EQUAL( true, intervals.front().changed() );
8d2b7645
TJ
155 } // eo AddIntervalsEmbrace()
156
157
158
159 void AddIntervalsJoin1()
160 {
161 Intervals intervals;
162
163 intervals.add( Interval( 10, 100 ) );
164 intervals.add( Interval( 60, 120 ) );
165
166 CPPUNIT_ASSERT_EQUAL( false, intervals.empty() );
167 CPPUNIT_ASSERT_EQUAL( 1u, intervals.size() );
168
169 CPPUNIT_ASSERT_EQUAL( 10u, intervals.front().lower_bound() );
170 CPPUNIT_ASSERT_EQUAL( 120u, intervals.front().upper_bound() );
80f30818 171 CPPUNIT_ASSERT_EQUAL( true, intervals.front().changed() );
8d2b7645
TJ
172 } // eo AddIntervalsJoin1()
173
174
175
176 void AddIntervalsJoin1b()
177 {
178 Intervals intervals;
179
180 intervals.add( Interval( 10, 100 ) );
181 intervals.add( Interval( 100, 120 ) );
182
183 CPPUNIT_ASSERT_EQUAL( false, intervals.empty() );
184 CPPUNIT_ASSERT_EQUAL( 1u, intervals.size() );
185
186 CPPUNIT_ASSERT_EQUAL( 10u, intervals.front().lower_bound() );
187 CPPUNIT_ASSERT_EQUAL( 120u, intervals.front().upper_bound() );
80f30818 188 CPPUNIT_ASSERT_EQUAL( true, intervals.front().changed() );
8d2b7645
TJ
189 } // eo AddIntervalsJoin1b()
190
191
192
193 void AddIntervalsJoin2()
194 {
195 Intervals intervals;
196
197 intervals.add( Interval( 10, 100 ) );
198 intervals.add( Interval( 200, 250 ) );
199
200 CPPUNIT_ASSERT_EQUAL( false, intervals.empty() );
201 CPPUNIT_ASSERT_EQUAL( 2u, intervals.size() );
202
203 CPPUNIT_ASSERT_EQUAL( 10u, intervals.front().lower_bound() );
204 CPPUNIT_ASSERT_EQUAL( 100u, intervals.front().upper_bound() );
205 CPPUNIT_ASSERT_EQUAL( 200u, intervals.back().lower_bound() );
206 CPPUNIT_ASSERT_EQUAL( 250u, intervals.back().upper_bound() );
207
208 // now add the gap; the intervals should collapse to one covering all:
209 intervals.add( Interval(100, 200) );
210
211 CPPUNIT_ASSERT_EQUAL( false, intervals.empty() );
212 CPPUNIT_ASSERT_EQUAL( 1u, intervals.size() );
213
214 CPPUNIT_ASSERT_EQUAL( 10u, intervals.front().lower_bound() );
215 CPPUNIT_ASSERT_EQUAL( 250u, intervals.front().upper_bound() );
80f30818 216 CPPUNIT_ASSERT_EQUAL( true, intervals.front().changed() );
8d2b7645
TJ
217 } // eo AddIntervalsJoin2()
218
219
220
221 void SubIntervalsDisjoint()
222 {
223 Intervals intervals;
224
225 intervals.add( Interval(10, 100) );
226 intervals.sub( Interval(0, 10) );
227
228 CPPUNIT_ASSERT_EQUAL( false, intervals.empty() );
229 CPPUNIT_ASSERT_EQUAL( 1u, intervals.size() );
230
231 CPPUNIT_ASSERT_EQUAL( 10u, intervals.front().lower_bound() );
232 CPPUNIT_ASSERT_EQUAL( 100u, intervals.front().upper_bound() );
80f30818 233 CPPUNIT_ASSERT_EQUAL( false, intervals.front().changed() );
8d2b7645
TJ
234 } // eo SubIntervalsDisjoint()
235
236
237
238 void SubIntervalsExact()
239 {
240 Intervals intervals;
241
242 intervals.add( Interval(10, 100) );
243 intervals.sub( Interval(10, 100) );
244
245 CPPUNIT_ASSERT_EQUAL( true, intervals.empty() );
246 CPPUNIT_ASSERT_EQUAL( 0u, intervals.size() );
247 } // eo SubIntervalsExact()
248
249
250
251 void SubIntervalsSplit1()
252 {
253 Intervals intervals;
254
255 intervals.add( Interval(10, 100) );
256 intervals.sub( Interval(20, 40) );
257
258 CPPUNIT_ASSERT_EQUAL( false, intervals.empty() );
259 CPPUNIT_ASSERT_EQUAL( 2u, intervals.size() );
260
261 CPPUNIT_ASSERT_EQUAL( 10u, intervals.front().lower_bound() );
262 CPPUNIT_ASSERT_EQUAL( 20u, intervals.front().upper_bound() );
263
264 CPPUNIT_ASSERT_EQUAL( 40u, intervals.back().lower_bound() );
265 CPPUNIT_ASSERT_EQUAL( 100u, intervals.back().upper_bound() );
80f30818
TJ
266 CPPUNIT_ASSERT_EQUAL( false, intervals.front().changed() );
267 CPPUNIT_ASSERT_EQUAL( true, intervals.back().changed() );
8d2b7645
TJ
268 } // eo SubIntervalsSplit1()
269
270
271 void SubIntervalsCutFront()
272 {
273 Intervals intervals;
274
275 intervals.add( Interval(10, 100) );
276 intervals.sub( Interval(10, 20) );
277
278 CPPUNIT_ASSERT_EQUAL( false, intervals.empty() );
279 CPPUNIT_ASSERT_EQUAL( 1u, intervals.size() );
280
281 CPPUNIT_ASSERT_EQUAL( 20u, intervals.front().lower_bound() );
282 CPPUNIT_ASSERT_EQUAL( 100u, intervals.front().upper_bound() );
80f30818 283 CPPUNIT_ASSERT_EQUAL( true, intervals.front().changed() );
8d2b7645
TJ
284 } // eo SubIntervalsCutFront()
285
286
287 void SubIntervalsCutBack()
288 {
289 Intervals intervals;
290
291 intervals.add( Interval(10, 100) );
292 intervals.sub( Interval(87, 100) );
293
294 CPPUNIT_ASSERT_EQUAL( false, intervals.empty() );
295 CPPUNIT_ASSERT_EQUAL( 1u, intervals.size() );
296
297 CPPUNIT_ASSERT_EQUAL( 10u, intervals.front().lower_bound() );
298 CPPUNIT_ASSERT_EQUAL( 87u, intervals.front().upper_bound() );
80f30818 299 CPPUNIT_ASSERT_EQUAL( true, intervals.front().changed() );
8d2b7645
TJ
300 } // eo SubIntervalsCutBack()
301
302
303
304 void SubIntervalsCutMore()
305 {
306 Intervals intervals;
307
308 intervals.add( Interval( 10, 100) );
309 intervals.add( Interval(110, 200) );
310 intervals.add( Interval(210, 300) );
311
312 // this should remove the first 2 intervals and cut the third:
313 intervals.sub( Interval(8, 220) );
314
315 CPPUNIT_ASSERT_EQUAL( false, intervals.empty() );
316 CPPUNIT_ASSERT_EQUAL( 1u, intervals.size() );
317
318 CPPUNIT_ASSERT_EQUAL( 220u, intervals.front().lower_bound() );
319 CPPUNIT_ASSERT_EQUAL( 300u, intervals.front().upper_bound() );
80f30818 320 CPPUNIT_ASSERT_EQUAL( true, intervals.front().changed() );
8d2b7645
TJ
321 } // eo SubIntervalsCutMore()
322
323
324 void IntervalComparisons()
325 {
326 Intervals intervals1;
327 Intervals intervals2;
328
329 intervals1.add( Interval( 10, 120) );
330
331 intervals2.add( Interval( 10, 110 ) );
332 intervals2.add( Interval( 100, 120 ) );
333
334 CPPUNIT_ASSERT_EQUAL( 1u, intervals2.size() );
335
336 CPPUNIT_ASSERT( intervals1 == intervals2 );
337 CPPUNIT_ASSERT_EQUAL( true, intervals1.contains( intervals2 ));
338 CPPUNIT_ASSERT_EQUAL( true, intervals2.contains( intervals1 ));
339
340 intervals2.sub( Interval( 40, 50) );
341
342 CPPUNIT_ASSERT( intervals1 != intervals2 );
343 CPPUNIT_ASSERT_EQUAL( true, intervals1.contains( intervals2 ));
344 CPPUNIT_ASSERT_EQUAL( false, intervals2.contains( intervals1 ));
345 } // eo IntervalComparisons()
346
96d0be2e
TJ
347
348
349 void MonotonicClock()
350 {
351 long sec0, nsec0;
352 long sec1, nsec1;
353
354 bool res = monotonic_clock_gettime(sec0,nsec0);
355 CPPUNIT_ASSERT_EQUAL( true, res );
356
357 usleep(250000);
358 res= monotonic_clock_gettime(sec1,nsec1);
359 CPPUNIT_ASSERT_EQUAL( true, res);
360
361 long delta_sec = sec1 - sec0;
362 long delta_nsec= nsec1 - nsec0;
363
364 long delta_millisec= ( delta_nsec / 1000000L) + delta_sec * 1000L;
365
366 CPPUNIT_ASSERT( delta_millisec >= 250 - /*fuzz*/ 1);
367 CPPUNIT_ASSERT( delta_millisec < 300 );
368 } // eo MonotonicClock()
369
370
8d2b7645
TJ
371
372}; // eo class TestTimeFunc
373
374CPPUNIT_TEST_SUITE_REGISTRATION(TestTimeFunc);