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