diff options
Diffstat (limited to 'tests/libtest/lib507.c')
-rw-r--r-- | tests/libtest/lib507.c | 123 |
1 files changed, 34 insertions, 89 deletions
diff --git a/tests/libtest/lib507.c b/tests/libtest/lib507.c index c5a009d8c..87c21defb 100644 --- a/tests/libtest/lib507.c +++ b/tests/libtest/lib507.c @@ -25,75 +25,40 @@ #include "warnless.h" #include "memdebug.h" -#define MAIN_LOOP_HANG_TIMEOUT 90 * 1000 -#define MULTI_PERFORM_HANG_TIMEOUT 60 * 1000 +#define TEST_HANG_TIMEOUT 60 * 1000 int test(char *URL) { - CURL* curls; - CURLM* multi; + CURL* curls = NULL; + CURLM* multi = NULL; int still_running; int i = -1; int res = 0; CURLMsg *msg; - CURLMcode ret; - struct timeval ml_start; - struct timeval mp_start; - char ml_timedout = FALSE; - char mp_timedout = FALSE; - - if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) { - fprintf(stderr, "curl_global_init() failed\n"); - return TEST_ERR_MAJOR_BAD; - } - if ((multi = curl_multi_init()) == NULL) { - fprintf(stderr, "curl_multi_init() failed\n"); - curl_global_cleanup(); - return TEST_ERR_MAJOR_BAD; - } + start_test_timing(); - if ((curls = curl_easy_init()) == NULL) { - fprintf(stderr, "curl_easy_init() failed\n"); - curl_multi_cleanup(multi); - curl_global_cleanup(); - return TEST_ERR_MAJOR_BAD; - } + global_init(CURL_GLOBAL_ALL); - test_setopt(curls, CURLOPT_URL, URL); - test_setopt(curls, CURLOPT_HEADER, 1L); + multi_init(multi); - if ((ret = curl_multi_add_handle(multi, curls)) != CURLM_OK) { - fprintf(stderr, "curl_multi_add_handle() failed, " - "with code %d\n", ret); - curl_easy_cleanup(curls); - curl_multi_cleanup(multi); - curl_global_cleanup(); - return TEST_ERR_MAJOR_BAD; - } + easy_init(curls); - mp_timedout = FALSE; - mp_start = tutil_tvnow(); + easy_setopt(curls, CURLOPT_URL, URL); + easy_setopt(curls, CURLOPT_HEADER, 1L); - do { - ret = curl_multi_perform(multi, &still_running); - if (tutil_tvdiff(tutil_tvnow(), mp_start) > - MULTI_PERFORM_HANG_TIMEOUT) { - mp_timedout = TRUE; - break; - } - } while (ret == CURLM_CALL_MULTI_PERFORM); + multi_add_handle(multi, curls); - ml_timedout = FALSE; - ml_start = tutil_tvnow(); + multi_perform(multi, &still_running); - while ((!ml_timedout) && (!mp_timedout) && (still_running)) { + abort_on_test_timeout(); + + while(still_running) { struct timeval timeout; - int rc; fd_set fdread; fd_set fdwrite; fd_set fdexcep; - int maxfd; + int maxfd = -99; FD_ZERO(&fdread); FD_ZERO(&fdwrite); @@ -101,49 +66,29 @@ int test(char *URL) timeout.tv_sec = 1; timeout.tv_usec = 0; - if (tutil_tvdiff(tutil_tvnow(), ml_start) > - MAIN_LOOP_HANG_TIMEOUT) { - ml_timedout = TRUE; - break; - } - - curl_multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd); - rc = select_test(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); - switch(rc) { - case -1: - break; - case 0: - default: - mp_timedout = FALSE; - mp_start = tutil_tvnow(); - do { - ret = curl_multi_perform(multi, &still_running); - if (tutil_tvdiff(tutil_tvnow(), mp_start) > - MULTI_PERFORM_HANG_TIMEOUT) { - mp_timedout = TRUE; - break; - } - } while (ret == CURLM_CALL_MULTI_PERFORM); - break; - } - } - if (ml_timedout || mp_timedout) { - if (ml_timedout) fprintf(stderr, "ml_timedout\n"); - if (mp_timedout) fprintf(stderr, "mp_timedout\n"); - fprintf(stderr, "ABORTING TEST, since it seems " - "that it would have run forever.\n"); - i = TEST_ERR_RUNS_FOREVER; - } - else { - msg = curl_multi_info_read(multi, &still_running); - if(msg) - /* this should now contain a result code from the easy handle, - get it */ - i = msg->data.result; + multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd); + + /* At this point, maxfd is guaranteed to be greater or equal than -1. */ + + select_test(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); + + abort_on_test_timeout(); + + multi_perform(multi, &still_running); + + abort_on_test_timeout(); } + msg = curl_multi_info_read(multi, &still_running); + if(msg) + /* this should now contain a result code from the easy handle, + get it */ + i = msg->data.result; + test_cleanup: + /* undocumented cleanup sequence - type UA */ + curl_multi_cleanup(multi); curl_easy_cleanup(curls); curl_global_cleanup(); |