diff options
Diffstat (limited to 'test/test_util.c')
-rw-r--r-- | test/test_util.c | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/test/test_util.c b/test/test_util.c new file mode 100644 index 0000000..9496195 --- /dev/null +++ b/test/test_util.c @@ -0,0 +1,214 @@ +/* Copyright 2002-2007 Justin Erenkrantz and Greg Stein + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "apr.h" +#include "apr_pools.h" +#include <stdlib.h> + +#include "serf.h" + +#include "test_serf.h" +#include "server/test_server.h" + + +/*****************************************************************************/ +/* Server setup function(s) + */ + +#define SERV_URL "http://localhost:" SERV_PORT_STR + +static apr_status_t default_server_address(apr_sockaddr_t **address, + apr_pool_t *pool) +{ + return apr_sockaddr_info_get(address, + "localhost", APR_UNSPEC, SERV_PORT, 0, + pool); +} + +static apr_status_t default_proxy_address(apr_sockaddr_t **address, + apr_pool_t *pool) +{ + return apr_sockaddr_info_get(address, + "localhost", APR_UNSPEC, PROXY_PORT, 0, + pool); +} + +/* Default implementation of a serf_connection_closed_t callback. */ +static void default_closed_connection(serf_connection_t *conn, + void *closed_baton, + apr_status_t why, + apr_pool_t *pool) +{ + if (why) { + abort(); + } +} + +/* Default implementation of a serf_connection_setup_t callback. */ +static apr_status_t default_conn_setup(apr_socket_t *skt, + serf_bucket_t **input_bkt, + serf_bucket_t **output_bkt, + void *setup_baton, + apr_pool_t *pool) +{ + test_baton_t *ctx = setup_baton; + + *input_bkt = serf_bucket_socket_create(skt, ctx->bkt_alloc); + return APR_SUCCESS; +} + + +static apr_status_t setup(test_baton_t **tb_p, + serf_connection_setup_t conn_setup, + int use_proxy, + apr_pool_t *pool) +{ + apr_status_t status; + test_baton_t *tb; + apr_uri_t url; + + tb = apr_pcalloc(pool, sizeof(*tb)); + *tb_p = tb; + + tb->pool = pool; + tb->context = serf_context_create(pool); + tb->bkt_alloc = serf_bucket_allocator_create(pool, NULL, NULL); + + status = default_server_address(&tb->serv_addr, pool); + if (status != APR_SUCCESS) + return status; + + if (use_proxy) { + status = default_proxy_address(&tb->proxy_addr, pool); + if (status != APR_SUCCESS) + return status; + + /* Configure serf to use the proxy server */ + serf_config_proxy(tb->context, tb->proxy_addr); + } + + status = apr_uri_parse(pool, SERV_URL, &url); + if (status != APR_SUCCESS) + return status; + + status = serf_connection_create2(&tb->connection, tb->context, + url, + conn_setup ? conn_setup : + default_conn_setup, + tb, + default_closed_connection, + tb, + pool); + + return status; +} + + + +apr_status_t test_server_setup(test_baton_t **tb_p, + test_server_message_t *message_list, + apr_size_t message_count, + test_server_action_t *action_list, + apr_size_t action_count, + apr_int32_t options, + serf_connection_setup_t conn_setup, + apr_pool_t *pool) +{ + apr_status_t status; + test_baton_t *tb; + + status = setup(tb_p, + conn_setup, + FALSE, + pool); + if (status != APR_SUCCESS) + return status; + + tb = *tb_p; + + /* Prepare a server. */ + status = test_start_server(&tb->serv_ctx, tb->serv_addr, + message_list, message_count, + action_list, action_count, options, pool); + + return status; +} + +apr_status_t +test_server_proxy_setup(test_baton_t **tb_p, + test_server_message_t *serv_message_list, + apr_size_t serv_message_count, + test_server_action_t *serv_action_list, + apr_size_t serv_action_count, + test_server_message_t *proxy_message_list, + apr_size_t proxy_message_count, + test_server_action_t *proxy_action_list, + apr_size_t proxy_action_count, + apr_int32_t options, + serf_connection_setup_t conn_setup, + apr_pool_t *pool) +{ + apr_status_t status; + test_baton_t *tb; + + status = setup(tb_p, + conn_setup, + TRUE, + pool); + if (status != APR_SUCCESS) + return status; + + tb = *tb_p; + + /* Prepare the server. */ + status = test_start_server(&tb->serv_ctx, tb->serv_addr, + serv_message_list, serv_message_count, + serv_action_list, serv_action_count, + options, pool); + if (status != APR_SUCCESS) + return status; + + /* Prepare the proxy. */ + status = test_start_server(&tb->proxy_ctx, tb->proxy_addr, + proxy_message_list, proxy_message_count, + proxy_action_list, proxy_action_count, + options, pool); + + return status; +} + +apr_status_t test_server_teardown(test_baton_t *tb, apr_pool_t *pool) +{ + serf_connection_close(tb->connection); + + if (tb->serv_ctx) + test_server_destroy(tb->serv_ctx, pool); + if (tb->proxy_ctx) + test_server_destroy(tb->proxy_ctx, pool); + + return APR_SUCCESS; +} + +apr_pool_t *test_setup(void) +{ + apr_pool_t *test_pool; + apr_pool_create(&test_pool, NULL); + return test_pool; +} + +void test_teardown(apr_pool_t *test_pool) +{ + apr_pool_destroy(test_pool); +} |