aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYang Tse <yangsita@gmail.com>2006-10-24 15:51:42 +0000
committerYang Tse <yangsita@gmail.com>2006-10-24 15:51:42 +0000
commitc54a4301ee8ffec421ccfcb0a35f8261b109886f (patch)
tree84a5c981ebe658356ddda481d8b53ec90fad6117
parent36a3514225d610de64f089c36c39615de1139fcc (diff)
Abort test if it seems that it would have run forever. This is just to prevent
test hanging and actually is an indication that there's a condition that is not being properly handled at some point in the library. Remove a pair of braces and adjust indentation appropriately.
-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;
}