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