xref: /aosp_15_r20/external/curl/tests/libtest/lib2405.c (revision 6236dae45794135f37c4eb022389c904c8b0090d)
1*6236dae4SAndroid Build Coastguard Worker /***************************************************************************
2*6236dae4SAndroid Build Coastguard Worker  *                                  _   _ ____  _
3*6236dae4SAndroid Build Coastguard Worker  *  Project                     ___| | | |  _ \| |
4*6236dae4SAndroid Build Coastguard Worker  *                             / __| | | | |_) | |
5*6236dae4SAndroid Build Coastguard Worker  *                            | (__| |_| |  _ <| |___
6*6236dae4SAndroid Build Coastguard Worker  *                             \___|\___/|_| \_\_____|
7*6236dae4SAndroid Build Coastguard Worker  *
8*6236dae4SAndroid Build Coastguard Worker  * Copyright (C) Dmitry Karpov <[email protected]>
9*6236dae4SAndroid Build Coastguard Worker  *
10*6236dae4SAndroid Build Coastguard Worker  * This software is licensed as described in the file COPYING, which
11*6236dae4SAndroid Build Coastguard Worker  * you should have received as part of this distribution. The terms
12*6236dae4SAndroid Build Coastguard Worker  * are also available at https://curl.se/docs/copyright.html.
13*6236dae4SAndroid Build Coastguard Worker  *
14*6236dae4SAndroid Build Coastguard Worker  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15*6236dae4SAndroid Build Coastguard Worker  * copies of the Software, and permit persons to whom the Software is
16*6236dae4SAndroid Build Coastguard Worker  * furnished to do so, under the terms of the COPYING file.
17*6236dae4SAndroid Build Coastguard Worker  *
18*6236dae4SAndroid Build Coastguard Worker  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19*6236dae4SAndroid Build Coastguard Worker  * KIND, either express or implied.
20*6236dae4SAndroid Build Coastguard Worker  *
21*6236dae4SAndroid Build Coastguard Worker  * SPDX-License-Identifier: curl
22*6236dae4SAndroid Build Coastguard Worker  *
23*6236dae4SAndroid Build Coastguard Worker  ***************************************************************************/
24*6236dae4SAndroid Build Coastguard Worker 
25*6236dae4SAndroid Build Coastguard Worker /*
26*6236dae4SAndroid Build Coastguard Worker  * The purpose of this test is to test behavior of curl_multi_waitfds
27*6236dae4SAndroid Build Coastguard Worker  * function in different scenarios:
28*6236dae4SAndroid Build Coastguard Worker  *  empty multi handle (expected zero descriptors),
29*6236dae4SAndroid Build Coastguard Worker  *  HTTP1 amd HTTP2 (no multiplexing) two transfers (expected two descriptors),
30*6236dae4SAndroid Build Coastguard Worker  *  HTTP2 with multiplexing (expected one descriptors)
31*6236dae4SAndroid Build Coastguard Worker  *
32*6236dae4SAndroid Build Coastguard Worker  *  It is also expected that all transfers run by multi-handle should complete
33*6236dae4SAndroid Build Coastguard Worker  *  successfully.
34*6236dae4SAndroid Build Coastguard Worker  */
35*6236dae4SAndroid Build Coastguard Worker 
36*6236dae4SAndroid Build Coastguard Worker #include "test.h"
37*6236dae4SAndroid Build Coastguard Worker 
38*6236dae4SAndroid Build Coastguard Worker #include "testutil.h"
39*6236dae4SAndroid Build Coastguard Worker #include "warnless.h"
40*6236dae4SAndroid Build Coastguard Worker #include "memdebug.h"
41*6236dae4SAndroid Build Coastguard Worker 
42*6236dae4SAndroid Build Coastguard Worker 
43*6236dae4SAndroid Build Coastguard Worker  /* ---------------------------------------------------------------- */
44*6236dae4SAndroid Build Coastguard Worker 
45*6236dae4SAndroid Build Coastguard Worker #define test_check(expected_fds) \
46*6236dae4SAndroid Build Coastguard Worker   if(res != CURLE_OK) { \
47*6236dae4SAndroid Build Coastguard Worker     fprintf(stderr, "test failed with code: %d\n", res); \
48*6236dae4SAndroid Build Coastguard Worker     goto test_cleanup; \
49*6236dae4SAndroid Build Coastguard Worker   } \
50*6236dae4SAndroid Build Coastguard Worker   else if(fd_count != expected_fds) { \
51*6236dae4SAndroid Build Coastguard Worker     fprintf(stderr, "Max number of waitfds: %d not as expected: %d\n", \
52*6236dae4SAndroid Build Coastguard Worker       fd_count, expected_fds); \
53*6236dae4SAndroid Build Coastguard Worker     res = TEST_ERR_FAILURE; \
54*6236dae4SAndroid Build Coastguard Worker     goto test_cleanup; \
55*6236dae4SAndroid Build Coastguard Worker   }
56*6236dae4SAndroid Build Coastguard Worker 
57*6236dae4SAndroid Build Coastguard Worker #define test_run_check(option, expected_fds) do { \
58*6236dae4SAndroid Build Coastguard Worker   res = test_run(URL, option, &fd_count); \
59*6236dae4SAndroid Build Coastguard Worker   test_check(expected_fds); \
60*6236dae4SAndroid Build Coastguard Worker } while(0)
61*6236dae4SAndroid Build Coastguard Worker 
62*6236dae4SAndroid Build Coastguard Worker  /* ---------------------------------------------------------------- */
63*6236dae4SAndroid Build Coastguard Worker 
64*6236dae4SAndroid Build Coastguard Worker enum {
65*6236dae4SAndroid Build Coastguard Worker   TEST_USE_HTTP1 = 0,
66*6236dae4SAndroid Build Coastguard Worker   TEST_USE_HTTP2,
67*6236dae4SAndroid Build Coastguard Worker   TEST_USE_HTTP2_MPLEX
68*6236dae4SAndroid Build Coastguard Worker };
69*6236dae4SAndroid Build Coastguard Worker 
emptyWriteFunc(void * ptr,size_t size,size_t nmemb,void * data)70*6236dae4SAndroid Build Coastguard Worker static size_t emptyWriteFunc(void *ptr, size_t size, size_t nmemb,
71*6236dae4SAndroid Build Coastguard Worker     void *data) {
72*6236dae4SAndroid Build Coastguard Worker   (void)ptr; (void)data;
73*6236dae4SAndroid Build Coastguard Worker   return size * nmemb;
74*6236dae4SAndroid Build Coastguard Worker }
75*6236dae4SAndroid Build Coastguard Worker 
set_easy(char * URL,CURL * easy,long option)76*6236dae4SAndroid Build Coastguard Worker static CURLcode set_easy(char *URL, CURL *easy, long option)
77*6236dae4SAndroid Build Coastguard Worker {
78*6236dae4SAndroid Build Coastguard Worker   CURLcode res = CURLE_OK;
79*6236dae4SAndroid Build Coastguard Worker 
80*6236dae4SAndroid Build Coastguard Worker   /* First set the URL that is about to receive our POST. */
81*6236dae4SAndroid Build Coastguard Worker   easy_setopt(easy, CURLOPT_URL, URL);
82*6236dae4SAndroid Build Coastguard Worker 
83*6236dae4SAndroid Build Coastguard Worker   /* get verbose debug output please */
84*6236dae4SAndroid Build Coastguard Worker   easy_setopt(easy, CURLOPT_VERBOSE, 1L);
85*6236dae4SAndroid Build Coastguard Worker 
86*6236dae4SAndroid Build Coastguard Worker   switch(option) {
87*6236dae4SAndroid Build Coastguard Worker   case TEST_USE_HTTP1:
88*6236dae4SAndroid Build Coastguard Worker     /* go http1 */
89*6236dae4SAndroid Build Coastguard Worker     easy_setopt(easy, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
90*6236dae4SAndroid Build Coastguard Worker     break;
91*6236dae4SAndroid Build Coastguard Worker 
92*6236dae4SAndroid Build Coastguard Worker   case TEST_USE_HTTP2:
93*6236dae4SAndroid Build Coastguard Worker     /* go http2 */
94*6236dae4SAndroid Build Coastguard Worker     easy_setopt(easy, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
95*6236dae4SAndroid Build Coastguard Worker     break;
96*6236dae4SAndroid Build Coastguard Worker 
97*6236dae4SAndroid Build Coastguard Worker   case TEST_USE_HTTP2_MPLEX:
98*6236dae4SAndroid Build Coastguard Worker     /* go http2 with multiplexing */
99*6236dae4SAndroid Build Coastguard Worker     easy_setopt(easy, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
100*6236dae4SAndroid Build Coastguard Worker     easy_setopt(easy, CURLOPT_PIPEWAIT, 1L);
101*6236dae4SAndroid Build Coastguard Worker     break;
102*6236dae4SAndroid Build Coastguard Worker   }
103*6236dae4SAndroid Build Coastguard Worker 
104*6236dae4SAndroid Build Coastguard Worker   /* no peer verify */
105*6236dae4SAndroid Build Coastguard Worker   easy_setopt(easy, CURLOPT_SSL_VERIFYPEER, 0L);
106*6236dae4SAndroid Build Coastguard Worker   easy_setopt(easy, CURLOPT_SSL_VERIFYHOST, 0L);
107*6236dae4SAndroid Build Coastguard Worker 
108*6236dae4SAndroid Build Coastguard Worker   /* include headers */
109*6236dae4SAndroid Build Coastguard Worker   easy_setopt(easy, CURLOPT_HEADER, 1L);
110*6236dae4SAndroid Build Coastguard Worker 
111*6236dae4SAndroid Build Coastguard Worker   /* empty write function */
112*6236dae4SAndroid Build Coastguard Worker   easy_setopt(easy, CURLOPT_WRITEFUNCTION, emptyWriteFunc);
113*6236dae4SAndroid Build Coastguard Worker 
114*6236dae4SAndroid Build Coastguard Worker test_cleanup:
115*6236dae4SAndroid Build Coastguard Worker   return res;
116*6236dae4SAndroid Build Coastguard Worker }
117*6236dae4SAndroid Build Coastguard Worker 
test_run(char * URL,long option,unsigned int * max_fd_count)118*6236dae4SAndroid Build Coastguard Worker static CURLcode test_run(char *URL, long option, unsigned int *max_fd_count)
119*6236dae4SAndroid Build Coastguard Worker {
120*6236dae4SAndroid Build Coastguard Worker   CURLMcode mc = CURLM_OK;
121*6236dae4SAndroid Build Coastguard Worker   CURLM *multi = NULL;
122*6236dae4SAndroid Build Coastguard Worker   CURLM *multi1 = NULL;
123*6236dae4SAndroid Build Coastguard Worker 
124*6236dae4SAndroid Build Coastguard Worker   CURL *easy1 = NULL;
125*6236dae4SAndroid Build Coastguard Worker   CURL *easy2 = NULL;
126*6236dae4SAndroid Build Coastguard Worker 
127*6236dae4SAndroid Build Coastguard Worker   unsigned int max_count = 0;
128*6236dae4SAndroid Build Coastguard Worker 
129*6236dae4SAndroid Build Coastguard Worker   int still_running; /* keep number of running handles */
130*6236dae4SAndroid Build Coastguard Worker   CURLMsg *msg; /* for picking up messages with the transfer status */
131*6236dae4SAndroid Build Coastguard Worker   int msgs_left; /* how many messages are left */
132*6236dae4SAndroid Build Coastguard Worker 
133*6236dae4SAndroid Build Coastguard Worker   CURLcode result;
134*6236dae4SAndroid Build Coastguard Worker   CURLcode res = CURLE_OK;
135*6236dae4SAndroid Build Coastguard Worker 
136*6236dae4SAndroid Build Coastguard Worker   struct curl_waitfd ufds[10];
137*6236dae4SAndroid Build Coastguard Worker   struct curl_waitfd ufds1[10];
138*6236dae4SAndroid Build Coastguard Worker   int numfds;
139*6236dae4SAndroid Build Coastguard Worker 
140*6236dae4SAndroid Build Coastguard Worker   easy_init(easy1);
141*6236dae4SAndroid Build Coastguard Worker   easy_init(easy2);
142*6236dae4SAndroid Build Coastguard Worker 
143*6236dae4SAndroid Build Coastguard Worker   if(set_easy(URL, easy1, option) != CURLE_OK)
144*6236dae4SAndroid Build Coastguard Worker     goto test_cleanup;
145*6236dae4SAndroid Build Coastguard Worker 
146*6236dae4SAndroid Build Coastguard Worker   if(set_easy(URL, easy2, option) != CURLE_OK)
147*6236dae4SAndroid Build Coastguard Worker     goto test_cleanup;
148*6236dae4SAndroid Build Coastguard Worker 
149*6236dae4SAndroid Build Coastguard Worker   multi_init(multi);
150*6236dae4SAndroid Build Coastguard Worker   multi_init(multi1);
151*6236dae4SAndroid Build Coastguard Worker 
152*6236dae4SAndroid Build Coastguard Worker   if(option == TEST_USE_HTTP2_MPLEX)
153*6236dae4SAndroid Build Coastguard Worker     multi_setopt(multi, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
154*6236dae4SAndroid Build Coastguard Worker 
155*6236dae4SAndroid Build Coastguard Worker   multi_add_handle(multi, easy1);
156*6236dae4SAndroid Build Coastguard Worker   multi_add_handle(multi, easy2);
157*6236dae4SAndroid Build Coastguard Worker 
158*6236dae4SAndroid Build Coastguard Worker   while(!mc) {
159*6236dae4SAndroid Build Coastguard Worker     /* get the count of file descriptors from the transfers */
160*6236dae4SAndroid Build Coastguard Worker     unsigned int fd_count = 0;
161*6236dae4SAndroid Build Coastguard Worker 
162*6236dae4SAndroid Build Coastguard Worker     mc = curl_multi_perform(multi, &still_running);
163*6236dae4SAndroid Build Coastguard Worker     if(!still_running || mc != CURLM_OK)
164*6236dae4SAndroid Build Coastguard Worker       break;
165*6236dae4SAndroid Build Coastguard Worker 
166*6236dae4SAndroid Build Coastguard Worker     mc = curl_multi_waitfds(multi, ufds, 10, &fd_count);
167*6236dae4SAndroid Build Coastguard Worker 
168*6236dae4SAndroid Build Coastguard Worker     if(mc != CURLM_OK) {
169*6236dae4SAndroid Build Coastguard Worker       fprintf(stderr, "curl_multi_waitfds() failed, code %d.\n", mc);
170*6236dae4SAndroid Build Coastguard Worker       res = TEST_ERR_FAILURE;
171*6236dae4SAndroid Build Coastguard Worker       break;
172*6236dae4SAndroid Build Coastguard Worker     }
173*6236dae4SAndroid Build Coastguard Worker 
174*6236dae4SAndroid Build Coastguard Worker     if(!fd_count)
175*6236dae4SAndroid Build Coastguard Worker       continue; /* no descriptors yet */
176*6236dae4SAndroid Build Coastguard Worker 
177*6236dae4SAndroid Build Coastguard Worker     /* checking case when we don't have enough space for waitfds */
178*6236dae4SAndroid Build Coastguard Worker     mc = curl_multi_waitfds(multi, ufds1, fd_count - 1, NULL);
179*6236dae4SAndroid Build Coastguard Worker 
180*6236dae4SAndroid Build Coastguard Worker     if(mc != CURLM_OUT_OF_MEMORY) {
181*6236dae4SAndroid Build Coastguard Worker       fprintf(stderr, "curl_multi_waitfds() return code %d instead of "
182*6236dae4SAndroid Build Coastguard Worker         "CURLM_OUT_OF_MEMORY.\n", mc);
183*6236dae4SAndroid Build Coastguard Worker       res = TEST_ERR_FAILURE;
184*6236dae4SAndroid Build Coastguard Worker       break;
185*6236dae4SAndroid Build Coastguard Worker     }
186*6236dae4SAndroid Build Coastguard Worker 
187*6236dae4SAndroid Build Coastguard Worker     if(fd_count > max_count)
188*6236dae4SAndroid Build Coastguard Worker       max_count = fd_count;
189*6236dae4SAndroid Build Coastguard Worker 
190*6236dae4SAndroid Build Coastguard Worker     /* Do polling on descriptors in ufds in Multi 1 */
191*6236dae4SAndroid Build Coastguard Worker     mc = curl_multi_poll(multi1, ufds, fd_count, 500, &numfds);
192*6236dae4SAndroid Build Coastguard Worker 
193*6236dae4SAndroid Build Coastguard Worker     if(mc != CURLM_OK) {
194*6236dae4SAndroid Build Coastguard Worker       fprintf(stderr, "curl_multi_poll() failed, code %d.\\n", mc);
195*6236dae4SAndroid Build Coastguard Worker       res = TEST_ERR_FAILURE;
196*6236dae4SAndroid Build Coastguard Worker       break;
197*6236dae4SAndroid Build Coastguard Worker     }
198*6236dae4SAndroid Build Coastguard Worker   }
199*6236dae4SAndroid Build Coastguard Worker 
200*6236dae4SAndroid Build Coastguard Worker   for(;;) {
201*6236dae4SAndroid Build Coastguard Worker     msg = curl_multi_info_read(multi, &msgs_left);
202*6236dae4SAndroid Build Coastguard Worker     if(!msg)
203*6236dae4SAndroid Build Coastguard Worker       break;
204*6236dae4SAndroid Build Coastguard Worker     if(msg->msg == CURLMSG_DONE) {
205*6236dae4SAndroid Build Coastguard Worker       result = msg->data.result;
206*6236dae4SAndroid Build Coastguard Worker 
207*6236dae4SAndroid Build Coastguard Worker       if(!res)
208*6236dae4SAndroid Build Coastguard Worker         res = result;
209*6236dae4SAndroid Build Coastguard Worker     }
210*6236dae4SAndroid Build Coastguard Worker   }
211*6236dae4SAndroid Build Coastguard Worker 
212*6236dae4SAndroid Build Coastguard Worker   curl_multi_remove_handle(multi, easy1);
213*6236dae4SAndroid Build Coastguard Worker   curl_multi_remove_handle(multi, easy2);
214*6236dae4SAndroid Build Coastguard Worker 
215*6236dae4SAndroid Build Coastguard Worker test_cleanup:
216*6236dae4SAndroid Build Coastguard Worker   curl_easy_cleanup(easy1);
217*6236dae4SAndroid Build Coastguard Worker   curl_easy_cleanup(easy2);
218*6236dae4SAndroid Build Coastguard Worker 
219*6236dae4SAndroid Build Coastguard Worker   curl_multi_cleanup(multi);
220*6236dae4SAndroid Build Coastguard Worker   curl_multi_cleanup(multi1);
221*6236dae4SAndroid Build Coastguard Worker 
222*6236dae4SAndroid Build Coastguard Worker   if(max_fd_count)
223*6236dae4SAndroid Build Coastguard Worker     *max_fd_count = max_count;
224*6236dae4SAndroid Build Coastguard Worker 
225*6236dae4SAndroid Build Coastguard Worker   return res;
226*6236dae4SAndroid Build Coastguard Worker }
227*6236dae4SAndroid Build Coastguard Worker 
empty_multi_test(void)228*6236dae4SAndroid Build Coastguard Worker static CURLcode empty_multi_test(void)
229*6236dae4SAndroid Build Coastguard Worker {
230*6236dae4SAndroid Build Coastguard Worker   CURLMcode mc = CURLM_OK;
231*6236dae4SAndroid Build Coastguard Worker   CURLM *multi = NULL;
232*6236dae4SAndroid Build Coastguard Worker   CURL *easy = NULL;
233*6236dae4SAndroid Build Coastguard Worker 
234*6236dae4SAndroid Build Coastguard Worker   struct curl_waitfd ufds[10];
235*6236dae4SAndroid Build Coastguard Worker 
236*6236dae4SAndroid Build Coastguard Worker   CURLcode res = CURLE_OK;
237*6236dae4SAndroid Build Coastguard Worker   unsigned int fd_count = 0;
238*6236dae4SAndroid Build Coastguard Worker 
239*6236dae4SAndroid Build Coastguard Worker   multi_init(multi);
240*6236dae4SAndroid Build Coastguard Worker 
241*6236dae4SAndroid Build Coastguard Worker   /* calling curl_multi_waitfds() on an empty multi handle.  */
242*6236dae4SAndroid Build Coastguard Worker   mc = curl_multi_waitfds(multi, ufds, 10, &fd_count);
243*6236dae4SAndroid Build Coastguard Worker 
244*6236dae4SAndroid Build Coastguard Worker   if(mc != CURLM_OK) {
245*6236dae4SAndroid Build Coastguard Worker     fprintf(stderr, "curl_multi_waitfds() failed, code %d.\n", mc);
246*6236dae4SAndroid Build Coastguard Worker     res = TEST_ERR_FAILURE;
247*6236dae4SAndroid Build Coastguard Worker     goto test_cleanup;
248*6236dae4SAndroid Build Coastguard Worker   }
249*6236dae4SAndroid Build Coastguard Worker   else if(fd_count > 0) {
250*6236dae4SAndroid Build Coastguard Worker     fprintf(stderr, "curl_multi_waitfds() returned non-zero count of "
251*6236dae4SAndroid Build Coastguard Worker         "waitfds: %d.\n", fd_count);
252*6236dae4SAndroid Build Coastguard Worker     res = TEST_ERR_FAILURE;
253*6236dae4SAndroid Build Coastguard Worker     goto test_cleanup;
254*6236dae4SAndroid Build Coastguard Worker   }
255*6236dae4SAndroid Build Coastguard Worker 
256*6236dae4SAndroid Build Coastguard Worker   /* calling curl_multi_waitfds() on multi handle with added easy handle. */
257*6236dae4SAndroid Build Coastguard Worker   easy_init(easy);
258*6236dae4SAndroid Build Coastguard Worker 
259*6236dae4SAndroid Build Coastguard Worker   if(set_easy((char *)"http://example.com", easy, TEST_USE_HTTP1) != CURLE_OK)
260*6236dae4SAndroid Build Coastguard Worker     goto test_cleanup;
261*6236dae4SAndroid Build Coastguard Worker 
262*6236dae4SAndroid Build Coastguard Worker   multi_add_handle(multi, easy);
263*6236dae4SAndroid Build Coastguard Worker 
264*6236dae4SAndroid Build Coastguard Worker   mc = curl_multi_waitfds(multi, ufds, 10, &fd_count);
265*6236dae4SAndroid Build Coastguard Worker 
266*6236dae4SAndroid Build Coastguard Worker   if(mc != CURLM_OK) {
267*6236dae4SAndroid Build Coastguard Worker     fprintf(stderr, "curl_multi_waitfds() failed, code %d.\n", mc);
268*6236dae4SAndroid Build Coastguard Worker     res = TEST_ERR_FAILURE;
269*6236dae4SAndroid Build Coastguard Worker     goto test_cleanup;
270*6236dae4SAndroid Build Coastguard Worker   }
271*6236dae4SAndroid Build Coastguard Worker   else if(fd_count > 0) {
272*6236dae4SAndroid Build Coastguard Worker     fprintf(stderr, "curl_multi_waitfds() returned non-zero count of "
273*6236dae4SAndroid Build Coastguard Worker         "waitfds: %d.\n", fd_count);
274*6236dae4SAndroid Build Coastguard Worker     res = TEST_ERR_FAILURE;
275*6236dae4SAndroid Build Coastguard Worker     goto test_cleanup;
276*6236dae4SAndroid Build Coastguard Worker   }
277*6236dae4SAndroid Build Coastguard Worker 
278*6236dae4SAndroid Build Coastguard Worker   curl_multi_remove_handle(multi, easy);
279*6236dae4SAndroid Build Coastguard Worker 
280*6236dae4SAndroid Build Coastguard Worker test_cleanup:
281*6236dae4SAndroid Build Coastguard Worker   curl_easy_cleanup(easy);
282*6236dae4SAndroid Build Coastguard Worker   curl_multi_cleanup(multi);
283*6236dae4SAndroid Build Coastguard Worker   return res;
284*6236dae4SAndroid Build Coastguard Worker }
285*6236dae4SAndroid Build Coastguard Worker 
test(char * URL)286*6236dae4SAndroid Build Coastguard Worker CURLcode test(char *URL)
287*6236dae4SAndroid Build Coastguard Worker {
288*6236dae4SAndroid Build Coastguard Worker   CURLcode res = CURLE_OK;
289*6236dae4SAndroid Build Coastguard Worker   unsigned int fd_count = 0;
290*6236dae4SAndroid Build Coastguard Worker 
291*6236dae4SAndroid Build Coastguard Worker   global_init(CURL_GLOBAL_ALL);
292*6236dae4SAndroid Build Coastguard Worker 
293*6236dae4SAndroid Build Coastguard Worker   /* Testing curl_multi_waitfds on empty and not started handles */
294*6236dae4SAndroid Build Coastguard Worker   res = empty_multi_test();
295*6236dae4SAndroid Build Coastguard Worker   if(res != CURLE_OK)
296*6236dae4SAndroid Build Coastguard Worker     goto test_cleanup;
297*6236dae4SAndroid Build Coastguard Worker 
298*6236dae4SAndroid Build Coastguard Worker   /* HTTP1, expected 2 waitfds - one for each transfer */
299*6236dae4SAndroid Build Coastguard Worker   test_run_check(TEST_USE_HTTP1, 2);
300*6236dae4SAndroid Build Coastguard Worker 
301*6236dae4SAndroid Build Coastguard Worker   /* HTTP2, expected 2 waitfds - one for each transfer */
302*6236dae4SAndroid Build Coastguard Worker   test_run_check(TEST_USE_HTTP2, 2);
303*6236dae4SAndroid Build Coastguard Worker 
304*6236dae4SAndroid Build Coastguard Worker   /* HTTP2 with multiplexing, expected 1 waitfds - one for all transfers */
305*6236dae4SAndroid Build Coastguard Worker   test_run_check(TEST_USE_HTTP2_MPLEX, 1);
306*6236dae4SAndroid Build Coastguard Worker 
307*6236dae4SAndroid Build Coastguard Worker test_cleanup:
308*6236dae4SAndroid Build Coastguard Worker   curl_global_cleanup();
309*6236dae4SAndroid Build Coastguard Worker   return res;
310*6236dae4SAndroid Build Coastguard Worker }
311