2 * Copyright (c) 2009 Mark Heily <mark@heily.com>
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 static int __thread kqfd;
22 test_kevent_timer_add(void)
26 kevent_add(kqfd, &kev, 1, EVFILT_TIMER, EV_ADD, 0, 1000, NULL);
30 test_kevent_timer_del(void)
34 kevent_add(kqfd, &kev, 1, EVFILT_TIMER, EV_DELETE, 0, 0, NULL);
36 test_no_kevents(kqfd);
40 test_kevent_timer_get(void)
44 kevent_add(kqfd, &kev, 1, EVFILT_TIMER, EV_ADD, 0, 1000, NULL);
46 kev.flags |= EV_CLEAR;
48 kevent_cmp(&kev, kevent_get(kqfd));
50 kevent_add(kqfd, &kev, 1, EVFILT_TIMER, EV_DELETE, 0, 0, NULL);
54 test_kevent_timer_oneshot(void)
58 test_no_kevents(kqfd);
60 kevent_add(kqfd, &kev, 2, EVFILT_TIMER, EV_ADD | EV_ONESHOT, 0, 500,NULL);
62 /* Retrieve the event */
63 kev.flags = EV_ADD | EV_CLEAR | EV_ONESHOT;
65 kevent_cmp(&kev, kevent_get(kqfd));
67 /* Check if the event occurs again */
69 test_no_kevents(kqfd);
73 test_kevent_timer_periodic(void)
77 test_no_kevents(kqfd);
79 kevent_add(kqfd, &kev, 3, EVFILT_TIMER, EV_ADD, 0, 1000,NULL);
81 /* Retrieve the event */
82 kev.flags = EV_ADD | EV_CLEAR;
84 kevent_cmp(&kev, kevent_get(kqfd));
86 /* Check if the event occurs again */
88 kevent_cmp(&kev, kevent_get(kqfd));
90 /* Delete the event */
91 kev.flags = EV_DELETE;
92 kevent_update(kqfd, &kev);
96 test_kevent_timer_disable_and_enable(void)
100 test_no_kevents(kqfd);
102 /* Add the watch and immediately disable it */
103 kevent_add(kqfd, &kev, 4, EVFILT_TIMER, EV_ADD | EV_ONESHOT, 0, 2000,NULL);
104 kev.flags = EV_DISABLE;
105 kevent_update(kqfd, &kev);
106 test_no_kevents(kqfd);
108 /* Re-enable and check again */
109 kev.flags = EV_ENABLE;
110 kevent_update(kqfd, &kev);
112 kev.flags = EV_ADD | EV_CLEAR | EV_ONESHOT;
114 kevent_cmp(&kev, kevent_get(kqfd));
119 test_kevent_timer_dispatch(void)
123 test_no_kevents(kqfd);
125 kevent_add(kqfd, &kev, 4, EVFILT_TIMER, EV_ADD | EV_DISPATCH, 0, 800, NULL);
128 kev.flags = EV_ADD | EV_CLEAR | EV_DISPATCH;
130 kevent_cmp(&kev, kevent_get(kqfd));
132 /* Confirm that the knote is disabled */
134 test_no_kevents(kqfd);
136 /* Enable the knote and make sure no events are pending */
137 kevent_add(kqfd, &kev, 4, EVFILT_TIMER, EV_ENABLE | EV_DISPATCH, 0, 800, NULL);
138 test_no_kevents(kqfd);
140 /* Get the next event */
142 kev.flags = EV_ADD | EV_CLEAR | EV_DISPATCH;
144 kevent_cmp(&kev, kevent_get(kqfd));
146 /* Remove the knote and ensure the event no longer fires */
147 kevent_add(kqfd, &kev, 4, EVFILT_TIMER, EV_DELETE, 0, 0, NULL);
149 test_no_kevents(kqfd);
151 #endif /* HAVE_EV_DISPATCH */
154 test_evfilt_timer(int _kqfd)
157 test(kevent_timer_add);
158 test(kevent_timer_del);
159 test(kevent_timer_get);
160 test(kevent_timer_oneshot);
161 test(kevent_timer_periodic);
162 test(kevent_timer_disable_and_enable);
164 test(kevent_timer_dispatch);