changeset 19936:640849f3e2da

lib-http: server: Improved test-http-payload to test partial reading of request payload.
author Stephan Bosch <stephan@rename-it.nl>
date Thu, 03 Mar 2016 22:29:44 +0100
parents 64db1cafe6e9
children b032dac216fe
files src/lib-http/test-http-payload.c
diffstat 1 files changed, 92 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-http/test-http-payload.c	Thu Mar 03 22:28:47 2016 +0100
+++ b/src/lib-http/test-http-payload.c	Thu Mar 03 22:29:44 2016 +0100
@@ -24,9 +24,11 @@
 #include <unistd.h>
 #include <dirent.h>
 
+static bool debug = FALSE;
+
 static bool blocking = FALSE;
-static bool debug = FALSE;
 static bool request_100_continue = FALSE;
+static size_t read_partial = 1024;
 static unsigned int test_max_pending = 200;
 
 static struct ip_addr bind_ip;
@@ -342,6 +344,14 @@
 
 		payload_input =
 			http_server_request_get_payload_input(req, TRUE);
+
+		if (read_partial > 0) {
+			struct istream *partial =
+				i_stream_create_limit(payload_input, read_partial);
+			i_stream_unref(&payload_input);
+			payload_input = partial;
+		}
+
 		while ((ret=o_stream_send_istream
 			(payload_output, payload_input)) > 0);
 		if (ret < 0) {
@@ -381,6 +391,14 @@
 		creq->payload_output = payload_output;
 		creq->payload_input =
 			http_server_request_get_payload_input(req, FALSE);
+
+		if (read_partial > 0) {
+			struct istream *partial =
+				i_stream_create_limit(creq->payload_input, read_partial);
+			i_stream_unref(&creq->payload_input);
+			creq->payload_input = partial;
+		}
+
 		creq->io = io_add_istream(creq->payload_input,
 				 client_request_read_echo_more, creq);
 		client_request_read_echo_more(creq);
@@ -938,6 +956,13 @@
 			"failed to open %s", path);
 	}
 
