diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 15:59:48 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 15:59:48 +0000 |
commit | 3b9b6d0b8e7f798023c9d109c490449d528fde80 (patch) | |
tree | 2e1c188dd7b8d7475cd163de9ae02c428343669b /bin/tests/system/notify/tests.sh | |
parent | Initial commit. (diff) | |
download | bind9-0cd617f6bad00b68e380aeb0024ef4dc1985191c.tar.xz bind9-0cd617f6bad00b68e380aeb0024ef4dc1985191c.zip |
Adding upstream version 1:9.18.19.upstream/1%9.18.19upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | bin/tests/system/notify/tests.sh | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/bin/tests/system/notify/tests.sh b/bin/tests/system/notify/tests.sh new file mode 100644 index 0000000..ba9dfe3 --- /dev/null +++ b/bin/tests/system/notify/tests.sh @@ -0,0 +1,220 @@ +#!/bin/sh + +# Copyright (C) Internet Systems Consortium, Inc. ("ISC") +# +# SPDX-License-Identifier: MPL-2.0 +# +# 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 https://mozilla.org/MPL/2.0/. +# +# See the COPYRIGHT file distributed with this work for additional +# information regarding copyright ownership. + +set -e + +# shellcheck disable=SC2034 +. ../conf.sh + +dig_plus_opts() { + $DIG +tcp +noadd +nosea +nostat +noquest +nocomm +nocmd -p "${PORT}" "$@" +} + +status=0 +n=0 + +test_start() { + n=$((n+1)) + echo_i "$* ($n)" + ret=0 +} + +test_end() { + [ $ret = 0 ] || echo_i "failed" + status=$((status + ret)) +} + +# +# Wait up to 10 seconds for the servers to finish starting before testing. +# +for i in 1 2 3 4 5 6 7 8 9 10 +do + ret=0 + $DIG +tcp -p "${PORT}" example @10.53.0.2 soa > dig.out.ns2.test$n || ret=1 + grep "status: NOERROR" dig.out.ns2.test$n > /dev/null || ret=1 + grep "flags:.* aa[ ;]" dig.out.ns2.test$n > /dev/null || ret=1 + $DIG +tcp -p "${PORT}" example @10.53.0.3 soa > dig.out.ns3.test$n || ret=1 + grep "status: NOERROR" dig.out.ns3.test$n > /dev/null || ret=1 + grep "flags:.* aa[ ;]" dig.out.ns3.test$n > /dev/null || ret=1 + nr=$(grep -c 'x[0-9].*sending notify to' ns2/named.run) + [ "$nr" -eq 20 ] || ret=1 + [ $ret = 0 ] && break + sleep 1 +done + +test_start "checking initial status" + +dig_plus_opts a.example. @10.53.0.2 a > dig.out.ns2.test$n || ret=1 +grep "10.0.0.1" dig.out.ns2.test$n > /dev/null || ret=1 + +dig_plus_opts a.example. @10.53.0.3 a > dig.out.ns3.test$n || ret=1 +grep "10.0.0.1" dig.out.ns3.test$n > /dev/null || ret=1 + +digcomp dig.out.ns2.test$n dig.out.ns3.test$n || ret=1 + +test_end + +test_start "checking startup notify rate limit" +awk '/x[0-9].*sending notify to/ { + split($2, a, ":"); + this = a[1] * 3600 + a[2] * 60 + a[3]; + if (lasta1 && lasta1 > a[1]) { + fix = 3600 * 24; + } + this += fix; + if (last) { + delta = this - last; + print delta; + + total += delta; + if (!maxdelta || delta > maxdelta) { + maxdelta = delta; + } + if (!mindelta || delta < mindelta) { + mindelta = delta; + } + } + lasta1 = a[1]; + last = this; + count++; +} +END { + average = total / count; + print "mindelta:", mindelta; + print "maxdelta:" maxdelta; + print "count:", count; + print "average:", average; + if (average < 0.180) exit(1); + if (count < 20) exit(1); +}' ns2/named.run > awk.out.ns2.test$n || ret=1 +test_end + +nextpart ns3/named.run > /dev/null + +sleep 1 # make sure filesystem time stamp is newer for reload. +rm -f ns2/example.db +cp -f ns2/example2.db ns2/example.db +echo_i "reloading with example2 using HUP and waiting up to 45 seconds" +kill -HUP "$(cat ns2/named.pid)" +wait_for_log_re 45 "transfer of 'example/IN' from 10.53.0.2#.*success" ns3/named.run + +test_start "checking notify message was logged" +grep 'notify from 10.53.0.2#[0-9][0-9]*: serial 2$' ns3/named.run > /dev/null || ret=1 +test_end + +test_start "checking example2 loaded" +dig_plus_opts a.example. @10.53.0.2 a > dig.out.ns2.test$n || ret=1 +grep "10.0.0.2" dig.out.ns2.test$n > /dev/null || ret=1 +test_end + +test_start "checking example2 contents have been transferred after HUP reload" + +dig_plus_opts a.example. @10.53.0.2 a > dig.out.ns2.test$n || ret=1 +grep "10.0.0.2" dig.out.ns2.test$n > /dev/null || ret=1 + +dig_plus_opts a.example. @10.53.0.3 a > dig.out.ns3.test$n || ret=1 +grep "10.0.0.2" dig.out.ns3.test$n > /dev/null || ret=1 + +digcomp dig.out.ns2.test$n dig.out.ns3.test$n || ret=1 + +test_end + +echo_i "stopping primary and restarting with example4 then waiting up to 45 seconds" +stop_server ns2 + +rm -f ns2/example.db +cp -f ns2/example4.db ns2/example.db + +start_server --noclean --restart --port "${PORT}" ns2 +wait_for_log_re 45 "transfer of 'example/IN' from 10.53.0.2#.*success" ns3/named.run + +test_start "checking notify message was logged" +grep 'notify from 10.53.0.2#[0-9][0-9]*: serial 4$' ns3/named.run > /dev/null || ret=1 +test_end + +test_start "checking example4 loaded" +dig_plus_opts a.example. @10.53.0.2 a > dig.out.ns2.test$n || ret=1 +grep "10.0.0.4" dig.out.ns2.test$n > /dev/null || ret=1 +test_end + +test_start "checking example4 contents have been transferred after restart" + +dig_plus_opts a.example. @10.53.0.2 a > dig.out.ns2.test$n || ret=1 +grep "10.0.0.4" dig.out.ns2.test$n > /dev/null || ret=1 + +dig_plus_opts a.example. @10.53.0.3 a > dig.out.ns3.test$n || ret=1 +grep "10.0.0.4" dig.out.ns3.test$n > /dev/null || ret=1 + +digcomp dig.out.ns2.test$n dig.out.ns3.test$n || ret=1 + +test_end + +test_start "checking notify to alternate port with primary server inheritance" +$NSUPDATE << EOF +server 10.53.0.2 ${PORT} +zone x21 +update add added.x21 0 in txt "test string" +send +EOF +fn="dig.out.ns4.test$n" +for i in 1 2 3 4 5 6 7 8 9 +do + dig_plus_opts added.x21. @10.53.0.4 txt -p "$EXTRAPORT1" > "$fn" || ret=1 + grep "test string" "$fn" > /dev/null && break + sleep 1 +done +grep "test string" "$fn" > /dev/null || ret=1 +test_end + +test_start "checking notify to multiple views using tsig" +$NSUPDATE << EOF +server 10.53.0.5 ${PORT} +zone x21 +key a aaaaaaaaaaaaaaaaaaaa +update add added.x21 0 in txt "test string" +send +EOF +fnb="dig.out.b.ns5.test$n" +fnc="dig.out.c.ns5.test$n" +for i in 1 2 3 4 5 6 7 8 9 +do + dig_plus_opts added.x21. -y b:bbbbbbbbbbbbbbbbbbbb @10.53.0.5 \ + txt > "$fnb" || ret=1 + dig_plus_opts added.x21. -y c:cccccccccccccccccccc @10.53.0.5 \ + txt > "$fnc" || ret=1 + grep "test string" "$fnb" > /dev/null && + grep "test string" "$fnc" > /dev/null && + break + sleep 1 +done +grep "test string" "$fnb" > /dev/null || ret=1 +grep "test string" "$fnc" > /dev/null || ret=1 +grep "sending notify to 10.53.0.5#[0-9]* : TSIG (b)" ns5/named.run > /dev/null || ret=1 +grep "sending notify to 10.53.0.5#[0-9]* : TSIG (c)" ns5/named.run > /dev/null || ret=1 +test_end + +test_start "checking notify-source uses port option correctly" +grep "10.53.0.3#${EXTRAPORT2}: received notify for zone 'notify-source-port-test'" ns2/named.run > /dev/null || ret=1 +test_end + +# notify messages were sent to unresponsive 10.53.10.53 during the tests +# above, which should time out at some point; we need to wait for them to +# appear in the logs in case the tests run faster than the notify timeouts + +test_start "checking notify retries expire within 45 seconds" +nextpartreset ns3/named.run +wait_for_log 45 'retries exceeded' ns3/named.run || ret=1 +test_end + +echo_i "exit status: $status" +[ $status -eq 0 ] || exit 1 |