1e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/***************************************************************************
29bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels *                                  _   _ ____  _
39bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels *  Project                     ___| | | |  _ \| |
49bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels *                             / __| | | | |_) | |
59bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels *                            | (__| |_| |  _ <| |___
69bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels *                             \___|\___/|_| \_\_____|
79bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels *
8e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
9e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET *
10e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * This software is licensed as described in the file COPYING, which
11e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * you should have received as part of this distribution. The terms
12e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * are also available at http://curl.haxx.se/docs/copyright.html.
13e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET *
14e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * copies of the Software, and permit persons to whom the Software is
16e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * furnished to do so, under the terms of the COPYING file.
17e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET *
18e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * KIND, either express or implied.
20e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET *
21e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET ***************************************************************************/
229bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
23e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* Now include the curl_setup.h file from libcurl's private libdir (the source
249bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels   version, but that might include "curl_config.h" from the build dir so we
259bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels   need both of them in the include path), so that we get good in-depth
269bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels   knowledge about the system we're building this on */
279bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
289bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#define CURL_NO_OLDIES
299bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
30e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#include "curl_setup.h"
319bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
329bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <curl/curl.h>
339bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
349bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef HAVE_SYS_SELECT_H
359bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/* since so many tests use select(), we can just as well include it here */
369bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <sys/select.h>
379bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif
389bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
399bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef TPF
409bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#  include "select.h"
419bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif
429bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
43e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define _MPRINTF_REPLACE
44e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#include <curl/mprintf.h>
45e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
469bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
479bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#define test_setopt(A,B,C) \
489bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels  if((res = curl_easy_setopt((A),(B),(C))) != CURLE_OK) goto test_cleanup
499bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
50e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define test_multi_setopt(A,B,C) \
51e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if((res = curl_multi_setopt((A),(B),(C))) != CURLE_OK) goto test_cleanup
52e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
539bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsextern char *libtest_arg2; /* set by first.c to the argv[2] or NULL */
549bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsextern char *libtest_arg3; /* set by first.c to the argv[3] or NULL */
559bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
569bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/* argc and argv as passed in to the main() function */
579bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsextern int test_argc;
589bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsextern char **test_argv;
599bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
60e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETextern struct timeval tv_test_start; /* for test timing */
61e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
62e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETextern int select_wrapper(int nfds, fd_set *rd, fd_set *wr, fd_set *exc,
63e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET                          struct timeval *tv);
64e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
65e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETextern void wait_ms(int ms); /* wait this many milliseconds */
669bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
679bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsextern int test(char *URL); /* the actual test function provided by each
689bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels                               individual libXXX.c file */
699bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
70e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETextern char *hexdump(unsigned char *buffer, size_t len);
71e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
72e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#ifdef UNITTESTS
73e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETextern int unitfail;
74e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#endif
75e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
76e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/*
77e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET** TEST_ERR_* values must be greater than CURL_LAST CURLcode in order
78e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET** to avoid confusion with any CURLcode or CURLMcode. These TEST_ERR_*
79e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET** codes are returned to signal test specific situations and should
80e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET** not get mixed with CURLcode or CURLMcode values.
81e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET**
82e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET** For portability reasons TEST_ERR_* values should be less than 127.
83e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET*/
84e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
85e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define TEST_ERR_MAJOR_BAD     126
86e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define TEST_ERR_RUNS_FOREVER  125
87e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define TEST_ERR_EASY_INIT     124
88e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define TEST_ERR_MULTI_INIT    123
89e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define TEST_ERR_NUM_HANDLES   122
90e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define TEST_ERR_SELECT        121
91e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define TEST_ERR_SUCCESS       120
92e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define TEST_ERR_FAILURE       119
93e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define TEST_ERR_USAGE         118
94e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define TEST_ERR_FOPEN         117
95e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define TEST_ERR_FSTAT         116
96e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define TEST_ERR_BAD_TIMEOUT   115
97e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
98e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/*
99e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET** Macros for test source code readability/maintainability.
100e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET**
101e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET** All of the following macros require that an int data type 'res' variable
102e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET** exists in scope where macro is used, and that it has been initialized to
103e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET** zero before the macro is used.
104e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET**
105e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET** exe_* and chk_* macros are helper macros not intended to be used from
106e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET** outside of this header file. Arguments 'Y' and 'Z' of these represent
107e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET** source code file and line number, while Arguments 'A', 'B', etc, are
108e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET** the arguments used to actually call a libcurl function.
109e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET**
110e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET** All easy_* and multi_* macros call a libcurl function and evaluate if
111e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET** the function has succeeded or failed. When the function succeeds 'res'
112e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET** variable is not set nor cleared and program continues normal flow. On
113e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET** the other hand if function fails 'res' variable is set and a jump to
114e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET** label 'test_cleanup' is performed.
115e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET**
116e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET** Every easy_* and multi_* macros have a res_easy_* and res_multi_* macro
117e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET** counterpart that operates in tha same way with the exception that no
118e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET** jump takes place in case of failure. res_easy_* and res_multi_* macros
119e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET** should be immediately followed by checking if 'res' variable has been
120e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET** set.
121e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET**
122e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET** 'res' variable when set will hold a CURLcode, CURLMcode, or any of the
123e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET** TEST_ERR_* values defined above. It is advisable to return this value
124e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET** as test result.
125e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET*/
126e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
127e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* ---------------------------------------------------------------- */
128e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
129e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define exe_easy_init(A,Y,Z) do {                                 \
130e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(((A) = curl_easy_init()) == NULL) {                          \
131e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    fprintf(stderr, "%s:%d curl_easy_init() failed\n", (Y), (Z)); \
132e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    res = TEST_ERR_EASY_INIT;                                     \
133e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  }                                                               \
134e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} WHILE_FALSE
135e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
136e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define res_easy_init(A) \
137e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  exe_easy_init((A),(__FILE__),(__LINE__))
138e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
139e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define chk_easy_init(A,Y,Z) do { \
140e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  exe_easy_init((A),(Y),(Z));     \
141e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(res)                         \
142e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    goto test_cleanup;            \
143e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} WHILE_FALSE
144e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
145e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define easy_init(A) \
146e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  chk_easy_init((A),(__FILE__),(__LINE__))
147e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
148e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* ---------------------------------------------------------------- */
149e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
150e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define exe_multi_init(A,Y,Z) do {                                 \
151e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(((A) = curl_multi_init()) == NULL) {                          \
152e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    fprintf(stderr, "%s:%d curl_multi_init() failed\n", (Y), (Z)); \
153e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    res = TEST_ERR_MULTI_INIT;                                     \
154e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  }                                                                \
155e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} WHILE_FALSE
156e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
157e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define res_multi_init(A) \
158e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  exe_multi_init((A),(__FILE__),(__LINE__))
159e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
160e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define chk_multi_init(A,Y,Z) do { \
161e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  exe_multi_init((A),(Y),(Z));     \
162e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(res)                          \
163e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    goto test_cleanup;             \
164e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} WHILE_FALSE
165e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
166e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define multi_init(A) \
167e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  chk_multi_init((A),(__FILE__),(__LINE__))
168e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
169e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* ---------------------------------------------------------------- */
170e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
171e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define exe_easy_setopt(A,B,C,Y,Z) do {                  \
172e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  CURLcode ec;                                           \
173e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if((ec = curl_easy_setopt((A),(B),(C))) != CURLE_OK) { \
174e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    fprintf(stderr, "%s:%d curl_easy_setopt() failed, "  \
175e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET            "with code %d (%s)\n",                       \
176e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET            (Y), (Z), (int)ec, curl_easy_strerror(ec));  \
177e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    res = (int)ec;                                       \
178e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  }                                                      \
179e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} WHILE_FALSE
180e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
181e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define res_easy_setopt(A,B,C) \
182e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  exe_easy_setopt((A),(B),(C),(__FILE__),(__LINE__))
183e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
184e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define chk_easy_setopt(A,B,C,Y,Z) do { \
185e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  exe_easy_setopt((A),(B),(C),(Y),(Z)); \
186e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(res)                               \
187e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    goto test_cleanup;                  \
188e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} WHILE_FALSE
189e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
190e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define easy_setopt(A,B,C) \
191e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  chk_easy_setopt((A),(B),(C),(__FILE__),(__LINE__))
192e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
193e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* ---------------------------------------------------------------- */
194e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
195e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define exe_multi_setopt(A,B,C,Y,Z) do {                  \
196e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  CURLMcode ec;                                           \
197e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if((ec = curl_multi_setopt((A),(B),(C))) != CURLM_OK) { \
198e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    fprintf(stderr, "%s:%d curl_multi_setopt() failed, "  \
199e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET            "with code %d (%s)\n",                        \
200e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET            (Y), (Z), (int)ec, curl_multi_strerror(ec));  \
201e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    res = (int)ec;                                        \
202e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  }                                                       \
203e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} WHILE_FALSE
204e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
205e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define res_multi_setopt(A,B,C) \
206e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  exe_multi_setopt((A),(B),(C),(__FILE__),(__LINE__))
207e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
208e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define chk_multi_setopt(A,B,C,Y,Z) do { \
209e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  exe_multi_setopt((A),(B),(C),(Y),(Z)); \
210e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(res)                                \
211e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    goto test_cleanup;                   \
212e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} WHILE_FALSE
213e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
214e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define multi_setopt(A,B,C) \
215e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  chk_multi_setopt((A),(B),(C),(__FILE__),(__LINE__))
216e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
217e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* ---------------------------------------------------------------- */
218e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
219e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define exe_multi_add_handle(A,B,Y,Z) do {                   \
220e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  CURLMcode ec;                                              \
221e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if((ec = curl_multi_add_handle((A),(B))) != CURLM_OK) {    \
222e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    fprintf(stderr, "%s:%d curl_multi_add_handle() failed, " \
223e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET            "with code %d (%s)\n",                           \
224e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET            (Y), (Z), (int)ec, curl_multi_strerror(ec));     \
225e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    res = (int)ec;                                           \
226e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  }                                                          \
227e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} WHILE_FALSE
228e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
229e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define res_multi_add_handle(A,B) \
230e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  exe_multi_add_handle((A),(B),(__FILE__),(__LINE__))
231e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
232e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define chk_multi_add_handle(A,B,Y,Z) do { \
233e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  exe_multi_add_handle((A),(B),(Y),(Z));   \
234e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(res)                                  \
235e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    goto test_cleanup;                     \
236e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} WHILE_FALSE
237e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
238e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define multi_add_handle(A,B) \
239e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  chk_multi_add_handle((A),(B),(__FILE__),(__LINE__))
240e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
241e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* ---------------------------------------------------------------- */
242e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
243e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define exe_multi_remove_handle(A,B,Y,Z) do {                   \
244e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  CURLMcode ec;                                                 \
245e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if((ec = curl_multi_remove_handle((A),(B))) != CURLM_OK) {    \
246e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    fprintf(stderr, "%s:%d curl_multi_remove_handle() failed, " \
247e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET            "with code %d (%s)\n",                              \
248e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET            (Y), (Z), (int)ec, curl_multi_strerror(ec));        \
249e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    res = (int)ec;                                              \
250e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  }                                                             \
251e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} WHILE_FALSE
252e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
253e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define res_multi_remove_handle(A,B) \
254e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  exe_multi_remove_handle((A),(B),(__FILE__),(__LINE__))
255e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
256e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define chk_multi_remove_handle(A,B,Y,Z) do { \
257e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  exe_multi_remove_handle((A),(B),(Y),(Z));   \
258e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(res)                                     \
259e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    goto test_cleanup;                        \
260e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} WHILE_FALSE
261e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
262e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
263e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define multi_remove_handle(A,B) \
264e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  chk_multi_remove_handle((A),(B),(__FILE__),(__LINE__))
265e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
266e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* ---------------------------------------------------------------- */
267e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
268e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define exe_multi_perform(A,B,Y,Z) do {                          \
269e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  CURLMcode ec;                                                  \
270e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if((ec = curl_multi_perform((A),(B))) != CURLM_OK) {           \
271e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    fprintf(stderr, "%s:%d curl_multi_perform() failed, "        \
272e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET            "with code %d (%s)\n",                               \
273e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET            (Y), (Z), (int)ec, curl_multi_strerror(ec));         \
274e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    res = (int)ec;                                               \
275e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  }                                                              \
276e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  else if(*((B)) < 0) {                                          \
277e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    fprintf(stderr, "%s:%d curl_multi_perform() succeeded, "     \
278e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET            "but returned invalid running_handles value (%d)\n", \
279e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET            (Y), (Z), (int)*((B)));                              \
280e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    res = TEST_ERR_NUM_HANDLES;                                  \
281e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  }                                                              \
282e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} WHILE_FALSE
283e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
284e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define res_multi_perform(A,B) \
285e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  exe_multi_perform((A),(B),(__FILE__),(__LINE__))
286e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
287e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define chk_multi_perform(A,B,Y,Z) do { \
288e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  exe_multi_perform((A),(B),(Y),(Z));   \
289e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(res)                               \
290e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    goto test_cleanup;                  \
291e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} WHILE_FALSE
292e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
293e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define multi_perform(A,B) \
294e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  chk_multi_perform((A),(B),(__FILE__),(__LINE__))
295e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
296e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* ---------------------------------------------------------------- */
297e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
298e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define exe_multi_fdset(A,B,C,D,E,Y,Z) do {                      \
299e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  CURLMcode ec;                                                  \
300e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if((ec = curl_multi_fdset((A),(B),(C),(D),(E))) != CURLM_OK) { \
301e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    fprintf(stderr, "%s:%d curl_multi_fdset() failed, "          \
302e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET            "with code %d (%s)\n",                               \
303e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET            (Y), (Z), (int)ec, curl_multi_strerror(ec));         \
304e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    res = (int)ec;                                               \
305e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  }                                                              \
306e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  else if(*((E)) < -1) {                                         \
307e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    fprintf(stderr, "%s:%d curl_multi_fdset() succeeded, "       \
308e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET            "but returned invalid max_fd value (%d)\n",          \
309e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET            (Y), (Z), (int)*((E)));                              \
310e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    res = TEST_ERR_NUM_HANDLES;                                  \
311e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  }                                                              \
312e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} WHILE_FALSE
313e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
314e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define res_multi_fdset(A,B,C,D,E) \
315e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  exe_multi_fdset((A),(B),(C),(D),(E),(__FILE__),(__LINE__))
316e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
317e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define chk_multi_fdset(A,B,C,D,E,Y,Z) do {     \
318e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  exe_multi_fdset((A),(B),(C),(D),(E),(Y),(Z)); \
319e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(res)                                       \
320e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    goto test_cleanup;                          \
321e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} WHILE_FALSE
322e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
323e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define multi_fdset(A,B,C,D,E) \
324e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  chk_multi_fdset((A),(B),(C),(D),(E),(__FILE__),(__LINE__))
325e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
326e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* ---------------------------------------------------------------- */
327e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
328e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define exe_multi_timeout(A,B,Y,Z) do {                      \
329e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  CURLMcode ec;                                              \
330e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if((ec = curl_multi_timeout((A),(B))) != CURLM_OK) {       \
331e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    fprintf(stderr, "%s:%d curl_multi_timeout() failed, "    \
332e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET            "with code %d (%s)\n",                           \
333e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET            (Y), (Z), (int)ec, curl_multi_strerror(ec));     \
334e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    res = (int)ec;                                           \
335e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  }                                                          \
336e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  else if(*((B)) < -1L) {                                    \
337e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    fprintf(stderr, "%s:%d curl_multi_timeout() succeeded, " \
338e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET            "but returned invalid timeout value (%ld)\n",    \
339e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET            (Y), (Z), (long)*((B)));                         \
340e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    res = TEST_ERR_BAD_TIMEOUT;                              \
341e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  }                                                          \
342e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} WHILE_FALSE
343e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
344e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define res_multi_timeout(A,B) \
345e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  exe_multi_timeout((A),(B),(__FILE__),(__LINE__))
346e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
347e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define chk_multi_timeout(A,B,Y,Z) do { \
348e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  exe_multi_timeout((A),(B),(Y),(Z));   \
349e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(res)                               \
350e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    goto test_cleanup;                  \
351e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} WHILE_FALSE
352e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
353e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define multi_timeout(A,B) \
354e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  chk_multi_timeout((A),(B),(__FILE__),(__LINE__))
355e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
356e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* ---------------------------------------------------------------- */
357e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
358e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define exe_select_test(A,B,C,D,E,Y,Z) do {        \
359e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  int ec;                                          \
360e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(select_wrapper((A),(B),(C),(D),(E)) == -1 ) { \
361e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    ec = SOCKERRNO;                                \
362e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    fprintf(stderr, "%s:%d select() failed, with " \
363e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET            "errno %d (%s)\n",                     \
364e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET            (Y), (Z), ec, strerror(ec));           \
365e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    res = TEST_ERR_SELECT;                         \
366e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  }                                                \
367e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} WHILE_FALSE
368e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
369e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define res_select_test(A,B,C,D,E) \
370e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  exe_select_test((A),(B),(C),(D),(E),(__FILE__),(__LINE__))
371e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
372e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define chk_select_test(A,B,C,D,E,Y,Z) do {     \
373e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  exe_select_test((A),(B),(C),(D),(E),(Y),(Z)); \
374e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(res)                                       \
375e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    goto test_cleanup;                          \
376e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} WHILE_FALSE
377e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
378e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define select_test(A,B,C,D,E) \
379e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  chk_select_test((A),(B),(C),(D),(E),(__FILE__),(__LINE__))
380e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
381e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* ---------------------------------------------------------------- */
382e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
383e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define start_test_timing() do { \
384e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  tv_test_start = tutil_tvnow(); \
385e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} WHILE_FALSE
386e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
387e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define exe_test_timedout(Y,Z) do {                                    \
388e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(tutil_tvdiff(tutil_tvnow(), tv_test_start) > TEST_HANG_TIMEOUT) { \
389e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    fprintf(stderr, "%s:%d ABORTING TEST, since it seems "             \
390e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET                    "that it would have run forever.\n", (Y), (Z));    \
391e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    res = TEST_ERR_RUNS_FOREVER;                                       \
392e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  }                                                                    \
393e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} WHILE_FALSE
394e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
395e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define res_test_timedout() \
396e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  exe_test_timedout((__FILE__),(__LINE__))
397e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
398e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define chk_test_timedout(Y,Z) do { \
399e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  exe_test_timedout(Y,Z);           \
400e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(res)                           \
401e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    goto test_cleanup;              \
402e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} WHILE_FALSE
403e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
404e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define abort_on_test_timeout() \
405e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  chk_test_timedout((__FILE__),(__LINE__))
406e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
407e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* ---------------------------------------------------------------- */
408e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
409e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define exe_global_init(A,Y,Z) do {                     \
410e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  CURLcode ec;                                          \
411e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if((ec = curl_global_init((A))) != CURLE_OK) {        \
412e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    fprintf(stderr, "%s:%d curl_global_init() failed, " \
413e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET            "with code %d (%s)\n",                      \
414e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET            (Y), (Z), (int)ec, curl_easy_strerror(ec)); \
415e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    res = (int)ec;                                      \
416e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  }                                                     \
417e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} WHILE_FALSE
418e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
419e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define res_global_init(A) \
420e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  exe_global_init((A),(__FILE__),(__LINE__))
421e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
422e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define chk_global_init(A,Y,Z) do { \
423e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  exe_global_init((A),(Y),(Z));     \
424e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(res)                           \
425e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    return res;                     \
426e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} WHILE_FALSE
427e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
428e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* global_init() is different than other macros. In case of
429e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET   failure it 'return's instead of going to 'test_cleanup'. */
430e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
431e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define global_init(A) \
432e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  chk_global_init((A),(__FILE__),(__LINE__))
433e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
434e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* ---------------------------------------------------------------- */
435