Annotation of embedaddon/curl/tests/libtest/lib586.c, revision 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>