Author: kotkov Date: Wed Aug 9 15:14:47 2017 New Revision: 1804541 URL: http://svn.apache.org/viewvc?rev=1804541&view=rev Log: On the '1.3.x-fix-outgoing-request-err' branch: Merge r1804534 from trunk.
This changeset adds a test for an error while reading the body for an outgoing request. While the test itself, unfortunately, is not enough to trigger the edge cases that I'm about to fix, it would be better to at least have the test that covers the related code. The test required a couple of adjustments to the functions like test_http_server_setup(), which are used in 1.3.x. * test/test_serf.h (test_request_setup_t): New typedef. (handler_baton_t): Add an optional test_request_setup_t. (create_new_request_with_resp_hdlr): Morph into ... (create_new_request_ex): ...this new function that allows setting up non-default request setup and response handlers. (setup_handler): Accept an optional test_request_setup_t. * test/test_util.c (create_new_request_with_resp_hdlr): Morph into ... (create_new_request_ex): ...this new function that allows setting up non-default request setup and response handlers. (setup_handler): Accept an optional test_request_setup_t. (create_new_prio_request, create_new_request): Update calls to setup_handler(). (setup_request): Use the custom test_request_setup_t if available. * test/test_context.c (test_keepalive_limit_one_by_one, test_keepalive_limit_one_by_one_and_burst): Adjust to cope with the rename of create_new_request_with_resp_hdlr(). (setup_request_err): New helper function, implements test_request_setup_t. (test_outgoing_request_err): New test. (test_context): Add new test. Modified: serf/branches/1.3.x-fix-outgoing-request-err/ (props changed) serf/branches/1.3.x-fix-outgoing-request-err/test/test_context.c serf/branches/1.3.x-fix-outgoing-request-err/test/test_serf.h serf/branches/1.3.x-fix-outgoing-request-err/test/test_util.c Propchange: serf/branches/1.3.x-fix-outgoing-request-err/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Wed Aug 9 15:14:47 2017 @@ -1,4 +1,4 @@ /serf/branches/1.3.x:1699925,1699931 /serf/branches/multiple_ssl_impls:1699382 /serf/branches/windows-sspi:1698866-1698877 -/serf/trunk:1699516-1699518,1699520-1699522,1699528,1699530-1699535,1699537,1699539-1699543,1699548-1699549,1699553,1699555-1699556,1699559-1699560,1699563-1699565,1699567-1699570,1699572-1699573,1699578-1699580,1699582-1699597,1699599-1699602,1699607,1699610,1699613,1699615-1699618,1699622-1699623,1699626-1699627,1699633,1699637,1699642,1699645,1699647,1699649-1699650,1699652,1699654-1699655,1699659-1699665,1699671,1699674,1699680-1699683,1699687-1699688,1699690,1699692-1699694,1699698-1699700,1699702,1699707-1699708,1699712-1699716,1699720,1699724,1699728,1699730,1699733,1699762,1699770,1699773,1699777,1699780-1699781,1699791,1699798,1699800-1699801,1699817,1699819,1699838,1699843,1699846,1699850,1699852,1699858-1699859,1699861,1699873,1699881,1699884,1699902-1699903,1699906,1699924,1699926-1699927,1699930,1699932,1699936-1699937,1699941,1699944,1699948-1699950,1699954,1699957,1699964,1699973,1699975,1699985-1699987,1699993-1699994,1700031,1700062,1700128,1700149,1700234,1700236,1 700246,1700270,1700650,1700830,1702096,1702221,1702264,1703624,1704725,1708849,1709155-1709156,1709296,1748673,1757829,1758190,1758193 +/serf/trunk:1699516-1699518,1699520-1699522,1699528,1699530-1699535,1699537,1699539-1699543,1699548-1699549,1699553,1699555-1699556,1699559-1699560,1699563-1699565,1699567-1699570,1699572-1699573,1699578-1699580,1699582-1699597,1699599-1699602,1699607,1699610,1699613,1699615-1699618,1699622-1699623,1699626-1699627,1699633,1699637,1699642,1699645,1699647,1699649-1699650,1699652,1699654-1699655,1699659-1699665,1699671,1699674,1699680-1699683,1699687-1699688,1699690,1699692-1699694,1699698-1699700,1699702,1699707-1699708,1699712-1699716,1699720,1699724,1699728,1699730,1699733,1699762,1699770,1699773,1699777,1699780-1699781,1699791,1699798,1699800-1699801,1699817,1699819,1699838,1699843,1699846,1699850,1699852,1699858-1699859,1699861,1699873,1699881,1699884,1699902-1699903,1699906,1699924,1699926-1699927,1699930,1699932,1699936-1699937,1699941,1699944,1699948-1699950,1699954,1699957,1699964,1699973,1699975,1699985-1699987,1699993-1699994,1700031,1700062,1700128,1700149,1700234,1700236,1 700246,1700270,1700650,1700830,1702096,1702221,1702264,1703624,1704725,1708849,1709155-1709156,1709296,1748673,1757829,1758190,1758193,1804534 Modified: serf/branches/1.3.x-fix-outgoing-request-err/test/test_context.c URL: http://svn.apache.org/viewvc/serf/branches/1.3.x-fix-outgoing-request-err/test/test_context.c?rev=1804541&r1=1804540&r2=1804541&view=diff ============================================================================== --- serf/branches/1.3.x-fix-outgoing-request-err/test/test_context.c (original) +++ serf/branches/1.3.x-fix-outgoing-request-err/test/test_context.c Wed Aug 9 15:14:47 2017 @@ -397,8 +397,8 @@ static void test_keepalive_limit_one_by_ CuAssertIntEquals(tc, APR_SUCCESS, status); for (i = 0 ; i < SEND_REQUESTS ; i++) { - create_new_request_with_resp_hdlr(tb, &handler_ctx[i], "GET", "/", i+1, - handle_response_keepalive_limit); + create_new_request_ex(tb, &handler_ctx[i], "GET", "/", i+1, + NULL, handle_response_keepalive_limit); /* TODO: don't think this needs to be done in the loop. */ serf_connection_set_max_outstanding_requests(tb->connection, 1); } @@ -528,8 +528,8 @@ static void test_keepalive_limit_one_by_ CuAssertIntEquals(tc, APR_SUCCESS, status); for (i = 0 ; i < SEND_REQUESTS ; i++) { - create_new_request_with_resp_hdlr(tb, &handler_ctx[i], "GET", "/", i+1, - handle_response_keepalive_limit_burst); + create_new_request_ex(tb, &handler_ctx[i], "GET", "/", i+1, + NULL, handle_response_keepalive_limit_burst); serf_connection_set_max_outstanding_requests(tb->connection, 1); } @@ -2282,6 +2282,51 @@ static void test_ssltunnel_digest_auth(C CuAssertTrue(tc, tb->result_flags & TEST_RESULT_AUTHNCB_CALLED); } +/* Implements test_request_setup_t */ +apr_status_t setup_request_err(serf_request_t *request, + void *setup_baton, + serf_bucket_t **req_bkt, + apr_pool_t *pool) +{ + static mockbkt_action actions[] = { + { 1, "a", APR_SUCCESS }, + { 1, "", APR_EINVAL } + }; + handler_baton_t *ctx = setup_baton; + serf_bucket_alloc_t *alloc; + serf_bucket_t *mock_bkt; + + alloc = serf_request_get_alloc(request); + mock_bkt = serf_bucket_mock_create(actions, 2, alloc); + *req_bkt = serf_request_bucket_request_create(request, + ctx->method, ctx->path, + mock_bkt, alloc); + return APR_SUCCESS; +} + +static void test_outgoing_request_err(CuTest *tc) +{ + test_baton_t *tb; + handler_baton_t handler_ctx[1]; + apr_status_t status; + apr_pool_t *test_pool = tc->testBaton; + + status = test_http_server_setup(&tb, NULL, 0, + NULL, 0, 0, NULL, + test_pool); + CuAssertIntEquals(tc, APR_SUCCESS, status); + + create_new_request_ex(tb, &handler_ctx[0], "POST", "/", 1, + setup_request_err, NULL); + + status = test_helper_run_requests_no_check(tc, tb, 1, handler_ctx, + test_pool); + CuAssertIntEquals(tc, APR_EINVAL, status); + CuAssertIntEquals(tc, 1, tb->sent_requests->nelts); + CuAssertIntEquals(tc, 0, tb->accepted_requests->nelts); + CuAssertIntEquals(tc, 0, tb->handled_requests->nelts); +} + /*****************************************************************************/ CuSuite *test_context(void) { @@ -2319,6 +2364,7 @@ CuSuite *test_context(void) SUITE_ADD_TEST(suite, test_ssltunnel_basic_auth_proxy_has_keepalive_off); SUITE_ADD_TEST(suite, test_ssltunnel_basic_auth_proxy_close_conn_on_200resp); SUITE_ADD_TEST(suite, test_ssltunnel_digest_auth); + SUITE_ADD_TEST(suite, test_outgoing_request_err); return suite; } Modified: serf/branches/1.3.x-fix-outgoing-request-err/test/test_serf.h URL: http://svn.apache.org/viewvc/serf/branches/1.3.x-fix-outgoing-request-err/test/test_serf.h?rev=1804541&r1=1804540&r2=1804541&view=diff ============================================================================== --- serf/branches/1.3.x-fix-outgoing-request-err/test/test_serf.h (original) +++ serf/branches/1.3.x-fix-outgoing-request-err/test/test_serf.h Wed Aug 9 15:14:47 2017 @@ -193,6 +193,13 @@ apr_status_t test_https_server_proxy_set void *test_setup(void *baton); void *test_teardown(void *baton); +/* Simple variant of serf_request_setup_t for tests. */ +typedef apr_status_t (*test_request_setup_t)( + serf_request_t *request, + void *setup_baton, + serf_bucket_t **req_bkt, + apr_pool_t *pool); + typedef struct { serf_response_acceptor_t acceptor; void *acceptor_baton; @@ -208,6 +215,8 @@ typedef struct { const char *path; /* Use this for a raw request message */ const char *request; + /* Or this, if more control is needed. */ + test_request_setup_t request_setup; int done; test_baton_t *tb; @@ -249,6 +258,7 @@ apr_status_t handle_response(serf_reques void setup_handler(test_baton_t *tb, handler_baton_t *handler_ctx, const char *method, const char *path, int req_id, + test_request_setup_t req_setup, serf_response_handler_t handler); void create_new_prio_request(test_baton_t *tb, handler_baton_t *handler_ctx, @@ -259,11 +269,12 @@ void create_new_request(test_baton_t *tb const char *method, const char *path, int req_id); void -create_new_request_with_resp_hdlr(test_baton_t *tb, - handler_baton_t *handler_ctx, - const char *method, const char *path, - int req_id, - serf_response_handler_t handler); +create_new_request_ex(test_baton_t *tb, + handler_baton_t *handler_ctx, + const char *method, const char *path, + int req_id, + test_request_setup_t req_setup, + serf_response_handler_t handler); /* Mock bucket type and constructor */ typedef struct { Modified: serf/branches/1.3.x-fix-outgoing-request-err/test/test_util.c URL: http://svn.apache.org/viewvc/serf/branches/1.3.x-fix-outgoing-request-err/test/test_util.c?rev=1804541&r1=1804540&r2=1804541&view=diff ============================================================================== --- serf/branches/1.3.x-fix-outgoing-request-err/test/test_util.c (original) +++ serf/branches/1.3.x-fix-outgoing-request-err/test/test_util.c Wed Aug 9 15:14:47 2017 @@ -498,8 +498,13 @@ apr_status_t setup_request(serf_request_ { handler_baton_t *ctx = setup_baton; serf_bucket_t *body_bkt; + apr_status_t status = APR_SUCCESS; - if (ctx->request) + if (ctx->request_setup) + { + status = ctx->request_setup(request, setup_baton, req_bkt, pool); + } + else if (ctx->request) { /* Create a raw request bucket. */ *req_bkt = serf_bucket_simple_create(ctx->request, strlen(ctx->request), @@ -533,7 +538,7 @@ apr_status_t setup_request(serf_request_ *handler = ctx->handler; *handler_baton = ctx; - return APR_SUCCESS; + return status; } apr_status_t handle_response(serf_request_t *request, @@ -577,6 +582,7 @@ apr_status_t handle_response(serf_reques void setup_handler(test_baton_t *tb, handler_baton_t *handler_ctx, const char *method, const char *path, int req_id, + test_request_setup_t req_setup, serf_response_handler_t handler) { handler_ctx->method = method; @@ -592,6 +598,7 @@ void setup_handler(test_baton_t *tb, han handler_ctx->handled_requests = tb->handled_requests; handler_ctx->tb = tb; handler_ctx->request = NULL; + handler_ctx->request_setup = req_setup; } void create_new_prio_request(test_baton_t *tb, @@ -599,7 +606,7 @@ void create_new_prio_request(test_baton_ const char *method, const char *path, int req_id) { - setup_handler(tb, handler_ctx, method, path, req_id, NULL); + setup_handler(tb, handler_ctx, method, path, req_id, NULL, NULL); serf_connection_priority_request_create(tb->connection, setup_request, handler_ctx); @@ -610,20 +617,21 @@ void create_new_request(test_baton_t *tb const char *method, const char *path, int req_id) { - setup_handler(tb, handler_ctx, method, path, req_id, NULL); + setup_handler(tb, handler_ctx, method, path, req_id, NULL, NULL); serf_connection_request_create(tb->connection, setup_request, handler_ctx); } void -create_new_request_with_resp_hdlr(test_baton_t *tb, - handler_baton_t *handler_ctx, - const char *method, const char *path, - int req_id, - serf_response_handler_t handler) +create_new_request_ex(test_baton_t *tb, + handler_baton_t *handler_ctx, + const char *method, const char *path, + int req_id, + test_request_setup_t req_setup, + serf_response_handler_t handler) { - setup_handler(tb, handler_ctx, method, path, req_id, handler); + setup_handler(tb, handler_ctx, method, path, req_id, req_setup, handler); serf_connection_request_create(tb->connection, setup_request, handler_ctx);