1 1.2 christos /* $NetBSD: timevalops.c,v 1.4 2024/08/18 20:47:27 christos Exp $ */ 2 1.2 christos 3 1.1 christos #include "config.h" 4 1.1 christos 5 1.1 christos //some unused features are still in the wrapper, unconverted 6 1.1 christos 7 1.1 christos #include "ntp_types.h" 8 1.1 christos #include "ntp_fp.h" 9 1.1 christos 10 1.1 christos #include "timevalops.h" 11 1.1 christos 12 1.2 christos #include <math.h> 13 1.1 christos #include "unity.h" 14 1.1 christos 15 1.1 christos 16 1.2 christos #define TEST_ASSERT_EQUAL_timeval(a, b) { \ 17 1.2 christos TEST_ASSERT_EQUAL_MESSAGE(a.tv_sec, b.tv_sec, "Field tv_sec"); \ 18 1.1 christos TEST_ASSERT_EQUAL_MESSAGE(a.tv_usec, b.tv_usec, "Field tv_usec"); \ 19 1.1 christos } 20 1.1 christos 21 1.1 christos 22 1.1 christos static u_int32 my_tick_to_tsf(u_int32 ticks); 23 1.1 christos static u_int32 my_tsf_to_tick(u_int32 tsf); 24 1.1 christos 25 1.2 christos 26 1.1 christos // that's it... 27 1.1 christos typedef struct { 28 1.1 christos long usec; 29 1.1 christos u_int32 frac; 30 1.1 christos } lfpfracdata ; 31 1.1 christos 32 1.2 christos struct timeval timeval_init( time_t hi, long lo); 33 1.2 christos const bool timeval_isValid(struct timeval V); 34 1.2 christos l_fp l_fp_init(int32 i, u_int32 f); 35 1.2 christos bool AssertTimevalClose(const struct timeval m, const struct timeval n, const struct timeval limit); 36 1.2 christos bool AssertFpClose(const l_fp m, const l_fp n, const l_fp limit); 37 1.2 christos 38 1.2 christos void setUp(void); 39 1.2 christos void test_Helpers1(void); 40 1.2 christos void test_Normalise(void); 41 1.2 christos void test_SignNoFrac(void); 42 1.2 christos void test_SignWithFrac(void); 43 1.2 christos void test_CmpFracEQ(void); 44 1.2 christos void test_CmpFracGT(void); 45 1.2 christos void test_CmpFracLT(void); 46 1.2 christos void test_AddFullNorm(void); 47 1.2 christos void test_AddFullOflow1(void); 48 1.2 christos void test_AddUsecNorm(void); 49 1.2 christos void test_AddUsecOflow1(void); 50 1.2 christos void test_SubFullNorm(void); 51 1.2 christos void test_SubFullOflow(void); 52 1.2 christos void test_SubUsecNorm(void); 53 1.2 christos void test_SubUsecOflow(void); 54 1.2 christos void test_Neg(void); 55 1.2 christos void test_AbsNoFrac(void); 56 1.2 christos void test_AbsWithFrac(void); 57 1.2 christos void test_Helpers2(void); 58 1.2 christos void test_ToLFPbittest(void); 59 1.2 christos void test_ToLFPrelPos(void); 60 1.2 christos void test_ToLFPrelNeg(void); 61 1.2 christos void test_ToLFPabs(void); 62 1.2 christos void test_FromLFPbittest(void); 63 1.2 christos void test_FromLFPrelPos(void); 64 1.2 christos void test_FromLFPrelNeg(void); 65 1.2 christos void test_LFProundtrip(void); 66 1.2 christos void test_ToString(void); 67 1.2 christos 68 1.2 christos 69 1.2 christos //**********************************MY CUSTOM FUNCTIONS*********************** 70 1.2 christos 71 1.2 christos 72 1.2 christos void 73 1.2 christos setUp(void) 74 1.2 christos { 75 1.2 christos init_lib(); 76 1.1 christos 77 1.2 christos return; 78 1.2 christos } 79 1.1 christos 80 1.1 christos 81 1.2 christos struct timeval 82 1.2 christos timeval_init(time_t hi, long lo) 83 1.2 christos { 84 1.1 christos struct timeval V; 85 1.2 christos 86 1.1 christos V.tv_sec = hi; 87 1.1 christos V.tv_usec = lo; 88 1.2 christos 89 1.1 christos return V; 90 1.1 christos } 91 1.1 christos 92 1.1 christos 93 1.2 christos const bool 94 1.2 christos timeval_isValid(struct timeval V) 95 1.2 christos { 96 1.2 christos 97 1.2 christos return V.tv_usec >= 0 && V.tv_usec < 1000000; 98 1.2 christos } 99 1.2 christos 100 1.2 christos 101 1.2 christos l_fp 102 1.2 christos l_fp_init(int32 i, u_int32 f) 103 1.1 christos { 104 1.1 christos l_fp temp; 105 1.2 christos 106 1.1 christos temp.l_i = i; 107 1.1 christos temp.l_uf = f; 108 1.1 christos 109 1.1 christos return temp; 110 1.1 christos } 111 1.1 christos 112 1.2 christos 113 1.2 christos bool 114 1.2 christos AssertTimevalClose(const struct timeval m, const struct timeval n, const struct timeval limit) 115 1.1 christos { 116 1.1 christos struct timeval diff; 117 1.1 christos 118 1.1 christos diff = abs_tval(sub_tval(m, n)); 119 1.1 christos if (cmp_tval(limit, diff) >= 0) 120 1.1 christos return TRUE; 121 1.2 christos 122 1.2 christos printf("m_expr which is %lld.%06lu \nand\n" 123 1.2 christos "n_expr which is %lld.%06lu\nare not close; diff=%lld.%06luusec\n", 124 1.4 christos (long long)m.tv_sec, (u_long)m.tv_usec, 125 1.4 christos (long long)n.tv_sec, (u_long)n.tv_usec, 126 1.4 christos (long long)diff.tv_sec, (u_long)diff.tv_usec); 127 1.2 christos return FALSE; 128 1.1 christos } 129 1.1 christos 130 1.2 christos 131 1.2 christos bool 132 1.2 christos AssertFpClose(const l_fp m, const l_fp n, const l_fp limit) 133 1.1 christos { 134 1.1 christos l_fp diff; 135 1.1 christos 136 1.1 christos if (L_ISGEQ(&m, &n)) { 137 1.1 christos diff = m; 138 1.1 christos L_SUB(&diff, &n); 139 1.1 christos } else { 140 1.1 christos diff = n; 141 1.1 christos L_SUB(&diff, &m); 142 1.1 christos } 143 1.2 christos if (L_ISGEQ(&limit, &diff)) { 144 1.1 christos return TRUE; 145 1.1 christos } 146 1.1 christos else { 147 1.2 christos printf("m_expr which is %s \nand\nn_expr which is %s\nare not close; diff=%susec\n", 148 1.2 christos lfptoa(&m, 10), lfptoa(&n, 10), lfptoa(&diff, 10)); 149 1.1 christos return FALSE; 150 1.1 christos } 151 1.1 christos } 152 1.1 christos 153 1.1 christos 154 1.1 christos //--------------------------------------------------- 155 1.1 christos 156 1.1 christos static const lfpfracdata fdata[] = { 157 1.1 christos { 0, 0x00000000 }, { 7478, 0x01ea1405 }, 158 1.1 christos { 22077, 0x05a6d699 }, { 125000, 0x20000000 }, 159 1.1 christos { 180326, 0x2e29d841 }, { 207979, 0x353e1c9b }, 160 1.1 christos { 250000, 0x40000000 }, { 269509, 0x44fe8ab5 }, 161 1.1 christos { 330441, 0x5497c808 }, { 333038, 0x5541fa76 }, 162 1.1 christos { 375000, 0x60000000 }, { 394734, 0x650d4995 }, 163 1.1 christos { 446327, 0x72427c7c }, { 500000, 0x80000000 }, 164 1.1 christos { 517139, 0x846338b4 }, { 571953, 0x926b8306 }, 165 1.1 christos { 587353, 0x965cc426 }, { 625000, 0xa0000000 }, 166 1.1 christos { 692136, 0xb12fd32c }, { 750000, 0xc0000000 }, 167 1.1 christos { 834068, 0xd5857aff }, { 848454, 0xd9344806 }, 168 1.1 christos { 854222, 0xdaae4b02 }, { 861465, 0xdc88f862 }, 169 1.1 christos { 875000, 0xe0000000 }, { 910661, 0xe921144d }, 170 1.1 christos { 922162, 0xec12cf10 }, { 942190, 0xf1335d25 } 171 1.1 christos }; 172 1.1 christos 173 1.1 christos 174 1.2 christos u_int32 175 1.2 christos my_tick_to_tsf(u_int32 ticks) 176 1.1 christos { 177 1.1 christos // convert microseconds to l_fp fractional units, using double 178 1.1 christos // precision float calculations or, if available, 64bit integer 179 1.1 christos // arithmetic. This should give the precise fraction, rounded to 180 1.1 christos // the nearest representation. 181 1.2 christos 182 1.1 christos #ifdef HAVE_U_INT64 183 1.1 christos return (u_int32)((( ((u_int64)(ticks)) << 32) + 500000) / 1000000); //I put too much () when casting just to be safe 184 1.1 christos #else 185 1.1 christos return (u_int32)( ((double)(ticks)) * 4294.967296 + 0.5); 186 1.1 christos #endif 187 1.1 christos // And before you ask: if ticks >= 1000000, the result is 188 1.1 christos // truncated nonsense, so don't use it out-of-bounds. 189 1.1 christos } 190 1.1 christos 191 1.2 christos 192 1.2 christos u_int32 193 1.2 christos my_tsf_to_tick(u_int32 tsf) 194 1.1 christos { 195 1.1 christos // Inverse operation: converts fraction to microseconds. 196 1.1 christos #ifdef HAVE_U_INT64 197 1.1 christos return (u_int32)( ((u_int64)(tsf) * 1000000 + 0x80000000) >> 32); //CHECK ME!!! 198 1.1 christos #else 199 1.1 christos return (u_int32)(double(tsf) / 4294.967296 + 0.5); 200 1.1 christos #endif 201 1.1 christos // Beware: The result might be 10^6 due to rounding! 202 1.1 christos } 203 1.1 christos 204 1.1 christos 205 1.2 christos //*******************************END OF CUSTOM FUNCTIONS********************* 206 1.1 christos 207 1.1 christos 208 1.1 christos // --------------------------------------------------------------------- 209 1.1 christos // test support stuff - part1 210 1.1 christos // --------------------------------------------------------------------- 211 1.1 christos 212 1.2 christos void 213 1.2 christos test_Helpers1(void) 214 1.2 christos { 215 1.1 christos struct timeval x; 216 1.1 christos 217 1.1 christos for (x.tv_sec = -2; x.tv_sec < 3; x.tv_sec++) { 218 1.1 christos x.tv_usec = -1; 219 1.1 christos TEST_ASSERT_FALSE(timeval_isValid(x)); 220 1.1 christos x.tv_usec = 0; 221 1.1 christos TEST_ASSERT_TRUE(timeval_isValid(x)); 222 1.1 christos x.tv_usec = 999999; 223 1.1 christos TEST_ASSERT_TRUE(timeval_isValid(x)); 224 1.1 christos x.tv_usec = 1000000; 225 1.1 christos TEST_ASSERT_FALSE(timeval_isValid(x)); 226 1.1 christos } 227 1.2 christos 228 1.2 christos return; 229 1.1 christos } 230 1.1 christos 231 1.1 christos 232 1.1 christos //---------------------------------------------------------------------- 233 1.1 christos // test normalisation 234 1.1 christos //---------------------------------------------------------------------- 235 1.1 christos 236 1.2 christos void 237 1.2 christos test_Normalise(void) 238 1.2 christos { 239 1.1 christos long ns; 240 1.2 christos 241 1.1 christos for (ns = -2000000000; ns <= 2000000000; ns += 10000000) { 242 1.1 christos struct timeval x = timeval_init(0, ns); 243 1.2 christos 244 1.1 christos x = normalize_tval(x); 245 1.1 christos TEST_ASSERT_TRUE(timeval_isValid(x)); 246 1.1 christos } 247 1.2 christos 248 1.2 christos return; 249 1.1 christos } 250 1.1 christos 251 1.1 christos //---------------------------------------------------------------------- 252 1.1 christos // test classification 253 1.1 christos //---------------------------------------------------------------------- 254 1.1 christos 255 1.2 christos void 256 1.2 christos test_SignNoFrac(void) 257 1.2 christos { 258 1.1 christos int i; 259 1.2 christos 260 1.1 christos // sign test, no fraction 261 1.1 christos for (i = -4; i <= 4; ++i) { 262 1.1 christos struct timeval a = timeval_init(i, 0); 263 1.1 christos int E = (i > 0) - (i < 0); 264 1.1 christos int r = test_tval(a); 265 1.1 christos 266 1.1 christos TEST_ASSERT_EQUAL(E, r); 267 1.1 christos } 268 1.2 christos 269 1.2 christos return; 270 1.1 christos } 271 1.1 christos 272 1.2 christos 273 1.2 christos void 274 1.2 christos test_SignWithFrac(void) 275 1.2 christos { 276 1.1 christos // sign test, with fraction 277 1.1 christos int i; 278 1.2 christos 279 1.1 christos for (i = -4; i <= 4; ++i) { 280 1.1 christos struct timeval a = timeval_init(i, 10); 281 1.1 christos int E = (i >= 0) - (i < 0); 282 1.1 christos int r = test_tval(a); 283 1.1 christos 284 1.1 christos TEST_ASSERT_EQUAL(E, r); 285 1.1 christos } 286 1.2 christos 287 1.2 christos return; 288 1.1 christos } 289 1.1 christos 290 1.1 christos //---------------------------------------------------------------------- 291 1.1 christos // test compare 292 1.1 christos //---------------------------------------------------------------------- 293 1.2 christos void 294 1.2 christos test_CmpFracEQ(void) 295 1.2 christos { 296 1.2 christos int i, j; 297 1.2 christos 298 1.1 christos // fractions are equal 299 1.1 christos for (i = -4; i <= 4; ++i) 300 1.1 christos for (j = -4; j <= 4; ++j) { 301 1.1 christos struct timeval a = timeval_init(i, 200); 302 1.1 christos struct timeval b = timeval_init(j, 200); 303 1.1 christos int E = (i > j) - (i < j); 304 1.1 christos int r = cmp_tval_denorm(a, b); 305 1.1 christos 306 1.1 christos TEST_ASSERT_EQUAL(E, r); 307 1.1 christos } 308 1.2 christos 309 1.2 christos return; 310 1.1 christos } 311 1.1 christos 312 1.2 christos 313 1.2 christos void 314 1.2 christos test_CmpFracGT(void) 315 1.2 christos { 316 1.1 christos // fraction a bigger fraction b 317 1.2 christos int i, j; 318 1.2 christos 319 1.1 christos for (i = -4; i <= 4; ++i) 320 1.1 christos for (j = -4; j <= 4; ++j) { 321 1.1 christos struct timeval a = timeval_init( i , 999800); 322 1.1 christos struct timeval b = timeval_init( j , 200); 323 1.1 christos int E = (i >= j) - (i < j); 324 1.1 christos int r = cmp_tval_denorm(a, b); 325 1.1 christos 326 1.1 christos TEST_ASSERT_EQUAL(E, r); 327 1.1 christos } 328 1.2 christos 329 1.2 christos return; 330 1.1 christos } 331 1.1 christos 332 1.2 christos 333 1.2 christos void 334 1.2 christos test_CmpFracLT(void) 335 1.2 christos { 336 1.1 christos // fraction a less fraction b 337 1.2 christos int i, j; 338 1.2 christos 339 1.1 christos for (i = -4; i <= 4; ++i) 340 1.1 christos for (j = -4; j <= 4; ++j) { 341 1.1 christos struct timeval a = timeval_init(i, 200); 342 1.1 christos struct timeval b = timeval_init(j, 999800); 343 1.1 christos int E = (i > j) - (i <= j); 344 1.1 christos int r = cmp_tval_denorm(a, b); 345 1.1 christos 346 1.1 christos TEST_ASSERT_EQUAL(E, r); 347 1.1 christos } 348 1.2 christos 349 1.2 christos return; 350 1.1 christos } 351 1.1 christos 352 1.1 christos //---------------------------------------------------------------------- 353 1.1 christos // Test addition (sum) 354 1.1 christos //---------------------------------------------------------------------- 355 1.1 christos 356 1.2 christos void 357 1.2 christos test_AddFullNorm(void) 358 1.2 christos { 359 1.2 christos int i, j; 360 1.2 christos 361 1.1 christos for (i = -4; i <= 4; ++i) 362 1.1 christos for (j = -4; j <= 4; ++j) { 363 1.1 christos struct timeval a = timeval_init(i, 200); 364 1.1 christos struct timeval b = timeval_init(j, 400); 365 1.1 christos struct timeval E = timeval_init(i + j, 200 + 400); 366 1.1 christos struct timeval c; 367 1.1 christos 368 1.1 christos c = add_tval(a, b); 369 1.1 christos TEST_ASSERT_EQUAL_timeval(E, c); 370 1.1 christos } 371 1.2 christos 372 1.2 christos return; 373 1.1 christos } 374 1.1 christos 375 1.2 christos 376 1.2 christos void 377 1.2 christos test_AddFullOflow1(void) 378 1.2 christos { 379 1.2 christos int i, j; 380 1.2 christos 381 1.1 christos for (i = -4; i <= 4; ++i) 382 1.1 christos for (j = -4; j <= 4; ++j) { 383 1.1 christos struct timeval a = timeval_init(i, 200); 384 1.1 christos struct timeval b = timeval_init(j, 999900); 385 1.1 christos struct timeval E = timeval_init(i + j + 1, 100); 386 1.1 christos struct timeval c; 387 1.1 christos 388 1.1 christos c = add_tval(a, b); 389 1.1 christos TEST_ASSERT_EQUAL_timeval(E, c); 390 1.1 christos } 391 1.2 christos 392 1.2 christos return; 393 1.1 christos } 394 1.1 christos 395 1.2 christos 396 1.2 christos void 397 1.2 christos test_AddUsecNorm(void) 398 1.2 christos { 399 1.1 christos int i; 400 1.2 christos 401 1.1 christos for (i = -4; i <= 4; ++i) { 402 1.1 christos struct timeval a = timeval_init(i, 200); 403 1.1 christos struct timeval E = timeval_init(i, 600); 404 1.1 christos struct timeval c; 405 1.1 christos 406 1.1 christos c = add_tval_us(a, 600 - 200); 407 1.1 christos TEST_ASSERT_EQUAL_timeval(E, c); 408 1.1 christos } 409 1.2 christos 410 1.2 christos return; 411 1.1 christos } 412 1.1 christos 413 1.2 christos 414 1.2 christos void 415 1.2 christos test_AddUsecOflow1(void) 416 1.2 christos { 417 1.1 christos int i; 418 1.2 christos 419 1.1 christos for (i = -4; i <= 4; ++i) { 420 1.1 christos struct timeval a = timeval_init(i, 200); 421 1.1 christos struct timeval E = timeval_init(i + 1, 100); 422 1.1 christos struct timeval c; 423 1.1 christos 424 1.1 christos c = add_tval_us(a, MICROSECONDS - 100); 425 1.1 christos TEST_ASSERT_EQUAL_timeval(E, c); 426 1.1 christos } 427 1.2 christos 428 1.2 christos return; 429 1.1 christos } 430 1.1 christos 431 1.1 christos //---------------------------------------------------------------------- 432 1.1 christos // test subtraction (difference) 433 1.1 christos //---------------------------------------------------------------------- 434 1.1 christos 435 1.2 christos void 436 1.2 christos test_SubFullNorm(void) 437 1.2 christos { 438 1.2 christos int i, j; 439 1.2 christos 440 1.1 christos for (i = -4; i <= 4; ++i) 441 1.1 christos for (j = -4; j <= 4; ++j) { 442 1.1 christos struct timeval a = timeval_init(i, 600); 443 1.1 christos struct timeval b = timeval_init(j, 400); 444 1.1 christos struct timeval E = timeval_init(i - j, 600 - 400); 445 1.1 christos struct timeval c; 446 1.1 christos 447 1.1 christos c = sub_tval(a, b); 448 1.1 christos TEST_ASSERT_EQUAL_timeval(E, c); 449 1.1 christos } 450 1.2 christos 451 1.2 christos return; 452 1.1 christos } 453 1.1 christos 454 1.2 christos 455 1.2 christos void 456 1.2 christos test_SubFullOflow(void) 457 1.2 christos { 458 1.2 christos int i, j; 459 1.2 christos 460 1.1 christos for (i = -4; i <= 4; ++i) 461 1.1 christos for (j = -4; j <= 4; ++j) { 462 1.1 christos struct timeval a = timeval_init(i, 100); 463 1.1 christos struct timeval b = timeval_init(j, 999900); 464 1.1 christos struct timeval E = timeval_init(i - j - 1, 200); 465 1.1 christos struct timeval c; 466 1.1 christos 467 1.1 christos c = sub_tval(a, b); 468 1.1 christos TEST_ASSERT_EQUAL_timeval(E, c); 469 1.1 christos } 470 1.2 christos 471 1.2 christos return; 472 1.1 christos } 473 1.1 christos 474 1.2 christos 475 1.2 christos void 476 1.2 christos test_SubUsecNorm(void) 477 1.2 christos { 478 1.1 christos int i = -4; 479 1.2 christos 480 1.1 christos for (i = -4; i <= 4; ++i) { 481 1.1 christos struct timeval a = timeval_init(i, 600); 482 1.1 christos struct timeval E = timeval_init(i, 200); 483 1.1 christos struct timeval c; 484 1.1 christos 485 1.1 christos c = sub_tval_us(a, 600 - 200); 486 1.1 christos TEST_ASSERT_EQUAL_timeval(E, c); 487 1.1 christos } 488 1.2 christos 489 1.2 christos return; 490 1.1 christos } 491 1.1 christos 492 1.2 christos 493 1.2 christos void 494 1.2 christos test_SubUsecOflow(void) 495 1.2 christos { 496 1.1 christos int i = -4; 497 1.2 christos 498 1.1 christos for (i = -4; i <= 4; ++i) { 499 1.1 christos struct timeval a = timeval_init(i, 100); 500 1.1 christos struct timeval E = timeval_init(i - 1, 200); 501 1.1 christos struct timeval c; 502 1.1 christos 503 1.1 christos c = sub_tval_us(a, MICROSECONDS - 100); 504 1.1 christos TEST_ASSERT_EQUAL_timeval(E, c); 505 1.1 christos } 506 1.2 christos 507 1.2 christos return; 508 1.1 christos } 509 1.1 christos 510 1.1 christos //---------------------------------------------------------------------- 511 1.1 christos // test negation 512 1.1 christos //---------------------------------------------------------------------- 513 1.1 christos 514 1.2 christos void 515 1.2 christos test_Neg(void) 516 1.2 christos { 517 1.1 christos int i = -4; 518 1.2 christos 519 1.1 christos for (i = -4; i <= 4; ++i) { 520 1.1 christos struct timeval a = timeval_init(i, 100); 521 1.1 christos struct timeval b; 522 1.1 christos struct timeval c; 523 1.1 christos 524 1.1 christos b = neg_tval(a); 525 1.1 christos c = add_tval(a, b); 526 1.1 christos TEST_ASSERT_EQUAL(0, test_tval(c)); 527 1.1 christos } 528 1.2 christos 529 1.2 christos return; 530 1.1 christos } 531 1.1 christos 532 1.1 christos //---------------------------------------------------------------------- 533 1.1 christos // test abs value 534 1.1 christos //---------------------------------------------------------------------- 535 1.1 christos 536 1.2 christos void 537 1.2 christos test_AbsNoFrac(void) 538 1.2 christos { 539 1.1 christos int i = -4; 540 1.2 christos 541 1.1 christos for (i = -4; i <= 4; ++i) { 542 1.1 christos struct timeval a = timeval_init(i, 0); 543 1.1 christos struct timeval b; 544 1.1 christos 545 1.1 christos b = abs_tval(a); 546 1.1 christos TEST_ASSERT_EQUAL((i != 0), test_tval(b)); 547 1.1 christos } 548 1.2 christos 549 1.2 christos return; 550 1.1 christos } 551 1.1 christos 552 1.2 christos 553 1.2 christos void 554 1.2 christos test_AbsWithFrac(void) 555 1.2 christos { 556 1.1 christos int i = -4; 557 1.2 christos 558 1.1 christos for (i = -4; i <= 4; ++i) { 559 1.1 christos struct timeval a = timeval_init(i, 100); 560 1.1 christos struct timeval b; 561 1.1 christos 562 1.1 christos b = abs_tval(a); 563 1.1 christos TEST_ASSERT_EQUAL(1, test_tval(b)); 564 1.1 christos } 565 1.2 christos 566 1.2 christos return; 567 1.1 christos } 568 1.1 christos 569 1.1 christos // --------------------------------------------------------------------- 570 1.1 christos // test support stuff -- part 2 571 1.1 christos // --------------------------------------------------------------------- 572 1.1 christos 573 1.1 christos 574 1.2 christos void 575 1.2 christos test_Helpers2(void) 576 1.2 christos { 577 1.1 christos struct timeval limit = timeval_init(0, 2); 578 1.1 christos struct timeval x, y; 579 1.2 christos long i; 580 1.1 christos 581 1.2 christos for (x.tv_sec = -2; x.tv_sec < 3; x.tv_sec++) { 582 1.1 christos for (x.tv_usec = 1; 583 1.1 christos x.tv_usec < 1000000; 584 1.1 christos x.tv_usec += 499999) { 585 1.2 christos for (i = -4; i < 5; ++i) { 586 1.1 christos y = x; 587 1.1 christos y.tv_usec += i; 588 1.2 christos if (i >= -2 && i <= 2) { 589 1.2 christos TEST_ASSERT_TRUE(AssertTimevalClose(x, y, limit));//ASSERT_PRED_FORMAT2(isClose, x, y); 590 1.1 christos } 591 1.1 christos else { 592 1.2 christos TEST_ASSERT_FALSE(AssertTimevalClose(x, y, limit)); 593 1.1 christos } 594 1.1 christos } 595 1.1 christos } 596 1.1 christos } 597 1.2 christos 598 1.2 christos return; 599 1.1 christos } 600 1.1 christos 601 1.1 christos // and the global predicate instances we're using here 602 1.1 christos 603 1.2 christos //static l_fp lfpClose = l_fp_init(0, 1); //static AssertFpClose FpClose(0, 1); 604 1.2 christos //static struct timeval timevalClose = timeval_init(0, 1); //static AssertTimevalClose TimevalClose(0, 1); 605 1.1 christos 606 1.1 christos //---------------------------------------------------------------------- 607 1.1 christos // conversion to l_fp 608 1.1 christos //---------------------------------------------------------------------- 609 1.1 christos 610 1.2 christos void 611 1.2 christos test_ToLFPbittest(void) 612 1.2 christos { 613 1.2 christos l_fp lfpClose = l_fp_init(0, 1); 614 1.1 christos 615 1.1 christos u_int32 i = 0; 616 1.2 christos for (i = 0; i < 1000000; ++i) { 617 1.1 christos struct timeval a = timeval_init(1, i); 618 1.2 christos l_fp E = l_fp_init(1, my_tick_to_tsf(i)); 619 1.1 christos l_fp r; 620 1.1 christos 621 1.1 christos r = tval_intv_to_lfp(a); 622 1.2 christos TEST_ASSERT_TRUE(AssertFpClose(E, r, lfpClose)); //ASSERT_PRED_FORMAT2(FpClose, E, r); 623 1.1 christos } 624 1.2 christos 625 1.2 christos return; 626 1.1 christos } 627 1.1 christos 628 1.1 christos 629 1.2 christos void 630 1.2 christos test_ToLFPrelPos(void) 631 1.2 christos { 632 1.2 christos l_fp lfpClose = l_fp_init(0, 1); 633 1.2 christos int i = 0; 634 1.1 christos 635 1.2 christos for (i = 0; i < COUNTOF(fdata); ++i) { 636 1.1 christos struct timeval a = timeval_init(1, fdata[i].usec); 637 1.1 christos l_fp E = l_fp_init(1, fdata[i].frac); 638 1.1 christos l_fp r; 639 1.1 christos 640 1.1 christos r = tval_intv_to_lfp(a); 641 1.2 christos TEST_ASSERT_TRUE(AssertFpClose(E, r, lfpClose)); 642 1.1 christos } 643 1.2 christos 644 1.2 christos return; 645 1.1 christos } 646 1.1 christos 647 1.2 christos 648 1.2 christos void 649 1.2 christos test_ToLFPrelNeg(void) 650 1.2 christos { 651 1.2 christos l_fp lfpClose = l_fp_init(0, 1); 652 1.1 christos int i = 0; 653 1.2 christos 654 1.2 christos for (i = 0; i < COUNTOF(fdata); ++i) { 655 1.1 christos struct timeval a = timeval_init(-1, fdata[i].usec); 656 1.1 christos l_fp E = l_fp_init(~0, fdata[i].frac); 657 1.1 christos l_fp r; 658 1.1 christos 659 1.1 christos r = tval_intv_to_lfp(a); 660 1.2 christos TEST_ASSERT_TRUE(AssertFpClose(E, r, lfpClose)); 661 1.1 christos } 662 1.2 christos 663 1.2 christos return; 664 1.1 christos } 665 1.1 christos 666 1.1 christos 667 1.2 christos void 668 1.2 christos test_ToLFPabs(void) 669 1.2 christos { 670 1.2 christos l_fp lfpClose = l_fp_init(0, 1); 671 1.1 christos int i = 0; 672 1.2 christos 673 1.2 christos for (i = 0; i < COUNTOF(fdata); ++i) { 674 1.1 christos struct timeval a = timeval_init(1, fdata[i].usec); 675 1.1 christos l_fp E = l_fp_init(1 + JAN_1970, fdata[i].frac); 676 1.1 christos l_fp r; 677 1.1 christos 678 1.1 christos r = tval_stamp_to_lfp(a); 679 1.2 christos TEST_ASSERT_TRUE(AssertFpClose(E, r, lfpClose)); 680 1.1 christos } 681 1.2 christos 682 1.2 christos return; 683 1.1 christos } 684 1.1 christos 685 1.1 christos //---------------------------------------------------------------------- 686 1.1 christos // conversion from l_fp 687 1.1 christos //---------------------------------------------------------------------- 688 1.1 christos 689 1.2 christos void 690 1.2 christos test_FromLFPbittest(void) 691 1.2 christos { 692 1.2 christos struct timeval timevalClose = timeval_init(0, 1); 693 1.1 christos // Not *exactly* a bittest, because 2**32 tests would take a 694 1.1 christos // really long time even on very fast machines! So we do test 695 1.1 christos // every 1000 fractional units. 696 1.1 christos u_int32 tsf = 0; 697 1.2 christos 698 1.1 christos for (tsf = 0; tsf < ~((u_int32)(1000)); tsf += 1000) { 699 1.1 christos struct timeval E = timeval_init(1, my_tsf_to_tick(tsf)); 700 1.1 christos l_fp a = l_fp_init(1, tsf); 701 1.1 christos struct timeval r; 702 1.1 christos 703 1.1 christos r = lfp_intv_to_tval(a); 704 1.1 christos // The conversion might be off by one microsecond when 705 1.1 christos // comparing to calculated value. 706 1.2 christos TEST_ASSERT_TRUE(AssertTimevalClose(E, r, timevalClose)); 707 1.1 christos } 708 1.2 christos 709 1.2 christos return; 710 1.1 christos } 711 1.1 christos 712 1.2 christos 713 1.2 christos void 714 1.2 christos test_FromLFPrelPos(void) 715 1.2 christos { 716 1.2 christos struct timeval timevalClose = timeval_init(0, 1); 717 1.2 christos int i = 0; 718 1.2 christos 719 1.2 christos for (i = 0; i < COUNTOF(fdata); ++i) { 720 1.1 christos l_fp a = l_fp_init(1, fdata[i].frac); 721 1.1 christos struct timeval E = timeval_init(1, fdata[i].usec); 722 1.1 christos struct timeval r; 723 1.1 christos 724 1.1 christos r = lfp_intv_to_tval(a); 725 1.2 christos TEST_ASSERT_TRUE(AssertTimevalClose(E, r, timevalClose)); 726 1.1 christos } 727 1.2 christos 728 1.2 christos return; 729 1.1 christos } 730 1.1 christos 731 1.2 christos 732 1.2 christos void 733 1.2 christos test_FromLFPrelNeg(void) 734 1.2 christos { 735 1.2 christos struct timeval timevalClose = timeval_init(0, 1); 736 1.1 christos int i = 0; 737 1.2 christos 738 1.2 christos for (i = 0; i < COUNTOF(fdata); ++i) { 739 1.1 christos l_fp a = l_fp_init(~0, fdata[i].frac); 740 1.1 christos struct timeval E = timeval_init(-1, fdata[i].usec); 741 1.1 christos struct timeval r; 742 1.1 christos 743 1.1 christos r = lfp_intv_to_tval(a); 744 1.2 christos TEST_ASSERT_TRUE(AssertTimevalClose(E, r, timevalClose)); 745 1.1 christos } 746 1.2 christos 747 1.2 christos return; 748 1.1 christos } 749 1.1 christos 750 1.2 christos 751 1.1 christos // usec -> frac -> usec roundtrip, using a prime start and increment 752 1.2 christos void 753 1.2 christos test_LFProundtrip(void) 754 1.2 christos { 755 1.1 christos int32_t t = -1; 756 1.1 christos u_int32 i = 5; 757 1.2 christos 758 1.1 christos for (t = -1; t < 2; ++t) 759 1.2 christos for (i = 5; i < 1000000; i += 11) { 760 1.1 christos struct timeval E = timeval_init(t, i); 761 1.1 christos l_fp a; 762 1.1 christos struct timeval r; 763 1.1 christos 764 1.1 christos a = tval_intv_to_lfp(E); 765 1.1 christos r = lfp_intv_to_tval(a); 766 1.1 christos TEST_ASSERT_EQUAL_timeval(E, r); 767 1.1 christos } 768 1.2 christos 769 1.2 christos return; 770 1.1 christos } 771 1.1 christos 772 1.1 christos //---------------------------------------------------------------------- 773 1.1 christos // string formatting 774 1.1 christos //---------------------------------------------------------------------- 775 1.1 christos 776 1.2 christos void 777 1.2 christos test_ToString(void) 778 1.2 christos { 779 1.1 christos static const struct { 780 1.1 christos time_t sec; 781 1.1 christos long usec; 782 1.1 christos const char * repr; 783 1.1 christos } data [] = { 784 1.1 christos { 0, 0, "0.000000" }, 785 1.1 christos { 2, 0, "2.000000" }, 786 1.1 christos {-2, 0, "-2.000000" }, 787 1.1 christos { 0, 1, "0.000001" }, 788 1.1 christos { 0,-1, "-0.000001" }, 789 1.1 christos { 1,-1, "0.999999" }, 790 1.1 christos {-1, 1, "-0.999999" }, 791 1.1 christos {-1,-1, "-1.000001" }, 792 1.1 christos }; 793 1.1 christos int i; 794 1.2 christos 795 1.1 christos for (i = 0; i < COUNTOF(data); ++i) { 796 1.1 christos struct timeval a = timeval_init(data[i].sec, data[i].usec); 797 1.2 christos const char * E = data[i].repr; 798 1.1 christos const char * r = tvaltoa(a); 799 1.1 christos 800 1.1 christos TEST_ASSERT_EQUAL_STRING(E, r); 801 1.1 christos } 802 1.2 christos 803 1.2 christos return; 804 1.1 christos } 805 1.1 christos 806 1.1 christos // -*- EOF -*- 807