xref: /freebsd-12.1/tests/sys/kqueue/libkqueue/main.c (revision 90e4ba11)
1cb5fe245SEnji Cooper /*
2cb5fe245SEnji Cooper  * Copyright (c) 2009 Mark Heily <[email protected]>
3cb5fe245SEnji Cooper  *
4cb5fe245SEnji Cooper  * Permission to use, copy, modify, and distribute this software for any
5cb5fe245SEnji Cooper  * purpose with or without fee is hereby granted, provided that the above
6cb5fe245SEnji Cooper  * copyright notice and this permission notice appear in all copies.
7cb5fe245SEnji Cooper  *
8cb5fe245SEnji Cooper  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9cb5fe245SEnji Cooper  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10cb5fe245SEnji Cooper  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11cb5fe245SEnji Cooper  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12cb5fe245SEnji Cooper  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13cb5fe245SEnji Cooper  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14cb5fe245SEnji Cooper  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15cb5fe245SEnji Cooper  *
16cb5fe245SEnji Cooper  * $FreeBSD$
17cb5fe245SEnji Cooper  */
18cb5fe245SEnji Cooper 
19cb5fe245SEnji Cooper #include <sys/types.h>
20cb5fe245SEnji Cooper 
21cb5fe245SEnji Cooper #include "config.h"
22cb5fe245SEnji Cooper #include "common.h"
23cb5fe245SEnji Cooper 
24cb5fe245SEnji Cooper int testnum = 1;
25cb5fe245SEnji Cooper char *cur_test_id = NULL;
26cb5fe245SEnji Cooper int kqfd;
27cb5fe245SEnji Cooper 
28cb5fe245SEnji Cooper extern void test_evfilt_read();
29cb5fe245SEnji Cooper extern void test_evfilt_signal();
30cb5fe245SEnji Cooper extern void test_evfilt_vnode();
31cb5fe245SEnji Cooper extern void test_evfilt_timer();
32cb5fe245SEnji Cooper extern void test_evfilt_proc();
33cb5fe245SEnji Cooper #if HAVE_EVFILT_USER
34cb5fe245SEnji Cooper extern void test_evfilt_user();
35cb5fe245SEnji Cooper #endif
36cb5fe245SEnji Cooper 
37cb5fe245SEnji Cooper /* Checks if any events are pending, which is an error. */
38cb5fe245SEnji Cooper void
test_no_kevents(void)39cb5fe245SEnji Cooper test_no_kevents(void)
40cb5fe245SEnji Cooper {
41cb5fe245SEnji Cooper     int nfds;
42cb5fe245SEnji Cooper     struct timespec timeo;
43cb5fe245SEnji Cooper     struct kevent kev;
4453e992cfSDavid Bright     char *kev_str;
45cb5fe245SEnji Cooper 
46cb5fe245SEnji Cooper     puts("confirming that there are no events pending");
47cb5fe245SEnji Cooper     memset(&timeo, 0, sizeof(timeo));
48cb5fe245SEnji Cooper     nfds = kevent(kqfd, NULL, 0, &kev, 1, &timeo);
49cb5fe245SEnji Cooper     if (nfds != 0) {
50cb5fe245SEnji Cooper         puts("\nUnexpected event:");
5153e992cfSDavid Bright         kev_str = kevent_to_str(&kev);
5253e992cfSDavid Bright         puts(kev_str);
5353e992cfSDavid Bright         free(kev_str);
54cb5fe245SEnji Cooper         errx(1, "%d event(s) pending, but none expected:", nfds);
55cb5fe245SEnji Cooper     }
56cb5fe245SEnji Cooper }
57cb5fe245SEnji Cooper 
5895c05062SDavid Bright /* Checks if any events are pending, which is an error. Do not print
5995c05062SDavid Bright  * out anything unless events are found.
6095c05062SDavid Bright */
6195c05062SDavid Bright void
test_no_kevents_quietly(void)6295c05062SDavid Bright test_no_kevents_quietly(void)
6395c05062SDavid Bright {
6495c05062SDavid Bright     int nfds;
6595c05062SDavid Bright     struct timespec timeo;
6695c05062SDavid Bright     struct kevent kev;
6753e992cfSDavid Bright     char *kev_str;
6895c05062SDavid Bright 
6995c05062SDavid Bright     memset(&timeo, 0, sizeof(timeo));
7095c05062SDavid Bright     nfds = kevent(kqfd, NULL, 0, &kev, 1, &timeo);
7195c05062SDavid Bright     if (nfds != 0) {
7295c05062SDavid Bright         puts("\nUnexpected event:");
7353e992cfSDavid Bright         kev_str = kevent_to_str(&kev);
7453e992cfSDavid Bright         puts(kev_str);
7553e992cfSDavid Bright         free(kev_str);
7695c05062SDavid Bright         errx(1, "%d event(s) pending, but none expected:", nfds);
7795c05062SDavid Bright     }
7895c05062SDavid Bright }
7995c05062SDavid Bright 
80cb5fe245SEnji Cooper /* Retrieve a single kevent */
81cb5fe245SEnji Cooper struct kevent *
kevent_get(int kqfd)82cb5fe245SEnji Cooper kevent_get(int kqfd)
83cb5fe245SEnji Cooper {
84cb5fe245SEnji Cooper     int nfds;
85cb5fe245SEnji Cooper     struct kevent *kev;
86cb5fe245SEnji Cooper 
87cb5fe245SEnji Cooper     if ((kev = calloc(1, sizeof(*kev))) == NULL)
88cb5fe245SEnji Cooper         err(1, "out of memory");
89cb5fe245SEnji Cooper 
90cb5fe245SEnji Cooper     nfds = kevent(kqfd, NULL, 0, kev, 1, NULL);
91cb5fe245SEnji Cooper     if (nfds < 1)
92cb5fe245SEnji Cooper         err(1, "kevent(2)");
93cb5fe245SEnji Cooper 
94cb5fe245SEnji Cooper     return (kev);
95cb5fe245SEnji Cooper }
96cb5fe245SEnji Cooper 
97cb5fe245SEnji Cooper /* Retrieve a single kevent, specifying a maximum time to wait for it. */
98cb5fe245SEnji Cooper struct kevent *
kevent_get_timeout(int kqfd,int seconds)99cb5fe245SEnji Cooper kevent_get_timeout(int kqfd, int seconds)
100cb5fe245SEnji Cooper {
101cb5fe245SEnji Cooper     int nfds;
102cb5fe245SEnji Cooper     struct kevent *kev;
103cb5fe245SEnji Cooper     struct timespec timeout = {seconds, 0};
104cb5fe245SEnji Cooper 
105cb5fe245SEnji Cooper     if ((kev = calloc(1, sizeof(*kev))) == NULL)
106cb5fe245SEnji Cooper         err(1, "out of memory");
107cb5fe245SEnji Cooper 
108cb5fe245SEnji Cooper     nfds = kevent(kqfd, NULL, 0, kev, 1, &timeout);
109cb5fe245SEnji Cooper     if (nfds < 0) {
110cb5fe245SEnji Cooper         err(1, "kevent(2)");
111cb5fe245SEnji Cooper     } else if (nfds == 0) {
112cb5fe245SEnji Cooper         free(kev);
113cb5fe245SEnji Cooper         kev = NULL;
114cb5fe245SEnji Cooper     }
115cb5fe245SEnji Cooper 
116cb5fe245SEnji Cooper     return (kev);
117cb5fe245SEnji Cooper }
118cb5fe245SEnji Cooper 
119cb5fe245SEnji Cooper char *
kevent_fflags_dump(struct kevent * kev)120cb5fe245SEnji Cooper kevent_fflags_dump(struct kevent *kev)
121cb5fe245SEnji Cooper {
122cb5fe245SEnji Cooper     char *buf;
123cb5fe245SEnji Cooper 
124cb5fe245SEnji Cooper #define KEVFFL_DUMP(attrib) \
125cb5fe245SEnji Cooper     if (kev->fflags & attrib) \
126cb5fe245SEnji Cooper         strncat(buf, #attrib" ", 64);
127cb5fe245SEnji Cooper 
128cb5fe245SEnji Cooper     if ((buf = calloc(1, 1024)) == NULL)
129cb5fe245SEnji Cooper         abort();
130cb5fe245SEnji Cooper 
131cb5fe245SEnji Cooper     /* Not every filter has meaningful fflags */
132cb5fe245SEnji Cooper     if (kev->filter == EVFILT_PROC) {
133cb5fe245SEnji Cooper         snprintf(buf, 1024, "fflags = %x (", kev->fflags);
134cb5fe245SEnji Cooper         KEVFFL_DUMP(NOTE_EXIT);
135cb5fe245SEnji Cooper         KEVFFL_DUMP(NOTE_FORK);
136cb5fe245SEnji Cooper         KEVFFL_DUMP(NOTE_EXEC);
137cb5fe245SEnji Cooper         KEVFFL_DUMP(NOTE_CHILD);
138cb5fe245SEnji Cooper         KEVFFL_DUMP(NOTE_TRACKERR);
139cb5fe245SEnji Cooper         KEVFFL_DUMP(NOTE_TRACK);
140cb5fe245SEnji Cooper         buf[strlen(buf) - 1] = ')';
141cb5fe245SEnji Cooper     } else if (kev->filter == EVFILT_PROCDESC) {
142cb5fe245SEnji Cooper         snprintf(buf, 1024, "fflags = %x (", kev->fflags);
143cb5fe245SEnji Cooper         KEVFFL_DUMP(NOTE_EXIT);
144cb5fe245SEnji Cooper         KEVFFL_DUMP(NOTE_FORK);
145cb5fe245SEnji Cooper         KEVFFL_DUMP(NOTE_EXEC);
146cb5fe245SEnji Cooper         buf[strlen(buf) - 1] = ')';
147cb5fe245SEnji Cooper     } else if (kev->filter == EVFILT_VNODE) {
148cb5fe245SEnji Cooper         snprintf(buf, 1024, "fflags = %x (", kev->fflags);
149cb5fe245SEnji Cooper         KEVFFL_DUMP(NOTE_DELETE);
150cb5fe245SEnji Cooper         KEVFFL_DUMP(NOTE_WRITE);
151cb5fe245SEnji Cooper         KEVFFL_DUMP(NOTE_EXTEND);
152cb5fe245SEnji Cooper #if HAVE_NOTE_TRUNCATE
153cb5fe245SEnji Cooper         KEVFFL_DUMP(NOTE_TRUNCATE);
154cb5fe245SEnji Cooper #endif
155cb5fe245SEnji Cooper         KEVFFL_DUMP(NOTE_ATTRIB);
156cb5fe245SEnji Cooper         KEVFFL_DUMP(NOTE_LINK);
157cb5fe245SEnji Cooper         KEVFFL_DUMP(NOTE_RENAME);
158cb5fe245SEnji Cooper #if HAVE_NOTE_REVOKE
159cb5fe245SEnji Cooper         KEVFFL_DUMP(NOTE_REVOKE);
160cb5fe245SEnji Cooper #endif
161cb5fe245SEnji Cooper         buf[strlen(buf) - 1] = ')';
162cb5fe245SEnji Cooper     } else {
163cb5fe245SEnji Cooper         snprintf(buf, 1024, "fflags = %x", kev->fflags);
164cb5fe245SEnji Cooper     }
165cb5fe245SEnji Cooper 
166cb5fe245SEnji Cooper     return (buf);
167cb5fe245SEnji Cooper }
168cb5fe245SEnji Cooper 
169cb5fe245SEnji Cooper char *
kevent_flags_dump(struct kevent * kev)170cb5fe245SEnji Cooper kevent_flags_dump(struct kevent *kev)
171cb5fe245SEnji Cooper {
172cb5fe245SEnji Cooper     char *buf;
173cb5fe245SEnji Cooper 
174cb5fe245SEnji Cooper #define KEVFL_DUMP(attrib) \
175cb5fe245SEnji Cooper     if (kev->flags & attrib) \
176cb5fe245SEnji Cooper         strncat(buf, #attrib" ", 64);
177cb5fe245SEnji Cooper 
178cb5fe245SEnji Cooper     if ((buf = calloc(1, 1024)) == NULL)
179cb5fe245SEnji Cooper         abort();
180cb5fe245SEnji Cooper 
181cb5fe245SEnji Cooper     snprintf(buf, 1024, "flags = %d (", kev->flags);
182cb5fe245SEnji Cooper     KEVFL_DUMP(EV_ADD);
183cb5fe245SEnji Cooper     KEVFL_DUMP(EV_ENABLE);
184cb5fe245SEnji Cooper     KEVFL_DUMP(EV_DISABLE);
185cb5fe245SEnji Cooper     KEVFL_DUMP(EV_DELETE);
186cb5fe245SEnji Cooper     KEVFL_DUMP(EV_ONESHOT);
187cb5fe245SEnji Cooper     KEVFL_DUMP(EV_CLEAR);
188cb5fe245SEnji Cooper     KEVFL_DUMP(EV_EOF);
189cb5fe245SEnji Cooper     KEVFL_DUMP(EV_ERROR);
190cb5fe245SEnji Cooper #if HAVE_EV_DISPATCH
191cb5fe245SEnji Cooper     KEVFL_DUMP(EV_DISPATCH);
192cb5fe245SEnji Cooper #endif
193cb5fe245SEnji Cooper #if HAVE_EV_RECEIPT
194cb5fe245SEnji Cooper     KEVFL_DUMP(EV_RECEIPT);
195cb5fe245SEnji Cooper #endif
196cb5fe245SEnji Cooper     buf[strlen(buf) - 1] = ')';
197cb5fe245SEnji Cooper 
198cb5fe245SEnji Cooper     return (buf);
199cb5fe245SEnji Cooper }
200cb5fe245SEnji Cooper 
201cb5fe245SEnji Cooper /* Copied from ../kevent.c kevent_dump() and improved */
20253e992cfSDavid Bright char *
kevent_to_str(struct kevent * kev)203cb5fe245SEnji Cooper kevent_to_str(struct kevent *kev)
204cb5fe245SEnji Cooper {
205cb5fe245SEnji Cooper     char buf[512];
20653e992cfSDavid Bright     char *flags_str = kevent_flags_dump(kev);
20753e992cfSDavid Bright     char *fflags_str = kevent_fflags_dump(kev);
208cb5fe245SEnji Cooper 
209cb5fe245SEnji Cooper     snprintf(&buf[0], sizeof(buf),
2102b34e843SKonstantin Belousov             "[ident=%ju, filter=%d, %s, %s, data=%jd, udata=%p, "
2112b34e843SKonstantin Belousov             "ext=[%jx %jx %jx %jx]",
2122b34e843SKonstantin Belousov             (uintmax_t) kev->ident,
213cb5fe245SEnji Cooper             kev->filter,
21453e992cfSDavid Bright             flags_str,
21553e992cfSDavid Bright             fflags_str,
2162b34e843SKonstantin Belousov             (uintmax_t)kev->data,
2172b34e843SKonstantin Belousov             kev->udata,
2182b34e843SKonstantin Belousov             (uintmax_t)kev->ext[0],
2192b34e843SKonstantin Belousov             (uintmax_t)kev->ext[1],
2202b34e843SKonstantin Belousov             (uintmax_t)kev->ext[2],
2212b34e843SKonstantin Belousov             (uintmax_t)kev->ext[3]);
222cb5fe245SEnji Cooper 
22353e992cfSDavid Bright     free(flags_str);
22453e992cfSDavid Bright     free(fflags_str);
22553e992cfSDavid Bright 
226cb5fe245SEnji Cooper     return (strdup(buf));
227cb5fe245SEnji Cooper }
228cb5fe245SEnji Cooper 
229cb5fe245SEnji Cooper void
kevent_add(int kqfd,struct kevent * kev,uintptr_t ident,short filter,u_short flags,u_int fflags,intptr_t data,void * udata)230cb5fe245SEnji Cooper kevent_add(int kqfd, struct kevent *kev,
231cb5fe245SEnji Cooper         uintptr_t ident,
232cb5fe245SEnji Cooper         short     filter,
233cb5fe245SEnji Cooper         u_short   flags,
234cb5fe245SEnji Cooper         u_int     fflags,
235cb5fe245SEnji Cooper         intptr_t  data,
236cb5fe245SEnji Cooper         void      *udata)
237cb5fe245SEnji Cooper {
238*45bed28cSDavid Bright     char *kev_str;
239*45bed28cSDavid Bright 
240cb5fe245SEnji Cooper     EV_SET(kev, ident, filter, flags, fflags, data, NULL);
241cb5fe245SEnji Cooper     if (kevent(kqfd, kev, 1, NULL, 0, NULL) < 0) {
242*45bed28cSDavid Bright         kev_str = kevent_to_str(kev);
243cb5fe245SEnji Cooper         printf("Unable to add the following kevent:\n%s\n",
244*45bed28cSDavid Bright                 kev_str);
245*45bed28cSDavid Bright         free(kev_str);
246cb5fe245SEnji Cooper         err(1, "kevent(): %s", strerror(errno));
247cb5fe245SEnji Cooper     }
248cb5fe245SEnji Cooper }
249cb5fe245SEnji Cooper 
250cb5fe245SEnji Cooper void
kevent_cmp(struct kevent * k1,struct kevent * k2)251cb5fe245SEnji Cooper kevent_cmp(struct kevent *k1, struct kevent *k2)
252cb5fe245SEnji Cooper {
253*45bed28cSDavid Bright     char *kev1_str;
254*45bed28cSDavid Bright     char *kev2_str;
255*45bed28cSDavid Bright 
256cb5fe245SEnji Cooper /* XXX-
257cb5fe245SEnji Cooper    Workaround for inconsistent implementation of kevent(2)
258cb5fe245SEnji Cooper  */
259cb5fe245SEnji Cooper #ifdef __FreeBSD__
260cb5fe245SEnji Cooper     if (k1->flags & EV_ADD)
261cb5fe245SEnji Cooper         k2->flags |= EV_ADD;
262cb5fe245SEnji Cooper #endif
2632b34e843SKonstantin Belousov     if (k1->ident != k2->ident || k1->filter != k2->filter ||
2642b34e843SKonstantin Belousov       k1->flags != k2->flags || k1->fflags != k2->fflags ||
2652b34e843SKonstantin Belousov       k1->data != k2->data || k1->udata != k2->udata ||
2662b34e843SKonstantin Belousov       k1->ext[0] != k2->ext[0] || k1->ext[1] != k2->ext[1] ||
2672b34e843SKonstantin Belousov       k1->ext[0] != k2->ext[2] || k1->ext[0] != k2->ext[3]) {
268*45bed28cSDavid Bright         kev1_str = kevent_to_str(k1);
269*45bed28cSDavid Bright         kev2_str = kevent_to_str(k2);
270cb5fe245SEnji Cooper         printf("kevent_cmp: mismatch:\n  %s !=\n  %s\n",
271*45bed28cSDavid Bright                kev1_str, kev2_str);
272*45bed28cSDavid Bright         free(kev1_str);
273*45bed28cSDavid Bright         free(kev2_str);
274cb5fe245SEnji Cooper         abort();
275cb5fe245SEnji Cooper     }
276cb5fe245SEnji Cooper }
277cb5fe245SEnji Cooper 
278cb5fe245SEnji Cooper void
test_begin(const char * func)279cb5fe245SEnji Cooper test_begin(const char *func)
280cb5fe245SEnji Cooper {
281cb5fe245SEnji Cooper     if (cur_test_id)
282cb5fe245SEnji Cooper         free(cur_test_id);
283cb5fe245SEnji Cooper     cur_test_id = strdup(func);
284cb5fe245SEnji Cooper     if (!cur_test_id)
285cb5fe245SEnji Cooper         err(1, "strdup failed");
286cb5fe245SEnji Cooper 
287cb5fe245SEnji Cooper     printf("\n\nTest %d: %s\n", testnum++, func);
288cb5fe245SEnji Cooper }
289cb5fe245SEnji Cooper 
290cb5fe245SEnji Cooper void
success(void)291cb5fe245SEnji Cooper success(void)
292cb5fe245SEnji Cooper {
293cb5fe245SEnji Cooper     printf("%-70s %s\n", cur_test_id, "passed");
294cb5fe245SEnji Cooper     free(cur_test_id);
295cb5fe245SEnji Cooper     cur_test_id = NULL;
296cb5fe245SEnji Cooper }
297cb5fe245SEnji Cooper 
298cb5fe245SEnji Cooper void
test_kqueue(void)299cb5fe245SEnji Cooper test_kqueue(void)
300cb5fe245SEnji Cooper {
301cb5fe245SEnji Cooper     test_begin("kqueue()");
302cb5fe245SEnji Cooper     if ((kqfd = kqueue()) < 0)
303cb5fe245SEnji Cooper         err(1, "kqueue()");
304cb5fe245SEnji Cooper     test_no_kevents();
305cb5fe245SEnji Cooper     success();
306cb5fe245SEnji Cooper }
307cb5fe245SEnji Cooper 
308cb5fe245SEnji Cooper void
test_kqueue_close(void)309cb5fe245SEnji Cooper test_kqueue_close(void)
310cb5fe245SEnji Cooper {
311cb5fe245SEnji Cooper     test_begin("close(kq)");
312cb5fe245SEnji Cooper     if (close(kqfd) < 0)
313cb5fe245SEnji Cooper         err(1, "close()");
314cb5fe245SEnji Cooper     success();
315cb5fe245SEnji Cooper }
316cb5fe245SEnji Cooper 
317cb5fe245SEnji Cooper int
main(int argc,char ** argv)318cb5fe245SEnji Cooper main(int argc, char **argv)
319cb5fe245SEnji Cooper {
320cb5fe245SEnji Cooper     int test_proc = 1;
321cb5fe245SEnji Cooper     int test_socket = 1;
322cb5fe245SEnji Cooper     int test_signal = 1;
323cb5fe245SEnji Cooper     int test_vnode = 1;
324cb5fe245SEnji Cooper     int test_timer = 1;
325cb5fe245SEnji Cooper #ifdef __FreeBSD__
326cb5fe245SEnji Cooper     int test_user = 1;
327cb5fe245SEnji Cooper #else
328cb5fe245SEnji Cooper     /* XXX-FIXME temporary */
329cb5fe245SEnji Cooper     int test_user = 0;
330cb5fe245SEnji Cooper #endif
331cb5fe245SEnji Cooper 
332cb5fe245SEnji Cooper     while (argc) {
333cb5fe245SEnji Cooper         if (strcmp(argv[0], "--no-proc") == 0)
334cb5fe245SEnji Cooper             test_proc = 0;
335cb5fe245SEnji Cooper         if (strcmp(argv[0], "--no-socket") == 0)
336cb5fe245SEnji Cooper             test_socket = 0;
337cb5fe245SEnji Cooper         if (strcmp(argv[0], "--no-timer") == 0)
338cb5fe245SEnji Cooper             test_timer = 0;
339cb5fe245SEnji Cooper         if (strcmp(argv[0], "--no-signal") == 0)
340cb5fe245SEnji Cooper             test_signal = 0;
341cb5fe245SEnji Cooper         if (strcmp(argv[0], "--no-vnode") == 0)
342cb5fe245SEnji Cooper             test_vnode = 0;
343cb5fe245SEnji Cooper         if (strcmp(argv[0], "--no-user") == 0)
344cb5fe245SEnji Cooper             test_user = 0;
345cb5fe245SEnji Cooper         argv++;
346cb5fe245SEnji Cooper         argc--;
347cb5fe245SEnji Cooper     }
348cb5fe245SEnji Cooper 
349cb5fe245SEnji Cooper     /*
350cb5fe245SEnji Cooper      * Some tests fork.  If output is fully buffered,
351cb5fe245SEnji Cooper      * the children inherit some buffered data and flush
352cb5fe245SEnji Cooper      * it when they exit, causing some data to be printed twice.
353cb5fe245SEnji Cooper      * Use line buffering to avoid this problem.
354cb5fe245SEnji Cooper      */
355cb5fe245SEnji Cooper     setlinebuf(stdout);
356cb5fe245SEnji Cooper     setlinebuf(stderr);
357cb5fe245SEnji Cooper 
358cb5fe245SEnji Cooper     test_kqueue();
359cb5fe245SEnji Cooper     test_kqueue_close();
360cb5fe245SEnji Cooper 
361cb5fe245SEnji Cooper     if (test_socket)
362cb5fe245SEnji Cooper         test_evfilt_read();
363cb5fe245SEnji Cooper     if (test_signal)
364cb5fe245SEnji Cooper         test_evfilt_signal();
365cb5fe245SEnji Cooper     if (test_vnode)
366cb5fe245SEnji Cooper         test_evfilt_vnode();
367cb5fe245SEnji Cooper #if HAVE_EVFILT_USER
368cb5fe245SEnji Cooper     if (test_user)
369cb5fe245SEnji Cooper         test_evfilt_user();
370cb5fe245SEnji Cooper #endif
371cb5fe245SEnji Cooper     if (test_timer)
372cb5fe245SEnji Cooper         test_evfilt_timer();
373cb5fe245SEnji Cooper     if (test_proc)
374cb5fe245SEnji Cooper         test_evfilt_proc();
375cb5fe245SEnji Cooper 
376cb5fe245SEnji Cooper     printf("\n---\n"
377cb5fe245SEnji Cooper             "+OK All %d tests completed.\n", testnum - 1);
378cb5fe245SEnji Cooper     return (0);
379cb5fe245SEnji Cooper }
380