Annotation of embedaddon/curl/tests/libtest/lib1900.c, revision 1.1.1.1

1.1       misho       1: /***************************************************************************
                      2:  *                                  _   _ ____  _
                      3:  *  Project                     ___| | | |  _ \| |
                      4:  *                             / __| | | | |_) | |
                      5:  *                            | (__| |_| |  _ <| |___
                      6:  *                             \___|\___/|_| \_\_____|
                      7:  *
                      8:  * Copyright (C) 2013 - 2019, Linus Nielsen Feltzing, <linus@haxx.se>
                      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: 
                     24: #include "testutil.h"
                     25: #include "warnless.h"
                     26: #include "memdebug.h"
                     27: 
                     28: #define TEST_HANG_TIMEOUT 60 * 1000
                     29: #define MAX_URLS 200
                     30: #define MAX_BLACKLIST 20
                     31: 
                     32: static int urltime[MAX_URLS];
                     33: static char *urlstring[MAX_URLS];
                     34: static CURL *handles[MAX_URLS];
                     35: static char *site_blacklist[MAX_BLACKLIST];
                     36: static char *server_blacklist[MAX_BLACKLIST];
                     37: static int num_handles;
                     38: static int blacklist_num_servers;
                     39: static int blacklist_num_sites;
                     40: 
                     41: static size_t
                     42: write_callback(void *contents, size_t size, size_t nmemb, void *userp)
                     43: {
                     44:   size_t realsize = size * nmemb;
                     45:   (void)contents;
                     46:   (void)userp;
                     47: 
                     48:   return realsize;
                     49: }
                     50: 
                     51: static int parse_url_file(const char *filename)
                     52: {
                     53:   FILE *f;
                     54:   int filetime;
                     55:   char buf[200];
                     56: 
                     57:   num_handles = 0;
                     58:   blacklist_num_sites = 0;
                     59:   blacklist_num_servers = 0;
                     60: 
                     61:   f = fopen(filename, "rb");
                     62:   if(!f)
                     63:     return 0;
                     64: 
                     65:   while(!feof(f)) {
                     66:     if(fscanf(f, "%d %199s\n", &filetime, buf)) {
                     67:       urltime[num_handles] = filetime;
                     68:       urlstring[num_handles] = strdup(buf);
                     69:       num_handles++;
                     70:       continue;
                     71:     }
                     72: 
                     73:     if(fscanf(f, "blacklist_site %199s\n", buf)) {
                     74:       site_blacklist[blacklist_num_sites] = strdup(buf);
                     75:       blacklist_num_sites++;
                     76:       continue;
                     77:     }
                     78: 
                     79:     break;
                     80:   }
                     81:   fclose(f);
                     82: 
                     83:   site_blacklist[blacklist_num_sites] = NULL;
                     84:   server_blacklist[blacklist_num_servers] = NULL;
                     85:   return num_handles;
                     86: }
                     87: 
                     88: static void free_urls(void)
                     89: {
                     90:   int i;
                     91:   for(i = 0; i < num_handles; i++) {
                     92:     Curl_safefree(urlstring[i]);
                     93:   }
                     94:   for(i = 0; i < blacklist_num_servers; i++) {
                     95:     Curl_safefree(server_blacklist[i]);
                     96:   }
                     97:   for(i = 0; i < blacklist_num_sites; i++) {
                     98:     Curl_safefree(site_blacklist[i]);
                     99:   }
                    100: }
                    101: 
                    102: static int create_handles(void)
                    103: {
                    104:   int i;
                    105: 
                    106:   for(i = 0; i < num_handles; i++) {
                    107:     handles[i] = curl_easy_init();
                    108:   }
                    109:   return 0;
                    110: }
                    111: 
                    112: static void setup_handle(char *base_url, CURLM *m, int handlenum)
                    113: {
                    114:   char urlbuf[256];
                    115: 
                    116:   msnprintf(urlbuf, sizeof(urlbuf), "%s%s", base_url, urlstring[handlenum]);
                    117:   curl_easy_setopt(handles[handlenum], CURLOPT_URL, urlbuf);
                    118:   curl_easy_setopt(handles[handlenum], CURLOPT_VERBOSE, 1L);
                    119:   curl_easy_setopt(handles[handlenum], CURLOPT_FAILONERROR, 1L);
                    120:   curl_easy_setopt(handles[handlenum], CURLOPT_WRITEFUNCTION, write_callback);
                    121:   curl_easy_setopt(handles[handlenum], CURLOPT_WRITEDATA, NULL);
                    122:   curl_multi_add_handle(m, handles[handlenum]);
                    123: }
                    124: 
                    125: static void remove_handles(void)
                    126: {
                    127:   int i;
                    128: 
                    129:   for(i = 0; i < num_handles; i++) {
                    130:     if(handles[i])
                    131:       curl_easy_cleanup(handles[i]);
                    132:   }
                    133: }
                    134: 
                    135: int test(char *URL)
                    136: {
                    137:   int res = 0;
                    138:   CURLM *m = NULL;
                    139:   CURLMsg *msg; /* for picking up messages with the transfer status */
                    140:   int msgs_left; /* how many messages are left */
                    141:   int running = 0;
                    142:   int handlenum = 0;
                    143:   struct timeval last_handle_add;
                    144: 
                    145:   if(parse_url_file(libtest_arg2) <= 0)
                    146:     goto test_cleanup;
                    147: 
                    148:   start_test_timing();
                    149: 
                    150:   curl_global_init(CURL_GLOBAL_ALL);
                    151: 
                    152:   multi_init(m);
                    153: 
                    154:   create_handles();
                    155: 
                    156:   multi_setopt(m, CURLMOPT_PIPELINING, 1L);
                    157:   multi_setopt(m, CURLMOPT_MAX_HOST_CONNECTIONS, 2L);
                    158:   multi_setopt(m, CURLMOPT_MAX_PIPELINE_LENGTH, 3L);
                    159:   multi_setopt(m, CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, 15000L);
                    160:   multi_setopt(m, CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE, 10000L);
                    161: 
                    162:   multi_setopt(m, CURLMOPT_PIPELINING_SITE_BL, site_blacklist);
                    163:   multi_setopt(m, CURLMOPT_PIPELINING_SERVER_BL, server_blacklist);
                    164: 
                    165:   last_handle_add = tutil_tvnow();
                    166: 
                    167:   for(;;) {
                    168:     struct timeval interval;
                    169:     struct timeval now;
                    170:     fd_set rd, wr, exc;
                    171:     int maxfd = -99;
                    172:     long timeout;
                    173: 
                    174:     interval.tv_sec = 1;
                    175:     interval.tv_usec = 0;
                    176: 
                    177:     if(handlenum < num_handles) {
                    178:       now = tutil_tvnow();
                    179:       if(tutil_tvdiff(now, last_handle_add) >= urltime[handlenum]) {
                    180:         fprintf(stdout, "Adding handle %d\n", handlenum);
                    181:         setup_handle(URL, m, handlenum);
                    182:         last_handle_add = now;
                    183:         handlenum++;
                    184:       }
                    185:     }
                    186: 
                    187:     curl_multi_perform(m, &running);
                    188: 
                    189:     abort_on_test_timeout();
                    190: 
                    191:     /* See how the transfers went */
                    192:     do {
                    193:       msg = curl_multi_info_read(m, &msgs_left);
                    194:       if(msg && msg->msg == CURLMSG_DONE) {
                    195:         int i;
                    196: 
                    197:         /* Find out which handle this message is about */
                    198:         for(i = 0; i < num_handles; i++) {
                    199:           int found = (msg->easy_handle == handles[i]);
                    200:           if(found)
                    201:             break;
                    202:         }
                    203: 
                    204:         printf("Handle %d Completed with status %d\n", i, msg->data.result);
                    205:         curl_multi_remove_handle(m, handles[i]);
                    206:       }
                    207:     } while(msg);
                    208: 
                    209:     if(handlenum == num_handles && !running) {
                    210:       break; /* done */
                    211:     }
                    212: 
                    213:     FD_ZERO(&rd);
                    214:     FD_ZERO(&wr);
                    215:     FD_ZERO(&exc);
                    216: 
                    217:     curl_multi_fdset(m, &rd, &wr, &exc, &maxfd);
                    218: 
                    219:     /* At this point, maxfd is guaranteed to be greater or equal than -1. */
                    220: 
                    221:     curl_multi_timeout(m, &timeout);
                    222: 
                    223:     if(timeout < 0)
                    224:       timeout = 1;
                    225: 
                    226:     interval.tv_sec = timeout / 1000;
                    227:     interval.tv_usec = (timeout % 1000) * 1000;
                    228: 
                    229:     interval.tv_sec = 0;
                    230:     interval.tv_usec = 1000;
                    231: 
                    232:     select_test(maxfd + 1, &rd, &wr, &exc, &interval);
                    233: 
                    234:     abort_on_test_timeout();
                    235:   }
                    236: 
                    237: test_cleanup:
                    238: 
                    239:   remove_handles();
                    240: 
                    241:   /* undocumented cleanup sequence - type UB */
                    242: 
                    243:   curl_multi_cleanup(m);
                    244:   curl_global_cleanup();
                    245: 
                    246:   free_urls();
                    247:   return res;
                    248: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>