aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/libtest/lib503.c109
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;
}