Blame test/test_serf.h

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 */