Annotation of embedaddon/curl/tests/libtest/lib586.c, revision 1.1.1.1
1.1 misho 1: /***************************************************************************
2: * _ _ ____ _
3: * Project ___| | | | _ \| |
4: * / __| | | | |_) | |
5: * | (__| |_| | _ <| |___
6: * \___|\___/|_| \_\_____|
7: *
8: * Copyright (C) 1998 - 2020, 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: #include "test.h"
23: #include "memdebug.h"
24:
25: #define THREADS 2
26:
27: /* struct containing data of a thread */
28: struct Tdata {
29: CURLSH *share;
30: char *url;
31: };
32:
33: struct userdata {
34: const char *text;
35: int counter;
36: };
37:
38: /* lock callback */
39: static void my_lock(CURL *handle, curl_lock_data data,
40: curl_lock_access laccess, void *useptr)
41: {
42: const char *what;
43: struct userdata *user = (struct userdata *)useptr;
44:
45: (void)handle;
46: (void)laccess;
47:
48: switch(data) {
49: case CURL_LOCK_DATA_SHARE:
50: what = "share";
51: break;
52: case CURL_LOCK_DATA_DNS:
53: what = "dns";
54: break;
55: case CURL_LOCK_DATA_COOKIE:
56: what = "cookie";
57: break;
58: case CURL_LOCK_DATA_SSL_SESSION:
59: what = "ssl_session";
60: break;
61: default:
62: fprintf(stderr, "lock: no such data: %d\n", (int)data);
63: return;
64: }
65: printf("lock: %-6s [%s]: %d\n", what, user->text, user->counter);
66: user->counter++;
67: }
68:
69: /* unlock callback */
70: static void my_unlock(CURL *handle, curl_lock_data data, void *useptr)
71: {
72: const char *what;
73: struct userdata *user = (struct userdata *)useptr;
74: (void)handle;
75: switch(data) {
76: case CURL_LOCK_DATA_SHARE:
77: what = "share";
78: break;
79: case CURL_LOCK_DATA_DNS:
80: what = "dns";
81: break;
82: case CURL_LOCK_DATA_COOKIE:
83: what = "cookie";
84: break;
85: case CURL_LOCK_DATA_SSL_SESSION:
86: what = "ssl_session";
87: break;
88: default:
89: fprintf(stderr, "unlock: no such data: %d\n", (int)data);
90: return;
91: }
92: printf("unlock: %-6s [%s]: %d\n", what, user->text, user->counter);
93: user->counter++;
94: }
95:
96: /* the dummy thread function */
97: static void *fire(void *ptr)
98: {
99: CURLcode code;
100: struct Tdata *tdata = (struct Tdata*)ptr;
101: CURL *curl;
102:
103: curl = curl_easy_init();
104: if(!curl) {
105: fprintf(stderr, "curl_easy_init() failed\n");
106: return NULL;
107: }
108:
109: curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
110: curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
111: curl_easy_setopt(curl, CURLOPT_URL, tdata->url);
112: printf("CURLOPT_SHARE\n");
113: curl_easy_setopt(curl, CURLOPT_SHARE, tdata->share);
114:
115: printf("PERFORM\n");
116: code = curl_easy_perform(curl);
117: if(code != CURLE_OK) {
118: int i = 0;
119: fprintf(stderr, "perform url '%s' repeat %d failed, curlcode %d\n",
120: tdata->url, i, (int)code);
121: }
122:
123: printf("CLEANUP\n");
124: curl_easy_cleanup(curl);
125:
126: return NULL;
127: }
128:
129: /* test function */
130: int test(char *URL)
131: {
132: int res;
133: CURLSHcode scode = CURLSHE_OK;
134: char *url;
135: struct Tdata tdata;
136: CURL *curl;
137: CURLSH *share;
138: int i;
139: struct userdata user;
140:
141: user.text = "Pigs in space";
142: user.counter = 0;
143:
144: printf("GLOBAL_INIT\n");
145: if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
146: fprintf(stderr, "curl_global_init() failed\n");
147: return TEST_ERR_MAJOR_BAD;
148: }
149:
150: /* prepare share */
151: printf("SHARE_INIT\n");
152: share = curl_share_init();
153: if(!share) {
154: fprintf(stderr, "curl_share_init() failed\n");
155: curl_global_cleanup();
156: return TEST_ERR_MAJOR_BAD;
157: }
158:
159: if(CURLSHE_OK == scode) {
160: printf("CURLSHOPT_LOCKFUNC\n");
161: scode = curl_share_setopt(share, CURLSHOPT_LOCKFUNC, my_lock);
162: }
163: if(CURLSHE_OK == scode) {
164: printf("CURLSHOPT_UNLOCKFUNC\n");
165: scode = curl_share_setopt(share, CURLSHOPT_UNLOCKFUNC, my_unlock);
166: }
167: if(CURLSHE_OK == scode) {
168: printf("CURLSHOPT_USERDATA\n");
169: scode = curl_share_setopt(share, CURLSHOPT_USERDATA, &user);
170: }
171: if(CURLSHE_OK == scode) {
172: printf("CURL_LOCK_DATA_SSL_SESSION\n");
173: scode = curl_share_setopt(share, CURLSHOPT_SHARE,
174: CURL_LOCK_DATA_SSL_SESSION);
175: }
176:
177: if(CURLSHE_OK != scode) {
178: fprintf(stderr, "curl_share_setopt() failed\n");
179: curl_share_cleanup(share);
180: curl_global_cleanup();
181: return TEST_ERR_MAJOR_BAD;
182: }
183:
184:
185: res = 0;
186:
187: /* start treads */
188: for(i = 1; i <= THREADS; i++) {
189:
190: /* set thread data */
191: tdata.url = URL;
192: tdata.share = share;
193:
194: /* simulate thread, direct call of "thread" function */
195: printf("*** run %d\n",i);
196: fire(&tdata);
197: }
198:
199:
200: /* fetch a another one */
201: printf("*** run %d\n", i);
202: curl = curl_easy_init();
203: if(!curl) {
204: fprintf(stderr, "curl_easy_init() failed\n");
205: curl_share_cleanup(share);
206: curl_global_cleanup();
207: return TEST_ERR_MAJOR_BAD;
208: }
209:
210: url = URL;
211: test_setopt(curl, CURLOPT_URL, url);
212: printf("CURLOPT_SHARE\n");
213: test_setopt(curl, CURLOPT_SHARE, share);
214:
215: printf("PERFORM\n");
216: curl_easy_perform(curl);
217:
218: /* try to free share, expect to fail because share is in use*/
219: printf("try SHARE_CLEANUP...\n");
220: scode = curl_share_cleanup(share);
221: if(scode == CURLSHE_OK) {
222: fprintf(stderr, "curl_share_cleanup succeed but error expected\n");
223: share = NULL;
224: }
225: else {
226: printf("SHARE_CLEANUP failed, correct\n");
227: }
228:
229: test_cleanup:
230:
231: /* clean up last handle */
232: printf("CLEANUP\n");
233: curl_easy_cleanup(curl);
234:
235: /* free share */
236: printf("SHARE_CLEANUP\n");
237: scode = curl_share_cleanup(share);
238: if(scode != CURLSHE_OK)
239: fprintf(stderr, "curl_share_cleanup failed, code errno %d\n",
240: (int)scode);
241:
242: printf("GLOBAL_CLEANUP\n");
243: curl_global_cleanup();
244:
245: return res;
246: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>