]> git.ozlabs.org Git - ccan/blob - ccan/timer/test/run.c
timer: change timers_expire() to return a single timer.
[ccan] / ccan / timer / test / run.c
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
6 static struct timeabs timeabs_from_nsec(unsigned long long nsec)
7 {
8         struct timeabs epoch = { { 0, 0 } };
9         return timeabs_add(epoch, time_from_nsec(nsec));
10 }
11
12 int main(void)
13 {
14         struct timers timers;
15         struct timer t[64];
16         struct timeabs earliest;
17         uint64_t i;
18         struct timeabs epoch = { { 0, 0 } };
19
20         /* This is how many tests you plan to run */
21         plan_tests(488);
22
23         timers_init(&timers, epoch);
24         ok1(timers_check(&timers, NULL));
25         ok1(!timer_earliest(&timers, &earliest));
26
27         timer_add(&timers, &t[0], timeabs_from_nsec(1));
28         ok1(timers_check(&timers, NULL));
29         ok1(timer_earliest(&timers, &earliest));
30         ok1(timeabs_eq(earliest, grains_to_time(t[0].time)));
31         timer_del(&timers, &t[0]);
32         ok1(timers_check(&timers, NULL));
33         ok1(!timer_earliest(&timers, &earliest));
34
35         /* Check timer ordering. */
36         for (i = 0; i < 32; i++) {
37                 timer_add(&timers, &t[i*2], timeabs_from_nsec(1ULL << i));
38                 ok1(timers_check(&timers, NULL));
39                 timer_add(&timers, &t[i*2+1], timeabs_from_nsec((1ULL << i) + 1));
40                 ok1(timers_check(&timers, NULL));
41         }
42
43         for (i = 0; i < 32; i++) {
44                 const struct timer *t1, *t2;
45
46                 t1 = get_first(&timers);
47                 ok1(t1 == &t[i*2] || t1 == &t[i*2+1]);
48                 timer_del(&timers, (struct timer *)t1);
49                 ok1(timers_check(&timers, NULL));
50
51                 t2 = get_first(&timers);
52                 ok1(t2 != t1 && (t2 == &t[i*2] || t2 == &t[i*2+1]));
53                 timer_del(&timers, (struct timer *)t2);
54                 ok1(timers_check(&timers, NULL));
55         }
56
57         /* Check expiry. */
58         for (i = 0; i < 32; i++) {
59                 uint64_t exp = (uint64_t)TIMER_GRANULARITY << i;
60
61                 timer_add(&timers, &t[i*2], timeabs_from_nsec(exp));
62                 ok1(timers_check(&timers, NULL));
63                 timer_add(&timers, &t[i*2+1], timeabs_from_nsec(exp + 1));
64                 ok1(timers_check(&timers, NULL));
65         }
66
67         for (i = 0; i < 32; i++) {
68                 struct timer *t1, *t2;
69
70                 ok1(timer_earliest(&timers, &earliest));
71                 t1 = timers_expire(&timers, earliest);
72                 ok1(t1);
73                 t2 = timers_expire(&timers, earliest);
74                 ok1(t2);
75                 ok1(!timers_expire(&timers, earliest));
76
77                 ok1(t1 == &t[i*2] || t1 == &t[i*2+1]);
78                 ok1(t2 != t1 && (t2 == &t[i*2] || t2 == &t[i*2+1]));
79                 ok1(timers_check(&timers, NULL));
80         }
81
82         ok1(!timer_earliest(&timers, &earliest));
83
84         timers_cleanup(&timers);
85
86         /* This exits depending on whether all tests passed */
87         return exit_status();
88 }