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