]> granicus.if.org Git - curl/commitdiff
Decrease the posibility of aborting a test which actually is not
authorYang Tse <yangsita@gmail.com>
Fri, 20 Oct 2006 15:39:54 +0000 (15:39 +0000)
committerYang Tse <yangsita@gmail.com>
Fri, 20 Oct 2006 15:39:54 +0000 (15:39 +0000)
stale by replacing loop counters with timeouts. In this way the
main loop of the test will be allowed to run up to 30 seconds on
any platform before aborting it.

tests/libtest/lib504.c
tests/libtest/lib507.c
tests/libtest/lib509.c
tests/libtest/lib525.c
tests/libtest/lib526.c
tests/libtest/lib530.c
tests/libtest/lib533.c
tests/libtest/lib536.c

index 8c5700dac9e2604e1678a9aecc3a6dc886aaf45b..e925097ee75308849bd09ed231fe67a6fb14e663 100644 (file)
@@ -3,6 +3,11 @@
 #include <sys/time.h>
 #include <sys/types.h>
 
+#include "timeval.h"
+
+#define MAIN_LOOP_HANG_TIMEOUT     45 * 1000
+#define MULTI_PERFORM_HANG_TIMEOUT 30 * 1000
+
 /*
  * Source code in here hugely as reported in bug report 651464 by
  * Christopher R. Palmer.
@@ -20,8 +25,10 @@ int test(char *URL)
   int running;
   int max_fd;
   int rc;
-  int loop1 = 10;
-  int loop2 = 20;
+  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();
@@ -38,19 +45,36 @@ int test(char *URL)
   if(res && (res != CURLM_CALL_MULTI_PERFORM))
     ; /* major failure */
   else {
+
+    ml_timedout = FALSE;
+    ml_start = curlx_tvnow();
+
     do {
       struct timeval interval;
 
       interval.tv_sec = 1;
       interval.tv_usec = 0;
-      loop2 = 20;
+
+      if (curlx_tvdiff(curlx_tvnow(), ml_start) > 
+          MAIN_LOOP_HANG_TIMEOUT) {
+        ml_timedout = TRUE;
+        break;
+      }
 
       fprintf(stderr, "curl_multi_perform()\n");
 
+      mp_timedout = FALSE;
+      mp_start = curlx_tvnow();
+
       do {
         res = curl_multi_perform(m, &running);
-      } while ((--loop2>0) && (res == CURLM_CALL_MULTI_PERFORM));
-      if (loop2 <= 0)
+        if (curlx_tvdiff(curlx_tvnow(), mp_start) > 
+            MULTI_PERFORM_HANG_TIMEOUT) {
+          mp_timedout = TRUE;
+          break;
+        }
+      } while (res == CURLM_CALL_MULTI_PERFORM);
+      if (mp_timedout)
         break;
       if(!running) {
         /* This is where this code is expected to reach */
@@ -84,11 +108,10 @@ int test(char *URL)
       rc = select_test(max_fd+1, &rd, &wr, &exc, &interval);
       fprintf(stderr, "select returned %d\n", rc);
 
-      /* we only allow a certain number of loops to avoid hanging here
-         forever */
-    } while(--loop1>0);
-    if ((loop1 <= 0) || (loop2 <= 0)) {
-      fprintf(stderr, "loop1: %d loop2: %d \n", loop1, loop2);
+    } while(1);
+    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");
       ret = 77;
index 9a98da72858e697311d0d3dc1f243a2303ed364a..b06d65fe24092f0981d92a41f26cc4eb1e9298d1 100644 (file)
@@ -1,5 +1,10 @@
 #include "test.h"
 
+#include "timeval.h"
+
+#define MAIN_LOOP_HANG_TIMEOUT     45 * 1000
+#define MULTI_PERFORM_HANG_TIMEOUT 30 * 1000
+
 int test(char *URL)
 {
   CURL* curls;
@@ -7,8 +12,11 @@ int test(char *URL)
   int still_running;
   int i = -1;
   CURLMsg *msg;
-  int loop1 = 20;
-  int loop2 = 40;
+  CURLMcode res;
+  struct timeval ml_start;
+  struct timeval mp_start;
+  char ml_timedout = FALSE;
+  char mp_timedout = FALSE;
 
   multi = curl_multi_init();
 
@@ -16,21 +24,41 @@ int test(char *URL)
   curl_easy_setopt(curls, CURLOPT_URL, URL);
   curl_multi_add_handle(multi, curls);
 
-  while ((--loop1>0) && (CURLM_CALL_MULTI_PERFORM == 
-         curl_multi_perform(multi, &still_running)));
+  mp_timedout = FALSE;
+  mp_start = curlx_tvnow();
+
+  do {
+    res = curl_multi_perform(multi, &still_running);
+    if (curlx_tvdiff(curlx_tvnow(), mp_start) > 
+        MULTI_PERFORM_HANG_TIMEOUT) {
+      mp_timedout = TRUE;
+      break;
+    }
+  } while (res == CURLM_CALL_MULTI_PERFORM);
+
+  ml_timedout = FALSE;
+  ml_start = curlx_tvnow();
 
-  while ((loop1>0) && (--loop2>0) && (still_running)) {
+  while ((!ml_timedout) && (!mp_timedout) && (still_running)) {
     struct timeval timeout;
     int rc;
     fd_set fdread;
     fd_set fdwrite;
     fd_set fdexcep;
     int maxfd;
+
     FD_ZERO(&fdread);
     FD_ZERO(&fdwrite);
     FD_ZERO(&fdexcep);
     timeout.tv_sec = 1;
     timeout.tv_usec = 0;
+
+    if (curlx_tvdiff(curlx_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) {
@@ -38,14 +66,22 @@ int test(char *URL)
         break;
       case 0:
       default:
-        loop1 = 20;
-        while ((--loop1>0) && (CURLM_CALL_MULTI_PERFORM == 
-               curl_multi_perform(multi, &still_running)));
+        mp_timedout = FALSE;
+        mp_start = curlx_tvnow();
+        do {
+          res = curl_multi_perform(multi, &still_running);
+          if (curlx_tvdiff(curlx_tvnow(), mp_start) > 
+              MULTI_PERFORM_HANG_TIMEOUT) {
+            mp_timedout = TRUE;
+            break;
+          }
+        } while (res == CURLM_CALL_MULTI_PERFORM);
         break;
     }
   }
-  if ((loop1 <= 0) || (loop2 <= 0)) {
-    fprintf(stderr, "loop1: %d loop2: %d \n", loop1, loop2);
+  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 = 77;
index 5d385c9663a84c3b5d5600ae353c129224b42a37..77d5e1c6bd4f46aecc30f4875b018316b5c31fa2 100644 (file)
 #include <openssl/bio.h>
 #include <openssl/ssl.h>
 
+#include "timeval.h"
+
+#define MAIN_LOOP_HANG_TIMEOUT     45 * 1000
+#define MULTI_PERFORM_HANG_TIMEOUT 30 * 1000
+
 int portnum; /* the HTTPS port number we use */
 
 typedef struct sslctxparm_st {
@@ -175,8 +180,10 @@ int test(char *URL)
   int i = 0;
   CURLMsg *msg;
 
-  int loop1 = 40;
-  int loop2 = 20;
+  struct timeval ml_start;
+  struct timeval mp_start;
+  char ml_timedout = FALSE;
+  char mp_timedout = FALSE;
 
   if(arg2) {
     portnum = atoi(arg2);
@@ -208,24 +215,39 @@ int test(char *URL)
 
     res = curl_multi_add_handle(multi, p.curl);
 
-    while ((--loop1>0) && (loop2>0) && (!done)) {
+    ml_timedout = FALSE;
+    ml_start = curlx_tvnow();
+
+    while (!done) {
       fd_set rd, wr, exc;
       int max_fd;
       struct timeval interval;
 
       interval.tv_sec = 1;
       interval.tv_usec = 0;
-      loop2 = 20;
 
-      while ((--loop2>0) && (res == CURLM_CALL_MULTI_PERFORM)) {
+      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 = curl_multi_perform(multi, &running);
+        if (curlx_tvdiff(curlx_tvnow(), mp_start) > 
+            MULTI_PERFORM_HANG_TIMEOUT) {
+          mp_timedout = TRUE;
+          break;
+        }
         fprintf(stderr, "running=%d res=%d\n",running,res);
         if (running <= 0) {
           done = TRUE;
           break;
         }
       }
-      if ((loop2 <= 0) || (done))
+      if (mp_timedout || done)
         break;
 
       if (res != CURLM_OK) {
@@ -254,8 +276,9 @@ int test(char *URL)
       res = CURLM_CALL_MULTI_PERFORM;
     }
 
-    if ((loop1 <= 0) || (loop2 <= 0)) {
-      fprintf(stderr, "loop1: %d loop2: %d \n", loop1, loop2);
+    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 = 77;
@@ -268,7 +291,7 @@ int test(char *URL)
     }
   }
 
-  if ((loop1>0) && (loop2>0)) {
+  if ((!ml_timedout) && (!mp_timedout)) {
     fprintf(stderr, "all done\n");
   }
 
index 35c504b97a92377fc43df6ef41393c1575a6fbf3..7ed10dcb743f3a2dd35048d58593f0afa8801d8a 100644 (file)
 #include <sys/stat.h>
 #include <fcntl.h>
 
+#include "timeval.h"
+
+#define MAIN_LOOP_HANG_TIMEOUT     45 * 1000
+#define MULTI_PERFORM_HANG_TIMEOUT 30 * 1000
+
 int test(char *URL)
 {
   int res = 0;
@@ -24,8 +29,10 @@ int test(char *URL)
   int running;
   char done=FALSE;
   CURLM *m;
-  int loop1 = 40;
-  int loop2 = 20;
+  struct timeval ml_start;
+  struct timeval mp_start;
+  char ml_timedout = FALSE;
+  char mp_timedout = FALSE;
 
   if (!arg2) {
     fprintf(stderr, "Usage: lib525 [url] [uploadfile]\n");
@@ -84,23 +91,38 @@ int test(char *URL)
 
   res = (int)curl_multi_add_handle(m, curl);
 
-  while ((--loop1>0) && (loop2>0) && (!done)) {
+  ml_timedout = FALSE;
+  ml_start = curlx_tvnow();
+
+  while (!done) {
     fd_set rd, wr, exc;
     int max_fd;
     struct timeval interval;
 
     interval.tv_sec = 1;
     interval.tv_usec = 0;
-    loop2 = 20;
 
-    while ((--loop2>0) && (res == CURLM_CALL_MULTI_PERFORM)) {
+    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 ((loop2 <= 0) || (done))
+    if (mp_timedout || done)
       break;
 
     if (res != CURLM_OK) {
@@ -128,8 +150,9 @@ int test(char *URL)
     res = CURLM_CALL_MULTI_PERFORM;
   }
 
-  if ((loop1 <= 0) || (loop2 <= 0)) {
-    fprintf(stderr, "loop1: %d loop2: %d \n", loop1, loop2);
+  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;
index 91d9206e7f90fa3d9ad21a61b76fa2bde09402e5..c09dbb7cd75b9357c72db45516fa90401de1e218 100644 (file)
 #include <sys/stat.h>
 #include <fcntl.h>
 
+#include "timeval.h"
+
+#define MAIN_LOOP_HANG_TIMEOUT     45 * 1000
+#define MULTI_PERFORM_HANG_TIMEOUT 30 * 1000
+
 #define NUM_HANDLES 4
 
 int test(char *URL)
@@ -44,8 +49,10 @@ int test(char *URL)
   CURLM *m;
   int current=0;
   int i;
-  int loop1 = 40;
-  int loop2 = 20;
+  struct timeval ml_start;
+  struct timeval mp_start;
+  char ml_timedout = FALSE;
+  char mp_timedout = FALSE;
 
   /* In windows, this will init the winsock stuff */
   curl_global_init(CURL_GLOBAL_ALL);
@@ -67,19 +74,34 @@ int test(char *URL)
 
   res = (int)curl_multi_add_handle(m, curl[current]);
 
+  ml_timedout = FALSE;
+  ml_start = curlx_tvnow();
+
   fprintf(stderr, "Start at URL 0\n");
 
-  while ((--loop1>0) && (loop2>0) && (!done)) {
+  while (!done) {
     fd_set rd, wr, exc;
     int max_fd;
     struct timeval interval;
 
     interval.tv_sec = 1;
     interval.tv_usec = 0;
-    loop2 = 20;
 
-    while ((--loop2>0) && (res == CURLM_CALL_MULTI_PERFORM)) {
+    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) {
 #ifdef LIB527
         /* NOTE: this code does not remove the handle from the multi handle
@@ -115,7 +137,7 @@ int test(char *URL)
         break;
       }
     }
-    if ((loop2 <= 0) || (done))
+    if (mp_timedout || done)
       break;
 
     if (res != CURLM_OK) {
@@ -143,8 +165,9 @@ int test(char *URL)
     res = CURLM_CALL_MULTI_PERFORM;
   }
 
-  if ((loop1 <= 0) || (loop2 <= 0)) {
-    fprintf(stderr, "loop1: %d loop2: %d \n", loop1, loop2);
+  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;
index e83edb20cbe3c0e964dc4a723dc07adbfd974377..e68273c75bd6e7edcd1f948cb10a6c25557fc70f 100644 (file)
 #include <sys/types.h>
 #include <sys/stat.h>
 
+#include "timeval.h"
+
+#define MAIN_LOOP_HANG_TIMEOUT     45 * 1000
+#define MULTI_PERFORM_HANG_TIMEOUT 30 * 1000
+
 #define NUM_HANDLES 4
 
 int test(char *URL)
@@ -23,8 +28,10 @@ int test(char *URL)
   char done=FALSE;
   CURLM *m;
   int i;
-  int loop1 = 40;
-  int loop2 = 60;
+  struct timeval ml_start;
+  struct timeval mp_start;
+  char ml_timedout = FALSE;
+  char mp_timedout = FALSE;
 
   /* In windows, this will init the winsock stuff */
   curl_global_init(CURL_GLOBAL_ALL);
@@ -51,25 +58,40 @@ int test(char *URL)
 
   curl_multi_setopt(m, CURLMOPT_PIPELINING, 1);
 
+  ml_timedout = FALSE;
+  ml_start = curlx_tvnow();
+
   fprintf(stderr, "Start at URL 0\n");
 
-  while ((--loop1>0) && (loop2>0) && (!done)) {
+  while (!done) {
     fd_set rd, wr, exc;
     int max_fd;
     struct timeval interval;
 
     interval.tv_sec = 1;
     interval.tv_usec = 0;
-    loop2 = 60;
 
-    while ((--loop2>0) && (res == CURLM_CALL_MULTI_PERFORM)) {
+    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; /* bail out */
         break;
       }
     }
-    if ((loop2 <= 0) || (done))
+    if (mp_timedout || done)
       break;
 
     if (res != CURLM_OK) {
@@ -97,8 +119,9 @@ int test(char *URL)
     res = CURLM_CALL_MULTI_PERFORM;
   }
 
-  if ((loop1 <= 0) || (loop2 <= 0)) {
-    fprintf(stderr, "loop1: %d loop2: %d \n", loop1, loop2);
+  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;
index b0d63a10e2dfce8ec7b7e054b9216d349551f6da..24c36d0d092228c954abcbaa7be5d6a0fba0605a 100644 (file)
 #include <sys/stat.h>
 #include <fcntl.h>
 
+#include "timeval.h"
+
+#define MAIN_LOOP_HANG_TIMEOUT     45 * 1000
+#define MULTI_PERFORM_HANG_TIMEOUT 30 * 1000
+
 int test(char *URL)
 {
   int res = 0;
@@ -24,8 +29,10 @@ int test(char *URL)
   char done=FALSE;
   CURLM *m;
   int current=0;
-  int loop1 = 40;
-  int loop2 = 20;
+  struct timeval ml_start;
+  struct timeval mp_start;
+  char ml_timedout = FALSE;
+  char mp_timedout = FALSE;
 
   /* In windows, this will init the winsock stuff */
   curl_global_init(CURL_GLOBAL_ALL);
@@ -44,19 +51,34 @@ int test(char *URL)
 
   res = (int)curl_multi_add_handle(m, curl);
 
+  ml_timedout = FALSE;
+  ml_start = curlx_tvnow();
+
   fprintf(stderr, "Start at URL 0\n");
 
-  while ((--loop1>0) && (loop2>0) && (!done)) {
+  while (!done) {
     fd_set rd, wr, exc;
     int max_fd;
     struct timeval interval;
 
     interval.tv_sec = 1;
     interval.tv_usec = 0;
-    loop2 = 20;
 
-    while ((--loop2>0) && (res == CURLM_CALL_MULTI_PERFORM)) {
+    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) {
         if(!current++) {
           fprintf(stderr, "Advancing to URL 1\n");
@@ -83,7 +105,7 @@ int test(char *URL)
         break;
       }
     }
-    if ((loop2 <= 0) || (done))
+    if (mp_timedout || done)
       break;
 
     if (res != CURLM_OK) {
@@ -111,8 +133,9 @@ int test(char *URL)
     res = CURLM_CALL_MULTI_PERFORM;
   }
 
-  if ((loop1 <= 0) || (loop2 <= 0)) {
-    fprintf(stderr, "loop1: %d loop2: %d \n", loop1, loop2);
+  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;
index 2e7874051bdbb8ff79f432e99bc4d154381f83d7..4181b829ccab9932eedea3fd2e7ed81d8d5f5257 100644 (file)
 #include <sys/stat.h>
 #include <fcntl.h>
 
+#include "timeval.h"
+
+#define MAIN_LOOP_HANG_TIMEOUT     45 * 1000
+#define MULTI_PERFORM_HANG_TIMEOUT 30 * 1000
+
 static CURLMcode perform(CURLM * multi);
 
 static CURLMcode perform(CURLM * multi)
@@ -21,10 +26,19 @@ static CURLMcode perform(CURLM * multi)
   int handles, maxfd;
   CURLMcode code;
   fd_set fdread, fdwrite, fdexcep;
-  int loop;
+  struct timeval mp_start;
+  char mp_timedout = FALSE;
 
-  for (loop=40;loop>0;loop--) {
+  mp_timedout = FALSE;
+  mp_start = curlx_tvnow();
+
+  for (;;) {
     code = curl_multi_perform(multi, &handles);
+    if (curlx_tvdiff(curlx_tvnow(), mp_start) > 
+        MULTI_PERFORM_HANG_TIMEOUT) {
+      mp_timedout = TRUE;
+      break;
+    }
     if (handles <= 0)
       return CURLM_OK;
 
@@ -47,7 +61,8 @@ static CURLMcode perform(CURLM * multi)
       return (CURLMcode) ~CURLM_OK;
   }
 
-  /* We only reach this point if (loop <= 0) */
+  /* We only reach this point if (mp_timedout) */
+  fprintf(stderr, "mp_timedout\n");
   fprintf(stderr, "ABORTING TEST, since it seems "
           "that it would have run forever.\n");
   return (CURLMcode) ~CURLM_OK;