diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 2d5721f1ec..021b9dc15b 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -357,7 +357,6 @@ jobs: fi if [ "${MATRIX_BUILD}" != 'cmake' ]; then # avoid libtool's .exe wrappers for shared builds - mv bld/tests/client/.libs/*.exe bld/tests/client || true mv bld/tests/libtest/.libs/*.exe bld/tests/libtest || true mv bld/tests/server/.libs/*.exe bld/tests/server || true mv bld/tests/tunit/.libs/*.exe bld/tests/tunit || true diff --git a/configure.ac b/configure.ac index dae3e9e99e..07403294b8 100644 --- a/configure.ac +++ b/configure.ac @@ -5463,7 +5463,6 @@ AC_CONFIG_FILES([\ tests/libtest/Makefile \ tests/unit/Makefile \ tests/tunit/Makefile \ - tests/client/Makefile \ tests/http/config.ini \ tests/http/Makefile \ packages/Makefile \ diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 3e32e549ac..cc812583c7 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -40,7 +40,6 @@ if(CURL_CLANG_TIDY) endif() add_subdirectory(http) -add_subdirectory(client) add_subdirectory(server) add_subdirectory(libtest) add_subdirectory(tunit) @@ -84,7 +83,7 @@ function(curl_add_pytests _targetname _test_flags) if(BUILD_CURL_EXE) list(APPEND _depends ${EXE_NAME}) endif() - list(APPEND _depends "clients") + list(APPEND _depends "libtests") endif() string(REPLACE " " ";" _test_flags_list "${_test_flags}") add_custom_target(${_targetname} diff --git a/tests/Makefile.am b/tests/Makefile.am index 4978b059f9..363a8562a8 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -95,7 +95,7 @@ BUILD_UNIT = DIST_UNIT = unit tunit endif -SUBDIRS = certs data server libtest client http $(BUILD_UNIT) +SUBDIRS = certs data server libtest http $(BUILD_UNIT) DIST_SUBDIRS = $(SUBDIRS) $(DIST_UNIT) PERLFLAGS = -I$(srcdir) diff --git a/tests/client/.gitignore b/tests/client/.gitignore deleted file mode 100644 index da4c5ea43e..0000000000 --- a/tests/client/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (C) Daniel Stenberg, , et al. -# -# SPDX-License-Identifier: curl - -clients -clients.c diff --git a/tests/client/CMakeLists.txt b/tests/client/CMakeLists.txt deleted file mode 100644 index c1821f6398..0000000000 --- a/tests/client/CMakeLists.txt +++ /dev/null @@ -1,51 +0,0 @@ -#*************************************************************************** -# _ _ ____ _ -# Project ___| | | | _ \| | -# / __| | | | |_) | | -# | (__| |_| | _ <| |___ -# \___|\___/|_| \_\_____| -# -# Copyright (C) Daniel Stenberg, , et al. -# -# This software is licensed as described in the file COPYING, which -# you should have received as part of this distribution. The terms -# are also available at https://curl.se/docs/copyright.html. -# -# You may opt to use, copy, modify, merge, publish, distribute and/or sell -# copies of the Software, and permit persons to whom the Software is -# furnished to do so, under the terms of the COPYING file. -# -# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY -# KIND, either express or implied. -# -# SPDX-License-Identifier: curl -# -########################################################################### - -# Get BUNDLE, FIRST_C, FIRST_H, CURLX_C, TESTS_C variables -curl_transform_makefile_inc("Makefile.inc" "${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake") -include("${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake") - -if(LIB_SELECTED STREQUAL LIB_STATIC) - set(CURLX_C "") # Already exported from the libcurl static build. Skip them. -endif() - -add_custom_command(OUTPUT "${BUNDLE}.c" - COMMAND ${PERL_EXECUTABLE} "${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl" - --include ${CURLX_C} --test ${TESTS_C} > "${BUNDLE}.c" - DEPENDS - "${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl" "${CMAKE_CURRENT_SOURCE_DIR}/Makefile.inc" - ${FIRST_C} ${CURLX_C} ${TESTS_C} - VERBATIM) - -add_executable(${BUNDLE} EXCLUDE_FROM_ALL "${BUNDLE}.c") -add_dependencies(testdeps ${BUNDLE}) -target_link_libraries(${BUNDLE} ${LIB_SELECTED} ${CURL_LIBS}) -target_include_directories(${BUNDLE} PRIVATE - "${PROJECT_BINARY_DIR}/lib" # for "curl_config.h" - "${PROJECT_SOURCE_DIR}/lib" # for "curl_setup.h", curlx - "${CMAKE_CURRENT_SOURCE_DIR}" # for the generated bundle source to find included test sources -) -set_target_properties(${BUNDLE} PROPERTIES OUTPUT_NAME "${BUNDLE}" PROJECT_LABEL "Test ${BUNDLE}" UNITY_BUILD OFF C_CLANG_TIDY "") - -curl_add_clang_tidy_test_target("${BUNDLE}-clang-tidy" ${BUNDLE} ${FIRST_C} ${TESTS_C}) diff --git a/tests/client/Makefile.am b/tests/client/Makefile.am deleted file mode 100644 index f20e63aa08..0000000000 --- a/tests/client/Makefile.am +++ /dev/null @@ -1,84 +0,0 @@ -#*************************************************************************** -# _ _ ____ _ -# Project ___| | | | _ \| | -# / __| | | | |_) | | -# | (__| |_| | _ <| |___ -# \___|\___/|_| \_\_____| -# -# Copyright (C) Daniel Stenberg, , et al. -# -# This software is licensed as described in the file COPYING, which -# you should have received as part of this distribution. The terms -# are also available at https://curl.se/docs/copyright.html. -# -# You may opt to use, copy, modify, merge, publish, distribute and/or sell -# copies of the Software, and permit persons to whom the Software is -# furnished to do so, under the terms of the COPYING file. -# -# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY -# KIND, either express or implied. -# -# SPDX-License-Identifier: curl -# -########################################################################### -AUTOMAKE_OPTIONS = foreign nostdinc - -# Specify our include paths here, and do it relative to $(top_srcdir) and -# $(top_builddir), to ensure that these paths which belong to the library -# being currently built and tested are searched before the library which -# might possibly already be installed in the system. -# -# $(top_srcdir)/include is for libcurl's external include files -# $(top_builddir)/lib is for libcurl's generated lib/curl_config.h file -# $(top_srcdir)/lib for libcurl's lib/curl_setup.h and other "borrowed" files -# $(srcdir) for the generated bundle source to find included test sources - -AM_CPPFLAGS = -I$(top_srcdir)/include \ - -I$(top_builddir)/lib \ - -I$(top_srcdir)/lib \ - -I$(srcdir) - -# Get BUNDLE, FIRST_C, FIRST_H, CURLX_C, TESTS_C variables -include Makefile.inc - -EXTRA_DIST = CMakeLists.txt $(FIRST_C) $(FIRST_H) $(TESTS_C) - -CFLAGS += @CURL_CFLAG_EXTRAS@ - -# Prevent LIBS from being used for all link targets -LIBS = $(BLANK_AT_MAKETIME) - -if USE_CPPFLAG_CURL_STATICLIB -AM_CPPFLAGS += -DCURL_STATICLIB -endif - -if USE_CPPFLAG_CURL_STATICLIB -curlx_c_lib = -else -# These are part of the libcurl static lib. Add them here when linking shared. -curlx_c_lib = $(CURLX_C) -endif -$(BUNDLE).c: $(top_srcdir)/scripts/mk-unity.pl Makefile.inc $(FIRST_C) $(curlx_c_lib) $(TESTS_C) - @PERL@ $(top_srcdir)/scripts/mk-unity.pl --include $(curlx_c_lib) --test $(TESTS_C) > $(BUNDLE).c - -noinst_PROGRAMS = $(BUNDLE) -LDADD = $(top_builddir)/lib/libcurl.la @LIBCURL_PC_LIBS_PRIVATE@ -CLEANFILES = $(BUNDLE).c - -CHECKSRC = $(CS_$(V)) -CS_0 = @echo " RUN " $@; -CS_1 = -CS_ = $(CS_0) - -# ignore generated C files since they play by slightly different rules! -checksrc: - $(CHECKSRC)(@PERL@ $(top_srcdir)/scripts/checksrc.pl -D$(srcdir) \ - -W$(srcdir)/$(BUNDLE).c \ - $(srcdir)/*.[ch]) - -if NOT_CURL_CI -all-local: checksrc -endif - -clean-local: - rm -f $(BUNDLE) diff --git a/tests/client/Makefile.inc b/tests/client/Makefile.inc deleted file mode 100644 index 4ffe354e75..0000000000 --- a/tests/client/Makefile.inc +++ /dev/null @@ -1,47 +0,0 @@ -#*************************************************************************** -# _ _ ____ _ -# Project ___| | | | _ \| | -# / __| | | | |_) | | -# | (__| |_| | _ <| |___ -# \___|\___/|_| \_\_____| -# -# Copyright (C) Daniel Stenberg, , et al. -# -# This software is licensed as described in the file COPYING, which -# you should have received as part of this distribution. The terms -# are also available at https://curl.se/docs/copyright.html. -# -# You may opt to use, copy, modify, merge, publish, distribute and/or sell -# copies of the Software, and permit persons to whom the Software is -# furnished to do so, under the terms of the COPYING file. -# -# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY -# KIND, either express or implied. -# -# SPDX-License-Identifier: curl -# -########################################################################### -# Shared between CMakeLists.txt and Makefile.am - -BUNDLE = clients - -# Files referenced from the bundle source -FIRST_C = first.c -FIRST_H = first.h - -CURLX_C = \ - ../../lib/curlx/multibyte.c \ - ../../lib/curlx/timediff.c \ - ../../lib/curlx/wait.c - -# All test clients -TESTS_C = \ - h2_pausing.c \ - h2_serverpush.c \ - h2_upgrade_extreme.c \ - hx_download.c \ - hx_upload.c \ - tls_session_reuse.c \ - upload_pausing.c \ - ws_data.c \ - ws_pingpong.c diff --git a/tests/client/first.c b/tests/client/first.c deleted file mode 100644 index 55d2e4b315..0000000000 --- a/tests/client/first.c +++ /dev/null @@ -1,52 +0,0 @@ -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) Daniel Stenberg, , et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://curl.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - * SPDX-License-Identifier: curl - * - ***************************************************************************/ -#include "first.h" - -int main(int argc, char **argv) -{ - entry_func_t entry_func; - char *entry_name; - size_t tmp; - - if(argc < 2) { - curl_mfprintf(stderr, "Pass clientname as first argument\n"); - return 1; - } - - entry_name = argv[1]; - entry_func = NULL; - for(tmp = 0; s_entries[tmp].ptr; ++tmp) { - if(strcmp(entry_name, s_entries[tmp].name) == 0) { - entry_func = s_entries[tmp].ptr; - break; - } - } - - if(!entry_func) { - curl_mfprintf(stderr, "Test '%s' not found.\n", entry_name); - return 99; - } - - return entry_func(argc - 1, argv + 1); -} diff --git a/tests/client/first.h b/tests/client/first.h deleted file mode 100644 index 3c6e5bfc22..0000000000 --- a/tests/client/first.h +++ /dev/null @@ -1,268 +0,0 @@ -#ifndef HEADER_CLIENT_FIRST_H -#define HEADER_CLIENT_FIRST_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) Daniel Stenberg, , et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://curl.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - * SPDX-License-Identifier: curl - * - ***************************************************************************/ -#define CURL_NO_OLDIES - -#include "curl_setup.h" - -typedef int (*entry_func_t)(int, char **); - -struct entry_s { - const char *name; - entry_func_t ptr; -}; - -extern const struct entry_s s_entries[]; - -#include - -#include - -#define ERR() \ - do { \ - curl_mfprintf(stderr, "something unexpected went wrong - bailing out!\n");\ - return 2; \ - } while(0) - -static void log_line_start(FILE *log, const char *idsbuf, curl_infotype type) -{ - /* - * This is the trace look that is similar to what libcurl makes on its - * own. - */ - static const char * const s_infotype[] = { - "* ", "< ", "> ", "{ ", "} ", "{ ", "} " - }; - if(idsbuf && *idsbuf) - curl_mfprintf(log, "%s%s", idsbuf, s_infotype[type]); - else - fputs(s_infotype[type], log); -} - -#define TRC_IDS_FORMAT_IDS_1 "[%" CURL_FORMAT_CURL_OFF_T "-x] " -#define TRC_IDS_FORMAT_IDS_2 "[%" CURL_FORMAT_CURL_OFF_T "-%" \ - CURL_FORMAT_CURL_OFF_T "] " -/* -** callback for CURLOPT_DEBUGFUNCTION -*/ -static int debug_cb(CURL *handle, curl_infotype type, - char *data, size_t size, void *userdata) -{ - FILE *output = stderr; - static int newl = 0; - static int traced_data = 0; - char idsbuf[60]; - curl_off_t xfer_id, conn_id; - - (void)handle; /* not used */ - (void)userdata; - - if(!curl_easy_getinfo(handle, CURLINFO_XFER_ID, &xfer_id) && xfer_id >= 0) { - if(!curl_easy_getinfo(handle, CURLINFO_CONN_ID, &conn_id) && - conn_id >= 0) { - curl_msnprintf(idsbuf, sizeof(idsbuf), TRC_IDS_FORMAT_IDS_2, xfer_id, - conn_id); - } - else { - curl_msnprintf(idsbuf, sizeof(idsbuf), TRC_IDS_FORMAT_IDS_1, xfer_id); - } - } - else - idsbuf[0] = 0; - - switch(type) { - case CURLINFO_HEADER_OUT: - if(size > 0) { - size_t st = 0; - size_t i; - for(i = 0; i < size - 1; i++) { - if(data[i] == '\n') { /* LF */ - if(!newl) { - log_line_start(output, idsbuf, type); - } - (void)fwrite(data + st, i - st + 1, 1, output); - st = i + 1; - newl = 0; - } - } - if(!newl) - log_line_start(output, idsbuf, type); - (void)fwrite(data + st, i - st + 1, 1, output); - } - newl = (size && (data[size - 1] != '\n')) ? 1 : 0; - traced_data = 0; - break; - case CURLINFO_TEXT: - case CURLINFO_HEADER_IN: - if(!newl) - log_line_start(output, idsbuf, type); - (void)fwrite(data, size, 1, output); - newl = (size && (data[size - 1] != '\n')) ? 1 : 0; - traced_data = 0; - break; - case CURLINFO_DATA_OUT: - case CURLINFO_DATA_IN: - case CURLINFO_SSL_DATA_IN: - case CURLINFO_SSL_DATA_OUT: - if(!traced_data) { - if(!newl) - log_line_start(output, idsbuf, type); - curl_mfprintf(output, "[%ld bytes data]\n", (long)size); - newl = 0; - traced_data = 1; - } - break; - default: /* nada */ - newl = 0; - traced_data = 1; - break; - } - - return 0; -} - -static void dump(const char *text, unsigned char *ptr, size_t size, char nohex) -{ - size_t i; - size_t c; - - unsigned int width = 0x10; - - if(nohex) - /* without the hex output, we can fit more on screen */ - width = 0x40; - - curl_mfprintf(stderr, "%s, %lu bytes (0x%lx)\n", - text, (unsigned long)size, (unsigned long)size); - - for(i = 0; i < size; i += width) { - - curl_mfprintf(stderr, "%4.4lx: ", (unsigned long)i); - - if(!nohex) { - /* hex not disabled, show it */ - for(c = 0; c < width; c++) - if(i + c < size) - curl_mfprintf(stderr, "%02x ", ptr[i + c]); - else - fputs(" ", stderr); - } - - for(c = 0; (c < width) && (i + c < size); c++) { - /* check for 0D0A; if found, skip past and start a new line of output */ - if(nohex && (i + c + 1 < size) && ptr[i + c] == 0x0D && - ptr[i + c + 1] == 0x0A) { - i += (c + 2 - width); - break; - } - curl_mfprintf(stderr, "%c", - (ptr[i + c] >= 0x20) && (ptr[i + c] < 0x80) ? ptr[i + c] : '.'); - /* check again for 0D0A, to avoid an extra \n if it's at width */ - if(nohex && (i + c + 2 < size) && ptr[i + c + 1] == 0x0D && - ptr[i + c + 2] == 0x0A) { - i += (c + 3 - width); - break; - } - } - fputc('\n', stderr); /* newline */ - } -} - -#ifndef CURL_DISABLE_WEBSOCKETS -/* just close the connection */ -static void websocket_close(CURL *curl) -{ - size_t sent; - CURLcode result = - curl_ws_send(curl, "", 0, &sent, 0, CURLWS_CLOSE); - curl_mfprintf(stderr, "ws: curl_ws_send returned %u, sent %u\n", - (int)result, (int)sent); -} -#endif /* CURL_DISABLE_WEBSOCKETS */ - -static int coptind; -static char *coptarg; - -static int cgetopt(int argc, char * const argv[], const char *optstring) -{ - static int optpos = 1; - int coptopt; - char *arg; - - if(coptind == 0) { /* Reset? */ - coptind = !!argc; - optpos = 1; - } - - arg = argv[coptind]; - if(arg && strcmp(arg, "--") == 0) { - coptind++; - return -1; - } - else if(!arg || arg[0] != '-') { - return -1; - } - else { - const char *opt = strchr(optstring, arg[optpos]); - coptopt = arg[optpos]; - if(!opt) { - if(!arg[++optpos]) { - coptind++; - optpos = 1; - } - return '?'; - } - else if(opt[1] == ':') { - if(arg[optpos + 1]) { - coptarg = arg + optpos + 1; - coptind++; - optpos = 1; - return coptopt; - } - else if(argv[coptind + 1]) { - coptarg = argv[coptind + 1]; - coptind += 2; - optpos = 1; - return coptopt; - } - else { - if(!arg[++optpos]) { - coptind++; - optpos = 1; - } - return *optstring == ':' ? ':' : '?'; - } - } - else { - if(!arg[++optpos]) { - coptind++; - optpos = 1; - } - return coptopt; - } - } -} - -#endif /* HEADER_CLIENT_FIRST_H */ diff --git a/tests/http/Makefile.am b/tests/http/Makefile.am index 03b0fbfb1f..fc5bad0bd0 100644 --- a/tests/http/Makefile.am +++ b/tests/http/Makefile.am @@ -72,7 +72,7 @@ clean-local: rm -rf *.pyc __pycache__ rm -rf gen -check: clients +check: libtests -clients: - @(cd ../client; $(MAKE) check) +libtests: + @(cd ../libtests; $(MAKE) check) diff --git a/tests/http/test_02_download.py b/tests/http/test_02_download.py index 472fb5147a..f9b33b4098 100644 --- a/tests/http/test_02_download.py +++ b/tests/http/test_02_download.py @@ -312,7 +312,7 @@ class TestDownload: count = 2 docname = 'data-10m' url = f'https://localhost:{env.https_port}/{docname}' - client = LocalClient(name='hx_download', env=env) + client = LocalClient(name='cli_hx_download', env=env) if not client.exists(): pytest.skip(f'example client not built: {client.name}') r = client.run(args=[ @@ -335,7 +335,7 @@ class TestDownload: run_env['CURL_DEBUG'] = 'multi,http/2' if swin_max > 0: run_env['CURL_H2_STREAM_WIN_MAX'] = f'{swin_max}' - client = LocalClient(name='hx_download', env=env, run_env=run_env) + client = LocalClient(name='cli_hx_download', env=env, run_env=run_env) if not client.exists(): pytest.skip(f'example client not built: {client.name}') r = client.run(args=[ @@ -355,7 +355,7 @@ class TestDownload: max_parallel = 5 docname = 'data-10m' url = f'https://localhost:{env.https_port}/{docname}' - client = LocalClient(name='hx_download', env=env) + client = LocalClient(name='cli_hx_download', env=env) if not client.exists(): pytest.skip(f'example client not built: {client.name}') r = client.run(args=[ @@ -383,7 +383,7 @@ class TestDownload: pause_offset = 12 * 1024 docname = 'data-1m' url = f'https://localhost:{env.https_port}/{docname}' - client = LocalClient(name='hx_download', env=env) + client = LocalClient(name='cli_hx_download', env=env) if not client.exists(): pytest.skip(f'example client not built: {client.name}') r = client.run(args=[ @@ -412,7 +412,7 @@ class TestDownload: abort_offset = 12 * 1024 docname = 'data-1m' url = f'https://localhost:{env.https_port}/{docname}' - client = LocalClient(name='hx_download', env=env) + client = LocalClient(name='cli_hx_download', env=env) if not client.exists(): pytest.skip(f'example client not built: {client.name}') r = client.run(args=[ @@ -441,7 +441,7 @@ class TestDownload: fail_offset = 12 * 1024 docname = 'data-1m' url = f'https://localhost:{env.https_port}/{docname}' - client = LocalClient(name='hx_download', env=env) + client = LocalClient(name='cli_hx_download', env=env) if not client.exists(): pytest.skip(f'example client not built: {client.name}') r = client.run(args=[ @@ -475,7 +475,7 @@ class TestDownload: # before protocol switch has happened def test_02_25_h2_upgrade_x(self, env: Env, httpd): url = f'http://localhost:{env.http_port}/data-100k' - client = LocalClient(name='h2_upgrade_extreme', env=env, timeout=15) + client = LocalClient(name='cli_h2_upgrade_extreme', env=env, timeout=15) if not client.exists(): pytest.skip(f'example client not built: {client.name}') r = client.run(args=[url]) @@ -488,10 +488,10 @@ class TestDownload: if proto == 'h3' and not env.have_h3(): pytest.skip("h3 not supported") url = f'https://{env.authority_for(env.domain1, proto)}/data-100k' - client = LocalClient(name='tls_session_reuse', env=env) + client = LocalClient(name='cli_tls_session_reuse', env=env) if not client.exists(): pytest.skip(f'example client not built: {client.name}') - r = client.run(args=[proto, url]) + r = client.run(args=[url, proto]) r.check_exit_code(0) # test on paused transfers, based on issue #11982 @@ -501,7 +501,7 @@ class TestDownload: pytest.skip("h3 not supported") url = f'https://{env.authority_for(env.domain1, proto)}' \ '/curltest/tweak/?&chunks=6&chunk_size=8000' - client = LocalClient(env=env, name='h2_pausing') + client = LocalClient(env=env, name='cli_h2_pausing') r = client.run(args=['-V', proto, url]) r.check_exit_code(0) @@ -512,7 +512,7 @@ class TestDownload: pytest.skip("h3 not supported") url = f'https://{env.authority_for(env.domain1, proto)}' \ '/curltest/tweak/?error=502' - client = LocalClient(env=env, name='h2_pausing') + client = LocalClient(env=env, name='cli_h2_pausing') r = client.run(args=['-V', proto, url]) r.check_exit_code(0) @@ -523,7 +523,7 @@ class TestDownload: pytest.skip("h3 not supported") url = f'https://{env.authority_for(env.domain1, proto)}' \ '/curltest/tweak/?status=200&chunks=1&chunk_size=100' - client = LocalClient(env=env, name='h2_pausing') + client = LocalClient(env=env, name='cli_h2_pausing') r = client.run(args=['-V', proto, url]) r.check_exit_code(0) @@ -562,7 +562,7 @@ class TestDownload: count = 2 docname = 'data-10m' url = f'https://localhost:{env.https_port}/{docname}' - client = LocalClient(name='hx_download', env=env) + client = LocalClient(name='cli_hx_download', env=env) if not client.exists(): pytest.skip(f'example client not built: {client.name}') r = client.run(args=[ @@ -617,7 +617,7 @@ class TestDownload: if proto != 'h3': port = env.nghttpx_https_port url = f'https://{env.domain1}:{port}/{docname}' - client = LocalClient(name='hx_download', env=env) + client = LocalClient(name='cli_hx_download', env=env) if not client.exists(): pytest.skip(f'example client not built: {client.name}') r = client.run(args=[ @@ -663,7 +663,7 @@ class TestDownload: url = f'https://{env.domain1}:{port}/{docname}' run_env = os.environ.copy() run_env['CURL_DEBUG'] = 'multi' - client = LocalClient(name='hx_download', env=env, run_env=run_env) + client = LocalClient(name='cli_hx_download', env=env, run_env=run_env) if not client.exists(): pytest.skip(f'example client not built: {client.name}') r = client.run(args=[ @@ -701,7 +701,7 @@ class TestDownload: url = f'https://{env.domain1}:{port}/{docname}' run_env = os.environ.copy() run_env['CURL_DEBUG'] = 'multi' - client = LocalClient(name='hx_download', env=env, run_env=run_env) + client = LocalClient(name='cli_hx_download', env=env, run_env=run_env) if not client.exists(): pytest.skip(f'example client not built: {client.name}') r = client.run(args=[ @@ -743,7 +743,7 @@ class TestDownload: pause_offset = 1024 * 1024 docname = 'bomb-100m.txt.var' url = f'https://localhost:{env.https_port}/{docname}' - client = LocalClient(name='hx_download', env=env) + client = LocalClient(name='cli_hx_download', env=env) if not client.exists(): pytest.skip(f'example client not built: {client.name}') r = client.run(args=[ diff --git a/tests/http/test_07_upload.py b/tests/http/test_07_upload.py index ae81300363..0868a406ab 100644 --- a/tests/http/test_07_upload.py +++ b/tests/http/test_07_upload.py @@ -166,7 +166,7 @@ class TestUpload: count = 2 upload_size = 128*1024 url = f'https://localhost:{env.https_port}/curltest/put' - client = LocalClient(name='hx_upload', env=env) + client = LocalClient(name='cli_hx_upload', env=env) if not client.exists(): pytest.skip(f'example client not built: {client.name}') r = client.run(args=[ @@ -182,7 +182,7 @@ class TestUpload: count = 2 upload_size = 128*1024 url = f'https://localhost:{env.https_port}/curltest/put' - client = LocalClient(name='hx_upload', env=env) + client = LocalClient(name='cli_hx_upload', env=env) if not client.exists(): pytest.skip(f'example client not built: {client.name}') r = client.run(args=[ @@ -198,7 +198,7 @@ class TestUpload: count = 2 upload_size = 128*1024 url = f'https://localhost:{env.https_port}/curltest/echo' - client = LocalClient(name='hx_upload', env=env) + client = LocalClient(name='cli_hx_upload', env=env) if not client.exists(): pytest.skip(f'example client not built: {client.name}') r = client.run(args=[ @@ -503,7 +503,7 @@ class TestUpload: def test_07_42a_upload_disconnect(self, env: Env, httpd, nghttpx, proto): if proto == 'h3' and not env.have_h3(): pytest.skip("h3 not supported") - client = LocalClient(name='upload_pausing', env=env, timeout=60) + client = LocalClient(name='cli_upload_pausing', env=env, timeout=60) if not client.exists(): pytest.skip(f'example client not built: {client.name}') url = f'https://{env.authority_for(env.domain1, proto)}/curltest/echo?id=[0-0]&die_after=0' @@ -523,7 +523,7 @@ class TestUpload: def test_07_42b_upload_disconnect(self, env: Env, httpd, nghttpx, proto): if proto == 'h3' and not env.have_h3(): pytest.skip("h3 not supported") - client = LocalClient(name='upload_pausing', env=env, timeout=60) + client = LocalClient(name='cli_upload_pausing', env=env, timeout=60) if not client.exists(): pytest.skip(f'example client not built: {client.name}') url = f'https://{env.authority_for(env.domain1, proto)}/curltest/echo?id=0&just_die=1' @@ -538,7 +538,7 @@ class TestUpload: def test_07_42c_upload_disconnect(self, env: Env, httpd, nghttpx, proto): if proto == 'h3' and not env.have_h3(): pytest.skip("h3 not supported") - client = LocalClient(name='upload_pausing', env=env, timeout=60) + client = LocalClient(name='cli_upload_pausing', env=env, timeout=60) if not client.exists(): pytest.skip(f'example client not built: {client.name}') url = f'https://{env.authority_for(env.domain1, proto)}/curltest/echo?id=0&die_after_100=1' @@ -572,7 +572,7 @@ class TestUpload: count = 1 upload_size = 128*1024 url = f'https://localhost:{env.https_port}/curltest/put-redir-{httpcode}' - client = LocalClient(name='hx_upload', env=env) + client = LocalClient(name='cli_hx_upload', env=env) if not client.exists(): pytest.skip(f'example client not built: {client.name}') r = client.run(args=[ @@ -700,7 +700,7 @@ class TestUpload: if proto != 'h3': port = env.nghttpx_https_port url = f'https://{env.domain1}:{port}/curltest/put' - client = LocalClient(name='hx_upload', env=env) + client = LocalClient(name='cli_hx_upload', env=env) if not client.exists(): pytest.skip(f'example client not built: {client.name}') r = client.run(args=[ diff --git a/tests/http/test_08_caddy.py b/tests/http/test_08_caddy.py index 679cd84988..3073607e04 100644 --- a/tests/http/test_08_caddy.py +++ b/tests/http/test_08_caddy.py @@ -199,7 +199,7 @@ class TestCaddy: count = 2 docname = 'data10k.data' url = f'https://{env.domain1}:{caddy.port}/{docname}' - client = LocalClient(name='hx_download', env=env) + client = LocalClient(name='cli_hx_download', env=env) if not client.exists(): pytest.skip(f'example client not built: {client.name}') r = client.run(args=[ diff --git a/tests/http/test_09_push.py b/tests/http/test_09_push.py index b1e37dee7f..d149fabb30 100644 --- a/tests/http/test_09_push.py +++ b/tests/http/test_09_push.py @@ -76,7 +76,7 @@ class TestPush: self.httpd_configure(env, httpd) # use localhost as we do not have resolve support in local client url = f'https://localhost:{env.https_port}/push/data1' - client = LocalClient(name='h2_serverpush', env=env) + client = LocalClient(name='cli_h2_serverpush', env=env) if not client.exists(): pytest.skip(f'example client not built: {client.name}') r = client.run(args=[url]) diff --git a/tests/http/test_17_ssl_use.py b/tests/http/test_17_ssl_use.py index 89298a51a9..c4a4324f77 100644 --- a/tests/http/test_17_ssl_use.py +++ b/tests/http/test_17_ssl_use.py @@ -377,7 +377,7 @@ class TestSSLUse: count = 2 docname = 'data-10k' url = f'https://localhost:{env.https_port}/{docname}' - client = LocalClient(name='hx_download', env=env) + client = LocalClient(name='cli_hx_download', env=env) if not client.exists(): pytest.skip(f'example client not built: {client.name}') r = client.run(args=[ diff --git a/tests/http/test_19_shutdown.py b/tests/http/test_19_shutdown.py index 67b3f6402b..9b3a6c90e9 100644 --- a/tests/http/test_19_shutdown.py +++ b/tests/http/test_19_shutdown.py @@ -112,7 +112,7 @@ class TestShutdown: count = 10 docname = 'data.json' url = f'https://localhost:{env.https_port}/{docname}' - client = LocalClient(name='hx_download', env=env, run_env={ + client = LocalClient(name='cli_hx_download', env=env, run_env={ 'CURL_GRACEFUL_SHUTDOWN': '2000', 'CURL_DEBUG': 'ssl,multi' }) @@ -185,7 +185,7 @@ class TestShutdown: count = 500 docname = 'data.json' url = f'https://localhost:{env.https_port}/{docname}' - client = LocalClient(name='hx_download', env=env, run_env={ + client = LocalClient(name='cli_hx_download', env=env, run_env={ 'CURL_GRACEFUL_SHUTDOWN': '2000', 'CURL_DEBUG': 'ssl,multi' }) diff --git a/tests/http/test_20_websockets.py b/tests/http/test_20_websockets.py index dfb9d1389c..60b97069ce 100644 --- a/tests/http/test_20_websockets.py +++ b/tests/http/test_20_websockets.py @@ -109,7 +109,7 @@ class TestWebsockets: def test_20_02_pingpong_small(self, env: Env, ws_echo): payload = 125 * "x" - client = LocalClient(env=env, name='ws_pingpong') + client = LocalClient(env=env, name='cli_ws_pingpong') if not client.exists(): pytest.skip(f'example client not built: {client.name}') url = f'ws://localhost:{env.ws_port}/' @@ -119,7 +119,7 @@ class TestWebsockets: # the python websocket server does not like 'large' control frames def test_20_03_pingpong_too_large(self, env: Env, ws_echo): payload = 127 * "x" - client = LocalClient(env=env, name='ws_pingpong') + client = LocalClient(env=env, name='cli_ws_pingpong') if not client.exists(): pytest.skip(f'example client not built: {client.name}') url = f'ws://localhost:{env.ws_port}/' @@ -127,7 +127,7 @@ class TestWebsockets: r.check_exit_code(100) # CURLE_TOO_LARGE def test_20_04_data_small(self, env: Env, ws_echo): - client = LocalClient(env=env, name='ws_data') + client = LocalClient(env=env, name='cli_ws_data') if not client.exists(): pytest.skip(f'example client not built: {client.name}') url = f'ws://localhost:{env.ws_port}/' @@ -135,7 +135,7 @@ class TestWebsockets: r.check_exit_code(0) def test_20_05_data_med(self, env: Env, ws_echo): - client = LocalClient(env=env, name='ws_data') + client = LocalClient(env=env, name='cli_ws_data') if not client.exists(): pytest.skip(f'example client not built: {client.name}') url = f'ws://localhost:{env.ws_port}/' @@ -143,7 +143,7 @@ class TestWebsockets: r.check_exit_code(0) def test_20_06_data_large(self, env: Env, ws_echo): - client = LocalClient(env=env, name='ws_data') + client = LocalClient(env=env, name='cli_ws_data') if not client.exists(): pytest.skip(f'example client not built: {client.name}') url = f'ws://localhost:{env.ws_port}/' @@ -153,7 +153,7 @@ class TestWebsockets: def test_20_07_data_large_small_recv(self, env: Env, ws_echo): run_env = os.environ.copy() run_env['CURL_WS_CHUNK_SIZE'] = '1024' - client = LocalClient(env=env, name='ws_data', run_env=run_env) + client = LocalClient(env=env, name='cli_ws_data', run_env=run_env) if not client.exists(): pytest.skip(f'example client not built: {client.name}') url = f'ws://localhost:{env.ws_port}/' @@ -165,7 +165,7 @@ class TestWebsockets: def test_20_08_data_very_large(self, env: Env, ws_echo): run_env = os.environ.copy() run_env['CURL_WS_CHUNK_EAGAIN'] = '8192' - client = LocalClient(env=env, name='ws_data', run_env=run_env) + client = LocalClient(env=env, name='cli_ws_data', run_env=run_env) if not client.exists(): pytest.skip(f'example client not built: {client.name}') url = f'ws://localhost:{env.ws_port}/' diff --git a/tests/http/testenv/client.py b/tests/http/testenv/client.py index 4f690a345e..e3806de0da 100644 --- a/tests/http/testenv/client.py +++ b/tests/http/testenv/client.py @@ -44,7 +44,7 @@ class LocalClient: timeout: Optional[float] = None, run_env: Optional[Dict[str,str]] = None): self.name = name - self.path = os.path.join(env.build_dir, 'tests/client/clients') + self.path = os.path.join(env.build_dir, 'tests/libtest/libtests') self.env = env self._run_env = run_env self._timeout = timeout if timeout else env.test_timeout diff --git a/tests/libtest/Makefile.inc b/tests/libtest/Makefile.inc index ba402d903b..f30010bd86 100644 --- a/tests/libtest/Makefile.inc +++ b/tests/libtest/Makefile.inc @@ -44,6 +44,16 @@ CURLX_C = \ # All libtest programs TESTS_C = \ + cli_h2_pausing.c \ + cli_h2_serverpush.c \ + cli_h2_upgrade_extreme.c \ + cli_hx_download.c \ + cli_hx_upload.c \ + cli_tls_session_reuse.c \ + cli_upload_pausing.c \ + cli_ws_data.c \ + cli_ws_pingpong.c \ + \ lib500.c lib501.c lib502.c lib503.c lib504.c lib505.c lib506.c lib507.c \ lib508.c lib509.c lib510.c lib511.c lib512.c lib513.c lib514.c lib515.c \ lib516.c lib517.c lib518.c lib519.c lib520.c lib521.c lib523.c lib524.c \ diff --git a/tests/client/h2_pausing.c b/tests/libtest/cli_h2_pausing.c similarity index 87% rename from tests/client/h2_pausing.c rename to tests/libtest/cli_h2_pausing.c index d2e90cd483..ecdf8f1596 100644 --- a/tests/client/h2_pausing.c +++ b/tests/libtest/cli_h2_pausing.c @@ -25,6 +25,9 @@ */ #include "first.h" +#include "testtrace.h" +#include "memdebug.h" + static void usage_h2_pausing(const char *msg) { if(msg) @@ -77,7 +80,13 @@ static size_t cb(char *data, size_t size, size_t nmemb, void *clientp) return realsize; } -static int test_h2_pausing(int argc, char *argv[]) +#define CLI_ERR() \ + do { \ + curl_mfprintf(stderr, "something unexpected went wrong - bailing out!\n");\ + return (CURLcode)2; \ + } while(0) + +static CURLcode test_cli_h2_pausing(const char *URL) { struct handle handles[2]; CURLM *multi_handle; @@ -85,21 +94,24 @@ static int test_h2_pausing(int argc, char *argv[]) size_t i; CURLMsg *msg; int rounds = 0; - int rc = 0; + CURLcode rc = CURLE_OK; CURLU *cu; struct curl_slist *resolve = NULL; char resolve_buf[1024]; - char *url, *host = NULL, *port = NULL; + const char *url; + char *host = NULL, *port = NULL; int all_paused = 0; int resume_round = -1; - int http_version = CURL_HTTP_VERSION_2_0; + long http_version = CURL_HTTP_VERSION_2_0; int ch; - while((ch = cgetopt(argc, argv, "hV:")) != -1) { + (void)URL; + + while((ch = cgetopt(test_argc, test_argv, "hV:")) != -1) { switch(ch) { case 'h': usage_h2_pausing(NULL); - return 2; + return (CURLcode)2; case 'V': { if(!strcmp("http/1.1", coptarg)) http_version = CURL_HTTP_VERSION_1_1; @@ -109,23 +121,23 @@ static int test_h2_pausing(int argc, char *argv[]) http_version = CURL_HTTP_VERSION_3ONLY; else { usage_h2_pausing("invalid http version"); - return 1; + return (CURLcode)1; } break; } default: usage_h2_pausing("invalid option"); - return 1; + return (CURLcode)1; } } - argc -= coptind; - argv += coptind; + test_argc -= coptind; + test_argv += coptind; - if(argc != 1) { + if(test_argc != 1) { curl_mfprintf(stderr, "ERROR: need URL as argument\n"); - return 2; + return (CURLcode)2; } - url = argv[0]; + url = test_argv[0]; curl_global_init(CURL_GLOBAL_DEFAULT); curl_global_trace("ids,time,http/2,http/3"); @@ -133,19 +145,19 @@ static int test_h2_pausing(int argc, char *argv[]) cu = curl_url(); if(!cu) { curl_mfprintf(stderr, "out of memory\n"); - return 1; + return (CURLcode)1; } if(curl_url_set(cu, CURLUPART_URL, url, 0)) { curl_mfprintf(stderr, "not a URL: '%s'\n", url); - return 1; + return (CURLcode)1; } if(curl_url_get(cu, CURLUPART_HOST, &host, 0)) { curl_mfprintf(stderr, "could not get host of '%s'\n", url); - return 1; + return (CURLcode)1; } if(curl_url_get(cu, CURLUPART_PORT, &port, 0)) { curl_mfprintf(stderr, "could not get port of '%s'\n", url); - return 1; + return (CURLcode)1; } memset(&resolve, 0, sizeof(resolve)); curl_msnprintf(resolve_buf, sizeof(resolve_buf)-1, "%s:%s:127.0.0.1", @@ -165,30 +177,30 @@ static int test_h2_pausing(int argc, char *argv[]) != CURLE_OK || curl_easy_setopt(handles[i].h, CURLOPT_FOLLOWLOCATION, 1L) != CURLE_OK || curl_easy_setopt(handles[i].h, CURLOPT_VERBOSE, 1L) != CURLE_OK || - curl_easy_setopt(handles[i].h, CURLOPT_DEBUGFUNCTION, debug_cb) + curl_easy_setopt(handles[i].h, CURLOPT_DEBUGFUNCTION, cli_debug_cb) != CURLE_OK || curl_easy_setopt(handles[i].h, CURLOPT_SSL_VERIFYPEER, 0L) != CURLE_OK || curl_easy_setopt(handles[i].h, CURLOPT_RESOLVE, resolve) != CURLE_OK || curl_easy_setopt(handles[i].h, CURLOPT_PIPEWAIT, 1L) || curl_easy_setopt(handles[i].h, CURLOPT_URL, url) != CURLE_OK) { - ERR(); + CLI_ERR(); } - curl_easy_setopt(handles[i].h, CURLOPT_HTTP_VERSION, (long)http_version); + curl_easy_setopt(handles[i].h, CURLOPT_HTTP_VERSION, http_version); } multi_handle = curl_multi_init(); if(!multi_handle) - ERR(); + CLI_ERR(); for(i = 0; i < CURL_ARRAYSIZE(handles); i++) { if(curl_multi_add_handle(multi_handle, handles[i].h) != CURLM_OK) - ERR(); + CLI_ERR(); } for(rounds = 0;; rounds++) { curl_mfprintf(stderr, "INFO: multi_perform round %d\n", rounds); if(curl_multi_perform(multi_handle, &still_running) != CURLM_OK) - ERR(); + CLI_ERR(); if(!still_running) { int as_expected = 1; @@ -216,13 +228,13 @@ static int test_h2_pausing(int argc, char *argv[]) if(!as_expected) { curl_mfprintf(stderr, "ERROR: handles not in expected state " "after %d rounds\n", rounds); - rc = 1; + rc = (CURLcode)1; } break; } if(curl_multi_poll(multi_handle, NULL, 0, 100, &numfds) != CURLM_OK) - ERR(); + CLI_ERR(); /* !checksrc! disable EQUALSNULL 1 */ while((msg = curl_multi_info_read(multi_handle, &msgs_left)) != NULL) { @@ -233,7 +245,7 @@ static int test_h2_pausing(int argc, char *argv[]) curl_mfprintf(stderr, "ERROR: [%d] done, pauses=%d, resumed=%d, " "result %d - wtf?\n", (int)i, handles[i].paused, handles[i].resumed, msg->data.result); - rc = 1; + rc = (CURLcode)1; goto out; } } diff --git a/tests/client/h2_serverpush.c b/tests/libtest/cli_h2_serverpush.c similarity index 81% rename from tests/client/h2_serverpush.c rename to tests/libtest/cli_h2_serverpush.c index eeede0fc58..ace7fed440 100644 --- a/tests/client/h2_serverpush.c +++ b/tests/libtest/cli_h2_serverpush.c @@ -23,41 +23,8 @@ ***************************************************************************/ #include "first.h" -static int my_trace(CURL *handle, curl_infotype type, - char *data, size_t size, void *userp) -{ - const char *text; - (void)handle; /* prevent compiler warning */ - (void)userp; - switch(type) { - case CURLINFO_TEXT: - curl_mfprintf(stderr, "== Info: %s", data); - return 0; - case CURLINFO_HEADER_OUT: - text = "=> Send header"; - break; - case CURLINFO_DATA_OUT: - text = "=> Send data"; - break; - case CURLINFO_SSL_DATA_OUT: - text = "=> Send SSL data"; - break; - case CURLINFO_HEADER_IN: - text = "<= Recv header"; - break; - case CURLINFO_DATA_IN: - text = "<= Recv data"; - break; - case CURLINFO_SSL_DATA_IN: - text = "<= Recv SSL data"; - break; - default: /* in case a new one is introduced to shock us */ - return 0; - } - - dump(text, (unsigned char *)data, size, 1); - return 0; -} +#include "testtrace.h" +#include "memdebug.h" static FILE *out_download; @@ -76,7 +43,8 @@ static int setup_h2_serverpush(CURL *hnd, const char *url) /* please be verbose */ curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L); - curl_easy_setopt(hnd, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(hnd, CURLOPT_DEBUGFUNCTION, libtest_debug_cb); + curl_easy_setopt(hnd, CURLOPT_DEBUGDATA, &debug_config); /* wait for pipe connection to confirm */ curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L); @@ -139,19 +107,20 @@ out: /* * Download a file over HTTP/2, take care of server push. */ -static int test_h2_serverpush(int argc, char *argv[]) +static CURLcode test_cli_h2_serverpush(const char *URL) { CURL *easy; CURLM *multi_handle; int transfers = 1; /* we start with one */ struct CURLMsg *m; - const char *url; - if(argc != 2) { + debug_config.nohex = 1; + debug_config.tracetime = 0; + + if(!URL) { curl_mfprintf(stderr, "need URL as argument\n"); - return 2; + return (CURLcode)2; } - url = argv[1]; multi_handle = curl_multi_init(); curl_multi_setopt(multi_handle, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX); @@ -159,10 +128,10 @@ static int test_h2_serverpush(int argc, char *argv[]) curl_multi_setopt(multi_handle, CURLMOPT_PUSHDATA, &transfers); easy = curl_easy_init(); - if(setup_h2_serverpush(easy, url)) { + if(setup_h2_serverpush(easy, URL)) { fclose(out_download); curl_mfprintf(stderr, "failed\n"); - return 1; + return (CURLcode)1; } curl_multi_add_handle(multi_handle, easy); @@ -201,5 +170,5 @@ static int test_h2_serverpush(int argc, char *argv[]) if(out_push) fclose(out_push); - return 0; + return CURLE_OK; } diff --git a/tests/client/h2_upgrade_extreme.c b/tests/libtest/cli_h2_upgrade_extreme.c similarity index 93% rename from tests/client/h2_upgrade_extreme.c rename to tests/libtest/cli_h2_upgrade_extreme.c index 46ab7edfc6..f6b277424f 100644 --- a/tests/client/h2_upgrade_extreme.c +++ b/tests/libtest/cli_h2_upgrade_extreme.c @@ -23,6 +23,9 @@ ***************************************************************************/ #include "first.h" +#include "testtrace.h" +#include "memdebug.h" + static size_t write_h2_upg_extreme_cb(char *ptr, size_t size, size_t nmemb, void *opaque) { @@ -31,9 +34,8 @@ static size_t write_h2_upg_extreme_cb(char *ptr, size_t size, size_t nmemb, return size * nmemb; } -static int test_h2_upgrade_extreme(int argc, char *argv[]) +static CURLcode test_cli_h2_upgrade_extreme(const char *URL) { - const char *url; CURLM *multi = NULL; CURL *easy; CURLMcode mc; @@ -41,14 +43,13 @@ static int test_h2_upgrade_extreme(int argc, char *argv[]) CURLMsg *msg; int msgs_in_queue; char range[128]; - int exitcode = 1; + CURLcode exitcode = (CURLcode)1; - if(argc != 2) { - curl_mfprintf(stderr, "%s URL\n", argv[0]); - return 2; + if(!URL) { + curl_mfprintf(stderr, "need URL as argument\n"); + return (CURLcode)2; } - url = argv[1]; multi = curl_multi_init(); if(!multi) { curl_mfprintf(stderr, "curl_multi_init failed\n"); @@ -64,8 +65,8 @@ static int test_h2_upgrade_extreme(int argc, char *argv[]) goto cleanup; } curl_easy_setopt(easy, CURLOPT_VERBOSE, 1L); - curl_easy_setopt(easy, CURLOPT_DEBUGFUNCTION, debug_cb); - curl_easy_setopt(easy, CURLOPT_URL, url); + curl_easy_setopt(easy, CURLOPT_DEBUGFUNCTION, cli_debug_cb); + curl_easy_setopt(easy, CURLOPT_URL, URL); curl_easy_setopt(easy, CURLOPT_NOSIGNAL, 1L); curl_easy_setopt(easy, CURLOPT_AUTOREFERER, 1L); curl_easy_setopt(easy, CURLOPT_FAILONERROR, 1L); @@ -143,7 +144,7 @@ static int test_h2_upgrade_extreme(int argc, char *argv[]) } while(running_handles > 0 || start_count); curl_mfprintf(stderr, "exiting\n"); - exitcode = 0; + exitcode = CURLE_OK; cleanup: diff --git a/tests/client/hx_download.c b/tests/libtest/cli_hx_download.c similarity index 95% rename from tests/client/hx_download.c rename to tests/libtest/cli_hx_download.c index 59e2b036d1..9096bf54af 100644 --- a/tests/client/hx_download.c +++ b/tests/libtest/cli_hx_download.c @@ -23,6 +23,9 @@ ***************************************************************************/ #include "first.h" +#include "testtrace.h" +#include "memdebug.h" + static int verbose_d = 1; struct transfer_d { @@ -140,7 +143,7 @@ static int setup_hx_download(CURL *hnd, const char *url, struct transfer_d *t, /* please be verbose */ if(verbose_d) { curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L); - curl_easy_setopt(hnd, CURLOPT_DEBUGFUNCTION, debug_cb); + curl_easy_setopt(hnd, CURLOPT_DEBUGFUNCTION, cli_debug_cb); } /* wait for pipe connection to confirm */ @@ -175,7 +178,7 @@ static void usage_hx_download(const char *msg) /* * Download a file over HTTP/2, take care of server push. */ -static int test_hx_download(int argc, char *argv[]) +static CURLcode test_cli_hx_download(const char *URL) { CURLM *multi_handle; struct CURLMsg *m; @@ -188,20 +191,23 @@ static int test_hx_download(int argc, char *argv[]) size_t fail_offset = 0; int abort_paused = 0, use_earlydata = 0; struct transfer_d *t; - int http_version = CURL_HTTP_VERSION_2_0; + long http_version = CURL_HTTP_VERSION_2_0; int ch; struct curl_slist *host = NULL; char *resolve = NULL; size_t max_host_conns = 0; size_t max_total_conns = 0; int fresh_connect = 0; - int result = 0; + CURLcode result = CURLE_OK; - while((ch = cgetopt(argc, argv, "aefhm:n:xA:F:M:P:r:T:V:")) != -1) { + (void)URL; + + while((ch = cgetopt(test_argc, test_argv, "aefhm:n:xA:F:M:P:r:T:V:")) + != -1) { switch(ch) { case 'h': usage_hx_download(NULL); - result = 2; + result = (CURLcode)2; goto cleanup; case 'a': abort_paused = 1; @@ -249,29 +255,29 @@ static int test_hx_download(int argc, char *argv[]) http_version = CURL_HTTP_VERSION_3ONLY; else { usage_hx_download("invalid http version"); - result = 1; + result = (CURLcode)1; goto cleanup; } break; } default: usage_hx_download("invalid option"); - result = 1; + result = (CURLcode)1; goto cleanup; } } - argc -= coptind; - argv += coptind; + test_argc -= coptind; + test_argv += coptind; curl_global_init(CURL_GLOBAL_DEFAULT); curl_global_trace("ids,time,http/2,http/3"); - if(argc != 1) { + if(test_argc != 1) { usage_hx_download("not enough arguments"); - result = 2; + result = (CURLcode)2; goto cleanup; } - url = argv[0]; + url = test_argv[0]; if(resolve) host = curl_slist_append(NULL, resolve); @@ -279,7 +285,7 @@ static int test_hx_download(int argc, char *argv[]) share = curl_share_init(); if(!share) { curl_mfprintf(stderr, "error allocating share\n"); - result = 1; + result = (CURLcode)1; goto cleanup; } curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE); @@ -292,7 +298,7 @@ static int test_hx_download(int argc, char *argv[]) transfer_d = calloc(transfer_count_d, sizeof(*transfer_d)); if(!transfer_d) { curl_mfprintf(stderr, "error allocating transfer structs\n"); - result = 1; + result = (CURLcode)1; goto cleanup; } @@ -320,7 +326,7 @@ static int test_hx_download(int argc, char *argv[]) setup_hx_download(t->easy, url, t, http_version, host, share, use_earlydata, fresh_connect)) { curl_mfprintf(stderr, "[t-%d] FAILED setup\n", (int)i); - result = 1; + result = (CURLcode)1; goto cleanup; } curl_multi_add_handle(multi_handle, t->easy); @@ -403,7 +409,7 @@ static int test_hx_download(int argc, char *argv[]) setup_hx_download(t->easy, url, t, http_version, host, share, use_earlydata, fresh_connect)) { curl_mfprintf(stderr, "[t-%d] FAILED setup\n", (int)i); - result = 1; + result = (CURLcode)1; goto cleanup; } curl_multi_add_handle(multi_handle, t->easy); diff --git a/tests/client/hx_upload.c b/tests/libtest/cli_hx_upload.c similarity index 95% rename from tests/client/hx_upload.c rename to tests/libtest/cli_hx_upload.c index 0fd25b0fa1..b05694b4d4 100644 --- a/tests/client/hx_upload.c +++ b/tests/libtest/cli_hx_upload.c @@ -23,6 +23,9 @@ ***************************************************************************/ #include "first.h" +#include "testtrace.h" +#include "memdebug.h" + static int verbose_u = 1; struct transfer_u { @@ -175,7 +178,7 @@ static int setup_hx_upload(CURL *hnd, const char *url, struct transfer_u *t, /* please be verbose */ if(verbose_u) { curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L); - curl_easy_setopt(hnd, CURLOPT_DEBUGFUNCTION, debug_cb); + curl_easy_setopt(hnd, CURLOPT_DEBUGFUNCTION, cli_debug_cb); } /* wait for pipe connection to confirm */ @@ -207,7 +210,7 @@ static void usage_hx_upload(const char *msg) /* * Download a file over HTTP/2, take care of server push. */ -static int test_hx_upload(int argc, char *argv[]) +static CURLcode test_cli_hx_upload(const char *URL) { CURLM *multi_handle; CURLSH *share; @@ -224,16 +227,19 @@ static int test_hx_upload(int argc, char *argv[]) int use_earlydata = 0; int announce_length = 0; struct transfer_u *t; - int http_version = CURL_HTTP_VERSION_2_0; + long http_version = CURL_HTTP_VERSION_2_0; struct curl_slist *host = NULL; const char *resolve = NULL; int ch; - while((ch = cgetopt(argc, argv, "aefhlm:n:A:F:M:P:r:RS:V:")) != -1) { + (void)URL; + + while((ch = cgetopt(test_argc, test_argv, "aefhlm:n:A:F:M:P:r:RS:V:")) + != -1) { switch(ch) { case 'h': usage_hx_upload(NULL); - return 2; + return (CURLcode)2; case 'a': abort_paused = 1; break; @@ -282,31 +288,31 @@ static int test_hx_upload(int argc, char *argv[]) http_version = CURL_HTTP_VERSION_3ONLY; else { usage_hx_upload("invalid http version"); - return 1; + return (CURLcode)1; } break; } default: usage_hx_upload("invalid option"); - return 1; + return (CURLcode)1; } } - argc -= coptind; - argv += coptind; + test_argc -= coptind; + test_argv += coptind; if(max_parallel > 1 && reuse_easy) { usage_hx_upload("cannot mix -R and -P"); - return 2; + return (CURLcode)2; } curl_global_init(CURL_GLOBAL_DEFAULT); curl_global_trace("ids,time,http/2,http/3"); - if(argc != 1) { + if(test_argc != 1) { usage_hx_upload("not enough arguments"); - return 2; + return (CURLcode)2; } - url = argv[0]; + url = test_argv[0]; if(resolve) host = curl_slist_append(NULL, resolve); @@ -314,7 +320,7 @@ static int test_hx_upload(int argc, char *argv[]) share = curl_share_init(); if(!share) { curl_mfprintf(stderr, "error allocating share\n"); - return 1; + return (CURLcode)1; } curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE); curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS); @@ -326,7 +332,7 @@ static int test_hx_upload(int argc, char *argv[]) transfer_u = calloc(transfer_count_u, sizeof(*transfer_u)); if(!transfer_u) { curl_mfprintf(stderr, "error allocating transfer structs\n"); - return 1; + return (CURLcode)1; } active_transfers = 0; @@ -345,7 +351,7 @@ static int test_hx_upload(int argc, char *argv[]) CURLcode rc = CURLE_OK; if(!easy) { curl_mfprintf(stderr, "failed to init easy handle\n"); - return 1; + return (CURLcode)1; } for(i = 0; i < transfer_count_u; ++i) { t = &transfer_u[i]; @@ -353,7 +359,7 @@ static int test_hx_upload(int argc, char *argv[]) if(setup_hx_upload(t->easy, url, t, http_version, host, share, use_earlydata, announce_length)) { curl_mfprintf(stderr, "[t-%d] FAILED setup\n", (int)i); - return 1; + return (CURLcode)1; } curl_mfprintf(stderr, "[t-%d] STARTING\n", t->idx); @@ -375,7 +381,7 @@ static int test_hx_upload(int argc, char *argv[]) if(!t->easy || setup_hx_upload(t->easy, url, t, http_version, host, share, use_earlydata, announce_length)) { curl_mfprintf(stderr, "[t-%d] FAILED setup\n", (int)i); - return 1; + return (CURLcode)1; } curl_multi_add_handle(multi_handle, t->easy); t->started = 1; @@ -460,7 +466,7 @@ static int test_hx_upload(int argc, char *argv[]) host, share, use_earlydata, announce_length)) { curl_mfprintf(stderr, "[t-%d] FAILED setup\n", (int)i); - return 1; + return (CURLcode)1; } curl_multi_add_handle(multi_handle, t->easy); t->started = 1; @@ -494,5 +500,5 @@ static int test_hx_upload(int argc, char *argv[]) free(transfer_u); curl_share_cleanup(share); - return 0; + return CURLE_OK; } diff --git a/tests/client/tls_session_reuse.c b/tests/libtest/cli_tls_session_reuse.c similarity index 89% rename from tests/client/tls_session_reuse.c rename to tests/libtest/cli_tls_session_reuse.c index fd145d62d9..b0b2456ce9 100644 --- a/tests/client/tls_session_reuse.c +++ b/tests/libtest/cli_tls_session_reuse.c @@ -23,6 +23,9 @@ ***************************************************************************/ #include "first.h" +#include "testtrace.h" +#include "memdebug.h" + static int tse_found_tls_session = FALSE; static size_t write_tse_cb(char *ptr, size_t size, size_t nmemb, void *opaque) @@ -67,7 +70,7 @@ static CURL *tse_add_transfer(CURLM *multi, CURLSH *share, return NULL; } curl_easy_setopt(easy, CURLOPT_VERBOSE, 1L); - curl_easy_setopt(easy, CURLOPT_DEBUGFUNCTION, debug_cb); + curl_easy_setopt(easy, CURLOPT_DEBUGFUNCTION, cli_debug_cb); curl_easy_setopt(easy, CURLOPT_URL, url); curl_easy_setopt(easy, CURLOPT_SHARE, share); curl_easy_setopt(easy, CURLOPT_NOSIGNAL, 1L); @@ -92,9 +95,8 @@ static CURL *tse_add_transfer(CURLM *multi, CURLSH *share, return easy; } -static int test_tls_session_reuse(int argc, char *argv[]) +static CURLcode test_cli_tls_session_reuse(const char *URL) { - const char *url; CURLM *multi = NULL; CURLMcode mc; int running_handles = 0, numfds; @@ -106,35 +108,34 @@ static int test_tls_session_reuse(int argc, char *argv[]) int msgs_in_queue; int add_more, waits, ongoing = 0; char *host = NULL, *port = NULL; - int http_version = CURL_HTTP_VERSION_1_1; - int exitcode = 1; + long http_version = CURL_HTTP_VERSION_1_1; + CURLcode exitcode = (CURLcode)1; - if(argc != 3) { - curl_mfprintf(stderr, "%s proto URL\n", argv[0]); - return 2; + if(!URL || !libtest_arg2) { + curl_mfprintf(stderr, "need args: URL proto\n"); + return (CURLcode)2; } - if(!strcmp("h2", argv[1])) + if(!strcmp("h2", libtest_arg2)) http_version = CURL_HTTP_VERSION_2; - else if(!strcmp("h3", argv[1])) + else if(!strcmp("h3", libtest_arg2)) http_version = CURL_HTTP_VERSION_3ONLY; - url = argv[2]; cu = curl_url(); if(!cu) { curl_mfprintf(stderr, "out of memory\n"); - return 1; + return (CURLcode)1; } - if(curl_url_set(cu, CURLUPART_URL, url, 0)) { - curl_mfprintf(stderr, "not a URL: '%s'\n", url); + if(curl_url_set(cu, CURLUPART_URL, URL, 0)) { + curl_mfprintf(stderr, "not a URL: '%s'\n", URL); goto cleanup; } if(curl_url_get(cu, CURLUPART_HOST, &host, 0)) { - curl_mfprintf(stderr, "could not get host of '%s'\n", url); + curl_mfprintf(stderr, "could not get host of '%s'\n", URL); goto cleanup; } if(curl_url_get(cu, CURLUPART_PORT, &port, 0)) { - curl_mfprintf(stderr, "could not get port of '%s'\n", url); + curl_mfprintf(stderr, "could not get port of '%s'\n", URL); goto cleanup; } @@ -156,7 +157,7 @@ static int test_tls_session_reuse(int argc, char *argv[]) curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION); - if(!tse_add_transfer(multi, share, resolve, url, http_version)) + if(!tse_add_transfer(multi, share, resolve, URL, http_version)) goto cleanup; ++ongoing; add_more = 6; @@ -183,7 +184,7 @@ static int test_tls_session_reuse(int argc, char *argv[]) } else { while(add_more) { - if(!tse_add_transfer(multi, share, resolve, url, http_version)) + if(!tse_add_transfer(multi, share, resolve, URL, http_version)) goto cleanup; ++ongoing; --add_more; @@ -234,7 +235,7 @@ static int test_tls_session_reuse(int argc, char *argv[]) } curl_mfprintf(stderr, "exiting\n"); - exitcode = 0; + exitcode = CURLE_OK; cleanup: diff --git a/tests/client/upload_pausing.c b/tests/libtest/cli_upload_pausing.c similarity index 87% rename from tests/client/upload_pausing.c rename to tests/libtest/cli_upload_pausing.c index d02ad224e1..a6a74eeade 100644 --- a/tests/client/upload_pausing.c +++ b/tests/libtest/cli_upload_pausing.c @@ -25,6 +25,9 @@ */ #include "first.h" +#include "testtrace.h" +#include "memdebug.h" + static size_t total_read = 0; static size_t read_callback(char *ptr, size_t size, size_t nmemb, @@ -80,18 +83,21 @@ static void usage_upload_pausing(const char *msg) ); } -static int test_upload_pausing(int argc, char *argv[]) +static CURLcode test_cli_upload_pausing(const char *URL) { CURL *curl; CURLcode rc = CURLE_OK; CURLU *cu; struct curl_slist *resolve = NULL; char resolve_buf[1024]; - char *url, *host = NULL, *port = NULL; + const char *url; + char *host = NULL, *port = NULL; long http_version = CURL_HTTP_VERSION_1_1; int ch; - while((ch = cgetopt(argc, argv, "V:")) != -1) { + (void)URL; + + while((ch = cgetopt(test_argc, test_argv, "V:")) != -1) { switch(ch) { case 'V': { if(!strcmp("http/1.1", coptarg)) @@ -102,23 +108,23 @@ static int test_upload_pausing(int argc, char *argv[]) http_version = CURL_HTTP_VERSION_3ONLY; else { usage_upload_pausing("invalid http version"); - return 1; + return (CURLcode)1; } break; } default: usage_upload_pausing("invalid option"); - return 1; + return (CURLcode)1; } } - argc -= coptind; - argv += coptind; + test_argc -= coptind; + test_argv += coptind; - if(argc != 1) { + if(test_argc != 1) { usage_upload_pausing("not enough arguments"); - return 2; + return (CURLcode)2; } - url = argv[0]; + url = test_argv[0]; curl_global_init(CURL_GLOBAL_DEFAULT); curl_global_trace("ids,time"); @@ -126,19 +132,19 @@ static int test_upload_pausing(int argc, char *argv[]) cu = curl_url(); if(!cu) { curl_mfprintf(stderr, "out of memory\n"); - return 1; + return (CURLcode)1; } if(curl_url_set(cu, CURLUPART_URL, url, 0)) { curl_mfprintf(stderr, "not a URL: '%s'\n", url); - return 1; + return (CURLcode)1; } if(curl_url_get(cu, CURLUPART_HOST, &host, 0)) { curl_mfprintf(stderr, "could not get host of '%s'\n", url); - return 1; + return (CURLcode)1; } if(curl_url_get(cu, CURLUPART_PORT, &port, 0)) { curl_mfprintf(stderr, "could not get port of '%s'\n", url); - return 1; + return (CURLcode)1; } memset(&resolve, 0, sizeof(resolve)); curl_msnprintf(resolve_buf, sizeof(resolve_buf)-1, "%s:%s:127.0.0.1", @@ -148,7 +154,7 @@ static int test_upload_pausing(int argc, char *argv[]) curl = curl_easy_init(); if(!curl) { curl_mfprintf(stderr, "out of memory\n"); - return 1; + return (CURLcode)1; } /* We want to use our own read function. */ curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback); @@ -172,10 +178,11 @@ static int test_upload_pausing(int argc, char *argv[]) curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); if(curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L) != CURLE_OK || - curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, debug_cb) - != CURLE_OK || - curl_easy_setopt(curl, CURLOPT_RESOLVE, resolve) != CURLE_OK) - ERR(); + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, cli_debug_cb) != CURLE_OK || + curl_easy_setopt(curl, CURLOPT_RESOLVE, resolve) != CURLE_OK) { + curl_mfprintf(stderr, "something unexpected went wrong - bailing out!\n"); + return (CURLcode)2; + } curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, http_version); @@ -192,5 +199,5 @@ static int test_upload_pausing(int argc, char *argv[]) curl_url_cleanup(cu); curl_global_cleanup(); - return (int)rc; + return rc; } diff --git a/tests/client/ws_data.c b/tests/libtest/cli_ws_data.c similarity index 92% rename from tests/client/ws_data.c rename to tests/libtest/cli_ws_data.c index 8467c6ff79..2c659a3857 100644 --- a/tests/client/ws_data.c +++ b/tests/libtest/cli_ws_data.c @@ -23,6 +23,9 @@ ***************************************************************************/ #include "first.h" +#include "testtrace.h" +#include "memdebug.h" + #ifndef CURL_DISABLE_WEBSOCKETS static CURLcode check_recv(const struct curl_ws_frame *frame, @@ -144,8 +147,10 @@ static CURLcode data_echo(CURL *curl, size_t count, if(memcmp(send_buf, recv_buf, len)) { curl_mfprintf(stderr, "recv_data: data differs\n"); - dump("expected:", (unsigned char *)send_buf, len, 0); - dump("received:", (unsigned char *)recv_buf, len, 0); + debug_dump("", "expected:", stderr, + (const unsigned char *)send_buf, len, 0); + debug_dump("", "received:", stderr, + (const unsigned char *)recv_buf, len, 0); r = CURLE_RECV_ERROR; goto out; } @@ -153,7 +158,7 @@ static CURLcode data_echo(CURL *curl, size_t count, out: if(!r) - websocket_close(curl); + ws_close(curl); free(send_buf); free(recv_buf); return r; @@ -172,7 +177,7 @@ static void usage_ws_data(const char *msg) #endif -static int test_ws_data(int argc, char *argv[]) +static CURLcode test_cli_ws_data(const char *URL) { #ifndef CURL_DISABLE_WEBSOCKETS CURL *curl; @@ -181,7 +186,9 @@ static int test_ws_data(int argc, char *argv[]) size_t plen_min = 0, plen_max = 0, count = 1; int ch; - while((ch = cgetopt(argc, argv, "c:hm:M:")) != -1) { + (void)URL; + + while((ch = cgetopt(test_argc, test_argv, "c:hm:M:")) != -1) { switch(ch) { case 'h': usage_ws_data(NULL); @@ -202,8 +209,8 @@ static int test_ws_data(int argc, char *argv[]) goto cleanup; } } - argc -= coptind; - argv += coptind; + test_argc -= coptind; + test_argv += coptind; if(!plen_max) plen_max = plen_min; @@ -215,12 +222,12 @@ static int test_ws_data(int argc, char *argv[]) goto cleanup; } - if(argc != 1) { + if(test_argc != 1) { usage_ws_data(NULL); res = CURLE_BAD_FUNCTION_ARGUMENT; goto cleanup; } - url = argv[0]; + url = test_argv[0]; curl_global_init(CURL_GLOBAL_ALL); @@ -243,12 +250,11 @@ static int test_ws_data(int argc, char *argv[]) cleanup: curl_global_cleanup(); - return (int)res; + return res; #else /* !CURL_DISABLE_WEBSOCKETS */ - (void)argc; - (void)argv; + (void)URL; curl_mfprintf(stderr, "WebSockets not enabled in libcurl\n"); - return 1; + return (CURLcode)1; #endif /* CURL_DISABLE_WEBSOCKETS */ } diff --git a/tests/client/ws_pingpong.c b/tests/libtest/cli_ws_pingpong.c similarity index 57% rename from tests/client/ws_pingpong.c rename to tests/libtest/cli_ws_pingpong.c index 9f6d62f942..fc96bbf2d3 100644 --- a/tests/client/ws_pingpong.c +++ b/tests/libtest/cli_ws_pingpong.c @@ -23,91 +23,53 @@ ***************************************************************************/ #include "first.h" +#include "testtrace.h" +#include "memdebug.h" + #ifndef CURL_DISABLE_WEBSOCKETS -static CURLcode ping(CURL *curl, const char *send_payload) -{ - size_t sent; - CURLcode result = - curl_ws_send(curl, send_payload, strlen(send_payload), &sent, 0, - CURLWS_PING); - curl_mfprintf(stderr, "ws: curl_ws_send returned %u, sent %u\n", - (int)result, (int)sent); - - return result; -} - -static CURLcode recv_pong(CURL *curl, const char *expected_payload) -{ - size_t rlen; - const struct curl_ws_frame *meta; - char buffer[256]; - CURLcode result = curl_ws_recv(curl, buffer, sizeof(buffer), &rlen, &meta); - if(result) { - curl_mfprintf(stderr, "ws: curl_ws_recv returned %u, received %ld\n", - (int)result, (long)rlen); - return result; - } - - if(!(meta->flags & CURLWS_PONG)) { - curl_mfprintf(stderr, "recv_pong: wrong frame, got %d bytes rflags %x\n", - (int)rlen, meta->flags); - return CURLE_RECV_ERROR; - } - - curl_mfprintf(stderr, "ws: got PONG back\n"); - if(rlen == strlen(expected_payload) && - !memcmp(expected_payload, buffer, rlen)) { - curl_mfprintf(stderr, "ws: got the same payload back\n"); - return CURLE_OK; - } - curl_mfprintf(stderr, "ws: did NOT get the same payload back\n"); - return CURLE_RECV_ERROR; -} - static CURLcode pingpong(CURL *curl, const char *payload) { CURLcode res; int i; - res = ping(curl, payload); + res = ws_send_ping(curl, payload); if(res) return res; for(i = 0; i < 10; ++i) { curl_mfprintf(stderr, "Receive pong\n"); - res = recv_pong(curl, payload); + res = ws_recv_pong(curl, payload); if(res == CURLE_AGAIN) { curlx_wait_ms(100); continue; } - websocket_close(curl); + ws_close(curl); return res; } - websocket_close(curl); + ws_close(curl); return CURLE_RECV_ERROR; } #endif -static int test_ws_pingpong(int argc, char *argv[]) +static CURLcode test_cli_ws_pingpong(const char *URL) { #ifndef CURL_DISABLE_WEBSOCKETS CURL *curl; CURLcode res = CURLE_OK; - const char *url, *payload; + const char *payload; - if(argc != 3) { - curl_mfprintf(stderr, "usage: ws-pingpong url payload\n"); - return 2; + if(!URL || !libtest_arg2) { + curl_mfprintf(stderr, "need args: URL payload\n"); + return (CURLcode)2; } - url = argv[1]; - payload = argv[2]; + payload = libtest_arg2; curl_global_init(CURL_GLOBAL_ALL); curl = curl_easy_init(); if(curl) { - curl_easy_setopt(curl, CURLOPT_URL, url); + curl_easy_setopt(curl, CURLOPT_URL, URL); /* use the callback style */ curl_easy_setopt(curl, CURLOPT_USERAGENT, "ws-pingpong"); @@ -122,12 +84,11 @@ static int test_ws_pingpong(int argc, char *argv[]) curl_easy_cleanup(curl); } curl_global_cleanup(); - return (int)res; + return res; #else /* !CURL_DISABLE_WEBSOCKETS */ - (void)argc; - (void)argv; + (void)URL; curl_mfprintf(stderr, "WebSockets not enabled in libcurl\n"); - return 1; + return (CURLcode)1; #endif /* CURL_DISABLE_WEBSOCKETS */ } diff --git a/tests/libtest/first.c b/tests/libtest/first.c index acde2926c0..8a55ab56b8 100644 --- a/tests/libtest/first.c +++ b/tests/libtest/first.c @@ -61,6 +61,69 @@ struct curltime tv_test_start; /* for test timing */ int unitfail; /* for unittests */ +int coptind; +const char *coptarg; + +int cgetopt(int argc, const char * const argv[], const char *optstring) +{ + static int optpos = 1; + int coptopt; + const char *arg; + + if(coptind == 0) { /* Reset? */ + coptind = !!argc; + optpos = 1; + } + + arg = argv[coptind]; + if(arg && strcmp(arg, "--") == 0) { + coptind++; + return -1; + } + else if(!arg || arg[0] != '-') { + return -1; + } + else { + const char *opt = strchr(optstring, arg[optpos]); + coptopt = arg[optpos]; + if(!opt) { + if(!arg[++optpos]) { + coptind++; + optpos = 1; + } + return '?'; + } + else if(opt[1] == ':') { + if(arg[optpos + 1]) { + coptarg = arg + optpos + 1; + coptind++; + optpos = 1; + return coptopt; + } + else if(argv[coptind + 1]) { + coptarg = argv[coptind + 1]; + coptind += 2; + optpos = 1; + return coptopt; + } + else { + if(!arg[++optpos]) { + coptind++; + optpos = 1; + } + return *optstring == ':' ? ':' : '?'; + } + } + else { + if(!arg[++optpos]) { + coptind++; + optpos = 1; + } + return coptopt; + } + } +} + #ifdef CURLDEBUG static void memory_tracking_init(void) { @@ -97,10 +160,59 @@ char *hexdump(const unsigned char *buf, size_t len) return dump; } +#ifndef CURL_DISABLE_WEBSOCKETS +CURLcode ws_send_ping(CURL *curl, const char *send_payload) +{ + size_t sent; + CURLcode result = curl_ws_send(curl, send_payload, strlen(send_payload), + &sent, 0, CURLWS_PING); + curl_mfprintf(stderr, "ws: curl_ws_send returned %u, sent %zu\n", + result, sent); + return result; +} + +CURLcode ws_recv_pong(CURL *curl, const char *expected_payload) +{ + size_t rlen; + const struct curl_ws_frame *meta; + char buffer[256]; + CURLcode result = curl_ws_recv(curl, buffer, sizeof(buffer), &rlen, &meta); + if(result) { + curl_mfprintf(stderr, "ws: curl_ws_recv returned %u, received %zd\n", + result, rlen); + return result; + } + + if(!(meta->flags & CURLWS_PONG)) { + curl_mfprintf(stderr, "recv_pong: wrong frame, got %zd bytes rflags %x\n", + rlen, meta->flags); + return CURLE_RECV_ERROR; + } + + curl_mfprintf(stderr, "ws: got PONG back\n"); + if(rlen == strlen(expected_payload) && + !memcmp(expected_payload, buffer, rlen)) { + curl_mfprintf(stderr, "ws: got the same payload back\n"); + return CURLE_OK; /* lib2304 returned 'result' here. Intentional? */ + } + curl_mfprintf(stderr, "ws: did NOT get the same payload back\n"); + return CURLE_RECV_ERROR; +} + +/* just close the connection */ +void ws_close(CURL *curl) +{ + size_t sent; + CURLcode result = curl_ws_send(curl, "", 0, &sent, 0, CURLWS_CLOSE); + curl_mfprintf(stderr, "ws: curl_ws_send returned %u, sent %zu\n", + result, sent); +} +#endif /* CURL_DISABLE_WEBSOCKETS */ + int main(int argc, const char **argv) { - const char *URL; + const char *URL = ""; CURLcode result; entry_func_t entry_func; const char *entry_name; @@ -126,8 +238,9 @@ int main(int argc, const char **argv) test_argc = argc - 1; test_argv = argv + 1; - if(argc < 3) { - curl_mfprintf(stderr, "Pass testname and URL as arguments please\n"); + if(argc < 2) { + curl_mfprintf(stderr, "Pass testname " + "(and URL as argument for numbered tests) please\n"); return 1; } @@ -145,6 +258,11 @@ int main(int argc, const char **argv) return 1; } + if(argc > 2) { + URL = argv[2]; + curl_mfprintf(stderr, "URL: %s\n", URL); + } + if(argc > 3) libtest_arg2 = argv[3]; @@ -154,16 +272,12 @@ int main(int argc, const char **argv) if(argc > 5) libtest_arg4 = argv[5]; - URL = argv[2]; /* provide this to the rest */ - env = getenv("CURL_TESTNUM"); if(env) testnum = atoi(env); else testnum = 0; - curl_mfprintf(stderr, "URL: %s\n", URL); - result = entry_func(URL); curl_mfprintf(stderr, "Test ended with result %d\n", result); diff --git a/tests/libtest/first.h b/tests/libtest/first.h index 82b2e6aa64..32af7fe62d 100644 --- a/tests/libtest/first.h +++ b/tests/libtest/first.h @@ -79,11 +79,22 @@ extern const char **test_argv; extern int testnum; extern struct curltime tv_test_start; /* for test timing */ +extern int coptind; +extern const char *coptarg; +int cgetopt(int argc, const char * const argv[], const char *optstring); + extern int select_wrapper(int nfds, fd_set *rd, fd_set *wr, fd_set *exc, struct timeval *tv); extern char *hexdump(const unsigned char *buffer, size_t len); +#ifndef CURL_DISABLE_WEBSOCKETS +CURLcode ws_send_ping(CURL *curl, const char *send_payload); +CURLcode ws_recv_pong(CURL *curl, const char *expected_payload); +/* just close the connection */ +void ws_close(CURL *curl); +#endif + /* ** TEST_ERR_* values must within the CURLcode range to not cause compiler ** errors. diff --git a/tests/libtest/lib1515.c b/tests/libtest/lib1515.c index 64140977b5..348f1fd9ac 100644 --- a/tests/libtest/lib1515.c +++ b/tests/libtest/lib1515.c @@ -52,9 +52,9 @@ static CURLcode do_one_request(CURLM *m, const char *URL, const char *resolve) easy_setopt(curls, CURLOPT_RESOLVE, resolve_list); easy_setopt(curls, CURLOPT_DNS_CACHE_TIMEOUT, DNS_TIMEOUT); - libtest_debug_config.nohex = 1; - libtest_debug_config.tracetime = 1; - easy_setopt(curls, CURLOPT_DEBUGDATA, &libtest_debug_config); + debug_config.nohex = 1; + debug_config.tracetime = 1; + easy_setopt(curls, CURLOPT_DEBUGDATA, &debug_config); easy_setopt(curls, CURLOPT_DEBUGFUNCTION, libtest_debug_cb); easy_setopt(curls, CURLOPT_VERBOSE, 1L); diff --git a/tests/libtest/lib1522.c b/tests/libtest/lib1522.c index 569c46c527..85a901f2ac 100644 --- a/tests/libtest/lib1522.c +++ b/tests/libtest/lib1522.c @@ -60,9 +60,9 @@ static CURLcode test_lib1522(const char *URL) curl_easy_setopt(curl, CURLOPT_POSTFIELDS, g_Data); curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)sizeof(g_Data)); - libtest_debug_config.nohex = 1; - libtest_debug_config.tracetime = 1; - test_setopt(curl, CURLOPT_DEBUGDATA, &libtest_debug_config); + debug_config.nohex = 1; + debug_config.tracetime = 1; + test_setopt(curl, CURLOPT_DEBUGDATA, &debug_config); test_setopt(curl, CURLOPT_DEBUGFUNCTION, libtest_debug_cb); test_setopt(curl, CURLOPT_VERBOSE, 1L); diff --git a/tests/libtest/lib1540.c b/tests/libtest/lib1540.c index e54fdd515b..ffd9fbe374 100644 --- a/tests/libtest/lib1540.c +++ b/tests/libtest/lib1540.c @@ -106,9 +106,9 @@ static CURLcode test_lib1540(const char *URL) easy_setopt(curls, CURLOPT_XFERINFODATA, &st); easy_setopt(curls, CURLOPT_NOPROGRESS, 0L); - libtest_debug_config.nohex = 1; - libtest_debug_config.tracetime = 1; - test_setopt(curls, CURLOPT_DEBUGDATA, &libtest_debug_config); + debug_config.nohex = 1; + debug_config.tracetime = 1; + test_setopt(curls, CURLOPT_DEBUGDATA, &debug_config); easy_setopt(curls, CURLOPT_DEBUGFUNCTION, libtest_debug_cb); easy_setopt(curls, CURLOPT_VERBOSE, 1L); diff --git a/tests/libtest/lib1542.c b/tests/libtest/lib1542.c index 1f7dbed0a8..51df9edee0 100644 --- a/tests/libtest/lib1542.c +++ b/tests/libtest/lib1542.c @@ -46,9 +46,9 @@ static CURLcode test_lib1542(const char *URL) easy_setopt(easy, CURLOPT_URL, URL); - libtest_debug_config.nohex = 1; - libtest_debug_config.tracetime = 0; - easy_setopt(easy, CURLOPT_DEBUGDATA, &libtest_debug_config); + debug_config.nohex = 1; + debug_config.tracetime = 0; + easy_setopt(easy, CURLOPT_DEBUGDATA, &debug_config); easy_setopt(easy, CURLOPT_DEBUGFUNCTION, libtest_debug_cb); easy_setopt(easy, CURLOPT_VERBOSE, 1L); diff --git a/tests/libtest/lib1553.c b/tests/libtest/lib1553.c index 8be90d7d3c..e332990345 100644 --- a/tests/libtest/lib1553.c +++ b/tests/libtest/lib1553.c @@ -71,9 +71,9 @@ static CURLcode test_lib1553(const char *URL) easy_setopt(curls, CURLOPT_XFERINFOFUNCTION, t1553_xferinfo); easy_setopt(curls, CURLOPT_NOPROGRESS, 1L); - libtest_debug_config.nohex = 1; - libtest_debug_config.tracetime = 1; - test_setopt(curls, CURLOPT_DEBUGDATA, &libtest_debug_config); + debug_config.nohex = 1; + debug_config.tracetime = 1; + test_setopt(curls, CURLOPT_DEBUGDATA, &debug_config); easy_setopt(curls, CURLOPT_DEBUGFUNCTION, libtest_debug_cb); easy_setopt(curls, CURLOPT_VERBOSE, 1L); diff --git a/tests/libtest/lib1915.c b/tests/libtest/lib1915.c index 95928df964..0f3f135db4 100644 --- a/tests/libtest/lib1915.c +++ b/tests/libtest/lib1915.c @@ -103,8 +103,8 @@ static CURLcode test_lib1915(const char *URL) global_init(CURL_GLOBAL_ALL); - libtest_debug_config.nohex = 1; - libtest_debug_config.tracetime = 1; + debug_config.nohex = 1; + debug_config.tracetime = 1; easy_init(hnd); easy_setopt(hnd, CURLOPT_URL, URL); @@ -114,7 +114,7 @@ static CURLcode test_lib1915(const char *URL) easy_setopt(hnd, CURLOPT_HSTSWRITEFUNCTION, hstswrite); easy_setopt(hnd, CURLOPT_HSTSWRITEDATA, &st); easy_setopt(hnd, CURLOPT_HSTS_CTRL, CURLHSTS_ENABLE); - easy_setopt(hnd, CURLOPT_DEBUGDATA, &libtest_debug_config); + easy_setopt(hnd, CURLOPT_DEBUGDATA, &debug_config); easy_setopt(hnd, CURLOPT_DEBUGFUNCTION, libtest_debug_cb); easy_setopt(hnd, CURLOPT_VERBOSE, 1L); res = curl_easy_perform(hnd); @@ -133,7 +133,7 @@ static CURLcode test_lib1915(const char *URL) easy_setopt(hnd, CURLOPT_HSTSWRITEFUNCTION, hstswrite); easy_setopt(hnd, CURLOPT_HSTSWRITEDATA, &st); easy_setopt(hnd, CURLOPT_HSTS_CTRL, CURLHSTS_ENABLE); - easy_setopt(hnd, CURLOPT_DEBUGDATA, &libtest_debug_config); + easy_setopt(hnd, CURLOPT_DEBUGDATA, &debug_config); easy_setopt(hnd, CURLOPT_DEBUGFUNCTION, libtest_debug_cb); easy_setopt(hnd, CURLOPT_VERBOSE, 1L); res = curl_easy_perform(hnd); diff --git a/tests/libtest/lib2301.c b/tests/libtest/lib2301.c index 1a2eeb881a..3dd198115b 100644 --- a/tests/libtest/lib2301.c +++ b/tests/libtest/lib2301.c @@ -25,70 +25,19 @@ #ifndef CURL_DISABLE_WEBSOCKETS #if 0 - -static CURLcode t2301_send_ping(CURL *curl, const char *send_payload) -{ - size_t sent; - CURLcode result = - curl_ws_send(curl, send_payload, strlen(send_payload), &sent, CURLWS_PING); - curl_mfprintf(stderr, - "ws: curl_ws_send returned %d, sent %d\n", result, (int)sent); - - return result; -} - -static CURLcode t2301_recv_pong(CURL *curl, const char *expected_payload) -{ - size_t rlen; - unsigned int rflags; - char buffer[256]; - CURLcode result = - curl_ws_recv(curl, buffer, sizeof(buffer), &rlen, &rflags); - if(rflags & CURLWS_PONG) { - int same = 0; - curl_mfprintf(stderr, "ws: got PONG back\n"); - if(rlen == strlen(expected_payload)) { - if(!memcmp(expected_payload, buffer, rlen)) { - curl_mfprintf(stderr, "ws: got the same payload back\n"); - same = 1; - } - } - if(!same) - curl_mfprintf(stderr, "ws: did NOT get the same payload back\n"); - } - else { - curl_mfprintf(stderr, "recv_pong: got %d bytes rflags %x\n", - (int)rlen, rflags); - } - curl_mfprintf(stderr, "ws: curl_ws_recv returned %d, received %d\n", result, - (int)rlen); - return result; -} - -/* just close the connection */ -static void t2301_websocket_close(CURL *curl) -{ - size_t sent; - CURLcode result = - curl_ws_send(curl, "", 0, &sent, CURLWS_CLOSE); - curl_mfprintf(stderr, - "ws: curl_ws_send returned %d, sent %d\n", result, (int)sent); -} - static void t2301_websocket(CURL *curl) { int i = 0; curl_mfprintf(stderr, "ws: websocket() starts\n"); do { - if(t2301_send_ping(curl, "foobar")) + if(ws_send_ping(curl, "foobar")) return; - if(t2301_recv_pong(curl, "foobar")) + if(ws_recv_pong(curl, "foobar")) return; curlx_wait_ms(2000); } while(i++ < 10); - t2301_websocket_close(curl); + ws_close(curl); } - #endif static size_t t2301_write_cb(char *b, size_t size, size_t nitems, void *p) diff --git a/tests/libtest/lib2304.c b/tests/libtest/lib2304.c index 8950f1f25e..40e5d3acee 100644 --- a/tests/libtest/lib2304.c +++ b/tests/libtest/lib2304.c @@ -24,48 +24,6 @@ #include "first.h" #ifndef CURL_DISABLE_WEBSOCKETS - -static CURLcode t2304_send_ping(CURL *curl, const char *send_payload) -{ - size_t sent; - CURLcode result = - curl_ws_send(curl, send_payload, strlen(send_payload), &sent, 0, - CURLWS_PING); - curl_mfprintf(stderr, - "ws: curl_ws_send returned %d, sent %d\n", result, (int)sent); - - return result; -} - -static CURLcode t2304_recv_pong(CURL *curl, const char *expected_payload) -{ - size_t rlen; - const struct curl_ws_frame *meta; - char buffer[256]; - CURLcode result = curl_ws_recv(curl, buffer, sizeof(buffer), &rlen, &meta); - if(!result) { - if(meta->flags & CURLWS_PONG) { - int same = 0; - curl_mfprintf(stderr, "ws: got PONG back\n"); - if(rlen == strlen(expected_payload)) { - if(!memcmp(expected_payload, buffer, rlen)) { - curl_mfprintf(stderr, "ws: got the same payload back\n"); - same = 1; - } - } - if(!same) - curl_mfprintf(stderr, "ws: did NOT get the same payload back\n"); - } - else { - curl_mfprintf(stderr, "recv_pong: got %d bytes rflags %x\n", (int)rlen, - meta->flags); - } - } - curl_mfprintf(stderr, "ws: curl_ws_recv returned %d, received %d\n", result, - (int)rlen); - return result; -} - static CURLcode recv_any(CURL *curl) { size_t rlen; @@ -80,16 +38,6 @@ static CURLcode recv_any(CURL *curl) return CURLE_OK; } -/* just close the connection */ -static void t2304_websocket_close(CURL *curl) -{ - size_t sent; - CURLcode result = - curl_ws_send(curl, "", 0, &sent, 0, CURLWS_CLOSE); - curl_mfprintf(stderr, - "ws: curl_ws_send returned %d, sent %u\n", result, (int)sent); -} - static void t2304_websocket(CURL *curl) { int i = 0; @@ -97,16 +45,16 @@ static void t2304_websocket(CURL *curl) do { recv_any(curl); curl_mfprintf(stderr, "Send ping\n"); - if(t2304_send_ping(curl, "foobar")) + if(ws_send_ping(curl, "foobar")) return; curl_mfprintf(stderr, "Receive pong\n"); - if(t2304_recv_pong(curl, "foobar")) { + if(ws_recv_pong(curl, "foobar")) { curl_mprintf("Connection closed\n"); return; } curlx_wait_ms(2000); } while(i++ < 10); - t2304_websocket_close(curl); + ws_close(curl); } #endif diff --git a/tests/libtest/lib2502.c b/tests/libtest/lib2502.c index ac8dbb11b5..2ae7129cf6 100644 --- a/tests/libtest/lib2502.c +++ b/tests/libtest/lib2502.c @@ -75,9 +75,9 @@ static CURLcode test_lib2502(const char *URL) /* wait for first connection established to see if we can share it */ easy_setopt(curl[i], CURLOPT_PIPEWAIT, 1L); /* go verbose */ - libtest_debug_config.nohex = 1; - libtest_debug_config.tracetime = 0; - test_setopt(curl[i], CURLOPT_DEBUGDATA, &libtest_debug_config); + debug_config.nohex = 1; + debug_config.tracetime = 0; + test_setopt(curl[i], CURLOPT_DEBUGDATA, &debug_config); easy_setopt(curl[i], CURLOPT_DEBUGFUNCTION, libtest_debug_cb); easy_setopt(curl[i], CURLOPT_VERBOSE, 1L); /* include headers */ diff --git a/tests/libtest/lib2700.c b/tests/libtest/lib2700.c index b7c2d901c2..c3b2cc42f4 100644 --- a/tests/libtest/lib2700.c +++ b/tests/libtest/lib2700.c @@ -222,9 +222,9 @@ static CURLcode test_lib2700(const char *URL) easy_setopt(curl, CURLOPT_URL, URL); easy_setopt(curl, CURLOPT_USERAGENT, "client/test2700"); - libtest_debug_config.nohex = 1; - libtest_debug_config.tracetime = 1; - easy_setopt(curl, CURLOPT_DEBUGDATA, &libtest_debug_config); + debug_config.nohex = 1; + debug_config.tracetime = 1; + easy_setopt(curl, CURLOPT_DEBUGDATA, &debug_config); easy_setopt(curl, CURLOPT_DEBUGFUNCTION, libtest_debug_cb); easy_setopt(curl, CURLOPT_VERBOSE, 1L); easy_setopt(curl, CURLOPT_CONNECT_ONLY, 2L); diff --git a/tests/libtest/lib3033.c b/tests/libtest/lib3033.c index e4befc2f53..f8ac085bef 100644 --- a/tests/libtest/lib3033.c +++ b/tests/libtest/lib3033.c @@ -45,7 +45,7 @@ static CURLcode t3033_req_test(CURLM *multi, CURL *easy, curl_easy_reset(easy); curl_easy_setopt(easy, CURLOPT_URL, URL); - easy_setopt(easy, CURLOPT_DEBUGDATA, &libtest_debug_config); + easy_setopt(easy, CURLOPT_DEBUGDATA, &debug_config); easy_setopt(easy, CURLOPT_DEBUGFUNCTION, libtest_debug_cb); easy_setopt(easy, CURLOPT_VERBOSE, 1L); @@ -107,8 +107,8 @@ static CURLcode test_lib3033(const char *URL) multi_init(multi); easy_init(curl); - libtest_debug_config.nohex = 1; - libtest_debug_config.tracetime = 1; + debug_config.nohex = 1; + debug_config.tracetime = 1; res = t3033_req_test(multi, curl, URL, 0); if(res != CURLE_OK) diff --git a/tests/libtest/lib500.c b/tests/libtest/lib500.c index 2a2365fd9f..bc119d5f41 100644 --- a/tests/libtest/lib500.c +++ b/tests/libtest/lib500.c @@ -73,9 +73,9 @@ static CURLcode test_lib500(const char *URL) test_setopt(curl, CURLOPT_URL, URL); test_setopt(curl, CURLOPT_HEADER, 1L); - libtest_debug_config.nohex = 1; - libtest_debug_config.tracetime = 1; - test_setopt(curl, CURLOPT_DEBUGDATA, &libtest_debug_config); + debug_config.nohex = 1; + debug_config.tracetime = 1; + test_setopt(curl, CURLOPT_DEBUGDATA, &debug_config); test_setopt(curl, CURLOPT_DEBUGFUNCTION, libtest_debug_cb); test_setopt(curl, CURLOPT_VERBOSE, 1L); diff --git a/tests/libtest/lib552.c b/tests/libtest/lib552.c index 50308b963b..5dec1949c3 100644 --- a/tests/libtest/lib552.c +++ b/tests/libtest/lib552.c @@ -27,99 +27,9 @@ #include "first.h" +#include "testtrace.h" #include "memdebug.h" -struct t552_testdata { - char trace_ascii; /* 1 or 0 */ -}; - -static void dump(const char *text, - FILE *stream, unsigned char *ptr, size_t size, - char nohex) -{ - size_t i; - size_t c; - - unsigned int width = 0x10; - - if(nohex) - /* without the hex output, we can fit more on screen */ - width = 0x40; - - curl_mfprintf(stream, "%s, %zu bytes (0x%zx)\n", text, size, size); - - for(i = 0; i < size; i += width) { - - curl_mfprintf(stream, "%04zx: ", i); - - if(!nohex) { - /* hex not disabled, show it */ - for(c = 0; c < width; c++) - if(i + c < size) - curl_mfprintf(stream, "%02x ", ptr[i + c]); - else - fputs(" ", stream); - } - - for(c = 0; (c < width) && (i + c < size); c++) { - /* check for 0D0A; if found, skip past and start a new line of output */ - if(nohex && (i + c + 1 < size) && ptr[i + c] == 0x0D && - ptr[i + c + 1] == 0x0A) { - i += (c + 2 - width); - break; - } - curl_mfprintf(stream, "%c", - (ptr[i + c] >= 0x20) && (ptr[i + c] < 0x80) ? ptr[i + c] : '.'); - /* check again for 0D0A, to avoid an extra \n if it's at width */ - if(nohex && (i + c + 2 < size) && ptr[i + c + 1] == 0x0D && - ptr[i + c + 2] == 0x0A) { - i += (c + 3 - width); - break; - } - } - fputc('\n', stream); /* newline */ - } - fflush(stream); -} - -static int my_trace(CURL *handle, curl_infotype type, - char *data, size_t size, - void *userp) -{ - struct t552_testdata *config = (struct t552_testdata *)userp; - const char *text; - (void)handle; /* prevent compiler warning */ - - switch(type) { - case CURLINFO_TEXT: - curl_mfprintf(stderr, "== Info: %s", (char *)data); - return 0; - case CURLINFO_HEADER_OUT: - text = "=> Send header"; - break; - case CURLINFO_DATA_OUT: - text = "=> Send data"; - break; - case CURLINFO_SSL_DATA_OUT: - text = "=> Send SSL data"; - break; - case CURLINFO_HEADER_IN: - text = "<= Recv header"; - break; - case CURLINFO_DATA_IN: - text = "<= Recv data"; - break; - case CURLINFO_SSL_DATA_IN: - text = "<= Recv SSL data"; - break; - default: /* in case a new one is introduced to shock us */ - return 0; - } - - dump(text, stderr, (unsigned char *)data, size, config->trace_ascii); - return 0; -} - static size_t current_offset = 0; static char databuf[70000]; /* MUST be more than 64k OR MAX_INITIAL_POST_SIZE */ @@ -161,17 +71,17 @@ static CURLcode test_lib552(const char *URL) { CURL *curl; CURLcode res = CURLE_OK; - struct t552_testdata config; size_t i; static const char fill[] = "test data"; - config.trace_ascii = 1; /* enable ASCII tracing */ + debug_config.nohex = 1; + debug_config.tracetime = 0; global_init(CURL_GLOBAL_ALL); easy_init(curl); - test_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); - test_setopt(curl, CURLOPT_DEBUGDATA, &config); + test_setopt(curl, CURLOPT_DEBUGFUNCTION, libtest_debug_cb); + test_setopt(curl, CURLOPT_DEBUGDATA, &debug_config); /* the DEBUGFUNCTION has no effect until we enable VERBOSE */ test_setopt(curl, CURLOPT_VERBOSE, 1L); diff --git a/tests/libtest/lib573.c b/tests/libtest/lib573.c index 735f1781c1..5e291fa198 100644 --- a/tests/libtest/lib573.c +++ b/tests/libtest/lib573.c @@ -53,9 +53,9 @@ static CURLcode test_lib573(const char *URL) easy_setopt(c, CURLOPT_HEADER, 1L); easy_setopt(c, CURLOPT_URL, URL); - libtest_debug_config.nohex = 1; - libtest_debug_config.tracetime = 1; - easy_setopt(c, CURLOPT_DEBUGDATA, &libtest_debug_config); + debug_config.nohex = 1; + debug_config.tracetime = 1; + easy_setopt(c, CURLOPT_DEBUGDATA, &debug_config); easy_setopt(c, CURLOPT_DEBUGFUNCTION, libtest_debug_cb); easy_setopt(c, CURLOPT_VERBOSE, 1L); diff --git a/tests/libtest/lib753.c b/tests/libtest/lib753.c index 1b86f1aec5..24881039cd 100644 --- a/tests/libtest/lib753.c +++ b/tests/libtest/lib753.c @@ -83,7 +83,7 @@ static bool t753_setup(const char *URL, const char *name, easy_setopt(easy, CURLOPT_HEADERDATA, st); easy_setopt(easy, CURLOPT_NOPROGRESS, 1L); - easy_setopt(easy, CURLOPT_DEBUGDATA, &libtest_debug_config); + easy_setopt(easy, CURLOPT_DEBUGDATA, &debug_config); easy_setopt(easy, CURLOPT_DEBUGFUNCTION, libtest_debug_cb); easy_setopt(easy, CURLOPT_VERBOSE, 1L); @@ -107,8 +107,8 @@ static CURLcode test_lib753(const char *URL) start_test_timing(); - libtest_debug_config.nohex = 1; - libtest_debug_config.tracetime = 1; + debug_config.nohex = 1; + debug_config.tracetime = 1; curl_global_init(CURL_GLOBAL_DEFAULT); diff --git a/tests/libtest/testtrace.c b/tests/libtest/testtrace.c index 7e287cd885..2a46c3940d 100644 --- a/tests/libtest/testtrace.c +++ b/tests/libtest/testtrace.c @@ -25,14 +25,14 @@ #include "memdebug.h" -struct libtest_trace_cfg libtest_debug_config; +struct libtest_trace_cfg debug_config; static time_t epoch_offset; /* for test time tracing */ static int known_offset; /* for test time tracing */ -static void libtest_debug_dump(const char *timebuf, const char *text, - FILE *stream, const unsigned char *ptr, - size_t size, int nohex) +void debug_dump(const char *timebuf, const char *text, + FILE *stream, const unsigned char *ptr, + size_t size, int nohex) { size_t i; size_t c; @@ -61,9 +61,8 @@ static void libtest_debug_dump(const char *timebuf, const char *text, for(c = 0; (c < width) && (i + c < size); c++) { /* check for 0D0A; if found, skip past and start a new line of output */ - if(nohex && - (i + c + 1 < size) && (ptr[i + c] == 0x0D) && - (ptr[i + c + 1] == 0x0A)) { + if(nohex && (i + c + 1 < size) && ptr[i + c] == 0x0D && + ptr[i + c + 1] == 0x0A) { i += (c + 2 - width); break; } @@ -71,9 +70,8 @@ static void libtest_debug_dump(const char *timebuf, const char *text, ((ptr[i + c] >= 0x20) && (ptr[i + c] < 0x80)) ? ptr[i + c] : '.'); /* check again for 0D0A, to avoid an extra \n if it's at width */ - if(nohex && - (i + c + 2 < size) && (ptr[i + c + 1] == 0x0D) && - (ptr[i + c + 2] == 0x0A)) { + if(nohex && (i + c + 2 < size) && ptr[i + c + 1] == 0x0D && + ptr[i + c + 2] == 0x0A) { i += (c + 3 - width); break; } @@ -114,7 +112,7 @@ int libtest_debug_cb(CURL *handle, curl_infotype type, switch(type) { case CURLINFO_TEXT: - curl_mfprintf(stderr, "%s== Info: %s", timestr, (char *)data); + curl_mfprintf(stderr, "%s== Info: %s", timestr, data); return 0; case CURLINFO_HEADER_OUT: text = "=> Send header"; @@ -138,7 +136,101 @@ int libtest_debug_cb(CURL *handle, curl_infotype type, return 0; } - libtest_debug_dump(timebuf, text, stderr, (unsigned char *)data, size, - trace_cfg->nohex); + debug_dump(timebuf, text, stderr, (const unsigned char *)data, size, + trace_cfg->nohex); + return 0; +} + +static void log_line_start(FILE *log, const char *idsbuf, curl_infotype type) +{ + /* + * This is the trace look that is similar to what libcurl makes on its + * own. + */ + static const char * const s_infotype[] = { + "* ", "< ", "> ", "{ ", "} ", "{ ", "} " + }; + if(idsbuf && *idsbuf) + curl_mfprintf(log, "%s%s", idsbuf, s_infotype[type]); + else + fputs(s_infotype[type], log); +} + +/* callback for CURLOPT_DEBUGFUNCTION (used in client tests) */ +int cli_debug_cb(CURL *handle, curl_infotype type, + char *data, size_t size, void *userp) +{ + FILE *output = stderr; + static int newl = 0; + static int traced_data = 0; + char idsbuf[60]; + curl_off_t xfer_id, conn_id; + + (void)handle; /* not used */ + (void)userp; + + if(!curl_easy_getinfo(handle, CURLINFO_XFER_ID, &xfer_id) && xfer_id >= 0) { + if(!curl_easy_getinfo(handle, CURLINFO_CONN_ID, &conn_id) && + conn_id >= 0) { + curl_msnprintf(idsbuf, sizeof(idsbuf), + "[%" CURL_FORMAT_CURL_OFF_T "-" + "%" CURL_FORMAT_CURL_OFF_T "] ", xfer_id, conn_id); + } + else { + curl_msnprintf(idsbuf, sizeof(idsbuf), + "[%" CURL_FORMAT_CURL_OFF_T "-x] ", xfer_id); + } + } + else + idsbuf[0] = 0; + + switch(type) { + case CURLINFO_HEADER_OUT: + if(size > 0) { + size_t st = 0; + size_t i; + for(i = 0; i < size - 1; i++) { + if(data[i] == '\n') { /* LF */ + if(!newl) { + log_line_start(output, idsbuf, type); + } + (void)fwrite(data + st, i - st + 1, 1, output); + st = i + 1; + newl = 0; + } + } + if(!newl) + log_line_start(output, idsbuf, type); + (void)fwrite(data + st, i - st + 1, 1, output); + } + newl = (size && (data[size - 1] != '\n')) ? 1 : 0; + traced_data = 0; + break; + case CURLINFO_TEXT: + case CURLINFO_HEADER_IN: + if(!newl) + log_line_start(output, idsbuf, type); + (void)fwrite(data, size, 1, output); + newl = (size && (data[size - 1] != '\n')) ? 1 : 0; + traced_data = 0; + break; + case CURLINFO_DATA_OUT: + case CURLINFO_DATA_IN: + case CURLINFO_SSL_DATA_IN: + case CURLINFO_SSL_DATA_OUT: + if(!traced_data) { + if(!newl) + log_line_start(output, idsbuf, type); + curl_mfprintf(output, "[%ld bytes data]\n", (long)size); + newl = 0; + traced_data = 1; + } + break; + default: /* nada */ + newl = 0; + traced_data = 1; + break; + } + return 0; } diff --git a/tests/libtest/testtrace.h b/tests/libtest/testtrace.h index 82d75988d3..d9eac5d0eb 100644 --- a/tests/libtest/testtrace.h +++ b/tests/libtest/testtrace.h @@ -25,14 +25,22 @@ ***************************************************************************/ #include "first.h" +void debug_dump(const char *timebuf, const char *text, + FILE *stream, const unsigned char *ptr, + size_t size, int nohex); + struct libtest_trace_cfg { int tracetime; /* 0 represents FALSE, anything else TRUE */ int nohex; /* 0 represents FALSE, anything else TRUE */ }; -extern struct libtest_trace_cfg libtest_debug_config; +extern struct libtest_trace_cfg debug_config; int libtest_debug_cb(CURL *handle, curl_infotype type, char *data, size_t size, void *userp); +/* callback for CURLOPT_DEBUGFUNCTION (client tests) */ +int cli_debug_cb(CURL *handle, curl_infotype type, + char *data, size_t size, void *userp); + #endif /* HEADER_LIBTEST_TESTTRACE_H */