Resync
[CMakeLuaTailorHgBridge.git] / CMakeLua / Utilities / cmcurl-7.19.0 / tests / libtest / lib507.c
blobd55540c1712fe94ea62307b0471f6312143ae169
1 /*****************************************************************************
2 * _ _ ____ _
3 * Project ___| | | | _ \| |
4 * / __| | | | |_) | |
5 * | (__| |_| | _ <| |___
6 * \___|\___/|_| \_\_____|
8 * $Id: lib507.c,v 1.1.1.1 2008-09-23 16:32:06 hoffman Exp $
9 */
11 #include "test.h"
13 #include "testutil.h"
15 #define MAIN_LOOP_HANG_TIMEOUT 90 * 1000
16 #define MULTI_PERFORM_HANG_TIMEOUT 60 * 1000
18 int test(char *URL)
20 CURL* curls;
21 CURLM* multi;
22 int still_running;
23 int i = -1;
24 CURLMsg *msg;
25 CURLMcode res;
26 struct timeval ml_start;
27 struct timeval mp_start;
28 char ml_timedout = FALSE;
29 char mp_timedout = FALSE;
31 if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
32 fprintf(stderr, "curl_global_init() failed\n");
33 return TEST_ERR_MAJOR_BAD;
36 if ((multi = curl_multi_init()) == NULL) {
37 fprintf(stderr, "curl_multi_init() failed\n");
38 curl_global_cleanup();
39 return TEST_ERR_MAJOR_BAD;
42 if ((curls = curl_easy_init()) == NULL) {
43 fprintf(stderr, "curl_easy_init() failed\n");
44 curl_multi_cleanup(multi);
45 curl_global_cleanup();
46 return TEST_ERR_MAJOR_BAD;
49 curl_easy_setopt(curls, CURLOPT_URL, URL);
51 if ((res = curl_multi_add_handle(multi, curls)) != CURLM_OK) {
52 fprintf(stderr, "curl_multi_add_handle() failed, "
53 "with code %d\n", res);
54 curl_easy_cleanup(curls);
55 curl_multi_cleanup(multi);
56 curl_global_cleanup();
57 return TEST_ERR_MAJOR_BAD;
60 mp_timedout = FALSE;
61 mp_start = tutil_tvnow();
63 do {
64 res = curl_multi_perform(multi, &still_running);
65 if (tutil_tvdiff(tutil_tvnow(), mp_start) >
66 MULTI_PERFORM_HANG_TIMEOUT) {
67 mp_timedout = TRUE;
68 break;
70 } while (res == CURLM_CALL_MULTI_PERFORM);
72 ml_timedout = FALSE;
73 ml_start = tutil_tvnow();
75 while ((!ml_timedout) && (!mp_timedout) && (still_running)) {
76 struct timeval timeout;
77 int rc;
78 fd_set fdread;
79 fd_set fdwrite;
80 fd_set fdexcep;
81 int maxfd;
83 FD_ZERO(&fdread);
84 FD_ZERO(&fdwrite);
85 FD_ZERO(&fdexcep);
86 timeout.tv_sec = 1;
87 timeout.tv_usec = 0;
89 if (tutil_tvdiff(tutil_tvnow(), ml_start) >
90 MAIN_LOOP_HANG_TIMEOUT) {
91 ml_timedout = TRUE;
92 break;
95 curl_multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd);
96 rc = select_test(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
97 switch(rc) {
98 case -1:
99 break;
100 case 0:
101 default:
102 mp_timedout = FALSE;
103 mp_start = tutil_tvnow();
104 do {
105 res = curl_multi_perform(multi, &still_running);
106 if (tutil_tvdiff(tutil_tvnow(), mp_start) >
107 MULTI_PERFORM_HANG_TIMEOUT) {
108 mp_timedout = TRUE;
109 break;
111 } while (res == CURLM_CALL_MULTI_PERFORM);
112 break;
115 if (ml_timedout || mp_timedout) {
116 if (ml_timedout) fprintf(stderr, "ml_timedout\n");
117 if (mp_timedout) fprintf(stderr, "mp_timedout\n");
118 fprintf(stderr, "ABORTING TEST, since it seems "
119 "that it would have run forever.\n");
120 i = TEST_ERR_RUNS_FOREVER;
122 else {
123 msg = curl_multi_info_read(multi, &still_running);
124 if(msg)
125 /* this should now contain a result code from the easy handle,
126 get it */
127 i = msg->data.result;
130 curl_multi_cleanup(multi);
131 curl_easy_cleanup(curls);
132 curl_global_cleanup();
134 return i; /* return the final return code */