1200483Srwatson/*
2200483Srwatson * Copyright (c) 2009 Mark Heily <mark@heily.com>
3200483Srwatson *
4200483Srwatson * Permission to use, copy, modify, and distribute this software for any
5200483Srwatson * purpose with or without fee is hereby granted, provided that the above
6200483Srwatson * copyright notice and this permission notice appear in all copies.
7200483Srwatson *
8200483Srwatson * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9200483Srwatson * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10200483Srwatson * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11200483Srwatson * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12200483Srwatson * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13200483Srwatson * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14200483Srwatson * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15200483Srwatson *
16200483Srwatson * $FreeBSD: stable/10/tests/sys/kqueue/libkqueue/timer.c 305467 2016-09-06 08:45:29Z ngie $
17200483Srwatson */
18200483Srwatson
19200483Srwatson#include "common.h"
20200483Srwatson
21200483Srwatsonint kqfd;
22200483Srwatson
23200483Srwatsonvoid
24200483Srwatsontest_kevent_timer_add(void)
25200483Srwatson{
26200483Srwatson    const char *test_id = "kevent(EVFILT_TIMER, EV_ADD)";
27200483Srwatson    struct kevent kev;
28200483Srwatson
29200483Srwatson    test_begin(test_id);
30200483Srwatson
31200483Srwatson    EV_SET(&kev, 1, EVFILT_TIMER, EV_ADD, 0, 1000, NULL);
32200483Srwatson    if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
33200483Srwatson        err(1, "%s", test_id);
34200483Srwatson
35200483Srwatson    success();
36200483Srwatson}
37200483Srwatson
38200483Srwatsonvoid
39200483Srwatsontest_kevent_timer_del(void)
40200483Srwatson{
41200483Srwatson    const char *test_id = "kevent(EVFILT_TIMER, EV_DELETE)";
42200483Srwatson    struct kevent kev;
43200483Srwatson
44200483Srwatson    test_begin(test_id);
45200483Srwatson
46200483Srwatson    EV_SET(&kev, 1, EVFILT_TIMER, EV_DELETE, 0, 0, NULL);
47200483Srwatson    if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
48200483Srwatson        err(1, "%s", test_id);
49200483Srwatson
50200483Srwatson    test_no_kevents();
51200483Srwatson
52200483Srwatson    success();
53200483Srwatson}
54200483Srwatson
55200483Srwatsonvoid
56200483Srwatsontest_kevent_timer_get(void)
57200483Srwatson{
58200483Srwatson    const char *test_id = "kevent(EVFILT_TIMER, wait)";
59200483Srwatson    struct kevent kev;
60200483Srwatson
61200483Srwatson    test_begin(test_id);
62200483Srwatson
63200483Srwatson    EV_SET(&kev, 1, EVFILT_TIMER, EV_ADD, 0, 1000, NULL);
64200483Srwatson    if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
65200483Srwatson        err(1, "%s", test_id);
66200483Srwatson
67200483Srwatson    kev.flags |= EV_CLEAR;
68200483Srwatson    kev.data = 1;
69200483Srwatson    kevent_cmp(&kev, kevent_get(kqfd));
70200483Srwatson
71200483Srwatson    EV_SET(&kev, 1, EVFILT_TIMER, EV_DELETE, 0, 0, NULL);
72200483Srwatson    if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
73200483Srwatson        err(1, "%s", test_id);
74200483Srwatson
75200483Srwatson    success();
76200483Srwatson}
77200483Srwatson
78200483Srwatsonstatic void
79200483Srwatsontest_oneshot(void)
80200483Srwatson{
81200483Srwatson    const char *test_id = "kevent(EVFILT_TIMER, EV_ONESHOT)";
82200483Srwatson    struct kevent kev;
83200483Srwatson
84200483Srwatson    test_begin(test_id);
85200483Srwatson
86200483Srwatson    test_no_kevents();
87200483Srwatson
88200483Srwatson    EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD | EV_ONESHOT, 0, 500,NULL);
89200483Srwatson    if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
90200483Srwatson        err(1, "%s", test_id);
91200483Srwatson
92200483Srwatson    /* Retrieve the event */
93200483Srwatson    kev.flags = EV_ADD | EV_CLEAR | EV_ONESHOT;
94200483Srwatson    kev.data = 1;
95200483Srwatson    kevent_cmp(&kev, kevent_get(kqfd));
96200483Srwatson
97200483Srwatson    /* Check if the event occurs again */
98200483Srwatson    sleep(3);
99200483Srwatson    test_no_kevents();
100200483Srwatson
101200483Srwatson
102200483Srwatson    success();
103200483Srwatson}
104200483Srwatson
105200483Srwatsonstatic void
106200483Srwatsontest_periodic(void)
107200483Srwatson{
108200483Srwatson    const char *test_id = "kevent(EVFILT_TIMER, periodic)";
109200483Srwatson    struct kevent kev;
110200483Srwatson
111200483Srwatson    test_begin(test_id);
112200483Srwatson
113200483Srwatson    test_no_kevents();
114200483Srwatson
115200483Srwatson    EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD, 0, 1000,NULL);
116200483Srwatson    if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
117200483Srwatson        err(1, "%s", test_id);
118200483Srwatson
119200483Srwatson    /* Retrieve the event */
120200483Srwatson    kev.flags = EV_ADD | EV_CLEAR;
121200483Srwatson    kev.data = 1;
122200483Srwatson    kevent_cmp(&kev, kevent_get(kqfd));
123200483Srwatson
124200483Srwatson    /* Check if the event occurs again */
125200483Srwatson    sleep(1);
126200483Srwatson    kevent_cmp(&kev, kevent_get(kqfd));
127200483Srwatson
128200483Srwatson    /* Delete the event */
129200483Srwatson    kev.flags = EV_DELETE;
130200483Srwatson    if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
131200483Srwatson        err(1, "%s", test_id);
132200483Srwatson
133200483Srwatson    success();
134200483Srwatson}
135200483Srwatson
136200483Srwatsonstatic void
137200483Srwatsondisable_and_enable(void)
138200483Srwatson{
139200483Srwatson    const char *test_id = "kevent(EVFILT_TIMER, EV_DISABLE and EV_ENABLE)";
140200483Srwatson    struct kevent kev;
141200483Srwatson
142200483Srwatson    test_begin(test_id);
143200483Srwatson
144200483Srwatson    test_no_kevents();
145200483Srwatson
146200483Srwatson    /* Add the watch and immediately disable it */
147200483Srwatson    EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD | EV_ONESHOT, 0, 2000,NULL);
148200483Srwatson    if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
149200483Srwatson        err(1, "%s", test_id);
150200483Srwatson    kev.flags = EV_DISABLE;
151200483Srwatson    if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
152200483Srwatson        err(1, "%s", test_id);
153200483Srwatson    test_no_kevents();
154200483Srwatson
155200483Srwatson    /* Re-enable and check again */
156200483Srwatson    kev.flags = EV_ENABLE;
157200483Srwatson    if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
158200483Srwatson        err(1, "%s", test_id);
159200483Srwatson
160200483Srwatson    kev.flags = EV_ADD | EV_CLEAR | EV_ONESHOT;
161200483Srwatson    kev.data = 1;
162200483Srwatson    kevent_cmp(&kev, kevent_get(kqfd));
163200483Srwatson
164200483Srwatson    success();
165200483Srwatson}
166200483Srwatson
167200483Srwatsonvoid
168200483Srwatsontest_evfilt_timer()
169200483Srwatson{
170200483Srwatson	kqfd = kqueue();
171200483Srwatson    test_kevent_timer_add();
172200483Srwatson    test_kevent_timer_del();
173200483Srwatson    test_kevent_timer_get();
174200483Srwatson    test_oneshot();
175200483Srwatson    test_periodic();
176200483Srwatson    disable_and_enable();
177200483Srwatson	close(kqfd);
178200483Srwatson}
179