15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 2003-2006 Niels Provos <provos@citi.umich.edu> 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * All rights reserved. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * modification, are permitted provided that the following conditions 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * are met: 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * documentation and/or other materials provided with the distribution. 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3. The name of the author may not be used to endorse or promote products 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * derived from this software without specific prior written permission. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WIN32 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <winsock2.h> 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h> 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_CONFIG_H 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "config.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/types.h> 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/stat.h> 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_TIME_H 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/time.h> 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/queue.h> 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef WIN32 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/socket.h> 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <signal.h> 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <unistd.h> 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <netdb.h> 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <fcntl.h> 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h> 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h> 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <errno.h> 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <assert.h> 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "event.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "evhttp.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "log.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "evrpc.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "regress.gen.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void rpc_suite(void); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int test_ok; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static struct evhttp * 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)http_setup(short *pport) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct evhttp *myhttp; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) short port = -1; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Try a few different ports */ 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < 50; ++i) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) myhttp = evhttp_start("127.0.0.1", 8080 + i); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (myhttp != NULL) { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) port = 8080 + i; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (port == -1) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_errx(1, "Could not start web server"); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pport = port; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (myhttp); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EVRPC_HEADER(Message, msg, kill); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EVRPC_HEADER(NeverReply, msg, kill); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EVRPC_GENERATE(Message, msg, kill); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EVRPC_GENERATE(NeverReply, msg, kill); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int need_input_hook = 0; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int need_output_hook = 0; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MessageCb(EVRPC_STRUCT(Message)* rpc, void *arg) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct kill* kill_reply = rpc->reply; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (need_input_hook) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct evhttp_request* req = EVRPC_REQUEST_HTTP(rpc); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *header = evhttp_find_header( 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req->input_headers, "X-Hook"); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(strcmp(header, "input") == 0); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* we just want to fill in some non-sense */ 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVTAG_ASSIGN(kill_reply, weapon, "dagger"); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVTAG_ASSIGN(kill_reply, action, "wave around like an idiot"); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* no reply to the RPC */ 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVRPC_REQUEST_DONE(rpc); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static EVRPC_STRUCT(NeverReply) *saved_rpc; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NeverReplyCb(EVRPC_STRUCT(NeverReply)* rpc, void *arg) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_ok += 1; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) saved_rpc = rpc; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)rpc_setup(struct evhttp **phttp, short *pport, struct evrpc_base **pbase) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) short port; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct evhttp *http = NULL; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct evrpc_base *base = NULL; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http = http_setup(&port); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base = evrpc_init(http); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVRPC_REGISTER(base, Message, msg, kill, MessageCb, NULL); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVRPC_REGISTER(base, NeverReply, msg, kill, NeverReplyCb, NULL); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *phttp = http; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pport = port; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pbase = base; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) need_input_hook = 0; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) need_output_hook = 0; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)rpc_teardown(struct evrpc_base *base) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(EVRPC_UNREGISTER(base, Message) == 0); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(EVRPC_UNREGISTER(base, NeverReply) == 0); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evrpc_free(base); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)rpc_postrequest_failure(struct evhttp_request *req, void *arg) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (req->response_code != HTTP_SERVUNAVAIL) { 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stderr, "FAILED (response code)\n"); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit(1); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_ok = 1; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_loopexit(NULL); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Test a malformed payload submitted as an RPC 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)rpc_basic_test(void) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) short port; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct evhttp *http = NULL; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct evrpc_base *base = NULL; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct evhttp_connection *evcon = NULL; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct evhttp_request *req = NULL; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stdout, "Testing Basic RPC Support: "); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rpc_setup(&http, &port, &base); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evcon = evhttp_connection_new("127.0.0.1", port); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (evcon == NULL) { 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stdout, "FAILED\n"); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit(1); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * At this point, we want to schedule an HTTP POST request 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * server using our make request method. 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req = evhttp_request_new(rpc_postrequest_failure, NULL); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (req == NULL) { 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stdout, "FAILED\n"); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit(1); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Add the information that we care about */ 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evhttp_add_header(req->output_headers, "Host", "somehost"); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evbuffer_add_printf(req->output_buffer, "Some Nonsense"); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (evhttp_make_request(evcon, req, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVHTTP_REQ_POST, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/.rpc.Message") == -1) { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stdout, "FAILED\n"); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit(1); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_ok = 0; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_dispatch(); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evhttp_connection_free(evcon); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rpc_teardown(base); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (test_ok != 1) { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stdout, "FAILED\n"); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit(1); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stdout, "OK\n"); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evhttp_free(http); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)rpc_postrequest_done(struct evhttp_request *req, void *arg) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct kill* kill_reply = NULL; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (req->response_code != HTTP_OK) { 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stderr, "FAILED (response code)\n"); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit(1); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kill_reply = kill_new(); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((kill_unmarshal(kill_reply, req->input_buffer)) == -1) { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stderr, "FAILED (unmarshal)\n"); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit(1); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kill_free(kill_reply); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_ok = 1; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_loopexit(NULL); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)rpc_basic_message(void) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) short port; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct evhttp *http = NULL; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct evrpc_base *base = NULL; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct evhttp_connection *evcon = NULL; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct evhttp_request *req = NULL; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct msg *msg; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stdout, "Testing Good RPC Post: "); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rpc_setup(&http, &port, &base); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evcon = evhttp_connection_new("127.0.0.1", port); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (evcon == NULL) { 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stdout, "FAILED\n"); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit(1); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * At this point, we want to schedule an HTTP POST request 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * server using our make request method. 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req = evhttp_request_new(rpc_postrequest_done, NULL); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (req == NULL) { 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stdout, "FAILED\n"); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit(1); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Add the information that we care about */ 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evhttp_add_header(req->output_headers, "Host", "somehost"); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* set up the basic message */ 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg = msg_new(); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVTAG_ASSIGN(msg, from_name, "niels"); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVTAG_ASSIGN(msg, to_name, "tester"); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_marshal(req->output_buffer, msg); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_free(msg); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (evhttp_make_request(evcon, req, 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVHTTP_REQ_POST, 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/.rpc.Message") == -1) { 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stdout, "FAILED\n"); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit(1); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_ok = 0; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_dispatch(); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evhttp_connection_free(evcon); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rpc_teardown(base); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (test_ok != 1) { 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stdout, "FAILED\n"); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit(1); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stdout, "OK\n"); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evhttp_free(http); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static struct evrpc_pool * 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)rpc_pool_with_connection(short port) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct evhttp_connection *evcon; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct evrpc_pool *pool; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pool = evrpc_pool_new(NULL); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(pool != NULL); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evcon = evhttp_connection_new("127.0.0.1", port); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(evcon != NULL); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evrpc_pool_add_connection(pool, evcon); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (pool); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GotKillCb(struct evrpc_status *status, 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct msg *msg, struct kill *kill, void *arg) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *weapon; 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *action; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (need_output_hook) { 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct evhttp_request *req = status->http_req; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *header = evhttp_find_header( 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req->input_headers, "X-Pool-Hook"); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(strcmp(header, "ran") == 0); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (status->error != EVRPC_STATUS_ERR_NONE) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto done; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (EVTAG_GET(kill, weapon, &weapon) == -1) { 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stderr, "get weapon\n"); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto done; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (EVTAG_GET(kill, action, &action) == -1) { 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stderr, "get action\n"); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto done; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (strcmp(weapon, "dagger")) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto done; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (strcmp(action, "wave around like an idiot")) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto done; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_ok += 1; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)done: 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_loopexit(NULL); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GotKillCbTwo(struct evrpc_status *status, 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct msg *msg, struct kill *kill, void *arg) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *weapon; 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *action; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (status->error != EVRPC_STATUS_ERR_NONE) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto done; 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (EVTAG_GET(kill, weapon, &weapon) == -1) { 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stderr, "get weapon\n"); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto done; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (EVTAG_GET(kill, action, &action) == -1) { 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stderr, "get action\n"); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto done; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (strcmp(weapon, "dagger")) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto done; 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (strcmp(action, "wave around like an idiot")) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto done; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_ok += 1; 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)done: 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (test_ok == 2) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_loopexit(NULL); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)rpc_hook_add_header(struct evhttp_request *req, 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct evbuffer *evbuf, void *arg) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *hook_type = arg; 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (strcmp("input", hook_type) == 0) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evhttp_add_header(req->input_headers, "X-Hook", hook_type); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evhttp_add_header(req->output_headers, "X-Hook", hook_type); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)rpc_hook_remove_header(struct evhttp_request *req, 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct evbuffer *evbuf, void *arg) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *header = evhttp_find_header(req->input_headers, "X-Hook"); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(header != NULL); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(strcmp(header, arg) == 0); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evhttp_remove_header(req->input_headers, "X-Hook"); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evhttp_add_header(req->input_headers, "X-Pool-Hook", "ran"); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)rpc_basic_client(void) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) short port; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct evhttp *http = NULL; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct evrpc_base *base = NULL; 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct evrpc_pool *pool = NULL; 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct msg *msg; 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct kill *kill; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stdout, "Testing RPC Client: "); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rpc_setup(&http, &port, &base); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) need_input_hook = 1; 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) need_output_hook = 1; 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(evrpc_add_hook(base, EVRPC_INPUT, rpc_hook_add_header, (void*)"input") 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) != NULL); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(evrpc_add_hook(base, EVRPC_OUTPUT, rpc_hook_add_header, (void*)"output") 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) != NULL); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pool = rpc_pool_with_connection(port); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(evrpc_add_hook(pool, EVRPC_INPUT, rpc_hook_remove_header, (void*)"output")); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* set up the basic message */ 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg = msg_new(); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVTAG_ASSIGN(msg, from_name, "niels"); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVTAG_ASSIGN(msg, to_name, "tester"); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kill = kill_new(); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVRPC_MAKE_REQUEST(Message, pool, msg, kill, GotKillCb, NULL); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_ok = 0; 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_dispatch(); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (test_ok != 1) { 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stdout, "FAILED (1)\n"); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit(1); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* we do it twice to make sure that reuse works correctly */ 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kill_clear(kill); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVRPC_MAKE_REQUEST(Message, pool, msg, kill, GotKillCb, NULL); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_dispatch(); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rpc_teardown(base); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (test_ok != 2) { 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stdout, "FAILED (2)\n"); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit(1); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stdout, "OK\n"); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_free(msg); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kill_free(kill); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evrpc_pool_free(pool); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evhttp_free(http); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * We are testing that the second requests gets send over the same 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * connection after the first RPCs completes. 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)rpc_basic_queued_client(void) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) short port; 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct evhttp *http = NULL; 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct evrpc_base *base = NULL; 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct evrpc_pool *pool = NULL; 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct msg *msg; 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct kill *kill_one, *kill_two; 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stdout, "Testing RPC (Queued) Client: "); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rpc_setup(&http, &port, &base); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pool = rpc_pool_with_connection(port); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* set up the basic message */ 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg = msg_new(); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVTAG_ASSIGN(msg, from_name, "niels"); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVTAG_ASSIGN(msg, to_name, "tester"); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kill_one = kill_new(); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kill_two = kill_new(); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVRPC_MAKE_REQUEST(Message, pool, msg, kill_one, GotKillCbTwo, NULL); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVRPC_MAKE_REQUEST(Message, pool, msg, kill_two, GotKillCb, NULL); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_ok = 0; 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_dispatch(); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rpc_teardown(base); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (test_ok != 2) { 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stdout, "FAILED (1)\n"); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit(1); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stdout, "OK\n"); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_free(msg); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kill_free(kill_one); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kill_free(kill_two); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evrpc_pool_free(pool); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evhttp_free(http); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GotErrorCb(struct evrpc_status *status, 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct msg *msg, struct kill *kill, void *arg) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (status->error != EVRPC_STATUS_ERR_TIMEOUT) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto done; 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* should never be complete but just to check */ 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (kill_complete(kill) == 0) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto done; 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_ok += 1; 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)done: 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_loopexit(NULL); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)rpc_client_timeout(void) 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) short port; 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct evhttp *http = NULL; 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct evrpc_base *base = NULL; 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct evrpc_pool *pool = NULL; 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct msg *msg; 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct kill *kill; 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stdout, "Testing RPC Client Timeout: "); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rpc_setup(&http, &port, &base); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pool = rpc_pool_with_connection(port); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* set the timeout to 5 seconds */ 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evrpc_pool_set_timeout(pool, 5); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* set up the basic message */ 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg = msg_new(); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVTAG_ASSIGN(msg, from_name, "niels"); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVTAG_ASSIGN(msg, to_name, "tester"); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kill = kill_new(); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVRPC_MAKE_REQUEST(NeverReply, pool, msg, kill, GotErrorCb, NULL); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_ok = 0; 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_dispatch(); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* free the saved RPC structure up */ 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVRPC_REQUEST_DONE(saved_rpc); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rpc_teardown(base); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (test_ok != 2) { 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stdout, "FAILED (1)\n"); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit(1); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stdout, "OK\n"); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_free(msg); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kill_free(kill); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evrpc_pool_free(pool); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evhttp_free(http); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)rpc_suite(void) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rpc_basic_test(); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rpc_basic_message(); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rpc_basic_client(); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rpc_basic_queued_client(); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rpc_client_timeout(); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 632