bind9/bin/tests/system/rrsetorder/tests.sh
Tom Krizek c5708044e7
Rename dig reference files in the rrsetorder test
bin/tests/system/rrsetorder/dig.out* files match a gitignore expression
present in bin/tests/system/.gitignore.  Since these are meant to be
reference files that are compared to the files generated when the
"rrsetorder" system test is run, rename them to avoid listing tracked
files in .gitignore files.
2022-12-23 13:44:18 +01:00

556 lines
16 KiB
Bash

#!/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.
. ../conf.sh
DIGOPTS="+nosea +nocomm +nocmd +noquest +noadd +noauth +nocomm +nostat +short +nocookie"
dig_cmd() {
# shellcheck disable=SC2086
"$DIG" $DIGOPTS -p "${PORT}" "$@" | grep -v '^;'
}
status=0
GOOD_RANDOM="1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24"
GOOD_RANDOM_NO=24
if grep "^#define DNS_RDATASET_FIXED" "$TOP_BUILDDIR/config.h" > /dev/null 2>&1 ; then
test_fixed=true
else
echo_i "Order 'fixed' disabled at compile time"
test_fixed=false
fi
#
#
#
if $test_fixed; then
echo_i "Checking order fixed (primary)"
ret=0
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
do
dig_cmd @10.53.0.1 fixed.example > dig.out.fixed || ret=1
diff dig.out.fixed reference.dig.out.fixed.good >/dev/null || ret=1
done
if [ $ret != 0 ]; then echo_i "failed"; fi
status=$((status + ret))
else
echo_i "Checking order fixed behaves as cyclic when disabled (primary)"
ret=0
matches=0
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
do
j=$((i % 4))
dig_cmd @10.53.0.1 fixed.example > dig.out.fixed || ret=1
if [ $i -le 4 ]; then
cp dig.out.fixed dig.out.$j
else
diff dig.out.fixed dig.out.$j >/dev/null && matches=$((matches + 1))
fi
done
diff dig.out.0 dig.out.1 >/dev/null && ret=1
diff dig.out.0 dig.out.2 >/dev/null && ret=1
diff dig.out.0 dig.out.3 >/dev/null && ret=1
diff dig.out.1 dig.out.2 >/dev/null && ret=1
diff dig.out.1 dig.out.3 >/dev/null && ret=1
diff dig.out.2 dig.out.3 >/dev/null && ret=1
if [ $matches -ne 16 ]; then ret=1; fi
if [ $ret != 0 ]; then echo_i "failed"; fi
status=$((status + ret))
fi
#
#
#
echo_i "Checking order cyclic (primary + additional)"
ret=0
matches=0
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
do
j=$((i % 4))
dig_cmd @10.53.0.1 cyclic.example > dig.out.cyclic || ret=1
if [ $i -le 4 ]; then
cp dig.out.cyclic dig.out.$j
else
diff dig.out.cyclic dig.out.$j >/dev/null && matches=$((matches + 1))
fi
done
diff dig.out.0 dig.out.1 >/dev/null && ret=1
diff dig.out.0 dig.out.2 >/dev/null && ret=1
diff dig.out.0 dig.out.3 >/dev/null && ret=1
diff dig.out.1 dig.out.2 >/dev/null && ret=1
diff dig.out.1 dig.out.3 >/dev/null && ret=1
diff dig.out.2 dig.out.3 >/dev/null && ret=1
if [ $matches -ne 16 ]; then ret=1; fi
if [ $ret != 0 ]; then echo_i "failed"; fi
status=$((status + ret))
#
#
#
echo_i "Checking order cyclic (primary)"
ret=0
matches=0
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
do
j=$((i % 4))
dig_cmd @10.53.0.1 cyclic2.example > dig.out.cyclic2 || ret=1
if [ $i -le 4 ]; then
cp dig.out.cyclic2 dig.out.$j
else
diff dig.out.cyclic2 dig.out.$j >/dev/null && matches=$((matches + 1))
fi
done
diff dig.out.0 dig.out.1 >/dev/null && ret=1
diff dig.out.0 dig.out.2 >/dev/null && ret=1
diff dig.out.0 dig.out.3 >/dev/null && ret=1
diff dig.out.1 dig.out.2 >/dev/null && ret=1
diff dig.out.1 dig.out.3 >/dev/null && ret=1
diff dig.out.2 dig.out.3 >/dev/null && ret=1
if [ $matches -ne 16 ]; then ret=1; fi
if [ $ret != 0 ]; then echo_i "failed"; fi
status=$((status + ret))
echo_i "Checking order random (primary)"
ret=0
for i in $GOOD_RANDOM
do
eval match$i=0
done
for i in a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 9
do
dig_cmd @10.53.0.1 random.example > dig.out.random || ret=1
match=0
for j in $GOOD_RANDOM
do
eval "diff dig.out.random reference.dig.out.random.good$j >/dev/null && match$j=1 match=1"
if [ $match -eq 1 ]; then break; fi
done
if [ $match -eq 0 ]; then ret=1; fi
done
match=0
for i in $GOOD_RANDOM
do
eval "match=\$((match + match$i))"
done
echo_i "Random selection return $match of ${GOOD_RANDOM_NO} possible orders in 36 samples"
if [ $match -lt $((GOOD_RANDOM_NO / 3)) ]; then ret=1; fi
if [ $ret != 0 ]; then echo_i "failed"; fi
status=$((status + ret))
echo_i "Checking order none (primary)"
ret=0
# Fetch the "reference" response and ensure it contains the expected records.
dig_cmd @10.53.0.1 none.example > dig.out.none || ret=1
for i in 1 2 3 4; do
grep -F -q 1.2.3.$i dig.out.none || ret=1
done
# Ensure 20 further queries result in the same response as the "reference" one.
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do
dig_cmd @10.53.0.1 none.example > dig.out.test$i || ret=1
diff dig.out.none dig.out.test$i >/dev/null || ret=1
done
if [ $ret != 0 ]; then echo_i "failed"; fi
status=$((status + ret))
#
#
#
if $test_fixed; then
echo_i "Checking order fixed (secondary)"
ret=0
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
do
dig_cmd @10.53.0.2 fixed.example > dig.out.fixed || ret=1
diff dig.out.fixed reference.dig.out.fixed.good || ret=1
done
if [ $ret != 0 ]; then echo_i "failed"; fi
status=$((status + ret))
fi
#
#
#
echo_i "Checking order cyclic (secondary + additional)"
ret=0
matches=0
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
do
j=$((i % 4))
dig_cmd @10.53.0.2 cyclic.example > dig.out.cyclic || ret=1
if [ $i -le 4 ]; then
cp dig.out.cyclic dig.out.$j
else
diff dig.out.cyclic dig.out.$j >/dev/null && matches=$((matches + 1))
fi
done
diff dig.out.0 dig.out.1 >/dev/null && ret=1
diff dig.out.0 dig.out.2 >/dev/null && ret=1
diff dig.out.0 dig.out.3 >/dev/null && ret=1
diff dig.out.1 dig.out.2 >/dev/null && ret=1
diff dig.out.1 dig.out.3 >/dev/null && ret=1
diff dig.out.2 dig.out.3 >/dev/null && ret=1
if [ $matches -ne 16 ]; then ret=1; fi
if [ $ret != 0 ]; then echo_i "failed"; fi
status=$((status + ret))
#
#
#
echo_i "Checking order cyclic (secondary)"
ret=0
matches=0
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
do
j=$((i % 4))
dig_cmd @10.53.0.2 cyclic2.example > dig.out.cyclic2 || ret=1
if [ $i -le 4 ]; then
cp dig.out.cyclic2 dig.out.$j
else
diff dig.out.cyclic2 dig.out.$j >/dev/null && matches=$((matches + 1))
fi
done
diff dig.out.0 dig.out.1 >/dev/null && ret=1
diff dig.out.0 dig.out.2 >/dev/null && ret=1
diff dig.out.0 dig.out.3 >/dev/null && ret=1
diff dig.out.1 dig.out.2 >/dev/null && ret=1
diff dig.out.1 dig.out.3 >/dev/null && ret=1
diff dig.out.2 dig.out.3 >/dev/null && ret=1
if [ $matches -ne 16 ]; then ret=1; fi
if [ $ret != 0 ]; then echo_i "failed"; fi
status=$((status + ret))
echo_i "Checking order random (secondary)"
ret=0
for i in $GOOD_RANDOM
do
eval match$i=0
done
for i in a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 9
do
dig_cmd @10.53.0.2 random.example > dig.out.random || ret=1
match=0
for j in $GOOD_RANDOM
do
eval "diff dig.out.random reference.dig.out.random.good$j >/dev/null && match$j=1 match=1"
if [ $match -eq 1 ]; then break; fi
done
if [ $match -eq 0 ]; then ret=1; fi
done
match=0
for i in $GOOD_RANDOM
do
eval "match=\$((match + match$i))"
done
echo_i "Random selection return $match of ${GOOD_RANDOM_NO} possible orders in 36 samples"
if [ $match -lt $((GOOD_RANDOM_NO / 3)) ]; then ret=1; fi
if [ $ret != 0 ]; then echo_i "failed"; fi
status=$((status + ret))
echo_i "Checking order none (secondary)"
ret=0
# Fetch the "reference" response and ensure it contains the expected records.
dig_cmd @10.53.0.2 none.example > dig.out.none || ret=1
for i in 1 2 3 4; do
grep -F -q 1.2.3.$i dig.out.none || ret=1
done
# Ensure 20 further queries result in the same response as the "reference" one.
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do
dig_cmd @10.53.0.2 none.example > dig.out.test$i || ret=1
diff dig.out.none dig.out.test$i >/dev/null || ret=1
done
if [ $ret != 0 ]; then echo_i "failed"; fi
status=$((status + ret))
echo_i "Shutting down secondary"
stop_server ns2
echo_i "Checking for secondary's on disk copy of zone"
if [ ! -f ns2/root.bk ]
then
echo_i "failed";
status=$((status + 1))
fi
echo_i "Re-starting secondary"
start_server --noclean --restart --port ${PORT} ns2
#
#
#
if $test_fixed; then
echo_i "Checking order fixed (secondary loaded from disk)"
ret=0
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
do
dig_cmd @10.53.0.2 fixed.example > dig.out.fixed || ret=1
diff dig.out.fixed reference.dig.out.fixed.good || ret=1
done
if [ $ret != 0 ]; then echo_i "failed"; fi
status=$((status + ret))
fi
#
#
#
echo_i "Checking order cyclic (secondary + additional, loaded from disk)"
ret=0
matches=0
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
do
j=$((i % 4))
dig_cmd @10.53.0.2 cyclic.example > dig.out.cyclic || ret=1
if [ $i -le 4 ]; then
cp dig.out.cyclic dig.out.$j
else
diff dig.out.cyclic dig.out.$j >/dev/null && matches=$((matches + 1))
fi
done
diff dig.out.0 dig.out.1 >/dev/null && ret=1
diff dig.out.0 dig.out.2 >/dev/null && ret=1
diff dig.out.0 dig.out.3 >/dev/null && ret=1
diff dig.out.1 dig.out.2 >/dev/null && ret=1
diff dig.out.1 dig.out.3 >/dev/null && ret=1
diff dig.out.2 dig.out.3 >/dev/null && ret=1
if [ $matches -ne 16 ]; then ret=1; fi
if [ $ret != 0 ]; then echo_i "failed"; fi
status=$((status + ret))
#
#
#
echo_i "Checking order cyclic (secondary loaded from disk)"
ret=0
matches=0
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
do
j=$((i % 4))
dig_cmd @10.53.0.2 cyclic2.example > dig.out.cyclic2 || ret=1
if [ $i -le 4 ]; then
cp dig.out.cyclic2 dig.out.$j
else
diff dig.out.cyclic2 dig.out.$j >/dev/null && matches=$((matches + 1))
fi
done
diff dig.out.0 dig.out.1 >/dev/null && ret=1
diff dig.out.0 dig.out.2 >/dev/null && ret=1
diff dig.out.0 dig.out.3 >/dev/null && ret=1
diff dig.out.1 dig.out.2 >/dev/null && ret=1
diff dig.out.1 dig.out.3 >/dev/null && ret=1
diff dig.out.2 dig.out.3 >/dev/null && ret=1
if [ $matches -ne 16 ]; then ret=1; fi
if [ $ret != 0 ]; then echo_i "failed"; fi
status=$((status + ret))
echo_i "Checking order random (secondary loaded from disk)"
ret=0
for i in $GOOD_RANDOM
do
eval match$i=0
done
for i in a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 9
do
dig_cmd @10.53.0.2 random.example > dig.out.random || ret=1
match=0
for j in $GOOD_RANDOM
do
eval "diff dig.out.random reference.dig.out.random.good$j >/dev/null && match$j=1 match=1"
if [ $match -eq 1 ]; then break; fi
done
if [ $match -eq 0 ]; then ret=1; fi
done
match=0
for i in $GOOD_RANDOM
do
eval "match=\$((match + match$i))"
done
echo_i "Random selection return $match of ${GOOD_RANDOM_NO} possible orders in 36 samples"
if [ $match -lt $((GOOD_RANDOM_NO / 3)) ]; then ret=1; fi
if [ $ret != 0 ]; then echo_i "failed"; fi
status=$((status + ret))
echo_i "Checking order none (secondary loaded from disk)"
ret=0
# Fetch the "reference" response and ensure it contains the expected records.
dig_cmd @10.53.0.2 none.example > dig.out.none || ret=1
for i in 1 2 3 4; do
grep -F -q 1.2.3.$i dig.out.none || ret=1
done
# Ensure 20 further queries result in the same response as the "reference" one.
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do
dig_cmd @10.53.0.2 none.example > dig.out.test$i || ret=1
diff dig.out.none dig.out.test$i >/dev/null || ret=1
done
if [ $ret != 0 ]; then echo_i "failed"; fi
status=$((status + ret))
#
#
#
if $test_fixed; then
echo_i "Checking order fixed (cache)"
ret=0
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
do
dig_cmd @10.53.0.3 fixed.example > dig.out.fixed || ret=1
diff dig.out.fixed reference.dig.out.fixed.good || ret=1
done
if [ $ret != 0 ]; then echo_i "failed"; fi
status=$((status + ret))
fi
#
#
#
echo_i "Checking order cyclic (cache + additional)"
ret=0
# prime acache
dig_cmd @10.53.0.3 cyclic.example > dig.out.cyclic || ret=1
matches=0
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
do
j=$((i % 4))
dig_cmd @10.53.0.3 cyclic.example > dig.out.cyclic || ret=1
if [ $i -le 4 ]; then
cp dig.out.cyclic dig.out.$j
else
diff dig.out.cyclic dig.out.$j >/dev/null && matches=$((matches + 1))
fi
done
diff dig.out.0 dig.out.1 >/dev/null && ret=1
diff dig.out.0 dig.out.2 >/dev/null && ret=1
diff dig.out.0 dig.out.3 >/dev/null && ret=1
diff dig.out.1 dig.out.2 >/dev/null && ret=1
diff dig.out.1 dig.out.3 >/dev/null && ret=1
diff dig.out.2 dig.out.3 >/dev/null && ret=1
if [ $matches -ne 16 ]; then ret=1; fi
if [ $ret != 0 ]; then echo_i "failed"; fi
status=$((status + ret))
#
#
#
echo_i "Checking order cyclic (cache)"
ret=0
# prime acache
dig_cmd @10.53.0.3 cyclic2.example > dig.out.cyclic2 || ret=1
matches=0
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
do
j=$((i % 4))
dig_cmd @10.53.0.3 cyclic2.example > dig.out.cyclic2 || ret=1
if [ $i -le 4 ]; then
cp dig.out.cyclic2 dig.out.$j
else
diff dig.out.cyclic2 dig.out.$j >/dev/null && matches=$((matches + 1))
fi
done
diff dig.out.0 dig.out.1 >/dev/null && ret=1
diff dig.out.0 dig.out.2 >/dev/null && ret=1
diff dig.out.0 dig.out.3 >/dev/null && ret=1
diff dig.out.1 dig.out.2 >/dev/null && ret=1
diff dig.out.1 dig.out.3 >/dev/null && ret=1
diff dig.out.2 dig.out.3 >/dev/null && ret=1
if [ $matches -ne 16 ]; then ret=1; fi
if [ $ret != 0 ]; then echo_i "failed"; fi
status=$((status + ret))
echo_i "Checking order random (cache)"
ret=0
for i in $GOOD_RANDOM
do
eval match$i=0
done
for i in a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 9
do
dig_cmd @10.53.0.3 random.example > dig.out.random || ret=1
match=0
for j in $GOOD_RANDOM
do
eval "diff dig.out.random reference.dig.out.random.good$j >/dev/null && match$j=1 match=1"
if [ $match -eq 1 ]; then break; fi
done
if [ $match -eq 0 ]; then ret=1; fi
done
match=0
for i in $GOOD_RANDOM
do
eval "match=\$((match + match$i))"
done
echo_i "Random selection return $match of ${GOOD_RANDOM_NO} possible orders in 36 samples"
if [ $match -lt $((GOOD_RANDOM_NO / 3)) ]; then ret=1; fi
if [ $ret != 0 ]; then echo_i "failed"; fi
status=$((status + ret))
echo_i "Checking order none (cache)"
ret=0
# Fetch the "reference" response and ensure it contains the expected records.
dig_cmd @10.53.0.3 none.example > dig.out.none || ret=1
for i in 1 2 3 4; do
grep -F -q 1.2.3.$i dig.out.none || ret=1
done
# Ensure 20 further queries result in the same response as the "reference" one.
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do
dig_cmd @10.53.0.3 none.example > dig.out.test$i || ret=1
diff dig.out.none dig.out.test$i >/dev/null || ret=1
done
if [ $ret != 0 ]; then echo_i "failed"; fi
status=$((status + ret))
echo_i "Checking default order (cache)"
ret=0
for i in $GOOD_RANDOM
do
eval match$i=0
done
for i in a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 9
do
dig_cmd @10.53.0.5 random.example > dig.out.random || ret=1
match=0
for j in $GOOD_RANDOM
do
eval "diff dig.out.random reference.dig.out.random.good$j >/dev/null && match$j=1 match=1"
if [ $match -eq 1 ]; then break; fi
done
if [ $match -eq 0 ]; then ret=1; fi
done
match=0
for i in $GOOD_RANDOM
do
eval "match=\$((match + match$i))"
done
echo_i "Default selection return $match of ${GOOD_RANDOM_NO} possible orders in 36 samples"
if [ $match -lt $((GOOD_RANDOM_NO / 3)) ]; then ret=1; fi
if [ $ret != 0 ]; then echo_i "failed"; fi
status=$((status + ret))
echo_i "Checking default order no match in rrset-order (cache)"
ret=0
# Fetch the "reference" response and ensure it contains the expected records.
dig_cmd @10.53.0.4 nomatch.example > dig.out.nomatch || ret=1
for i in 1 2 3 4; do
grep -F -q 1.2.3.$i dig.out.nomatch || ret=1
done
# Ensure 20 further queries result in the same response as the "reference" one.
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do
dig_cmd @10.53.0.4 nomatch.example > dig.out.test$i || ret=1
diff dig.out.nomatch dig.out.test$i >/dev/null || ret=1
done
if [ $ret != 0 ]; then echo_i "failed"; fi
status=$((status + ret))
echo_i "exit status: $status"
[ $status -eq 0 ] || exit 1