1*663afb9bSAndroid Build Coastguard Worker /*
2*663afb9bSAndroid Build Coastguard Worker * Copyright (c) 2003-2007 Niels Provos <[email protected]>
3*663afb9bSAndroid Build Coastguard Worker * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
4*663afb9bSAndroid Build Coastguard Worker *
5*663afb9bSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
6*663afb9bSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions
7*663afb9bSAndroid Build Coastguard Worker * are met:
8*663afb9bSAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright
9*663afb9bSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer.
10*663afb9bSAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright
11*663afb9bSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the
12*663afb9bSAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution.
13*663afb9bSAndroid Build Coastguard Worker * 3. The name of the author may not be used to endorse or promote products
14*663afb9bSAndroid Build Coastguard Worker * derived from this software without specific prior written permission.
15*663afb9bSAndroid Build Coastguard Worker *
16*663afb9bSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17*663afb9bSAndroid Build Coastguard Worker * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18*663afb9bSAndroid Build Coastguard Worker * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19*663afb9bSAndroid Build Coastguard Worker * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20*663afb9bSAndroid Build Coastguard Worker * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21*663afb9bSAndroid Build Coastguard Worker * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22*663afb9bSAndroid Build Coastguard Worker * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23*663afb9bSAndroid Build Coastguard Worker * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24*663afb9bSAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25*663afb9bSAndroid Build Coastguard Worker * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*663afb9bSAndroid Build Coastguard Worker */
27*663afb9bSAndroid Build Coastguard Worker
28*663afb9bSAndroid Build Coastguard Worker /* The old tests here need assertions to work. */
29*663afb9bSAndroid Build Coastguard Worker #undef NDEBUG
30*663afb9bSAndroid Build Coastguard Worker
31*663afb9bSAndroid Build Coastguard Worker #ifdef _WIN32
32*663afb9bSAndroid Build Coastguard Worker #include <winsock2.h>
33*663afb9bSAndroid Build Coastguard Worker #include <windows.h>
34*663afb9bSAndroid Build Coastguard Worker #endif
35*663afb9bSAndroid Build Coastguard Worker
36*663afb9bSAndroid Build Coastguard Worker #include "event2/event-config.h"
37*663afb9bSAndroid Build Coastguard Worker
38*663afb9bSAndroid Build Coastguard Worker #include <sys/types.h>
39*663afb9bSAndroid Build Coastguard Worker #include <sys/stat.h>
40*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__HAVE_SYS_TIME_H
41*663afb9bSAndroid Build Coastguard Worker #include <sys/time.h>
42*663afb9bSAndroid Build Coastguard Worker #endif
43*663afb9bSAndroid Build Coastguard Worker #include <sys/queue.h>
44*663afb9bSAndroid Build Coastguard Worker #ifndef _WIN32
45*663afb9bSAndroid Build Coastguard Worker #include <sys/socket.h>
46*663afb9bSAndroid Build Coastguard Worker #include <signal.h>
47*663afb9bSAndroid Build Coastguard Worker #include <unistd.h>
48*663afb9bSAndroid Build Coastguard Worker #include <netdb.h>
49*663afb9bSAndroid Build Coastguard Worker #endif
50*663afb9bSAndroid Build Coastguard Worker #include <fcntl.h>
51*663afb9bSAndroid Build Coastguard Worker #include <stdlib.h>
52*663afb9bSAndroid Build Coastguard Worker #include <stdio.h>
53*663afb9bSAndroid Build Coastguard Worker #include <string.h>
54*663afb9bSAndroid Build Coastguard Worker #include <errno.h>
55*663afb9bSAndroid Build Coastguard Worker #include <assert.h>
56*663afb9bSAndroid Build Coastguard Worker
57*663afb9bSAndroid Build Coastguard Worker #include "event2/buffer.h"
58*663afb9bSAndroid Build Coastguard Worker #include "event2/event.h"
59*663afb9bSAndroid Build Coastguard Worker #include "event2/event_compat.h"
60*663afb9bSAndroid Build Coastguard Worker #include "event2/http.h"
61*663afb9bSAndroid Build Coastguard Worker #include "event2/http_compat.h"
62*663afb9bSAndroid Build Coastguard Worker #include "event2/http_struct.h"
63*663afb9bSAndroid Build Coastguard Worker #include "event2/rpc.h"
64*663afb9bSAndroid Build Coastguard Worker #include "event2/rpc_struct.h"
65*663afb9bSAndroid Build Coastguard Worker #include "event2/tag.h"
66*663afb9bSAndroid Build Coastguard Worker #include "log-internal.h"
67*663afb9bSAndroid Build Coastguard Worker
68*663afb9bSAndroid Build Coastguard Worker #include "regress.gen.h"
69*663afb9bSAndroid Build Coastguard Worker
70*663afb9bSAndroid Build Coastguard Worker #include "regress.h"
71*663afb9bSAndroid Build Coastguard Worker #include "regress_testutils.h"
72*663afb9bSAndroid Build Coastguard Worker
73*663afb9bSAndroid Build Coastguard Worker #ifndef NO_PYTHON_EXISTS
74*663afb9bSAndroid Build Coastguard Worker
75*663afb9bSAndroid Build Coastguard Worker static struct evhttp *
http_setup(ev_uint16_t * pport)76*663afb9bSAndroid Build Coastguard Worker http_setup(ev_uint16_t *pport)
77*663afb9bSAndroid Build Coastguard Worker {
78*663afb9bSAndroid Build Coastguard Worker struct evhttp *myhttp;
79*663afb9bSAndroid Build Coastguard Worker ev_uint16_t port;
80*663afb9bSAndroid Build Coastguard Worker struct evhttp_bound_socket *sock;
81*663afb9bSAndroid Build Coastguard Worker
82*663afb9bSAndroid Build Coastguard Worker myhttp = evhttp_new(NULL);
83*663afb9bSAndroid Build Coastguard Worker if (!myhttp)
84*663afb9bSAndroid Build Coastguard Worker event_errx(1, "Could not start web server");
85*663afb9bSAndroid Build Coastguard Worker
86*663afb9bSAndroid Build Coastguard Worker /* Try a few different ports */
87*663afb9bSAndroid Build Coastguard Worker sock = evhttp_bind_socket_with_handle(myhttp, "127.0.0.1", 0);
88*663afb9bSAndroid Build Coastguard Worker if (!sock)
89*663afb9bSAndroid Build Coastguard Worker event_errx(1, "Couldn't open web port");
90*663afb9bSAndroid Build Coastguard Worker
91*663afb9bSAndroid Build Coastguard Worker port = regress_get_socket_port(evhttp_bound_socket_get_fd(sock));
92*663afb9bSAndroid Build Coastguard Worker
93*663afb9bSAndroid Build Coastguard Worker *pport = port;
94*663afb9bSAndroid Build Coastguard Worker return (myhttp);
95*663afb9bSAndroid Build Coastguard Worker }
96*663afb9bSAndroid Build Coastguard Worker
97*663afb9bSAndroid Build Coastguard Worker EVRPC_HEADER(Message, msg, kill)
98*663afb9bSAndroid Build Coastguard Worker EVRPC_HEADER(NeverReply, msg, kill)
99*663afb9bSAndroid Build Coastguard Worker
100*663afb9bSAndroid Build Coastguard Worker EVRPC_GENERATE(Message, msg, kill)
101*663afb9bSAndroid Build Coastguard Worker EVRPC_GENERATE(NeverReply, msg, kill)
102*663afb9bSAndroid Build Coastguard Worker
103*663afb9bSAndroid Build Coastguard Worker static int need_input_hook = 0;
104*663afb9bSAndroid Build Coastguard Worker static int need_output_hook = 0;
105*663afb9bSAndroid Build Coastguard Worker
106*663afb9bSAndroid Build Coastguard Worker static void
MessageCb(EVRPC_STRUCT (Message)* rpc,void * arg)107*663afb9bSAndroid Build Coastguard Worker MessageCb(EVRPC_STRUCT(Message)* rpc, void *arg)
108*663afb9bSAndroid Build Coastguard Worker {
109*663afb9bSAndroid Build Coastguard Worker struct kill* kill_reply = rpc->reply;
110*663afb9bSAndroid Build Coastguard Worker
111*663afb9bSAndroid Build Coastguard Worker if (need_input_hook) {
112*663afb9bSAndroid Build Coastguard Worker struct evhttp_request* req = EVRPC_REQUEST_HTTP(rpc);
113*663afb9bSAndroid Build Coastguard Worker const char *header = evhttp_find_header(
114*663afb9bSAndroid Build Coastguard Worker req->input_headers, "X-Hook");
115*663afb9bSAndroid Build Coastguard Worker assert(header);
116*663afb9bSAndroid Build Coastguard Worker assert(strcmp(header, "input") == 0);
117*663afb9bSAndroid Build Coastguard Worker }
118*663afb9bSAndroid Build Coastguard Worker
119*663afb9bSAndroid Build Coastguard Worker /* we just want to fill in some non-sense */
120*663afb9bSAndroid Build Coastguard Worker EVTAG_ASSIGN(kill_reply, weapon, "dagger");
121*663afb9bSAndroid Build Coastguard Worker EVTAG_ASSIGN(kill_reply, action, "wave around like an idiot");
122*663afb9bSAndroid Build Coastguard Worker
123*663afb9bSAndroid Build Coastguard Worker /* no reply to the RPC */
124*663afb9bSAndroid Build Coastguard Worker EVRPC_REQUEST_DONE(rpc);
125*663afb9bSAndroid Build Coastguard Worker }
126*663afb9bSAndroid Build Coastguard Worker
EVRPC_STRUCT(NeverReply)127*663afb9bSAndroid Build Coastguard Worker static EVRPC_STRUCT(NeverReply) *saved_rpc;
128*663afb9bSAndroid Build Coastguard Worker
129*663afb9bSAndroid Build Coastguard Worker static void
130*663afb9bSAndroid Build Coastguard Worker NeverReplyCb(EVRPC_STRUCT(NeverReply)* rpc, void *arg)
131*663afb9bSAndroid Build Coastguard Worker {
132*663afb9bSAndroid Build Coastguard Worker test_ok += 1;
133*663afb9bSAndroid Build Coastguard Worker saved_rpc = rpc;
134*663afb9bSAndroid Build Coastguard Worker }
135*663afb9bSAndroid Build Coastguard Worker
136*663afb9bSAndroid Build Coastguard Worker static void
rpc_setup(struct evhttp ** phttp,ev_uint16_t * pport,struct evrpc_base ** pbase)137*663afb9bSAndroid Build Coastguard Worker rpc_setup(struct evhttp **phttp, ev_uint16_t *pport, struct evrpc_base **pbase)
138*663afb9bSAndroid Build Coastguard Worker {
139*663afb9bSAndroid Build Coastguard Worker ev_uint16_t port;
140*663afb9bSAndroid Build Coastguard Worker struct evhttp *http = NULL;
141*663afb9bSAndroid Build Coastguard Worker struct evrpc_base *base = NULL;
142*663afb9bSAndroid Build Coastguard Worker
143*663afb9bSAndroid Build Coastguard Worker http = http_setup(&port);
144*663afb9bSAndroid Build Coastguard Worker base = evrpc_init(http);
145*663afb9bSAndroid Build Coastguard Worker
146*663afb9bSAndroid Build Coastguard Worker EVRPC_REGISTER(base, Message, msg, kill, MessageCb, NULL);
147*663afb9bSAndroid Build Coastguard Worker EVRPC_REGISTER(base, NeverReply, msg, kill, NeverReplyCb, NULL);
148*663afb9bSAndroid Build Coastguard Worker
149*663afb9bSAndroid Build Coastguard Worker *phttp = http;
150*663afb9bSAndroid Build Coastguard Worker *pport = port;
151*663afb9bSAndroid Build Coastguard Worker *pbase = base;
152*663afb9bSAndroid Build Coastguard Worker
153*663afb9bSAndroid Build Coastguard Worker need_input_hook = 0;
154*663afb9bSAndroid Build Coastguard Worker need_output_hook = 0;
155*663afb9bSAndroid Build Coastguard Worker }
156*663afb9bSAndroid Build Coastguard Worker
157*663afb9bSAndroid Build Coastguard Worker static void
rpc_teardown(struct evrpc_base * base)158*663afb9bSAndroid Build Coastguard Worker rpc_teardown(struct evrpc_base *base)
159*663afb9bSAndroid Build Coastguard Worker {
160*663afb9bSAndroid Build Coastguard Worker assert(EVRPC_UNREGISTER(base, Message) == 0);
161*663afb9bSAndroid Build Coastguard Worker assert(EVRPC_UNREGISTER(base, NeverReply) == 0);
162*663afb9bSAndroid Build Coastguard Worker
163*663afb9bSAndroid Build Coastguard Worker evrpc_free(base);
164*663afb9bSAndroid Build Coastguard Worker }
165*663afb9bSAndroid Build Coastguard Worker
166*663afb9bSAndroid Build Coastguard Worker static void
rpc_postrequest_failure(struct evhttp_request * req,void * arg)167*663afb9bSAndroid Build Coastguard Worker rpc_postrequest_failure(struct evhttp_request *req, void *arg)
168*663afb9bSAndroid Build Coastguard Worker {
169*663afb9bSAndroid Build Coastguard Worker if (req->response_code != HTTP_SERVUNAVAIL) {
170*663afb9bSAndroid Build Coastguard Worker
171*663afb9bSAndroid Build Coastguard Worker fprintf(stderr, "FAILED (response code)\n");
172*663afb9bSAndroid Build Coastguard Worker exit(1);
173*663afb9bSAndroid Build Coastguard Worker }
174*663afb9bSAndroid Build Coastguard Worker
175*663afb9bSAndroid Build Coastguard Worker test_ok = 1;
176*663afb9bSAndroid Build Coastguard Worker event_loopexit(NULL);
177*663afb9bSAndroid Build Coastguard Worker }
178*663afb9bSAndroid Build Coastguard Worker
179*663afb9bSAndroid Build Coastguard Worker /*
180*663afb9bSAndroid Build Coastguard Worker * Test a malformed payload submitted as an RPC
181*663afb9bSAndroid Build Coastguard Worker */
182*663afb9bSAndroid Build Coastguard Worker
183*663afb9bSAndroid Build Coastguard Worker static void
rpc_basic_test(void)184*663afb9bSAndroid Build Coastguard Worker rpc_basic_test(void)
185*663afb9bSAndroid Build Coastguard Worker {
186*663afb9bSAndroid Build Coastguard Worker ev_uint16_t port;
187*663afb9bSAndroid Build Coastguard Worker struct evhttp *http = NULL;
188*663afb9bSAndroid Build Coastguard Worker struct evrpc_base *base = NULL;
189*663afb9bSAndroid Build Coastguard Worker struct evhttp_connection *evcon = NULL;
190*663afb9bSAndroid Build Coastguard Worker struct evhttp_request *req = NULL;
191*663afb9bSAndroid Build Coastguard Worker
192*663afb9bSAndroid Build Coastguard Worker rpc_setup(&http, &port, &base);
193*663afb9bSAndroid Build Coastguard Worker
194*663afb9bSAndroid Build Coastguard Worker evcon = evhttp_connection_new("127.0.0.1", port);
195*663afb9bSAndroid Build Coastguard Worker tt_assert(evcon);
196*663afb9bSAndroid Build Coastguard Worker
197*663afb9bSAndroid Build Coastguard Worker /*
198*663afb9bSAndroid Build Coastguard Worker * At this point, we want to schedule an HTTP POST request
199*663afb9bSAndroid Build Coastguard Worker * server using our make request method.
200*663afb9bSAndroid Build Coastguard Worker */
201*663afb9bSAndroid Build Coastguard Worker
202*663afb9bSAndroid Build Coastguard Worker req = evhttp_request_new(rpc_postrequest_failure, NULL);
203*663afb9bSAndroid Build Coastguard Worker tt_assert(req);
204*663afb9bSAndroid Build Coastguard Worker
205*663afb9bSAndroid Build Coastguard Worker /* Add the information that we care about */
206*663afb9bSAndroid Build Coastguard Worker evhttp_add_header(req->output_headers, "Host", "somehost");
207*663afb9bSAndroid Build Coastguard Worker evbuffer_add_printf(req->output_buffer, "Some Nonsense");
208*663afb9bSAndroid Build Coastguard Worker
209*663afb9bSAndroid Build Coastguard Worker if (evhttp_make_request(evcon, req,
210*663afb9bSAndroid Build Coastguard Worker EVHTTP_REQ_POST,
211*663afb9bSAndroid Build Coastguard Worker "/.rpc.Message") == -1) {
212*663afb9bSAndroid Build Coastguard Worker tt_abort();
213*663afb9bSAndroid Build Coastguard Worker }
214*663afb9bSAndroid Build Coastguard Worker
215*663afb9bSAndroid Build Coastguard Worker test_ok = 0;
216*663afb9bSAndroid Build Coastguard Worker
217*663afb9bSAndroid Build Coastguard Worker event_dispatch();
218*663afb9bSAndroid Build Coastguard Worker
219*663afb9bSAndroid Build Coastguard Worker evhttp_connection_free(evcon);
220*663afb9bSAndroid Build Coastguard Worker
221*663afb9bSAndroid Build Coastguard Worker rpc_teardown(base);
222*663afb9bSAndroid Build Coastguard Worker
223*663afb9bSAndroid Build Coastguard Worker tt_assert(test_ok == 1);
224*663afb9bSAndroid Build Coastguard Worker
225*663afb9bSAndroid Build Coastguard Worker end:
226*663afb9bSAndroid Build Coastguard Worker evhttp_free(http);
227*663afb9bSAndroid Build Coastguard Worker }
228*663afb9bSAndroid Build Coastguard Worker
229*663afb9bSAndroid Build Coastguard Worker static void
rpc_postrequest_done(struct evhttp_request * req,void * arg)230*663afb9bSAndroid Build Coastguard Worker rpc_postrequest_done(struct evhttp_request *req, void *arg)
231*663afb9bSAndroid Build Coastguard Worker {
232*663afb9bSAndroid Build Coastguard Worker struct kill* kill_reply = NULL;
233*663afb9bSAndroid Build Coastguard Worker
234*663afb9bSAndroid Build Coastguard Worker if (req->response_code != HTTP_OK) {
235*663afb9bSAndroid Build Coastguard Worker fprintf(stderr, "FAILED (response code)\n");
236*663afb9bSAndroid Build Coastguard Worker exit(1);
237*663afb9bSAndroid Build Coastguard Worker }
238*663afb9bSAndroid Build Coastguard Worker
239*663afb9bSAndroid Build Coastguard Worker kill_reply = kill_new();
240*663afb9bSAndroid Build Coastguard Worker
241*663afb9bSAndroid Build Coastguard Worker if ((kill_unmarshal(kill_reply, req->input_buffer)) == -1) {
242*663afb9bSAndroid Build Coastguard Worker fprintf(stderr, "FAILED (unmarshal)\n");
243*663afb9bSAndroid Build Coastguard Worker exit(1);
244*663afb9bSAndroid Build Coastguard Worker }
245*663afb9bSAndroid Build Coastguard Worker
246*663afb9bSAndroid Build Coastguard Worker kill_free(kill_reply);
247*663afb9bSAndroid Build Coastguard Worker
248*663afb9bSAndroid Build Coastguard Worker test_ok = 1;
249*663afb9bSAndroid Build Coastguard Worker event_loopexit(NULL);
250*663afb9bSAndroid Build Coastguard Worker }
251*663afb9bSAndroid Build Coastguard Worker
252*663afb9bSAndroid Build Coastguard Worker static void
rpc_basic_message(void)253*663afb9bSAndroid Build Coastguard Worker rpc_basic_message(void)
254*663afb9bSAndroid Build Coastguard Worker {
255*663afb9bSAndroid Build Coastguard Worker ev_uint16_t port;
256*663afb9bSAndroid Build Coastguard Worker struct evhttp *http = NULL;
257*663afb9bSAndroid Build Coastguard Worker struct evrpc_base *base = NULL;
258*663afb9bSAndroid Build Coastguard Worker struct evhttp_connection *evcon = NULL;
259*663afb9bSAndroid Build Coastguard Worker struct evhttp_request *req = NULL;
260*663afb9bSAndroid Build Coastguard Worker struct msg *msg;
261*663afb9bSAndroid Build Coastguard Worker
262*663afb9bSAndroid Build Coastguard Worker rpc_setup(&http, &port, &base);
263*663afb9bSAndroid Build Coastguard Worker
264*663afb9bSAndroid Build Coastguard Worker evcon = evhttp_connection_new("127.0.0.1", port);
265*663afb9bSAndroid Build Coastguard Worker tt_assert(evcon);
266*663afb9bSAndroid Build Coastguard Worker
267*663afb9bSAndroid Build Coastguard Worker /*
268*663afb9bSAndroid Build Coastguard Worker * At this point, we want to schedule an HTTP POST request
269*663afb9bSAndroid Build Coastguard Worker * server using our make request method.
270*663afb9bSAndroid Build Coastguard Worker */
271*663afb9bSAndroid Build Coastguard Worker
272*663afb9bSAndroid Build Coastguard Worker req = evhttp_request_new(rpc_postrequest_done, NULL);
273*663afb9bSAndroid Build Coastguard Worker if (req == NULL) {
274*663afb9bSAndroid Build Coastguard Worker fprintf(stdout, "FAILED\n");
275*663afb9bSAndroid Build Coastguard Worker exit(1);
276*663afb9bSAndroid Build Coastguard Worker }
277*663afb9bSAndroid Build Coastguard Worker
278*663afb9bSAndroid Build Coastguard Worker /* Add the information that we care about */
279*663afb9bSAndroid Build Coastguard Worker evhttp_add_header(req->output_headers, "Host", "somehost");
280*663afb9bSAndroid Build Coastguard Worker
281*663afb9bSAndroid Build Coastguard Worker /* set up the basic message */
282*663afb9bSAndroid Build Coastguard Worker msg = msg_new();
283*663afb9bSAndroid Build Coastguard Worker EVTAG_ASSIGN(msg, from_name, "niels");
284*663afb9bSAndroid Build Coastguard Worker EVTAG_ASSIGN(msg, to_name, "tester");
285*663afb9bSAndroid Build Coastguard Worker msg_marshal(req->output_buffer, msg);
286*663afb9bSAndroid Build Coastguard Worker msg_free(msg);
287*663afb9bSAndroid Build Coastguard Worker
288*663afb9bSAndroid Build Coastguard Worker if (evhttp_make_request(evcon, req,
289*663afb9bSAndroid Build Coastguard Worker EVHTTP_REQ_POST,
290*663afb9bSAndroid Build Coastguard Worker "/.rpc.Message") == -1) {
291*663afb9bSAndroid Build Coastguard Worker fprintf(stdout, "FAILED\n");
292*663afb9bSAndroid Build Coastguard Worker exit(1);
293*663afb9bSAndroid Build Coastguard Worker }
294*663afb9bSAndroid Build Coastguard Worker
295*663afb9bSAndroid Build Coastguard Worker test_ok = 0;
296*663afb9bSAndroid Build Coastguard Worker
297*663afb9bSAndroid Build Coastguard Worker event_dispatch();
298*663afb9bSAndroid Build Coastguard Worker
299*663afb9bSAndroid Build Coastguard Worker evhttp_connection_free(evcon);
300*663afb9bSAndroid Build Coastguard Worker
301*663afb9bSAndroid Build Coastguard Worker rpc_teardown(base);
302*663afb9bSAndroid Build Coastguard Worker
303*663afb9bSAndroid Build Coastguard Worker end:
304*663afb9bSAndroid Build Coastguard Worker evhttp_free(http);
305*663afb9bSAndroid Build Coastguard Worker }
306*663afb9bSAndroid Build Coastguard Worker
307*663afb9bSAndroid Build Coastguard Worker static struct evrpc_pool *
rpc_pool_with_connection(ev_uint16_t port)308*663afb9bSAndroid Build Coastguard Worker rpc_pool_with_connection(ev_uint16_t port)
309*663afb9bSAndroid Build Coastguard Worker {
310*663afb9bSAndroid Build Coastguard Worker struct evhttp_connection *evcon;
311*663afb9bSAndroid Build Coastguard Worker struct evrpc_pool *pool;
312*663afb9bSAndroid Build Coastguard Worker
313*663afb9bSAndroid Build Coastguard Worker pool = evrpc_pool_new(NULL);
314*663afb9bSAndroid Build Coastguard Worker assert(pool != NULL);
315*663afb9bSAndroid Build Coastguard Worker
316*663afb9bSAndroid Build Coastguard Worker evcon = evhttp_connection_new("127.0.0.1", port);
317*663afb9bSAndroid Build Coastguard Worker assert(evcon != NULL);
318*663afb9bSAndroid Build Coastguard Worker
319*663afb9bSAndroid Build Coastguard Worker evrpc_pool_add_connection(pool, evcon);
320*663afb9bSAndroid Build Coastguard Worker
321*663afb9bSAndroid Build Coastguard Worker return (pool);
322*663afb9bSAndroid Build Coastguard Worker }
323*663afb9bSAndroid Build Coastguard Worker
324*663afb9bSAndroid Build Coastguard Worker static void
GotKillCb(struct evrpc_status * status,struct msg * msg,struct kill * kill,void * arg)325*663afb9bSAndroid Build Coastguard Worker GotKillCb(struct evrpc_status *status,
326*663afb9bSAndroid Build Coastguard Worker struct msg *msg, struct kill *kill, void *arg)
327*663afb9bSAndroid Build Coastguard Worker {
328*663afb9bSAndroid Build Coastguard Worker char *weapon;
329*663afb9bSAndroid Build Coastguard Worker char *action;
330*663afb9bSAndroid Build Coastguard Worker
331*663afb9bSAndroid Build Coastguard Worker if (need_output_hook) {
332*663afb9bSAndroid Build Coastguard Worker struct evhttp_request *req = status->http_req;
333*663afb9bSAndroid Build Coastguard Worker const char *header = evhttp_find_header(
334*663afb9bSAndroid Build Coastguard Worker req->input_headers, "X-Pool-Hook");
335*663afb9bSAndroid Build Coastguard Worker assert(header);
336*663afb9bSAndroid Build Coastguard Worker assert(strcmp(header, "ran") == 0);
337*663afb9bSAndroid Build Coastguard Worker }
338*663afb9bSAndroid Build Coastguard Worker
339*663afb9bSAndroid Build Coastguard Worker if (status->error != EVRPC_STATUS_ERR_NONE)
340*663afb9bSAndroid Build Coastguard Worker goto done;
341*663afb9bSAndroid Build Coastguard Worker
342*663afb9bSAndroid Build Coastguard Worker if (EVTAG_GET(kill, weapon, &weapon) == -1) {
343*663afb9bSAndroid Build Coastguard Worker fprintf(stderr, "get weapon\n");
344*663afb9bSAndroid Build Coastguard Worker goto done;
345*663afb9bSAndroid Build Coastguard Worker }
346*663afb9bSAndroid Build Coastguard Worker if (EVTAG_GET(kill, action, &action) == -1) {
347*663afb9bSAndroid Build Coastguard Worker fprintf(stderr, "get action\n");
348*663afb9bSAndroid Build Coastguard Worker goto done;
349*663afb9bSAndroid Build Coastguard Worker }
350*663afb9bSAndroid Build Coastguard Worker
351*663afb9bSAndroid Build Coastguard Worker if (strcmp(weapon, "dagger"))
352*663afb9bSAndroid Build Coastguard Worker goto done;
353*663afb9bSAndroid Build Coastguard Worker
354*663afb9bSAndroid Build Coastguard Worker if (strcmp(action, "wave around like an idiot"))
355*663afb9bSAndroid Build Coastguard Worker goto done;
356*663afb9bSAndroid Build Coastguard Worker
357*663afb9bSAndroid Build Coastguard Worker test_ok += 1;
358*663afb9bSAndroid Build Coastguard Worker
359*663afb9bSAndroid Build Coastguard Worker done:
360*663afb9bSAndroid Build Coastguard Worker event_loopexit(NULL);
361*663afb9bSAndroid Build Coastguard Worker }
362*663afb9bSAndroid Build Coastguard Worker
363*663afb9bSAndroid Build Coastguard Worker static void
GotKillCbTwo(struct evrpc_status * status,struct msg * msg,struct kill * kill,void * arg)364*663afb9bSAndroid Build Coastguard Worker GotKillCbTwo(struct evrpc_status *status,
365*663afb9bSAndroid Build Coastguard Worker struct msg *msg, struct kill *kill, void *arg)
366*663afb9bSAndroid Build Coastguard Worker {
367*663afb9bSAndroid Build Coastguard Worker char *weapon;
368*663afb9bSAndroid Build Coastguard Worker char *action;
369*663afb9bSAndroid Build Coastguard Worker
370*663afb9bSAndroid Build Coastguard Worker if (status->error != EVRPC_STATUS_ERR_NONE)
371*663afb9bSAndroid Build Coastguard Worker goto done;
372*663afb9bSAndroid Build Coastguard Worker
373*663afb9bSAndroid Build Coastguard Worker if (EVTAG_GET(kill, weapon, &weapon) == -1) {
374*663afb9bSAndroid Build Coastguard Worker fprintf(stderr, "get weapon\n");
375*663afb9bSAndroid Build Coastguard Worker goto done;
376*663afb9bSAndroid Build Coastguard Worker }
377*663afb9bSAndroid Build Coastguard Worker if (EVTAG_GET(kill, action, &action) == -1) {
378*663afb9bSAndroid Build Coastguard Worker fprintf(stderr, "get action\n");
379*663afb9bSAndroid Build Coastguard Worker goto done;
380*663afb9bSAndroid Build Coastguard Worker }
381*663afb9bSAndroid Build Coastguard Worker
382*663afb9bSAndroid Build Coastguard Worker if (strcmp(weapon, "dagger"))
383*663afb9bSAndroid Build Coastguard Worker goto done;
384*663afb9bSAndroid Build Coastguard Worker
385*663afb9bSAndroid Build Coastguard Worker if (strcmp(action, "wave around like an idiot"))
386*663afb9bSAndroid Build Coastguard Worker goto done;
387*663afb9bSAndroid Build Coastguard Worker
388*663afb9bSAndroid Build Coastguard Worker test_ok += 1;
389*663afb9bSAndroid Build Coastguard Worker
390*663afb9bSAndroid Build Coastguard Worker done:
391*663afb9bSAndroid Build Coastguard Worker if (test_ok == 2)
392*663afb9bSAndroid Build Coastguard Worker event_loopexit(NULL);
393*663afb9bSAndroid Build Coastguard Worker }
394*663afb9bSAndroid Build Coastguard Worker
395*663afb9bSAndroid Build Coastguard Worker static int
rpc_hook_add_header(void * ctx,struct evhttp_request * req,struct evbuffer * evbuf,void * arg)396*663afb9bSAndroid Build Coastguard Worker rpc_hook_add_header(void *ctx, struct evhttp_request *req,
397*663afb9bSAndroid Build Coastguard Worker struct evbuffer *evbuf, void *arg)
398*663afb9bSAndroid Build Coastguard Worker {
399*663afb9bSAndroid Build Coastguard Worker const char *hook_type = arg;
400*663afb9bSAndroid Build Coastguard Worker if (strcmp("input", hook_type) == 0)
401*663afb9bSAndroid Build Coastguard Worker evhttp_add_header(req->input_headers, "X-Hook", hook_type);
402*663afb9bSAndroid Build Coastguard Worker else
403*663afb9bSAndroid Build Coastguard Worker evhttp_add_header(req->output_headers, "X-Hook", hook_type);
404*663afb9bSAndroid Build Coastguard Worker
405*663afb9bSAndroid Build Coastguard Worker assert(evrpc_hook_get_connection(ctx) != NULL);
406*663afb9bSAndroid Build Coastguard Worker
407*663afb9bSAndroid Build Coastguard Worker return (EVRPC_CONTINUE);
408*663afb9bSAndroid Build Coastguard Worker }
409*663afb9bSAndroid Build Coastguard Worker
410*663afb9bSAndroid Build Coastguard Worker static int
rpc_hook_add_meta(void * ctx,struct evhttp_request * req,struct evbuffer * evbuf,void * arg)411*663afb9bSAndroid Build Coastguard Worker rpc_hook_add_meta(void *ctx, struct evhttp_request *req,
412*663afb9bSAndroid Build Coastguard Worker struct evbuffer *evbuf, void *arg)
413*663afb9bSAndroid Build Coastguard Worker {
414*663afb9bSAndroid Build Coastguard Worker evrpc_hook_add_meta(ctx, "meta", "test", 5);
415*663afb9bSAndroid Build Coastguard Worker
416*663afb9bSAndroid Build Coastguard Worker assert(evrpc_hook_get_connection(ctx) != NULL);
417*663afb9bSAndroid Build Coastguard Worker
418*663afb9bSAndroid Build Coastguard Worker return (EVRPC_CONTINUE);
419*663afb9bSAndroid Build Coastguard Worker }
420*663afb9bSAndroid Build Coastguard Worker
421*663afb9bSAndroid Build Coastguard Worker static int
rpc_hook_remove_header(void * ctx,struct evhttp_request * req,struct evbuffer * evbuf,void * arg)422*663afb9bSAndroid Build Coastguard Worker rpc_hook_remove_header(void *ctx, struct evhttp_request *req,
423*663afb9bSAndroid Build Coastguard Worker struct evbuffer *evbuf, void *arg)
424*663afb9bSAndroid Build Coastguard Worker {
425*663afb9bSAndroid Build Coastguard Worker const char *header = evhttp_find_header(req->input_headers, "X-Hook");
426*663afb9bSAndroid Build Coastguard Worker void *data = NULL;
427*663afb9bSAndroid Build Coastguard Worker size_t data_len = 0;
428*663afb9bSAndroid Build Coastguard Worker
429*663afb9bSAndroid Build Coastguard Worker assert(header != NULL);
430*663afb9bSAndroid Build Coastguard Worker assert(strcmp(header, arg) == 0);
431*663afb9bSAndroid Build Coastguard Worker
432*663afb9bSAndroid Build Coastguard Worker evhttp_remove_header(req->input_headers, "X-Hook");
433*663afb9bSAndroid Build Coastguard Worker evhttp_add_header(req->input_headers, "X-Pool-Hook", "ran");
434*663afb9bSAndroid Build Coastguard Worker
435*663afb9bSAndroid Build Coastguard Worker assert(evrpc_hook_find_meta(ctx, "meta", &data, &data_len) == 0);
436*663afb9bSAndroid Build Coastguard Worker assert(data != NULL);
437*663afb9bSAndroid Build Coastguard Worker assert(data_len == 5);
438*663afb9bSAndroid Build Coastguard Worker
439*663afb9bSAndroid Build Coastguard Worker assert(evrpc_hook_get_connection(ctx) != NULL);
440*663afb9bSAndroid Build Coastguard Worker
441*663afb9bSAndroid Build Coastguard Worker return (EVRPC_CONTINUE);
442*663afb9bSAndroid Build Coastguard Worker }
443*663afb9bSAndroid Build Coastguard Worker
444*663afb9bSAndroid Build Coastguard Worker static void
rpc_basic_client(void)445*663afb9bSAndroid Build Coastguard Worker rpc_basic_client(void)
446*663afb9bSAndroid Build Coastguard Worker {
447*663afb9bSAndroid Build Coastguard Worker ev_uint16_t port;
448*663afb9bSAndroid Build Coastguard Worker struct evhttp *http = NULL;
449*663afb9bSAndroid Build Coastguard Worker struct evrpc_base *base = NULL;
450*663afb9bSAndroid Build Coastguard Worker struct evrpc_pool *pool = NULL;
451*663afb9bSAndroid Build Coastguard Worker struct msg *msg = NULL;
452*663afb9bSAndroid Build Coastguard Worker struct kill *kill = NULL;
453*663afb9bSAndroid Build Coastguard Worker
454*663afb9bSAndroid Build Coastguard Worker rpc_setup(&http, &port, &base);
455*663afb9bSAndroid Build Coastguard Worker
456*663afb9bSAndroid Build Coastguard Worker need_input_hook = 1;
457*663afb9bSAndroid Build Coastguard Worker need_output_hook = 1;
458*663afb9bSAndroid Build Coastguard Worker
459*663afb9bSAndroid Build Coastguard Worker assert(evrpc_add_hook(base, EVRPC_INPUT, rpc_hook_add_header, (void*)"input")
460*663afb9bSAndroid Build Coastguard Worker != NULL);
461*663afb9bSAndroid Build Coastguard Worker assert(evrpc_add_hook(base, EVRPC_OUTPUT, rpc_hook_add_header, (void*)"output")
462*663afb9bSAndroid Build Coastguard Worker != NULL);
463*663afb9bSAndroid Build Coastguard Worker
464*663afb9bSAndroid Build Coastguard Worker pool = rpc_pool_with_connection(port);
465*663afb9bSAndroid Build Coastguard Worker tt_assert(pool);
466*663afb9bSAndroid Build Coastguard Worker
467*663afb9bSAndroid Build Coastguard Worker assert(evrpc_add_hook(pool, EVRPC_OUTPUT, rpc_hook_add_meta, NULL));
468*663afb9bSAndroid Build Coastguard Worker assert(evrpc_add_hook(pool, EVRPC_INPUT, rpc_hook_remove_header, (void*)"output"));
469*663afb9bSAndroid Build Coastguard Worker
470*663afb9bSAndroid Build Coastguard Worker /* set up the basic message */
471*663afb9bSAndroid Build Coastguard Worker msg = msg_new();
472*663afb9bSAndroid Build Coastguard Worker tt_assert(msg);
473*663afb9bSAndroid Build Coastguard Worker EVTAG_ASSIGN(msg, from_name, "niels");
474*663afb9bSAndroid Build Coastguard Worker EVTAG_ASSIGN(msg, to_name, "tester");
475*663afb9bSAndroid Build Coastguard Worker
476*663afb9bSAndroid Build Coastguard Worker kill = kill_new();
477*663afb9bSAndroid Build Coastguard Worker
478*663afb9bSAndroid Build Coastguard Worker EVRPC_MAKE_REQUEST(Message, pool, msg, kill, GotKillCb, NULL);
479*663afb9bSAndroid Build Coastguard Worker
480*663afb9bSAndroid Build Coastguard Worker test_ok = 0;
481*663afb9bSAndroid Build Coastguard Worker
482*663afb9bSAndroid Build Coastguard Worker event_dispatch();
483*663afb9bSAndroid Build Coastguard Worker
484*663afb9bSAndroid Build Coastguard Worker tt_assert(test_ok == 1);
485*663afb9bSAndroid Build Coastguard Worker
486*663afb9bSAndroid Build Coastguard Worker /* we do it twice to make sure that reuse works correctly */
487*663afb9bSAndroid Build Coastguard Worker kill_clear(kill);
488*663afb9bSAndroid Build Coastguard Worker
489*663afb9bSAndroid Build Coastguard Worker EVRPC_MAKE_REQUEST(Message, pool, msg, kill, GotKillCb, NULL);
490*663afb9bSAndroid Build Coastguard Worker
491*663afb9bSAndroid Build Coastguard Worker event_dispatch();
492*663afb9bSAndroid Build Coastguard Worker
493*663afb9bSAndroid Build Coastguard Worker tt_assert(test_ok == 2);
494*663afb9bSAndroid Build Coastguard Worker
495*663afb9bSAndroid Build Coastguard Worker /* we do it trice to make sure other stuff works, too */
496*663afb9bSAndroid Build Coastguard Worker kill_clear(kill);
497*663afb9bSAndroid Build Coastguard Worker
498*663afb9bSAndroid Build Coastguard Worker {
499*663afb9bSAndroid Build Coastguard Worker struct evrpc_request_wrapper *ctx =
500*663afb9bSAndroid Build Coastguard Worker EVRPC_MAKE_CTX(Message, msg, kill,
501*663afb9bSAndroid Build Coastguard Worker pool, msg, kill, GotKillCb, NULL);
502*663afb9bSAndroid Build Coastguard Worker evrpc_make_request(ctx);
503*663afb9bSAndroid Build Coastguard Worker }
504*663afb9bSAndroid Build Coastguard Worker
505*663afb9bSAndroid Build Coastguard Worker event_dispatch();
506*663afb9bSAndroid Build Coastguard Worker
507*663afb9bSAndroid Build Coastguard Worker rpc_teardown(base);
508*663afb9bSAndroid Build Coastguard Worker
509*663afb9bSAndroid Build Coastguard Worker tt_assert(test_ok == 3);
510*663afb9bSAndroid Build Coastguard Worker
511*663afb9bSAndroid Build Coastguard Worker end:
512*663afb9bSAndroid Build Coastguard Worker if (msg)
513*663afb9bSAndroid Build Coastguard Worker msg_free(msg);
514*663afb9bSAndroid Build Coastguard Worker if (kill)
515*663afb9bSAndroid Build Coastguard Worker kill_free(kill);
516*663afb9bSAndroid Build Coastguard Worker
517*663afb9bSAndroid Build Coastguard Worker if (pool)
518*663afb9bSAndroid Build Coastguard Worker evrpc_pool_free(pool);
519*663afb9bSAndroid Build Coastguard Worker if (http)
520*663afb9bSAndroid Build Coastguard Worker evhttp_free(http);
521*663afb9bSAndroid Build Coastguard Worker
522*663afb9bSAndroid Build Coastguard Worker need_input_hook = 0;
523*663afb9bSAndroid Build Coastguard Worker need_output_hook = 0;
524*663afb9bSAndroid Build Coastguard Worker }
525*663afb9bSAndroid Build Coastguard Worker
526*663afb9bSAndroid Build Coastguard Worker /*
527*663afb9bSAndroid Build Coastguard Worker * We are testing that the second requests gets send over the same
528*663afb9bSAndroid Build Coastguard Worker * connection after the first RPCs completes.
529*663afb9bSAndroid Build Coastguard Worker */
530*663afb9bSAndroid Build Coastguard Worker static void
rpc_basic_queued_client(void)531*663afb9bSAndroid Build Coastguard Worker rpc_basic_queued_client(void)
532*663afb9bSAndroid Build Coastguard Worker {
533*663afb9bSAndroid Build Coastguard Worker ev_uint16_t port;
534*663afb9bSAndroid Build Coastguard Worker struct evhttp *http = NULL;
535*663afb9bSAndroid Build Coastguard Worker struct evrpc_base *base = NULL;
536*663afb9bSAndroid Build Coastguard Worker struct evrpc_pool *pool = NULL;
537*663afb9bSAndroid Build Coastguard Worker struct msg *msg=NULL;
538*663afb9bSAndroid Build Coastguard Worker struct kill *kill_one=NULL, *kill_two=NULL;
539*663afb9bSAndroid Build Coastguard Worker
540*663afb9bSAndroid Build Coastguard Worker rpc_setup(&http, &port, &base);
541*663afb9bSAndroid Build Coastguard Worker
542*663afb9bSAndroid Build Coastguard Worker pool = rpc_pool_with_connection(port);
543*663afb9bSAndroid Build Coastguard Worker tt_assert(pool);
544*663afb9bSAndroid Build Coastguard Worker
545*663afb9bSAndroid Build Coastguard Worker /* set up the basic message */
546*663afb9bSAndroid Build Coastguard Worker msg = msg_new();
547*663afb9bSAndroid Build Coastguard Worker tt_assert(msg);
548*663afb9bSAndroid Build Coastguard Worker EVTAG_ASSIGN(msg, from_name, "niels");
549*663afb9bSAndroid Build Coastguard Worker EVTAG_ASSIGN(msg, to_name, "tester");
550*663afb9bSAndroid Build Coastguard Worker
551*663afb9bSAndroid Build Coastguard Worker kill_one = kill_new();
552*663afb9bSAndroid Build Coastguard Worker kill_two = kill_new();
553*663afb9bSAndroid Build Coastguard Worker
554*663afb9bSAndroid Build Coastguard Worker EVRPC_MAKE_REQUEST(Message, pool, msg, kill_one, GotKillCbTwo, NULL);
555*663afb9bSAndroid Build Coastguard Worker EVRPC_MAKE_REQUEST(Message, pool, msg, kill_two, GotKillCb, NULL);
556*663afb9bSAndroid Build Coastguard Worker
557*663afb9bSAndroid Build Coastguard Worker test_ok = 0;
558*663afb9bSAndroid Build Coastguard Worker
559*663afb9bSAndroid Build Coastguard Worker event_dispatch();
560*663afb9bSAndroid Build Coastguard Worker
561*663afb9bSAndroid Build Coastguard Worker rpc_teardown(base);
562*663afb9bSAndroid Build Coastguard Worker
563*663afb9bSAndroid Build Coastguard Worker tt_assert(test_ok == 2);
564*663afb9bSAndroid Build Coastguard Worker
565*663afb9bSAndroid Build Coastguard Worker end:
566*663afb9bSAndroid Build Coastguard Worker if (msg)
567*663afb9bSAndroid Build Coastguard Worker msg_free(msg);
568*663afb9bSAndroid Build Coastguard Worker if (kill_one)
569*663afb9bSAndroid Build Coastguard Worker kill_free(kill_one);
570*663afb9bSAndroid Build Coastguard Worker if (kill_two)
571*663afb9bSAndroid Build Coastguard Worker kill_free(kill_two);
572*663afb9bSAndroid Build Coastguard Worker
573*663afb9bSAndroid Build Coastguard Worker if (pool)
574*663afb9bSAndroid Build Coastguard Worker evrpc_pool_free(pool);
575*663afb9bSAndroid Build Coastguard Worker if (http)
576*663afb9bSAndroid Build Coastguard Worker evhttp_free(http);
577*663afb9bSAndroid Build Coastguard Worker }
578*663afb9bSAndroid Build Coastguard Worker
579*663afb9bSAndroid Build Coastguard Worker static void
GotErrorCb(struct evrpc_status * status,struct msg * msg,struct kill * kill,void * arg)580*663afb9bSAndroid Build Coastguard Worker GotErrorCb(struct evrpc_status *status,
581*663afb9bSAndroid Build Coastguard Worker struct msg *msg, struct kill *kill, void *arg)
582*663afb9bSAndroid Build Coastguard Worker {
583*663afb9bSAndroid Build Coastguard Worker if (status->error != EVRPC_STATUS_ERR_TIMEOUT)
584*663afb9bSAndroid Build Coastguard Worker goto done;
585*663afb9bSAndroid Build Coastguard Worker
586*663afb9bSAndroid Build Coastguard Worker /* should never be complete but just to check */
587*663afb9bSAndroid Build Coastguard Worker if (kill_complete(kill) == 0)
588*663afb9bSAndroid Build Coastguard Worker goto done;
589*663afb9bSAndroid Build Coastguard Worker
590*663afb9bSAndroid Build Coastguard Worker test_ok += 1;
591*663afb9bSAndroid Build Coastguard Worker
592*663afb9bSAndroid Build Coastguard Worker done:
593*663afb9bSAndroid Build Coastguard Worker event_loopexit(NULL);
594*663afb9bSAndroid Build Coastguard Worker }
595*663afb9bSAndroid Build Coastguard Worker
596*663afb9bSAndroid Build Coastguard Worker /* we just pause the rpc and continue it in the next callback */
597*663afb9bSAndroid Build Coastguard Worker
598*663afb9bSAndroid Build Coastguard Worker struct rpc_hook_ctx_ {
599*663afb9bSAndroid Build Coastguard Worker void *vbase;
600*663afb9bSAndroid Build Coastguard Worker void *ctx;
601*663afb9bSAndroid Build Coastguard Worker };
602*663afb9bSAndroid Build Coastguard Worker
603*663afb9bSAndroid Build Coastguard Worker static int hook_pause_cb_called=0;
604*663afb9bSAndroid Build Coastguard Worker
605*663afb9bSAndroid Build Coastguard Worker static void
rpc_hook_pause_cb(evutil_socket_t fd,short what,void * arg)606*663afb9bSAndroid Build Coastguard Worker rpc_hook_pause_cb(evutil_socket_t fd, short what, void *arg)
607*663afb9bSAndroid Build Coastguard Worker {
608*663afb9bSAndroid Build Coastguard Worker struct rpc_hook_ctx_ *ctx = arg;
609*663afb9bSAndroid Build Coastguard Worker ++hook_pause_cb_called;
610*663afb9bSAndroid Build Coastguard Worker evrpc_resume_request(ctx->vbase, ctx->ctx, EVRPC_CONTINUE);
611*663afb9bSAndroid Build Coastguard Worker free(arg);
612*663afb9bSAndroid Build Coastguard Worker }
613*663afb9bSAndroid Build Coastguard Worker
614*663afb9bSAndroid Build Coastguard Worker static int
rpc_hook_pause(void * ctx,struct evhttp_request * req,struct evbuffer * evbuf,void * arg)615*663afb9bSAndroid Build Coastguard Worker rpc_hook_pause(void *ctx, struct evhttp_request *req, struct evbuffer *evbuf,
616*663afb9bSAndroid Build Coastguard Worker void *arg)
617*663afb9bSAndroid Build Coastguard Worker {
618*663afb9bSAndroid Build Coastguard Worker struct rpc_hook_ctx_ *tmp = malloc(sizeof(*tmp));
619*663afb9bSAndroid Build Coastguard Worker struct timeval tv;
620*663afb9bSAndroid Build Coastguard Worker
621*663afb9bSAndroid Build Coastguard Worker assert(tmp != NULL);
622*663afb9bSAndroid Build Coastguard Worker tmp->vbase = arg;
623*663afb9bSAndroid Build Coastguard Worker tmp->ctx = ctx;
624*663afb9bSAndroid Build Coastguard Worker
625*663afb9bSAndroid Build Coastguard Worker memset(&tv, 0, sizeof(tv));
626*663afb9bSAndroid Build Coastguard Worker event_once(-1, EV_TIMEOUT, rpc_hook_pause_cb, tmp, &tv);
627*663afb9bSAndroid Build Coastguard Worker return EVRPC_PAUSE;
628*663afb9bSAndroid Build Coastguard Worker }
629*663afb9bSAndroid Build Coastguard Worker
630*663afb9bSAndroid Build Coastguard Worker static void
rpc_basic_client_with_pause(void)631*663afb9bSAndroid Build Coastguard Worker rpc_basic_client_with_pause(void)
632*663afb9bSAndroid Build Coastguard Worker {
633*663afb9bSAndroid Build Coastguard Worker ev_uint16_t port;
634*663afb9bSAndroid Build Coastguard Worker struct evhttp *http = NULL;
635*663afb9bSAndroid Build Coastguard Worker struct evrpc_base *base = NULL;
636*663afb9bSAndroid Build Coastguard Worker struct evrpc_pool *pool = NULL;
637*663afb9bSAndroid Build Coastguard Worker struct msg *msg = NULL;
638*663afb9bSAndroid Build Coastguard Worker struct kill *kill= NULL;
639*663afb9bSAndroid Build Coastguard Worker
640*663afb9bSAndroid Build Coastguard Worker rpc_setup(&http, &port, &base);
641*663afb9bSAndroid Build Coastguard Worker
642*663afb9bSAndroid Build Coastguard Worker assert(evrpc_add_hook(base, EVRPC_INPUT, rpc_hook_pause, base));
643*663afb9bSAndroid Build Coastguard Worker assert(evrpc_add_hook(base, EVRPC_OUTPUT, rpc_hook_pause, base));
644*663afb9bSAndroid Build Coastguard Worker
645*663afb9bSAndroid Build Coastguard Worker pool = rpc_pool_with_connection(port);
646*663afb9bSAndroid Build Coastguard Worker tt_assert(pool);
647*663afb9bSAndroid Build Coastguard Worker assert(evrpc_add_hook(pool, EVRPC_INPUT, rpc_hook_pause, pool));
648*663afb9bSAndroid Build Coastguard Worker assert(evrpc_add_hook(pool, EVRPC_OUTPUT, rpc_hook_pause, pool));
649*663afb9bSAndroid Build Coastguard Worker
650*663afb9bSAndroid Build Coastguard Worker /* set up the basic message */
651*663afb9bSAndroid Build Coastguard Worker msg = msg_new();
652*663afb9bSAndroid Build Coastguard Worker tt_assert(msg);
653*663afb9bSAndroid Build Coastguard Worker EVTAG_ASSIGN(msg, from_name, "niels");
654*663afb9bSAndroid Build Coastguard Worker EVTAG_ASSIGN(msg, to_name, "tester");
655*663afb9bSAndroid Build Coastguard Worker
656*663afb9bSAndroid Build Coastguard Worker kill = kill_new();
657*663afb9bSAndroid Build Coastguard Worker
658*663afb9bSAndroid Build Coastguard Worker EVRPC_MAKE_REQUEST(Message, pool, msg, kill, GotKillCb, NULL);
659*663afb9bSAndroid Build Coastguard Worker
660*663afb9bSAndroid Build Coastguard Worker test_ok = 0;
661*663afb9bSAndroid Build Coastguard Worker
662*663afb9bSAndroid Build Coastguard Worker event_dispatch();
663*663afb9bSAndroid Build Coastguard Worker
664*663afb9bSAndroid Build Coastguard Worker tt_int_op(test_ok, ==, 1);
665*663afb9bSAndroid Build Coastguard Worker tt_int_op(hook_pause_cb_called, ==, 4);
666*663afb9bSAndroid Build Coastguard Worker
667*663afb9bSAndroid Build Coastguard Worker end:
668*663afb9bSAndroid Build Coastguard Worker if (base)
669*663afb9bSAndroid Build Coastguard Worker rpc_teardown(base);
670*663afb9bSAndroid Build Coastguard Worker
671*663afb9bSAndroid Build Coastguard Worker if (msg)
672*663afb9bSAndroid Build Coastguard Worker msg_free(msg);
673*663afb9bSAndroid Build Coastguard Worker if (kill)
674*663afb9bSAndroid Build Coastguard Worker kill_free(kill);
675*663afb9bSAndroid Build Coastguard Worker
676*663afb9bSAndroid Build Coastguard Worker if (pool)
677*663afb9bSAndroid Build Coastguard Worker evrpc_pool_free(pool);
678*663afb9bSAndroid Build Coastguard Worker if (http)
679*663afb9bSAndroid Build Coastguard Worker evhttp_free(http);
680*663afb9bSAndroid Build Coastguard Worker }
681*663afb9bSAndroid Build Coastguard Worker
682*663afb9bSAndroid Build Coastguard Worker static void
rpc_client_timeout(void)683*663afb9bSAndroid Build Coastguard Worker rpc_client_timeout(void)
684*663afb9bSAndroid Build Coastguard Worker {
685*663afb9bSAndroid Build Coastguard Worker ev_uint16_t port;
686*663afb9bSAndroid Build Coastguard Worker struct evhttp *http = NULL;
687*663afb9bSAndroid Build Coastguard Worker struct evrpc_base *base = NULL;
688*663afb9bSAndroid Build Coastguard Worker struct evrpc_pool *pool = NULL;
689*663afb9bSAndroid Build Coastguard Worker struct msg *msg = NULL;
690*663afb9bSAndroid Build Coastguard Worker struct kill *kill = NULL;
691*663afb9bSAndroid Build Coastguard Worker
692*663afb9bSAndroid Build Coastguard Worker rpc_setup(&http, &port, &base);
693*663afb9bSAndroid Build Coastguard Worker
694*663afb9bSAndroid Build Coastguard Worker pool = rpc_pool_with_connection(port);
695*663afb9bSAndroid Build Coastguard Worker tt_assert(pool);
696*663afb9bSAndroid Build Coastguard Worker
697*663afb9bSAndroid Build Coastguard Worker /* set the timeout to 1 second. */
698*663afb9bSAndroid Build Coastguard Worker evrpc_pool_set_timeout(pool, 1);
699*663afb9bSAndroid Build Coastguard Worker
700*663afb9bSAndroid Build Coastguard Worker /* set up the basic message */
701*663afb9bSAndroid Build Coastguard Worker msg = msg_new();
702*663afb9bSAndroid Build Coastguard Worker tt_assert(msg);
703*663afb9bSAndroid Build Coastguard Worker EVTAG_ASSIGN(msg, from_name, "niels");
704*663afb9bSAndroid Build Coastguard Worker EVTAG_ASSIGN(msg, to_name, "tester");
705*663afb9bSAndroid Build Coastguard Worker
706*663afb9bSAndroid Build Coastguard Worker kill = kill_new();
707*663afb9bSAndroid Build Coastguard Worker
708*663afb9bSAndroid Build Coastguard Worker EVRPC_MAKE_REQUEST(NeverReply, pool, msg, kill, GotErrorCb, NULL);
709*663afb9bSAndroid Build Coastguard Worker
710*663afb9bSAndroid Build Coastguard Worker test_ok = 0;
711*663afb9bSAndroid Build Coastguard Worker
712*663afb9bSAndroid Build Coastguard Worker event_dispatch();
713*663afb9bSAndroid Build Coastguard Worker
714*663afb9bSAndroid Build Coastguard Worker /* free the saved RPC structure up */
715*663afb9bSAndroid Build Coastguard Worker EVRPC_REQUEST_DONE(saved_rpc);
716*663afb9bSAndroid Build Coastguard Worker
717*663afb9bSAndroid Build Coastguard Worker rpc_teardown(base);
718*663afb9bSAndroid Build Coastguard Worker
719*663afb9bSAndroid Build Coastguard Worker tt_assert(test_ok == 2);
720*663afb9bSAndroid Build Coastguard Worker
721*663afb9bSAndroid Build Coastguard Worker end:
722*663afb9bSAndroid Build Coastguard Worker if (msg)
723*663afb9bSAndroid Build Coastguard Worker msg_free(msg);
724*663afb9bSAndroid Build Coastguard Worker if (kill)
725*663afb9bSAndroid Build Coastguard Worker kill_free(kill);
726*663afb9bSAndroid Build Coastguard Worker
727*663afb9bSAndroid Build Coastguard Worker if (pool)
728*663afb9bSAndroid Build Coastguard Worker evrpc_pool_free(pool);
729*663afb9bSAndroid Build Coastguard Worker if (http)
730*663afb9bSAndroid Build Coastguard Worker evhttp_free(http);
731*663afb9bSAndroid Build Coastguard Worker }
732*663afb9bSAndroid Build Coastguard Worker
733*663afb9bSAndroid Build Coastguard Worker static void
rpc_test(void)734*663afb9bSAndroid Build Coastguard Worker rpc_test(void)
735*663afb9bSAndroid Build Coastguard Worker {
736*663afb9bSAndroid Build Coastguard Worker struct msg *msg = NULL, *msg2 = NULL;
737*663afb9bSAndroid Build Coastguard Worker struct kill *attack = NULL;
738*663afb9bSAndroid Build Coastguard Worker struct run *run = NULL;
739*663afb9bSAndroid Build Coastguard Worker struct evbuffer *tmp = evbuffer_new();
740*663afb9bSAndroid Build Coastguard Worker struct timeval tv_start, tv_end;
741*663afb9bSAndroid Build Coastguard Worker ev_uint32_t tag;
742*663afb9bSAndroid Build Coastguard Worker int i;
743*663afb9bSAndroid Build Coastguard Worker
744*663afb9bSAndroid Build Coastguard Worker msg = msg_new();
745*663afb9bSAndroid Build Coastguard Worker
746*663afb9bSAndroid Build Coastguard Worker tt_assert(msg);
747*663afb9bSAndroid Build Coastguard Worker
748*663afb9bSAndroid Build Coastguard Worker EVTAG_ASSIGN(msg, from_name, "niels");
749*663afb9bSAndroid Build Coastguard Worker EVTAG_ASSIGN(msg, to_name, "phoenix");
750*663afb9bSAndroid Build Coastguard Worker
751*663afb9bSAndroid Build Coastguard Worker if (EVTAG_GET(msg, attack, &attack) == -1) {
752*663afb9bSAndroid Build Coastguard Worker tt_abort_msg("Failed to set kill message.");
753*663afb9bSAndroid Build Coastguard Worker }
754*663afb9bSAndroid Build Coastguard Worker
755*663afb9bSAndroid Build Coastguard Worker EVTAG_ASSIGN(attack, weapon, "feather");
756*663afb9bSAndroid Build Coastguard Worker EVTAG_ASSIGN(attack, action, "tickle");
757*663afb9bSAndroid Build Coastguard Worker for (i = 0; i < 3; ++i) {
758*663afb9bSAndroid Build Coastguard Worker if (EVTAG_ARRAY_ADD_VALUE(attack, how_often, i) == NULL) {
759*663afb9bSAndroid Build Coastguard Worker tt_abort_msg("Failed to add how_often.");
760*663afb9bSAndroid Build Coastguard Worker }
761*663afb9bSAndroid Build Coastguard Worker }
762*663afb9bSAndroid Build Coastguard Worker
763*663afb9bSAndroid Build Coastguard Worker evutil_gettimeofday(&tv_start, NULL);
764*663afb9bSAndroid Build Coastguard Worker for (i = 0; i < 1000; ++i) {
765*663afb9bSAndroid Build Coastguard Worker run = EVTAG_ARRAY_ADD(msg, run);
766*663afb9bSAndroid Build Coastguard Worker if (run == NULL) {
767*663afb9bSAndroid Build Coastguard Worker tt_abort_msg("Failed to add run message.");
768*663afb9bSAndroid Build Coastguard Worker }
769*663afb9bSAndroid Build Coastguard Worker EVTAG_ASSIGN(run, how, "very fast but with some data in it");
770*663afb9bSAndroid Build Coastguard Worker EVTAG_ASSIGN(run, fixed_bytes,
771*663afb9bSAndroid Build Coastguard Worker (ev_uint8_t*)"012345678901234567890123");
772*663afb9bSAndroid Build Coastguard Worker
773*663afb9bSAndroid Build Coastguard Worker if (EVTAG_ARRAY_ADD_VALUE(
774*663afb9bSAndroid Build Coastguard Worker run, notes, "this is my note") == NULL) {
775*663afb9bSAndroid Build Coastguard Worker tt_abort_msg("Failed to add note.");
776*663afb9bSAndroid Build Coastguard Worker }
777*663afb9bSAndroid Build Coastguard Worker if (EVTAG_ARRAY_ADD_VALUE(run, notes, "pps") == NULL) {
778*663afb9bSAndroid Build Coastguard Worker tt_abort_msg("Failed to add note");
779*663afb9bSAndroid Build Coastguard Worker }
780*663afb9bSAndroid Build Coastguard Worker
781*663afb9bSAndroid Build Coastguard Worker EVTAG_ASSIGN(run, large_number, 0xdead0a0bcafebeefLL);
782*663afb9bSAndroid Build Coastguard Worker EVTAG_ARRAY_ADD_VALUE(run, other_numbers, 0xdead0a0b);
783*663afb9bSAndroid Build Coastguard Worker EVTAG_ARRAY_ADD_VALUE(run, other_numbers, 0xbeefcafe);
784*663afb9bSAndroid Build Coastguard Worker }
785*663afb9bSAndroid Build Coastguard Worker
786*663afb9bSAndroid Build Coastguard Worker if (msg_complete(msg) == -1)
787*663afb9bSAndroid Build Coastguard Worker tt_abort_msg("Failed to make complete message.");
788*663afb9bSAndroid Build Coastguard Worker
789*663afb9bSAndroid Build Coastguard Worker evtag_marshal_msg(tmp, 0xdeaf, msg);
790*663afb9bSAndroid Build Coastguard Worker
791*663afb9bSAndroid Build Coastguard Worker if (evtag_peek(tmp, &tag) == -1)
792*663afb9bSAndroid Build Coastguard Worker tt_abort_msg("Failed to peak tag.");
793*663afb9bSAndroid Build Coastguard Worker
794*663afb9bSAndroid Build Coastguard Worker if (tag != 0xdeaf)
795*663afb9bSAndroid Build Coastguard Worker TT_DIE(("Got incorrect tag: %0x.", (unsigned)tag));
796*663afb9bSAndroid Build Coastguard Worker
797*663afb9bSAndroid Build Coastguard Worker msg2 = msg_new();
798*663afb9bSAndroid Build Coastguard Worker if (evtag_unmarshal_msg(tmp, 0xdeaf, msg2) == -1)
799*663afb9bSAndroid Build Coastguard Worker tt_abort_msg("Failed to unmarshal message.");
800*663afb9bSAndroid Build Coastguard Worker
801*663afb9bSAndroid Build Coastguard Worker evutil_gettimeofday(&tv_end, NULL);
802*663afb9bSAndroid Build Coastguard Worker evutil_timersub(&tv_end, &tv_start, &tv_end);
803*663afb9bSAndroid Build Coastguard Worker TT_BLATHER(("(%.1f us/add) ",
804*663afb9bSAndroid Build Coastguard Worker (float)tv_end.tv_sec/(float)i * 1000000.0 +
805*663afb9bSAndroid Build Coastguard Worker tv_end.tv_usec / (float)i));
806*663afb9bSAndroid Build Coastguard Worker
807*663afb9bSAndroid Build Coastguard Worker if (!EVTAG_HAS(msg2, from_name) ||
808*663afb9bSAndroid Build Coastguard Worker !EVTAG_HAS(msg2, to_name) ||
809*663afb9bSAndroid Build Coastguard Worker !EVTAG_HAS(msg2, attack)) {
810*663afb9bSAndroid Build Coastguard Worker tt_abort_msg("Missing data structures.");
811*663afb9bSAndroid Build Coastguard Worker }
812*663afb9bSAndroid Build Coastguard Worker
813*663afb9bSAndroid Build Coastguard Worker if (EVTAG_GET(msg2, attack, &attack) == -1) {
814*663afb9bSAndroid Build Coastguard Worker tt_abort_msg("Could not get attack.");
815*663afb9bSAndroid Build Coastguard Worker }
816*663afb9bSAndroid Build Coastguard Worker
817*663afb9bSAndroid Build Coastguard Worker if (EVTAG_ARRAY_LEN(msg2, run) != i) {
818*663afb9bSAndroid Build Coastguard Worker tt_abort_msg("Wrong number of run messages.");
819*663afb9bSAndroid Build Coastguard Worker }
820*663afb9bSAndroid Build Coastguard Worker
821*663afb9bSAndroid Build Coastguard Worker /* get the very first run message */
822*663afb9bSAndroid Build Coastguard Worker if (EVTAG_ARRAY_GET(msg2, run, 0, &run) == -1) {
823*663afb9bSAndroid Build Coastguard Worker tt_abort_msg("Failed to get run msg.");
824*663afb9bSAndroid Build Coastguard Worker } else {
825*663afb9bSAndroid Build Coastguard Worker /* verify the notes */
826*663afb9bSAndroid Build Coastguard Worker char *note_one, *note_two;
827*663afb9bSAndroid Build Coastguard Worker ev_uint64_t large_number;
828*663afb9bSAndroid Build Coastguard Worker ev_uint32_t short_number;
829*663afb9bSAndroid Build Coastguard Worker
830*663afb9bSAndroid Build Coastguard Worker if (EVTAG_ARRAY_LEN(run, notes) != 2) {
831*663afb9bSAndroid Build Coastguard Worker tt_abort_msg("Wrong number of note strings.");
832*663afb9bSAndroid Build Coastguard Worker }
833*663afb9bSAndroid Build Coastguard Worker
834*663afb9bSAndroid Build Coastguard Worker if (EVTAG_ARRAY_GET(run, notes, 0, ¬e_one) == -1 ||
835*663afb9bSAndroid Build Coastguard Worker EVTAG_ARRAY_GET(run, notes, 1, ¬e_two) == -1) {
836*663afb9bSAndroid Build Coastguard Worker tt_abort_msg("Could not get note strings.");
837*663afb9bSAndroid Build Coastguard Worker }
838*663afb9bSAndroid Build Coastguard Worker
839*663afb9bSAndroid Build Coastguard Worker if (strcmp(note_one, "this is my note") ||
840*663afb9bSAndroid Build Coastguard Worker strcmp(note_two, "pps")) {
841*663afb9bSAndroid Build Coastguard Worker tt_abort_msg("Incorrect note strings encoded.");
842*663afb9bSAndroid Build Coastguard Worker }
843*663afb9bSAndroid Build Coastguard Worker
844*663afb9bSAndroid Build Coastguard Worker if (EVTAG_GET(run, large_number, &large_number) == -1 ||
845*663afb9bSAndroid Build Coastguard Worker large_number != 0xdead0a0bcafebeefLL) {
846*663afb9bSAndroid Build Coastguard Worker tt_abort_msg("Incorrrect large_number.");
847*663afb9bSAndroid Build Coastguard Worker }
848*663afb9bSAndroid Build Coastguard Worker
849*663afb9bSAndroid Build Coastguard Worker if (EVTAG_ARRAY_LEN(run, other_numbers) != 2) {
850*663afb9bSAndroid Build Coastguard Worker tt_abort_msg("Wrong number of other_numbers.");
851*663afb9bSAndroid Build Coastguard Worker }
852*663afb9bSAndroid Build Coastguard Worker
853*663afb9bSAndroid Build Coastguard Worker if (EVTAG_ARRAY_GET(
854*663afb9bSAndroid Build Coastguard Worker run, other_numbers, 0, &short_number) == -1) {
855*663afb9bSAndroid Build Coastguard Worker tt_abort_msg("Could not get short number.");
856*663afb9bSAndroid Build Coastguard Worker }
857*663afb9bSAndroid Build Coastguard Worker tt_uint_op(short_number, ==, 0xdead0a0b);
858*663afb9bSAndroid Build Coastguard Worker
859*663afb9bSAndroid Build Coastguard Worker }
860*663afb9bSAndroid Build Coastguard Worker tt_int_op(EVTAG_ARRAY_LEN(attack, how_often), ==, 3);
861*663afb9bSAndroid Build Coastguard Worker
862*663afb9bSAndroid Build Coastguard Worker for (i = 0; i < 3; ++i) {
863*663afb9bSAndroid Build Coastguard Worker ev_uint32_t res;
864*663afb9bSAndroid Build Coastguard Worker if (EVTAG_ARRAY_GET(attack, how_often, i, &res) == -1) {
865*663afb9bSAndroid Build Coastguard Worker TT_DIE(("Cannot get %dth how_often msg.", i));
866*663afb9bSAndroid Build Coastguard Worker }
867*663afb9bSAndroid Build Coastguard Worker if ((int)res != i) {
868*663afb9bSAndroid Build Coastguard Worker TT_DIE(("Wrong message encoded %d != %d", i, res));
869*663afb9bSAndroid Build Coastguard Worker }
870*663afb9bSAndroid Build Coastguard Worker }
871*663afb9bSAndroid Build Coastguard Worker
872*663afb9bSAndroid Build Coastguard Worker test_ok = 1;
873*663afb9bSAndroid Build Coastguard Worker end:
874*663afb9bSAndroid Build Coastguard Worker if (msg)
875*663afb9bSAndroid Build Coastguard Worker msg_free(msg);
876*663afb9bSAndroid Build Coastguard Worker if (msg2)
877*663afb9bSAndroid Build Coastguard Worker msg_free(msg2);
878*663afb9bSAndroid Build Coastguard Worker if (tmp)
879*663afb9bSAndroid Build Coastguard Worker evbuffer_free(tmp);
880*663afb9bSAndroid Build Coastguard Worker }
881*663afb9bSAndroid Build Coastguard Worker
882*663afb9bSAndroid Build Coastguard Worker static void
rpc_invalid_type(void)883*663afb9bSAndroid Build Coastguard Worker rpc_invalid_type(void)
884*663afb9bSAndroid Build Coastguard Worker {
885*663afb9bSAndroid Build Coastguard Worker ev_uint16_t port;
886*663afb9bSAndroid Build Coastguard Worker struct evhttp *http = NULL;
887*663afb9bSAndroid Build Coastguard Worker struct evrpc_base *base = NULL;
888*663afb9bSAndroid Build Coastguard Worker struct evhttp_connection *evcon = NULL;
889*663afb9bSAndroid Build Coastguard Worker struct evhttp_request *req = NULL;
890*663afb9bSAndroid Build Coastguard Worker
891*663afb9bSAndroid Build Coastguard Worker rpc_setup(&http, &port, &base);
892*663afb9bSAndroid Build Coastguard Worker
893*663afb9bSAndroid Build Coastguard Worker evcon = evhttp_connection_new("127.0.0.1", port);
894*663afb9bSAndroid Build Coastguard Worker tt_assert(evcon);
895*663afb9bSAndroid Build Coastguard Worker
896*663afb9bSAndroid Build Coastguard Worker /*
897*663afb9bSAndroid Build Coastguard Worker * At this point, we want to schedule an HTTP POST request
898*663afb9bSAndroid Build Coastguard Worker * server using our make request method.
899*663afb9bSAndroid Build Coastguard Worker */
900*663afb9bSAndroid Build Coastguard Worker
901*663afb9bSAndroid Build Coastguard Worker req = evhttp_request_new(rpc_postrequest_failure, NULL);
902*663afb9bSAndroid Build Coastguard Worker tt_assert(req);
903*663afb9bSAndroid Build Coastguard Worker
904*663afb9bSAndroid Build Coastguard Worker /* Add the information that we care about */
905*663afb9bSAndroid Build Coastguard Worker evhttp_add_header(req->output_headers, "Host", "somehost");
906*663afb9bSAndroid Build Coastguard Worker evbuffer_add_printf(req->output_buffer, "Some Nonsense");
907*663afb9bSAndroid Build Coastguard Worker
908*663afb9bSAndroid Build Coastguard Worker if (evhttp_make_request(evcon, req,
909*663afb9bSAndroid Build Coastguard Worker EVHTTP_REQ_GET,
910*663afb9bSAndroid Build Coastguard Worker "/.rpc.Message") == -1) {
911*663afb9bSAndroid Build Coastguard Worker tt_abort();
912*663afb9bSAndroid Build Coastguard Worker }
913*663afb9bSAndroid Build Coastguard Worker
914*663afb9bSAndroid Build Coastguard Worker test_ok = 0;
915*663afb9bSAndroid Build Coastguard Worker
916*663afb9bSAndroid Build Coastguard Worker event_dispatch();
917*663afb9bSAndroid Build Coastguard Worker
918*663afb9bSAndroid Build Coastguard Worker evhttp_connection_free(evcon);
919*663afb9bSAndroid Build Coastguard Worker
920*663afb9bSAndroid Build Coastguard Worker rpc_teardown(base);
921*663afb9bSAndroid Build Coastguard Worker
922*663afb9bSAndroid Build Coastguard Worker tt_assert(test_ok == 1);
923*663afb9bSAndroid Build Coastguard Worker
924*663afb9bSAndroid Build Coastguard Worker end:
925*663afb9bSAndroid Build Coastguard Worker evhttp_free(http);
926*663afb9bSAndroid Build Coastguard Worker }
927*663afb9bSAndroid Build Coastguard Worker
928*663afb9bSAndroid Build Coastguard Worker
929*663afb9bSAndroid Build Coastguard Worker #define RPC_LEGACY(name) \
930*663afb9bSAndroid Build Coastguard Worker { #name, run_legacy_test_fn, TT_FORK|TT_NEED_BASE|TT_LEGACY, \
931*663afb9bSAndroid Build Coastguard Worker &legacy_setup, \
932*663afb9bSAndroid Build Coastguard Worker rpc_##name }
933*663afb9bSAndroid Build Coastguard Worker #else
934*663afb9bSAndroid Build Coastguard Worker /* NO_PYTHON_EXISTS */
935*663afb9bSAndroid Build Coastguard Worker
936*663afb9bSAndroid Build Coastguard Worker #define RPC_LEGACY(name) \
937*663afb9bSAndroid Build Coastguard Worker { #name, NULL, TT_SKIP, NULL, NULL }
938*663afb9bSAndroid Build Coastguard Worker
939*663afb9bSAndroid Build Coastguard Worker #endif
940*663afb9bSAndroid Build Coastguard Worker
941*663afb9bSAndroid Build Coastguard Worker struct testcase_t rpc_testcases[] = {
942*663afb9bSAndroid Build Coastguard Worker RPC_LEGACY(basic_test),
943*663afb9bSAndroid Build Coastguard Worker RPC_LEGACY(basic_message),
944*663afb9bSAndroid Build Coastguard Worker RPC_LEGACY(basic_client),
945*663afb9bSAndroid Build Coastguard Worker RPC_LEGACY(basic_queued_client),
946*663afb9bSAndroid Build Coastguard Worker RPC_LEGACY(basic_client_with_pause),
947*663afb9bSAndroid Build Coastguard Worker RPC_LEGACY(invalid_type),
948*663afb9bSAndroid Build Coastguard Worker RPC_LEGACY(client_timeout),
949*663afb9bSAndroid Build Coastguard Worker RPC_LEGACY(test),
950*663afb9bSAndroid Build Coastguard Worker
951*663afb9bSAndroid Build Coastguard Worker END_OF_TESTCASES,
952*663afb9bSAndroid Build Coastguard Worker };
953