]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
Abort test if it seems that it would have run forever. This is just to prevent
authorYang Tse <yangsita@gmail.com>
Tue, 24 Oct 2006 15:51:42 +0000 (15:51 +0000)
committerYang Tse <yangsita@gmail.com>
Tue, 24 Oct 2006 15:51:42 +0000 (15:51 +0000)
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.

tests/libtest/lib503.c

index 4e7ac82db4170e3416c6b6c9ba719200d72047b7..e4077a932471391269d285536ebbbf9bd6ee4a19 100644 (file)
@@ -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;
 }