diff options
-rw-r--r-- | tests/libtest/lib503.c | 109 |
1 files changed, 72 insertions, 37 deletions
diff --git a/tests/libtest/lib503.c b/tests/libtest/lib503.c index 4e7ac82db..e4077a932 100644 --- a/tests/libtest/lib503.c +++ b/tests/libtest/lib503.c @@ -3,6 +3,11 @@ #include <sys/time.h> #include <sys/types.h> +#include "timeval.h" + +#define MAIN_LOOP_HANG_TIMEOUT 300 * 1000 +#define MULTI_PERFORM_HANG_TIMEOUT 120 * 1000 + /* * Source code in here hugely as reported in bug report 651460 by * Christopher R. Palmer. @@ -15,6 +20,13 @@ int test(char *URL) { CURL *c; CURLM *m; + int res = 0; + int running; + char done = FALSE; + struct timeval ml_start; + struct timeval mp_start; + char ml_timedout = FALSE; + char mp_timedout = FALSE; curl_global_init(CURL_GLOBAL_ALL); c = curl_easy_init(); @@ -25,60 +37,83 @@ int test(char *URL) curl_easy_setopt(c, CURLOPT_HTTPPROXYTUNNEL, 1); curl_easy_setopt(c, CURLOPT_HEADER, 1); - { - CURLMcode res; - int running; - char done=FALSE; - m = curl_multi_init(); + m = curl_multi_init(); - res = curl_multi_add_handle(m, c); + res = (int)curl_multi_add_handle(m, c); - while(!done) { - fd_set rd, wr, exc; - int max_fd; - struct timeval interval; + ml_timedout = FALSE; + ml_start = curlx_tvnow(); - interval.tv_sec = 1; - interval.tv_usec = 0; + while(!done) { + fd_set rd, wr, exc; + int max_fd; + struct timeval interval; - while (res == CURLM_CALL_MULTI_PERFORM) { - res = curl_multi_perform(m, &running); - if (running <= 0) { - done = TRUE; - break; - } - } - if(done) - break; + interval.tv_sec = 1; + interval.tv_usec = 0; - if (res != CURLM_OK) { - fprintf(stderr, "not okay???\n"); + if (curlx_tvdiff(curlx_tvnow(), ml_start) > + MAIN_LOOP_HANG_TIMEOUT) { + ml_timedout = TRUE; + break; + } + mp_timedout = FALSE; + mp_start = curlx_tvnow(); + + while (res == CURLM_CALL_MULTI_PERFORM) { + res = (int)curl_multi_perform(m, &running); + if (curlx_tvdiff(curlx_tvnow(), mp_start) > + MULTI_PERFORM_HANG_TIMEOUT) { + mp_timedout = TRUE; + break; + } + if (running <= 0) { + done = TRUE; break; } + } + if (mp_timedout || done) + break; - FD_ZERO(&rd); - FD_ZERO(&wr); - FD_ZERO(&exc); - max_fd = 0; + if (res != CURLM_OK) { + fprintf(stderr, "not okay???\n"); + break; + } - if (curl_multi_fdset(m, &rd, &wr, &exc, &max_fd) != CURLM_OK) { - fprintf(stderr, "unexpected failured of fdset.\n"); - return 89; - } + FD_ZERO(&rd); + FD_ZERO(&wr); + FD_ZERO(&exc); + max_fd = 0; - if (select_test(max_fd+1, &rd, &wr, &exc, &interval) == -1) { - fprintf(stderr, "bad select??\n"); - return 95; - } + if (curl_multi_fdset(m, &rd, &wr, &exc, &max_fd) != CURLM_OK) { + fprintf(stderr, "unexpected failured of fdset.\n"); + res = 89; + break; + } - res = CURLM_CALL_MULTI_PERFORM; + if (select_test(max_fd+1, &rd, &wr, &exc, &interval) == -1) { + fprintf(stderr, "bad select??\n"); + res = 95; + break; } + + res = CURLM_CALL_MULTI_PERFORM; + } + + 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"); + res = 77; } + curl_multi_remove_handle(m, c); curl_easy_cleanup(c); curl_multi_cleanup(m); - return CURLE_OK; + curl_global_cleanup(); + return res; } |