[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[libmicrohttpd] 12/29: Added back testing with socat as a fallback optio
From: |
gnunet |
Subject: |
[libmicrohttpd] 12/29: Added back testing with socat as a fallback option |
Date: |
Tue, 20 Jun 2023 22:24:25 +0200 |
This is an automated email from the git hooks/post-receive script.
karlson2k pushed a commit to branch master
in repository libmicrohttpd.
commit c0f7cbb280cff285b5ca7991fb865b761f230f8a
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
AuthorDate: Fri Oct 28 12:06:46 2022 +0300
Added back testing with socat as a fallback option
---
configure.ac | 27 ++++++--
src/testzzuf/Makefile.am | 29 +++++++-
src/testzzuf/test_get.c | 107 ++++++++++++++++++------------
src/testzzuf/zzuf_socat_test_runner.sh | 118 +++++++++++++++++++++++++++++++++
src/testzzuf/zzuf_test_runner.sh | 45 ++++++++++++-
5 files changed, 273 insertions(+), 53 deletions(-)
diff --git a/configure.ac b/configure.ac
index 5b3c578c..8b7489c3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1789,6 +1789,7 @@ AS_VAR_IF([use_heavy_tests], ["yes"],
]
)
AM_CONDITIONAL([HEAVY_TESTS],[test "x$use_heavy_tests" = "xyes"])
+AM_CONDITIONAL([VHEAVY_TESTS],[test "x$use_vheavy_tests" = "xyes"])
AM_CONDITIONAL([TESTS_STRESS_OS],[false])
AC_ARG_ENABLE([[poll]],
@@ -4844,6 +4845,7 @@ int main(void)
# fuzzing tests
run_zzuf_tests="no"
+zzuf_socat_mandatory="no"
AS_VAR_IF([use_heavy_tests],["yes"],
[
AS_VAR_IF([enable_curl],["yes"],
@@ -4855,19 +4857,32 @@ AS_VAR_IF([use_heavy_tests],["yes"],
run_zzuf_tests_MSG="no, zzuf tool not found"
],
[
+ AC_PATH_PROG([SOCAT],[socat],[no])
AS_IF([test "x${ac_cv_func_accept4}" = "xyes" && test
"x${enable_asserts}" = "xno"],
[
- run_zzuf_tests="no"
- run_zzuf_tests_MSG="no, fuzzing tests require asserts enabled
on this platform"
+ zzuf_socat_mandatory="yes"
+ AS_VAR_IF([SOCAT],["no"],
+ [run_zzuf_tests_MSG="no, socat not found, but required for
fuzzing tests on this platform without asserts enabled"],
+ [
+ run_zzuf_tests="yes"
+ run_zzuf_tests_MSG="yes, with zzuf and socat tools"
+ ]
+ )
],
[test -n "${enabled_sanitizers}"],
[
- run_zzuf_tests="no"
- run_zzuf_tests_MSG="no, fuzzing tests cannot be used with
sanitizers"
+ zzuf_socat_mandatory="yes"
+ AS_VAR_IF([SOCAT],["no"],
+ [run_zzuf_tests_MSG="no, socat not found, but required for
fuzzing tests when sanitizers enabled"],
+ [
+ run_zzuf_tests="yes"
+ run_zzuf_tests_MSG="yes, with zzuf and socat tools"
+ ]
+ )
],
[
run_zzuf_tests="yes"
- run_zzuf_tests_MSG="yes"
+ run_zzuf_tests_MSG="yes, with zzuf tool"
]
)
]
@@ -4885,6 +4900,7 @@ AS_VAR_IF([use_heavy_tests],["yes"],
]
)
AM_CONDITIONAL([RUN_ZZUF_TESTS],[test "x$run_zzuf_tests" = "xyes"])
+AM_CONDITIONAL([FORCE_USE_ZZUF_SOCAT],[test "x$zzuf_socat_mandatory" = "xyes"])
# Final flags that may interfere with autoconf detections
AS_CASE([${enable_build_type}],[debug|debugger],
@@ -4959,6 +4975,7 @@ AC_CONFIG_COMMANDS([po-directories],
AC_DEFINE_DIR([MHD_PLUGIN_INSTALL_PREFIX], [libdir/libmicrohttpd], [tls
plugins])
AC_SUBST([ZZUF])
+AC_SUBST([SOCAT])
# should experimental code be compiled (code that may not yet compile)?
AC_MSG_CHECKING(whether to compile experimental code)
diff --git a/src/testzzuf/Makefile.am b/src/testzzuf/Makefile.am
index 23b96d66..f38c6d0e 100644
--- a/src/testzzuf/Makefile.am
+++ b/src/testzzuf/Makefile.am
@@ -10,6 +10,15 @@ ZZUF_SEED = 0
# Additional flags for zzuf
ZZUF_FLAGS =
+# Additional flags for socat (if socat is used)
+SOCAT_FLAGS =
+
+if FORCE_USE_ZZUF_SOCAT
+TEST_RUNNER_SCRIPT = zzuf_socat_test_runner.sh
+else
+TEST_RUNNER_SCRIPT = zzuf_test_runner.sh
+endif
+
AM_CPPFLAGS = \
-I$(top_srcdir)/src/include \
-I$(top_srcdir)/src/microhttpd \
@@ -23,7 +32,9 @@ AM_LDFLAGS = $(LDFLAGS_ac)
AM_TESTS_ENVIRONMENT = $(TESTS_ENVIRONMENT_ac) \
ZZUF="$(ZZUF)" ; export ZZUF ; \
ZZUF_SEED="$(ZZUF_SEED)" ; export ZZUF_SEED ; \
- ZZUF_FLAGS="$(ZZUF_FLAGS)" ; export ZZUF_FLAGS ;
+ ZZUF_FLAGS="$(ZZUF_FLAGS)" ; export ZZUF_FLAGS ; \
+ SOCAT="$(SOCAT)" ; export SOCAT ; \
+ SOCAT_FLAGS="$(SOCAT_FLAGS)" ; export SOCAT_FLAGS ;
if USE_COVERAGE
AM_CFLAGS += -fprofile-arcs -ftest-coverage
@@ -70,9 +81,21 @@ check_PROGRAMS = \
TESTS = $(check_PROGRAMS)
-dist_check_SCRIPTS = zzuf_test_runner.sh
+dist_check_SCRIPTS = zzuf_test_runner.sh zzuf_socat_test_runner.sh
+
+LOG_COMPILER = @SHELL@ "$(srcdir)/$(TEST_RUNNER_SCRIPT)"
+
+if VHEAVY_TESTS
+check_SCRIPTS = warn_vheavy_use
+
+.PHONY: warn_vheavy_use
+endif
-LOG_COMPILER = @SHELL@ $(srcdir)/zzuf_test_runner.sh
+warn_vheavy_use:
+ @echo "NOTICE" ; \
+ echo "NOTICE: Full heavy tests are enabled. Each test may take up to
several minutes to complete." ; \
+ echo "NOTICE"
+
tests_common_sources = mhd_debug_funcs.h mhd_debug_funcs.c
diff --git a/src/testzzuf/test_get.c b/src/testzzuf/test_get.c
index 904808bc..94a4e833 100644
--- a/src/testzzuf/test_get.c
+++ b/src/testzzuf/test_get.c
@@ -96,8 +96,14 @@ static int use_post_form;
static int use_long_header;
static int use_long_uri;
static int use_close;
+static int run_with_socat;
#define TEST_BASE_URI "http:/" "/127.0.0.1/test_uri"
+#define TEST_BASE_URI_SOCAT "http:/" "/127.0.0.121/test_uri"
+
+#define SOCAT_PORT 10121
+
+#define TEST_BASE_PORT 4010
#define EMPTY_PAGE "Empty page."
#define EMPTY_PAGE_ALT "Alternative empty page."
@@ -959,19 +965,24 @@ setupCURL (struct CBC *cbc, uint16_t port
CURLcode e;
char *buf;
const char *uri_to_use;
+ const char *base_uri;
#ifndef TEST_USE_STATIC_POST_DATA
*mime = NULL;
#endif /* ! TEST_USE_STATIC_POST_DATA */
+ base_uri = run_with_socat ? TEST_BASE_URI_SOCAT : TEST_BASE_URI;
if (! use_long_uri)
{
- uri_to_use = TEST_BASE_URI;
+ uri_to_use = base_uri;
buf = NULL;
}
else
{
size_t pos;
+ size_t base_uri_len;
+
+ base_uri_len = strlen (base_uri);
buf = malloc (TEST_STRING_VLONG_LEN + 1);
if (NULL == buf)
{
@@ -979,8 +990,8 @@ setupCURL (struct CBC *cbc, uint16_t port
"at line %d.\n", (int) __LINE__);
return NULL;
}
- memcpy (buf, TEST_BASE_URI, MHD_STATICSTR_LEN_ (TEST_BASE_URI));
- for (pos = MHD_STATICSTR_LEN_ (TEST_BASE_URI);
+ memcpy (buf, base_uri, base_uri_len);
+ for (pos = base_uri_len;
pos < TEST_STRING_VLONG_LEN;
++pos)
{
@@ -993,6 +1004,8 @@ setupCURL (struct CBC *cbc, uint16_t port
buf[TEST_STRING_VLONG_LEN] = 0;
uri_to_use = buf;
}
+ if (run_with_socat)
+ port = SOCAT_PORT;
c = curl_easy_init ();
if (NULL == c)
@@ -1189,8 +1202,10 @@ start_daemon_for_test (unsigned int daemon_flags,
uint16_t *pport,
"at line %d.\n", (int) __LINE__);
return NULL;
}
+
/* Do not use accept4() as only accept() is intercepted by zzuf */
- MHD_avoid_accept4_ (d);
+ if (! run_with_socat)
+ MHD_avoid_accept4_ (d);
if (0 == *pport)
{
@@ -1516,44 +1531,49 @@ run_all_checks (void)
unsigned int testRes;
unsigned int ret = 0;
- if (MHD_are_sanitizers_enabled_ ())
+ if (! run_with_socat)
{
- fprintf (stderr, "The test does not work with sanitizers. "
- "At line %d.\n", (int) __LINE__);
- return 77;
- }
- if (! MHD_is_avoid_accept4_possible_ ())
- {
- fprintf (stderr,
- "Non-debug build of MHD on this platform use accept4() function. "
- "Test with zzuf is not possible. "
- "At line %d.\n", (int) __LINE__);
- return 77;
+ if (MHD_are_sanitizers_enabled_ ())
+ {
+ fprintf (stderr, "Direct run with zzuf does not work with sanitizers. "
+ "At line %d.\n", (int) __LINE__);
+ return 77;
+ }
+ if (! MHD_is_avoid_accept4_possible_ ())
+ {
+ fprintf (stderr,
+ "Non-debug build of MHD on this platform use accept4()
function. "
+ "Direct run with zzuf is not possible. "
+ "At line %d.\n", (int) __LINE__);
+ return 77;
+ }
+ if (MHD_NO != MHD_is_feature_supported (MHD_FEATURE_AUTODETECT_BIND_PORT))
+ port = 0; /* Use system automatic assignment */
+ else
+ {
+ port = TEST_BASE_PORT; /* Use predefined port, may break parallel
testing of another MHD build */
+ if (oneone)
+ port += 100;
+ if (use_long_uri)
+ port += 30;
+ else if (use_long_header)
+ port += 35;
+ else if (use_get_chunked)
+ port += 0;
+ else if (use_get)
+ port += 5;
+ else if (use_post_form)
+ port += 10;
+ else if (use_post)
+ port += 15;
+ else if (use_put_large)
+ port += 20;
+ else if (use_put_chunked)
+ port += 25;
+ }
}
- if (MHD_NO != MHD_is_feature_supported (MHD_FEATURE_AUTODETECT_BIND_PORT))
- port = 0; /* Use system automatic assignment */
else
- {
- port = 4010; /* Use predefined port, may break parallel testing of
another MHD build */
- if (oneone)
- port += 100;
- if (use_long_uri)
- port += 30;
- else if (use_long_header)
- port += 35;
- else if (use_get_chunked)
- port += 0;
- else if (use_get)
- port += 5;
- else if (use_post_form)
- port += 10;
- else if (use_post)
- port += 15;
- else if (use_put_large)
- port += 20;
- else if (use_put_chunked)
- port += 25;
- }
+ port = TEST_BASE_PORT; /* Use predefined port, may break parallel testing
of another MHD build */
if (! dry_run && (MHD_YES == MHD_is_feature_supported (MHD_FEATURE_THREADS)))
{
@@ -1600,6 +1620,7 @@ int
main (int argc, char *const *argv)
{
unsigned int res;
+ int use_magic_exit_codes;
oneone = ! has_in_name (argv[0], "10");
use_get = has_in_name (argv[0], "_get");
@@ -1613,6 +1634,7 @@ main (int argc, char *const *argv)
use_long_uri = has_in_name (argv[0], "_long_uri");
use_close = has_in_name (argv[0], "_close");
+ run_with_socat = has_param (argc, argv, "--with-socat");
dry_run = has_param (argc, argv, "--dry-run") ||
has_param (argc, argv, "-n");
@@ -1623,17 +1645,18 @@ main (int argc, char *const *argv)
"for the test type.\n", argv[0] ? argv[0] : "(NULL)");
return 99;
}
+ use_magic_exit_codes = run_with_socat || dry_run;
/* zzuf cannot bypass exit values.
Unless 'dry run' is used, do not return errors for external error
conditions (like out-of-memory) as they will be reported as test
failures. */
if (! test_global_init ())
- return dry_run ? 99 : 0;
+ return use_magic_exit_codes ? 99 : 0;
res = run_all_checks ();
test_global_deinit ();
if (99 == res)
- return dry_run ? 99 : 0;
+ return use_magic_exit_codes ? 99 : 0;
if (77 == res)
- return dry_run ? 77 : 0;
+ return use_magic_exit_codes ? 77 : 0;
return (0 == res) ? 0 : 1; /* 0 == pass */
}
diff --git a/src/testzzuf/zzuf_socat_test_runner.sh
b/src/testzzuf/zzuf_socat_test_runner.sh
new file mode 100755
index 00000000..6bc4ef37
--- /dev/null
+++ b/src/testzzuf/zzuf_socat_test_runner.sh
@@ -0,0 +1,118 @@
+#!/bin/sh
+
+if set -m ; then : ; else
+ echo "The shell $SHELL does not support background jobs, the test cannot
run." 1>&2
+ exit 77
+fi
+
+socat_listen_ip='127.0.0.121'
+socat_listen_port='10121'
+mhd_listen_port='4010'
+max_runtime_sec='300'
+
+if test "x${ZZUF}" = "xno" ; then
+ echo "zzuf command missing" 1>&2
+ exit 77
+fi
+
+if command -v "${ZZUF}" > /dev/null 2>&1 ; then : ; else
+ echo "zzuf command missing" 1>&2
+ exit 77
+fi
+
+if test "x${SOCAT}" = "xno" ; then
+ echo "socat command missing" 1>&2
+ exit 77
+fi
+
+if command -v "${SOCAT}" > /dev/null 2>&1 ; then : ; else
+ echo "socat command missing" 1>&2
+ exit 77
+fi
+
+socat_test_params="-ls -lu \
+ -T0.1 -4 \
+
TCP-LISTEN:${socat_listen_port},bind=${socat_listen_ip},reuseaddr,linger=2,linger2=1,accept-timeout=0.1
\
+ TCP:127.0.0.1:${mhd_listen_port},reuseaddr"
+
+echo "## Trying to run socat to test ports availability..."
+if "${SOCAT}" ${socat_test_params} ; then
+ echo "Success."
+else
+ echo "socat test run failed" 1>&2
+ exit 77
+fi
+
+# fuzz the input only for IP ${socat_listen_ip}. libcurl uses another IP
+# in this test therefore libcurl input is not fuzzed.
+zzuf_all_params="--ratio=0.001:0.4 --autoinc --verbose --signal \
+ --max-usertime=${max_runtime_sec} --check-exit --network
--allow=${socat_listen_ip} --exclude=."
+
+if test -n "${ZZUF_SEED}" ; then
+ zzuf_all_params="${zzuf_all_params} --seed=${ZZUF_SEED}"
+fi
+
+if test -n "${ZZUF_FLAGS}" ; then
+ zzuf_all_params="${zzuf_all_params} ${ZZUF_FLAGS}"
+fi
+
+# Uncomment the next line to see more zzuf data in logs
+#zzuf_all_params="${zzuf_all_params} -dd"
+
+socat_options="-ls -lu \
+ -T3 -4"
+socat_addr1="TCP-LISTEN:${socat_listen_port},bind=${socat_listen_ip},reuseaddr,nodelay,linger=2,linger2=1,accept-timeout=${max_runtime_sec},fork"
+socat_addr2="TCP:127.0.0.1:${mhd_listen_port},reuseaddr,connect-timeout=3,nodelay,linger=2,linger2=1"
+
+if test -n "${SOCAT_FLAGS}" ; then
+ socat_options="${socat_options} ${SOCAT_FLAGS}"
+fi
+
+# Uncomment the next line to see more socat data in logs
+#socat_options="${socat_options} -dd -D"
+
+# Uncomment the next line to see all traffic in logs
+#socat_options="${socat_options} -v"
+
+stop_zzuf_socat ()
+{
+ trap - EXIT
+ if test -n "$zzuf_pid" ; then
+ echo "The test has been interrupted." 1>&2
+ test "x$zzuf_pid" = "xstarting" && zzuf_pid=$!
+ # Finish zzuf + socat
+ kill -TERM ${zzuf_pid} -${zzuf_pid}
+ # Finish the test
+ kill -INT %2 2> /dev/null || kill -INT %1 2> /dev/null
+ exit 99
+ fi
+}
+
+echo "## Starting zzuf with socat to reflect fuzzed traffic..."
+trap 'stop_zzuf_socat' EXIT
+zzuf_pid="starting"
+"${ZZUF}" ${zzuf_all_params} "${SOCAT}" ${socat_options} ${socat_addr1}
${socat_addr2} &
+if test $? -eq 0 ; then
+ zzuf_pid=$!
+ echo "zzuf with socat has been started."
+else
+ zzuf_pid=''
+ echo "Failed to start zzuf with socat" 1>&2
+ exit 99
+fi
+
+echo "## Starting real test of $@ with traffic fuzzed by zzuf with socat..."
+"$@" --with-socat
+test_result=$?
+trap - EXIT
+echo "$@ has exited with the return code $test_result"
+if kill -s 0 -- $$ 2> /dev/null ; then
+ if kill -s 0 -- ${zzuf_pid} -${zzuf_pid} ; then : ; else
+ echo "No running zzuf with socat is detected after the test." 1>&2
+ echo "Looks like zzuf ended prematurely, at least part of the testing has
not been performed." 1>&2
+ test_result=99
+ fi
+fi
+kill -TERM ${zzuf_pid} -${zzuf_pid}
+zzuf_pid=''
+exit $test_result
diff --git a/src/testzzuf/zzuf_test_runner.sh b/src/testzzuf/zzuf_test_runner.sh
index aa1dfdde..40367639 100755
--- a/src/testzzuf/zzuf_test_runner.sh
+++ b/src/testzzuf/zzuf_test_runner.sh
@@ -13,6 +13,40 @@ if command -v "${ZZUF}" > /dev/null 2>&1 ; then : ; else
exit 77
fi
+run_with_socat ()
+{
+ echo "Trying to run the test with socat..."
+ script_dir=""
+ if command -v dirname > /dev/null 2>&1 ; then
+ test_dir=`dirname /`
+ if test "x${test_dir}" = "x/" ; then
+ if dirname "$1" > /dev/null 2>&1 ; then
+ script_dir=`dirname "$1"`
+ if test -n "${script_dir}" ; then
+ # Assume script is not in the root dir
+ script_dir="${script_dir}/"
+ else
+ script_dir="./"
+ fi
+ fi
+ fi
+ fi
+ if test -z "${script_dir}" ; then
+ if echo "$1" | sed 's|[^/]*$||' > /dev/null 2>&1 ; then
+ script_dir=`echo "$1" | sed 's|[^/]*$||'`
+ if test -z "${script_dir}" ; then
+ script_dir="./"
+ fi
+ fi
+ fi
+ if test -z "${script_dir}" ; then
+ echo "Cannot determine script location, will try current directory." 1>&2
+ script_dir="./"
+ fi
+ $SHELL "${script_dir}zzuf_socat_test_runner.sh" "$@"
+ exit $?
+}
+
# zzuf cannot pass-through the return value of checked program
# so try the direct dry-run first to get possibe 77 or 99 codes
echo "## Dry-run of the $@..."
@@ -20,7 +54,11 @@ if "$@" --dry-run ; then
echo "# Dry-run succeded."
else
res_code=$?
- echo "Dry-run failed with exit code $res_code. $@ will not be run with
zzuf." 1>&2
+ echo "Dry-run failed with exit code $res_code." 1>&2
+ if test $res_code -ne 99; then
+ run_with_socat "$@"
+ fi
+ echo "$@ will not be run with zzuf." 1>&2
exit $res_code
fi
@@ -46,8 +84,9 @@ if "$ZZUF" ${zzuf_all_params} "$@" --dry-run ; then
echo "# Dry-run with zzuf succeded."
else
res_code=$?
- echo "$@ cannot be run with zzuf. The test is skipped." 1>&2
- exit 77
+ echo "$@ cannot be run with zzuf directly." 1>&2
+ run_with_socat "$@"
+ exit $res_code
fi
echo "## Real test of $@ with zzuf..."
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
- [libmicrohttpd] branch master updated (8dc93b08 -> f02888d4), gnunet, 2023/06/20
- [libmicrohttpd] 03/29: microhttpd.h: fixed typos in comments, gnunet, 2023/06/20
- [libmicrohttpd] 04/29: Renamed connection state for clarity, gnunet, 2023/06/20
- [libmicrohttpd] 02/29: Re-implemented parsing of the request line from scratch., gnunet, 2023/06/20
- [libmicrohttpd] 08/29: tests: minor improvemnts, gnunet, 2023/06/20
- [libmicrohttpd] 07/29: Removed request line and headers processing old functions and variables, gnunet, 2023/06/20
- [libmicrohttpd] 09/29: daemon: added debug member to avoid accept4() usage, gnunet, 2023/06/20
- [libmicrohttpd] 01/29: Refactoring: check whether memory block is resizable, gnunet, 2023/06/20
- [libmicrohttpd] 06/29: Re-implemented parsing of the request headers and footers from scratch., gnunet, 2023/06/20
- [libmicrohttpd] 12/29: Added back testing with socat as a fallback option,
gnunet <=
- [libmicrohttpd] 05/29: Request body processing: removed impossible code paths, gnunet, 2023/06/20
- [libmicrohttpd] 16/29: Added tests with single and double folded header, gnunet, 2023/06/20
- [libmicrohttpd] 21/29: process_request_body(): minor readability improvementы, gnunet, 2023/06/20
- [libmicrohttpd] 11/29: testzzuf: re-worked zzuf testing, gnunet, 2023/06/20
- [libmicrohttpd] 10/29: testzzuf: added special debug functions, gnunet, 2023/06/20
- [libmicrohttpd] 22/29: Minor refactoring for partially processed request body, gnunet, 2023/06/20
- [libmicrohttpd] 14/29: Added test with folded header placed last, gnunet, 2023/06/20
- [libmicrohttpd] 15/29: Added test with large folded header, gnunet, 2023/06/20
- [libmicrohttpd] 20/29: Added checks for correct values specified for connection memory limits, gnunet, 2023/06/20
- [libmicrohttpd] 19/29: connection: fixed pipelined requests processing, gnunet, 2023/06/20