]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
enable parallel system tests on windows
authorEvan Hunt <each@isc.org>
Sat, 26 Jan 2019 18:36:47 +0000 (10:36 -0800)
committerEvan Hunt <each@isc.org>
Tue, 7 May 2019 01:38:34 +0000 (18:38 -0700)
this moves the creation of "parallel.mk" into a separate shell script
instead of bin/tests/system/Makefile. that shell script can now be
executed by runall.sh, allowing us to make use of the cygwin "make"
command, which supports parallel execution.

(cherry picked from commit bbae24c1402ea038b4f1662e993d4e15678f2f53)

bin/tests/system/Makefile.in
bin/tests/system/conf.sh.in
bin/tests/system/conf.sh.win32
bin/tests/system/parallel.sh [new file with mode: 0644]
bin/tests/system/runall.sh
util/copyrights

index dea2f7573d822dbf782dc6573b5da9d244b6d5cc..556bea0498e09134d77391bb69513260ea4c51dc 100644 (file)
@@ -47,32 +47,6 @@ feature-test@EXEEXT@: feature-test.@O@
 # 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. Note: longer-running tests
-# such as serve-stale and rpzrecurse are scheduled first to get more
-# benefit from parallelism.
-PARALLEL = rpzrecurse dnssec \
-          acl additional addzone allow-query autosign \
-          builtin cacheclean case catz chain \
-          checkconf checknames checkzone \
-          @CHECKDS@ @COVERAGE@ @KEYMGR@ \
-          cookie database digdelv dlv dlz dlzexternal \
-          dns64 @DNSTAP@ dscp dsdigest dyndb \
-          ednscompliance emptyzones \
-          fetchlimit filter-aaaa formerr forward \
-          geoip glue idna inline integrity ixfr \
-          legacy limits logfileconfig \
-          masterfile masterformat metadata mkeys \
-          names notify nslookup nsupdate nzd2nzf \
-          pending pipelined \
-          reclimit redirect resolver rndc rootkeysentinel rpz \
-          rrchecker rrl rrsetorder rsabigexponent runtime \
-          sfcache smartsign sortlist \
-          spf staticstub statistics statschannel stub \
-          tcp tsig tsiggss \
-          unknown upforwd verify views wildcard \
-          xfer xferquota zero zonechecks
-
 # Produce intermediate makefile that assigns unique port numbers to each
 # parallel test.  The start port number of 5,000 is arbitrary - it must just
 # be greater than the highest privileged port, 1024.
@@ -84,26 +58,7 @@ PARALLEL = rpzrecurse dnssec \
 .PHONY: parallel.mk
 
 parallel.mk:
-       @PARALLEL_SANITIZED=`echo $(PARALLEL) | sed "s|\([^ ][^ ]*\)|test-\1|g;" | tr _ -` ; \
-       echo ".PHONY: $$PARALLEL_SANITIZED" > $@ ; \
-       echo "" >> $@ ; \
-       echo "check_interfaces:" >> $@ ; \
-       echo "  @${PERL} testsock.pl > /dev/null 2>&1 || { \\" >> $@ ; \
-       echo "          echo \"I:NOTE: System tests were skipped because they require that the\"; \\" >> $@ ; \
-       echo "          echo \"I:      IP addresses 10.53.0.1 through 10.53.0.8 be configured\"; \\" >> $@ ; \
-       echo "          echo \"I:      as alias addresses on the loopback interface.  Please run\"; \\" >> $@ ; \
-       echo "          echo \"I:      \"bin/tests/system/ifconfig.sh up\" as root to configure them.\"; \\" >> $@ ; \
-       echo "          exit 1; \\" >> $@ ; \
-       echo "  }" >> $@ ; \
-       echo "" >> $@ ; \
-       echo "test check: $$PARALLEL_SANITIZED" >> $@ ; \
-       port=$${STARTPORT:-5000} ; \
-       for directory in $(PARALLEL) ; do \
-               echo "" >> $@ ; \
-               echo "test-`echo $$directory | tr _ -`: check_interfaces" >> $@ ; \
-               echo "  @$(SHELL) ./run.sh -r -p $$port $$directory 2>&1 | tee $$directory/test.output" >> $@ ; \
-               port=`expr $$port + 100` ; \
-       done
+       $(SHELL) parallel.sh > parallel.mk
 
 # Targets to run the tests.
 
index 4909307cda0d1e46ab81714281ca1be118894b33..9ce67442ef0183c337f3f52a7a32788e75bf6914 100644 (file)
@@ -104,31 +104,32 @@ SEQUENTIALDIRS="ecdsa eddsa gost lwresd @PKCS11_TEST@ tkey"
 # and 9953). Because separate blocks of ports can be used for teach
 # test, these tests can be run in parallel.
 #
