|
Packit |
3adb1e |
/* ====================================================================
|
|
Packit |
3adb1e |
* Licensed to the Apache Software Foundation (ASF) under one
|
|
Packit |
3adb1e |
* or more contributor license agreements. See the NOTICE file
|
|
Packit |
3adb1e |
* distributed with this work for additional information
|
|
Packit |
3adb1e |
* regarding copyright ownership. The ASF licenses this file
|
|
Packit |
3adb1e |
* to you under the Apache License, Version 2.0 (the
|
|
Packit |
3adb1e |
* "License"); you may not use this file except in compliance
|
|
Packit |
3adb1e |
* with the License. You may obtain a copy of the License at
|
|
Packit |
3adb1e |
*
|
|
Packit |
3adb1e |
* http://www.apache.org/licenses/LICENSE-2.0
|
|
Packit |
3adb1e |
*
|
|
Packit |
3adb1e |
* Unless required by applicable law or agreed to in writing,
|
|
Packit |
3adb1e |
* software distributed under the License is distributed on an
|
|
Packit |
3adb1e |
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
Packit |
3adb1e |
* KIND, either express or implied. See the License for the
|
|
Packit |
3adb1e |
* specific language governing permissions and limitations
|
|
Packit |
3adb1e |
* under the License.
|
|
Packit |
3adb1e |
* ====================================================================
|
|
Packit |
3adb1e |
*/
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
#ifndef TEST_SERF_H
|
|
Packit |
3adb1e |
#define TEST_SERF_H
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
#include "CuTest.h"
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
#include <apr.h>
|
|
Packit |
3adb1e |
#include <apr_pools.h>
|
|
Packit |
3adb1e |
#include <apr_uri.h>
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
#include "serf.h"
|
|
Packit |
3adb1e |
#include "server/test_server.h"
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
/** These macros are provided by APR itself from version 1.3.
|
|
Packit |
3adb1e |
* Definitions are provided here for when using older versions of APR.
|
|
Packit |
3adb1e |
*/
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
/** index into an apr_array_header_t */
|
|
Packit |
3adb1e |
#ifndef APR_ARRAY_IDX
|
|
Packit |
3adb1e |
#define APR_ARRAY_IDX(ary,i,type) (((type *)(ary)->elts)[i])
|
|
Packit |
3adb1e |
#endif
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
/** easier array-pushing syntax */
|
|
Packit |
3adb1e |
#ifndef APR_ARRAY_PUSH
|
|
Packit |
3adb1e |
#define APR_ARRAY_PUSH(ary,type) (*((type *)apr_array_push(ary)))
|
|
Packit |
3adb1e |
#endif
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
/* CuTest declarations */
|
|
Packit |
3adb1e |
CuSuite *getsuite(void);
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
CuSuite *test_context(void);
|
|
Packit |
3adb1e |
CuSuite *test_buckets(void);
|
|
Packit |
3adb1e |
CuSuite *test_ssl(void);
|
|
Packit |
3adb1e |
CuSuite *test_auth(void);
|
|
Packit |
3adb1e |
CuSuite *test_mock_bucket(void);
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
/* Test setup declarations */
|
|
Packit |
3adb1e |
#define CRLF "\r\n"
|
|
Packit |
3adb1e |
#define CR "\r"
|
|
Packit |
3adb1e |
#define LF "\n"
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
#define CHUNKED_REQUEST(len, body)\
|
|
Packit |
3adb1e |
"GET / HTTP/1.1" CRLF\
|
|
Packit |
3adb1e |
"Host: localhost:12345" CRLF\
|
|
Packit |
3adb1e |
"Transfer-Encoding: chunked" CRLF\
|
|
Packit |
3adb1e |
CRLF\
|
|
Packit |
3adb1e |
#len CRLF\
|
|
Packit |
3adb1e |
body CRLF\
|
|
Packit |
3adb1e |
"0" CRLF\
|
|
Packit |
3adb1e |
CRLF
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
#define CHUNKED_REQUEST_URI(uri, len, body)\
|
|
Packit |
3adb1e |
"GET " uri " HTTP/1.1" CRLF\
|
|
Packit |
3adb1e |
"Host: localhost:12345" CRLF\
|
|
Packit |
3adb1e |
"Transfer-Encoding: chunked" CRLF\
|
|
Packit |
3adb1e |
CRLF\
|
|
Packit |
3adb1e |
#len CRLF\
|
|
Packit |
3adb1e |
body CRLF\
|
|
Packit |
3adb1e |
"0" CRLF\
|
|
Packit |
3adb1e |
CRLF
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
#define CHUNKED_RESPONSE(len, body)\
|
|
Packit |
3adb1e |
"HTTP/1.1 200 OK" CRLF\
|
|
Packit |
3adb1e |
"Transfer-Encoding: chunked" CRLF\
|
|
Packit |
3adb1e |
CRLF\
|
|
Packit |
3adb1e |
#len CRLF\
|
|
Packit |
3adb1e |
body CRLF\
|
|
Packit |
3adb1e |
"0" CRLF\
|
|
Packit |
3adb1e |
CRLF
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
#define CHUNKED_EMPTY_RESPONSE\
|
|
Packit |
3adb1e |
"HTTP/1.1 200 OK" CRLF\
|
|
Packit |
3adb1e |
"Transfer-Encoding: chunked" CRLF\
|
|
Packit |
3adb1e |
CRLF\
|
|
Packit |
3adb1e |
"0" CRLF\
|
|
Packit |
3adb1e |
CRLF
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
typedef struct {
|
|
Packit |
3adb1e |
/* Pool for resource allocation. */
|
|
Packit |
3adb1e |
apr_pool_t *pool;
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
serf_context_t *context;
|
|
Packit |
3adb1e |
serf_connection_t *connection;
|
|
Packit |
3adb1e |
serf_bucket_alloc_t *bkt_alloc;
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
serv_ctx_t *serv_ctx;
|
|
Packit |
3adb1e |
apr_sockaddr_t *serv_addr;
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
serv_ctx_t *proxy_ctx;
|
|
Packit |
3adb1e |
apr_sockaddr_t *proxy_addr;
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
/* Cache connection params here so it gets user for a test to switch to a
|
|
Packit |
3adb1e |
new connection. */
|
|
Packit |
3adb1e |
const char *serv_url;
|
|
Packit |
3adb1e |
serf_connection_setup_t conn_setup;
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
/* Extra batons which can be freely used by tests. */
|
|
Packit |
3adb1e |
void *user_baton;
|
|
Packit |
3adb1e |
long user_baton_l;
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
/* Flags that can be used to report situations, e.g. that a callback was
|
|
Packit |
3adb1e |
called. */
|
|
Packit |
3adb1e |
int result_flags;
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
apr_array_header_t *accepted_requests, *handled_requests, *sent_requests;
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
serf_ssl_context_t *ssl_context;
|
|
Packit |
3adb1e |
serf_ssl_need_server_cert_t server_cert_cb;
|
|
Packit |
3adb1e |
} test_baton_t;
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
apr_status_t default_https_conn_setup(apr_socket_t *skt,
|
|
Packit |
3adb1e |
serf_bucket_t **input_bkt,
|
|
Packit |
3adb1e |
serf_bucket_t **output_bkt,
|
|
Packit |
3adb1e |
void *setup_baton,
|
|
Packit |
3adb1e |
apr_pool_t *pool);
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
apr_status_t use_new_connection(test_baton_t *tb,
|
|
Packit |
3adb1e |
apr_pool_t *pool);
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
apr_status_t test_https_server_setup(test_baton_t **tb_p,
|
|
Packit |
3adb1e |
test_server_message_t *message_list,
|
|
Packit |
3adb1e |
apr_size_t message_count,
|
|
Packit |
3adb1e |
test_server_action_t *action_list,
|
|
Packit |
3adb1e |
apr_size_t action_count,
|
|
Packit |
3adb1e |
apr_int32_t options,
|
|
Packit |
3adb1e |
serf_connection_setup_t conn_setup,
|
|
Packit |
3adb1e |
const char *keyfile,
|
|
Packit |
3adb1e |
const char **certfile,
|
|
Packit |
3adb1e |
const char *client_cn,
|
|
Packit |
3adb1e |
serf_ssl_need_server_cert_t server_cert_cb,
|
|
Packit |
3adb1e |
apr_pool_t *pool);
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
apr_status_t test_http_server_setup(test_baton_t **tb_p,
|
|
Packit |
3adb1e |
test_server_message_t *message_list,
|
|
Packit |
3adb1e |
apr_size_t message_count,
|
|
Packit |
3adb1e |
test_server_action_t *action_list,
|
|
Packit |
3adb1e |
apr_size_t action_count,
|
|
Packit |
3adb1e |
apr_int32_t options,
|
|
Packit |
3adb1e |
serf_connection_setup_t conn_setup,
|
|
Packit |
3adb1e |
apr_pool_t *pool);
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
apr_status_t test_server_proxy_setup(
|
|
Packit |
3adb1e |
test_baton_t **tb_p,
|
|
Packit |
3adb1e |
test_server_message_t *serv_message_list,
|
|
Packit |
3adb1e |
apr_size_t serv_message_count,
|
|
Packit |
3adb1e |
test_server_action_t *serv_action_list,
|
|
Packit |
3adb1e |
apr_size_t serv_action_count,
|
|
Packit |
3adb1e |
test_server_message_t *proxy_message_list,
|
|
Packit |
3adb1e |
apr_size_t proxy_message_count,
|
|
Packit |
3adb1e |
test_server_action_t *proxy_action_list,
|
|
Packit |
3adb1e |
apr_size_t proxy_action_count,
|
|
Packit |
3adb1e |
apr_int32_t options,
|
|
Packit |
3adb1e |
serf_connection_setup_t conn_setup,
|
|
Packit |
3adb1e |
apr_pool_t *pool);
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
apr_status_t test_https_server_proxy_setup(
|
|
Packit |
3adb1e |
test_baton_t **tb_p,
|
|
Packit |
3adb1e |
test_server_message_t *serv_message_list,
|
|
Packit |
3adb1e |
apr_size_t serv_message_count,
|
|
Packit |
3adb1e |
test_server_action_t *serv_action_list,
|
|
Packit |
3adb1e |
apr_size_t serv_action_count,
|
|
Packit |
3adb1e |
test_server_message_t *proxy_message_list,
|
|
Packit |
3adb1e |
apr_size_t proxy_message_count,
|
|
Packit |
3adb1e |
test_server_action_t *proxy_action_list,
|
|
Packit |
3adb1e |
apr_size_t proxy_action_count,
|
|
Packit |
3adb1e |
apr_int32_t options,
|
|
Packit |
3adb1e |
serf_connection_setup_t conn_setup,
|
|
Packit |
3adb1e |
const char *keyfile,
|
|
Packit |
3adb1e |
const char **certfiles,
|
|
Packit |
3adb1e |
const char *client_cn,
|
|
Packit |
3adb1e |
serf_ssl_need_server_cert_t server_cert_cb,
|
|
Packit |
3adb1e |
apr_pool_t *pool);
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
void *test_setup(void *baton);
|
|
Packit |
3adb1e |
void *test_teardown(void *baton);
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
typedef struct {
|
|
Packit |
3adb1e |
serf_response_acceptor_t acceptor;
|
|
Packit |
3adb1e |
void *acceptor_baton;
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
serf_response_handler_t handler;
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
apr_array_header_t *sent_requests;
|
|
Packit |
3adb1e |
apr_array_header_t *accepted_requests;
|
|
Packit |
3adb1e |
apr_array_header_t *handled_requests;
|
|
Packit |
3adb1e |
int req_id;
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
const char *method;
|
|
Packit |
3adb1e |
const char *path;
|
|
Packit |
3adb1e |
/* Use this for a raw request message */
|
|
Packit |
3adb1e |
const char *request;
|
|
Packit |
3adb1e |
int done;
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
test_baton_t *tb;
|
|
Packit |
3adb1e |
} handler_baton_t;
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
/* These defines are used with the test_baton_t result_flags variable. */
|
|
Packit |
3adb1e |
#define TEST_RESULT_SERVERCERTCB_CALLED 0x0001
|
|
Packit |
3adb1e |
#define TEST_RESULT_SERVERCERTCHAINCB_CALLED 0x0002
|
|
Packit |
3adb1e |
#define TEST_RESULT_CLIENT_CERTCB_CALLED 0x0004
|
|
Packit |
3adb1e |
#define TEST_RESULT_CLIENT_CERTPWCB_CALLED 0x0008
|
|
Packit |
3adb1e |
#define TEST_RESULT_AUTHNCB_CALLED 0x001A
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
apr_status_t
|
|
Packit |
3adb1e |
test_helper_run_requests_no_check(CuTest *tc, test_baton_t *tb,
|
|
Packit |
3adb1e |
int num_requests,
|
|
Packit |
3adb1e |
handler_baton_t handler_ctx[],
|
|
Packit |
3adb1e |
apr_pool_t *pool);
|
|
Packit |
3adb1e |
void
|
|
Packit |
3adb1e |
test_helper_run_requests_expect_ok(CuTest *tc, test_baton_t *tb,
|
|
Packit |
3adb1e |
int num_requests,
|
|
Packit |
3adb1e |
handler_baton_t handler_ctx[],
|
|
Packit |
3adb1e |
apr_pool_t *pool);
|
|
Packit |
3adb1e |
serf_bucket_t* accept_response(serf_request_t *request,
|
|
Packit |
3adb1e |
serf_bucket_t *stream,
|
|
Packit |
3adb1e |
void *acceptor_baton,
|
|
Packit |
3adb1e |
apr_pool_t *pool);
|
|
Packit |
3adb1e |
apr_status_t setup_request(serf_request_t *request,
|
|
Packit |
3adb1e |
void *setup_baton,
|
|
Packit |
3adb1e |
serf_bucket_t **req_bkt,
|
|
Packit |
3adb1e |
serf_response_acceptor_t *acceptor,
|
|
Packit |
3adb1e |
void **acceptor_baton,
|
|
Packit |
3adb1e |
serf_response_handler_t *handler,
|
|
Packit |
3adb1e |
void **handler_baton,
|
|
Packit |
3adb1e |
apr_pool_t *pool);
|
|
Packit |
3adb1e |
apr_status_t handle_response(serf_request_t *request,
|
|
Packit |
3adb1e |
serf_bucket_t *response,
|
|
Packit |
3adb1e |
void *handler_baton,
|
|
Packit |
3adb1e |
apr_pool_t *pool);
|
|
Packit |
3adb1e |
void setup_handler(test_baton_t *tb, handler_baton_t *handler_ctx,
|
|
Packit |
3adb1e |
const char *method, const char *path,
|
|
Packit |
3adb1e |
int req_id,
|
|
Packit |
3adb1e |
serf_response_handler_t handler);
|
|
Packit |
3adb1e |
void create_new_prio_request(test_baton_t *tb,
|
|
Packit |
3adb1e |
handler_baton_t *handler_ctx,
|
|
Packit |
3adb1e |
const char *method, const char *path,
|
|
Packit |
3adb1e |
int req_id);
|
|
Packit |
3adb1e |
void create_new_request(test_baton_t *tb,
|
|
Packit |
3adb1e |
handler_baton_t *handler_ctx,
|
|
Packit |
3adb1e |
const char *method, const char *path,
|
|
Packit |
3adb1e |
int req_id);
|
|
Packit |
3adb1e |
void
|
|
Packit |
3adb1e |
create_new_request_with_resp_hdlr(test_baton_t *tb,
|
|
Packit |
3adb1e |
handler_baton_t *handler_ctx,
|
|
Packit |
3adb1e |
const char *method, const char *path,
|
|
Packit |
3adb1e |
int req_id,
|
|
Packit |
3adb1e |
serf_response_handler_t handler);
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
/* Mock bucket type and constructor */
|
|
Packit |
3adb1e |
typedef struct {
|
|
Packit |
3adb1e |
int times;
|
|
Packit |
3adb1e |
const char *data;
|
|
Packit |
3adb1e |
apr_status_t status;
|
|
Packit |
3adb1e |
} mockbkt_action;
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
void read_and_check_bucket(CuTest *tc, serf_bucket_t *bkt,
|
|
Packit |
3adb1e |
const char *expected);
|
|
Packit |
3adb1e |
void readlines_and_check_bucket(CuTest *tc, serf_bucket_t *bkt,
|
|
Packit |
3adb1e |
int acceptable,
|
|
Packit |
3adb1e |
const char *expected,
|
|
Packit |
3adb1e |
int expected_nr_of_lines);
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
extern const serf_bucket_type_t serf_bucket_type_mock;
|
|
Packit |
3adb1e |
#define SERF_BUCKET_IS_MOCK(b) SERF_BUCKET_CHECK((b), mock)
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
serf_bucket_t *serf_bucket_mock_create(mockbkt_action *actions,
|
|
Packit |
3adb1e |
int len,
|
|
Packit |
3adb1e |
serf_bucket_alloc_t *allocator);
|
|
Packit |
3adb1e |
apr_status_t serf_bucket_mock_more_data_arrived(serf_bucket_t *bucket);
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
/* Helper to get a file relative to our source directory by looking at
|
|
Packit |
3adb1e |
* 'srcdir' env variable. */
|
|
Packit |
3adb1e |
const char * get_srcdir_file(apr_pool_t *pool, const char * file);
|
|
Packit |
3adb1e |
|
|
Packit |
3adb1e |
#endif /* TEST_SERF_H */
|