Annotation of embedaddon/curl/tests/libtest/lib526.c, revision 1.1.1.1
1.1 misho 1: /***************************************************************************
2: * _ _ ____ _
3: * Project ___| | | | _ \| |
4: * / __| | | | |_) | |
5: * | (__| |_| | _ <| |___
6: * \___|\___/|_| \_\_____|
7: *
8: * Copyright (C) 1998 - 2017, 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 https://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: /*
23: * This code sets up multiple easy handles that transfer a single file from
24: * the same URL, in a serial manner after each other. Due to the connection
25: * sharing within the multi handle all transfers are performed on the same
26: * persistent connection.
27: *
28: * This source code is used for lib526, lib527 and lib532 with only #ifdefs
29: * controlling the small differences.
30: *
31: * - lib526 closes all easy handles after
32: * they all have transferred the file over the single connection
33: * - lib527 closes each easy handle after each single transfer.
34: * - lib532 uses only a single easy handle that is removed, reset and then
35: * re-added for each transfer
36: *
37: * Test case 526, 527 and 532 use FTP, while test 528 uses the lib526 tool but
38: * with HTTP.
39: */
40:
41: #include "test.h"
42:
43: #include <fcntl.h>
44:
45: #include "testutil.h"
46: #include "warnless.h"
47: #include "memdebug.h"
48:
49: #define TEST_HANG_TIMEOUT 60 * 1000
50:
51: #define NUM_HANDLES 4
52:
53: int test(char *URL)
54: {
55: int res = 0;
56: CURL *curl[NUM_HANDLES];
57: int running;
58: CURLM *m = NULL;
59: int current = 0;
60: int i;
61:
62: for(i = 0; i < NUM_HANDLES; i++)
63: curl[i] = NULL;
64:
65: start_test_timing();
66:
67: global_init(CURL_GLOBAL_ALL);
68:
69: /* get NUM_HANDLES easy handles */
70: for(i = 0; i < NUM_HANDLES; i++) {
71: easy_init(curl[i]);
72: /* specify target */
73: easy_setopt(curl[i], CURLOPT_URL, URL);
74: /* go verbose */
75: easy_setopt(curl[i], CURLOPT_VERBOSE, 1L);
76: }
77:
78: multi_init(m);
79:
80: multi_add_handle(m, curl[current]);
81:
82: fprintf(stderr, "Start at URL 0\n");
83:
84: for(;;) {
85: struct timeval interval;
86: fd_set rd, wr, exc;
87: int maxfd = -99;
88:
89: interval.tv_sec = 1;
90: interval.tv_usec = 0;
91:
92: multi_perform(m, &running);
93:
94: abort_on_test_timeout();
95:
96: if(!running) {
97: #ifdef LIB527
98: /* NOTE: this code does not remove the handle from the multi handle
99: here, which would be the nice, sane and documented way of working.
100: This however tests that the API survives this abuse gracefully. */
101: curl_easy_cleanup(curl[current]);
102: curl[current] = NULL;
103: #endif
104: if(++current < NUM_HANDLES) {
105: fprintf(stderr, "Advancing to URL %d\n", current);
106: #ifdef LIB532
107: /* first remove the only handle we use */
108: curl_multi_remove_handle(m, curl[0]);
109:
110: /* make us re-use the same handle all the time, and try resetting
111: the handle first too */
112: curl_easy_reset(curl[0]);
113: easy_setopt(curl[0], CURLOPT_URL, URL);
114: /* go verbose */
115: easy_setopt(curl[0], CURLOPT_VERBOSE, 1L);
116:
117: /* re-add it */
118: multi_add_handle(m, curl[0]);
119: #else
120: multi_add_handle(m, curl[current]);
121: #endif
122: }
123: else {
124: break; /* done */
125: }
126: }
127:
128: FD_ZERO(&rd);
129: FD_ZERO(&wr);
130: FD_ZERO(&exc);
131:
132: multi_fdset(m, &rd, &wr, &exc, &maxfd);
133:
134: /* At this point, maxfd is guaranteed to be greater or equal than -1. */
135:
136: select_test(maxfd + 1, &rd, &wr, &exc, &interval);
137:
138: abort_on_test_timeout();
139: }
140:
141: test_cleanup:
142:
143: #if defined(LIB526)
144:
145: /* test 526 and 528 */
146: /* proper cleanup sequence - type PB */
147:
148: for(i = 0; i < NUM_HANDLES; i++) {
149: curl_multi_remove_handle(m, curl[i]);
150: curl_easy_cleanup(curl[i]);
151: }
152: curl_multi_cleanup(m);
153: curl_global_cleanup();
154:
155: #elif defined(LIB527)
156:
157: /* test 527 */
158:
159: /* Upon non-failure test flow the easy's have already been cleanup'ed. In
160: case there is a failure we arrive here with easy's that have not been
161: cleanup'ed yet, in this case we have to cleanup them or otherwise these
162: will be leaked, let's use undocumented cleanup sequence - type UB */
163:
164: if(res)
165: for(i = 0; i < NUM_HANDLES; i++)
166: curl_easy_cleanup(curl[i]);
167:
168: curl_multi_cleanup(m);
169: curl_global_cleanup();
170:
171: #elif defined(LIB532)
172:
173: /* test 532 */
174: /* undocumented cleanup sequence - type UB */
175:
176: for(i = 0; i < NUM_HANDLES; i++)
177: curl_easy_cleanup(curl[i]);
178: curl_multi_cleanup(m);
179: curl_global_cleanup();
180:
181: #endif
182:
183: return res;
184: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>