#include <unistd.h>
#include <dirent.h>
-static bool blocking = FALSE;
static bool debug = FALSE;
+
+static bool blocking = 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;
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) {
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);
"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) {
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) {
test_run_client_server
(&http_client_set, &http_server_set, client_init);
test_files_deinit();
+
+ test_out("sequential", TRUE);
}
static void test_run_pipeline(
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;
test_run_client_server
(&http_client_set, &http_server_set, client_init);
test_files_deinit();
+
+ test_out("pipeline", TRUE);
}
static void test_run_parallel(
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;
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);
{
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);
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);
{
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);
static void test_echo_server_nonblocking_sync(void)
{
test_begin("http payload echo (server non-blocking; 100-continue)");
- request_100_continue = TRUE;
blocking = FALSE;
+ 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);
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,
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
};