1*6777b538SAndroid Build Coastguard Worker /*
2*6777b538SAndroid Build Coastguard Worker * Copyright (c) 2003, 2004 Niels Provos <[email protected]>
3*6777b538SAndroid Build Coastguard Worker * All rights reserved.
4*6777b538SAndroid Build Coastguard Worker *
5*6777b538SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
6*6777b538SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions
7*6777b538SAndroid Build Coastguard Worker * are met:
8*6777b538SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright
9*6777b538SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer.
10*6777b538SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright
11*6777b538SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the
12*6777b538SAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution.
13*6777b538SAndroid Build Coastguard Worker * 3. The name of the author may not be used to endorse or promote products
14*6777b538SAndroid Build Coastguard Worker * derived from this software without specific prior written permission.
15*6777b538SAndroid Build Coastguard Worker *
16*6777b538SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17*6777b538SAndroid Build Coastguard Worker * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18*6777b538SAndroid Build Coastguard Worker * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19*6777b538SAndroid Build Coastguard Worker * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20*6777b538SAndroid Build Coastguard Worker * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21*6777b538SAndroid Build Coastguard Worker * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22*6777b538SAndroid Build Coastguard Worker * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23*6777b538SAndroid Build Coastguard Worker * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24*6777b538SAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25*6777b538SAndroid Build Coastguard Worker * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*6777b538SAndroid Build Coastguard Worker */
27*6777b538SAndroid Build Coastguard Worker
28*6777b538SAndroid Build Coastguard Worker #ifdef WIN32
29*6777b538SAndroid Build Coastguard Worker #include <winsock2.h>
30*6777b538SAndroid Build Coastguard Worker #include <windows.h>
31*6777b538SAndroid Build Coastguard Worker #endif
32*6777b538SAndroid Build Coastguard Worker
33*6777b538SAndroid Build Coastguard Worker #ifdef HAVE_CONFIG_H
34*6777b538SAndroid Build Coastguard Worker #include "config.h"
35*6777b538SAndroid Build Coastguard Worker #endif
36*6777b538SAndroid Build Coastguard Worker
37*6777b538SAndroid Build Coastguard Worker #include <sys/types.h>
38*6777b538SAndroid Build Coastguard Worker #include <sys/stat.h>
39*6777b538SAndroid Build Coastguard Worker #ifdef HAVE_SYS_TIME_H
40*6777b538SAndroid Build Coastguard Worker #include <sys/time.h>
41*6777b538SAndroid Build Coastguard Worker #endif
42*6777b538SAndroid Build Coastguard Worker #include <sys/queue.h>
43*6777b538SAndroid Build Coastguard Worker #ifndef WIN32
44*6777b538SAndroid Build Coastguard Worker #include <sys/socket.h>
45*6777b538SAndroid Build Coastguard Worker #include <sys/wait.h>
46*6777b538SAndroid Build Coastguard Worker #include <signal.h>
47*6777b538SAndroid Build Coastguard Worker #include <unistd.h>
48*6777b538SAndroid Build Coastguard Worker #include <netdb.h>
49*6777b538SAndroid Build Coastguard Worker #endif
50*6777b538SAndroid Build Coastguard Worker #include <assert.h>
51*6777b538SAndroid Build Coastguard Worker #include <fcntl.h>
52*6777b538SAndroid Build Coastguard Worker #include <signal.h>
53*6777b538SAndroid Build Coastguard Worker #include <stdlib.h>
54*6777b538SAndroid Build Coastguard Worker #include <stdio.h>
55*6777b538SAndroid Build Coastguard Worker #include <string.h>
56*6777b538SAndroid Build Coastguard Worker #include <errno.h>
57*6777b538SAndroid Build Coastguard Worker
58*6777b538SAndroid Build Coastguard Worker #include "event.h"
59*6777b538SAndroid Build Coastguard Worker #include "evutil.h"
60*6777b538SAndroid Build Coastguard Worker #include "event-internal.h"
61*6777b538SAndroid Build Coastguard Worker #include "log.h"
62*6777b538SAndroid Build Coastguard Worker
63*6777b538SAndroid Build Coastguard Worker #include "regress.h"
64*6777b538SAndroid Build Coastguard Worker #ifndef WIN32
65*6777b538SAndroid Build Coastguard Worker #include "regress.gen.h"
66*6777b538SAndroid Build Coastguard Worker #endif
67*6777b538SAndroid Build Coastguard Worker
68*6777b538SAndroid Build Coastguard Worker int pair[2];
69*6777b538SAndroid Build Coastguard Worker int test_ok;
70*6777b538SAndroid Build Coastguard Worker static int called;
71*6777b538SAndroid Build Coastguard Worker static char wbuf[4096];
72*6777b538SAndroid Build Coastguard Worker static char rbuf[4096];
73*6777b538SAndroid Build Coastguard Worker static int woff;
74*6777b538SAndroid Build Coastguard Worker static int roff;
75*6777b538SAndroid Build Coastguard Worker static int usepersist;
76*6777b538SAndroid Build Coastguard Worker static struct timeval tset;
77*6777b538SAndroid Build Coastguard Worker static struct timeval tcalled;
78*6777b538SAndroid Build Coastguard Worker static struct event_base *global_base;
79*6777b538SAndroid Build Coastguard Worker
80*6777b538SAndroid Build Coastguard Worker #define TEST1 "this is a test"
81*6777b538SAndroid Build Coastguard Worker #define SECONDS 1
82*6777b538SAndroid Build Coastguard Worker
83*6777b538SAndroid Build Coastguard Worker #ifndef SHUT_WR
84*6777b538SAndroid Build Coastguard Worker #define SHUT_WR 1
85*6777b538SAndroid Build Coastguard Worker #endif
86*6777b538SAndroid Build Coastguard Worker
87*6777b538SAndroid Build Coastguard Worker #ifdef WIN32
88*6777b538SAndroid Build Coastguard Worker #define write(fd,buf,len) send((fd),(buf),(len),0)
89*6777b538SAndroid Build Coastguard Worker #define read(fd,buf,len) recv((fd),(buf),(len),0)
90*6777b538SAndroid Build Coastguard Worker #endif
91*6777b538SAndroid Build Coastguard Worker
92*6777b538SAndroid Build Coastguard Worker static void
simple_read_cb(int fd,short event,void * arg)93*6777b538SAndroid Build Coastguard Worker simple_read_cb(int fd, short event, void *arg)
94*6777b538SAndroid Build Coastguard Worker {
95*6777b538SAndroid Build Coastguard Worker char buf[256];
96*6777b538SAndroid Build Coastguard Worker int len;
97*6777b538SAndroid Build Coastguard Worker
98*6777b538SAndroid Build Coastguard Worker if (arg == NULL)
99*6777b538SAndroid Build Coastguard Worker return;
100*6777b538SAndroid Build Coastguard Worker
101*6777b538SAndroid Build Coastguard Worker len = read(fd, buf, sizeof(buf));
102*6777b538SAndroid Build Coastguard Worker
103*6777b538SAndroid Build Coastguard Worker if (len) {
104*6777b538SAndroid Build Coastguard Worker if (!called) {
105*6777b538SAndroid Build Coastguard Worker if (event_add(arg, NULL) == -1)
106*6777b538SAndroid Build Coastguard Worker exit(1);
107*6777b538SAndroid Build Coastguard Worker }
108*6777b538SAndroid Build Coastguard Worker } else if (called == 1)
109*6777b538SAndroid Build Coastguard Worker test_ok = 1;
110*6777b538SAndroid Build Coastguard Worker
111*6777b538SAndroid Build Coastguard Worker called++;
112*6777b538SAndroid Build Coastguard Worker }
113*6777b538SAndroid Build Coastguard Worker
114*6777b538SAndroid Build Coastguard Worker static void
simple_write_cb(int fd,short event,void * arg)115*6777b538SAndroid Build Coastguard Worker simple_write_cb(int fd, short event, void *arg)
116*6777b538SAndroid Build Coastguard Worker {
117*6777b538SAndroid Build Coastguard Worker int len;
118*6777b538SAndroid Build Coastguard Worker
119*6777b538SAndroid Build Coastguard Worker if (arg == NULL)
120*6777b538SAndroid Build Coastguard Worker return;
121*6777b538SAndroid Build Coastguard Worker
122*6777b538SAndroid Build Coastguard Worker len = write(fd, TEST1, strlen(TEST1) + 1);
123*6777b538SAndroid Build Coastguard Worker if (len == -1)
124*6777b538SAndroid Build Coastguard Worker test_ok = 0;
125*6777b538SAndroid Build Coastguard Worker else
126*6777b538SAndroid Build Coastguard Worker test_ok = 1;
127*6777b538SAndroid Build Coastguard Worker }
128*6777b538SAndroid Build Coastguard Worker
129*6777b538SAndroid Build Coastguard Worker static void
multiple_write_cb(int fd,short event,void * arg)130*6777b538SAndroid Build Coastguard Worker multiple_write_cb(int fd, short event, void *arg)
131*6777b538SAndroid Build Coastguard Worker {
132*6777b538SAndroid Build Coastguard Worker struct event *ev = arg;
133*6777b538SAndroid Build Coastguard Worker int len;
134*6777b538SAndroid Build Coastguard Worker
135*6777b538SAndroid Build Coastguard Worker len = 128;
136*6777b538SAndroid Build Coastguard Worker if (woff + len >= sizeof(wbuf))
137*6777b538SAndroid Build Coastguard Worker len = sizeof(wbuf) - woff;
138*6777b538SAndroid Build Coastguard Worker
139*6777b538SAndroid Build Coastguard Worker len = write(fd, wbuf + woff, len);
140*6777b538SAndroid Build Coastguard Worker if (len == -1) {
141*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "%s: write\n", __func__);
142*6777b538SAndroid Build Coastguard Worker if (usepersist)
143*6777b538SAndroid Build Coastguard Worker event_del(ev);
144*6777b538SAndroid Build Coastguard Worker return;
145*6777b538SAndroid Build Coastguard Worker }
146*6777b538SAndroid Build Coastguard Worker
147*6777b538SAndroid Build Coastguard Worker woff += len;
148*6777b538SAndroid Build Coastguard Worker
149*6777b538SAndroid Build Coastguard Worker if (woff >= sizeof(wbuf)) {
150*6777b538SAndroid Build Coastguard Worker shutdown(fd, SHUT_WR);
151*6777b538SAndroid Build Coastguard Worker if (usepersist)
152*6777b538SAndroid Build Coastguard Worker event_del(ev);
153*6777b538SAndroid Build Coastguard Worker return;
154*6777b538SAndroid Build Coastguard Worker }
155*6777b538SAndroid Build Coastguard Worker
156*6777b538SAndroid Build Coastguard Worker if (!usepersist) {
157*6777b538SAndroid Build Coastguard Worker if (event_add(ev, NULL) == -1)
158*6777b538SAndroid Build Coastguard Worker exit(1);
159*6777b538SAndroid Build Coastguard Worker }
160*6777b538SAndroid Build Coastguard Worker }
161*6777b538SAndroid Build Coastguard Worker
162*6777b538SAndroid Build Coastguard Worker static void
multiple_read_cb(int fd,short event,void * arg)163*6777b538SAndroid Build Coastguard Worker multiple_read_cb(int fd, short event, void *arg)
164*6777b538SAndroid Build Coastguard Worker {
165*6777b538SAndroid Build Coastguard Worker struct event *ev = arg;
166*6777b538SAndroid Build Coastguard Worker int len;
167*6777b538SAndroid Build Coastguard Worker
168*6777b538SAndroid Build Coastguard Worker len = read(fd, rbuf + roff, sizeof(rbuf) - roff);
169*6777b538SAndroid Build Coastguard Worker if (len == -1)
170*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "%s: read\n", __func__);
171*6777b538SAndroid Build Coastguard Worker if (len <= 0) {
172*6777b538SAndroid Build Coastguard Worker if (usepersist)
173*6777b538SAndroid Build Coastguard Worker event_del(ev);
174*6777b538SAndroid Build Coastguard Worker return;
175*6777b538SAndroid Build Coastguard Worker }
176*6777b538SAndroid Build Coastguard Worker
177*6777b538SAndroid Build Coastguard Worker roff += len;
178*6777b538SAndroid Build Coastguard Worker if (!usepersist) {
179*6777b538SAndroid Build Coastguard Worker if (event_add(ev, NULL) == -1)
180*6777b538SAndroid Build Coastguard Worker exit(1);
181*6777b538SAndroid Build Coastguard Worker }
182*6777b538SAndroid Build Coastguard Worker }
183*6777b538SAndroid Build Coastguard Worker
184*6777b538SAndroid Build Coastguard Worker static void
timeout_cb(int fd,short event,void * arg)185*6777b538SAndroid Build Coastguard Worker timeout_cb(int fd, short event, void *arg)
186*6777b538SAndroid Build Coastguard Worker {
187*6777b538SAndroid Build Coastguard Worker struct timeval tv;
188*6777b538SAndroid Build Coastguard Worker int diff;
189*6777b538SAndroid Build Coastguard Worker
190*6777b538SAndroid Build Coastguard Worker evutil_gettimeofday(&tcalled, NULL);
191*6777b538SAndroid Build Coastguard Worker if (evutil_timercmp(&tcalled, &tset, >))
192*6777b538SAndroid Build Coastguard Worker evutil_timersub(&tcalled, &tset, &tv);
193*6777b538SAndroid Build Coastguard Worker else
194*6777b538SAndroid Build Coastguard Worker evutil_timersub(&tset, &tcalled, &tv);
195*6777b538SAndroid Build Coastguard Worker
196*6777b538SAndroid Build Coastguard Worker diff = tv.tv_sec*1000 + tv.tv_usec/1000 - SECONDS * 1000;
197*6777b538SAndroid Build Coastguard Worker if (diff < 0)
198*6777b538SAndroid Build Coastguard Worker diff = -diff;
199*6777b538SAndroid Build Coastguard Worker
200*6777b538SAndroid Build Coastguard Worker if (diff < 100)
201*6777b538SAndroid Build Coastguard Worker test_ok = 1;
202*6777b538SAndroid Build Coastguard Worker }
203*6777b538SAndroid Build Coastguard Worker
204*6777b538SAndroid Build Coastguard Worker #ifndef WIN32
205*6777b538SAndroid Build Coastguard Worker static void
signal_cb_sa(int sig)206*6777b538SAndroid Build Coastguard Worker signal_cb_sa(int sig)
207*6777b538SAndroid Build Coastguard Worker {
208*6777b538SAndroid Build Coastguard Worker test_ok = 2;
209*6777b538SAndroid Build Coastguard Worker }
210*6777b538SAndroid Build Coastguard Worker
211*6777b538SAndroid Build Coastguard Worker static void
signal_cb(int fd,short event,void * arg)212*6777b538SAndroid Build Coastguard Worker signal_cb(int fd, short event, void *arg)
213*6777b538SAndroid Build Coastguard Worker {
214*6777b538SAndroid Build Coastguard Worker struct event *ev = arg;
215*6777b538SAndroid Build Coastguard Worker
216*6777b538SAndroid Build Coastguard Worker signal_del(ev);
217*6777b538SAndroid Build Coastguard Worker test_ok = 1;
218*6777b538SAndroid Build Coastguard Worker }
219*6777b538SAndroid Build Coastguard Worker #endif
220*6777b538SAndroid Build Coastguard Worker
221*6777b538SAndroid Build Coastguard Worker struct both {
222*6777b538SAndroid Build Coastguard Worker struct event ev;
223*6777b538SAndroid Build Coastguard Worker int nread;
224*6777b538SAndroid Build Coastguard Worker };
225*6777b538SAndroid Build Coastguard Worker
226*6777b538SAndroid Build Coastguard Worker static void
combined_read_cb(int fd,short event,void * arg)227*6777b538SAndroid Build Coastguard Worker combined_read_cb(int fd, short event, void *arg)
228*6777b538SAndroid Build Coastguard Worker {
229*6777b538SAndroid Build Coastguard Worker struct both *both = arg;
230*6777b538SAndroid Build Coastguard Worker char buf[128];
231*6777b538SAndroid Build Coastguard Worker int len;
232*6777b538SAndroid Build Coastguard Worker
233*6777b538SAndroid Build Coastguard Worker len = read(fd, buf, sizeof(buf));
234*6777b538SAndroid Build Coastguard Worker if (len == -1)
235*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "%s: read\n", __func__);
236*6777b538SAndroid Build Coastguard Worker if (len <= 0)
237*6777b538SAndroid Build Coastguard Worker return;
238*6777b538SAndroid Build Coastguard Worker
239*6777b538SAndroid Build Coastguard Worker both->nread += len;
240*6777b538SAndroid Build Coastguard Worker if (event_add(&both->ev, NULL) == -1)
241*6777b538SAndroid Build Coastguard Worker exit(1);
242*6777b538SAndroid Build Coastguard Worker }
243*6777b538SAndroid Build Coastguard Worker
244*6777b538SAndroid Build Coastguard Worker static void
combined_write_cb(int fd,short event,void * arg)245*6777b538SAndroid Build Coastguard Worker combined_write_cb(int fd, short event, void *arg)
246*6777b538SAndroid Build Coastguard Worker {
247*6777b538SAndroid Build Coastguard Worker struct both *both = arg;
248*6777b538SAndroid Build Coastguard Worker char buf[128];
249*6777b538SAndroid Build Coastguard Worker int len;
250*6777b538SAndroid Build Coastguard Worker
251*6777b538SAndroid Build Coastguard Worker len = sizeof(buf);
252*6777b538SAndroid Build Coastguard Worker if (len > both->nread)
253*6777b538SAndroid Build Coastguard Worker len = both->nread;
254*6777b538SAndroid Build Coastguard Worker
255*6777b538SAndroid Build Coastguard Worker len = write(fd, buf, len);
256*6777b538SAndroid Build Coastguard Worker if (len == -1)
257*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "%s: write\n", __func__);
258*6777b538SAndroid Build Coastguard Worker if (len <= 0) {
259*6777b538SAndroid Build Coastguard Worker shutdown(fd, SHUT_WR);
260*6777b538SAndroid Build Coastguard Worker return;
261*6777b538SAndroid Build Coastguard Worker }
262*6777b538SAndroid Build Coastguard Worker
263*6777b538SAndroid Build Coastguard Worker both->nread -= len;
264*6777b538SAndroid Build Coastguard Worker if (event_add(&both->ev, NULL) == -1)
265*6777b538SAndroid Build Coastguard Worker exit(1);
266*6777b538SAndroid Build Coastguard Worker }
267*6777b538SAndroid Build Coastguard Worker
268*6777b538SAndroid Build Coastguard Worker /* Test infrastructure */
269*6777b538SAndroid Build Coastguard Worker
270*6777b538SAndroid Build Coastguard Worker static int
setup_test(const char * name)271*6777b538SAndroid Build Coastguard Worker setup_test(const char *name)
272*6777b538SAndroid Build Coastguard Worker {
273*6777b538SAndroid Build Coastguard Worker
274*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "%s", name);
275*6777b538SAndroid Build Coastguard Worker
276*6777b538SAndroid Build Coastguard Worker if (evutil_socketpair(AF_UNIX, SOCK_STREAM, 0, pair) == -1) {
277*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "%s: socketpair\n", __func__);
278*6777b538SAndroid Build Coastguard Worker exit(1);
279*6777b538SAndroid Build Coastguard Worker }
280*6777b538SAndroid Build Coastguard Worker
281*6777b538SAndroid Build Coastguard Worker #ifdef HAVE_FCNTL
282*6777b538SAndroid Build Coastguard Worker if (fcntl(pair[0], F_SETFL, O_NONBLOCK) == -1)
283*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "fcntl(O_NONBLOCK)");
284*6777b538SAndroid Build Coastguard Worker
285*6777b538SAndroid Build Coastguard Worker if (fcntl(pair[1], F_SETFL, O_NONBLOCK) == -1)
286*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "fcntl(O_NONBLOCK)");
287*6777b538SAndroid Build Coastguard Worker #endif
288*6777b538SAndroid Build Coastguard Worker
289*6777b538SAndroid Build Coastguard Worker test_ok = 0;
290*6777b538SAndroid Build Coastguard Worker called = 0;
291*6777b538SAndroid Build Coastguard Worker return (0);
292*6777b538SAndroid Build Coastguard Worker }
293*6777b538SAndroid Build Coastguard Worker
294*6777b538SAndroid Build Coastguard Worker static int
cleanup_test(void)295*6777b538SAndroid Build Coastguard Worker cleanup_test(void)
296*6777b538SAndroid Build Coastguard Worker {
297*6777b538SAndroid Build Coastguard Worker #ifndef WIN32
298*6777b538SAndroid Build Coastguard Worker close(pair[0]);
299*6777b538SAndroid Build Coastguard Worker close(pair[1]);
300*6777b538SAndroid Build Coastguard Worker #else
301*6777b538SAndroid Build Coastguard Worker CloseHandle((HANDLE)pair[0]);
302*6777b538SAndroid Build Coastguard Worker CloseHandle((HANDLE)pair[1]);
303*6777b538SAndroid Build Coastguard Worker #endif
304*6777b538SAndroid Build Coastguard Worker if (test_ok)
305*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "OK\n");
306*6777b538SAndroid Build Coastguard Worker else {
307*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "FAILED\n");
308*6777b538SAndroid Build Coastguard Worker exit(1);
309*6777b538SAndroid Build Coastguard Worker }
310*6777b538SAndroid Build Coastguard Worker test_ok = 0;
311*6777b538SAndroid Build Coastguard Worker return (0);
312*6777b538SAndroid Build Coastguard Worker }
313*6777b538SAndroid Build Coastguard Worker
314*6777b538SAndroid Build Coastguard Worker static void
test_registerfds(void)315*6777b538SAndroid Build Coastguard Worker test_registerfds(void)
316*6777b538SAndroid Build Coastguard Worker {
317*6777b538SAndroid Build Coastguard Worker int i, j;
318*6777b538SAndroid Build Coastguard Worker int pair[2];
319*6777b538SAndroid Build Coastguard Worker struct event read_evs[512];
320*6777b538SAndroid Build Coastguard Worker struct event write_evs[512];
321*6777b538SAndroid Build Coastguard Worker
322*6777b538SAndroid Build Coastguard Worker struct event_base *base = event_base_new();
323*6777b538SAndroid Build Coastguard Worker
324*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "Testing register fds: ");
325*6777b538SAndroid Build Coastguard Worker
326*6777b538SAndroid Build Coastguard Worker for (i = 0; i < 512; ++i) {
327*6777b538SAndroid Build Coastguard Worker if (evutil_socketpair(AF_UNIX, SOCK_STREAM, 0, pair) == -1) {
328*6777b538SAndroid Build Coastguard Worker /* run up to the limit of file descriptors */
329*6777b538SAndroid Build Coastguard Worker break;
330*6777b538SAndroid Build Coastguard Worker }
331*6777b538SAndroid Build Coastguard Worker event_set(&read_evs[i], pair[0],
332*6777b538SAndroid Build Coastguard Worker EV_READ|EV_PERSIST, simple_read_cb, NULL);
333*6777b538SAndroid Build Coastguard Worker event_base_set(base, &read_evs[i]);
334*6777b538SAndroid Build Coastguard Worker event_add(&read_evs[i], NULL);
335*6777b538SAndroid Build Coastguard Worker event_set(&write_evs[i], pair[1],
336*6777b538SAndroid Build Coastguard Worker EV_WRITE|EV_PERSIST, simple_write_cb, NULL);
337*6777b538SAndroid Build Coastguard Worker event_base_set(base, &write_evs[i]);
338*6777b538SAndroid Build Coastguard Worker event_add(&write_evs[i], NULL);
339*6777b538SAndroid Build Coastguard Worker
340*6777b538SAndroid Build Coastguard Worker /* just loop once */
341*6777b538SAndroid Build Coastguard Worker event_base_loop(base, EVLOOP_ONCE);
342*6777b538SAndroid Build Coastguard Worker }
343*6777b538SAndroid Build Coastguard Worker
344*6777b538SAndroid Build Coastguard Worker /* now delete everything */
345*6777b538SAndroid Build Coastguard Worker for (j = 0; j < i; ++j) {
346*6777b538SAndroid Build Coastguard Worker event_del(&read_evs[j]);
347*6777b538SAndroid Build Coastguard Worker event_del(&write_evs[j]);
348*6777b538SAndroid Build Coastguard Worker #ifndef WIN32
349*6777b538SAndroid Build Coastguard Worker close(read_evs[j].ev_fd);
350*6777b538SAndroid Build Coastguard Worker close(write_evs[j].ev_fd);
351*6777b538SAndroid Build Coastguard Worker #else
352*6777b538SAndroid Build Coastguard Worker CloseHandle((HANDLE)read_evs[j].ev_fd);
353*6777b538SAndroid Build Coastguard Worker CloseHandle((HANDLE)write_evs[j].ev_fd);
354*6777b538SAndroid Build Coastguard Worker #endif
355*6777b538SAndroid Build Coastguard Worker
356*6777b538SAndroid Build Coastguard Worker /* just loop once */
357*6777b538SAndroid Build Coastguard Worker event_base_loop(base, EVLOOP_ONCE);
358*6777b538SAndroid Build Coastguard Worker }
359*6777b538SAndroid Build Coastguard Worker
360*6777b538SAndroid Build Coastguard Worker event_base_free(base);
361*6777b538SAndroid Build Coastguard Worker
362*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "OK\n");
363*6777b538SAndroid Build Coastguard Worker }
364*6777b538SAndroid Build Coastguard Worker
365*6777b538SAndroid Build Coastguard Worker static void
test_simpleread(void)366*6777b538SAndroid Build Coastguard Worker test_simpleread(void)
367*6777b538SAndroid Build Coastguard Worker {
368*6777b538SAndroid Build Coastguard Worker struct event ev;
369*6777b538SAndroid Build Coastguard Worker
370*6777b538SAndroid Build Coastguard Worker /* Very simple read test */
371*6777b538SAndroid Build Coastguard Worker setup_test("Simple read: ");
372*6777b538SAndroid Build Coastguard Worker
373*6777b538SAndroid Build Coastguard Worker write(pair[0], TEST1, strlen(TEST1)+1);
374*6777b538SAndroid Build Coastguard Worker shutdown(pair[0], SHUT_WR);
375*6777b538SAndroid Build Coastguard Worker
376*6777b538SAndroid Build Coastguard Worker event_set(&ev, pair[1], EV_READ, simple_read_cb, &ev);
377*6777b538SAndroid Build Coastguard Worker if (event_add(&ev, NULL) == -1)
378*6777b538SAndroid Build Coastguard Worker exit(1);
379*6777b538SAndroid Build Coastguard Worker event_dispatch();
380*6777b538SAndroid Build Coastguard Worker
381*6777b538SAndroid Build Coastguard Worker cleanup_test();
382*6777b538SAndroid Build Coastguard Worker }
383*6777b538SAndroid Build Coastguard Worker
384*6777b538SAndroid Build Coastguard Worker static void
test_simplewrite(void)385*6777b538SAndroid Build Coastguard Worker test_simplewrite(void)
386*6777b538SAndroid Build Coastguard Worker {
387*6777b538SAndroid Build Coastguard Worker struct event ev;
388*6777b538SAndroid Build Coastguard Worker
389*6777b538SAndroid Build Coastguard Worker /* Very simple write test */
390*6777b538SAndroid Build Coastguard Worker setup_test("Simple write: ");
391*6777b538SAndroid Build Coastguard Worker
392*6777b538SAndroid Build Coastguard Worker event_set(&ev, pair[0], EV_WRITE, simple_write_cb, &ev);
393*6777b538SAndroid Build Coastguard Worker if (event_add(&ev, NULL) == -1)
394*6777b538SAndroid Build Coastguard Worker exit(1);
395*6777b538SAndroid Build Coastguard Worker event_dispatch();
396*6777b538SAndroid Build Coastguard Worker
397*6777b538SAndroid Build Coastguard Worker cleanup_test();
398*6777b538SAndroid Build Coastguard Worker }
399*6777b538SAndroid Build Coastguard Worker
400*6777b538SAndroid Build Coastguard Worker static void
test_multiple(void)401*6777b538SAndroid Build Coastguard Worker test_multiple(void)
402*6777b538SAndroid Build Coastguard Worker {
403*6777b538SAndroid Build Coastguard Worker struct event ev, ev2;
404*6777b538SAndroid Build Coastguard Worker int i;
405*6777b538SAndroid Build Coastguard Worker
406*6777b538SAndroid Build Coastguard Worker /* Multiple read and write test */
407*6777b538SAndroid Build Coastguard Worker setup_test("Multiple read/write: ");
408*6777b538SAndroid Build Coastguard Worker memset(rbuf, 0, sizeof(rbuf));
409*6777b538SAndroid Build Coastguard Worker for (i = 0; i < sizeof(wbuf); i++)
410*6777b538SAndroid Build Coastguard Worker wbuf[i] = i;
411*6777b538SAndroid Build Coastguard Worker
412*6777b538SAndroid Build Coastguard Worker roff = woff = 0;
413*6777b538SAndroid Build Coastguard Worker usepersist = 0;
414*6777b538SAndroid Build Coastguard Worker
415*6777b538SAndroid Build Coastguard Worker event_set(&ev, pair[0], EV_WRITE, multiple_write_cb, &ev);
416*6777b538SAndroid Build Coastguard Worker if (event_add(&ev, NULL) == -1)
417*6777b538SAndroid Build Coastguard Worker exit(1);
418*6777b538SAndroid Build Coastguard Worker event_set(&ev2, pair[1], EV_READ, multiple_read_cb, &ev2);
419*6777b538SAndroid Build Coastguard Worker if (event_add(&ev2, NULL) == -1)
420*6777b538SAndroid Build Coastguard Worker exit(1);
421*6777b538SAndroid Build Coastguard Worker event_dispatch();
422*6777b538SAndroid Build Coastguard Worker
423*6777b538SAndroid Build Coastguard Worker if (roff == woff)
424*6777b538SAndroid Build Coastguard Worker test_ok = memcmp(rbuf, wbuf, sizeof(wbuf)) == 0;
425*6777b538SAndroid Build Coastguard Worker
426*6777b538SAndroid Build Coastguard Worker cleanup_test();
427*6777b538SAndroid Build Coastguard Worker }
428*6777b538SAndroid Build Coastguard Worker
429*6777b538SAndroid Build Coastguard Worker static void
test_persistent(void)430*6777b538SAndroid Build Coastguard Worker test_persistent(void)
431*6777b538SAndroid Build Coastguard Worker {
432*6777b538SAndroid Build Coastguard Worker struct event ev, ev2;
433*6777b538SAndroid Build Coastguard Worker int i;
434*6777b538SAndroid Build Coastguard Worker
435*6777b538SAndroid Build Coastguard Worker /* Multiple read and write test with persist */
436*6777b538SAndroid Build Coastguard Worker setup_test("Persist read/write: ");
437*6777b538SAndroid Build Coastguard Worker memset(rbuf, 0, sizeof(rbuf));
438*6777b538SAndroid Build Coastguard Worker for (i = 0; i < sizeof(wbuf); i++)
439*6777b538SAndroid Build Coastguard Worker wbuf[i] = i;
440*6777b538SAndroid Build Coastguard Worker
441*6777b538SAndroid Build Coastguard Worker roff = woff = 0;
442*6777b538SAndroid Build Coastguard Worker usepersist = 1;
443*6777b538SAndroid Build Coastguard Worker
444*6777b538SAndroid Build Coastguard Worker event_set(&ev, pair[0], EV_WRITE|EV_PERSIST, multiple_write_cb, &ev);
445*6777b538SAndroid Build Coastguard Worker if (event_add(&ev, NULL) == -1)
446*6777b538SAndroid Build Coastguard Worker exit(1);
447*6777b538SAndroid Build Coastguard Worker event_set(&ev2, pair[1], EV_READ|EV_PERSIST, multiple_read_cb, &ev2);
448*6777b538SAndroid Build Coastguard Worker if (event_add(&ev2, NULL) == -1)
449*6777b538SAndroid Build Coastguard Worker exit(1);
450*6777b538SAndroid Build Coastguard Worker event_dispatch();
451*6777b538SAndroid Build Coastguard Worker
452*6777b538SAndroid Build Coastguard Worker if (roff == woff)
453*6777b538SAndroid Build Coastguard Worker test_ok = memcmp(rbuf, wbuf, sizeof(wbuf)) == 0;
454*6777b538SAndroid Build Coastguard Worker
455*6777b538SAndroid Build Coastguard Worker cleanup_test();
456*6777b538SAndroid Build Coastguard Worker }
457*6777b538SAndroid Build Coastguard Worker
458*6777b538SAndroid Build Coastguard Worker static void
test_combined(void)459*6777b538SAndroid Build Coastguard Worker test_combined(void)
460*6777b538SAndroid Build Coastguard Worker {
461*6777b538SAndroid Build Coastguard Worker struct both r1, r2, w1, w2;
462*6777b538SAndroid Build Coastguard Worker
463*6777b538SAndroid Build Coastguard Worker setup_test("Combined read/write: ");
464*6777b538SAndroid Build Coastguard Worker memset(&r1, 0, sizeof(r1));
465*6777b538SAndroid Build Coastguard Worker memset(&r2, 0, sizeof(r2));
466*6777b538SAndroid Build Coastguard Worker memset(&w1, 0, sizeof(w1));
467*6777b538SAndroid Build Coastguard Worker memset(&w2, 0, sizeof(w2));
468*6777b538SAndroid Build Coastguard Worker
469*6777b538SAndroid Build Coastguard Worker w1.nread = 4096;
470*6777b538SAndroid Build Coastguard Worker w2.nread = 8192;
471*6777b538SAndroid Build Coastguard Worker
472*6777b538SAndroid Build Coastguard Worker event_set(&r1.ev, pair[0], EV_READ, combined_read_cb, &r1);
473*6777b538SAndroid Build Coastguard Worker event_set(&w1.ev, pair[0], EV_WRITE, combined_write_cb, &w1);
474*6777b538SAndroid Build Coastguard Worker event_set(&r2.ev, pair[1], EV_READ, combined_read_cb, &r2);
475*6777b538SAndroid Build Coastguard Worker event_set(&w2.ev, pair[1], EV_WRITE, combined_write_cb, &w2);
476*6777b538SAndroid Build Coastguard Worker if (event_add(&r1.ev, NULL) == -1)
477*6777b538SAndroid Build Coastguard Worker exit(1);
478*6777b538SAndroid Build Coastguard Worker if (event_add(&w1.ev, NULL))
479*6777b538SAndroid Build Coastguard Worker exit(1);
480*6777b538SAndroid Build Coastguard Worker if (event_add(&r2.ev, NULL))
481*6777b538SAndroid Build Coastguard Worker exit(1);
482*6777b538SAndroid Build Coastguard Worker if (event_add(&w2.ev, NULL))
483*6777b538SAndroid Build Coastguard Worker exit(1);
484*6777b538SAndroid Build Coastguard Worker
485*6777b538SAndroid Build Coastguard Worker event_dispatch();
486*6777b538SAndroid Build Coastguard Worker
487*6777b538SAndroid Build Coastguard Worker if (r1.nread == 8192 && r2.nread == 4096)
488*6777b538SAndroid Build Coastguard Worker test_ok = 1;
489*6777b538SAndroid Build Coastguard Worker
490*6777b538SAndroid Build Coastguard Worker cleanup_test();
491*6777b538SAndroid Build Coastguard Worker }
492*6777b538SAndroid Build Coastguard Worker
493*6777b538SAndroid Build Coastguard Worker static void
test_simpletimeout(void)494*6777b538SAndroid Build Coastguard Worker test_simpletimeout(void)
495*6777b538SAndroid Build Coastguard Worker {
496*6777b538SAndroid Build Coastguard Worker struct timeval tv;
497*6777b538SAndroid Build Coastguard Worker struct event ev;
498*6777b538SAndroid Build Coastguard Worker
499*6777b538SAndroid Build Coastguard Worker setup_test("Simple timeout: ");
500*6777b538SAndroid Build Coastguard Worker
501*6777b538SAndroid Build Coastguard Worker tv.tv_usec = 0;
502*6777b538SAndroid Build Coastguard Worker tv.tv_sec = SECONDS;
503*6777b538SAndroid Build Coastguard Worker evtimer_set(&ev, timeout_cb, NULL);
504*6777b538SAndroid Build Coastguard Worker evtimer_add(&ev, &tv);
505*6777b538SAndroid Build Coastguard Worker
506*6777b538SAndroid Build Coastguard Worker evutil_gettimeofday(&tset, NULL);
507*6777b538SAndroid Build Coastguard Worker event_dispatch();
508*6777b538SAndroid Build Coastguard Worker
509*6777b538SAndroid Build Coastguard Worker cleanup_test();
510*6777b538SAndroid Build Coastguard Worker }
511*6777b538SAndroid Build Coastguard Worker
512*6777b538SAndroid Build Coastguard Worker #ifndef WIN32
513*6777b538SAndroid Build Coastguard Worker extern struct event_base *current_base;
514*6777b538SAndroid Build Coastguard Worker
515*6777b538SAndroid Build Coastguard Worker static void
child_signal_cb(int fd,short event,void * arg)516*6777b538SAndroid Build Coastguard Worker child_signal_cb(int fd, short event, void *arg)
517*6777b538SAndroid Build Coastguard Worker {
518*6777b538SAndroid Build Coastguard Worker struct timeval tv;
519*6777b538SAndroid Build Coastguard Worker int *pint = arg;
520*6777b538SAndroid Build Coastguard Worker
521*6777b538SAndroid Build Coastguard Worker *pint = 1;
522*6777b538SAndroid Build Coastguard Worker
523*6777b538SAndroid Build Coastguard Worker tv.tv_usec = 500000;
524*6777b538SAndroid Build Coastguard Worker tv.tv_sec = 0;
525*6777b538SAndroid Build Coastguard Worker event_loopexit(&tv);
526*6777b538SAndroid Build Coastguard Worker }
527*6777b538SAndroid Build Coastguard Worker
528*6777b538SAndroid Build Coastguard Worker static void
test_fork(void)529*6777b538SAndroid Build Coastguard Worker test_fork(void)
530*6777b538SAndroid Build Coastguard Worker {
531*6777b538SAndroid Build Coastguard Worker int status, got_sigchld = 0;
532*6777b538SAndroid Build Coastguard Worker struct event ev, sig_ev;
533*6777b538SAndroid Build Coastguard Worker pid_t pid;
534*6777b538SAndroid Build Coastguard Worker
535*6777b538SAndroid Build Coastguard Worker setup_test("After fork: ");
536*6777b538SAndroid Build Coastguard Worker
537*6777b538SAndroid Build Coastguard Worker write(pair[0], TEST1, strlen(TEST1)+1);
538*6777b538SAndroid Build Coastguard Worker
539*6777b538SAndroid Build Coastguard Worker event_set(&ev, pair[1], EV_READ, simple_read_cb, &ev);
540*6777b538SAndroid Build Coastguard Worker if (event_add(&ev, NULL) == -1)
541*6777b538SAndroid Build Coastguard Worker exit(1);
542*6777b538SAndroid Build Coastguard Worker
543*6777b538SAndroid Build Coastguard Worker signal_set(&sig_ev, SIGCHLD, child_signal_cb, &got_sigchld);
544*6777b538SAndroid Build Coastguard Worker signal_add(&sig_ev, NULL);
545*6777b538SAndroid Build Coastguard Worker
546*6777b538SAndroid Build Coastguard Worker if ((pid = fork()) == 0) {
547*6777b538SAndroid Build Coastguard Worker /* in the child */
548*6777b538SAndroid Build Coastguard Worker if (event_reinit(current_base) == -1) {
549*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "FAILED (reinit)\n");
550*6777b538SAndroid Build Coastguard Worker exit(1);
551*6777b538SAndroid Build Coastguard Worker }
552*6777b538SAndroid Build Coastguard Worker
553*6777b538SAndroid Build Coastguard Worker signal_del(&sig_ev);
554*6777b538SAndroid Build Coastguard Worker
555*6777b538SAndroid Build Coastguard Worker called = 0;
556*6777b538SAndroid Build Coastguard Worker
557*6777b538SAndroid Build Coastguard Worker event_dispatch();
558*6777b538SAndroid Build Coastguard Worker
559*6777b538SAndroid Build Coastguard Worker /* we do not send an EOF; simple_read_cb requires an EOF
560*6777b538SAndroid Build Coastguard Worker * to set test_ok. we just verify that the callback was
561*6777b538SAndroid Build Coastguard Worker * called. */
562*6777b538SAndroid Build Coastguard Worker exit(test_ok != 0 || called != 2 ? -2 : 76);
563*6777b538SAndroid Build Coastguard Worker }
564*6777b538SAndroid Build Coastguard Worker
565*6777b538SAndroid Build Coastguard Worker /* wait for the child to read the data */
566*6777b538SAndroid Build Coastguard Worker sleep(1);
567*6777b538SAndroid Build Coastguard Worker
568*6777b538SAndroid Build Coastguard Worker write(pair[0], TEST1, strlen(TEST1)+1);
569*6777b538SAndroid Build Coastguard Worker
570*6777b538SAndroid Build Coastguard Worker if (waitpid(pid, &status, 0) == -1) {
571*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "FAILED (fork)\n");
572*6777b538SAndroid Build Coastguard Worker exit(1);
573*6777b538SAndroid Build Coastguard Worker }
574*6777b538SAndroid Build Coastguard Worker
575*6777b538SAndroid Build Coastguard Worker if (WEXITSTATUS(status) != 76) {
576*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "FAILED (exit): %d\n", WEXITSTATUS(status));
577*6777b538SAndroid Build Coastguard Worker exit(1);
578*6777b538SAndroid Build Coastguard Worker }
579*6777b538SAndroid Build Coastguard Worker
580*6777b538SAndroid Build Coastguard Worker /* test that the current event loop still works */
581*6777b538SAndroid Build Coastguard Worker write(pair[0], TEST1, strlen(TEST1)+1);
582*6777b538SAndroid Build Coastguard Worker shutdown(pair[0], SHUT_WR);
583*6777b538SAndroid Build Coastguard Worker
584*6777b538SAndroid Build Coastguard Worker event_dispatch();
585*6777b538SAndroid Build Coastguard Worker
586*6777b538SAndroid Build Coastguard Worker if (!got_sigchld) {
587*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "FAILED (sigchld)\n");
588*6777b538SAndroid Build Coastguard Worker exit(1);
589*6777b538SAndroid Build Coastguard Worker }
590*6777b538SAndroid Build Coastguard Worker
591*6777b538SAndroid Build Coastguard Worker signal_del(&sig_ev);
592*6777b538SAndroid Build Coastguard Worker
593*6777b538SAndroid Build Coastguard Worker cleanup_test();
594*6777b538SAndroid Build Coastguard Worker }
595*6777b538SAndroid Build Coastguard Worker
596*6777b538SAndroid Build Coastguard Worker static void
test_simplesignal(void)597*6777b538SAndroid Build Coastguard Worker test_simplesignal(void)
598*6777b538SAndroid Build Coastguard Worker {
599*6777b538SAndroid Build Coastguard Worker struct event ev;
600*6777b538SAndroid Build Coastguard Worker struct itimerval itv;
601*6777b538SAndroid Build Coastguard Worker
602*6777b538SAndroid Build Coastguard Worker setup_test("Simple signal: ");
603*6777b538SAndroid Build Coastguard Worker signal_set(&ev, SIGALRM, signal_cb, &ev);
604*6777b538SAndroid Build Coastguard Worker signal_add(&ev, NULL);
605*6777b538SAndroid Build Coastguard Worker /* find bugs in which operations are re-ordered */
606*6777b538SAndroid Build Coastguard Worker signal_del(&ev);
607*6777b538SAndroid Build Coastguard Worker signal_add(&ev, NULL);
608*6777b538SAndroid Build Coastguard Worker
609*6777b538SAndroid Build Coastguard Worker memset(&itv, 0, sizeof(itv));
610*6777b538SAndroid Build Coastguard Worker itv.it_value.tv_sec = 1;
611*6777b538SAndroid Build Coastguard Worker if (setitimer(ITIMER_REAL, &itv, NULL) == -1)
612*6777b538SAndroid Build Coastguard Worker goto skip_simplesignal;
613*6777b538SAndroid Build Coastguard Worker
614*6777b538SAndroid Build Coastguard Worker event_dispatch();
615*6777b538SAndroid Build Coastguard Worker skip_simplesignal:
616*6777b538SAndroid Build Coastguard Worker if (signal_del(&ev) == -1)
617*6777b538SAndroid Build Coastguard Worker test_ok = 0;
618*6777b538SAndroid Build Coastguard Worker
619*6777b538SAndroid Build Coastguard Worker cleanup_test();
620*6777b538SAndroid Build Coastguard Worker }
621*6777b538SAndroid Build Coastguard Worker
622*6777b538SAndroid Build Coastguard Worker static void
test_multiplesignal(void)623*6777b538SAndroid Build Coastguard Worker test_multiplesignal(void)
624*6777b538SAndroid Build Coastguard Worker {
625*6777b538SAndroid Build Coastguard Worker struct event ev_one, ev_two;
626*6777b538SAndroid Build Coastguard Worker struct itimerval itv;
627*6777b538SAndroid Build Coastguard Worker
628*6777b538SAndroid Build Coastguard Worker setup_test("Multiple signal: ");
629*6777b538SAndroid Build Coastguard Worker
630*6777b538SAndroid Build Coastguard Worker signal_set(&ev_one, SIGALRM, signal_cb, &ev_one);
631*6777b538SAndroid Build Coastguard Worker signal_add(&ev_one, NULL);
632*6777b538SAndroid Build Coastguard Worker
633*6777b538SAndroid Build Coastguard Worker signal_set(&ev_two, SIGALRM, signal_cb, &ev_two);
634*6777b538SAndroid Build Coastguard Worker signal_add(&ev_two, NULL);
635*6777b538SAndroid Build Coastguard Worker
636*6777b538SAndroid Build Coastguard Worker memset(&itv, 0, sizeof(itv));
637*6777b538SAndroid Build Coastguard Worker itv.it_value.tv_sec = 1;
638*6777b538SAndroid Build Coastguard Worker if (setitimer(ITIMER_REAL, &itv, NULL) == -1)
639*6777b538SAndroid Build Coastguard Worker goto skip_simplesignal;
640*6777b538SAndroid Build Coastguard Worker
641*6777b538SAndroid Build Coastguard Worker event_dispatch();
642*6777b538SAndroid Build Coastguard Worker
643*6777b538SAndroid Build Coastguard Worker skip_simplesignal:
644*6777b538SAndroid Build Coastguard Worker if (signal_del(&ev_one) == -1)
645*6777b538SAndroid Build Coastguard Worker test_ok = 0;
646*6777b538SAndroid Build Coastguard Worker if (signal_del(&ev_two) == -1)
647*6777b538SAndroid Build Coastguard Worker test_ok = 0;
648*6777b538SAndroid Build Coastguard Worker
649*6777b538SAndroid Build Coastguard Worker cleanup_test();
650*6777b538SAndroid Build Coastguard Worker }
651*6777b538SAndroid Build Coastguard Worker
652*6777b538SAndroid Build Coastguard Worker static void
test_immediatesignal(void)653*6777b538SAndroid Build Coastguard Worker test_immediatesignal(void)
654*6777b538SAndroid Build Coastguard Worker {
655*6777b538SAndroid Build Coastguard Worker struct event ev;
656*6777b538SAndroid Build Coastguard Worker
657*6777b538SAndroid Build Coastguard Worker test_ok = 0;
658*6777b538SAndroid Build Coastguard Worker printf("Immediate signal: ");
659*6777b538SAndroid Build Coastguard Worker signal_set(&ev, SIGUSR1, signal_cb, &ev);
660*6777b538SAndroid Build Coastguard Worker signal_add(&ev, NULL);
661*6777b538SAndroid Build Coastguard Worker raise(SIGUSR1);
662*6777b538SAndroid Build Coastguard Worker event_loop(EVLOOP_NONBLOCK);
663*6777b538SAndroid Build Coastguard Worker signal_del(&ev);
664*6777b538SAndroid Build Coastguard Worker cleanup_test();
665*6777b538SAndroid Build Coastguard Worker }
666*6777b538SAndroid Build Coastguard Worker
667*6777b538SAndroid Build Coastguard Worker static void
test_signal_dealloc(void)668*6777b538SAndroid Build Coastguard Worker test_signal_dealloc(void)
669*6777b538SAndroid Build Coastguard Worker {
670*6777b538SAndroid Build Coastguard Worker /* make sure that signal_event is event_del'ed and pipe closed */
671*6777b538SAndroid Build Coastguard Worker struct event ev;
672*6777b538SAndroid Build Coastguard Worker struct event_base *base = event_init();
673*6777b538SAndroid Build Coastguard Worker printf("Signal dealloc: ");
674*6777b538SAndroid Build Coastguard Worker signal_set(&ev, SIGUSR1, signal_cb, &ev);
675*6777b538SAndroid Build Coastguard Worker signal_add(&ev, NULL);
676*6777b538SAndroid Build Coastguard Worker signal_del(&ev);
677*6777b538SAndroid Build Coastguard Worker event_base_free(base);
678*6777b538SAndroid Build Coastguard Worker /* If we got here without asserting, we're fine. */
679*6777b538SAndroid Build Coastguard Worker test_ok = 1;
680*6777b538SAndroid Build Coastguard Worker cleanup_test();
681*6777b538SAndroid Build Coastguard Worker }
682*6777b538SAndroid Build Coastguard Worker
683*6777b538SAndroid Build Coastguard Worker static void
test_signal_pipeloss(void)684*6777b538SAndroid Build Coastguard Worker test_signal_pipeloss(void)
685*6777b538SAndroid Build Coastguard Worker {
686*6777b538SAndroid Build Coastguard Worker /* make sure that the base1 pipe is closed correctly. */
687*6777b538SAndroid Build Coastguard Worker struct event_base *base1, *base2;
688*6777b538SAndroid Build Coastguard Worker int pipe1;
689*6777b538SAndroid Build Coastguard Worker test_ok = 0;
690*6777b538SAndroid Build Coastguard Worker printf("Signal pipeloss: ");
691*6777b538SAndroid Build Coastguard Worker base1 = event_init();
692*6777b538SAndroid Build Coastguard Worker pipe1 = base1->sig.ev_signal_pair[0];
693*6777b538SAndroid Build Coastguard Worker base2 = event_init();
694*6777b538SAndroid Build Coastguard Worker event_base_free(base2);
695*6777b538SAndroid Build Coastguard Worker event_base_free(base1);
696*6777b538SAndroid Build Coastguard Worker if (close(pipe1) != -1 || errno!=EBADF) {
697*6777b538SAndroid Build Coastguard Worker /* fd must be closed, so second close gives -1, EBADF */
698*6777b538SAndroid Build Coastguard Worker printf("signal pipe not closed. ");
699*6777b538SAndroid Build Coastguard Worker test_ok = 0;
700*6777b538SAndroid Build Coastguard Worker } else {
701*6777b538SAndroid Build Coastguard Worker test_ok = 1;
702*6777b538SAndroid Build Coastguard Worker }
703*6777b538SAndroid Build Coastguard Worker cleanup_test();
704*6777b538SAndroid Build Coastguard Worker }
705*6777b538SAndroid Build Coastguard Worker
706*6777b538SAndroid Build Coastguard Worker /*
707*6777b538SAndroid Build Coastguard Worker * make two bases to catch signals, use both of them. this only works
708*6777b538SAndroid Build Coastguard Worker * for event mechanisms that use our signal pipe trick. kqueue handles
709*6777b538SAndroid Build Coastguard Worker * signals internally, and all interested kqueues get all the signals.
710*6777b538SAndroid Build Coastguard Worker */
711*6777b538SAndroid Build Coastguard Worker static void
test_signal_switchbase(void)712*6777b538SAndroid Build Coastguard Worker test_signal_switchbase(void)
713*6777b538SAndroid Build Coastguard Worker {
714*6777b538SAndroid Build Coastguard Worker struct event ev1, ev2;
715*6777b538SAndroid Build Coastguard Worker struct event_base *base1, *base2;
716*6777b538SAndroid Build Coastguard Worker int is_kqueue;
717*6777b538SAndroid Build Coastguard Worker test_ok = 0;
718*6777b538SAndroid Build Coastguard Worker printf("Signal switchbase: ");
719*6777b538SAndroid Build Coastguard Worker base1 = event_init();
720*6777b538SAndroid Build Coastguard Worker base2 = event_init();
721*6777b538SAndroid Build Coastguard Worker is_kqueue = !strcmp(event_get_method(),"kqueue");
722*6777b538SAndroid Build Coastguard Worker signal_set(&ev1, SIGUSR1, signal_cb, &ev1);
723*6777b538SAndroid Build Coastguard Worker signal_set(&ev2, SIGUSR1, signal_cb, &ev2);
724*6777b538SAndroid Build Coastguard Worker if (event_base_set(base1, &ev1) ||
725*6777b538SAndroid Build Coastguard Worker event_base_set(base2, &ev2) ||
726*6777b538SAndroid Build Coastguard Worker event_add(&ev1, NULL) ||
727*6777b538SAndroid Build Coastguard Worker event_add(&ev2, NULL)) {
728*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "%s: cannot set base, add\n", __func__);
729*6777b538SAndroid Build Coastguard Worker exit(1);
730*6777b538SAndroid Build Coastguard Worker }
731*6777b538SAndroid Build Coastguard Worker
732*6777b538SAndroid Build Coastguard Worker test_ok = 0;
733*6777b538SAndroid Build Coastguard Worker /* can handle signal before loop is called */
734*6777b538SAndroid Build Coastguard Worker raise(SIGUSR1);
735*6777b538SAndroid Build Coastguard Worker event_base_loop(base2, EVLOOP_NONBLOCK);
736*6777b538SAndroid Build Coastguard Worker if (is_kqueue) {
737*6777b538SAndroid Build Coastguard Worker if (!test_ok)
738*6777b538SAndroid Build Coastguard Worker goto done;
739*6777b538SAndroid Build Coastguard Worker test_ok = 0;
740*6777b538SAndroid Build Coastguard Worker }
741*6777b538SAndroid Build Coastguard Worker event_base_loop(base1, EVLOOP_NONBLOCK);
742*6777b538SAndroid Build Coastguard Worker if (test_ok && !is_kqueue) {
743*6777b538SAndroid Build Coastguard Worker test_ok = 0;
744*6777b538SAndroid Build Coastguard Worker
745*6777b538SAndroid Build Coastguard Worker /* set base1 to handle signals */
746*6777b538SAndroid Build Coastguard Worker event_base_loop(base1, EVLOOP_NONBLOCK);
747*6777b538SAndroid Build Coastguard Worker raise(SIGUSR1);
748*6777b538SAndroid Build Coastguard Worker event_base_loop(base1, EVLOOP_NONBLOCK);
749*6777b538SAndroid Build Coastguard Worker event_base_loop(base2, EVLOOP_NONBLOCK);
750*6777b538SAndroid Build Coastguard Worker }
751*6777b538SAndroid Build Coastguard Worker done:
752*6777b538SAndroid Build Coastguard Worker event_base_free(base1);
753*6777b538SAndroid Build Coastguard Worker event_base_free(base2);
754*6777b538SAndroid Build Coastguard Worker cleanup_test();
755*6777b538SAndroid Build Coastguard Worker }
756*6777b538SAndroid Build Coastguard Worker
757*6777b538SAndroid Build Coastguard Worker /*
758*6777b538SAndroid Build Coastguard Worker * assert that a signal event removed from the event queue really is
759*6777b538SAndroid Build Coastguard Worker * removed - with no possibility of it's parent handler being fired.
760*6777b538SAndroid Build Coastguard Worker */
761*6777b538SAndroid Build Coastguard Worker static void
test_signal_assert(void)762*6777b538SAndroid Build Coastguard Worker test_signal_assert(void)
763*6777b538SAndroid Build Coastguard Worker {
764*6777b538SAndroid Build Coastguard Worker struct event ev;
765*6777b538SAndroid Build Coastguard Worker struct event_base *base = event_init();
766*6777b538SAndroid Build Coastguard Worker test_ok = 0;
767*6777b538SAndroid Build Coastguard Worker printf("Signal handler assert: ");
768*6777b538SAndroid Build Coastguard Worker /* use SIGCONT so we don't kill ourselves when we signal to nowhere */
769*6777b538SAndroid Build Coastguard Worker signal_set(&ev, SIGCONT, signal_cb, &ev);
770*6777b538SAndroid Build Coastguard Worker signal_add(&ev, NULL);
771*6777b538SAndroid Build Coastguard Worker /*
772*6777b538SAndroid Build Coastguard Worker * if signal_del() fails to reset the handler, it's current handler
773*6777b538SAndroid Build Coastguard Worker * will still point to evsignal_handler().
774*6777b538SAndroid Build Coastguard Worker */
775*6777b538SAndroid Build Coastguard Worker signal_del(&ev);
776*6777b538SAndroid Build Coastguard Worker
777*6777b538SAndroid Build Coastguard Worker raise(SIGCONT);
778*6777b538SAndroid Build Coastguard Worker /* only way to verify we were in evsignal_handler() */
779*6777b538SAndroid Build Coastguard Worker if (base->sig.evsignal_caught)
780*6777b538SAndroid Build Coastguard Worker test_ok = 0;
781*6777b538SAndroid Build Coastguard Worker else
782*6777b538SAndroid Build Coastguard Worker test_ok = 1;
783*6777b538SAndroid Build Coastguard Worker
784*6777b538SAndroid Build Coastguard Worker event_base_free(base);
785*6777b538SAndroid Build Coastguard Worker cleanup_test();
786*6777b538SAndroid Build Coastguard Worker return;
787*6777b538SAndroid Build Coastguard Worker }
788*6777b538SAndroid Build Coastguard Worker
789*6777b538SAndroid Build Coastguard Worker /*
790*6777b538SAndroid Build Coastguard Worker * assert that we restore our previous signal handler properly.
791*6777b538SAndroid Build Coastguard Worker */
792*6777b538SAndroid Build Coastguard Worker static void
test_signal_restore(void)793*6777b538SAndroid Build Coastguard Worker test_signal_restore(void)
794*6777b538SAndroid Build Coastguard Worker {
795*6777b538SAndroid Build Coastguard Worker struct event ev;
796*6777b538SAndroid Build Coastguard Worker struct event_base *base = event_init();
797*6777b538SAndroid Build Coastguard Worker #ifdef HAVE_SIGACTION
798*6777b538SAndroid Build Coastguard Worker struct sigaction sa;
799*6777b538SAndroid Build Coastguard Worker #endif
800*6777b538SAndroid Build Coastguard Worker
801*6777b538SAndroid Build Coastguard Worker test_ok = 0;
802*6777b538SAndroid Build Coastguard Worker printf("Signal handler restore: ");
803*6777b538SAndroid Build Coastguard Worker #ifdef HAVE_SIGACTION
804*6777b538SAndroid Build Coastguard Worker sa.sa_handler = signal_cb_sa;
805*6777b538SAndroid Build Coastguard Worker sa.sa_flags = 0x0;
806*6777b538SAndroid Build Coastguard Worker sigemptyset(&sa.sa_mask);
807*6777b538SAndroid Build Coastguard Worker if (sigaction(SIGUSR1, &sa, NULL) == -1)
808*6777b538SAndroid Build Coastguard Worker goto out;
809*6777b538SAndroid Build Coastguard Worker #else
810*6777b538SAndroid Build Coastguard Worker if (signal(SIGUSR1, signal_cb_sa) == SIG_ERR)
811*6777b538SAndroid Build Coastguard Worker goto out;
812*6777b538SAndroid Build Coastguard Worker #endif
813*6777b538SAndroid Build Coastguard Worker signal_set(&ev, SIGUSR1, signal_cb, &ev);
814*6777b538SAndroid Build Coastguard Worker signal_add(&ev, NULL);
815*6777b538SAndroid Build Coastguard Worker signal_del(&ev);
816*6777b538SAndroid Build Coastguard Worker
817*6777b538SAndroid Build Coastguard Worker raise(SIGUSR1);
818*6777b538SAndroid Build Coastguard Worker /* 1 == signal_cb, 2 == signal_cb_sa, we want our previous handler */
819*6777b538SAndroid Build Coastguard Worker if (test_ok != 2)
820*6777b538SAndroid Build Coastguard Worker test_ok = 0;
821*6777b538SAndroid Build Coastguard Worker out:
822*6777b538SAndroid Build Coastguard Worker event_base_free(base);
823*6777b538SAndroid Build Coastguard Worker cleanup_test();
824*6777b538SAndroid Build Coastguard Worker return;
825*6777b538SAndroid Build Coastguard Worker }
826*6777b538SAndroid Build Coastguard Worker
827*6777b538SAndroid Build Coastguard Worker static void
signal_cb_swp(int sig,short event,void * arg)828*6777b538SAndroid Build Coastguard Worker signal_cb_swp(int sig, short event, void *arg)
829*6777b538SAndroid Build Coastguard Worker {
830*6777b538SAndroid Build Coastguard Worker called++;
831*6777b538SAndroid Build Coastguard Worker if (called < 5)
832*6777b538SAndroid Build Coastguard Worker raise(sig);
833*6777b538SAndroid Build Coastguard Worker else
834*6777b538SAndroid Build Coastguard Worker event_loopexit(NULL);
835*6777b538SAndroid Build Coastguard Worker }
836*6777b538SAndroid Build Coastguard Worker static void
timeout_cb_swp(int fd,short event,void * arg)837*6777b538SAndroid Build Coastguard Worker timeout_cb_swp(int fd, short event, void *arg)
838*6777b538SAndroid Build Coastguard Worker {
839*6777b538SAndroid Build Coastguard Worker if (called == -1) {
840*6777b538SAndroid Build Coastguard Worker struct timeval tv = {5, 0};
841*6777b538SAndroid Build Coastguard Worker
842*6777b538SAndroid Build Coastguard Worker called = 0;
843*6777b538SAndroid Build Coastguard Worker evtimer_add((struct event *)arg, &tv);
844*6777b538SAndroid Build Coastguard Worker raise(SIGUSR1);
845*6777b538SAndroid Build Coastguard Worker return;
846*6777b538SAndroid Build Coastguard Worker }
847*6777b538SAndroid Build Coastguard Worker test_ok = 0;
848*6777b538SAndroid Build Coastguard Worker event_loopexit(NULL);
849*6777b538SAndroid Build Coastguard Worker }
850*6777b538SAndroid Build Coastguard Worker
851*6777b538SAndroid Build Coastguard Worker static void
test_signal_while_processing(void)852*6777b538SAndroid Build Coastguard Worker test_signal_while_processing(void)
853*6777b538SAndroid Build Coastguard Worker {
854*6777b538SAndroid Build Coastguard Worker struct event_base *base = event_init();
855*6777b538SAndroid Build Coastguard Worker struct event ev, ev_timer;
856*6777b538SAndroid Build Coastguard Worker struct timeval tv = {0, 0};
857*6777b538SAndroid Build Coastguard Worker
858*6777b538SAndroid Build Coastguard Worker setup_test("Receiving a signal while processing other signal: ");
859*6777b538SAndroid Build Coastguard Worker
860*6777b538SAndroid Build Coastguard Worker called = -1;
861*6777b538SAndroid Build Coastguard Worker test_ok = 1;
862*6777b538SAndroid Build Coastguard Worker signal_set(&ev, SIGUSR1, signal_cb_swp, NULL);
863*6777b538SAndroid Build Coastguard Worker signal_add(&ev, NULL);
864*6777b538SAndroid Build Coastguard Worker evtimer_set(&ev_timer, timeout_cb_swp, &ev_timer);
865*6777b538SAndroid Build Coastguard Worker evtimer_add(&ev_timer, &tv);
866*6777b538SAndroid Build Coastguard Worker event_dispatch();
867*6777b538SAndroid Build Coastguard Worker
868*6777b538SAndroid Build Coastguard Worker event_base_free(base);
869*6777b538SAndroid Build Coastguard Worker cleanup_test();
870*6777b538SAndroid Build Coastguard Worker return;
871*6777b538SAndroid Build Coastguard Worker }
872*6777b538SAndroid Build Coastguard Worker #endif
873*6777b538SAndroid Build Coastguard Worker
874*6777b538SAndroid Build Coastguard Worker static void
test_free_active_base(void)875*6777b538SAndroid Build Coastguard Worker test_free_active_base(void)
876*6777b538SAndroid Build Coastguard Worker {
877*6777b538SAndroid Build Coastguard Worker struct event_base *base1;
878*6777b538SAndroid Build Coastguard Worker struct event ev1;
879*6777b538SAndroid Build Coastguard Worker setup_test("Free active base: ");
880*6777b538SAndroid Build Coastguard Worker base1 = event_init();
881*6777b538SAndroid Build Coastguard Worker event_set(&ev1, pair[1], EV_READ, simple_read_cb, &ev1);
882*6777b538SAndroid Build Coastguard Worker event_base_set(base1, &ev1);
883*6777b538SAndroid Build Coastguard Worker event_add(&ev1, NULL);
884*6777b538SAndroid Build Coastguard Worker /* event_del(&ev1); */
885*6777b538SAndroid Build Coastguard Worker event_base_free(base1);
886*6777b538SAndroid Build Coastguard Worker test_ok = 1;
887*6777b538SAndroid Build Coastguard Worker cleanup_test();
888*6777b538SAndroid Build Coastguard Worker }
889*6777b538SAndroid Build Coastguard Worker
890*6777b538SAndroid Build Coastguard Worker static void
test_event_base_new(void)891*6777b538SAndroid Build Coastguard Worker test_event_base_new(void)
892*6777b538SAndroid Build Coastguard Worker {
893*6777b538SAndroid Build Coastguard Worker struct event_base *base;
894*6777b538SAndroid Build Coastguard Worker struct event ev1;
895*6777b538SAndroid Build Coastguard Worker setup_test("Event base new: ");
896*6777b538SAndroid Build Coastguard Worker
897*6777b538SAndroid Build Coastguard Worker write(pair[0], TEST1, strlen(TEST1)+1);
898*6777b538SAndroid Build Coastguard Worker shutdown(pair[0], SHUT_WR);
899*6777b538SAndroid Build Coastguard Worker
900*6777b538SAndroid Build Coastguard Worker base = event_base_new();
901*6777b538SAndroid Build Coastguard Worker event_set(&ev1, pair[1], EV_READ, simple_read_cb, &ev1);
902*6777b538SAndroid Build Coastguard Worker event_base_set(base, &ev1);
903*6777b538SAndroid Build Coastguard Worker event_add(&ev1, NULL);
904*6777b538SAndroid Build Coastguard Worker
905*6777b538SAndroid Build Coastguard Worker event_base_dispatch(base);
906*6777b538SAndroid Build Coastguard Worker
907*6777b538SAndroid Build Coastguard Worker event_base_free(base);
908*6777b538SAndroid Build Coastguard Worker test_ok = 1;
909*6777b538SAndroid Build Coastguard Worker cleanup_test();
910*6777b538SAndroid Build Coastguard Worker }
911*6777b538SAndroid Build Coastguard Worker
912*6777b538SAndroid Build Coastguard Worker static void
test_loopexit(void)913*6777b538SAndroid Build Coastguard Worker test_loopexit(void)
914*6777b538SAndroid Build Coastguard Worker {
915*6777b538SAndroid Build Coastguard Worker struct timeval tv, tv_start, tv_end;
916*6777b538SAndroid Build Coastguard Worker struct event ev;
917*6777b538SAndroid Build Coastguard Worker
918*6777b538SAndroid Build Coastguard Worker setup_test("Loop exit: ");
919*6777b538SAndroid Build Coastguard Worker
920*6777b538SAndroid Build Coastguard Worker tv.tv_usec = 0;
921*6777b538SAndroid Build Coastguard Worker tv.tv_sec = 60*60*24;
922*6777b538SAndroid Build Coastguard Worker evtimer_set(&ev, timeout_cb, NULL);
923*6777b538SAndroid Build Coastguard Worker evtimer_add(&ev, &tv);
924*6777b538SAndroid Build Coastguard Worker
925*6777b538SAndroid Build Coastguard Worker tv.tv_usec = 0;
926*6777b538SAndroid Build Coastguard Worker tv.tv_sec = 1;
927*6777b538SAndroid Build Coastguard Worker event_loopexit(&tv);
928*6777b538SAndroid Build Coastguard Worker
929*6777b538SAndroid Build Coastguard Worker evutil_gettimeofday(&tv_start, NULL);
930*6777b538SAndroid Build Coastguard Worker event_dispatch();
931*6777b538SAndroid Build Coastguard Worker evutil_gettimeofday(&tv_end, NULL);
932*6777b538SAndroid Build Coastguard Worker evutil_timersub(&tv_end, &tv_start, &tv_end);
933*6777b538SAndroid Build Coastguard Worker
934*6777b538SAndroid Build Coastguard Worker evtimer_del(&ev);
935*6777b538SAndroid Build Coastguard Worker
936*6777b538SAndroid Build Coastguard Worker if (tv.tv_sec < 2)
937*6777b538SAndroid Build Coastguard Worker test_ok = 1;
938*6777b538SAndroid Build Coastguard Worker
939*6777b538SAndroid Build Coastguard Worker cleanup_test();
940*6777b538SAndroid Build Coastguard Worker }
941*6777b538SAndroid Build Coastguard Worker
942*6777b538SAndroid Build Coastguard Worker static void
test_loopexit_multiple(void)943*6777b538SAndroid Build Coastguard Worker test_loopexit_multiple(void)
944*6777b538SAndroid Build Coastguard Worker {
945*6777b538SAndroid Build Coastguard Worker struct timeval tv;
946*6777b538SAndroid Build Coastguard Worker struct event_base *base;
947*6777b538SAndroid Build Coastguard Worker
948*6777b538SAndroid Build Coastguard Worker setup_test("Loop Multiple exit: ");
949*6777b538SAndroid Build Coastguard Worker
950*6777b538SAndroid Build Coastguard Worker base = event_base_new();
951*6777b538SAndroid Build Coastguard Worker
952*6777b538SAndroid Build Coastguard Worker tv.tv_usec = 0;
953*6777b538SAndroid Build Coastguard Worker tv.tv_sec = 1;
954*6777b538SAndroid Build Coastguard Worker event_base_loopexit(base, &tv);
955*6777b538SAndroid Build Coastguard Worker
956*6777b538SAndroid Build Coastguard Worker tv.tv_usec = 0;
957*6777b538SAndroid Build Coastguard Worker tv.tv_sec = 2;
958*6777b538SAndroid Build Coastguard Worker event_base_loopexit(base, &tv);
959*6777b538SAndroid Build Coastguard Worker
960*6777b538SAndroid Build Coastguard Worker event_base_dispatch(base);
961*6777b538SAndroid Build Coastguard Worker
962*6777b538SAndroid Build Coastguard Worker event_base_free(base);
963*6777b538SAndroid Build Coastguard Worker
964*6777b538SAndroid Build Coastguard Worker test_ok = 1;
965*6777b538SAndroid Build Coastguard Worker
966*6777b538SAndroid Build Coastguard Worker cleanup_test();
967*6777b538SAndroid Build Coastguard Worker }
968*6777b538SAndroid Build Coastguard Worker
969*6777b538SAndroid Build Coastguard Worker static void
break_cb(int fd,short events,void * arg)970*6777b538SAndroid Build Coastguard Worker break_cb(int fd, short events, void *arg)
971*6777b538SAndroid Build Coastguard Worker {
972*6777b538SAndroid Build Coastguard Worker test_ok = 1;
973*6777b538SAndroid Build Coastguard Worker event_loopbreak();
974*6777b538SAndroid Build Coastguard Worker }
975*6777b538SAndroid Build Coastguard Worker
976*6777b538SAndroid Build Coastguard Worker static void
fail_cb(int fd,short events,void * arg)977*6777b538SAndroid Build Coastguard Worker fail_cb(int fd, short events, void *arg)
978*6777b538SAndroid Build Coastguard Worker {
979*6777b538SAndroid Build Coastguard Worker test_ok = 0;
980*6777b538SAndroid Build Coastguard Worker }
981*6777b538SAndroid Build Coastguard Worker
982*6777b538SAndroid Build Coastguard Worker static void
test_loopbreak(void)983*6777b538SAndroid Build Coastguard Worker test_loopbreak(void)
984*6777b538SAndroid Build Coastguard Worker {
985*6777b538SAndroid Build Coastguard Worker struct event ev1, ev2;
986*6777b538SAndroid Build Coastguard Worker struct timeval tv;
987*6777b538SAndroid Build Coastguard Worker
988*6777b538SAndroid Build Coastguard Worker setup_test("Loop break: ");
989*6777b538SAndroid Build Coastguard Worker
990*6777b538SAndroid Build Coastguard Worker tv.tv_sec = 0;
991*6777b538SAndroid Build Coastguard Worker tv.tv_usec = 0;
992*6777b538SAndroid Build Coastguard Worker evtimer_set(&ev1, break_cb, NULL);
993*6777b538SAndroid Build Coastguard Worker evtimer_add(&ev1, &tv);
994*6777b538SAndroid Build Coastguard Worker evtimer_set(&ev2, fail_cb, NULL);
995*6777b538SAndroid Build Coastguard Worker evtimer_add(&ev2, &tv);
996*6777b538SAndroid Build Coastguard Worker
997*6777b538SAndroid Build Coastguard Worker event_dispatch();
998*6777b538SAndroid Build Coastguard Worker
999*6777b538SAndroid Build Coastguard Worker evtimer_del(&ev1);
1000*6777b538SAndroid Build Coastguard Worker evtimer_del(&ev2);
1001*6777b538SAndroid Build Coastguard Worker
1002*6777b538SAndroid Build Coastguard Worker cleanup_test();
1003*6777b538SAndroid Build Coastguard Worker }
1004*6777b538SAndroid Build Coastguard Worker
1005*6777b538SAndroid Build Coastguard Worker static void
test_evbuffer(void)1006*6777b538SAndroid Build Coastguard Worker test_evbuffer(void) {
1007*6777b538SAndroid Build Coastguard Worker
1008*6777b538SAndroid Build Coastguard Worker struct evbuffer *evb = evbuffer_new();
1009*6777b538SAndroid Build Coastguard Worker setup_test("Testing Evbuffer: ");
1010*6777b538SAndroid Build Coastguard Worker
1011*6777b538SAndroid Build Coastguard Worker evbuffer_add_printf(evb, "%s/%d", "hello", 1);
1012*6777b538SAndroid Build Coastguard Worker
1013*6777b538SAndroid Build Coastguard Worker if (EVBUFFER_LENGTH(evb) == 7 &&
1014*6777b538SAndroid Build Coastguard Worker strcmp((char*)EVBUFFER_DATA(evb), "hello/1") == 0)
1015*6777b538SAndroid Build Coastguard Worker test_ok = 1;
1016*6777b538SAndroid Build Coastguard Worker
1017*6777b538SAndroid Build Coastguard Worker evbuffer_free(evb);
1018*6777b538SAndroid Build Coastguard Worker
1019*6777b538SAndroid Build Coastguard Worker cleanup_test();
1020*6777b538SAndroid Build Coastguard Worker }
1021*6777b538SAndroid Build Coastguard Worker
1022*6777b538SAndroid Build Coastguard Worker static void
test_evbuffer_readln(void)1023*6777b538SAndroid Build Coastguard Worker test_evbuffer_readln(void)
1024*6777b538SAndroid Build Coastguard Worker {
1025*6777b538SAndroid Build Coastguard Worker struct evbuffer *evb = evbuffer_new();
1026*6777b538SAndroid Build Coastguard Worker struct evbuffer *evb_tmp = evbuffer_new();
1027*6777b538SAndroid Build Coastguard Worker const char *s;
1028*6777b538SAndroid Build Coastguard Worker char *cp = NULL;
1029*6777b538SAndroid Build Coastguard Worker size_t sz;
1030*6777b538SAndroid Build Coastguard Worker
1031*6777b538SAndroid Build Coastguard Worker #define tt_line_eq(content) \
1032*6777b538SAndroid Build Coastguard Worker if (!cp || sz != strlen(content) || strcmp(cp, content)) { \
1033*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "FAILED\n"); \
1034*6777b538SAndroid Build Coastguard Worker exit(1); \
1035*6777b538SAndroid Build Coastguard Worker }
1036*6777b538SAndroid Build Coastguard Worker #define tt_assert(expression) \
1037*6777b538SAndroid Build Coastguard Worker if (!(expression)) { \
1038*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "FAILED\n"); \
1039*6777b538SAndroid Build Coastguard Worker exit(1); \
1040*6777b538SAndroid Build Coastguard Worker } \
1041*6777b538SAndroid Build Coastguard Worker
1042*6777b538SAndroid Build Coastguard Worker /* Test EOL_ANY. */
1043*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "Testing evbuffer_readln EOL_ANY: ");
1044*6777b538SAndroid Build Coastguard Worker
1045*6777b538SAndroid Build Coastguard Worker s = "complex silly newline\r\n\n\r\n\n\rmore\0\n";
1046*6777b538SAndroid Build Coastguard Worker evbuffer_add(evb, s, strlen(s)+2);
1047*6777b538SAndroid Build Coastguard Worker cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_ANY);
1048*6777b538SAndroid Build Coastguard Worker tt_line_eq("complex silly newline");
1049*6777b538SAndroid Build Coastguard Worker free(cp);
1050*6777b538SAndroid Build Coastguard Worker cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_ANY);
1051*6777b538SAndroid Build Coastguard Worker if (!cp || sz != 5 || memcmp(cp, "more\0\0", 6)) {
1052*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "FAILED\n");
1053*6777b538SAndroid Build Coastguard Worker exit(1);
1054*6777b538SAndroid Build Coastguard Worker }
1055*6777b538SAndroid Build Coastguard Worker if (evb->totallen == 0) {
1056*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "FAILED\n");
1057*6777b538SAndroid Build Coastguard Worker exit(1);
1058*6777b538SAndroid Build Coastguard Worker }
1059*6777b538SAndroid Build Coastguard Worker s = "\nno newline";
1060*6777b538SAndroid Build Coastguard Worker evbuffer_add(evb, s, strlen(s));
1061*6777b538SAndroid Build Coastguard Worker free(cp);
1062*6777b538SAndroid Build Coastguard Worker cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_ANY);
1063*6777b538SAndroid Build Coastguard Worker tt_line_eq("");
1064*6777b538SAndroid Build Coastguard Worker free(cp);
1065*6777b538SAndroid Build Coastguard Worker cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_ANY);
1066*6777b538SAndroid Build Coastguard Worker tt_assert(!cp);
1067*6777b538SAndroid Build Coastguard Worker evbuffer_drain(evb, EVBUFFER_LENGTH(evb));
1068*6777b538SAndroid Build Coastguard Worker tt_assert(EVBUFFER_LENGTH(evb) == 0);
1069*6777b538SAndroid Build Coastguard Worker
1070*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "OK\n");
1071*6777b538SAndroid Build Coastguard Worker
1072*6777b538SAndroid Build Coastguard Worker /* Test EOL_CRLF */
1073*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "Testing evbuffer_readln EOL_CRLF: ");
1074*6777b538SAndroid Build Coastguard Worker
1075*6777b538SAndroid Build Coastguard Worker s = "Line with\rin the middle\nLine with good crlf\r\n\nfinal\n";
1076*6777b538SAndroid Build Coastguard Worker evbuffer_add(evb, s, strlen(s));
1077*6777b538SAndroid Build Coastguard Worker cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF);
1078*6777b538SAndroid Build Coastguard Worker tt_line_eq("Line with\rin the middle");
1079*6777b538SAndroid Build Coastguard Worker free(cp);
1080*6777b538SAndroid Build Coastguard Worker
1081*6777b538SAndroid Build Coastguard Worker cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF);
1082*6777b538SAndroid Build Coastguard Worker tt_line_eq("Line with good crlf");
1083*6777b538SAndroid Build Coastguard Worker free(cp);
1084*6777b538SAndroid Build Coastguard Worker
1085*6777b538SAndroid Build Coastguard Worker cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF);
1086*6777b538SAndroid Build Coastguard Worker tt_line_eq("");
1087*6777b538SAndroid Build Coastguard Worker free(cp);
1088*6777b538SAndroid Build Coastguard Worker
1089*6777b538SAndroid Build Coastguard Worker cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF);
1090*6777b538SAndroid Build Coastguard Worker tt_line_eq("final");
1091*6777b538SAndroid Build Coastguard Worker s = "x";
1092*6777b538SAndroid Build Coastguard Worker evbuffer_add(evb, s, 1);
1093*6777b538SAndroid Build Coastguard Worker free(cp);
1094*6777b538SAndroid Build Coastguard Worker cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF);
1095*6777b538SAndroid Build Coastguard Worker tt_assert(!cp);
1096*6777b538SAndroid Build Coastguard Worker
1097*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "OK\n");
1098*6777b538SAndroid Build Coastguard Worker
1099*6777b538SAndroid Build Coastguard Worker /* Test CRLF_STRICT */
1100*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "Testing evbuffer_readln CRLF_STRICT: ");
1101*6777b538SAndroid Build Coastguard Worker
1102*6777b538SAndroid Build Coastguard Worker s = " and a bad crlf\nand a good one\r\n\r\nMore\r";
1103*6777b538SAndroid Build Coastguard Worker evbuffer_add(evb, s, strlen(s));
1104*6777b538SAndroid Build Coastguard Worker cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF_STRICT);
1105*6777b538SAndroid Build Coastguard Worker tt_line_eq("x and a bad crlf\nand a good one");
1106*6777b538SAndroid Build Coastguard Worker free(cp);
1107*6777b538SAndroid Build Coastguard Worker
1108*6777b538SAndroid Build Coastguard Worker cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF_STRICT);
1109*6777b538SAndroid Build Coastguard Worker tt_line_eq("");
1110*6777b538SAndroid Build Coastguard Worker free(cp);
1111*6777b538SAndroid Build Coastguard Worker
1112*6777b538SAndroid Build Coastguard Worker cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF_STRICT);
1113*6777b538SAndroid Build Coastguard Worker tt_assert(!cp);
1114*6777b538SAndroid Build Coastguard Worker evbuffer_add(evb, "\n", 1);
1115*6777b538SAndroid Build Coastguard Worker
1116*6777b538SAndroid Build Coastguard Worker cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF_STRICT);
1117*6777b538SAndroid Build Coastguard Worker tt_line_eq("More");
1118*6777b538SAndroid Build Coastguard Worker free(cp);
1119*6777b538SAndroid Build Coastguard Worker tt_assert(EVBUFFER_LENGTH(evb) == 0);
1120*6777b538SAndroid Build Coastguard Worker
1121*6777b538SAndroid Build Coastguard Worker s = "An internal CR\r is not an eol\r\nNor is a lack of one";
1122*6777b538SAndroid Build Coastguard Worker evbuffer_add(evb, s, strlen(s));
1123*6777b538SAndroid Build Coastguard Worker cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF_STRICT);
1124*6777b538SAndroid Build Coastguard Worker tt_line_eq("An internal CR\r is not an eol");
1125*6777b538SAndroid Build Coastguard Worker free(cp);
1126*6777b538SAndroid Build Coastguard Worker
1127*6777b538SAndroid Build Coastguard Worker cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF_STRICT);
1128*6777b538SAndroid Build Coastguard Worker tt_assert(!cp);
1129*6777b538SAndroid Build Coastguard Worker
1130*6777b538SAndroid Build Coastguard Worker evbuffer_add(evb, "\r\n", 2);
1131*6777b538SAndroid Build Coastguard Worker cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF_STRICT);
1132*6777b538SAndroid Build Coastguard Worker tt_line_eq("Nor is a lack of one");
1133*6777b538SAndroid Build Coastguard Worker free(cp);
1134*6777b538SAndroid Build Coastguard Worker tt_assert(EVBUFFER_LENGTH(evb) == 0);
1135*6777b538SAndroid Build Coastguard Worker
1136*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "OK\n");
1137*6777b538SAndroid Build Coastguard Worker
1138*6777b538SAndroid Build Coastguard Worker /* Test LF */
1139*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "Testing evbuffer_readln LF: ");
1140*6777b538SAndroid Build Coastguard Worker
1141*6777b538SAndroid Build Coastguard Worker s = "An\rand a nl\n\nText";
1142*6777b538SAndroid Build Coastguard Worker evbuffer_add(evb, s, strlen(s));
1143*6777b538SAndroid Build Coastguard Worker
1144*6777b538SAndroid Build Coastguard Worker cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_LF);
1145*6777b538SAndroid Build Coastguard Worker tt_line_eq("An\rand a nl");
1146*6777b538SAndroid Build Coastguard Worker free(cp);
1147*6777b538SAndroid Build Coastguard Worker
1148*6777b538SAndroid Build Coastguard Worker cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_LF);
1149*6777b538SAndroid Build Coastguard Worker tt_line_eq("");
1150*6777b538SAndroid Build Coastguard Worker free(cp);
1151*6777b538SAndroid Build Coastguard Worker
1152*6777b538SAndroid Build Coastguard Worker cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_LF);
1153*6777b538SAndroid Build Coastguard Worker tt_assert(!cp);
1154*6777b538SAndroid Build Coastguard Worker free(cp);
1155*6777b538SAndroid Build Coastguard Worker evbuffer_add(evb, "\n", 1);
1156*6777b538SAndroid Build Coastguard Worker cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_LF);
1157*6777b538SAndroid Build Coastguard Worker tt_line_eq("Text");
1158*6777b538SAndroid Build Coastguard Worker free(cp);
1159*6777b538SAndroid Build Coastguard Worker
1160*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "OK\n");
1161*6777b538SAndroid Build Coastguard Worker
1162*6777b538SAndroid Build Coastguard Worker /* Test CRLF_STRICT - across boundaries */
1163*6777b538SAndroid Build Coastguard Worker fprintf(stdout,
1164*6777b538SAndroid Build Coastguard Worker "Testing evbuffer_readln CRLF_STRICT across boundaries: ");
1165*6777b538SAndroid Build Coastguard Worker
1166*6777b538SAndroid Build Coastguard Worker s = " and a bad crlf\nand a good one\r";
1167*6777b538SAndroid Build Coastguard Worker evbuffer_add(evb_tmp, s, strlen(s));
1168*6777b538SAndroid Build Coastguard Worker evbuffer_add_buffer(evb, evb_tmp);
1169*6777b538SAndroid Build Coastguard Worker s = "\n\r";
1170*6777b538SAndroid Build Coastguard Worker evbuffer_add(evb_tmp, s, strlen(s));
1171*6777b538SAndroid Build Coastguard Worker evbuffer_add_buffer(evb, evb_tmp);
1172*6777b538SAndroid Build Coastguard Worker s = "\nMore\r";
1173*6777b538SAndroid Build Coastguard Worker evbuffer_add(evb_tmp, s, strlen(s));
1174*6777b538SAndroid Build Coastguard Worker evbuffer_add_buffer(evb, evb_tmp);
1175*6777b538SAndroid Build Coastguard Worker
1176*6777b538SAndroid Build Coastguard Worker cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF_STRICT);
1177*6777b538SAndroid Build Coastguard Worker tt_line_eq(" and a bad crlf\nand a good one");
1178*6777b538SAndroid Build Coastguard Worker free(cp);
1179*6777b538SAndroid Build Coastguard Worker
1180*6777b538SAndroid Build Coastguard Worker cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF_STRICT);
1181*6777b538SAndroid Build Coastguard Worker tt_line_eq("");
1182*6777b538SAndroid Build Coastguard Worker free(cp);
1183*6777b538SAndroid Build Coastguard Worker
1184*6777b538SAndroid Build Coastguard Worker cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF_STRICT);
1185*6777b538SAndroid Build Coastguard Worker tt_assert(!cp);
1186*6777b538SAndroid Build Coastguard Worker free(cp);
1187*6777b538SAndroid Build Coastguard Worker evbuffer_add(evb, "\n", 1);
1188*6777b538SAndroid Build Coastguard Worker cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF_STRICT);
1189*6777b538SAndroid Build Coastguard Worker tt_line_eq("More");
1190*6777b538SAndroid Build Coastguard Worker free(cp); cp = NULL;
1191*6777b538SAndroid Build Coastguard Worker if (EVBUFFER_LENGTH(evb) != 0) {
1192*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "FAILED\n");
1193*6777b538SAndroid Build Coastguard Worker exit(1);
1194*6777b538SAndroid Build Coastguard Worker }
1195*6777b538SAndroid Build Coastguard Worker
1196*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "OK\n");
1197*6777b538SAndroid Build Coastguard Worker
1198*6777b538SAndroid Build Coastguard Worker /* Test memory problem */
1199*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "Testing evbuffer_readln memory problem: ");
1200*6777b538SAndroid Build Coastguard Worker
1201*6777b538SAndroid Build Coastguard Worker s = "one line\ntwo line\nblue line";
1202*6777b538SAndroid Build Coastguard Worker evbuffer_add(evb_tmp, s, strlen(s));
1203*6777b538SAndroid Build Coastguard Worker evbuffer_add_buffer(evb, evb_tmp);
1204*6777b538SAndroid Build Coastguard Worker
1205*6777b538SAndroid Build Coastguard Worker cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_LF);
1206*6777b538SAndroid Build Coastguard Worker tt_line_eq("one line");
1207*6777b538SAndroid Build Coastguard Worker free(cp); cp = NULL;
1208*6777b538SAndroid Build Coastguard Worker
1209*6777b538SAndroid Build Coastguard Worker cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_LF);
1210*6777b538SAndroid Build Coastguard Worker tt_line_eq("two line");
1211*6777b538SAndroid Build Coastguard Worker free(cp); cp = NULL;
1212*6777b538SAndroid Build Coastguard Worker
1213*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "OK\n");
1214*6777b538SAndroid Build Coastguard Worker
1215*6777b538SAndroid Build Coastguard Worker test_ok = 1;
1216*6777b538SAndroid Build Coastguard Worker evbuffer_free(evb);
1217*6777b538SAndroid Build Coastguard Worker evbuffer_free(evb_tmp);
1218*6777b538SAndroid Build Coastguard Worker if (cp) free(cp);
1219*6777b538SAndroid Build Coastguard Worker }
1220*6777b538SAndroid Build Coastguard Worker
1221*6777b538SAndroid Build Coastguard Worker static void
test_evbuffer_find(void)1222*6777b538SAndroid Build Coastguard Worker test_evbuffer_find(void)
1223*6777b538SAndroid Build Coastguard Worker {
1224*6777b538SAndroid Build Coastguard Worker u_char* p;
1225*6777b538SAndroid Build Coastguard Worker const char* test1 = "1234567890\r\n";
1226*6777b538SAndroid Build Coastguard Worker const char* test2 = "1234567890\r";
1227*6777b538SAndroid Build Coastguard Worker #define EVBUFFER_INITIAL_LENGTH 256
1228*6777b538SAndroid Build Coastguard Worker char test3[EVBUFFER_INITIAL_LENGTH];
1229*6777b538SAndroid Build Coastguard Worker unsigned int i;
1230*6777b538SAndroid Build Coastguard Worker struct evbuffer * buf = evbuffer_new();
1231*6777b538SAndroid Build Coastguard Worker
1232*6777b538SAndroid Build Coastguard Worker /* make sure evbuffer_find doesn't match past the end of the buffer */
1233*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "Testing evbuffer_find 1: ");
1234*6777b538SAndroid Build Coastguard Worker evbuffer_add(buf, (u_char*)test1, strlen(test1));
1235*6777b538SAndroid Build Coastguard Worker evbuffer_drain(buf, strlen(test1));
1236*6777b538SAndroid Build Coastguard Worker evbuffer_add(buf, (u_char*)test2, strlen(test2));
1237*6777b538SAndroid Build Coastguard Worker p = evbuffer_find(buf, (u_char*)"\r\n", 2);
1238*6777b538SAndroid Build Coastguard Worker if (p == NULL) {
1239*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "OK\n");
1240*6777b538SAndroid Build Coastguard Worker } else {
1241*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "FAILED\n");
1242*6777b538SAndroid Build Coastguard Worker exit(1);
1243*6777b538SAndroid Build Coastguard Worker }
1244*6777b538SAndroid Build Coastguard Worker
1245*6777b538SAndroid Build Coastguard Worker /*
1246*6777b538SAndroid Build Coastguard Worker * drain the buffer and do another find; in r309 this would
1247*6777b538SAndroid Build Coastguard Worker * read past the allocated buffer causing a valgrind error.
1248*6777b538SAndroid Build Coastguard Worker */
1249*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "Testing evbuffer_find 2: ");
1250*6777b538SAndroid Build Coastguard Worker evbuffer_drain(buf, strlen(test2));
1251*6777b538SAndroid Build Coastguard Worker for (i = 0; i < EVBUFFER_INITIAL_LENGTH; ++i)
1252*6777b538SAndroid Build Coastguard Worker test3[i] = 'a';
1253*6777b538SAndroid Build Coastguard Worker test3[EVBUFFER_INITIAL_LENGTH - 1] = 'x';
1254*6777b538SAndroid Build Coastguard Worker evbuffer_add(buf, (u_char *)test3, EVBUFFER_INITIAL_LENGTH);
1255*6777b538SAndroid Build Coastguard Worker p = evbuffer_find(buf, (u_char *)"xy", 2);
1256*6777b538SAndroid Build Coastguard Worker if (p == NULL) {
1257*6777b538SAndroid Build Coastguard Worker printf("OK\n");
1258*6777b538SAndroid Build Coastguard Worker } else {
1259*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "FAILED\n");
1260*6777b538SAndroid Build Coastguard Worker exit(1);
1261*6777b538SAndroid Build Coastguard Worker }
1262*6777b538SAndroid Build Coastguard Worker
1263*6777b538SAndroid Build Coastguard Worker /* simple test for match at end of allocated buffer */
1264*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "Testing evbuffer_find 3: ");
1265*6777b538SAndroid Build Coastguard Worker p = evbuffer_find(buf, (u_char *)"ax", 2);
1266*6777b538SAndroid Build Coastguard Worker if (p != NULL && strncmp((char*)p, "ax", 2) == 0) {
1267*6777b538SAndroid Build Coastguard Worker printf("OK\n");
1268*6777b538SAndroid Build Coastguard Worker } else {
1269*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "FAILED\n");
1270*6777b538SAndroid Build Coastguard Worker exit(1);
1271*6777b538SAndroid Build Coastguard Worker }
1272*6777b538SAndroid Build Coastguard Worker
1273*6777b538SAndroid Build Coastguard Worker evbuffer_free(buf);
1274*6777b538SAndroid Build Coastguard Worker }
1275*6777b538SAndroid Build Coastguard Worker
1276*6777b538SAndroid Build Coastguard Worker /*
1277*6777b538SAndroid Build Coastguard Worker * simple bufferevent test
1278*6777b538SAndroid Build Coastguard Worker */
1279*6777b538SAndroid Build Coastguard Worker
1280*6777b538SAndroid Build Coastguard Worker static void
readcb(struct bufferevent * bev,void * arg)1281*6777b538SAndroid Build Coastguard Worker readcb(struct bufferevent *bev, void *arg)
1282*6777b538SAndroid Build Coastguard Worker {
1283*6777b538SAndroid Build Coastguard Worker if (EVBUFFER_LENGTH(bev->input) == 8333) {
1284*6777b538SAndroid Build Coastguard Worker bufferevent_disable(bev, EV_READ);
1285*6777b538SAndroid Build Coastguard Worker test_ok++;
1286*6777b538SAndroid Build Coastguard Worker }
1287*6777b538SAndroid Build Coastguard Worker }
1288*6777b538SAndroid Build Coastguard Worker
1289*6777b538SAndroid Build Coastguard Worker static void
writecb(struct bufferevent * bev,void * arg)1290*6777b538SAndroid Build Coastguard Worker writecb(struct bufferevent *bev, void *arg)
1291*6777b538SAndroid Build Coastguard Worker {
1292*6777b538SAndroid Build Coastguard Worker if (EVBUFFER_LENGTH(bev->output) == 0)
1293*6777b538SAndroid Build Coastguard Worker test_ok++;
1294*6777b538SAndroid Build Coastguard Worker }
1295*6777b538SAndroid Build Coastguard Worker
1296*6777b538SAndroid Build Coastguard Worker static void
errorcb(struct bufferevent * bev,short what,void * arg)1297*6777b538SAndroid Build Coastguard Worker errorcb(struct bufferevent *bev, short what, void *arg)
1298*6777b538SAndroid Build Coastguard Worker {
1299*6777b538SAndroid Build Coastguard Worker test_ok = -2;
1300*6777b538SAndroid Build Coastguard Worker }
1301*6777b538SAndroid Build Coastguard Worker
1302*6777b538SAndroid Build Coastguard Worker static void
test_bufferevent(void)1303*6777b538SAndroid Build Coastguard Worker test_bufferevent(void)
1304*6777b538SAndroid Build Coastguard Worker {
1305*6777b538SAndroid Build Coastguard Worker struct bufferevent *bev1, *bev2;
1306*6777b538SAndroid Build Coastguard Worker char buffer[8333];
1307*6777b538SAndroid Build Coastguard Worker int i;
1308*6777b538SAndroid Build Coastguard Worker
1309*6777b538SAndroid Build Coastguard Worker setup_test("Bufferevent: ");
1310*6777b538SAndroid Build Coastguard Worker
1311*6777b538SAndroid Build Coastguard Worker bev1 = bufferevent_new(pair[0], readcb, writecb, errorcb, NULL);
1312*6777b538SAndroid Build Coastguard Worker bev2 = bufferevent_new(pair[1], readcb, writecb, errorcb, NULL);
1313*6777b538SAndroid Build Coastguard Worker
1314*6777b538SAndroid Build Coastguard Worker bufferevent_disable(bev1, EV_READ);
1315*6777b538SAndroid Build Coastguard Worker bufferevent_enable(bev2, EV_READ);
1316*6777b538SAndroid Build Coastguard Worker
1317*6777b538SAndroid Build Coastguard Worker for (i = 0; i < sizeof(buffer); i++)
1318*6777b538SAndroid Build Coastguard Worker buffer[i] = i;
1319*6777b538SAndroid Build Coastguard Worker
1320*6777b538SAndroid Build Coastguard Worker bufferevent_write(bev1, buffer, sizeof(buffer));
1321*6777b538SAndroid Build Coastguard Worker
1322*6777b538SAndroid Build Coastguard Worker event_dispatch();
1323*6777b538SAndroid Build Coastguard Worker
1324*6777b538SAndroid Build Coastguard Worker bufferevent_free(bev1);
1325*6777b538SAndroid Build Coastguard Worker bufferevent_free(bev2);
1326*6777b538SAndroid Build Coastguard Worker
1327*6777b538SAndroid Build Coastguard Worker if (test_ok != 2)
1328*6777b538SAndroid Build Coastguard Worker test_ok = 0;
1329*6777b538SAndroid Build Coastguard Worker
1330*6777b538SAndroid Build Coastguard Worker cleanup_test();
1331*6777b538SAndroid Build Coastguard Worker }
1332*6777b538SAndroid Build Coastguard Worker
1333*6777b538SAndroid Build Coastguard Worker /*
1334*6777b538SAndroid Build Coastguard Worker * test watermarks and bufferevent
1335*6777b538SAndroid Build Coastguard Worker */
1336*6777b538SAndroid Build Coastguard Worker
1337*6777b538SAndroid Build Coastguard Worker static void
wm_readcb(struct bufferevent * bev,void * arg)1338*6777b538SAndroid Build Coastguard Worker wm_readcb(struct bufferevent *bev, void *arg)
1339*6777b538SAndroid Build Coastguard Worker {
1340*6777b538SAndroid Build Coastguard Worker int len = EVBUFFER_LENGTH(bev->input);
1341*6777b538SAndroid Build Coastguard Worker static int nread;
1342*6777b538SAndroid Build Coastguard Worker
1343*6777b538SAndroid Build Coastguard Worker assert(len >= 10 && len <= 20);
1344*6777b538SAndroid Build Coastguard Worker
1345*6777b538SAndroid Build Coastguard Worker evbuffer_drain(bev->input, len);
1346*6777b538SAndroid Build Coastguard Worker
1347*6777b538SAndroid Build Coastguard Worker nread += len;
1348*6777b538SAndroid Build Coastguard Worker if (nread == 65000) {
1349*6777b538SAndroid Build Coastguard Worker bufferevent_disable(bev, EV_READ);
1350*6777b538SAndroid Build Coastguard Worker test_ok++;
1351*6777b538SAndroid Build Coastguard Worker }
1352*6777b538SAndroid Build Coastguard Worker }
1353*6777b538SAndroid Build Coastguard Worker
1354*6777b538SAndroid Build Coastguard Worker static void
wm_writecb(struct bufferevent * bev,void * arg)1355*6777b538SAndroid Build Coastguard Worker wm_writecb(struct bufferevent *bev, void *arg)
1356*6777b538SAndroid Build Coastguard Worker {
1357*6777b538SAndroid Build Coastguard Worker if (EVBUFFER_LENGTH(bev->output) == 0)
1358*6777b538SAndroid Build Coastguard Worker test_ok++;
1359*6777b538SAndroid Build Coastguard Worker }
1360*6777b538SAndroid Build Coastguard Worker
1361*6777b538SAndroid Build Coastguard Worker static void
wm_errorcb(struct bufferevent * bev,short what,void * arg)1362*6777b538SAndroid Build Coastguard Worker wm_errorcb(struct bufferevent *bev, short what, void *arg)
1363*6777b538SAndroid Build Coastguard Worker {
1364*6777b538SAndroid Build Coastguard Worker test_ok = -2;
1365*6777b538SAndroid Build Coastguard Worker }
1366*6777b538SAndroid Build Coastguard Worker
1367*6777b538SAndroid Build Coastguard Worker static void
test_bufferevent_watermarks(void)1368*6777b538SAndroid Build Coastguard Worker test_bufferevent_watermarks(void)
1369*6777b538SAndroid Build Coastguard Worker {
1370*6777b538SAndroid Build Coastguard Worker struct bufferevent *bev1, *bev2;
1371*6777b538SAndroid Build Coastguard Worker char buffer[65000];
1372*6777b538SAndroid Build Coastguard Worker int i;
1373*6777b538SAndroid Build Coastguard Worker
1374*6777b538SAndroid Build Coastguard Worker setup_test("Bufferevent Watermarks: ");
1375*6777b538SAndroid Build Coastguard Worker
1376*6777b538SAndroid Build Coastguard Worker bev1 = bufferevent_new(pair[0], NULL, wm_writecb, wm_errorcb, NULL);
1377*6777b538SAndroid Build Coastguard Worker bev2 = bufferevent_new(pair[1], wm_readcb, NULL, wm_errorcb, NULL);
1378*6777b538SAndroid Build Coastguard Worker
1379*6777b538SAndroid Build Coastguard Worker bufferevent_disable(bev1, EV_READ);
1380*6777b538SAndroid Build Coastguard Worker bufferevent_enable(bev2, EV_READ);
1381*6777b538SAndroid Build Coastguard Worker
1382*6777b538SAndroid Build Coastguard Worker for (i = 0; i < sizeof(buffer); i++)
1383*6777b538SAndroid Build Coastguard Worker buffer[i] = i;
1384*6777b538SAndroid Build Coastguard Worker
1385*6777b538SAndroid Build Coastguard Worker bufferevent_write(bev1, buffer, sizeof(buffer));
1386*6777b538SAndroid Build Coastguard Worker
1387*6777b538SAndroid Build Coastguard Worker /* limit the reading on the receiving bufferevent */
1388*6777b538SAndroid Build Coastguard Worker bufferevent_setwatermark(bev2, EV_READ, 10, 20);
1389*6777b538SAndroid Build Coastguard Worker
1390*6777b538SAndroid Build Coastguard Worker event_dispatch();
1391*6777b538SAndroid Build Coastguard Worker
1392*6777b538SAndroid Build Coastguard Worker bufferevent_free(bev1);
1393*6777b538SAndroid Build Coastguard Worker bufferevent_free(bev2);
1394*6777b538SAndroid Build Coastguard Worker
1395*6777b538SAndroid Build Coastguard Worker if (test_ok != 2)
1396*6777b538SAndroid Build Coastguard Worker test_ok = 0;
1397*6777b538SAndroid Build Coastguard Worker
1398*6777b538SAndroid Build Coastguard Worker cleanup_test();
1399*6777b538SAndroid Build Coastguard Worker }
1400*6777b538SAndroid Build Coastguard Worker
1401*6777b538SAndroid Build Coastguard Worker struct test_pri_event {
1402*6777b538SAndroid Build Coastguard Worker struct event ev;
1403*6777b538SAndroid Build Coastguard Worker int count;
1404*6777b538SAndroid Build Coastguard Worker };
1405*6777b538SAndroid Build Coastguard Worker
1406*6777b538SAndroid Build Coastguard Worker static void
test_priorities_cb(int fd,short what,void * arg)1407*6777b538SAndroid Build Coastguard Worker test_priorities_cb(int fd, short what, void *arg)
1408*6777b538SAndroid Build Coastguard Worker {
1409*6777b538SAndroid Build Coastguard Worker struct test_pri_event *pri = arg;
1410*6777b538SAndroid Build Coastguard Worker struct timeval tv;
1411*6777b538SAndroid Build Coastguard Worker
1412*6777b538SAndroid Build Coastguard Worker if (pri->count == 3) {
1413*6777b538SAndroid Build Coastguard Worker event_loopexit(NULL);
1414*6777b538SAndroid Build Coastguard Worker return;
1415*6777b538SAndroid Build Coastguard Worker }
1416*6777b538SAndroid Build Coastguard Worker
1417*6777b538SAndroid Build Coastguard Worker pri->count++;
1418*6777b538SAndroid Build Coastguard Worker
1419*6777b538SAndroid Build Coastguard Worker evutil_timerclear(&tv);
1420*6777b538SAndroid Build Coastguard Worker event_add(&pri->ev, &tv);
1421*6777b538SAndroid Build Coastguard Worker }
1422*6777b538SAndroid Build Coastguard Worker
1423*6777b538SAndroid Build Coastguard Worker static void
test_priorities(int npriorities)1424*6777b538SAndroid Build Coastguard Worker test_priorities(int npriorities)
1425*6777b538SAndroid Build Coastguard Worker {
1426*6777b538SAndroid Build Coastguard Worker char buf[32];
1427*6777b538SAndroid Build Coastguard Worker struct test_pri_event one, two;
1428*6777b538SAndroid Build Coastguard Worker struct timeval tv;
1429*6777b538SAndroid Build Coastguard Worker
1430*6777b538SAndroid Build Coastguard Worker evutil_snprintf(buf, sizeof(buf), "Testing Priorities %d: ", npriorities);
1431*6777b538SAndroid Build Coastguard Worker setup_test(buf);
1432*6777b538SAndroid Build Coastguard Worker
1433*6777b538SAndroid Build Coastguard Worker event_base_priority_init(global_base, npriorities);
1434*6777b538SAndroid Build Coastguard Worker
1435*6777b538SAndroid Build Coastguard Worker memset(&one, 0, sizeof(one));
1436*6777b538SAndroid Build Coastguard Worker memset(&two, 0, sizeof(two));
1437*6777b538SAndroid Build Coastguard Worker
1438*6777b538SAndroid Build Coastguard Worker timeout_set(&one.ev, test_priorities_cb, &one);
1439*6777b538SAndroid Build Coastguard Worker if (event_priority_set(&one.ev, 0) == -1) {
1440*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "%s: failed to set priority", __func__);
1441*6777b538SAndroid Build Coastguard Worker exit(1);
1442*6777b538SAndroid Build Coastguard Worker }
1443*6777b538SAndroid Build Coastguard Worker
1444*6777b538SAndroid Build Coastguard Worker timeout_set(&two.ev, test_priorities_cb, &two);
1445*6777b538SAndroid Build Coastguard Worker if (event_priority_set(&two.ev, npriorities - 1) == -1) {
1446*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "%s: failed to set priority", __func__);
1447*6777b538SAndroid Build Coastguard Worker exit(1);
1448*6777b538SAndroid Build Coastguard Worker }
1449*6777b538SAndroid Build Coastguard Worker
1450*6777b538SAndroid Build Coastguard Worker evutil_timerclear(&tv);
1451*6777b538SAndroid Build Coastguard Worker
1452*6777b538SAndroid Build Coastguard Worker if (event_add(&one.ev, &tv) == -1)
1453*6777b538SAndroid Build Coastguard Worker exit(1);
1454*6777b538SAndroid Build Coastguard Worker if (event_add(&two.ev, &tv) == -1)
1455*6777b538SAndroid Build Coastguard Worker exit(1);
1456*6777b538SAndroid Build Coastguard Worker
1457*6777b538SAndroid Build Coastguard Worker event_dispatch();
1458*6777b538SAndroid Build Coastguard Worker
1459*6777b538SAndroid Build Coastguard Worker event_del(&one.ev);
1460*6777b538SAndroid Build Coastguard Worker event_del(&two.ev);
1461*6777b538SAndroid Build Coastguard Worker
1462*6777b538SAndroid Build Coastguard Worker if (npriorities == 1) {
1463*6777b538SAndroid Build Coastguard Worker if (one.count == 3 && two.count == 3)
1464*6777b538SAndroid Build Coastguard Worker test_ok = 1;
1465*6777b538SAndroid Build Coastguard Worker } else if (npriorities == 2) {
1466*6777b538SAndroid Build Coastguard Worker /* Two is called once because event_loopexit is priority 1 */
1467*6777b538SAndroid Build Coastguard Worker if (one.count == 3 && two.count == 1)
1468*6777b538SAndroid Build Coastguard Worker test_ok = 1;
1469*6777b538SAndroid Build Coastguard Worker } else {
1470*6777b538SAndroid Build Coastguard Worker if (one.count == 3 && two.count == 0)
1471*6777b538SAndroid Build Coastguard Worker test_ok = 1;
1472*6777b538SAndroid Build Coastguard Worker }
1473*6777b538SAndroid Build Coastguard Worker
1474*6777b538SAndroid Build Coastguard Worker cleanup_test();
1475*6777b538SAndroid Build Coastguard Worker }
1476*6777b538SAndroid Build Coastguard Worker
1477*6777b538SAndroid Build Coastguard Worker static void
test_multiple_cb(int fd,short event,void * arg)1478*6777b538SAndroid Build Coastguard Worker test_multiple_cb(int fd, short event, void *arg)
1479*6777b538SAndroid Build Coastguard Worker {
1480*6777b538SAndroid Build Coastguard Worker if (event & EV_READ)
1481*6777b538SAndroid Build Coastguard Worker test_ok |= 1;
1482*6777b538SAndroid Build Coastguard Worker else if (event & EV_WRITE)
1483*6777b538SAndroid Build Coastguard Worker test_ok |= 2;
1484*6777b538SAndroid Build Coastguard Worker }
1485*6777b538SAndroid Build Coastguard Worker
1486*6777b538SAndroid Build Coastguard Worker static void
test_multiple_events_for_same_fd(void)1487*6777b538SAndroid Build Coastguard Worker test_multiple_events_for_same_fd(void)
1488*6777b538SAndroid Build Coastguard Worker {
1489*6777b538SAndroid Build Coastguard Worker struct event e1, e2;
1490*6777b538SAndroid Build Coastguard Worker
1491*6777b538SAndroid Build Coastguard Worker setup_test("Multiple events for same fd: ");
1492*6777b538SAndroid Build Coastguard Worker
1493*6777b538SAndroid Build Coastguard Worker event_set(&e1, pair[0], EV_READ, test_multiple_cb, NULL);
1494*6777b538SAndroid Build Coastguard Worker event_add(&e1, NULL);
1495*6777b538SAndroid Build Coastguard Worker event_set(&e2, pair[0], EV_WRITE, test_multiple_cb, NULL);
1496*6777b538SAndroid Build Coastguard Worker event_add(&e2, NULL);
1497*6777b538SAndroid Build Coastguard Worker event_loop(EVLOOP_ONCE);
1498*6777b538SAndroid Build Coastguard Worker event_del(&e2);
1499*6777b538SAndroid Build Coastguard Worker write(pair[1], TEST1, strlen(TEST1)+1);
1500*6777b538SAndroid Build Coastguard Worker event_loop(EVLOOP_ONCE);
1501*6777b538SAndroid Build Coastguard Worker event_del(&e1);
1502*6777b538SAndroid Build Coastguard Worker
1503*6777b538SAndroid Build Coastguard Worker if (test_ok != 3)
1504*6777b538SAndroid Build Coastguard Worker test_ok = 0;
1505*6777b538SAndroid Build Coastguard Worker
1506*6777b538SAndroid Build Coastguard Worker cleanup_test();
1507*6777b538SAndroid Build Coastguard Worker }
1508*6777b538SAndroid Build Coastguard Worker
1509*6777b538SAndroid Build Coastguard Worker int evtag_decode_int(uint32_t *pnumber, struct evbuffer *evbuf);
1510*6777b538SAndroid Build Coastguard Worker int evtag_encode_tag(struct evbuffer *evbuf, uint32_t number);
1511*6777b538SAndroid Build Coastguard Worker int evtag_decode_tag(uint32_t *pnumber, struct evbuffer *evbuf);
1512*6777b538SAndroid Build Coastguard Worker
1513*6777b538SAndroid Build Coastguard Worker static void
read_once_cb(int fd,short event,void * arg)1514*6777b538SAndroid Build Coastguard Worker read_once_cb(int fd, short event, void *arg)
1515*6777b538SAndroid Build Coastguard Worker {
1516*6777b538SAndroid Build Coastguard Worker char buf[256];
1517*6777b538SAndroid Build Coastguard Worker int len;
1518*6777b538SAndroid Build Coastguard Worker
1519*6777b538SAndroid Build Coastguard Worker len = read(fd, buf, sizeof(buf));
1520*6777b538SAndroid Build Coastguard Worker
1521*6777b538SAndroid Build Coastguard Worker if (called) {
1522*6777b538SAndroid Build Coastguard Worker test_ok = 0;
1523*6777b538SAndroid Build Coastguard Worker } else if (len) {
1524*6777b538SAndroid Build Coastguard Worker /* Assumes global pair[0] can be used for writing */
1525*6777b538SAndroid Build Coastguard Worker write(pair[0], TEST1, strlen(TEST1)+1);
1526*6777b538SAndroid Build Coastguard Worker test_ok = 1;
1527*6777b538SAndroid Build Coastguard Worker }
1528*6777b538SAndroid Build Coastguard Worker
1529*6777b538SAndroid Build Coastguard Worker called++;
1530*6777b538SAndroid Build Coastguard Worker }
1531*6777b538SAndroid Build Coastguard Worker
1532*6777b538SAndroid Build Coastguard Worker static void
test_want_only_once(void)1533*6777b538SAndroid Build Coastguard Worker test_want_only_once(void)
1534*6777b538SAndroid Build Coastguard Worker {
1535*6777b538SAndroid Build Coastguard Worker struct event ev;
1536*6777b538SAndroid Build Coastguard Worker struct timeval tv;
1537*6777b538SAndroid Build Coastguard Worker
1538*6777b538SAndroid Build Coastguard Worker /* Very simple read test */
1539*6777b538SAndroid Build Coastguard Worker setup_test("Want read only once: ");
1540*6777b538SAndroid Build Coastguard Worker
1541*6777b538SAndroid Build Coastguard Worker write(pair[0], TEST1, strlen(TEST1)+1);
1542*6777b538SAndroid Build Coastguard Worker
1543*6777b538SAndroid Build Coastguard Worker /* Setup the loop termination */
1544*6777b538SAndroid Build Coastguard Worker evutil_timerclear(&tv);
1545*6777b538SAndroid Build Coastguard Worker tv.tv_sec = 1;
1546*6777b538SAndroid Build Coastguard Worker event_loopexit(&tv);
1547*6777b538SAndroid Build Coastguard Worker
1548*6777b538SAndroid Build Coastguard Worker event_set(&ev, pair[1], EV_READ, read_once_cb, &ev);
1549*6777b538SAndroid Build Coastguard Worker if (event_add(&ev, NULL) == -1)
1550*6777b538SAndroid Build Coastguard Worker exit(1);
1551*6777b538SAndroid Build Coastguard Worker event_dispatch();
1552*6777b538SAndroid Build Coastguard Worker
1553*6777b538SAndroid Build Coastguard Worker cleanup_test();
1554*6777b538SAndroid Build Coastguard Worker }
1555*6777b538SAndroid Build Coastguard Worker
1556*6777b538SAndroid Build Coastguard Worker #define TEST_MAX_INT 6
1557*6777b538SAndroid Build Coastguard Worker
1558*6777b538SAndroid Build Coastguard Worker static void
evtag_int_test(void)1559*6777b538SAndroid Build Coastguard Worker evtag_int_test(void)
1560*6777b538SAndroid Build Coastguard Worker {
1561*6777b538SAndroid Build Coastguard Worker struct evbuffer *tmp = evbuffer_new();
1562*6777b538SAndroid Build Coastguard Worker uint32_t integers[TEST_MAX_INT] = {
1563*6777b538SAndroid Build Coastguard Worker 0xaf0, 0x1000, 0x1, 0xdeadbeef, 0x00, 0xbef000
1564*6777b538SAndroid Build Coastguard Worker };
1565*6777b538SAndroid Build Coastguard Worker uint32_t integer;
1566*6777b538SAndroid Build Coastguard Worker int i;
1567*6777b538SAndroid Build Coastguard Worker
1568*6777b538SAndroid Build Coastguard Worker for (i = 0; i < TEST_MAX_INT; i++) {
1569*6777b538SAndroid Build Coastguard Worker int oldlen, newlen;
1570*6777b538SAndroid Build Coastguard Worker oldlen = EVBUFFER_LENGTH(tmp);
1571*6777b538SAndroid Build Coastguard Worker encode_int(tmp, integers[i]);
1572*6777b538SAndroid Build Coastguard Worker newlen = EVBUFFER_LENGTH(tmp);
1573*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "\t\tencoded 0x%08x with %d bytes\n",
1574*6777b538SAndroid Build Coastguard Worker integers[i], newlen - oldlen);
1575*6777b538SAndroid Build Coastguard Worker }
1576*6777b538SAndroid Build Coastguard Worker
1577*6777b538SAndroid Build Coastguard Worker for (i = 0; i < TEST_MAX_INT; i++) {
1578*6777b538SAndroid Build Coastguard Worker if (evtag_decode_int(&integer, tmp) == -1) {
1579*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "decode %d failed", i);
1580*6777b538SAndroid Build Coastguard Worker exit(1);
1581*6777b538SAndroid Build Coastguard Worker }
1582*6777b538SAndroid Build Coastguard Worker if (integer != integers[i]) {
1583*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "got %x, wanted %x",
1584*6777b538SAndroid Build Coastguard Worker integer, integers[i]);
1585*6777b538SAndroid Build Coastguard Worker exit(1);
1586*6777b538SAndroid Build Coastguard Worker }
1587*6777b538SAndroid Build Coastguard Worker }
1588*6777b538SAndroid Build Coastguard Worker
1589*6777b538SAndroid Build Coastguard Worker if (EVBUFFER_LENGTH(tmp) != 0) {
1590*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "trailing data");
1591*6777b538SAndroid Build Coastguard Worker exit(1);
1592*6777b538SAndroid Build Coastguard Worker }
1593*6777b538SAndroid Build Coastguard Worker evbuffer_free(tmp);
1594*6777b538SAndroid Build Coastguard Worker
1595*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "\t%s: OK\n", __func__);
1596*6777b538SAndroid Build Coastguard Worker }
1597*6777b538SAndroid Build Coastguard Worker
1598*6777b538SAndroid Build Coastguard Worker static void
evtag_fuzz(void)1599*6777b538SAndroid Build Coastguard Worker evtag_fuzz(void)
1600*6777b538SAndroid Build Coastguard Worker {
1601*6777b538SAndroid Build Coastguard Worker u_char buffer[4096];
1602*6777b538SAndroid Build Coastguard Worker struct evbuffer *tmp = evbuffer_new();
1603*6777b538SAndroid Build Coastguard Worker struct timeval tv;
1604*6777b538SAndroid Build Coastguard Worker int i, j;
1605*6777b538SAndroid Build Coastguard Worker
1606*6777b538SAndroid Build Coastguard Worker int not_failed = 0;
1607*6777b538SAndroid Build Coastguard Worker for (j = 0; j < 100; j++) {
1608*6777b538SAndroid Build Coastguard Worker for (i = 0; i < sizeof(buffer); i++)
1609*6777b538SAndroid Build Coastguard Worker buffer[i] = rand();
1610*6777b538SAndroid Build Coastguard Worker evbuffer_drain(tmp, -1);
1611*6777b538SAndroid Build Coastguard Worker evbuffer_add(tmp, buffer, sizeof(buffer));
1612*6777b538SAndroid Build Coastguard Worker
1613*6777b538SAndroid Build Coastguard Worker if (evtag_unmarshal_timeval(tmp, 0, &tv) != -1)
1614*6777b538SAndroid Build Coastguard Worker not_failed++;
1615*6777b538SAndroid Build Coastguard Worker }
1616*6777b538SAndroid Build Coastguard Worker
1617*6777b538SAndroid Build Coastguard Worker /* The majority of decodes should fail */
1618*6777b538SAndroid Build Coastguard Worker if (not_failed >= 10) {
1619*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "evtag_unmarshal should have failed");
1620*6777b538SAndroid Build Coastguard Worker exit(1);
1621*6777b538SAndroid Build Coastguard Worker }
1622*6777b538SAndroid Build Coastguard Worker
1623*6777b538SAndroid Build Coastguard Worker /* Now insert some corruption into the tag length field */
1624*6777b538SAndroid Build Coastguard Worker evbuffer_drain(tmp, -1);
1625*6777b538SAndroid Build Coastguard Worker evutil_timerclear(&tv);
1626*6777b538SAndroid Build Coastguard Worker tv.tv_sec = 1;
1627*6777b538SAndroid Build Coastguard Worker evtag_marshal_timeval(tmp, 0, &tv);
1628*6777b538SAndroid Build Coastguard Worker evbuffer_add(tmp, buffer, sizeof(buffer));
1629*6777b538SAndroid Build Coastguard Worker
1630*6777b538SAndroid Build Coastguard Worker EVBUFFER_DATA(tmp)[1] = 0xff;
1631*6777b538SAndroid Build Coastguard Worker if (evtag_unmarshal_timeval(tmp, 0, &tv) != -1) {
1632*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "evtag_unmarshal_timeval should have failed");
1633*6777b538SAndroid Build Coastguard Worker exit(1);
1634*6777b538SAndroid Build Coastguard Worker }
1635*6777b538SAndroid Build Coastguard Worker
1636*6777b538SAndroid Build Coastguard Worker evbuffer_free(tmp);
1637*6777b538SAndroid Build Coastguard Worker
1638*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "\t%s: OK\n", __func__);
1639*6777b538SAndroid Build Coastguard Worker }
1640*6777b538SAndroid Build Coastguard Worker
1641*6777b538SAndroid Build Coastguard Worker static void
evtag_tag_encoding(void)1642*6777b538SAndroid Build Coastguard Worker evtag_tag_encoding(void)
1643*6777b538SAndroid Build Coastguard Worker {
1644*6777b538SAndroid Build Coastguard Worker struct evbuffer *tmp = evbuffer_new();
1645*6777b538SAndroid Build Coastguard Worker uint32_t integers[TEST_MAX_INT] = {
1646*6777b538SAndroid Build Coastguard Worker 0xaf0, 0x1000, 0x1, 0xdeadbeef, 0x00, 0xbef000
1647*6777b538SAndroid Build Coastguard Worker };
1648*6777b538SAndroid Build Coastguard Worker uint32_t integer;
1649*6777b538SAndroid Build Coastguard Worker int i;
1650*6777b538SAndroid Build Coastguard Worker
1651*6777b538SAndroid Build Coastguard Worker for (i = 0; i < TEST_MAX_INT; i++) {
1652*6777b538SAndroid Build Coastguard Worker int oldlen, newlen;
1653*6777b538SAndroid Build Coastguard Worker oldlen = EVBUFFER_LENGTH(tmp);
1654*6777b538SAndroid Build Coastguard Worker evtag_encode_tag(tmp, integers[i]);
1655*6777b538SAndroid Build Coastguard Worker newlen = EVBUFFER_LENGTH(tmp);
1656*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "\t\tencoded 0x%08x with %d bytes\n",
1657*6777b538SAndroid Build Coastguard Worker integers[i], newlen - oldlen);
1658*6777b538SAndroid Build Coastguard Worker }
1659*6777b538SAndroid Build Coastguard Worker
1660*6777b538SAndroid Build Coastguard Worker for (i = 0; i < TEST_MAX_INT; i++) {
1661*6777b538SAndroid Build Coastguard Worker if (evtag_decode_tag(&integer, tmp) == -1) {
1662*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "decode %d failed", i);
1663*6777b538SAndroid Build Coastguard Worker exit(1);
1664*6777b538SAndroid Build Coastguard Worker }
1665*6777b538SAndroid Build Coastguard Worker if (integer != integers[i]) {
1666*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "got %x, wanted %x",
1667*6777b538SAndroid Build Coastguard Worker integer, integers[i]);
1668*6777b538SAndroid Build Coastguard Worker exit(1);
1669*6777b538SAndroid Build Coastguard Worker }
1670*6777b538SAndroid Build Coastguard Worker }
1671*6777b538SAndroid Build Coastguard Worker
1672*6777b538SAndroid Build Coastguard Worker if (EVBUFFER_LENGTH(tmp) != 0) {
1673*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "trailing data");
1674*6777b538SAndroid Build Coastguard Worker exit(1);
1675*6777b538SAndroid Build Coastguard Worker }
1676*6777b538SAndroid Build Coastguard Worker evbuffer_free(tmp);
1677*6777b538SAndroid Build Coastguard Worker
1678*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "\t%s: OK\n", __func__);
1679*6777b538SAndroid Build Coastguard Worker }
1680*6777b538SAndroid Build Coastguard Worker
1681*6777b538SAndroid Build Coastguard Worker static void
evtag_test(void)1682*6777b538SAndroid Build Coastguard Worker evtag_test(void)
1683*6777b538SAndroid Build Coastguard Worker {
1684*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "Testing Tagging:\n");
1685*6777b538SAndroid Build Coastguard Worker
1686*6777b538SAndroid Build Coastguard Worker evtag_init();
1687*6777b538SAndroid Build Coastguard Worker evtag_int_test();
1688*6777b538SAndroid Build Coastguard Worker evtag_fuzz();
1689*6777b538SAndroid Build Coastguard Worker
1690*6777b538SAndroid Build Coastguard Worker evtag_tag_encoding();
1691*6777b538SAndroid Build Coastguard Worker
1692*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "OK\n");
1693*6777b538SAndroid Build Coastguard Worker }
1694*6777b538SAndroid Build Coastguard Worker
1695*6777b538SAndroid Build Coastguard Worker #ifndef WIN32
1696*6777b538SAndroid Build Coastguard Worker static void
rpc_test(void)1697*6777b538SAndroid Build Coastguard Worker rpc_test(void)
1698*6777b538SAndroid Build Coastguard Worker {
1699*6777b538SAndroid Build Coastguard Worker struct msg *msg, *msg2;
1700*6777b538SAndroid Build Coastguard Worker struct kill *attack;
1701*6777b538SAndroid Build Coastguard Worker struct run *run;
1702*6777b538SAndroid Build Coastguard Worker struct evbuffer *tmp = evbuffer_new();
1703*6777b538SAndroid Build Coastguard Worker struct timeval tv_start, tv_end;
1704*6777b538SAndroid Build Coastguard Worker uint32_t tag;
1705*6777b538SAndroid Build Coastguard Worker int i;
1706*6777b538SAndroid Build Coastguard Worker
1707*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "Testing RPC: ");
1708*6777b538SAndroid Build Coastguard Worker
1709*6777b538SAndroid Build Coastguard Worker msg = msg_new();
1710*6777b538SAndroid Build Coastguard Worker EVTAG_ASSIGN(msg, from_name, "niels");
1711*6777b538SAndroid Build Coastguard Worker EVTAG_ASSIGN(msg, to_name, "phoenix");
1712*6777b538SAndroid Build Coastguard Worker
1713*6777b538SAndroid Build Coastguard Worker if (EVTAG_GET(msg, attack, &attack) == -1) {
1714*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "Failed to set kill message.\n");
1715*6777b538SAndroid Build Coastguard Worker exit(1);
1716*6777b538SAndroid Build Coastguard Worker }
1717*6777b538SAndroid Build Coastguard Worker
1718*6777b538SAndroid Build Coastguard Worker EVTAG_ASSIGN(attack, weapon, "feather");
1719*6777b538SAndroid Build Coastguard Worker EVTAG_ASSIGN(attack, action, "tickle");
1720*6777b538SAndroid Build Coastguard Worker
1721*6777b538SAndroid Build Coastguard Worker evutil_gettimeofday(&tv_start, NULL);
1722*6777b538SAndroid Build Coastguard Worker for (i = 0; i < 1000; ++i) {
1723*6777b538SAndroid Build Coastguard Worker run = EVTAG_ADD(msg, run);
1724*6777b538SAndroid Build Coastguard Worker if (run == NULL) {
1725*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "Failed to add run message.\n");
1726*6777b538SAndroid Build Coastguard Worker exit(1);
1727*6777b538SAndroid Build Coastguard Worker }
1728*6777b538SAndroid Build Coastguard Worker EVTAG_ASSIGN(run, how, "very fast but with some data in it");
1729*6777b538SAndroid Build Coastguard Worker EVTAG_ASSIGN(run, fixed_bytes,
1730*6777b538SAndroid Build Coastguard Worker (unsigned char*)"012345678901234567890123");
1731*6777b538SAndroid Build Coastguard Worker }
1732*6777b538SAndroid Build Coastguard Worker
1733*6777b538SAndroid Build Coastguard Worker if (msg_complete(msg) == -1) {
1734*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "Failed to make complete message.\n");
1735*6777b538SAndroid Build Coastguard Worker exit(1);
1736*6777b538SAndroid Build Coastguard Worker }
1737*6777b538SAndroid Build Coastguard Worker
1738*6777b538SAndroid Build Coastguard Worker evtag_marshal_msg(tmp, 0xdeaf, msg);
1739*6777b538SAndroid Build Coastguard Worker
1740*6777b538SAndroid Build Coastguard Worker if (evtag_peek(tmp, &tag) == -1) {
1741*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "Failed to peak tag.\n");
1742*6777b538SAndroid Build Coastguard Worker exit (1);
1743*6777b538SAndroid Build Coastguard Worker }
1744*6777b538SAndroid Build Coastguard Worker
1745*6777b538SAndroid Build Coastguard Worker if (tag != 0xdeaf) {
1746*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "Got incorrect tag: %0x.\n", tag);
1747*6777b538SAndroid Build Coastguard Worker exit (1);
1748*6777b538SAndroid Build Coastguard Worker }
1749*6777b538SAndroid Build Coastguard Worker
1750*6777b538SAndroid Build Coastguard Worker msg2 = msg_new();
1751*6777b538SAndroid Build Coastguard Worker if (evtag_unmarshal_msg(tmp, 0xdeaf, msg2) == -1) {
1752*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "Failed to unmarshal message.\n");
1753*6777b538SAndroid Build Coastguard Worker exit(1);
1754*6777b538SAndroid Build Coastguard Worker }
1755*6777b538SAndroid Build Coastguard Worker
1756*6777b538SAndroid Build Coastguard Worker evutil_gettimeofday(&tv_end, NULL);
1757*6777b538SAndroid Build Coastguard Worker evutil_timersub(&tv_end, &tv_start, &tv_end);
1758*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "(%.1f us/add) ",
1759*6777b538SAndroid Build Coastguard Worker (float)tv_end.tv_sec/(float)i * 1000000.0 +
1760*6777b538SAndroid Build Coastguard Worker tv_end.tv_usec / (float)i);
1761*6777b538SAndroid Build Coastguard Worker
1762*6777b538SAndroid Build Coastguard Worker if (!EVTAG_HAS(msg2, from_name) ||
1763*6777b538SAndroid Build Coastguard Worker !EVTAG_HAS(msg2, to_name) ||
1764*6777b538SAndroid Build Coastguard Worker !EVTAG_HAS(msg2, attack)) {
1765*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "Missing data structures.\n");
1766*6777b538SAndroid Build Coastguard Worker exit(1);
1767*6777b538SAndroid Build Coastguard Worker }
1768*6777b538SAndroid Build Coastguard Worker
1769*6777b538SAndroid Build Coastguard Worker if (EVTAG_LEN(msg2, run) != i) {
1770*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "Wrong number of run messages.\n");
1771*6777b538SAndroid Build Coastguard Worker exit(1);
1772*6777b538SAndroid Build Coastguard Worker }
1773*6777b538SAndroid Build Coastguard Worker
1774*6777b538SAndroid Build Coastguard Worker msg_free(msg);
1775*6777b538SAndroid Build Coastguard Worker msg_free(msg2);
1776*6777b538SAndroid Build Coastguard Worker
1777*6777b538SAndroid Build Coastguard Worker evbuffer_free(tmp);
1778*6777b538SAndroid Build Coastguard Worker
1779*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "OK\n");
1780*6777b538SAndroid Build Coastguard Worker }
1781*6777b538SAndroid Build Coastguard Worker #endif
1782*6777b538SAndroid Build Coastguard Worker
1783*6777b538SAndroid Build Coastguard Worker static void
test_evutil_strtoll(void)1784*6777b538SAndroid Build Coastguard Worker test_evutil_strtoll(void)
1785*6777b538SAndroid Build Coastguard Worker {
1786*6777b538SAndroid Build Coastguard Worker const char *s;
1787*6777b538SAndroid Build Coastguard Worker char *endptr;
1788*6777b538SAndroid Build Coastguard Worker setup_test("evutil_stroll: ");
1789*6777b538SAndroid Build Coastguard Worker test_ok = 0;
1790*6777b538SAndroid Build Coastguard Worker
1791*6777b538SAndroid Build Coastguard Worker if (evutil_strtoll("5000000000", NULL, 10) != ((ev_int64_t)5000000)*1000)
1792*6777b538SAndroid Build Coastguard Worker goto err;
1793*6777b538SAndroid Build Coastguard Worker if (evutil_strtoll("-5000000000", NULL, 10) != ((ev_int64_t)5000000)*-1000)
1794*6777b538SAndroid Build Coastguard Worker goto err;
1795*6777b538SAndroid Build Coastguard Worker s = " 99999stuff";
1796*6777b538SAndroid Build Coastguard Worker if (evutil_strtoll(s, &endptr, 10) != (ev_int64_t)99999)
1797*6777b538SAndroid Build Coastguard Worker goto err;
1798*6777b538SAndroid Build Coastguard Worker if (endptr != s+6)
1799*6777b538SAndroid Build Coastguard Worker goto err;
1800*6777b538SAndroid Build Coastguard Worker if (evutil_strtoll("foo", NULL, 10) != 0)
1801*6777b538SAndroid Build Coastguard Worker goto err;
1802*6777b538SAndroid Build Coastguard Worker
1803*6777b538SAndroid Build Coastguard Worker test_ok = 1;
1804*6777b538SAndroid Build Coastguard Worker err:
1805*6777b538SAndroid Build Coastguard Worker cleanup_test();
1806*6777b538SAndroid Build Coastguard Worker }
1807*6777b538SAndroid Build Coastguard Worker
1808*6777b538SAndroid Build Coastguard Worker
1809*6777b538SAndroid Build Coastguard Worker int
main(int argc,char ** argv)1810*6777b538SAndroid Build Coastguard Worker main (int argc, char **argv)
1811*6777b538SAndroid Build Coastguard Worker {
1812*6777b538SAndroid Build Coastguard Worker #ifdef WIN32
1813*6777b538SAndroid Build Coastguard Worker WORD wVersionRequested;
1814*6777b538SAndroid Build Coastguard Worker WSADATA wsaData;
1815*6777b538SAndroid Build Coastguard Worker int err;
1816*6777b538SAndroid Build Coastguard Worker
1817*6777b538SAndroid Build Coastguard Worker wVersionRequested = MAKEWORD( 2, 2 );
1818*6777b538SAndroid Build Coastguard Worker
1819*6777b538SAndroid Build Coastguard Worker err = WSAStartup( wVersionRequested, &wsaData );
1820*6777b538SAndroid Build Coastguard Worker #endif
1821*6777b538SAndroid Build Coastguard Worker
1822*6777b538SAndroid Build Coastguard Worker #ifndef WIN32
1823*6777b538SAndroid Build Coastguard Worker if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
1824*6777b538SAndroid Build Coastguard Worker return (1);
1825*6777b538SAndroid Build Coastguard Worker #endif
1826*6777b538SAndroid Build Coastguard Worker setvbuf(stdout, NULL, _IONBF, 0);
1827*6777b538SAndroid Build Coastguard Worker
1828*6777b538SAndroid Build Coastguard Worker /* Initalize the event library */
1829*6777b538SAndroid Build Coastguard Worker global_base = event_init();
1830*6777b538SAndroid Build Coastguard Worker
1831*6777b538SAndroid Build Coastguard Worker test_registerfds();
1832*6777b538SAndroid Build Coastguard Worker
1833*6777b538SAndroid Build Coastguard Worker test_evutil_strtoll();
1834*6777b538SAndroid Build Coastguard Worker
1835*6777b538SAndroid Build Coastguard Worker /* use the global event base and need to be called first */
1836*6777b538SAndroid Build Coastguard Worker test_priorities(1);
1837*6777b538SAndroid Build Coastguard Worker test_priorities(2);
1838*6777b538SAndroid Build Coastguard Worker test_priorities(3);
1839*6777b538SAndroid Build Coastguard Worker
1840*6777b538SAndroid Build Coastguard Worker test_evbuffer();
1841*6777b538SAndroid Build Coastguard Worker test_evbuffer_find();
1842*6777b538SAndroid Build Coastguard Worker test_evbuffer_readln();
1843*6777b538SAndroid Build Coastguard Worker
1844*6777b538SAndroid Build Coastguard Worker test_bufferevent();
1845*6777b538SAndroid Build Coastguard Worker test_bufferevent_watermarks();
1846*6777b538SAndroid Build Coastguard Worker
1847*6777b538SAndroid Build Coastguard Worker test_free_active_base();
1848*6777b538SAndroid Build Coastguard Worker
1849*6777b538SAndroid Build Coastguard Worker test_event_base_new();
1850*6777b538SAndroid Build Coastguard Worker
1851*6777b538SAndroid Build Coastguard Worker http_suite();
1852*6777b538SAndroid Build Coastguard Worker
1853*6777b538SAndroid Build Coastguard Worker #ifndef WIN32
1854*6777b538SAndroid Build Coastguard Worker rpc_suite();
1855*6777b538SAndroid Build Coastguard Worker #endif
1856*6777b538SAndroid Build Coastguard Worker
1857*6777b538SAndroid Build Coastguard Worker dns_suite();
1858*6777b538SAndroid Build Coastguard Worker
1859*6777b538SAndroid Build Coastguard Worker #ifndef WIN32
1860*6777b538SAndroid Build Coastguard Worker test_fork();
1861*6777b538SAndroid Build Coastguard Worker #endif
1862*6777b538SAndroid Build Coastguard Worker
1863*6777b538SAndroid Build Coastguard Worker test_simpleread();
1864*6777b538SAndroid Build Coastguard Worker
1865*6777b538SAndroid Build Coastguard Worker test_simplewrite();
1866*6777b538SAndroid Build Coastguard Worker
1867*6777b538SAndroid Build Coastguard Worker test_multiple();
1868*6777b538SAndroid Build Coastguard Worker
1869*6777b538SAndroid Build Coastguard Worker test_persistent();
1870*6777b538SAndroid Build Coastguard Worker
1871*6777b538SAndroid Build Coastguard Worker test_combined();
1872*6777b538SAndroid Build Coastguard Worker
1873*6777b538SAndroid Build Coastguard Worker test_simpletimeout();
1874*6777b538SAndroid Build Coastguard Worker #ifndef WIN32
1875*6777b538SAndroid Build Coastguard Worker test_simplesignal();
1876*6777b538SAndroid Build Coastguard Worker test_multiplesignal();
1877*6777b538SAndroid Build Coastguard Worker test_immediatesignal();
1878*6777b538SAndroid Build Coastguard Worker #endif
1879*6777b538SAndroid Build Coastguard Worker test_loopexit();
1880*6777b538SAndroid Build Coastguard Worker test_loopbreak();
1881*6777b538SAndroid Build Coastguard Worker
1882*6777b538SAndroid Build Coastguard Worker test_loopexit_multiple();
1883*6777b538SAndroid Build Coastguard Worker
1884*6777b538SAndroid Build Coastguard Worker test_multiple_events_for_same_fd();
1885*6777b538SAndroid Build Coastguard Worker
1886*6777b538SAndroid Build Coastguard Worker test_want_only_once();
1887*6777b538SAndroid Build Coastguard Worker
1888*6777b538SAndroid Build Coastguard Worker evtag_test();
1889*6777b538SAndroid Build Coastguard Worker
1890*6777b538SAndroid Build Coastguard Worker #ifndef WIN32
1891*6777b538SAndroid Build Coastguard Worker rpc_test();
1892*6777b538SAndroid Build Coastguard Worker
1893*6777b538SAndroid Build Coastguard Worker test_signal_dealloc();
1894*6777b538SAndroid Build Coastguard Worker test_signal_pipeloss();
1895*6777b538SAndroid Build Coastguard Worker test_signal_switchbase();
1896*6777b538SAndroid Build Coastguard Worker test_signal_restore();
1897*6777b538SAndroid Build Coastguard Worker test_signal_assert();
1898*6777b538SAndroid Build Coastguard Worker test_signal_while_processing();
1899*6777b538SAndroid Build Coastguard Worker #endif
1900*6777b538SAndroid Build Coastguard Worker
1901*6777b538SAndroid Build Coastguard Worker return (0);
1902*6777b538SAndroid Build Coastguard Worker }
1903*6777b538SAndroid Build Coastguard Worker
1904