run.c 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include <ccan/timer/timer.h>
  2. /* Include the C files directly. */
  3. #include <ccan/timer/timer.c>
  4. #include <ccan/tap/tap.h>
  5. static struct timeabs timeabs_from_nsec(unsigned long long nsec)
  6. {
  7. struct timeabs epoch = { { 0, 0 } };
  8. return timeabs_add(epoch, time_from_nsec(nsec));
  9. }
  10. int main(void)
  11. {
  12. struct timers timers;
  13. struct timer t[64];
  14. struct list_head expired;
  15. struct timeabs earliest;
  16. uint64_t i;
  17. struct timeabs epoch = { { 0, 0 } };
  18. /* This is how many tests you plan to run */
  19. plan_tests(488);
  20. timers_init(&timers, epoch);
  21. ok1(timers_check(&timers, NULL));
  22. ok1(!timer_earliest(&timers, &earliest));
  23. timer_add(&timers, &t[0], timeabs_from_nsec(1));
  24. ok1(timers_check(&timers, NULL));
  25. ok1(timer_earliest(&timers, &earliest));
  26. ok1(timeabs_eq(earliest, grains_to_time(t[0].time)));
  27. timer_del(&timers, &t[0]);
  28. ok1(timers_check(&timers, NULL));
  29. ok1(!timer_earliest(&timers, &earliest));
  30. /* Check timer ordering. */
  31. for (i = 0; i < 32; i++) {
  32. timer_add(&timers, &t[i*2], timeabs_from_nsec(1ULL << i));
  33. ok1(timers_check(&timers, NULL));
  34. timer_add(&timers, &t[i*2+1], timeabs_from_nsec((1ULL << i) + 1));
  35. ok1(timers_check(&timers, NULL));
  36. }
  37. for (i = 0; i < 32; i++) {
  38. const struct timer *t1, *t2;
  39. t1 = get_first(&timers);
  40. ok1(t1 == &t[i*2] || t1 == &t[i*2+1]);
  41. timer_del(&timers, (struct timer *)t1);
  42. ok1(timers_check(&timers, NULL));
  43. t2 = get_first(&timers);
  44. ok1(t2 != t1 && (t2 == &t[i*2] || t2 == &t[i*2+1]));
  45. timer_del(&timers, (struct timer *)t2);
  46. ok1(timers_check(&timers, NULL));
  47. }
  48. /* Check expiry. */
  49. for (i = 0; i < 32; i++) {
  50. uint64_t exp = (uint64_t)TIMER_GRANULARITY << i;
  51. timer_add(&timers, &t[i*2], timeabs_from_nsec(exp));
  52. ok1(timers_check(&timers, NULL));
  53. timer_add(&timers, &t[i*2+1], timeabs_from_nsec(exp + 1));
  54. ok1(timers_check(&timers, NULL));
  55. }
  56. for (i = 0; i < 32; i++) {
  57. struct timer *t1, *t2;
  58. ok1(timer_earliest(&timers, &earliest));
  59. timers_expire(&timers, earliest, &expired);
  60. t1 = list_pop(&expired, struct timer, list);
  61. ok1(t1);
  62. t2 = list_pop(&expired, struct timer, list);
  63. ok1(t2);
  64. ok1(list_empty(&expired));
  65. ok1(t1 == &t[i*2] || t1 == &t[i*2+1]);
  66. ok1(t2 != t1 && (t2 == &t[i*2] || t2 == &t[i*2+1]));
  67. ok1(timers_check(&timers, NULL));
  68. }
  69. ok1(!timer_earliest(&timers, &earliest));
  70. timers_cleanup(&timers);
  71. /* This exits depending on whether all tests passed */
  72. return exit_status();
  73. }