1*cb5fe245SEnji Cooper /*
2*cb5fe245SEnji Cooper * Copyright (c) 2009 Mark Heily <[email protected]>
3*cb5fe245SEnji Cooper *
4*cb5fe245SEnji Cooper * Permission to use, copy, modify, and distribute this software for any
5*cb5fe245SEnji Cooper * purpose with or without fee is hereby granted, provided that the above
6*cb5fe245SEnji Cooper * copyright notice and this permission notice appear in all copies.
7*cb5fe245SEnji Cooper *
8*cb5fe245SEnji Cooper * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9*cb5fe245SEnji Cooper * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10*cb5fe245SEnji Cooper * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11*cb5fe245SEnji Cooper * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12*cb5fe245SEnji Cooper * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13*cb5fe245SEnji Cooper * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14*cb5fe245SEnji Cooper * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15*cb5fe245SEnji Cooper *
16*cb5fe245SEnji Cooper * $FreeBSD$
17*cb5fe245SEnji Cooper */
18*cb5fe245SEnji Cooper
19*cb5fe245SEnji Cooper #include "common.h"
20*cb5fe245SEnji Cooper
21*cb5fe245SEnji Cooper int kqfd;
22*cb5fe245SEnji Cooper
23*cb5fe245SEnji Cooper static void
add_and_delete(void)24*cb5fe245SEnji Cooper add_and_delete(void)
25*cb5fe245SEnji Cooper {
26*cb5fe245SEnji Cooper const char *test_id = "kevent(EVFILT_USER, EV_ADD and EV_DELETE)";
27*cb5fe245SEnji Cooper struct kevent kev;
28*cb5fe245SEnji Cooper
29*cb5fe245SEnji Cooper test_begin(test_id);
30*cb5fe245SEnji Cooper
31*cb5fe245SEnji Cooper kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD, 0, 0, NULL);
32*cb5fe245SEnji Cooper test_no_kevents();
33*cb5fe245SEnji Cooper
34*cb5fe245SEnji Cooper kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_DELETE, 0, 0, NULL);
35*cb5fe245SEnji Cooper test_no_kevents();
36*cb5fe245SEnji Cooper
37*cb5fe245SEnji Cooper success();
38*cb5fe245SEnji Cooper }
39*cb5fe245SEnji Cooper
40*cb5fe245SEnji Cooper static void
event_wait(void)41*cb5fe245SEnji Cooper event_wait(void)
42*cb5fe245SEnji Cooper {
43*cb5fe245SEnji Cooper const char *test_id = "kevent(EVFILT_USER, wait)";
44*cb5fe245SEnji Cooper struct kevent kev;
45*cb5fe245SEnji Cooper
46*cb5fe245SEnji Cooper test_begin(test_id);
47*cb5fe245SEnji Cooper
48*cb5fe245SEnji Cooper test_no_kevents();
49*cb5fe245SEnji Cooper
50*cb5fe245SEnji Cooper /* Add the event, and then trigger it */
51*cb5fe245SEnji Cooper kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD | EV_CLEAR, 0, 0, NULL);
52*cb5fe245SEnji Cooper kevent_add(kqfd, &kev, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);
53*cb5fe245SEnji Cooper
54*cb5fe245SEnji Cooper kev.fflags &= ~NOTE_FFCTRLMASK;
55*cb5fe245SEnji Cooper kev.fflags &= ~NOTE_TRIGGER;
56*cb5fe245SEnji Cooper kev.flags = EV_CLEAR;
57*cb5fe245SEnji Cooper kevent_cmp(&kev, kevent_get(kqfd));
58*cb5fe245SEnji Cooper
59*cb5fe245SEnji Cooper test_no_kevents();
60*cb5fe245SEnji Cooper
61*cb5fe245SEnji Cooper success();
62*cb5fe245SEnji Cooper }
63*cb5fe245SEnji Cooper
64*cb5fe245SEnji Cooper static void
disable_and_enable(void)65*cb5fe245SEnji Cooper disable_and_enable(void)
66*cb5fe245SEnji Cooper {
67*cb5fe245SEnji Cooper const char *test_id = "kevent(EVFILT_USER, EV_DISABLE and EV_ENABLE)";
68*cb5fe245SEnji Cooper struct kevent kev;
69*cb5fe245SEnji Cooper
70*cb5fe245SEnji Cooper test_begin(test_id);
71*cb5fe245SEnji Cooper
72*cb5fe245SEnji Cooper test_no_kevents();
73*cb5fe245SEnji Cooper
74*cb5fe245SEnji Cooper kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD, 0, 0, NULL);
75*cb5fe245SEnji Cooper kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_DISABLE, 0, 0, NULL);
76*cb5fe245SEnji Cooper
77*cb5fe245SEnji Cooper /* Trigger the event, but since it is disabled, nothing will happen. */
78*cb5fe245SEnji Cooper kevent_add(kqfd, &kev, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);
79*cb5fe245SEnji Cooper test_no_kevents();
80*cb5fe245SEnji Cooper
81*cb5fe245SEnji Cooper kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ENABLE, 0, 0, NULL);
82*cb5fe245SEnji Cooper kevent_add(kqfd, &kev, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);
83*cb5fe245SEnji Cooper
84*cb5fe245SEnji Cooper kev.flags = EV_CLEAR;
85*cb5fe245SEnji Cooper kev.fflags &= ~NOTE_FFCTRLMASK;
86*cb5fe245SEnji Cooper kev.fflags &= ~NOTE_TRIGGER;
87*cb5fe245SEnji Cooper kevent_cmp(&kev, kevent_get(kqfd));
88*cb5fe245SEnji Cooper
89*cb5fe245SEnji Cooper success();
90*cb5fe245SEnji Cooper }
91*cb5fe245SEnji Cooper
92*cb5fe245SEnji Cooper static void
oneshot(void)93*cb5fe245SEnji Cooper oneshot(void)
94*cb5fe245SEnji Cooper {
95*cb5fe245SEnji Cooper const char *test_id = "kevent(EVFILT_USER, EV_ONESHOT)";
96*cb5fe245SEnji Cooper struct kevent kev;
97*cb5fe245SEnji Cooper
98*cb5fe245SEnji Cooper test_begin(test_id);
99*cb5fe245SEnji Cooper
100*cb5fe245SEnji Cooper test_no_kevents();
101*cb5fe245SEnji Cooper
102*cb5fe245SEnji Cooper kevent_add(kqfd, &kev, 2, EVFILT_USER, EV_ADD | EV_ONESHOT, 0, 0, NULL);
103*cb5fe245SEnji Cooper
104*cb5fe245SEnji Cooper puts(" -- event 1");
105*cb5fe245SEnji Cooper kevent_add(kqfd, &kev, 2, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);
106*cb5fe245SEnji Cooper
107*cb5fe245SEnji Cooper kev.flags = EV_ONESHOT;
108*cb5fe245SEnji Cooper kev.fflags &= ~NOTE_FFCTRLMASK;
109*cb5fe245SEnji Cooper kev.fflags &= ~NOTE_TRIGGER;
110*cb5fe245SEnji Cooper kevent_cmp(&kev, kevent_get(kqfd));
111*cb5fe245SEnji Cooper
112*cb5fe245SEnji Cooper test_no_kevents();
113*cb5fe245SEnji Cooper
114*cb5fe245SEnji Cooper success();
115*cb5fe245SEnji Cooper }
116*cb5fe245SEnji Cooper
117*cb5fe245SEnji Cooper void
test_evfilt_user()118*cb5fe245SEnji Cooper test_evfilt_user()
119*cb5fe245SEnji Cooper {
120*cb5fe245SEnji Cooper kqfd = kqueue();
121*cb5fe245SEnji Cooper
122*cb5fe245SEnji Cooper add_and_delete();
123*cb5fe245SEnji Cooper event_wait();
124*cb5fe245SEnji Cooper disable_and_enable();
125*cb5fe245SEnji Cooper oneshot();
126*cb5fe245SEnji Cooper /* TODO: try different fflags operations */
127*cb5fe245SEnji Cooper
128*cb5fe245SEnji Cooper close(kqfd);
129*cb5fe245SEnji Cooper }
130