test/http: localize evhttp server structure

This commit is contained in:
Azat Khuzhin 2016-03-25 11:04:51 +03:00
parent 24b521499a
commit cbc3209d61

View File

@ -66,7 +66,6 @@
#include "regress.h"
#include "regress_testutils.h"
static struct evhttp *http;
/* set if a test needs to call loopexit on a base */
static struct event_base *exit_base;
@ -145,7 +144,7 @@ http_setup(ev_uint16_t *pport, struct event_base *base, int mask)
#endif
/* Register a callback for certain types of requests */
evhttp_set_cb(myhttp, "/test", http_basic_cb, base);
evhttp_set_cb(myhttp, "/test", http_basic_cb, myhttp);
evhttp_set_cb(myhttp, "/large", http_large_cb, base);
evhttp_set_cb(myhttp, "/chunked", http_chunked_cb, base);
evhttp_set_cb(myhttp, "/streamed", http_chunked_cb, base);
@ -310,7 +309,7 @@ http_basic_cb(struct evhttp_request *req, void *arg)
evbuffer_add_printf(evb, BASIC_REQUEST_BODY);
evcon = evhttp_request_get_connection(req);
tt_assert(evhttp_connection_get_server(evcon) == http);
tt_assert(evhttp_connection_get_server(evcon) == arg);
/* For multi-line headers test */
{
@ -454,11 +453,10 @@ http_basic_test_impl(void *arg, int ssl)
const char *http_request;
ev_uint16_t port = 0, port2 = 0;
int server_flags = ssl ? HTTP_BIND_SSL : 0;
struct evhttp *http = http_setup(&port, data->base, server_flags);
test_ok = 0;
http = http_setup(&port, data->base, server_flags);
/* bind to a second socket */
if (http_bind(http, &port2, server_flags) == -1) {
fprintf(stdout, "FAILED (bind)\n");
@ -637,12 +635,11 @@ http_bad_request_test(void *arg)
evutil_socket_t fd = -1;
const char *http_request;
ev_uint16_t port=0, port2=0;
struct evhttp *http = http_setup(&port, data->base, 0);
test_ok = 0;
exit_base = data->base;
http = http_setup(&port, data->base, 0);
/* bind to a second socket */
if (http_bind(http, &port2, 0) == -1)
TT_DIE(("Bind socket failed"));
@ -759,11 +756,9 @@ http_delete_test(void *arg)
evutil_socket_t fd = -1;
const char *http_request;
ev_uint16_t port = 0;
struct evhttp *http = http_setup(&port, data->base, 0);
test_ok = 0;
http = http_setup(&port, data->base, 0);
tt_assert(http);
fd = http_connect("127.0.0.1", port);
tt_int_op(fd, >=, 0);
@ -843,11 +838,10 @@ http_on_complete_test(void *arg)
evutil_socket_t fd = -1;
const char *http_request;
ev_uint16_t port = 0;
struct evhttp *http = http_setup(&port, data->base, 0);
test_ok = 0;
http = http_setup(&port, data->base, 0);
fd = http_connect("127.0.0.1", port);
tt_int_op(fd, >=, 0);
@ -904,12 +898,11 @@ http_allowed_methods_test(void *arg)
const char *http_request;
char *result1=NULL, *result2=NULL, *result3=NULL;
ev_uint16_t port = 0;
struct evhttp *http = http_setup(&port, data->base, 0);
exit_base = data->base;
test_ok = 0;
http = http_setup(&port, data->base, 0);
fd1 = http_connect("127.0.0.1", port);
tt_int_op(fd1, >=, 0);
@ -1012,10 +1005,9 @@ http_connection_test_(struct basic_test_data *data, int persistent,
ev_uint16_t port = 0;
struct evhttp_connection *evcon = NULL;
struct evhttp_request *req = NULL;
struct evhttp *http = http_setup(&port, data->base, ipv6);
test_ok = 0;
http = http_setup(&port, data->base, ipv6);
if (!http && ipv6) {
tt_skip();
}
@ -1120,6 +1112,7 @@ http_connection_async_test(void *arg)
struct evdns_base *dns_base = NULL;
ev_uint16_t portnum = 0;
char address[64];
struct evhttp *http = http_setup(&port, data->base, 0);
exit_base = data->base;
tt_assert(regress_dnsserver(data->base, &portnum, search_table));
@ -1134,8 +1127,6 @@ http_connection_async_test(void *arg)
test_ok = 0;
http = http_setup(&port, data->base, 0);
evcon = evhttp_connection_base_new(data->base, dns_base, "127.0.0.1", port);
tt_assert(evcon);
@ -1212,9 +1203,9 @@ http_autofree_connection_test(void *arg)
ev_uint16_t port = 0;
struct evhttp_connection *evcon = NULL;
struct evhttp_request *req[2] = { NULL };
struct evhttp *http = http_setup(&port, data->base, 0);
test_ok = 0;
http = http_setup(&port, data->base, 0);
evcon = evhttp_connection_base_new(data->base, NULL, "127.0.0.1", port);
tt_assert(evcon);
@ -1397,6 +1388,8 @@ http_cancel_test(void *arg)
enum http_cancel_test_type type;
type = (enum http_cancel_test_type)data->setup_data;
struct evhttp *http = http_setup(&port, data->base, 0);
if (type & BY_HOST) {
const char *timeout = (type & NS_TIMEOUT) ? "6" : "3";
@ -1421,8 +1414,6 @@ http_cancel_test(void *arg)
test_ok = 0;
http = http_setup(&port, data->base, 0);
if (type & INACTIVE_SERVER) {
port = 0;
inactive_base = event_base_new();
@ -1593,16 +1584,15 @@ http_virtual_host_test(void *arg)
evutil_socket_t fd;
struct bufferevent *bev;
const char *http_request;
struct evhttp *http = http_setup(&port, data->base, 0);
exit_base = data->base;
http = http_setup(&port, data->base, 0);
/* virtual host */
second = evhttp_new(NULL);
evhttp_set_cb(second, "/funnybunny", http_basic_cb, NULL);
evhttp_set_cb(second, "/funnybunny", http_basic_cb, http);
third = evhttp_new(NULL);
evhttp_set_cb(third, "/blackcoffee", http_basic_cb, NULL);
evhttp_set_cb(third, "/blackcoffee", http_basic_cb, http);
if (evhttp_add_virtual_host(http, "foo.com", second) == -1) {
tt_abort_msg("Couldn't add vhost");
@ -1839,11 +1829,10 @@ http_dispatcher_test(void *arg)
ev_uint16_t port = 0;
struct evhttp_connection *evcon = NULL;
struct evhttp_request *req = NULL;
struct evhttp *http = http_setup(&port, data->base, 0);
test_ok = 0;
http = http_setup(&port, data->base, 0);
evcon = evhttp_connection_base_new(data->base, NULL, "127.0.0.1", port);
tt_assert(evcon);
@ -1889,11 +1878,10 @@ http_post_test(void *arg)
ev_uint16_t port = 0;
struct evhttp_connection *evcon = NULL;
struct evhttp_request *req = NULL;
struct evhttp *http = http_setup(&port, data->base, 0);
test_ok = 0;
http = http_setup(&port, data->base, 0);
evcon = evhttp_connection_base_new(data->base, NULL, "127.0.0.1", port);
tt_assert(evcon);
@ -2029,11 +2017,10 @@ http_put_test(void *arg)
ev_uint16_t port = 0;
struct evhttp_connection *evcon = NULL;
struct evhttp_request *req = NULL;
struct evhttp *http = http_setup(&port, data->base, 0);
test_ok = 0;
http = http_setup(&port, data->base, 0);
evcon = evhttp_connection_base_new(data->base, NULL, "127.0.0.1", port);
tt_assert(evcon);
@ -2155,11 +2142,10 @@ http_failure_test(void *arg)
evutil_socket_t fd = -1;
const char *http_request;
ev_uint16_t port = 0;
struct evhttp *http = http_setup(&port, data->base, 0);
test_ok = 0;
http = http_setup(&port, data->base, 0);
fd = http_connect("127.0.0.1", port);
tt_int_op(fd, >=, 0);
@ -2246,9 +2232,9 @@ http_close_detection_(struct basic_test_data *data, int with_delay)
struct evhttp_connection *evcon = NULL;
struct evhttp_request *req = NULL;
const struct timeval sec_tenth = { 0, 100000 };
struct evhttp *http = http_setup(&port, data->base, 0);
test_ok = 0;
http = http_setup(&port, data->base, 0);
/* .1 second timeout */
evhttp_set_timeout_tv(http, &sec_tenth);
@ -2922,6 +2908,7 @@ http_base_test(void *ptr)
evutil_socket_t fd;
const char *http_request;
ev_uint16_t port = 0;
struct evhttp *http;
test_ok = 0;
base = event_base_new();
@ -3008,12 +2995,11 @@ http_incomplete_test_(struct basic_test_data *data, int use_timeout, int ssl)
const char *http_request;
ev_uint16_t port = 0;
struct timeval tv_start, tv_end;
struct evhttp *http = http_setup(&port, data->base, ssl ? HTTP_BIND_SSL : 0);
exit_base = data->base;
test_ok = 0;
http = http_setup(&port, data->base, ssl ? HTTP_BIND_SSL : 0);
evhttp_set_timeout(http, 1);
fd = http_connect("127.0.0.1", port);
@ -3228,12 +3214,11 @@ http_chunk_out_test_impl(void *arg, int ssl)
struct evhttp_connection *evcon = NULL;
struct evhttp_request *req = NULL;
int i;
struct evhttp *http = http_setup(&port, data->base, ssl ? HTTP_BIND_SSL : 0);
exit_base = data->base;
test_ok = 0;
http = http_setup(&port, data->base, ssl ? HTTP_BIND_SSL : 0);
fd = http_connect("127.0.0.1", port);
/* Stupid thing to send a request */
@ -3305,12 +3290,11 @@ http_stream_out_test_impl(void *arg, int ssl)
struct evhttp_connection *evcon = NULL;
struct evhttp_request *req = NULL;
struct bufferevent *bev;
struct evhttp *http = http_setup(&port, data->base, ssl ? HTTP_BIND_SSL : 0);
test_ok = 0;
exit_base = data->base;
http = http_setup(&port, data->base, ssl ? HTTP_BIND_SSL : 0);
bev = create_bev(data->base, -1, ssl);
evcon = evhttp_connection_base_bufferevent_new(
data->base, NULL, bev, "127.0.0.1", port);
@ -3379,9 +3363,9 @@ http_stream_in_test_(struct basic_test_data *data, char const *url,
struct evbuffer *reply = evbuffer_new();
struct evhttp_request *req = NULL;
ev_uint16_t port = 0;
struct evhttp *http = http_setup(&port, data->base, 0);
exit_base = data->base;
http = http_setup(&port, data->base, 0);
evcon = evhttp_connection_base_new(data->base, NULL,"127.0.0.1", port);
tt_assert(evcon);
@ -3451,8 +3435,7 @@ http_stream_in_cancel_test(void *arg)
struct evhttp_connection *evcon;
struct evhttp_request *req = NULL;
ev_uint16_t port = 0;
http = http_setup(&port, data->base, 0);
struct evhttp *http = http_setup(&port, data->base, 0);
evcon = evhttp_connection_base_new(data->base, NULL, "127.0.0.1", port);
tt_assert(evcon);
@ -3504,14 +3487,13 @@ http_connection_fail_test_impl(void *arg, int ssl)
struct evhttp_connection *evcon = NULL;
struct evhttp_request *req = NULL;
struct bufferevent *bev;
struct evhttp *http = http_setup(&port, data->base, ssl ? HTTP_BIND_SSL : 0);
exit_base = data->base;
test_ok = 0;
/* auto detect a port */
http = http_setup(&port, data->base, ssl ? HTTP_BIND_SSL : 0);
evhttp_free(http);
http = NULL;
bev = create_bev(data->base, -1, ssl);
/* Pick an unroutable address. This administratively scoped multicast
@ -3562,13 +3544,14 @@ struct http_server
{
ev_uint16_t port;
int ssl;
struct evhttp *http;
};
static struct event_base *http_make_web_server_base=NULL;
static void
http_make_web_server(evutil_socket_t fd, short what, void *arg)
{
struct http_server *hs = (struct http_server *)arg;
http = http_setup(&hs->port, http_make_web_server_base, hs->ssl ? HTTP_BIND_SSL : 0);
hs->http = http_setup(&hs->port, http_make_web_server_base, hs->ssl ? HTTP_BIND_SSL : 0);
}
static void
@ -3579,12 +3562,11 @@ http_simple_test_impl(void *arg, int ssl, int dirty)
struct evhttp_request *req = NULL;
struct bufferevent *bev;
struct http_server hs = { .port = 0, .ssl = ssl, };
struct evhttp *http = http_setup(&hs.port, data->base, ssl ? HTTP_BIND_SSL : 0);
exit_base = data->base;
test_ok = 0;
http = http_setup(&hs.port, data->base, ssl ? HTTP_BIND_SSL : 0);
bev = create_bev(data->base, -1, ssl);
evcon = evhttp_connection_base_bufferevent_new(
data->base, NULL, bev, "127.0.0.1", hs.port);
@ -3619,14 +3601,13 @@ http_connection_retry_test_basic(void *arg, const char *addr, struct evdns_base
struct timeval tv, tv_start, tv_end;
struct bufferevent *bev;
struct http_server hs = { .port = 0, .ssl = ssl, };
struct evhttp *http = http_setup(&hs.port, data->base, ssl ? HTTP_BIND_SSL : 0);
exit_base = data->base;
test_ok = 0;
/* auto detect a port */
http = http_setup(&hs.port, data->base, ssl ? HTTP_BIND_SSL : 0);
evhttp_free(http);
http = NULL;
bev = create_bev(data->base, -1, ssl);
evcon = evhttp_connection_base_bufferevent_new(data->base, dns_base, bev, addr, hs.port);
@ -3738,7 +3719,7 @@ http_connection_retry_test_basic(void *arg, const char *addr, struct evdns_base
if (evcon)
evhttp_connection_free(evcon);
if (http)
evhttp_free(http);
evhttp_free(hs.http);
}
static void
@ -3794,11 +3775,11 @@ http_primitives(void *ptr)
http = evhttp_new(NULL);
tt_assert(http);
tt_int_op(evhttp_set_cb(http, "/test", http_basic_cb, NULL), ==, 0);
tt_int_op(evhttp_set_cb(http, "/test", http_basic_cb, NULL), ==, -1);
tt_int_op(evhttp_set_cb(http, "/test", http_basic_cb, http), ==, 0);
tt_int_op(evhttp_set_cb(http, "/test", http_basic_cb, http), ==, -1);
tt_int_op(evhttp_del_cb(http, "/test"), ==, 0);
tt_int_op(evhttp_del_cb(http, "/test"), ==, -1);
tt_int_op(evhttp_set_cb(http, "/test", http_basic_cb, NULL), ==, 0);
tt_int_op(evhttp_set_cb(http, "/test", http_basic_cb, http), ==, 0);
end:
if (escaped)
@ -3815,11 +3796,10 @@ http_multi_line_header_test(void *arg)
evutil_socket_t fd = -1;
const char *http_start_request;
ev_uint16_t port = 0;
struct evhttp *http = http_setup(&port, data->base, 0);
test_ok = 0;
http = http_setup(&port, data->base, 0);
tt_ptr_op(http, !=, NULL);
fd = http_connect("127.0.0.1", port);
@ -3880,11 +3860,10 @@ http_negative_content_length_test(void *arg)
ev_uint16_t port = 0;
struct evhttp_connection *evcon = NULL;
struct evhttp_request *req = NULL;
struct evhttp *http = http_setup(&port, data->base, 0);
test_ok = 0;
http = http_setup(&port, data->base, 0);
evcon = evhttp_connection_base_new(data->base, NULL, "127.0.0.1", port);
tt_assert(evcon);
@ -3951,6 +3930,7 @@ http_data_length_constraints_test_impl(void *arg, int read_on_write_error)
const size_t continue_size = 1<<20;
const size_t size = (1<<20) * 3;
void (*cb)(struct evhttp_request *, void *);
struct evhttp *http = http_setup(&port, data->base, 0);
test_ok = 0;
cb = http_failed_request_done;
@ -3959,8 +3939,6 @@ http_data_length_constraints_test_impl(void *arg, int read_on_write_error)
cb = http_data_length_constraints_test_done;
#endif
http = http_setup(&port, data->base, 0);
tt_assert(continue_size < size);
evcon = evhttp_connection_base_new(data->base, NULL, "127.0.0.1", port);
@ -4072,10 +4050,10 @@ http_lingering_close_test_impl(void *arg, int lingering)
char *long_str = NULL;
size_t size = (1<<20) * 3;
void (*cb)(struct evhttp_request *, void *);
struct evhttp *http = http_setup(&port, data->base, 0);
test_ok = 0;
http = http_setup(&port, data->base, 0);
if (lingering)
tt_assert(!evhttp_set_flags(http, EVHTTP_SERVER_LINGERING_CLOSE));
evhttp_set_max_body_size(http, size / 2);
@ -4225,10 +4203,10 @@ http_terminate_chunked_test_impl(void *arg, int oneshot)
ev_uint16_t port = 0;
evutil_socket_t fd = -1;
struct terminate_state terminate_state;
struct evhttp *http = http_setup(&port, data->base, 0);
test_ok = 0;
http = http_setup(&port, data->base, 0);
evhttp_del_cb(http, "/test");
tt_assert(evhttp_set_cb(http, "/test",
terminate_chunked_cb, &terminate_state) == 0);
@ -4347,12 +4325,11 @@ http_get_addr_test(void *arg)
ev_uint16_t port = 0;
struct evhttp_connection *evcon = NULL;
struct evhttp_request *req = NULL;
struct evhttp *http = http_setup(&port, data->base, 0);
test_ok = 0;
exit_base = data->base;
http = http_setup(&port, data->base, 0);
evcon = evhttp_connection_base_new(data->base, NULL, "127.0.0.1", port);
tt_assert(evcon);
evhttp_connection_set_closecb(evcon, http_request_get_addr_on_close, arg);
@ -4417,12 +4394,11 @@ http_write_during_read_test_impl(void *arg, int ssl)
struct timeval tv;
int fd;
const char *http_request;
struct evhttp *http = http_setup(&port, data->base, ssl ? HTTP_BIND_SSL : 0);
test_ok = 0;
exit_base = data->base;
http = http_setup(&port, data->base, ssl ? HTTP_BIND_SSL : 0);
fd = http_connect("127.0.0.1", port);
bev = create_bev(data->base, fd, 0);
bufferevent_setcb(bev, NULL, NULL, NULL, data->base);
@ -4455,11 +4431,11 @@ http_request_own_test(void *arg)
ev_uint16_t port = 0;
struct evhttp_connection *evcon = NULL;
struct evhttp_request *req = NULL;
struct evhttp *http = http_setup(&port, data->base, 0);
test_ok = 0;
exit_base = data->base;
http = http_setup(&port, data->base, 0);
evhttp_free(http);
evcon = evhttp_connection_base_new(data->base, NULL, "127.0.0.1", port);