Tizen 2.1 base
[platform/upstream/gcd.git] / kqueue-1.0.4 / test / timer.c
1 /*
2  * Copyright (c) 2009 Mark Heily <mark@heily.com>
3  *
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.
7  *
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.
15  */
16
17 #include "common.h"
18
19 static int __thread kqfd;
20
21 void
22 test_kevent_timer_add(void)
23 {
24     struct kevent kev;
25
26     kevent_add(kqfd, &kev, 1, EVFILT_TIMER, EV_ADD, 0, 1000, NULL);
27 }
28
29 void
30 test_kevent_timer_del(void)
31 {
32     struct kevent kev;
33
34     kevent_add(kqfd, &kev, 1, EVFILT_TIMER, EV_DELETE, 0, 0, NULL);
35
36     test_no_kevents(kqfd);
37 }
38
39 void
40 test_kevent_timer_get(void)
41 {
42     struct kevent kev;
43
44     kevent_add(kqfd, &kev, 1, EVFILT_TIMER, EV_ADD, 0, 1000, NULL);
45
46     kev.flags |= EV_CLEAR;
47     kev.data = 1; 
48     kevent_cmp(&kev, kevent_get(kqfd));
49
50     kevent_add(kqfd, &kev, 1, EVFILT_TIMER, EV_DELETE, 0, 0, NULL);
51 }
52
53 static void
54 test_kevent_timer_oneshot(void)
55 {
56     struct kevent kev;
57
58     test_no_kevents(kqfd);
59
60     kevent_add(kqfd, &kev, 2, EVFILT_TIMER, EV_ADD | EV_ONESHOT, 0, 500,NULL);
61
62     /* Retrieve the event */
63     kev.flags = EV_ADD | EV_CLEAR | EV_ONESHOT;
64     kev.data = 1; 
65     kevent_cmp(&kev, kevent_get(kqfd));
66
67     /* Check if the event occurs again */
68     sleep(3);
69     test_no_kevents(kqfd);
70 }
71
72 static void
73 test_kevent_timer_periodic(void)
74 {
75     struct kevent kev;
76
77     test_no_kevents(kqfd);
78
79     kevent_add(kqfd, &kev, 3, EVFILT_TIMER, EV_ADD, 0, 1000,NULL);
80
81     /* Retrieve the event */
82     kev.flags = EV_ADD | EV_CLEAR;
83     kev.data = 1; 
84     kevent_cmp(&kev, kevent_get(kqfd));
85
86     /* Check if the event occurs again */
87     sleep(1);
88     kevent_cmp(&kev, kevent_get(kqfd));
89
90     /* Delete the event */
91     kev.flags = EV_DELETE;
92     kevent_update(kqfd, &kev);
93 }
94
95 static void
96 test_kevent_timer_disable_and_enable(void)
97 {
98     struct kevent kev;
99
100     test_no_kevents(kqfd);
101
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);
107
108     /* Re-enable and check again */
109     kev.flags = EV_ENABLE;
110     kevent_update(kqfd, &kev);
111
112     kev.flags = EV_ADD | EV_CLEAR | EV_ONESHOT;
113     kev.data = 1; 
114     kevent_cmp(&kev, kevent_get(kqfd));
115 }
116
117 #if HAVE_EV_DISPATCH
118 void
119 test_kevent_timer_dispatch(void)
120 {
121     struct kevent kev;
122
123     test_no_kevents(kqfd);
124
125     kevent_add(kqfd, &kev, 4, EVFILT_TIMER, EV_ADD | EV_DISPATCH, 0, 800, NULL);
126
127     /* Get one event */
128     kev.flags = EV_ADD | EV_CLEAR | EV_DISPATCH;
129     kev.data = 1; 
130     kevent_cmp(&kev, kevent_get(kqfd));
131
132     /* Confirm that the knote is disabled */
133     sleep(1);
134     test_no_kevents(kqfd);
135
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);
139
140     /* Get the next event */
141     sleep(1);
142     kev.flags = EV_ADD | EV_CLEAR | EV_DISPATCH;
143     kev.data = 1; 
144     kevent_cmp(&kev, kevent_get(kqfd));
145
146     /* Remove the knote and ensure the event no longer fires */
147     kevent_add(kqfd, &kev, 4, EVFILT_TIMER, EV_DELETE, 0, 0, NULL);
148     sleep(1);
149     test_no_kevents(kqfd);
150 }
151 #endif  /* HAVE_EV_DISPATCH */
152
153 void
154 test_evfilt_timer(int _kqfd)
155 {
156         kqfd = _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);
163 #if HAVE_EV_DISPATCH
164     test(kevent_timer_dispatch);
165 #endif
166 }