src/server/test/httpclient.c

changeset 736
f707afcd4218
parent 713
929309bbf6ae
equal deleted inserted replaced
735:902b417ab6d2 736:f707afcd4218
41 static EVHandler *test_eventhandler; 41 static EVHandler *test_eventhandler;
42 static pthread_mutex_t test_mutex; 42 static pthread_mutex_t test_mutex;
43 static pthread_cond_t test_cond; 43 static pthread_cond_t test_cond;
44 static volatile int test_finished; 44 static volatile int test_finished;
45 45
46 static size_t response_body_write_fail_after = 0;
47 static int last_http_client_error = 0;
48
46 void http_client_tests_init(void) { 49 void http_client_tests_init(void) {
47 pthread_mutex_init(&test_mutex, NULL); 50 pthread_mutex_init(&test_mutex, NULL);
48 pthread_cond_init(&test_cond, NULL); 51 pthread_cond_init(&test_cond, NULL);
49 52
50 EventHandlerConfig config; 53 EventHandlerConfig config;
60 63
61 static void test_response_finished(HttpClient *client, void *userdata) { 64 static void test_response_finished(HttpClient *client, void *userdata) {
62 pthread_mutex_lock(&test_mutex); 65 pthread_mutex_lock(&test_mutex);
63 pthread_cond_signal(&test_cond); 66 pthread_cond_signal(&test_cond);
64 pthread_mutex_unlock(&test_mutex); 67 pthread_mutex_unlock(&test_mutex);
68 last_http_client_error = client->error;
65 http_client_free(client); 69 http_client_free(client);
66 test_finished = 1; 70 test_finished = 1;
67 } 71 }
68 72
69 static ssize_t test_response_body_write(HttpClient *client, void *buf, size_t nbytes, void *userdata) { 73 static ssize_t test_response_body_write(HttpClient *client, void *buf, size_t nbytes, void *userdata) {
70 char *str = buf; 74 char *str = buf;
71 return cxBufferWrite(str, 1, nbytes, userdata); 75 CxBuffer *buffer = userdata;
76 if(response_body_write_fail_after > 0 && buffer->pos > response_body_write_fail_after) {
77 return HTTP_CLIENT_CALLBACK_ERROR;
78 }
79 return cxBufferWrite(str, 1, nbytes, buffer);
72 } 80 }
73 81
74 static cxstring request_body_str; 82 static cxstring request_body_str;
75 static int request_body_pos = 0; 83 static int request_body_pos = 0;
76 static size_t request_body_max_read = 16; 84 static size_t request_body_max_read = 16;
131 cxstring response = response_blocks[i]; 139 cxstring response = response_blocks[i];
132 while(response_pos < response.length) { 140 while(response_pos < response.length) {
133 size_t nbytes = response.length - response_pos; 141 size_t nbytes = response.length - response_pos;
134 const char *str = response.ptr + response_pos; 142 const char *str = response.ptr + response_pos;
135 ssize_t w = write(fds[1], str, nbytes); 143 ssize_t w = write(fds[1], str, nbytes);
136 CX_TEST_ASSERT(w >= 0); 144 if(response_body_write_fail_after == 0) {
145 CX_TEST_ASSERT(w >= 0);
146 }
137 response_pos += w; 147 response_pos += w;
138 } 148 }
139 } 149 }
140 150
141 pthread_mutex_lock(&test_mutex); 151 pthread_mutex_lock(&test_mutex);
330 CX_TEST_CALL_SUBROUTINE(test_httpclient, cx_str(NULL), FALSE, &response, 1, out); 340 CX_TEST_CALL_SUBROUTINE(test_httpclient, cx_str(NULL), FALSE, &response, 1, out);
331 CX_TEST_ASSERT(out->size == 0); 341 CX_TEST_ASSERT(out->size == 0);
332 cxBufferFree(out); 342 cxBufferFree(out);
333 } 343 }
334 } 344 }
345
346 CX_TEST(test_http_client_response_io_error) {
347 CX_TEST_DO {
348 size_t content_length = 1024*1024*16;
349 char *content = malloc(content_length);
350 memset(content, 'f', content_length);
351
352 cxmutstr response_m = cx_strcat(CX_NULLSTR, 2, cx_str("HTTP/1.1 200 OK\r\nCOntent-length: 16777216\r\n\r\n"), cx_strn(content, content_length));
353 cxstring response = cx_strcast(response_m);
354
355 CxBuffer *out = cxBufferCreate(NULL, NULL, content_length, CX_BUFFER_AUTO_EXTEND|CX_BUFFER_FREE_CONTENTS);
356
357 response_body_write_fail_after = 2048;
358 CX_TEST_CALL_SUBROUTINE(test_httpclient, cx_str(NULL), FALSE, &response, 1, out);
359 CX_TEST_ASSERT(last_http_client_error == 1);
360 cxBufferFree(out);
361 free(content);
362 }
363 response_body_write_fail_after = 0;
364 }

mercurial