]> git.ozlabs.org Git - ccan/blob - ccan/timer/test/run.c
timer: make timer_del() idempotent, add timer_init().
[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_init(&t[0]);
28         /* timer_del can be called immediately after init. */
29         timer_del(&timers, &t[0]);
30
31         timer_add(&timers, &t[0], timeabs_from_nsec(1));
32         ok1(timers_check(&timers, NULL));
33         ok1(timer_earliest(&timers, &earliest));
34         ok1(timeabs_eq(earliest, grains_to_time(t[0].time)));
35         timer_del(&timers, &t[0]);
36         ok1(timers_check(&timers, NULL));
37         ok1(!timer_earliest(&timers, &earliest));
38
39         /* timer_del can be called twice, no problems. */
40         timer_del(&timers, &t[0]);
41
42         /* Check timer ordering. */
43         for (i = 0; i < 32; i++) {
44                 timer_init(&t[i*2]);
45                 timer_add(&timers, &t[i*2], timeabs_from_nsec(1ULL << i));
46                 ok1(timers_check(&timers, NULL));
47                 timer_init(&t[i*2+1]);
48                 timer_add(&timers, &t[i*2+1], timeabs_from_nsec((1ULL << i) + 1));
49                 ok1(timers_check(&timers, NULL));
50         }
51
52         for (i = 0; i < 32; i++) {
53                 const struct timer *t1, *t2;
54
55                 t1 = get_first(&timers);
56                 ok1(t1 == &t[i*2] || t1 == &t[i*2+1]);
57                 timer_del(&timers, (struct timer *)t1);
58                 ok1(timers_check(&timers, NULL));
59
60                 t2 = get_first(&timers);
61                 ok1(t2 != t1 && (t2 == &t[i*2] || t2 == &t[i*2+1]));
62                 timer_del(&timers, (struct timer *)t2);
63                 ok1(timers_check(&timers, NULL));
64         }
65
66         /* Check expiry. */
67         for (i = 0; i < 32; i++) {
68                 uint64_t exp = (uint64_t)TIMER_GRANULARITY << i;
69
70                 timer_add(&timers, &t[i*2], timeabs_from_nsec(exp));
71                 ok1(timers_check(&timers, NULL));
72                 timer_add(&timers, &t[i*2+1], timeabs_from_nsec(exp + 1));
73                 ok1(timers_check(&timers, NULL));
74         }
75
76         for (i = 0; i < 32; i++) {
77                 struct timer *t1, *t2;
78
79                 ok1(timer_earliest(&timers, &earliest));
80                 t1 = timers_expire(&timers, earliest);
81                 ok1(t1);
82                 t2 = timers_expire(&timers, earliest);
83                 ok1(t2);
84                 ok1(!timers_expire(&timers, earliest));
85
86                 ok1(t1 == &t[i*2] || t1 == &t[i*2+1]);
87                 ok1(t2 != t1 && (t2 == &t[i*2] || t2 == &t[i*2+1]));
88                 ok1(timers_check(&timers, NULL));
89         }
90
91         ok1(!timer_earliest(&timers, &earliest));
92
93         timers_cleanup(&timers);
94
95         /* This exits depending on whether all tests passed */
96         return exit_status();
97 }