etlegacy-libs/curl/tests/libtest/lib586.c

247 lines
6 KiB
C
Raw Normal View History

2012-06-01 15:23:17 +00:00
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
2018-02-04 17:52:34 +00:00
* Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
2012-06-01 15:23:17 +00:00
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
2016-09-16 04:29:17 +00:00
* are also available at https://curl.haxx.se/docs/copyright.html.
2012-06-01 15:23:17 +00:00
*
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
* copies of the Software, and permit persons to whom the Software is
* furnished to do so, under the terms of the COPYING file.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
***************************************************************************/
#include "test.h"
#include "memdebug.h"
#define THREADS 2
/* struct containing data of a thread */
struct Tdata {
CURLSH *share;
char *url;
};
struct userdata {
2017-07-01 14:06:24 +00:00
const char *text;
2012-06-01 15:23:17 +00:00
int counter;
};
/* lock callback */
2016-09-16 04:29:17 +00:00
static void my_lock(CURL *handle, curl_lock_data data,
curl_lock_access laccess, void *useptr)
2012-06-01 15:23:17 +00:00
{
const char *what;
struct userdata *user = (struct userdata *)useptr;
(void)handle;
(void)laccess;
2017-03-02 22:46:25 +00:00
switch(data) {
2012-06-01 15:23:17 +00:00
case CURL_LOCK_DATA_SHARE:
what = "share";
break;
case CURL_LOCK_DATA_DNS:
what = "dns";
break;
case CURL_LOCK_DATA_COOKIE:
what = "cookie";
break;
case CURL_LOCK_DATA_SSL_SESSION:
what = "ssl_session";
break;
default:
fprintf(stderr, "lock: no such data: %d\n", (int)data);
return;
}
printf("lock: %-6s [%s]: %d\n", what, user->text, user->counter);
user->counter++;
}
/* unlock callback */
2016-09-16 04:29:17 +00:00
static void my_unlock(CURL *handle, curl_lock_data data, void *useptr)
2012-06-01 15:23:17 +00:00
{
const char *what;
struct userdata *user = (struct userdata *)useptr;
(void)handle;
2017-03-02 22:46:25 +00:00
switch(data) {
2012-06-01 15:23:17 +00:00
case CURL_LOCK_DATA_SHARE:
what = "share";
break;
case CURL_LOCK_DATA_DNS:
what = "dns";
break;
case CURL_LOCK_DATA_COOKIE:
what = "cookie";
break;
case CURL_LOCK_DATA_SSL_SESSION:
what = "ssl_session";
break;
default:
fprintf(stderr, "unlock: no such data: %d\n", (int)data);
return;
}
printf("unlock: %-6s [%s]: %d\n", what, user->text, user->counter);
user->counter++;
}
/* the dummy thread function */
static void *fire(void *ptr)
{
CURLcode code;
struct Tdata *tdata = (struct Tdata*)ptr;
CURL *curl;
2017-03-02 22:46:25 +00:00
curl = curl_easy_init();
if(!curl) {
2012-06-01 15:23:17 +00:00
fprintf(stderr, "curl_easy_init() failed\n");
return NULL;
}
2016-09-16 04:29:17 +00:00
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
2012-06-01 15:23:17 +00:00
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_URL, tdata->url);
2016-09-16 04:29:17 +00:00
printf("CURLOPT_SHARE\n");
2012-06-01 15:23:17 +00:00
curl_easy_setopt(curl, CURLOPT_SHARE, tdata->share);
2016-09-16 04:29:17 +00:00
printf("PERFORM\n");
2012-06-01 15:23:17 +00:00
code = curl_easy_perform(curl);
2016-09-16 04:29:17 +00:00
if(code != CURLE_OK) {
2018-07-15 15:57:46 +00:00
int i = 0;
2012-06-01 15:23:17 +00:00
fprintf(stderr, "perform url '%s' repeat %d failed, curlcode %d\n",
tdata->url, i, (int)code);
}
2016-09-16 04:29:17 +00:00
printf("CLEANUP\n");
2012-06-01 15:23:17 +00:00
curl_easy_cleanup(curl);
return NULL;
}
/* test function */
int test(char *URL)
{
int res;
CURLSHcode scode = CURLSHE_OK;
char *url;
struct Tdata tdata;
CURL *curl;
CURLSH *share;
int i;
struct userdata user;
2017-07-01 14:06:24 +00:00
user.text = "Pigs in space";
2012-06-01 15:23:17 +00:00
user.counter = 0;
2016-09-16 04:29:17 +00:00
printf("GLOBAL_INIT\n");
if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
2012-06-01 15:23:17 +00:00
fprintf(stderr, "curl_global_init() failed\n");
return TEST_ERR_MAJOR_BAD;
}
/* prepare share */
2016-09-16 04:29:17 +00:00
printf("SHARE_INIT\n");
2017-03-02 22:46:25 +00:00
share = curl_share_init();
if(!share) {
2012-06-01 15:23:17 +00:00
fprintf(stderr, "curl_share_init() failed\n");
curl_global_cleanup();
return TEST_ERR_MAJOR_BAD;
}
2016-09-16 04:29:17 +00:00
if(CURLSHE_OK == scode) {
printf("CURLSHOPT_LOCKFUNC\n");
scode = curl_share_setopt(share, CURLSHOPT_LOCKFUNC, my_lock);
2012-06-01 15:23:17 +00:00
}
2016-09-16 04:29:17 +00:00
if(CURLSHE_OK == scode) {
printf("CURLSHOPT_UNLOCKFUNC\n");
scode = curl_share_setopt(share, CURLSHOPT_UNLOCKFUNC, my_unlock);
2012-06-01 15:23:17 +00:00
}
2016-09-16 04:29:17 +00:00
if(CURLSHE_OK == scode) {
printf("CURLSHOPT_USERDATA\n");
scode = curl_share_setopt(share, CURLSHOPT_USERDATA, &user);
2012-06-01 15:23:17 +00:00
}
2016-09-16 04:29:17 +00:00
if(CURLSHE_OK == scode) {
printf("CURL_LOCK_DATA_SSL_SESSION\n");
scode = curl_share_setopt(share, CURLSHOPT_SHARE,
CURL_LOCK_DATA_SSL_SESSION);
2012-06-01 15:23:17 +00:00
}
2016-09-16 04:29:17 +00:00
if(CURLSHE_OK != scode) {
2012-06-01 15:23:17 +00:00
fprintf(stderr, "curl_share_setopt() failed\n");
curl_share_cleanup(share);
curl_global_cleanup();
return TEST_ERR_MAJOR_BAD;
}
res = 0;
/* start treads */
2018-02-04 17:52:34 +00:00
for(i = 1; i <= THREADS; i++) {
2012-06-01 15:23:17 +00:00
/* set thread data */
tdata.url = URL;
tdata.share = share;
/* simulate thread, direct call of "thread" function */
2016-09-16 04:29:17 +00:00
printf("*** run %d\n",i);
fire(&tdata);
2012-06-01 15:23:17 +00:00
}
/* fetch a another one */
2016-09-16 04:29:17 +00:00
printf("*** run %d\n", i);
2017-03-02 22:46:25 +00:00
curl = curl_easy_init();
if(!curl) {
2012-06-01 15:23:17 +00:00
fprintf(stderr, "curl_easy_init() failed\n");
curl_share_cleanup(share);
curl_global_cleanup();
return TEST_ERR_MAJOR_BAD;
}
url = URL;
2016-09-16 04:29:17 +00:00
test_setopt(curl, CURLOPT_URL, url);
printf("CURLOPT_SHARE\n");
test_setopt(curl, CURLOPT_SHARE, share);
2012-06-01 15:23:17 +00:00
2016-09-16 04:29:17 +00:00
printf("PERFORM\n");
curl_easy_perform(curl);
2012-06-01 15:23:17 +00:00
/* try to free share, expect to fail because share is in use*/
2016-09-16 04:29:17 +00:00
printf("try SHARE_CLEANUP...\n");
scode = curl_share_cleanup(share);
2018-02-04 17:52:34 +00:00
if(scode == CURLSHE_OK) {
2012-06-01 15:23:17 +00:00
fprintf(stderr, "curl_share_cleanup succeed but error expected\n");
share = NULL;
2016-09-16 04:29:17 +00:00
}
else {
printf("SHARE_CLEANUP failed, correct\n");
2012-06-01 15:23:17 +00:00
}
test_cleanup:
/* clean up last handle */
2016-09-16 04:29:17 +00:00
printf("CLEANUP\n");
curl_easy_cleanup(curl);
2012-06-01 15:23:17 +00:00
/* free share */
2016-09-16 04:29:17 +00:00
printf("SHARE_CLEANUP\n");
scode = curl_share_cleanup(share);
2018-02-04 17:52:34 +00:00
if(scode != CURLSHE_OK)
2012-06-01 15:23:17 +00:00
fprintf(stderr, "curl_share_cleanup failed, code errno %d\n",
(int)scode);
2016-09-16 04:29:17 +00:00
printf("GLOBAL_CLEANUP\n");
2012-06-01 15:23:17 +00:00
curl_global_cleanup();
return res;
}