From 0342f7e55967e599467da033deb6b1e88c8809e5 Mon Sep 17 00:00:00 2001 From: Stephen Morris Date: Fri, 17 Nov 2017 13:21:05 +0000 Subject: [PATCH] [rt46602] Ensure that tests running in parallel use unique ports Via an intermediate make file, tests that have been modified to be able to run in parallel are assigned unique query and control port numbers (other than 5300 and 9953 respectively). Tests that have not yet been modified all use ports 5300 and 9953, so must be run sequentially. (cherry picked from commit e7429b124bd3d0fcce107eaf790ece4ba332eccd) (cherry picked from commit 4f68e67e5cb5799cf26657f3e00ae3fca636a96f) (cherry picked from commit 704e2324e3ade6b5a19c6391a5230924715b1544) --- bin/tests/system/Makefile.in | 47 +++++++++++++++++++++++++++--------- bin/tests/system/conf.sh.in | 18 +++++++++++++- bin/tests/system/runall.sh | 6 ++++- 3 files changed, 58 insertions(+), 13 deletions(-) diff --git a/bin/tests/system/Makefile.in b/bin/tests/system/Makefile.in index b9b4e9a5c18..d87c89de4eb 100644 --- a/bin/tests/system/Makefile.in +++ b/bin/tests/system/Makefile.in @@ -47,26 +47,53 @@ TARGETS = feature-test@EXEEXT@ feature-test@EXEEXT@: feature-test.@O@ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ feature-test.@O@ ${ISCLIBS} ${LIBS} -# Running the scripts below is bypassed when a separate -# build directory is used. -check: test +# Running the scripts below is bypassed when a separate # build directory is +# used. + +# Define the tests that can be run in parallel. This should be identical to +# the definition of PARALLELDIRS in conf.sh. These tests do not use query +# port 5300 or control port 9953. + +PARALLEL = allow_query serve-stale rpzrecurse + +# Produce intermediate makefile that assigns unique port numbers to each +# parallel test. + +parallel.mk: + @echo ".PHONY: $(PARALLEL)" > $@ ; \ + echo "" >> $@ ; \ + echo "check: $(PARALLEL)" >> $@ ; \ + port=5299 ; \ + for directory in $(PARALLEL) ; do \ + port=$$(($$port + 2)) ; \ + controlport=$$(($$port + 1)) ; \ + echo "" >> $@ ; \ + echo "$$directory:" >> $@ ; \ + echo " @$(SHELL) ./run.sh -p $$port -c $$controlport $$directory" >> $@ ; \ + done -TESTS = allow_query serve-stale rpzrecurse alltests +# Targets to run the tests that can be done in parallel (which have unique +# ports assigned to them) and the tests which must be run sequentially (because +# they all use query port 5300 and control port 9953). -test: subdirs $(TESTS) +parallel: parallel.mk + $(MAKE) -f parallel.mk -alltests: +sequential: if test -f ./runall.sh; then $(SHELL) ./runall.sh; fi -$(TESTS): - PORT=$$((32767+$$RANDOM)); \ - $(SHELL) ./run.sh -p $$(($$PORT)) -c $$(($$PORT+1)) $@ +# Standard targets. + +check: test + +test: parallel sequential testclean clean distclean:: if test -f ./cleanall.sh; then sh ./cleanall.sh; fi rm -f systests.output rm -f random.data + rm -f parallel.mk rm -f ${TARGETS} rm -f ${OBJS} @@ -78,5 +105,3 @@ installdirs: install:: uninstall:: - -.PHONY: $(TESTS) diff --git a/bin/tests/system/conf.sh.in b/bin/tests/system/conf.sh.in index 3c357ddd8f3..594ece5a23a 100644 --- a/bin/tests/system/conf.sh.in +++ b/bin/tests/system/conf.sh.in @@ -67,7 +67,10 @@ KRB5_CONFIG=/dev/null # The "stress" test is not run by default since it creates enough # load on the machine to make it unusable to other users. # v6synth -SUBDIRS="acl additional allow_query addzone autosign builtin +# +# List of tests that use ports 5300 and 9953. For this reason, these must +# be run sequentially. +SEQUENTIALDIRS="acl additional addzone autosign builtin cacheclean case chain checkconf @CHECKDS@ checknames checkzone @COVERAGE@ database digdelv dlv dlz dlzexternal dns64 dnssec ecdsa eddsa emptyzones fetchlimit filter-aaaa @@ -78,6 +81,15 @@ SUBDIRS="acl additional allow_query addzone autosign builtin sortlist spf staticstub stub tkey tsig tsiggss unknown upforwd verify views wildcard xfer xferquota zero zonechecks" +# List of tests that use unique ports (other than 5300 and 9953). These +# tests can be run in parallel. +# +# This symbol must be kept in step with the PARALLEL macro in Makefile.in +PARALLELDIRS="allow_query" + +SUBDIRS="$SEQUENTIALDIRS $PARALLELDIRS" + + # Things that are different on Windows KILL=kill DIFF=diff @@ -170,6 +182,10 @@ fi TESTNAME="`basename $PWD`" echo_i() { + # Without formatting + echo "I:$TESTNAME:$@" >> test.output + + # With formatting echoinfo "I:$TESTNAME:$@" } diff --git a/bin/tests/system/runall.sh b/bin/tests/system/runall.sh index c746f0ce470..c6eeb05be3a 100644 --- a/bin/tests/system/runall.sh +++ b/bin/tests/system/runall.sh @@ -18,6 +18,10 @@ # # Run all the system tests. # +# Note: Use "make check" to run all the system tests. This script will just +# run those tests that require that each of their nameservers is the only one +# running on an IP address. +# SYSTEMTESTTOP=. . $SYSTEMTESTTOP/conf.sh @@ -25,7 +29,7 @@ SYSTEMTESTTOP=. status=0 { - for d in $SUBDIRS + for d in $SEQUENTIALDIRS do $SHELL run.sh "${@}" $d || status=1 done -- 2.47.3