-# This symbol must be kept in step with the PARALLEL macro in Makefile.in
-PARALLELDIRS="acl additional addzone allow-query autosign \
+# Note: some of the longer-running tests are scheduled first,
+# in order to get more benefit from parallelism.
+PARALLELDIRS="dnssec rpzrecurse \
+       acl additional addzone allow-query autosign \
        builtin cacheclean case catz chain \
        checkconf checknames checkzone \
        @CHECKDS@ @COVERAGE@ @KEYMGR@ \
        cookie database digdelv dlv dlz dlzexternal \
-       dns64 dnssec @DNSTAP@ dscp dsdigest dyndb \
+       dns64 @DNSTAP@ dscp dsdigest dyndb \
        ednscompliance emptyzones \
        fetchlimit filter-aaaa formerr forward \
        geoip glue idna inline integrity ixfr \
-       legacy limits logfileconfig lwresd \
-        masterfile masterformat metadata mkeys \
-        names notify nslookup nsupdate nzd2nzf \
-        pending pipelined \
-        reclimit redirect resolver rndc rootkeysentinel rpz rpzrecurse \
-        rrchecker rrl rrsetorder rsabigexponent runtime \
-        sfcache smartsign sortlist \
-        spf staticstub statistics statschannel stub \
-        tcp tools tsig tsiggss \
-        unknown upforwd verify views wildcard \
-        xfer xferquota zero zonechecks"
+       legacy limits logfileconfig \
+       masterfile masterformat metadata mkeys \
+       names notify nslookup nsupdate nzd2nzf \
+       pending pipelined \
+       reclimit redirect resolver rndc rootkeysentinel rpz \
+       rrchecker rrl rrsetorder rsabigexponent runtime \
+       sfcache smartsign sortlist \
+       spf staticstub statistics statschannel stub \
+       tcp tsig tsiggss \
+       unknown upforwd verify views wildcard \
+       xfer xferquota zero zonechecks"
 
 SUBDIRS="$SEQUENTIALDIRS $PARALLELDIRS"
 
-
 # Things that are different on Windows
 KILL=kill
 DIFF=diff
@@ -161,9 +162,9 @@ else
 fi
 
 if grep "^#define WANT_IPV6 1" $TOP/config.h > /dev/null 2>&1 ; then
-        TESTSOCK6="$TESTSOCK6"
+       TESTSOCK6="$TESTSOCK6"
 else
-        TESTSOCK6=false
+       TESTSOCK6=false
 fi
 
 # Windows process management leave empty
@@ -299,13 +300,13 @@ keyfile_to_keys_section() {
     shift
     echo "$section_name {"
     for keyname in $*; do
-        awk '!/^; /{
-            printf "\t\""$1"\" "
-            printf "'"$key_prefix"'"
-            printf $4 " " $5 " " $6 " \""
-            for (i=7; i<=NF; i++) printf $i
-            printf "\";\n"
-        }' $keyname.key
+       awk '!/^; /{
+           printf "\t\""$1"\" "
+           printf "'"$key_prefix"'"
+           printf $4 " " $5 " " $6 " \""
+           for (i=7; i<=NF; i++) printf $i
+           printf "\";\n"
+       }' $keyname.key
     done
     echo "};"
 }
@@ -330,7 +331,7 @@ nextpart () {
     [ -f $1.prev ] || echo "0" > $1.prev
     prev=`cat $1.prev`
     awk "NR > $prev "'{ print }
-         END          { print NR > "/dev/stderr" }' $1 2> $1.prev
+        END          { print NR > "/dev/stderr" }' $1 2> $1.prev
 }
 
 # copy_setports - Copy Configuration File and Replace Ports
