Skip to content

Commit dd9edf4

Browse files
committed
Add a simple test to verify error propagation through the callbacks.
Only for context and outgoing connection/requests for now, no incoming or SSL stuff. * serf_private.h (serf__global_error_callback): Declare the default global error callback. * src/error_callbacks.c (serf__global_error_callback): Renamed from default_global_error_callback and made public instead of static. All references updated. * test/test_internal.c (struct error_callback_baton, error_cb_request_setup, error_cb_error_callback): New; private helpers. (test_global_error_callback): New test case. (test_internal): Register test_global_error_callback. git-svn-id: https://svn.apache.org/repos/asf/serf/trunk@1931277 13f79535-47bb-0310-9956-ffa450edef68
1 parent ea59abe commit dd9edf4

File tree

3 files changed

+95
-6
lines changed

3 files changed

+95
-6
lines changed

serf_private.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,13 @@ typedef int serf__bool_t; /* Not _Bool */
122122

123123
/*** Error callback invocation ***/
124124

125+
/* This is the default global error callback, used only in
126+
error_callbacks.c and test_internal.c. */
127+
apr_status_t serf__global_error_callback(void *baton,
128+
unsigned source,
129+
apr_status_t status,
130+
const char *message);
131+
125132
/* NOTE: There is no serf__global_error() because the global handler
126133
should not be called directly but only as a fallback. */
127134

src/error_callbacks.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,17 @@
2323

2424
/* Global error processing. */
2525

26-
static apr_status_t
27-
default_global_error_callback(void *baton,
28-
unsigned source,
29-
apr_status_t status,
30-
const char *message)
26+
apr_status_t
27+
serf__global_error_callback(void *baton,
28+
unsigned source,
29+
apr_status_t status,
30+
const char *message)
3131
{
3232
return APR_SUCCESS;
3333
}
3434

3535
static void *global_error_callback_baton = NULL;
36-
static serf_error_cb_t global_error_callback = default_global_error_callback;
36+
static serf_error_cb_t global_error_callback = serf__global_error_callback;
3737

3838
void serf_global_error_callback_set(serf_error_cb_t callback, void *baton)
3939
{

test/test_internal.c

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -573,6 +573,87 @@ static void test_find_token(CuTest *tc)
573573
CuAssertPtrEquals(tc, NULL, serf__find_token("foo", 3, " qux bar"));
574574
}
575575

576+
/*
577+
* Error callbacks
578+
*/
579+
580+
struct error_callback_baton
581+
{
582+
apr_pool_t *pool;
583+
apr_array_header_t *list;
584+
};
585+
586+
static apr_status_t
587+
error_cb_request_setup(serf_request_t *request,
588+
void *setup_baton,
589+
serf_bucket_t **req_bkt,
590+
serf_response_acceptor_t *acceptor,
591+
void **acceptor_baton,
592+
serf_response_handler_t *handler,
593+
void **handler_baton,
594+
apr_pool_t *pool)
595+
{
596+
return APR_SUCCESS;
597+
}
598+
599+
static apr_status_t
600+
error_cb_error_callback(void *baton,
601+
unsigned source,
602+
apr_status_t status,
603+
const char *message)
604+
{
605+
const struct error_callback_baton *const ecb = baton;
606+
const char *const msg = apr_psprintf(
607+
ecb->pool, "<%d> %c%c%c%c%c %s", status,
608+
((source & SERF_ERROR_CB_SSL_CONTEXT) ? '*' : '-'),
609+
((source & SERF_ERROR_CB_GLOBAL) ? 'g' : '-'),
610+
((source & SERF_ERROR_CB_CONTEXT) ? 'c' : '-'),
611+
((source & SERF_ERROR_CB_OUTGOING) ? 'o'
612+
: ((source & SERF_ERROR_CB_INCOMING) ? 'i' : '-')),
613+
((source & SERF_ERROR_CB_REQUEST) ? 'q'
614+
: ((source & SERF_ERROR_CB_RESPONSE) ? 'p' : '-')),
615+
message);
616+
APR_ARRAY_PUSH(ecb->list, const char*) = msg;
617+
return APR_SUCCESS;
618+
}
619+
620+
static void test_global_error_callback(CuTest *tc)
621+
{
622+
test_baton_t *const tb = tc->testBaton;
623+
struct error_callback_baton ecb;
624+
serf_context_t *ctx;
625+
serf_connection_t *conn;
626+
serf_request_t *req;
627+
apr_uri_t url;
628+
629+
ecb.pool = tb->pool;
630+
ecb.list = apr_array_make(ecb.pool, 3, sizeof(const char*));
631+
serf_global_error_callback_set(error_cb_error_callback, &ecb);
632+
633+
/* Create a context and connection. */
634+
ctx = serf_context_create(ecb.pool);
635+
apr_uri_parse(tb->pool, "http://localhost:12345", &url);
636+
serf_connection_create2(&conn, ctx, url, conn_setup, NULL,
637+
conn_closed, NULL, tb->pool);
638+
req = serf_connection_request_create(conn, error_cb_request_setup, NULL);
639+
640+
serf__context_error(ctx, APR_SUCCESS, "context error");
641+
serf__connection_error(conn, SERF_ERROR_CLOSING, "connection error");
642+
serf__request_error(req, SERF_ERROR_REQUEST_LOST, "request error");
643+
644+
/* Reset the error callback before checking the test results. */
645+
serf_global_error_callback_set(serf__global_error_callback, NULL);
646+
647+
CuAssertPtrEquals(tc, ctx, conn->ctx);
648+
CuAssertIntEquals(tc, 3, ecb.list->nelts);
649+
CuAssertStrEquals(tc, "<0> --c-- context error",
650+
APR_ARRAY_IDX(ecb.list, 0, const char*));
651+
CuAssertStrEquals(tc, "<120101> ---o- connection error",
652+
APR_ARRAY_IDX(ecb.list, 1, const char*));
653+
CuAssertStrEquals(tc, "<120102> ---oq request error",
654+
APR_ARRAY_IDX(ecb.list, 2, const char*));
655+
}
656+
576657

577658
CuSuite *test_internal(void)
578659
{
@@ -594,6 +675,7 @@ CuSuite *test_internal(void)
594675
SUITE_ADD_TEST(suite, test_parse_single_token_parameters);
595676
SUITE_ADD_TEST(suite, test_parameter_case_folding);
596677
SUITE_ADD_TEST(suite, test_find_token);
678+
SUITE_ADD_TEST(suite, test_global_error_callback);
597679

598680
return suite;
599681
}

0 commit comments

Comments
 (0)