diff --git a/tests/data/test2405 b/tests/data/test2405 index 0d64ec458a..6ccb6ba394 100644 --- a/tests/data/test2405 +++ b/tests/data/test2405 @@ -4,7 +4,6 @@ multi HTTP -flaky diff --git a/tests/data/test2407 b/tests/data/test2407 index 33555a8502..b9f17bb22f 100644 --- a/tests/data/test2407 +++ b/tests/data/test2407 @@ -5,7 +5,6 @@ multi HTTP HTTP/2 -flaky diff --git a/tests/libtest/lib2405.c b/tests/libtest/lib2405.c index 412faf45a0..6d98183a83 100644 --- a/tests/libtest/lib2405.c +++ b/tests/libtest/lib2405.c @@ -41,24 +41,6 @@ /* ---------------------------------------------------------------- */ -#define test_check(expected_fds) \ - if(result != CURLE_OK) { \ - curl_mfprintf(stderr, "test failed with code: %d\n", (int)result); \ - goto test_cleanup; \ - } \ - else if(fd_count != (expected_fds)) { \ - curl_mfprintf(stderr, "Max number of waitfds: %u not as expected: %u\n", \ - fd_count, expected_fds); \ - result = TEST_ERR_FAILURE; \ - goto test_cleanup; \ - } - -#define test_run_check(option, expected_fds) \ - do { \ - result = test_run(URL, option, &fd_count); \ - test_check(expected_fds); \ - } while(0) - /* ---------------------------------------------------------------- */ enum { @@ -302,6 +284,22 @@ test_cleanup: return result; } +static CURLcode test_run_check(const char *URL, long option, + unsigned int expected_fds) +{ + unsigned int fd_count = 0; + CURLcode result = test_run(URL, option, &fd_count); + if(result) + curl_mfprintf(stderr, "test failed with code: %d\n", (int)result); + else if(fd_count != expected_fds) { + curl_mfprintf(stderr, + "Max number of waitfds: %u not as expected: %u\n", + fd_count, expected_fds); + result = TEST_ERR_FAILURE; + } + return result; +} + static CURLcode empty_multi_test(void) { CURLMcode mresult = CURLM_OK; @@ -360,29 +358,50 @@ test_cleanup: return result; } +static unsigned int uses_threaded(void) +{ + curl_version_info_data *ver = curl_version_info(CURLVERSION_NOW); + const char * const *n = ver->feature_names; + int i; + unsigned int uses = 0; + /* the 'asyn-rr' feature tells us libcurl uses the threaded resolver */ + for(i = 0; n[i]; i++) { + if(!strcmp("asyn-rr", n[i])) + uses = 1; + } + /* if not using asyn-rr, check if doing asynch DNS without using c-ares */ + if(!uses && (ver->features & CURL_VERSION_ASYNCHDNS) && !ver->ares) + uses = 1; + return uses; +} + static CURLcode test_lib2405(const char *URL) { CURLcode result = CURLE_OK; - unsigned int fd_count = 0; + int uses_threaded_resolver; global_init(CURL_GLOBAL_ALL); + uses_threaded_resolver = uses_threaded(); + /* Testing curl_multi_waitfds on empty and not started handles */ result = empty_multi_test(); if(result != CURLE_OK) goto test_cleanup; if(testnum == 2405) { - /* HTTP1, expected 3 waitfds - one for each transfer + wakeup */ - test_run_check(TEST_USE_HTTP1, 3U); + /* HTTP1, one for each transfer + possible wakeup */ + result = test_run_check(URL, TEST_USE_HTTP1, 2 + uses_threaded_resolver); } #ifdef USE_HTTP2 else { /* 2407 */ - /* HTTP2, expected 3 waitfds - one for each transfer + wakeup */ - test_run_check(TEST_USE_HTTP2, 3U); + /* HTTP2, one for each transfer + possible wakeup */ + result = test_run_check(URL, TEST_USE_HTTP2, 2 + uses_threaded_resolver); - /* HTTP2 with multiplexing, expected 2 waitfds - transfers + wakeup */ - test_run_check(TEST_USE_HTTP2_MPLEX, 2U); + /* HTTP2 with multiplexing, expected one waitfds + possible wakeup */ + if(!result) + result = test_run_check(URL, TEST_USE_HTTP2_MPLEX, + 1 + uses_threaded_resolver); } #endif