| 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 } |