include "memdebug.h"
[platform/upstream/curl.git] / tests / libtest / lib530.c
1 /*****************************************************************************
2  *                                  _   _ ____  _
3  *  Project                     ___| | | |  _ \| |
4  *                             / __| | | | |_) | |
5  *                            | (__| |_| |  _ <| |___
6  *                             \___|\___/|_| \_\_____|
7  *
8  * $Id$
9  */
10
11 #include "test.h"
12
13 #ifdef HAVE_SYS_TYPES_H
14 #include <sys/types.h>
15 #endif
16 #ifdef HAVE_SYS_STAT_H
17 #include <sys/stat.h>
18 #endif
19 #ifdef HAVE_STRING_H
20 #include <string.h>
21 #endif
22
23 #include "testutil.h"
24 #include "memdebug.h"
25
26 #define MAIN_LOOP_HANG_TIMEOUT     90 * 1000
27 #define MULTI_PERFORM_HANG_TIMEOUT 60 * 1000
28
29 #define NUM_HANDLES 4
30
31 int test(char *URL)
32 {
33   int res = 0;
34   CURL *curl[NUM_HANDLES];
35   int running;
36   char done=FALSE;
37   CURLM *m;
38   int i, j;
39   struct timeval ml_start;
40   struct timeval mp_start;
41   char ml_timedout = FALSE;
42   char mp_timedout = FALSE;
43   char target_url[256];
44
45   if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
46     fprintf(stderr, "curl_global_init() failed\n");
47     return TEST_ERR_MAJOR_BAD;
48   }
49
50   if ((m = curl_multi_init()) == NULL) {
51     fprintf(stderr, "curl_multi_init() failed\n");
52     curl_global_cleanup();
53     return TEST_ERR_MAJOR_BAD;
54   }
55
56   /* get NUM_HANDLES easy handles */
57   for(i=0; i < NUM_HANDLES; i++) {
58     curl[i] = curl_easy_init();
59     if(!curl[i]) {
60       fprintf(stderr, "curl_easy_init() failed "
61               "on handle #%d\n", i);
62       for (j=i-1; j >= 0; j--) {
63         curl_multi_remove_handle(m, curl[j]);
64         curl_easy_cleanup(curl[j]);
65       }
66       curl_multi_cleanup(m);
67       curl_global_cleanup();
68       return TEST_ERR_MAJOR_BAD + i;
69     }
70     sprintf(target_url, "%s%04i", URL, i + 1);
71     target_url[sizeof(target_url) - 1] = '\0';
72     curl_easy_setopt(curl[i], CURLOPT_URL, target_url);
73
74     /* go verbose */
75     curl_easy_setopt(curl[i], CURLOPT_VERBOSE, 1L);
76
77     /* include headers */
78     curl_easy_setopt(curl[i], CURLOPT_HEADER, 1L);
79
80     /* add handle to multi */
81     if ((res = (int)curl_multi_add_handle(m, curl[i])) != CURLM_OK) {
82       fprintf(stderr, "curl_multi_add_handle() failed, "
83               "on handle #%d with code %d\n", i, res);
84       curl_easy_cleanup(curl[i]);
85       for (j=i-1; j >= 0; j--) {
86         curl_multi_remove_handle(m, curl[j]);
87         curl_easy_cleanup(curl[j]);
88       }
89       curl_multi_cleanup(m);
90       curl_global_cleanup();
91       return TEST_ERR_MAJOR_BAD + i;
92     }
93   }
94
95   curl_multi_setopt(m, CURLMOPT_PIPELINING, 1L);
96
97   ml_timedout = FALSE;
98   ml_start = tutil_tvnow();
99
100   fprintf(stderr, "Start at URL 0\n");
101
102   while (!done) {
103     fd_set rd, wr, exc;
104     int max_fd;
105     struct timeval interval;
106
107     interval.tv_sec = 1;
108     interval.tv_usec = 0;
109
110     if (tutil_tvdiff(tutil_tvnow(), ml_start) > 
111         MAIN_LOOP_HANG_TIMEOUT) {
112       ml_timedout = TRUE;
113       break;
114     }
115     mp_timedout = FALSE;
116     mp_start = tutil_tvnow();
117
118     while (res == CURLM_CALL_MULTI_PERFORM) {
119       res = (int)curl_multi_perform(m, &running);
120       if (tutil_tvdiff(tutil_tvnow(), mp_start) > 
121           MULTI_PERFORM_HANG_TIMEOUT) {
122         mp_timedout = TRUE;
123         break;
124       }
125       if (running <= 0) {
126         done = TRUE; /* bail out */
127         break;
128       }
129     }
130     if (mp_timedout || done)
131       break;
132
133     if (res != CURLM_OK) {
134       fprintf(stderr, "not okay???\n");
135       break;
136     }
137
138     FD_ZERO(&rd);
139     FD_ZERO(&wr);
140     FD_ZERO(&exc);
141     max_fd = 0;
142
143     if (curl_multi_fdset(m, &rd, &wr, &exc, &max_fd) != CURLM_OK) {
144       fprintf(stderr, "unexpected failured of fdset.\n");
145       res = 189;
146       break;
147     }
148
149     if (select_test(max_fd+1, &rd, &wr, &exc, &interval) == -1) {
150       fprintf(stderr, "bad select??\n");
151       res = 195;
152       break;
153     }
154
155     res = CURLM_CALL_MULTI_PERFORM;
156   }
157
158   if (ml_timedout || mp_timedout) {
159     if (ml_timedout) fprintf(stderr, "ml_timedout\n");
160     if (mp_timedout) fprintf(stderr, "mp_timedout\n");
161     fprintf(stderr, "ABORTING TEST, since it seems "
162             "that it would have run forever.\n");
163     res = TEST_ERR_RUNS_FOREVER;
164   }
165
166   /* cleanup NUM_HANDLES easy handles */
167   for(i=0; i < NUM_HANDLES; i++) {
168     curl_multi_remove_handle(m, curl[i]);
169     curl_easy_cleanup(curl[i]);
170   }
171
172   curl_multi_cleanup(m);
173   curl_global_cleanup();
174
175   return res;
176 }