Tizen 2.1 base
[platform/upstream/gcd.git] / kqueue-1.0.4 / test / user.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 static void
22 test_kevent_user_add_and_delete(void)
23 {
24     struct kevent kev;
25
26     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD, 0, 0, NULL);
27     test_no_kevents(kqfd);
28
29     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_DELETE, 0, 0, NULL);
30     test_no_kevents(kqfd);
31 }
32
33 static void
34 test_kevent_user_get(void)
35 {
36     struct kevent kev;
37
38     test_no_kevents(kqfd);
39
40     /* Add the event, and then trigger it */
41     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD | EV_CLEAR, 0, 0, NULL);    
42     kevent_add(kqfd, &kev, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);    
43
44     kev.fflags &= ~NOTE_FFCTRLMASK;
45     kev.fflags &= ~NOTE_TRIGGER;
46     kev.flags = EV_CLEAR;
47     kevent_cmp(&kev, kevent_get(kqfd));
48
49     test_no_kevents(kqfd);
50 }
51
52 static void
53 test_kevent_user_disable_and_enable(void)
54 {
55     struct kevent kev;
56
57     test_no_kevents(kqfd);
58
59     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD, 0, 0, NULL); 
60     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_DISABLE, 0, 0, NULL); 
61
62     /* Trigger the event, but since it is disabled, nothing will happen. */
63     kevent_add(kqfd, &kev, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL); 
64     test_no_kevents(kqfd);
65
66     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ENABLE, 0, 0, NULL); 
67     kevent_add(kqfd, &kev, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL); 
68
69     kev.flags = EV_CLEAR;
70     kev.fflags &= ~NOTE_FFCTRLMASK;
71     kev.fflags &= ~NOTE_TRIGGER;
72     kevent_cmp(&kev, kevent_get(kqfd));
73 }
74
75 static void
76 test_kevent_user_oneshot(void)
77 {
78     struct kevent kev;
79
80     test_no_kevents(kqfd);
81
82     kevent_add(kqfd, &kev, 2, EVFILT_USER, EV_ADD | EV_ONESHOT, 0, 0, NULL);
83
84     puts("  -- event 1");
85     kevent_add(kqfd, &kev, 2, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);    
86
87     kev.flags = EV_ONESHOT;
88     kev.fflags &= ~NOTE_FFCTRLMASK;
89     kev.fflags &= ~NOTE_TRIGGER;
90     kevent_cmp(&kev, kevent_get(kqfd));
91
92     test_no_kevents(kqfd);
93 }
94
95 #if HAVE_EV_DISPATCH
96 void
97 test_kevent_user_dispatch(void)
98 {
99     struct kevent kev;
100
101     test_no_kevents(kqfd);
102
103     /* Add the event, and then trigger it */
104     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD | EV_CLEAR | EV_DISPATCH, 0, 0, NULL);
105     kevent_add(kqfd, &kev, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);
106
107     /* Retrieve one event */
108     kev.fflags &= ~NOTE_FFCTRLMASK;
109     kev.fflags &= ~NOTE_TRIGGER;
110     kev.flags = EV_CLEAR;
111     kevent_cmp(&kev, kevent_get(kqfd));
112
113     /* Confirm that the knote is disabled automatically */
114     test_no_kevents(kqfd);
115
116     /* Re-enable the kevent */
117     /* FIXME- is EV_DISPATCH needed when rearming ? */
118     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ENABLE | EV_CLEAR | EV_DISPATCH, 0, 0, NULL);
119     test_no_kevents(kqfd);
120
121     /* Trigger the event */
122     kevent_add(kqfd, &kev, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);
123     kev.fflags &= ~NOTE_FFCTRLMASK;
124     kev.fflags &= ~NOTE_TRIGGER;
125     kev.flags = EV_CLEAR;
126     kevent_cmp(&kev, kevent_get(kqfd));
127     test_no_kevents(kqfd);
128
129     /* Delete the watch */
130     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_DELETE, 0, 0, NULL);
131     test_no_kevents(kqfd);
132 }
133 #endif  /* HAVE_EV_DISPATCH */
134
135 void
136 test_evfilt_user(int _kqfd)
137 {
138     kqfd = _kqfd;
139
140     test(kevent_user_add_and_delete);
141     test(kevent_user_get);
142     test(kevent_user_disable_and_enable);
143     test(kevent_user_oneshot);
144 #if HAVE_EV_DISPATCH
145     test(kevent_user_dispatch);
146 #endif
147     /* TODO: try different fflags operations */
148 }