1*663afb9bSAndroid Build Coastguard Worker /*
2*663afb9bSAndroid Build Coastguard Worker * Copyright (c) 2008-2012 Niels Provos and Nick Mathewson
3*663afb9bSAndroid Build Coastguard Worker *
4*663afb9bSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
5*663afb9bSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions
6*663afb9bSAndroid Build Coastguard Worker * are met:
7*663afb9bSAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright
8*663afb9bSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer.
9*663afb9bSAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright
10*663afb9bSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the
11*663afb9bSAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution.
12*663afb9bSAndroid Build Coastguard Worker * 3. The name of the author may not be used to endorse or promote products
13*663afb9bSAndroid Build Coastguard Worker * derived from this software without specific prior written permission.
14*663afb9bSAndroid Build Coastguard Worker *
15*663afb9bSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16*663afb9bSAndroid Build Coastguard Worker * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17*663afb9bSAndroid Build Coastguard Worker * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18*663afb9bSAndroid Build Coastguard Worker * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19*663afb9bSAndroid Build Coastguard Worker * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20*663afb9bSAndroid Build Coastguard Worker * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21*663afb9bSAndroid Build Coastguard Worker * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22*663afb9bSAndroid Build Coastguard Worker * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23*663afb9bSAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24*663afb9bSAndroid Build Coastguard Worker * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25*663afb9bSAndroid Build Coastguard Worker */
26*663afb9bSAndroid Build Coastguard Worker
27*663afb9bSAndroid Build Coastguard Worker /* The old tests here need assertions to work. */
28*663afb9bSAndroid Build Coastguard Worker #undef NDEBUG
29*663afb9bSAndroid Build Coastguard Worker
30*663afb9bSAndroid Build Coastguard Worker #ifdef _WIN32
31*663afb9bSAndroid Build Coastguard Worker #include <winsock2.h>
32*663afb9bSAndroid Build Coastguard Worker #include <windows.h>
33*663afb9bSAndroid Build Coastguard Worker #endif
34*663afb9bSAndroid Build Coastguard Worker
35*663afb9bSAndroid Build Coastguard Worker #include "event2/event-config.h"
36*663afb9bSAndroid Build Coastguard Worker
37*663afb9bSAndroid Build Coastguard Worker #include <sys/types.h>
38*663afb9bSAndroid Build Coastguard Worker #ifndef _WIN32
39*663afb9bSAndroid Build Coastguard Worker #include <sys/socket.h>
40*663afb9bSAndroid Build Coastguard Worker #include <sys/wait.h>
41*663afb9bSAndroid Build Coastguard Worker #include <unistd.h>
42*663afb9bSAndroid Build Coastguard Worker #include <netdb.h>
43*663afb9bSAndroid Build Coastguard Worker #endif
44*663afb9bSAndroid Build Coastguard Worker #include <signal.h>
45*663afb9bSAndroid Build Coastguard Worker #include <stdio.h>
46*663afb9bSAndroid Build Coastguard Worker #include <stdlib.h>
47*663afb9bSAndroid Build Coastguard Worker #include <string.h>
48*663afb9bSAndroid Build Coastguard Worker
49*663afb9bSAndroid Build Coastguard Worker #include <assert.h>
50*663afb9bSAndroid Build Coastguard Worker #include <errno.h>
51*663afb9bSAndroid Build Coastguard Worker
52*663afb9bSAndroid Build Coastguard Worker #include "event2/util.h"
53*663afb9bSAndroid Build Coastguard Worker #include "event2/event.h"
54*663afb9bSAndroid Build Coastguard Worker #include "event2/event_compat.h"
55*663afb9bSAndroid Build Coastguard Worker #include "event2/buffer.h"
56*663afb9bSAndroid Build Coastguard Worker #include "event2/bufferevent.h"
57*663afb9bSAndroid Build Coastguard Worker
58*663afb9bSAndroid Build Coastguard Worker #include "regress.h"
59*663afb9bSAndroid Build Coastguard Worker #include "mm-internal.h"
60*663afb9bSAndroid Build Coastguard Worker
61*663afb9bSAndroid Build Coastguard Worker /* zlib 1.2.4 and 1.2.5 do some "clever" things with macros. Instead of
62*663afb9bSAndroid Build Coastguard Worker saying "(defined(FOO) ? FOO : 0)" they like to say "FOO-0", on the theory
63*663afb9bSAndroid Build Coastguard Worker that nobody will care if the compile outputs a no-such-identifier warning.
64*663afb9bSAndroid Build Coastguard Worker
65*663afb9bSAndroid Build Coastguard Worker Sorry, but we like -Werror over here, so I guess we need to define these.
66*663afb9bSAndroid Build Coastguard Worker I hope that zlib 1.2.6 doesn't break these too.
67*663afb9bSAndroid Build Coastguard Worker */
68*663afb9bSAndroid Build Coastguard Worker #ifndef _LARGEFILE64_SOURCE
69*663afb9bSAndroid Build Coastguard Worker #define _LARGEFILE64_SOURCE 0
70*663afb9bSAndroid Build Coastguard Worker #endif
71*663afb9bSAndroid Build Coastguard Worker #ifndef _LFS64_LARGEFILE
72*663afb9bSAndroid Build Coastguard Worker #define _LFS64_LARGEFILE 0
73*663afb9bSAndroid Build Coastguard Worker #endif
74*663afb9bSAndroid Build Coastguard Worker #ifndef _FILE_OFFSET_BITS
75*663afb9bSAndroid Build Coastguard Worker #define _FILE_OFFSET_BITS 0
76*663afb9bSAndroid Build Coastguard Worker #endif
77*663afb9bSAndroid Build Coastguard Worker #ifndef off64_t
78*663afb9bSAndroid Build Coastguard Worker #define off64_t ev_int64_t
79*663afb9bSAndroid Build Coastguard Worker #endif
80*663afb9bSAndroid Build Coastguard Worker
81*663afb9bSAndroid Build Coastguard Worker #include <zlib.h>
82*663afb9bSAndroid Build Coastguard Worker
83*663afb9bSAndroid Build Coastguard Worker static int infilter_calls;
84*663afb9bSAndroid Build Coastguard Worker static int outfilter_calls;
85*663afb9bSAndroid Build Coastguard Worker static int readcb_finished;
86*663afb9bSAndroid Build Coastguard Worker static int writecb_finished;
87*663afb9bSAndroid Build Coastguard Worker static int errorcb_invoked;
88*663afb9bSAndroid Build Coastguard Worker
89*663afb9bSAndroid Build Coastguard Worker /*
90*663afb9bSAndroid Build Coastguard Worker * Zlib filters
91*663afb9bSAndroid Build Coastguard Worker */
92*663afb9bSAndroid Build Coastguard Worker
93*663afb9bSAndroid Build Coastguard Worker static void
zlib_deflate_free(void * ctx)94*663afb9bSAndroid Build Coastguard Worker zlib_deflate_free(void *ctx)
95*663afb9bSAndroid Build Coastguard Worker {
96*663afb9bSAndroid Build Coastguard Worker z_streamp p = ctx;
97*663afb9bSAndroid Build Coastguard Worker
98*663afb9bSAndroid Build Coastguard Worker assert(deflateEnd(p) == Z_OK);
99*663afb9bSAndroid Build Coastguard Worker mm_free(p);
100*663afb9bSAndroid Build Coastguard Worker }
101*663afb9bSAndroid Build Coastguard Worker
102*663afb9bSAndroid Build Coastguard Worker static void
zlib_inflate_free(void * ctx)103*663afb9bSAndroid Build Coastguard Worker zlib_inflate_free(void *ctx)
104*663afb9bSAndroid Build Coastguard Worker {
105*663afb9bSAndroid Build Coastguard Worker z_streamp p = ctx;
106*663afb9bSAndroid Build Coastguard Worker
107*663afb9bSAndroid Build Coastguard Worker assert(inflateEnd(p) == Z_OK);
108*663afb9bSAndroid Build Coastguard Worker mm_free(p);
109*663afb9bSAndroid Build Coastguard Worker }
110*663afb9bSAndroid Build Coastguard Worker
111*663afb9bSAndroid Build Coastguard Worker static int
getstate(enum bufferevent_flush_mode state)112*663afb9bSAndroid Build Coastguard Worker getstate(enum bufferevent_flush_mode state)
113*663afb9bSAndroid Build Coastguard Worker {
114*663afb9bSAndroid Build Coastguard Worker switch (state) {
115*663afb9bSAndroid Build Coastguard Worker case BEV_FINISHED:
116*663afb9bSAndroid Build Coastguard Worker return Z_FINISH;
117*663afb9bSAndroid Build Coastguard Worker case BEV_FLUSH:
118*663afb9bSAndroid Build Coastguard Worker return Z_SYNC_FLUSH;
119*663afb9bSAndroid Build Coastguard Worker case BEV_NORMAL:
120*663afb9bSAndroid Build Coastguard Worker default:
121*663afb9bSAndroid Build Coastguard Worker return Z_NO_FLUSH;
122*663afb9bSAndroid Build Coastguard Worker }
123*663afb9bSAndroid Build Coastguard Worker }
124*663afb9bSAndroid Build Coastguard Worker
125*663afb9bSAndroid Build Coastguard Worker /*
126*663afb9bSAndroid Build Coastguard Worker * The input filter is triggered only on new input read from the network.
127*663afb9bSAndroid Build Coastguard Worker * That means all input data needs to be consumed or the filter needs to
128*663afb9bSAndroid Build Coastguard Worker * initiate its own triggering via a timeout.
129*663afb9bSAndroid Build Coastguard Worker */
130*663afb9bSAndroid Build Coastguard Worker static enum bufferevent_filter_result
zlib_input_filter(struct evbuffer * src,struct evbuffer * dst,ev_ssize_t lim,enum bufferevent_flush_mode state,void * ctx)131*663afb9bSAndroid Build Coastguard Worker zlib_input_filter(struct evbuffer *src, struct evbuffer *dst,
132*663afb9bSAndroid Build Coastguard Worker ev_ssize_t lim, enum bufferevent_flush_mode state, void *ctx)
133*663afb9bSAndroid Build Coastguard Worker {
134*663afb9bSAndroid Build Coastguard Worker struct evbuffer_iovec v_in[1];
135*663afb9bSAndroid Build Coastguard Worker struct evbuffer_iovec v_out[1];
136*663afb9bSAndroid Build Coastguard Worker int nread, nwrite;
137*663afb9bSAndroid Build Coastguard Worker int res, n;
138*663afb9bSAndroid Build Coastguard Worker
139*663afb9bSAndroid Build Coastguard Worker z_streamp p = ctx;
140*663afb9bSAndroid Build Coastguard Worker
141*663afb9bSAndroid Build Coastguard Worker do {
142*663afb9bSAndroid Build Coastguard Worker /* let's do some decompression */
143*663afb9bSAndroid Build Coastguard Worker n = evbuffer_peek(src, -1, NULL, v_in, 1);
144*663afb9bSAndroid Build Coastguard Worker if (n) {
145*663afb9bSAndroid Build Coastguard Worker p->avail_in = v_in[0].iov_len;
146*663afb9bSAndroid Build Coastguard Worker p->next_in = (unsigned char *)v_in[0].iov_base;
147*663afb9bSAndroid Build Coastguard Worker } else {
148*663afb9bSAndroid Build Coastguard Worker p->avail_in = 0;
149*663afb9bSAndroid Build Coastguard Worker p->next_in = 0;
150*663afb9bSAndroid Build Coastguard Worker }
151*663afb9bSAndroid Build Coastguard Worker
152*663afb9bSAndroid Build Coastguard Worker evbuffer_reserve_space(dst, 4096, v_out, 1);
153*663afb9bSAndroid Build Coastguard Worker p->next_out = (unsigned char *)v_out[0].iov_base;
154*663afb9bSAndroid Build Coastguard Worker p->avail_out = v_out[0].iov_len;
155*663afb9bSAndroid Build Coastguard Worker
156*663afb9bSAndroid Build Coastguard Worker /* we need to flush zlib if we got a flush */
157*663afb9bSAndroid Build Coastguard Worker res = inflate(p, getstate(state));
158*663afb9bSAndroid Build Coastguard Worker
159*663afb9bSAndroid Build Coastguard Worker /* let's figure out how much was compressed */
160*663afb9bSAndroid Build Coastguard Worker nread = v_in[0].iov_len - p->avail_in;
161*663afb9bSAndroid Build Coastguard Worker nwrite = v_out[0].iov_len - p->avail_out;
162*663afb9bSAndroid Build Coastguard Worker
163*663afb9bSAndroid Build Coastguard Worker evbuffer_drain(src, nread);
164*663afb9bSAndroid Build Coastguard Worker v_out[0].iov_len = nwrite;
165*663afb9bSAndroid Build Coastguard Worker evbuffer_commit_space(dst, v_out, 1);
166*663afb9bSAndroid Build Coastguard Worker
167*663afb9bSAndroid Build Coastguard Worker if (res==Z_BUF_ERROR) {
168*663afb9bSAndroid Build Coastguard Worker /* We're out of space, or out of decodeable input.
169*663afb9bSAndroid Build Coastguard Worker Only if nwrite == 0 assume the latter.
170*663afb9bSAndroid Build Coastguard Worker */
171*663afb9bSAndroid Build Coastguard Worker if (nwrite == 0)
172*663afb9bSAndroid Build Coastguard Worker return BEV_NEED_MORE;
173*663afb9bSAndroid Build Coastguard Worker } else {
174*663afb9bSAndroid Build Coastguard Worker assert(res == Z_OK || res == Z_STREAM_END);
175*663afb9bSAndroid Build Coastguard Worker }
176*663afb9bSAndroid Build Coastguard Worker
177*663afb9bSAndroid Build Coastguard Worker } while (evbuffer_get_length(src) > 0);
178*663afb9bSAndroid Build Coastguard Worker
179*663afb9bSAndroid Build Coastguard Worker ++infilter_calls;
180*663afb9bSAndroid Build Coastguard Worker
181*663afb9bSAndroid Build Coastguard Worker return (BEV_OK);
182*663afb9bSAndroid Build Coastguard Worker }
183*663afb9bSAndroid Build Coastguard Worker
184*663afb9bSAndroid Build Coastguard Worker static enum bufferevent_filter_result
zlib_output_filter(struct evbuffer * src,struct evbuffer * dst,ev_ssize_t lim,enum bufferevent_flush_mode state,void * ctx)185*663afb9bSAndroid Build Coastguard Worker zlib_output_filter(struct evbuffer *src, struct evbuffer *dst,
186*663afb9bSAndroid Build Coastguard Worker ev_ssize_t lim, enum bufferevent_flush_mode state, void *ctx)
187*663afb9bSAndroid Build Coastguard Worker {
188*663afb9bSAndroid Build Coastguard Worker struct evbuffer_iovec v_in[1];
189*663afb9bSAndroid Build Coastguard Worker struct evbuffer_iovec v_out[1];
190*663afb9bSAndroid Build Coastguard Worker int nread, nwrite;
191*663afb9bSAndroid Build Coastguard Worker int res, n;
192*663afb9bSAndroid Build Coastguard Worker
193*663afb9bSAndroid Build Coastguard Worker z_streamp p = ctx;
194*663afb9bSAndroid Build Coastguard Worker
195*663afb9bSAndroid Build Coastguard Worker do {
196*663afb9bSAndroid Build Coastguard Worker /* let's do some compression */
197*663afb9bSAndroid Build Coastguard Worker n = evbuffer_peek(src, -1, NULL, v_in, 1);
198*663afb9bSAndroid Build Coastguard Worker if (n) {
199*663afb9bSAndroid Build Coastguard Worker p->avail_in = v_in[0].iov_len;
200*663afb9bSAndroid Build Coastguard Worker p->next_in = (unsigned char *)v_in[0].iov_base;
201*663afb9bSAndroid Build Coastguard Worker } else {
202*663afb9bSAndroid Build Coastguard Worker p->avail_in = 0;
203*663afb9bSAndroid Build Coastguard Worker p->next_in = 0;
204*663afb9bSAndroid Build Coastguard Worker }
205*663afb9bSAndroid Build Coastguard Worker
206*663afb9bSAndroid Build Coastguard Worker evbuffer_reserve_space(dst, 4096, v_out, 1);
207*663afb9bSAndroid Build Coastguard Worker p->next_out = (unsigned char *)v_out[0].iov_base;
208*663afb9bSAndroid Build Coastguard Worker p->avail_out = v_out[0].iov_len;
209*663afb9bSAndroid Build Coastguard Worker
210*663afb9bSAndroid Build Coastguard Worker /* we need to flush zlib if we got a flush */
211*663afb9bSAndroid Build Coastguard Worker res = deflate(p, getstate(state));
212*663afb9bSAndroid Build Coastguard Worker
213*663afb9bSAndroid Build Coastguard Worker /* let's figure out how much was decompressed */
214*663afb9bSAndroid Build Coastguard Worker nread = v_in[0].iov_len - p->avail_in;
215*663afb9bSAndroid Build Coastguard Worker nwrite = v_out[0].iov_len - p->avail_out;
216*663afb9bSAndroid Build Coastguard Worker
217*663afb9bSAndroid Build Coastguard Worker evbuffer_drain(src, nread);
218*663afb9bSAndroid Build Coastguard Worker v_out[0].iov_len = nwrite;
219*663afb9bSAndroid Build Coastguard Worker evbuffer_commit_space(dst, v_out, 1);
220*663afb9bSAndroid Build Coastguard Worker
221*663afb9bSAndroid Build Coastguard Worker if (res==Z_BUF_ERROR) {
222*663afb9bSAndroid Build Coastguard Worker /* We're out of space, or out of decodeable input.
223*663afb9bSAndroid Build Coastguard Worker Only if nwrite == 0 assume the latter.
224*663afb9bSAndroid Build Coastguard Worker */
225*663afb9bSAndroid Build Coastguard Worker if (nwrite == 0)
226*663afb9bSAndroid Build Coastguard Worker return BEV_NEED_MORE;
227*663afb9bSAndroid Build Coastguard Worker } else {
228*663afb9bSAndroid Build Coastguard Worker assert(res == Z_OK || res == Z_STREAM_END);
229*663afb9bSAndroid Build Coastguard Worker }
230*663afb9bSAndroid Build Coastguard Worker
231*663afb9bSAndroid Build Coastguard Worker } while (evbuffer_get_length(src) > 0);
232*663afb9bSAndroid Build Coastguard Worker
233*663afb9bSAndroid Build Coastguard Worker ++outfilter_calls;
234*663afb9bSAndroid Build Coastguard Worker
235*663afb9bSAndroid Build Coastguard Worker return (BEV_OK);
236*663afb9bSAndroid Build Coastguard Worker }
237*663afb9bSAndroid Build Coastguard Worker
238*663afb9bSAndroid Build Coastguard Worker /*
239*663afb9bSAndroid Build Coastguard Worker * simple bufferevent test (over transparent zlib treatment)
240*663afb9bSAndroid Build Coastguard Worker */
241*663afb9bSAndroid Build Coastguard Worker
242*663afb9bSAndroid Build Coastguard Worker static void
readcb(struct bufferevent * bev,void * arg)243*663afb9bSAndroid Build Coastguard Worker readcb(struct bufferevent *bev, void *arg)
244*663afb9bSAndroid Build Coastguard Worker {
245*663afb9bSAndroid Build Coastguard Worker if (evbuffer_get_length(bufferevent_get_input(bev)) == 8333) {
246*663afb9bSAndroid Build Coastguard Worker struct evbuffer *evbuf = evbuffer_new();
247*663afb9bSAndroid Build Coastguard Worker assert(evbuf != NULL);
248*663afb9bSAndroid Build Coastguard Worker
249*663afb9bSAndroid Build Coastguard Worker /* gratuitous test of bufferevent_read_buffer */
250*663afb9bSAndroid Build Coastguard Worker bufferevent_read_buffer(bev, evbuf);
251*663afb9bSAndroid Build Coastguard Worker
252*663afb9bSAndroid Build Coastguard Worker bufferevent_disable(bev, EV_READ);
253*663afb9bSAndroid Build Coastguard Worker
254*663afb9bSAndroid Build Coastguard Worker if (evbuffer_get_length(evbuf) == 8333) {
255*663afb9bSAndroid Build Coastguard Worker ++readcb_finished;
256*663afb9bSAndroid Build Coastguard Worker }
257*663afb9bSAndroid Build Coastguard Worker
258*663afb9bSAndroid Build Coastguard Worker evbuffer_free(evbuf);
259*663afb9bSAndroid Build Coastguard Worker }
260*663afb9bSAndroid Build Coastguard Worker }
261*663afb9bSAndroid Build Coastguard Worker
262*663afb9bSAndroid Build Coastguard Worker static void
writecb(struct bufferevent * bev,void * arg)263*663afb9bSAndroid Build Coastguard Worker writecb(struct bufferevent *bev, void *arg)
264*663afb9bSAndroid Build Coastguard Worker {
265*663afb9bSAndroid Build Coastguard Worker if (evbuffer_get_length(bufferevent_get_output(bev)) == 0) {
266*663afb9bSAndroid Build Coastguard Worker ++writecb_finished;
267*663afb9bSAndroid Build Coastguard Worker }
268*663afb9bSAndroid Build Coastguard Worker }
269*663afb9bSAndroid Build Coastguard Worker
270*663afb9bSAndroid Build Coastguard Worker static void
errorcb(struct bufferevent * bev,short what,void * arg)271*663afb9bSAndroid Build Coastguard Worker errorcb(struct bufferevent *bev, short what, void *arg)
272*663afb9bSAndroid Build Coastguard Worker {
273*663afb9bSAndroid Build Coastguard Worker errorcb_invoked = 1;
274*663afb9bSAndroid Build Coastguard Worker }
275*663afb9bSAndroid Build Coastguard Worker
276*663afb9bSAndroid Build Coastguard Worker void
test_bufferevent_zlib(void * arg)277*663afb9bSAndroid Build Coastguard Worker test_bufferevent_zlib(void *arg)
278*663afb9bSAndroid Build Coastguard Worker {
279*663afb9bSAndroid Build Coastguard Worker struct bufferevent *bev1=NULL, *bev2=NULL;
280*663afb9bSAndroid Build Coastguard Worker char buffer[8333];
281*663afb9bSAndroid Build Coastguard Worker z_stream *z_input, *z_output;
282*663afb9bSAndroid Build Coastguard Worker int i, r;
283*663afb9bSAndroid Build Coastguard Worker evutil_socket_t pair[2] = {-1, -1};
284*663afb9bSAndroid Build Coastguard Worker (void)arg;
285*663afb9bSAndroid Build Coastguard Worker
286*663afb9bSAndroid Build Coastguard Worker infilter_calls = outfilter_calls = readcb_finished = writecb_finished
287*663afb9bSAndroid Build Coastguard Worker = errorcb_invoked = 0;
288*663afb9bSAndroid Build Coastguard Worker
289*663afb9bSAndroid Build Coastguard Worker if (evutil_socketpair(AF_UNIX, SOCK_STREAM, 0, pair) == -1) {
290*663afb9bSAndroid Build Coastguard Worker tt_abort_perror("socketpair");
291*663afb9bSAndroid Build Coastguard Worker }
292*663afb9bSAndroid Build Coastguard Worker
293*663afb9bSAndroid Build Coastguard Worker evutil_make_socket_nonblocking(pair[0]);
294*663afb9bSAndroid Build Coastguard Worker evutil_make_socket_nonblocking(pair[1]);
295*663afb9bSAndroid Build Coastguard Worker
296*663afb9bSAndroid Build Coastguard Worker bev1 = bufferevent_socket_new(NULL, pair[0], 0);
297*663afb9bSAndroid Build Coastguard Worker bev2 = bufferevent_socket_new(NULL, pair[1], 0);
298*663afb9bSAndroid Build Coastguard Worker
299*663afb9bSAndroid Build Coastguard Worker z_output = mm_calloc(sizeof(*z_output), 1);
300*663afb9bSAndroid Build Coastguard Worker r = deflateInit(z_output, Z_DEFAULT_COMPRESSION);
301*663afb9bSAndroid Build Coastguard Worker tt_int_op(r, ==, Z_OK);
302*663afb9bSAndroid Build Coastguard Worker z_input = mm_calloc(sizeof(*z_input), 1);
303*663afb9bSAndroid Build Coastguard Worker r = inflateInit(z_input);
304*663afb9bSAndroid Build Coastguard Worker tt_int_op(r, ==, Z_OK);
305*663afb9bSAndroid Build Coastguard Worker
306*663afb9bSAndroid Build Coastguard Worker /* initialize filters */
307*663afb9bSAndroid Build Coastguard Worker bev1 = bufferevent_filter_new(bev1, NULL, zlib_output_filter,
308*663afb9bSAndroid Build Coastguard Worker BEV_OPT_CLOSE_ON_FREE, zlib_deflate_free, z_output);
309*663afb9bSAndroid Build Coastguard Worker bev2 = bufferevent_filter_new(bev2, zlib_input_filter,
310*663afb9bSAndroid Build Coastguard Worker NULL, BEV_OPT_CLOSE_ON_FREE, zlib_inflate_free, z_input);
311*663afb9bSAndroid Build Coastguard Worker bufferevent_setcb(bev1, readcb, writecb, errorcb, NULL);
312*663afb9bSAndroid Build Coastguard Worker bufferevent_setcb(bev2, readcb, writecb, errorcb, NULL);
313*663afb9bSAndroid Build Coastguard Worker
314*663afb9bSAndroid Build Coastguard Worker bufferevent_disable(bev1, EV_READ);
315*663afb9bSAndroid Build Coastguard Worker bufferevent_enable(bev1, EV_WRITE);
316*663afb9bSAndroid Build Coastguard Worker
317*663afb9bSAndroid Build Coastguard Worker bufferevent_enable(bev2, EV_READ);
318*663afb9bSAndroid Build Coastguard Worker
319*663afb9bSAndroid Build Coastguard Worker for (i = 0; i < (int)sizeof(buffer); i++)
320*663afb9bSAndroid Build Coastguard Worker buffer[i] = i;
321*663afb9bSAndroid Build Coastguard Worker
322*663afb9bSAndroid Build Coastguard Worker /* break it up into multiple buffer chains */
323*663afb9bSAndroid Build Coastguard Worker bufferevent_write(bev1, buffer, 1800);
324*663afb9bSAndroid Build Coastguard Worker bufferevent_write(bev1, buffer + 1800, sizeof(buffer) - 1800);
325*663afb9bSAndroid Build Coastguard Worker
326*663afb9bSAndroid Build Coastguard Worker /* we are done writing - we need to flush everything */
327*663afb9bSAndroid Build Coastguard Worker bufferevent_flush(bev1, EV_WRITE, BEV_FINISHED);
328*663afb9bSAndroid Build Coastguard Worker
329*663afb9bSAndroid Build Coastguard Worker event_dispatch();
330*663afb9bSAndroid Build Coastguard Worker
331*663afb9bSAndroid Build Coastguard Worker tt_want(infilter_calls);
332*663afb9bSAndroid Build Coastguard Worker tt_want(outfilter_calls);
333*663afb9bSAndroid Build Coastguard Worker tt_want(readcb_finished);
334*663afb9bSAndroid Build Coastguard Worker tt_want(writecb_finished);
335*663afb9bSAndroid Build Coastguard Worker tt_want(!errorcb_invoked);
336*663afb9bSAndroid Build Coastguard Worker
337*663afb9bSAndroid Build Coastguard Worker test_ok = 1;
338*663afb9bSAndroid Build Coastguard Worker end:
339*663afb9bSAndroid Build Coastguard Worker if (bev1)
340*663afb9bSAndroid Build Coastguard Worker bufferevent_free(bev1);
341*663afb9bSAndroid Build Coastguard Worker if (bev2)
342*663afb9bSAndroid Build Coastguard Worker bufferevent_free(bev2);
343*663afb9bSAndroid Build Coastguard Worker
344*663afb9bSAndroid Build Coastguard Worker if (pair[0] >= 0)
345*663afb9bSAndroid Build Coastguard Worker evutil_closesocket(pair[0]);
346*663afb9bSAndroid Build Coastguard Worker if (pair[1] >= 0)
347*663afb9bSAndroid Build Coastguard Worker evutil_closesocket(pair[1]);
348*663afb9bSAndroid Build Coastguard Worker }
349