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

1.1       misho       1: /***************************************************************************
                      2:  *                                  _   _ ____  _
                      3:  *  Project                     ___| | | |  _ \| |
                      4:  *                             / __| | | | |_) | |
                      5:  *                            | (__| |_| |  _ <| |___
                      6:  *                             \___|\___/|_| \_\_____|
                      7:  *
                      8:  * Copyright (C) 1998 - 2019, 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: /*
                     23:  * See https://github.com/curl/curl/issues/3371
                     24:  *
                     25:  * This test case checks whether curl_multi_remove_handle() cancels
                     26:  * asynchronous DNS resolvers without blocking where possible.  Obviously, it
                     27:  * only tests whichever resolver cURL is actually built with.
                     28:  */
                     29: 
                     30: /* We're willing to wait a very generous two seconds for the removal.  This is
                     31:    as low as we can go while still easily supporting SIGALRM timing for the
                     32:    non-threaded blocking resolver.  It doesn't matter that much because when
                     33:    the test passes, we never wait this long. */
                     34: #define TEST_HANG_TIMEOUT 2 * 1000
                     35: 
                     36: #include "test.h"
                     37: #include "testutil.h"
                     38: 
                     39: #include <sys/stat.h>
                     40: 
                     41: int test(char *URL)
                     42: {
                     43:   int stillRunning;
                     44:   CURLM *multiHandle = NULL;
                     45:   CURL *curl = NULL;
                     46:   CURLMcode res = CURLM_OK;
                     47:   int timeout;
                     48: 
                     49:   global_init(CURL_GLOBAL_ALL);
                     50: 
                     51:   multi_init(multiHandle);
                     52: 
                     53:   easy_init(curl);
                     54: 
                     55:   easy_setopt(curl, CURLOPT_VERBOSE, 1L);
                     56:   easy_setopt(curl, CURLOPT_URL, URL);
                     57: 
                     58:   /* Set a DNS server that hopefully will not respond when using c-ares. */
                     59:   if(curl_easy_setopt(curl, CURLOPT_DNS_SERVERS, "0.0.0.0") == CURLE_OK)
                     60:     /* Since we could set the DNS server, presume we are working with a
                     61:        resolver that can be cancelled (i.e. c-ares).  Thus,
                     62:        curl_multi_remove_handle() should not block even when the resolver
                     63:        request is outstanding.  So, set a request timeout _longer_ than the
                     64:        test hang timeout so we will fail if the handle removal call incorrectly
                     65:        blocks. */
                     66:     timeout = TEST_HANG_TIMEOUT * 2;
                     67:   else {
                     68:     /* If we can't set the DNS server, presume that we are configured to use a
                     69:        resolver that can't be cancelled (i.e. the threaded resolver or the
                     70:        non-threaded blocking resolver).  So, we just test that the
                     71:        curl_multi_remove_handle() call does finish well within our test
                     72:        timeout.
                     73: 
                     74:        But, it is very unlikely that the resolver request will take any time at
                     75:        all because we haven't been able to configure the resolver to use an
                     76:        non-responsive DNS server.  At least we exercise the flow.
                     77:        */
                     78:     fprintf(stderr,
                     79:             "CURLOPT_DNS_SERVERS not supported; "
                     80:             "assuming curl_multi_remove_handle() will block\n");
                     81:     timeout = TEST_HANG_TIMEOUT / 2;
                     82:   }
                     83: 
                     84:   /* Setting a timeout on the request should ensure that even if we have to
                     85:      wait for the resolver during curl_multi_remove_handle(), it won't take
                     86:      longer than this, because the resolver request inherits its timeout from
                     87:      this. */
                     88:   easy_setopt(curl, CURLOPT_TIMEOUT_MS, timeout);
                     89: 
                     90:   multi_add_handle(multiHandle, curl);
                     91: 
                     92:   /* This should move the handle from INIT => CONNECT => WAITRESOLVE. */
                     93:   fprintf(stderr, "curl_multi_perform()...\n");
                     94:   multi_perform(multiHandle, &stillRunning);
                     95:   fprintf(stderr, "curl_multi_perform() succeeded\n");
                     96: 
                     97:   /* Start measuring how long it takes to remove the handle. */
                     98:   fprintf(stderr, "curl_multi_remove_handle()...\n");
                     99:   start_test_timing();
                    100:   res = curl_multi_remove_handle(multiHandle, curl);
                    101:   if(res) {
                    102:     fprintf(stderr, "curl_multi_remove_handle() failed, "
                    103:             "with code %d\n", (int)res);
                    104:     goto test_cleanup;
                    105:   }
                    106:   fprintf(stderr, "curl_multi_remove_handle() succeeded\n");
                    107: 
                    108:   /* Fail the test if it took too long to remove.  This happens after the fact,
                    109:      and says "it seems that it would have run forever", which isn't true, but
                    110:      it's close enough, and simple to do. */
                    111:   abort_on_test_timeout();
                    112: 
                    113: test_cleanup:
                    114:   curl_easy_cleanup(curl);
                    115:   curl_multi_cleanup(multiHandle);
                    116:   curl_global_cleanup();
                    117: 
                    118:   return (int)res;
                    119: }

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