@@ -345,15 +346,15 @@ nextpart () {
 
 copy_setports() {
     sed -e "s/@PORT@/${PORT}/g" \
-        -e "s/@EXTRAPORT1@/${EXTRAPORT1}/g" \
-        -e "s/@EXTRAPORT2@/${EXTRAPORT2}/g" \
-        -e "s/@EXTRAPORT3@/${EXTRAPORT3}/g" \
-        -e "s/@EXTRAPORT4@/${EXTRAPORT4}/g" \
-        -e "s/@EXTRAPORT5@/${EXTRAPORT5}/g" \
-        -e "s/@EXTRAPORT6@/${EXTRAPORT6}/g" \
-        -e "s/@EXTRAPORT7@/${EXTRAPORT7}/g" \
-        -e "s/@EXTRAPORT8@/${EXTRAPORT8}/g" \
-        -e "s/@CONTROLPORT@/${CONTROLPORT}/g" \
+       -e "s/@EXTRAPORT1@/${EXTRAPORT1}/g" \
+       -e "s/@EXTRAPORT2@/${EXTRAPORT2}/g" \
+       -e "s/@EXTRAPORT3@/${EXTRAPORT3}/g" \
+       -e "s/@EXTRAPORT4@/${EXTRAPORT4}/g" \
+       -e "s/@EXTRAPORT5@/${EXTRAPORT5}/g" \
+       -e "s/@EXTRAPORT6@/${EXTRAPORT6}/g" \
+       -e "s/@EXTRAPORT7@/${EXTRAPORT7}/g" \
+       -e "s/@EXTRAPORT8@/${EXTRAPORT8}/g" \
+       -e "s/@CONTROLPORT@/${CONTROLPORT}/g" \
        -e "s/@DEFAULT_ALGORITHM@/${DEFAULT_ALGORITHM}/g" \
        -e "s/@DEFAULT_ALGORITHM_NUMBER@/${DEFAULT_ALGORITHM_NUMBER}/g" \
        -e "s/@DEFAULT_BITS@/${DEFAULT_BITS}/g" \
index 3135e8818591dfa12f5f0ca7c2410bb1013df0ca..5396401bcdd7aea9dee6369470d1105d19419ab9 100644 (file)
@@ -116,31 +116,30 @@ SEQUENTIALDIRS="ecdsa eddsa gost lwresd @PKCS11_TEST@ tkey"
 # List of tests that use unique ports (other than 5300 and 9953). These
 # tests can be run in parallel.
 #
-# XXX: Note that tests are not currently run in parallel on Windows, so it
-# isn't strictly necessary to maintain these as separate lists in this file,
-# but using the same variable names as in conf.sh.in may simplify keeping the
-# lists in sync.
+# Note: some of the longer-running tests are scheduled first, in
+# order to get more benefit from parallelism.
 #
 # XXX: removed logfileconfig as it doesn't currently work on windows.
-PARALLELDIRS="acl additional addzone allow-query autosign \
+PARALLELDIRS="dnssec rpzrecurse \
+       acl additional addzone allow-query autosign \
        builtin cacheclean case catz chain \
        checkconf checknames checkzone \
        @CHECKDS@ @COVERAGE@ @KEYMGR@ \
        cookie database digdelv dlv dlz dlzexternal \
-       dns64 dnssec @DNSTAP@ dscp dsdigest dyndb \
+       dns64 @DNSTAP@ dscp dsdigest dyndb \
        ednscompliance emptyzones \
        fetchlimit filter-aaaa formerr forward \
        geoip glue idna inline integrity ixfr \
        legacy limits lwresd masterfile masterformat metadata mkeys \
-        names notify nslookup nsupdate nzd2nzf \
-        pending pipelined \
-        reclimit redirect resolver rndc rootkeysentinel rpz rpzrecurse \
-        rrchecker rrl rrsetorder rsabigexponent runtime \
-        sfcache smartsign sortlist \
-        spf staticstub statistics statschannel stub \
-        tcp tools tsig tsiggss \
-        unknown upforwd verify views wildcard \
-        xfer xferquota zero zonechecks"
+       names notify nslookup nsupdate nzd2nzf \
+       pending pipelined \
+       reclimit redirect resolver rndc rootkeysentinel rpz \
+       rrchecker rrl rrsetorder rsabigexponent runtime \
+       sfcache smartsign sortlist \
+       spf staticstub statistics statschannel stub \
+       tcp tsig tsiggss \
+       unknown upforwd verify views wildcard \
+       xfer xferquota zero zonechecks"
 
 SUBDIRS="$SEQUENTIALDIRS $PARALLELDIRS"
 
@@ -171,9 +170,9 @@ else
 fi
 
 if grep "^#define WANT_IPV6 1" $TOP/config.h > /dev/null 2>&1 ; then
-        TESTSOCK6="$TESTSOCK6"
+       TESTSOCK6="$TESTSOCK6"
 else
-        TESTSOCK6=false
+       TESTSOCK6=false
 fi
 
 #
@@ -217,22 +216,22 @@ else
 fi
 
 echofail () {
-        printf "${COLOR_FAIL}%s${COLOR_NONE}\n" "$*"
+       printf "${COLOR_FAIL}%s${COLOR_NONE}\n" "$*"
 }
 echowarn () {
-        printf "${COLOR_WARN}%s${COLOR_NONE}\n" "$*"
+       printf "${COLOR_WARN}%s${COLOR_NONE}\n" "$*"
 }
 echopass () {
-        printf "${COLOR_PASS}%s${COLOR_NONE}\n" "$*"
+       printf "${COLOR_PASS}%s${COLOR_NONE}\n" "$*"
 }
 echoinfo () {
-        printf "${COLOR_INFO}%s${COLOR_NONE}\n" "$*"
+       printf "${COLOR_INFO}%s${COLOR_NONE}\n" "$*"
 }
 echostart () {
-        printf "${COLOR_START}%s${COLOR_NONE}\n" "$*"
+       printf "${COLOR_START}%s${COLOR_NONE}\n" "$*"
 }
 echoend () {
-        printf "${COLOR_END}%s${COLOR_NONE}\n" "$*"
+       printf "${COLOR_END}%s${COLOR_NONE}\n" "$*"
 }
 
 SYSTESTDIR="`basename $PWD`"
@@ -276,13 +275,13 @@ keyfile_to_keys_section() {
     shift
     echo "$section_name {"
     for keyname in $*; do
-        awk '!/^; /{
-            printf "\t\""$1"\" "
-            printf "'"$key_prefix"'"
-            printf $4 " " $5 " " $6 " \""
-            for (i=7; i<=NF; i++) printf $i
-            printf "\";\n"
-        }' $keyname.key
+       awk '!/^; /{
+           printf "\t\""$1"\" "
+           printf "'"$key_prefix"'"
+           printf $4 " " $5 " " $6 " \""
+           for (i=7; i<=NF; i++) printf $i
+           printf "\";\n"
+       }' $keyname.key
     done
     echo "};"
 }
