xref: /aosp_15_r20/external/cronet/third_party/libevent/test/regress.c (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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