xref: /minix3/external/bsd/bind/dist/bin/tests/system/rrl/tests.sh (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek# Copyright (C) 2012, 2013  Internet Systems Consortium, Inc. ("ISC")
2*00b67f09SDavid van Moolenbroek#
3*00b67f09SDavid van Moolenbroek# Permission to use, copy, modify, and/or distribute this software for any
4*00b67f09SDavid van Moolenbroek# purpose with or without fee is hereby granted, provided that the above
5*00b67f09SDavid van Moolenbroek# copyright notice and this permission notice appear in all copies.
6*00b67f09SDavid van Moolenbroek#
7*00b67f09SDavid van Moolenbroek# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
8*00b67f09SDavid van Moolenbroek# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
9*00b67f09SDavid van Moolenbroek# AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
10*00b67f09SDavid van Moolenbroek# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
11*00b67f09SDavid van Moolenbroek# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
12*00b67f09SDavid van Moolenbroek# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
13*00b67f09SDavid van Moolenbroek# PERFORMANCE OF THIS SOFTWARE.
14*00b67f09SDavid van Moolenbroek
15*00b67f09SDavid van Moolenbroek
16*00b67f09SDavid van Moolenbroek# test response rate limiting
17*00b67f09SDavid van Moolenbroek
18*00b67f09SDavid van MoolenbroekSYSTEMTESTTOP=..
19*00b67f09SDavid van Moolenbroek. $SYSTEMTESTTOP/conf.sh
20*00b67f09SDavid van Moolenbroek
21*00b67f09SDavid van Moolenbroek#set -x
22*00b67f09SDavid van Moolenbroek
23*00b67f09SDavid van Moolenbroekns1=10.53.0.1			    # root, defining the others
24*00b67f09SDavid van Moolenbroekns2=10.53.0.2			    # test server
25*00b67f09SDavid van Moolenbroekns3=10.53.0.3			    # secondary test server
26*00b67f09SDavid van Moolenbroekns7=10.53.0.7			    # whitelisted client
27*00b67f09SDavid van Moolenbroek
28*00b67f09SDavid van MoolenbroekUSAGE="$0: [-x]"
29*00b67f09SDavid van Moolenbroekwhile getopts "x" c; do
30*00b67f09SDavid van Moolenbroek    case $c in
31*00b67f09SDavid van Moolenbroek	x) set -x;;
32*00b67f09SDavid van Moolenbroek	*) echo "$USAGE" 1>&2; exit 1;;
33*00b67f09SDavid van Moolenbroek    esac
34*00b67f09SDavid van Moolenbroekdone
35*00b67f09SDavid van Moolenbroekshift `expr $OPTIND - 1 || true`
36*00b67f09SDavid van Moolenbroekif test "$#" -ne 0; then
37*00b67f09SDavid van Moolenbroek    echo "$USAGE" 1>&2
38*00b67f09SDavid van Moolenbroek    exit 1
39*00b67f09SDavid van Moolenbroekfi
40*00b67f09SDavid van Moolenbroek# really quit on control-C
41*00b67f09SDavid van Moolenbroektrap 'exit 1' 1 2 15
42*00b67f09SDavid van Moolenbroek
43*00b67f09SDavid van Moolenbroek
44*00b67f09SDavid van Moolenbroekret=0
45*00b67f09SDavid van Moolenbroeksetret () {
46*00b67f09SDavid van Moolenbroek    ret=1
47*00b67f09SDavid van Moolenbroek    echo "$*"
48*00b67f09SDavid van Moolenbroek}
49*00b67f09SDavid van Moolenbroek
50*00b67f09SDavid van Moolenbroek
51*00b67f09SDavid van Moolenbroek# Wait until soon after the start of a second to make results consistent.
52*00b67f09SDavid van Moolenbroek#   The start of a second credits a rate limit.
53*00b67f09SDavid van Moolenbroek#   This would be far easier in C or by assuming a modern version of perl.
54*00b67f09SDavid van Moolenbroeksec_start () {
55*00b67f09SDavid van Moolenbroek    START=`date`
56*00b67f09SDavid van Moolenbroek    while true; do
57*00b67f09SDavid van Moolenbroek	NOW=`date`
58*00b67f09SDavid van Moolenbroek	if test "$START" != "$NOW"; then
59*00b67f09SDavid van Moolenbroek	    return
60*00b67f09SDavid van Moolenbroek	fi
61*00b67f09SDavid van Moolenbroek	$PERL -e 'select(undef, undef, undef, 0.05)' || true
62*00b67f09SDavid van Moolenbroek    done
63*00b67f09SDavid van Moolenbroek}
64*00b67f09SDavid van Moolenbroek
65*00b67f09SDavid van Moolenbroek
66*00b67f09SDavid van Moolenbroek# turn off ${HOME}/.digrc
67*00b67f09SDavid van MoolenbroekHOME=/dev/null; export HOME
68*00b67f09SDavid van Moolenbroek
69*00b67f09SDavid van Moolenbroek#   $1=result name  $2=domain name  $3=dig options
70*00b67f09SDavid van Moolenbroekdigcmd () {
71*00b67f09SDavid van Moolenbroek    OFILE=$1; shift
72*00b67f09SDavid van Moolenbroek    DIG_DOM=$1; shift
73*00b67f09SDavid van Moolenbroek    ARGS="+nosearch +time=1 +tries=1 +ignore -p 5300 $* $DIG_DOM @$ns2"
74*00b67f09SDavid van Moolenbroek    #echo I:dig $ARGS 1>&2
75*00b67f09SDavid van Moolenbroek    START=`date +%y%m%d%H%M.%S`
76*00b67f09SDavid van Moolenbroek    RESULT=`$DIG $ARGS 2>&1 | tee $OFILE=TEMP				\
77*00b67f09SDavid van Moolenbroek	    | sed -n -e '/^;; AUTHORITY/,/^$/d'				\
78*00b67f09SDavid van Moolenbroek		-e '/^;; ADDITIONAL/,/^$/d'				\
79*00b67f09SDavid van Moolenbroek		-e  's/^[^;].*	\([^	 ]\{1,\}\)$/\1/p'		\
80*00b67f09SDavid van Moolenbroek		-e 's/;; flags.* tc .*/TC/p'				\
81*00b67f09SDavid van Moolenbroek		-e 's/;; .* status: NXDOMAIN.*/NXDOMAIN/p'		\
82*00b67f09SDavid van Moolenbroek		-e 's/;; .* status: SERVFAIL.*/SERVFAIL/p'		\
83*00b67f09SDavid van Moolenbroek		-e 's/;; connection timed out.*/drop/p'			\
84*00b67f09SDavid van Moolenbroek		-e 's/;; communications error to.*/drop/p'		\
85*00b67f09SDavid van Moolenbroek	    | tr -d '\n'`
86*00b67f09SDavid van Moolenbroek    mv "$OFILE=TEMP" "$OFILE=$RESULT"
87*00b67f09SDavid van Moolenbroek    touch -t $START "$OFILE=$RESULT"
88*00b67f09SDavid van Moolenbroek}
89*00b67f09SDavid van Moolenbroek
90*00b67f09SDavid van Moolenbroek
91*00b67f09SDavid van Moolenbroek#   $1=number of tests  $2=target domain  $3=dig options
92*00b67f09SDavid van MoolenbroekQNUM=1
93*00b67f09SDavid van Moolenbroekburst () {
94*00b67f09SDavid van Moolenbroek    BURST_LIMIT=$1; shift
95*00b67f09SDavid van Moolenbroek    BURST_DOM_BASE="$1"; shift
96*00b67f09SDavid van Moolenbroek    while test "$BURST_LIMIT" -ge 1; do
97*00b67f09SDavid van Moolenbroek	CNT=`expr "00$QNUM" : '.*\(...\)'`
98*00b67f09SDavid van Moolenbroek	eval BURST_DOM="$BURST_DOM_BASE"
99*00b67f09SDavid van Moolenbroek	FILE="dig.out-$BURST_DOM-$CNT"
100*00b67f09SDavid van Moolenbroek	digcmd $FILE $BURST_DOM $* &
101*00b67f09SDavid van Moolenbroek	QNUM=`expr $QNUM + 1`
102*00b67f09SDavid van Moolenbroek	BURST_LIMIT=`expr "$BURST_LIMIT" - 1`
103*00b67f09SDavid van Moolenbroek    done
104*00b67f09SDavid van Moolenbroek}
105*00b67f09SDavid van Moolenbroek
106*00b67f09SDavid van Moolenbroek
107*00b67f09SDavid van Moolenbroek#   $1=domain  $2=IP address  $3=# of IP addresses  $4=TC  $5=drop
108*00b67f09SDavid van Moolenbroek#	$6=NXDOMAIN  $7=SERVFAIL or other errors
109*00b67f09SDavid van Moolenbroekck_result() {
110*00b67f09SDavid van Moolenbroek    BAD=
111*00b67f09SDavid van Moolenbroek    wait
112*00b67f09SDavid van Moolenbroek    ADDRS=`ls dig.out-$1-*=$2				2>/dev/null | wc -l`
113*00b67f09SDavid van Moolenbroek    # count simple truncated and truncated NXDOMAIN as TC
114*00b67f09SDavid van Moolenbroek    TC=`ls dig.out-$1-*=TC dig.out-$1-*=NXDOMAINTC	2>/dev/null | wc -l`
115*00b67f09SDavid van Moolenbroek    DROP=`ls dig.out-$1-*=drop				2>/dev/null | wc -l`
116*00b67f09SDavid van Moolenbroek    # count NXDOMAIN and truncated NXDOMAIN as NXDOMAIN
117*00b67f09SDavid van Moolenbroek    NXDOMAIN=`ls dig.out-$1-*=NXDOMAIN  dig.out-$1-*=NXDOMAINTC	2>/dev/null \
118*00b67f09SDavid van Moolenbroek							| wc -l`
119*00b67f09SDavid van Moolenbroek    SERVFAIL=`ls dig.out-$1-*=SERVFAIL			2>/dev/null | wc -l`
120*00b67f09SDavid van Moolenbroek    if test $ADDRS -ne "$3"; then
121*00b67f09SDavid van Moolenbroek	setret "I:"$ADDRS" instead of $3 '$2' responses for $1"
122*00b67f09SDavid van Moolenbroek	BAD=yes
123*00b67f09SDavid van Moolenbroek    fi
124*00b67f09SDavid van Moolenbroek    if test $TC -ne "$4"; then
125*00b67f09SDavid van Moolenbroek	setret "I:"$TC" instead of $4 truncation responses for $1"
126*00b67f09SDavid van Moolenbroek	BAD=yes
127*00b67f09SDavid van Moolenbroek    fi
128*00b67f09SDavid van Moolenbroek    if test $DROP -ne "$5"; then
129*00b67f09SDavid van Moolenbroek	setret "I:"$DROP" instead of $5 dropped responses for $1"
130*00b67f09SDavid van Moolenbroek	BAD=yes
131*00b67f09SDavid van Moolenbroek    fi
132*00b67f09SDavid van Moolenbroek    if test $NXDOMAIN -ne "$6"; then
133*00b67f09SDavid van Moolenbroek	setret "I:"$NXDOMAIN" instead of $6 NXDOMAIN responses for $1"
134*00b67f09SDavid van Moolenbroek	BAD=yes
135*00b67f09SDavid van Moolenbroek    fi
136*00b67f09SDavid van Moolenbroek    if test $SERVFAIL -ne "$7"; then
137*00b67f09SDavid van Moolenbroek	setret "I:"$SERVFAIL" instead of $7 error responses for $1"
138*00b67f09SDavid van Moolenbroek	BAD=yes
139*00b67f09SDavid van Moolenbroek    fi
140*00b67f09SDavid van Moolenbroek    if test -z "$BAD"; then
141*00b67f09SDavid van Moolenbroek	rm -f dig.out-$1-*
142*00b67f09SDavid van Moolenbroek    fi
143*00b67f09SDavid van Moolenbroek}
144*00b67f09SDavid van Moolenbroek
145*00b67f09SDavid van Moolenbroek
146*00b67f09SDavid van Moolenbroekckstats () {
147*00b67f09SDavid van Moolenbroek    LABEL="$1"; shift
148*00b67f09SDavid van Moolenbroek    TYPE="$1"; shift
149*00b67f09SDavid van Moolenbroek    EXPECTED="$1"; shift
150*00b67f09SDavid van Moolenbroek    C=`sed -n -e "s/[	 ]*\([0-9]*\).responses $TYPE for rate limits.*/\1/p"  \
151*00b67f09SDavid van Moolenbroek	    ns2/named.stats | tail -1`
152*00b67f09SDavid van Moolenbroek    C=`expr 0$C + 0`
153*00b67f09SDavid van Moolenbroek    if test "$C" -ne $EXPECTED; then
154*00b67f09SDavid van Moolenbroek	setret "I:wrong $LABEL $TYPE statistics of $C instead of $EXPECTED"
155*00b67f09SDavid van Moolenbroek    fi
156*00b67f09SDavid van Moolenbroek}
157*00b67f09SDavid van Moolenbroek
158*00b67f09SDavid van Moolenbroek
159*00b67f09SDavid van Moolenbroek#########
160*00b67f09SDavid van Moolenbroeksec_start
161*00b67f09SDavid van Moolenbroek
162*00b67f09SDavid van Moolenbroek# Tests of referrals to "." must be done before the hints are loaded
163*00b67f09SDavid van Moolenbroek#   or with "additional-from-cache no"
164*00b67f09SDavid van Moolenbroekburst 5 a1.tld3 +norec
165*00b67f09SDavid van Moolenbroek# basic rate limiting
166*00b67f09SDavid van Moolenbroekburst 3 a1.tld2
167*00b67f09SDavid van Moolenbroek# 1 second delay allows an additional response.
168*00b67f09SDavid van Moolenbroeksleep 1
169*00b67f09SDavid van Moolenbroekburst 10 a1.tld2
170*00b67f09SDavid van Moolenbroek# Request 30 different qnames to try a wildcard.
171*00b67f09SDavid van Moolenbroekburst 30 'x$CNT.a2.tld2'
172*00b67f09SDavid van Moolenbroek# These should be counted and limited but are not.  See RT33138.
173*00b67f09SDavid van Moolenbroekburst 10 'y.x$CNT.a2.tld2'
174*00b67f09SDavid van Moolenbroek
175*00b67f09SDavid van Moolenbroek#					IP      TC      drop  NXDOMAIN SERVFAIL
176*00b67f09SDavid van Moolenbroek# referrals to "."
177*00b67f09SDavid van Moolenbroekck_result   a1.tld3	''		2	1	2	0	0
178*00b67f09SDavid van Moolenbroek# check 13 results including 1 second delay that allows an additional response
179*00b67f09SDavid van Moolenbroekck_result   a1.tld2	192.0.2.1	3	4	6	0	0
180*00b67f09SDavid van Moolenbroek
181*00b67f09SDavid van Moolenbroek# Check the wild card answers.
182*00b67f09SDavid van Moolenbroek# The parent name of the 30 requests is counted.
183*00b67f09SDavid van Moolenbroekck_result 'x*.a2.tld2'	192.0.2.2	2	10	18	0	0
184*00b67f09SDavid van Moolenbroek
185*00b67f09SDavid van Moolenbroek# These should be limited but are not.  See RT33138.
186*00b67f09SDavid van Moolenbroekck_result 'y.x*.a2.tld2' 192.0.2.2	10	0	0	0	0
187*00b67f09SDavid van Moolenbroek
188*00b67f09SDavid van Moolenbroek#########
189*00b67f09SDavid van Moolenbroeksec_start
190*00b67f09SDavid van Moolenbroek
191*00b67f09SDavid van Moolenbroekburst 10 'x.a3.tld3'
192*00b67f09SDavid van Moolenbroekburst 10 'y$CNT.a3.tld3'
193*00b67f09SDavid van Moolenbroekburst 10 'z$CNT.a4.tld2'
194*00b67f09SDavid van Moolenbroek
195*00b67f09SDavid van Moolenbroek# 10 identical recursive responses are limited
196*00b67f09SDavid van Moolenbroekck_result 'x.a3.tld3'	192.0.3.3	2	3	5	0	0
197*00b67f09SDavid van Moolenbroek
198*00b67f09SDavid van Moolenbroek# 10 different recursive responses are not limited
199*00b67f09SDavid van Moolenbroekck_result 'y*.a3.tld3'	192.0.3.3	10	0	0	0	0
200*00b67f09SDavid van Moolenbroek
201*00b67f09SDavid van Moolenbroek# 10 different NXDOMAIN responses are limited based on the parent name.
202*00b67f09SDavid van Moolenbroek#   We count 13 responses because we count truncated NXDOMAIN responses
203*00b67f09SDavid van Moolenbroek#   as both truncated and NXDOMAIN.
204*00b67f09SDavid van Moolenbroekck_result 'z*.a4.tld2'	x		0	3	5	5	0
205*00b67f09SDavid van Moolenbroek
206*00b67f09SDavid van Moolenbroek$RNDC -c $SYSTEMTESTTOP/common/rndc.conf -p 9953 -s $ns2 stats
207*00b67f09SDavid van Moolenbroekckstats first dropped 36
208*00b67f09SDavid van Moolenbroekckstats first truncated 21
209*00b67f09SDavid van Moolenbroek
210*00b67f09SDavid van Moolenbroek
211*00b67f09SDavid van Moolenbroek#########
212*00b67f09SDavid van Moolenbroeksec_start
213*00b67f09SDavid van Moolenbroek
214*00b67f09SDavid van Moolenbroekburst 10 a5.tld2 +tcp
215*00b67f09SDavid van Moolenbroekburst 10 a6.tld2 -b $ns7
216*00b67f09SDavid van Moolenbroekburst 10 a7.tld4
217*00b67f09SDavid van Moolenbroekburst 2 a8.tld2 AAAA
218*00b67f09SDavid van Moolenbroekburst 2 a8.tld2 TXT
219*00b67f09SDavid van Moolenbroekburst 2 a8.tld2 SPF
220*00b67f09SDavid van Moolenbroek
221*00b67f09SDavid van Moolenbroek#					IP      TC      drop  NXDOMAIN SERVFAIL
222*00b67f09SDavid van Moolenbroek# TCP responses are not rate limited
223*00b67f09SDavid van Moolenbroekck_result a5.tld2	192.0.2.5	10	0	0	0	0
224*00b67f09SDavid van Moolenbroek
225*00b67f09SDavid van Moolenbroek# whitelisted client is not rate limited
226*00b67f09SDavid van Moolenbroekck_result a6.tld2	192.0.2.6	10	0	0	0	0
227*00b67f09SDavid van Moolenbroek
228*00b67f09SDavid van Moolenbroek# Errors such as SERVFAIL are rate limited.
229*00b67f09SDavid van Moolenbroekck_result a7.tld4	x		0	0	8	0	2
230*00b67f09SDavid van Moolenbroek
231*00b67f09SDavid van Moolenbroek# NODATA responses are counted as the same regardless of qtype.
232*00b67f09SDavid van Moolenbroekck_result a8.tld2	''		2	2	2	0	0
233*00b67f09SDavid van Moolenbroek
234*00b67f09SDavid van Moolenbroek$RNDC -c $SYSTEMTESTTOP/common/rndc.conf -p 9953 -s $ns2 stats
235*00b67f09SDavid van Moolenbroekckstats second dropped 46
236*00b67f09SDavid van Moolenbroekckstats second truncated 23
237*00b67f09SDavid van Moolenbroek
238*00b67f09SDavid van Moolenbroek
239*00b67f09SDavid van Moolenbroek#########
240*00b67f09SDavid van Moolenbroeksec_start
241*00b67f09SDavid van Moolenbroek
242*00b67f09SDavid van Moolenbroek#					IP      TC      drop  NXDOMAIN SERVFAIL
243*00b67f09SDavid van Moolenbroek# all-per-second
244*00b67f09SDavid van Moolenbroek#   The qnames are all unique but the client IP address is constant.
245*00b67f09SDavid van MoolenbroekQNUM=101
246*00b67f09SDavid van Moolenbroekburst 60 'all$CNT.a9.tld2'
247*00b67f09SDavid van Moolenbroek
248*00b67f09SDavid van Moolenbroekck_result 'a*.a9.tld2'	192.0.2.8	50	0	10	0	0
249*00b67f09SDavid van Moolenbroek
250*00b67f09SDavid van Moolenbroek$RNDC -c $SYSTEMTESTTOP/common/rndc.conf -p 9953 -s $ns2 stats
251*00b67f09SDavid van Moolenbroekckstats final dropped 56
252*00b67f09SDavid van Moolenbroekckstats final truncated 23
253*00b67f09SDavid van Moolenbroek
254*00b67f09SDavid van Moolenbroek
255*00b67f09SDavid van Moolenbroekecho "I:exit status: $ret"
256*00b67f09SDavid van Moolenbroek# exit $ret
257*00b67f09SDavid van Moolenbroek[ $ret -ne 0 ] && echo "I:test failure overridden"
258*00b67f09SDavid van Moolenbroekexit 0
259