@@ -307,7 +306,7 @@ nextpart () {
     [ -f $1.prev ] || echo "0" > $1.prev
     prev=`cat $1.prev`
     awk "NR > $prev "'{ print }
-         END          { print NR > "/dev/stderr" }' $1 2> $1.prev
+        END          { print NR > "/dev/stderr" }' $1 2> $1.prev
 }
 
 # copy_setports - Copy Configuration File and Replace Ports
@@ -328,15 +327,15 @@ copy_setports() {
     # tokens when it processes this file and produces conf.sh.
     atsign="@"
     sed -e "s/${atsign}PORT${atsign}/${PORT}/g" \
-        -e "s/${atsign}EXTRAPORT1${atsign}/${EXTRAPORT1}/g" \
-        -e "s/${atsign}EXTRAPORT2${atsign}/${EXTRAPORT2}/g" \
-        -e "s/${atsign}EXTRAPORT3${atsign}/${EXTRAPORT3}/g" \
-        -e "s/${atsign}EXTRAPORT4${atsign}/${EXTRAPORT4}/g" \
-        -e "s/${atsign}EXTRAPORT5${atsign}/${EXTRAPORT5}/g" \
-        -e "s/${atsign}EXTRAPORT6${atsign}/${EXTRAPORT6}/g" \
-        -e "s/${atsign}EXTRAPORT7${atsign}/${EXTRAPORT7}/g" \
-        -e "s/${atsign}EXTRAPORT8${atsign}/${EXTRAPORT8}/g" \
-        -e "s/${atsign}CONTROLPORT${atsign}/${CONTROLPORT}/g" \
+       -e "s/${atsign}EXTRAPORT1${atsign}/${EXTRAPORT1}/g" \
+       -e "s/${atsign}EXTRAPORT2${atsign}/${EXTRAPORT2}/g" \
+       -e "s/${atsign}EXTRAPORT3${atsign}/${EXTRAPORT3}/g" \
+       -e "s/${atsign}EXTRAPORT4${atsign}/${EXTRAPORT4}/g" \
+       -e "s/${atsign}EXTRAPORT5${atsign}/${EXTRAPORT5}/g" \
+       -e "s/${atsign}EXTRAPORT6${atsign}/${EXTRAPORT6}/g" \
+       -e "s/${atsign}EXTRAPORT7${atsign}/${EXTRAPORT7}/g" \
+       -e "s/${atsign}EXTRAPORT8${atsign}/${EXTRAPORT8}/g" \
+       -e "s/${atsign}CONTROLPORT${atsign}/${CONTROLPORT}/g" \
        -e "s/${atsign}DEFAULT_ALGORITHM${atsign}/${DEFAULT_ALGORITHM}/g" \
        -e "s/${atsign}DEFAULT_ALGORITHM_NUMBER${atsign}/${DEFAULT_ALGORITHM_NUMBER}/g" \
        -e "s/${atsign}DEFAULT_BITS${atsign}/${DEFAULT_BITS}/g" \
diff --git a/bin/tests/system/parallel.sh b/bin/tests/system/parallel.sh
new file mode 100644 (file)
index 0000000..24b465e
--- /dev/null
@@ -0,0 +1,34 @@
+#!/bin/sh
+#
+# Copyright (C) Internet Systems Consortium, Inc. ("ISC")
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# See the COPYRIGHT file distributed with this work for additional
+# information regarding copyright ownership.
+
+. ./conf.sh
+
+PARALLELS=`echo $PARALLELDIRS | sed "s|\([^ ][^ ]*\)|test-\1|g;" | tr _ -`
+
+echo ".PHONY: $PARALLELS"
+echo
+echo "check_interfaces:"
+echo " @${PERL} testsock.pl > /dev/null 2>&1 || { \\"
+echo "         echo \"I:NOTE: System tests were skipped because they require the\"; \\"
+echo "         echo \"I:      test IP addresses 10.53.0.* to be configured as alias\"; \\"
+echo "         echo \"I:      addresses on the loopback interface.  Please run\"; \\"
+echo "         echo \"I:      \"bin/tests/system/ifconfig.sh up\" as root to configure them.\"; \\"
+echo "         exit 1; \\"
+echo " }"
+echo
+echo "test check: $PARALLELS"
+port=${STARTPORT:-5000}
+for directory in $PARALLELDIRS ; do
+        echo
+        echo "test-`echo $directory | tr _ -`: check_interfaces"
+        echo " @${SHELL} ./run.sh -r -p $port $directory 2>&1 | tee $directory/test.output"
+        port=`expr $port + 100`
+done
index 76f20a4f3a125d622a5b39b169bbb9fe54644244..52721c34c4e1433bda8bc36e3b39445810c39a68 100755 (executable)
@@ -68,21 +68,29 @@ export SYSTEMTEST_FORCE_COLOR
 export SYSTEMTEST_NO_CLEAN
 
 status=0
-if [ "$CYGWIN" = "" ]; then
-    # Running on Unix, use "make" to run tests in parallel.
-    make -j $numproc check
-    status=$?
+
+if [ "$NOPARALLEL" = "" ]; then
+    if [ "$CYGWIN" = "" ]; then
+        # Running on Unix, use "make" to run tests in parallel.
+        make -j $numproc check
+        status=$?
+    else
+        # Running on Windows: Cygwin "make" is available, but isn't being
+        # used for the build. So we create a special makefile for the purpose
+        # of parallel execution of system tests, and use that.
+        $SHELL parallel.sh > parallel.mk
+        make -f parallel.mk -j $numproc check || status=$?
+       $SHELL ./runsequential.sh -r || status=$?
+       $SHELL ./testsummary.sh
+    fi
 else
-    # Running on Windows: no "make" available, so ensure test interfaces are up
-    # and then run the tests sequentially.  (This is simpler than working out
-    # where "nmake" is likely to be found.  Besides, "nmake" does not support
-    # parallel execution so if "nmake" is used, the tests would be run
-    # sequentially anyway.)
+    # the NOPARALLEL environment variable indicates that tests must be
+    # run sequentially.
     $PERL testsock.pl || {
         cat <<-EOF
-       I:NOTE: System tests were skipped because they require that the
-       I:      IP addresses 10.53.0.1 through 10.53.0.8 be configured
-       I:      as alias addresses on the loopback interface.  Please run
+       I:NOTE: System tests were skipped because they require the
+       I:      test IP addresses 10.53.0.* to be configured as alias
+       I:      addresses on the loopback interface.  Please run
        I:      "bin/tests/system/ifconfig.sh up" as root to configure them.
        EOF
         exit 1
@@ -93,4 +101,5 @@ else
         done
     } 2>&1 | tee "systests.output"
 fi
+
 exit $status
index 21db3011fbcd892009c6e7a2d3a10cacd1eb56a2..3b829d44ebd2388a760059059ff5e44f5b2d5951 100644 (file)
 ./bin/tests/system/org.isc.bind.system         SH      2010,2012,2013,2016,2018,2019
 ./bin/tests/system/org.isc.bind.system.plist   X       2010,2018,2019
 ./bin/tests/system/packet.pl                   PERL    2011,2012,2016,2018,2019
+./bin/tests/system/parallel.sh                 SH      2019
 ./bin/tests/system/pending/clean.sh            SH      2009,2012,2014,2016,2018,2019
 ./bin/tests/system/pending/ns1/named.conf.in   CONF-C  2018,2019
 ./bin/tests/system/pending/ns1/root.db.in      ZONE    2009,2010,2016,2018,2019