+	if (read_partial > 0) {
+		struct istream *partial =
+			i_stream_create_limit(fstream, read_partial);
+		i_stream_unref(&fstream);
+		fstream = partial;
+	}
+
 	if (resp->payload == NULL) {
 		// FIXME: check file is empty
 		if (debug) {
@@ -978,8 +1003,13 @@
 
 	if (debug) {
 		i_debug("test client: echo: "
-			"received until [%u]",
-			client_files_first-1);
+			"received until [%u/%u]", client_files_first-1, count);
+	}
+
+	if (debug && client_files_first < count) {
+		const char *path = paths[client_files_first];
+		i_debug("test client: echo: "
+			"next blocking: %s", (path == NULL ? "none" : path));
 	}
 
 	if (client_files_first >= count) {
@@ -1128,6 +1158,8 @@
 	test_run_client_server
 		(&http_client_set, &http_server_set, client_init);
 	test_files_deinit();
+
+	test_out("sequential", TRUE);
 }
 
 static void test_run_pipeline(
@@ -1148,7 +1180,7 @@
 	memset(&http_client_set, 0, sizeof(http_client_set));
 	http_client_set.max_idle_time_msecs = 5*1000;
 	http_client_set.max_parallel_connections = 1;
-	http_client_set.max_pipelined_requests = 4;
+	http_client_set.max_pipelined_requests = 8;
 	http_client_set.max_redirects = 0;
 	http_client_set.max_attempts = 1;
 	http_client_set.debug = debug;
@@ -1157,6 +1189,8 @@
 	test_run_client_server
 		(&http_client_set, &http_server_set, client_init);
 	test_files_deinit();
+
+	test_out("pipeline", TRUE);
 }
 
 static void test_run_parallel(
@@ -1177,7 +1211,7 @@
 	memset(&http_client_set, 0, sizeof(http_client_set));
 	http_client_set.max_idle_time_msecs = 5*1000;
 	http_client_set.max_parallel_connections = 40;
-	http_client_set.max_pipelined_requests = 4;
+	http_client_set.max_pipelined_requests = 8;
 	http_client_set.max_redirects = 0;
 	http_client_set.max_attempts = 1;
 	http_client_set.debug = debug;
@@ -1186,12 +1220,16 @@
 	test_run_client_server
 		(&http_client_set, &http_server_set, client_init);
 	test_files_deinit();
+
+	test_out("parallel", TRUE);
 }
 
 static void test_download_server_nonblocking(void)
 {
 	test_begin("http payload download (server non-blocking)");
 	blocking = FALSE;
+	request_100_continue = FALSE;
+	read_partial = 0;
 	test_run_sequential(test_client_download);
 	test_run_pipeline(test_client_download);
 	test_run_parallel(test_client_download);
@@ -1202,6 +1240,8 @@
 {
 	test_begin("http payload download (server blocking)");
 	blocking = TRUE;
+	request_100_continue = FALSE;
+	read_partial = 0;
 	test_run_sequential(test_client_download);
 	test_run_pipeline(test_client_download);
 	test_run_parallel(test_client_download);
@@ -1210,8 +1250,10 @@
 
 static void test_echo_server_nonblocking(void)
 {
-	test_begin("http payload echo (server non-blocking");
+	test_begin("http payload echo (server non-blocking)");
 	blocking = FALSE;
+	request_100_continue = FALSE;
+	read_partial = 0;
 	test_run_sequential(test_client_echo);
 	test_run_pipeline(test_client_echo);
 	test_run_parallel(test_client_echo);
@@ -1222,6 +1264,8 @@
 {
 	test_begin("http payload echo (server blocking)");
 	blocking = TRUE;
+	request_100_continue = FALSE;
+	read_partial = 0;
 	test_run_sequential(test_client_echo);
 	test_run_pipeline(test_client_echo);
 	test_run_parallel(test_client_echo);
@@ -1231,8 +1275,9 @@
 static void test_echo_server_nonblocking_sync(void)
 {
 	test_begin("http payload echo (server non-blocking; 100-continue)");
+	blocking = FALSE;
 	request_100_continue = TRUE;
-	blocking = FALSE;
+	read_partial = 0;
 	test_run_sequential(test_client_echo);
 	test_run_pipeline(test_client_echo);
 	test_run_parallel(test_client_echo);
@@ -1242,14 +1287,51 @@
 static void test_echo_server_blocking_sync(void)
 {
 	test_begin("http payload echo (server blocking; 100-continue)");
-	request_100_continue = TRUE;
 	blocking = TRUE;
+	request_100_continue = TRUE;
+	read_partial = 0;
   test_run_sequential(test_client_echo);
 	test_run_pipeline(test_client_echo);
 	test_run_parallel(test_client_echo);
 	test_end();
 }
 
+static void test_echo_server_nonblocking_partial(void)
+{
+	test_begin("http payload echo (server non-blocking; partial short)");
+	blocking = FALSE;
+	request_100_continue = FALSE;
+	read_partial = 1024;
+	test_run_sequential(test_client_echo);
+	test_run_pipeline(test_client_echo);
+	test_run_parallel(test_client_echo);
+	test_end();
+	test_begin("http payload echo (server non-blocking; partial long)");
+	read_partial = IO_BLOCK_SIZE + 1024;
+	test_run_sequential(test_client_echo);
+	test_run_pipeline(test_client_echo);
+	test_run_parallel(test_client_echo);
+	test_end();
+}
+
+static void test_echo_server_blocking_partial(void)
+{
+	test_begin("http payload echo (server blocking; partial short)");
+	blocking = TRUE;
+	request_100_continue = FALSE;
+	read_partial = 1024;
+	test_run_sequential(test_client_echo);
+	test_run_pipeline(test_client_echo);
+	test_run_parallel(test_client_echo);
+	test_end();
+	test_begin("http payload echo (server blocking; partial long)");
+	read_partial = IO_BLOCK_SIZE + 1024;
+	test_run_sequential(test_client_echo);
+	test_run_pipeline(test_client_echo);
+	test_run_parallel(test_client_echo);
+	test_end();
+}
+
 static void (*test_functions[])(void) = {
 	test_download_server_nonblocking,
 	test_download_server_blocking,
@@ -1257,6 +1339,8 @@
 	test_echo_server_blocking,
 	test_echo_server_nonblocking_sync,
 	test_echo_server_blocking_sync,
+	test_echo_server_nonblocking_partial,
+	test_echo_server_blocking_partial,
 	NULL
 };