From: Matthias Gerstner <matthias.gerstner@suse.de>
To: connman@lists.linux.dev
Subject: [PATCH 01/16] dnsproxy-simple-test: improve test coverage and test flexibility
Date: Fri, 10 Jun 2022 14:33:08 +0200 [thread overview]
Message-ID: <20220610123323.8974-2-matthias.gerstner@suse.de> (raw)
In-Reply-To: <20220610123323.8974-1-matthias.gerstner@suse.de>
- enable debug() macro for test invocation which allows to get test logs
- actually trigger caching logic explicitly by querying the same
configurations twice in succession
- count the number of cache hits to catch regressions in the caching
functionality
- support custom domains for testing specified on the command line
---
Makefile.am | 2 +-
src/dnsproxy.c | 6 +-
tools/dnsproxy-simple-test | 113 ++++++++++++++++++++++++++++++++-----
3 files changed, 104 insertions(+), 17 deletions(-)
diff --git a/Makefile.am b/Makefile.am
index c108b8f3c..1a3dbe3c9 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -438,7 +438,7 @@ testdir = $(pkglibdir)/test
test_SCRIPTS = $(test_scripts)
if INTERNAL_DNS_BACKEND
-tools_dnsproxy_standalone_CFLAGS = $(src_connmand_CFLAGS) -I$(srcdir)/src
+tools_dnsproxy_standalone_CFLAGS = $(src_connmand_CFLAGS) -I$(srcdir)/src -DDNSPROXY_DEBUG
tools_dnsproxy_standalone_SOURCES = tools/dnsproxy-standalone.c $(src_connmand_SOURCES)
# for EXTRA_PROGRAMS the BUILT_SOURCES aren't automatically added as
# dependency, so let's do it explicitly
diff --git a/src/dnsproxy.c b/src/dnsproxy.c
index 227300477..458694e60 100644
--- a/src/dnsproxy.c
+++ b/src/dnsproxy.c
@@ -41,7 +41,11 @@
#include "connman.h"
-#define debug(fmt...) do { } while (0)
+#ifdef DNSPROXY_DEBUG
+# define debug(fmt...) do { fprintf(stderr, fmt); fprintf(stderr, "\n"); } while (0)
+#else
+# define debug(fmt...) do { } while (0)
+#endif
#if __BYTE_ORDER == __LITTLE_ENDIAN
struct domain_hdr {
diff --git a/tools/dnsproxy-simple-test b/tools/dnsproxy-simple-test
index b8fd7f77d..5c2f72925 100755
--- a/tools/dnsproxy-simple-test
+++ b/tools/dnsproxy-simple-test
@@ -6,9 +6,25 @@
echoerr() {
echo $@ 1>&2
+ echo -e "\n >>> ERROR OCCURED <<< \n" 1>&2
exit 1
}
+
+showlog() {
+ if [ -z "$SHOW_LOG" -o -z "$logfile" ]; then
+ return
+ fi
+
+ echo
+ echo "======== debug log ==========="
+ cat "$logfile"
+ echo "===== end debug log =========="
+ echo
+}
+
+TRANSPORTS="-U -T"
+
while [ $# -gt 0 ]; do
case "$1" in
"--valgrind")
@@ -16,10 +32,39 @@ while [ $# -gt 0 ]; do
if [ -z "$VALGRIND" ]; then
echoerr "no valgrind executable found"
fi
+ # log valgrind output to stdout, since stderr is used for
+ # debug output from dnsproxy.c already and we want to parse
+ # that.
+ # also cause an error exit it valgrind error occur so that
+ # they're easily noticed.
+ VALGRIND="$VALGRIND --log-fd=1 --error-exitcode=10"
+ ;;
+ "--gdb")
+ WAIT_GDB=1
+ # wait forever to avoid timeout conditions during debugging
+ HOST_OPTS="-w"
+ ;;
+ "--show-log")
+ SHOW_LOG=1
+ ;;
+ "--testdomain="*)
+ TESTDOMAIN=`echo $1 | cut -d '=' -f2-`
+ CUSTOM_TESTDOMAIN=1
+ ;;
+ "--only-tcp")
+ TRANSPORTS="-T"
+ ;;
+ "--only-udp")
+ TRANSPORTS="-U"
;;
"-h")
- echo "$0 [--valgrind]"
+ echo "$0 [--valgrind] [--gdb] [--show-log] [--only-tcp] [--only-udp] [--testdomain=<mydomain>]"
echo "--valgrind: run dnsproxy-standalone in valgrind"
+ echo "--gdb: allows you to attach via GDB before tests are started"
+ echo "--show-log: dump debug log from dnsproxy at end of test"
+ echo "--only-tcp: only perform TCP protocol based tests"
+ echo "--only-udp: only perform UDP protocol based tests"
+ echo "--testdomain=<mydomain>: the domain name to resolve"
exit 2
;;
*)
@@ -29,6 +74,11 @@ while [ $# -gt 0 ]; do
shift
done
+if [ -n "$VALGRIND" -a -n "$WAIT_GDB" ]; then
+ echo "Cannot mix valgrind frontend and GDB attachment" 1>&2
+ exit 2
+fi
+
if [ -e "Makefile" ]; then
BUILDROOT="$PWD"
else
@@ -66,7 +116,8 @@ fi
PORT=8053
# run the proxy in the background
-$VALGRIND $DNSPROXY $PORT "$DOMAIN1" "$NS1" &
+logfile=`mktemp`
+$VALGRIND $DNSPROXY $PORT "$DOMAIN1" "$NS1" 2>"$logfile" &
proxy_pid=$!
cleanup() {
@@ -77,6 +128,13 @@ cleanup() {
wait $proxy_pid
ret=$?
proxy_pid=-1
+ if [ -n "$logfile" ]; then
+ if [ -n "$SHOW_LOG" ]; then
+ showlog
+ fi
+ rm -f "$logfile"
+ unset logfile
+ fi
return $ret
}
@@ -85,24 +143,49 @@ trap cleanup err exit
sleep 1
echo -e "\n\n"
-# test both UDP and TCP mode
-for TRANSPORT in -U -T; do
- # test both IPv4 and IPv6
- for IP in -4 -6; do
- echo "Testing resolution using transport $TRANSPORT and IP${IP}"
- set -x
- $HOST $TRANSPORT $IP -p$PORT www.example.com 127.0.0.1
- RES=$?
- set +x
- if [ $RES -ne 0 ]; then
- echoerr "resolution failed"
- fi
+if [ -n "$WAIT_GDB" ]; then
+ echo "You can now attach to the dnsproxy process at PID $proxy_pid."
+ echo "Press ENTER to continue test execution"
+ read _
+fi
+
+if [ -z "$TESTDOMAIN" ]; then
+ TESTDOMAIN="www.example.com"
+fi
- echo -e "\n\n"
+# perform each test twice to actually get cached responses served for each
+# combination
+for I in `seq 2`; do
+ # test both UDP and TCP mode
+ for TRANSPORT in $TRANSPORTS; do
+ # test both IPv4 and IPv6
+ for IP in -4 -6; do
+ echo "Testing resolution using transport $TRANSPORT and IP${IP}"
+ set -x
+ $HOST $HOST_OPTS $TRANSPORT $IP -p$PORT $TESTDOMAIN 127.0.0.1
+ RES=$?
+ set +x
+ if [ $RES -ne 0 ]; then
+ echoerr "resolution failed"
+ fi
+
+ echo -e "\n\n"
+ done
done
done
+NUM_HITS=`grep "cache hit.*$TESTDOMAIN" "$logfile" | wc -l`
+
echo -e "\n\nDNS resolution succeeded for all test combinations"
+echo -e "\nNumber of cache hits: $NUM_HITS\n"
+# assert we have seen the expected number of cache hits in the log
+# this is the amount of cache hits for the default domain tests as seen before
+# refactoring of dnsproxy started.
+if [ -z "$CUSTOM_TESTDOMAIN" -a "$NUM_HITS" -ne 15 ]; then
+ echoerr "Unexpected number of cache hits encountered"
+elif [ "$NUM_HITS" -lt 8 ]; then
+ echoerr "Too low number of cache hits encountered"
+fi
cleanup
if [ $? -eq 0 ]; then
exit 0
--
2.35.1
next prev parent reply other threads:[~2022-06-10 12:33 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-10 12:33 dnsproxy: first round of refactoring, TCP bugfix Matthias Gerstner
2022-06-10 12:33 ` Matthias Gerstner [this message]
2022-06-10 12:33 ` [PATCH 02/16] autoconf: require C99 compiler and set C99 mode Matthias Gerstner
2022-06-10 12:33 ` [PATCH 03/16] dnsproxy: first bits of refactoring data types, global variables, simpler functions Matthias Gerstner
2022-08-28 16:21 ` Daniel Wagner
2022-06-10 12:33 ` [PATCH 04/16] dnsproxy: refactoring of update_cached_ttl() and append_data() Matthias Gerstner
2022-06-10 12:33 ` [PATCH 05/16] dnsproxy: refactor parse_response() Matthias Gerstner
2022-06-10 12:33 ` [PATCH 06/16] dnsproxy: refactoring of cache_update() Matthias Gerstner
2022-06-10 12:33 ` [PATCH 07/16] dnsproxy: strip_domains(): fix out of bounds read access Matthias Gerstner
2022-06-10 12:33 ` [PATCH 08/16] dnsproxy: refactor and document strip_domains() to make it less confusing Matthias Gerstner
2022-06-10 12:33 ` [PATCH 09/16] dnsproxy: refactor ns_resolv() and forwards_dns_reply() Matthias Gerstner
2022-06-10 12:33 ` [PATCH 10/16] dnsproxy: uncompress: replace unnecessary goto with return statements Matthias Gerstner
2022-06-10 12:33 ` [PATCH 11/16] dnsproxy: forward_dns_reply: pull out separate dns_reply_fixup_domains() Matthias Gerstner
2022-06-10 12:33 ` [PATCH 12/16] dnsproxy: finish first pass of refactoring the compilation unit Matthias Gerstner
2022-06-10 12:33 ` [PATCH 13/16] dnsproxy: fix TCP server reply handling if domain name is appended Matthias Gerstner
2022-06-10 12:33 ` [PATCH 14/16] dnsproxy: harmonize use of sizeof() for message size calculations Matthias Gerstner
2022-06-10 12:33 ` [PATCH 15/16] dnsproxy: add my copyright statement covering the larger refactoring changes Matthias Gerstner
2022-06-10 12:33 ` [PATCH 16/16] dnsproxy: fix compiler warnings (differing signedness, empty format string) Matthias Gerstner
2022-10-18 8:47 dnsproxy: first round of refactoring, TCP bugfix Matthias Gerstner
2022-10-18 8:47 ` [PATCH 01/16] dnsproxy-simple-test: improve test coverage and test flexibility Matthias Gerstner
2022-10-27 10:32 dnsproxy: first round of refactoring, TCP bugfix Matthias Gerstner
2022-10-27 10:32 ` [PATCH 01/16] dnsproxy-simple-test: improve test coverage and test flexibility Matthias Gerstner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220610123323.8974-2-matthias.gerstner@suse.de \
--to=matthias.gerstner@suse.de \
--cc=connman@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).