sources: update source headers
[platform/upstream/curl.git] / tests / libtest / lib530.c
1 /***************************************************************************
2  *                                  _   _ ____  _
3  *  Project                     ___| | | |  _ \| |
4  *                             / __| | | | |_) | |
5  *                            | (__| |_| |  _ <| |___
6  *                             \___|\___/|_| \_\_____|
7  *
8  * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
9  *
10  * This software is licensed as described in the file COPYING, which
11  * you should have received as part of this distribution. The terms
12  * are also available at http://curl.haxx.se/docs/copyright.html.
13  *
14  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15  * copies of the Software, and permit persons to whom the Software is
16  * furnished to do so, under the terms of the COPYING file.
17  *
18  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19  * KIND, either express or implied.
20  *
21  ***************************************************************************/
22 #include "test.h"
23
24 #ifdef HAVE_SYS_TYPES_H
25 #include <sys/types.h>
26 #endif
27 #ifdef HAVE_SYS_STAT_H
28 #include <sys/stat.h>
29 #endif
30 #ifdef HAVE_STRING_H
31 #include <string.h>
32 #endif
33
34 #include "testutil.h"
35 #include "memdebug.h"
36
37 #define MAIN_LOOP_HANG_TIMEOUT     90 * 1000
38 #define MULTI_PERFORM_HANG_TIMEOUT 60 * 1000
39
40 #define NUM_HANDLES 4
41
42 int test(char *URL)
43 {
44   int res = 0;
45   CURL *curl[NUM_HANDLES];
46   int running;
47   char done=FALSE;
48   CURLM *m;
49   int i, j;
50   struct timeval ml_start;
51   struct timeval mp_start;
52   char ml_timedout = FALSE;
53   char mp_timedout = FALSE;
54   char target_url[256];
55
56   if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
57     fprintf(stderr, "curl_global_init() failed\n");
58     return TEST_ERR_MAJOR_BAD;
59   }
60
61   if ((m = curl_multi_init()) == NULL) {
62     fprintf(stderr, "curl_multi_init() failed\n");
63     curl_global_cleanup();
64     return TEST_ERR_MAJOR_BAD;
65   }
66
67   /* get NUM_HANDLES easy handles */
68   for(i=0; i < NUM_HANDLES; i++) {
69     curl[i] = curl_easy_init();
70     if(!curl[i]) {
71       fprintf(stderr, "curl_easy_init() failed "
72               "on handle #%d\n", i);
73       for (j=i-1; j >= 0; j--) {
74         curl_multi_remove_handle(m, curl[j]);
75         curl_easy_cleanup(curl[j]);
76       }
77       curl_multi_cleanup(m);
78       curl_global_cleanup();
79       return TEST_ERR_MAJOR_BAD + i;
80     }
81     sprintf(target_url, "%s%04i", URL, i + 1);
82     target_url[sizeof(target_url) - 1] = '\0';
83
84     res = curl_easy_setopt(curl[i], CURLOPT_URL, target_url);
85     if(res) {
86       fprintf(stderr, "curl_easy_setopt() failed "
87               "on handle #%d\n", i);
88       for (j=i; j >= 0; j--) {
89         curl_multi_remove_handle(m, curl[j]);
90         curl_easy_cleanup(curl[j]);
91       }
92       curl_multi_cleanup(m);
93       curl_global_cleanup();
94       return TEST_ERR_MAJOR_BAD + i;
95     }
96
97     /* go verbose */
98     res = curl_easy_setopt(curl[i], CURLOPT_VERBOSE, 1L);
99     if(res) {
100       fprintf(stderr, "curl_easy_setopt() failed "
101               "on handle #%d\n", i);
102       for (j=i; j >= 0; j--) {
103         curl_multi_remove_handle(m, curl[j]);
104         curl_easy_cleanup(curl[j]);
105       }
106       curl_multi_cleanup(m);
107       curl_global_cleanup();
108       return TEST_ERR_MAJOR_BAD + i;
109     }
110
111     /* include headers */
112     res = curl_easy_setopt(curl[i], CURLOPT_HEADER, 1L);
113     if(res) {
114       fprintf(stderr, "curl_easy_setopt() failed "
115               "on handle #%d\n", i);
116       for (j=i; j >= 0; j--) {
117         curl_multi_remove_handle(m, curl[j]);
118         curl_easy_cleanup(curl[j]);
119       }
120       curl_multi_cleanup(m);
121       curl_global_cleanup();
122       return TEST_ERR_MAJOR_BAD + i;
123     }
124
125     /* add handle to multi */
126     if ((res = (int)curl_multi_add_handle(m, curl[i])) != CURLM_OK) {
127       fprintf(stderr, "curl_multi_add_handle() failed, "
128               "on handle #%d with code %d\n", i, res);
129       curl_easy_cleanup(curl[i]);
130       for (j=i-1; j >= 0; j--) {
131         curl_multi_remove_handle(m, curl[j]);
132         curl_easy_cleanup(curl[j]);
133       }
134       curl_multi_cleanup(m);
135       curl_global_cleanup();
136       return TEST_ERR_MAJOR_BAD + i;
137     }
138   }
139
140   curl_multi_setopt(m, CURLMOPT_PIPELINING, 1L);
141
142   ml_timedout = FALSE;
143   ml_start = tutil_tvnow();
144
145   fprintf(stderr, "Start at URL 0\n");
146
147   while (!done) {
148     fd_set rd, wr, exc;
149     int max_fd;
150     struct timeval interval;
151
152     interval.tv_sec = 1;
153     interval.tv_usec = 0;
154
155     if (tutil_tvdiff(tutil_tvnow(), ml_start) >
156         MAIN_LOOP_HANG_TIMEOUT) {
157       ml_timedout = TRUE;
158       break;
159     }
160     mp_timedout = FALSE;
161     mp_start = tutil_tvnow();
162
163     while (res == CURLM_CALL_MULTI_PERFORM) {
164       res = (int)curl_multi_perform(m, &running);
165       if (tutil_tvdiff(tutil_tvnow(), mp_start) >
166           MULTI_PERFORM_HANG_TIMEOUT) {
167         mp_timedout = TRUE;
168         break;
169       }
170       if (running <= 0) {
171         done = TRUE; /* bail out */
172         break;
173       }
174     }
175     if (mp_timedout || done)
176       break;
177
178     if (res != CURLM_OK) {
179       fprintf(stderr, "not okay???\n");
180       break;
181     }
182
183     FD_ZERO(&rd);
184     FD_ZERO(&wr);
185     FD_ZERO(&exc);
186     max_fd = 0;
187
188     if (curl_multi_fdset(m, &rd, &wr, &exc, &max_fd) != CURLM_OK) {
189       fprintf(stderr, "unexpected failured of fdset.\n");
190       res = 189;
191       break;
192     }
193
194     if (select_test(max_fd+1, &rd, &wr, &exc, &interval) == -1) {
195       fprintf(stderr, "bad select??\n");
196       res = 195;
197       break;
198     }
199
200     res = CURLM_CALL_MULTI_PERFORM;
201   }
202
203   if (ml_timedout || mp_timedout) {
204     if (ml_timedout) fprintf(stderr, "ml_timedout\n");
205     if (mp_timedout) fprintf(stderr, "mp_timedout\n");
206     fprintf(stderr, "ABORTING TEST, since it seems "
207             "that it would have run forever.\n");
208     res = TEST_ERR_RUNS_FOREVER;
209   }
210
211 /* test_cleanup: */
212
213   /* cleanup NUM_HANDLES easy handles */
214   for(i=0; i < NUM_HANDLES; i++) {
215     curl_multi_remove_handle(m, curl[i]);
216     curl_easy_cleanup(curl[i]);
217   }
218
219   curl_multi_cleanup(m);
220   curl_global_cleanup();
221
222   return res;
223 }