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>