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