Mercurial > dovecot > core-2.2
changeset 21053:b0ef5af74fb5
lib-http: test-http-client-errors: Add test for server that returns error status early while client is still sending blocking payload.
author | Stephan Bosch <stephan.bosch@dovecot.fi> |
---|---|
date | Wed, 09 Nov 2016 00:48:32 +0100 |
parents | 504ad4604a37 |
children | 0cc16f2b23cf |
files | src/lib-http/test-http-client-errors.c |
diffstat | 1 files changed, 92 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-http/test-http-client-errors.c Wed Nov 09 00:46:32 2016 +0100 +++ b/src/lib-http/test-http-client-errors.c Wed Nov 09 00:48:32 2016 +0100 @@ -1483,6 +1483,97 @@ } /* + * Request failed blocking + */ + +/* server */ + +static void +test_request_failed_blocking_input(struct server_connection *conn) +{ + static const char *resp = + "HTTP/1.1 500 Internal Server Error\r\n" + "\r\n"; + + /* respond */ + o_stream_nsend_str(conn->conn.output, resp); + sleep(10); + server_connection_deinit(&conn); +} + +static void test_server_request_failed_blocking(unsigned int index) +{ + test_server_input = test_request_failed_blocking_input; + test_server_run(index); +} + +/* client */ + +struct _request_failed_blocking_ctx { + struct http_client_request *req; +}; + +static void +test_client_request_failed_blocking_response( + const struct http_response *resp, + struct _request_failed_blocking_ctx *ctx ATTR_UNUSED) +{ + if (debug) + i_debug("RESPONSE: %u %s", resp->status, resp->reason); + + i_assert(resp->status == 500); +} + +static bool +test_client_request_failed_blocking( + const struct http_client_settings *client_set) +{ + static const char *payload = "This a test payload!"; + struct http_client_request *hreq; + struct _request_failed_blocking_ctx *ctx; + unsigned int n; + string_t *data; + + data = str_new(default_pool, 1000000); + for (n = 0; n < 50000; n++) + str_append(data, payload); + + ctx = i_new(struct _request_failed_blocking_ctx, 1); + + http_client = http_client_init(client_set); + + hreq = ctx->req = http_client_request(http_client, + "GET", net_ip2addr(&bind_ip), "/request-failed-blocking.txt", + test_client_request_failed_blocking_response, ctx); + http_client_request_set_port(hreq, bind_ports[0]); + + test_assert(http_client_request_send_payload(&hreq, + str_data(data), str_len(data)) < 0); + i_assert(hreq == NULL); + + str_free(&data); + i_free(ctx); + return FALSE; +} + +/* test */ + +static void test_request_failed_blocking(void) +{ + struct http_client_settings http_client_set; + + test_client_defaults(&http_client_set); + http_client_set.socket_send_buffer_size = 4096; + + test_begin("request failed blocking"); + test_run_client_server(&http_client_set, + test_client_request_failed_blocking, + test_server_request_failed_blocking, 1, + NULL); + test_end(); +} + +/* * Client deinit early */ @@ -2120,6 +2211,7 @@ test_bad_response, test_request_timed_out, test_request_aborted_early, + test_request_failed_blocking, test_client_deinit_early, test_retry_with_delay, test_dns_service_failure,