Home | History | Annotate | Line # | Download | only in serve-stale
tests.sh revision 1.1.1.9
      1 #!/bin/sh
      2 #
      3 # Copyright (C) Internet Systems Consortium, Inc. ("ISC")
      4 #
      5 # This Source Code Form is subject to the terms of the Mozilla Public
      6 # License, v. 2.0. If a copy of the MPL was not distributed with this
      7 # file, you can obtain one at https://mozilla.org/MPL/2.0/.
      8 #
      9 # See the COPYRIGHT file distributed with this work for additional
     10 # information regarding copyright ownership.
     11 
     12 SYSTEMTESTTOP=..
     13 . $SYSTEMTESTTOP/conf.sh
     14 
     15 RNDCCMD="$RNDC -c ../common/rndc.conf -p ${CONTROLPORT} -s"
     16 DIG="$DIG +time=11"
     17 
     18 max_stale_ttl=$(sed -ne 's,^[[:space:]]*max-stale-ttl \([[:digit:]]*\).*,\1,p' $TOP_SRCDIR/bin/named/config.c)
     19 stale_answer_ttl=$(sed -ne 's,^[[:space:]]*stale-answer-ttl \([[:digit:]]*\).*,\1,p' $TOP_SRCDIR/bin/named/config.c)
     20 
     21 status=0
     22 n=0
     23 #
     24 # First test server with serve-stale options set.
     25 #
     26 echo_i "test server with serve-stale options set"
     27 
     28 n=$((n+1))
     29 echo_i "prime cache longttl.example ($n)"
     30 ret=0
     31 $DIG -p ${PORT} @10.53.0.1 longttl.example TXT > dig.out.test$n
     32 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
     33 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
     34 if [ $ret != 0 ]; then echo_i "failed"; fi
     35 status=$((status+ret))
     36 
     37 n=$((n+1))
     38 echo_i "prime cache data.example ($n)"
     39 ret=0
     40 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n
     41 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
     42 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
     43 if [ $ret != 0 ]; then echo_i "failed"; fi
     44 status=$((status+ret))
     45 
     46 n=$((n+1))
     47 echo_i "prime cache othertype.example ($n)"
     48 ret=0
     49 $DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$n
     50 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
     51 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
     52 if [ $ret != 0 ]; then echo_i "failed"; fi
     53 status=$((status+ret))
     54 
     55 n=$((n+1))
     56 echo_i "prime cache nodata.example ($n)"
     57 ret=0
     58 $DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$n
     59 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
     60 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
     61 if [ $ret != 0 ]; then echo_i "failed"; fi
     62 status=$((status+ret))
     63 
     64 n=$((n+1))
     65 echo_i "prime cache nxdomain.example ($n)"
     66 ret=0
     67 $DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$n
     68 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
     69 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
     70 if [ $ret != 0 ]; then echo_i "failed"; fi
     71 status=$((status+ret))
     72 
     73 n=$((n+1))
     74 echo_i "verify prime cache statistics ($n)"
     75 ret=0
     76 rm -f ns1/named.stats
     77 $RNDCCMD 10.53.0.1 stats > /dev/null 2>&1
     78 [ -f ns1/named.stats ] || ret=1
     79 cp ns1/named.stats ns1/named.stats.$n
     80 # Check first 10 lines of Cache DB statistics.  After prime queries, we expect
     81 # two active TXT, one active Others, one nxrrset TXT, and one NXDOMAIN.
     82 grep -A 10 "++ Cache DB RRsets ++" ns1/named.stats.$n > ns1/named.stats.$n.cachedb || ret=1
     83 grep "1 Others" ns1/named.stats.$n.cachedb > /dev/null || ret=1
     84 grep "2 TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
     85 grep "1 !TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
     86 grep "1 NXDOMAIN" ns1/named.stats.$n.cachedb > /dev/null || ret=1
     87 if [ $ret != 0 ]; then echo_i "failed"; fi
     88 status=$((status+ret))
     89 
     90 n=$((n+1))
     91 echo_i "disable responses from authoritative server ($n)"
     92 ret=0
     93 $DIG -p ${PORT} @10.53.0.2 txt disable  > dig.out.test$n
     94 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
     95 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
     96 if [ $ret != 0 ]; then echo_i "failed"; fi
     97 status=$((status+ret))
     98 
     99 n=$((n+1))
    100 echo_i "check 'rndc serve-stale status' ($n)"
    101 ret=0
    102 $RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
    103 grep '_default: on (stale-answer-ttl=4 max-stale-ttl=3600 stale-refresh-time=30)' rndc.out.test$n > /dev/null || ret=1
    104 if [ $ret != 0 ]; then echo_i "failed"; fi
    105 status=$((status+ret))
    106 
    107 sleep 2
    108 
    109 echo_i "sending queries for tests $((n+1))-$((n+4))..."
    110 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
    111 $DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
    112 $DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
    113 $DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
    114 
    115 wait
    116 
    117 n=$((n+1))
    118 echo_i "check stale data.example ($n)"
    119 ret=0
    120 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    121 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    122 grep "data\.example\..*4.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
    123 if [ $ret != 0 ]; then echo_i "failed"; fi
    124 status=$((status+ret))
    125 
    126 # Run rndc dumpdb, test whether the stale data has correct comment printed.
    127 # The max-stale-ttl is 3600 seconds, so the comment should say the data is
    128 # stale for somewhere between 3500-3599 seconds.
    129 echo_i "check rndc dump stale data.example ($n)"
    130 rndc_dumpdb ns1 || ret=1
    131 awk '/; stale/ { x=$0; getline; print x, $0}' ns1/named_dump.db.test$n |
    132     grep "; stale (will be retained for 35.. more seconds) data\.example.*A text record with a 2 second ttl" > /dev/null 2>&1 || ret=1
    133 # Also make sure the not expired data does not have a stale comment.
    134 awk '/; answer/ { x=$0; getline; print x, $0}' ns1/named_dump.db.test$n |
    135     grep "; answer longttl\.example.*A text record with a 600 second ttl" > /dev/null 2>&1 || ret=1
    136 if [ $ret != 0 ]; then echo_i "failed"; fi
    137 status=$((status+ret))
    138 
    139 n=$((n+1))
    140 echo_i "check stale othertype.example ($n)"
    141 ret=0
    142 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    143 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    144 grep "othertype\.example\..*4.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1
    145 if [ $ret != 0 ]; then echo_i "failed"; fi
    146 status=$((status+ret))
    147 
    148 n=$((n+1))
    149 echo_i "check stale nodata.example ($n)"
    150 ret=0
    151 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    152 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    153 grep "example\..*4.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
    154 if [ $ret != 0 ]; then echo_i "failed"; fi
    155 status=$((status+ret))
    156 
    157 n=$((n+1))
    158 echo_i "check stale nxdomain.example ($n)"
    159 ret=0
    160 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
    161 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    162 grep "example\..*4.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
    163 if [ $ret != 0 ]; then echo_i "failed"; fi
    164 status=$((status+ret))
    165 
    166 n=$((n+1))
    167 echo_i "verify stale cache statistics ($n)"
    168 ret=0
    169 rm -f ns1/named.stats
    170 $RNDCCMD 10.53.0.1 stats > /dev/null 2>&1
    171 [ -f ns1/named.stats ] || ret=1
    172 cp ns1/named.stats ns1/named.stats.$n
    173 # Check first 10 lines of Cache DB statistics.  After serve-stale queries, we
    174 # expect one active TXT RRset, one stale TXT, one stale nxrrset TXT, and one
    175 # stale NXDOMAIN.
    176 grep -A 10 "++ Cache DB RRsets ++" ns1/named.stats.$n > ns1/named.stats.$n.cachedb || ret=1
    177 grep "1 TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
    178 grep "1 #Others" ns1/named.stats.$n.cachedb > /dev/null || ret=1
    179 grep "1 #TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
    180 grep "1 #!TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
    181 grep "1 #NXDOMAIN" ns1/named.stats.$n.cachedb > /dev/null || ret=1
    182 status=$((status+ret))
    183 if [ $ret != 0 ]; then echo_i "failed"; fi
    184 
    185 # Test stale-refresh-time when serve-stale is enabled via configuration.
    186 # Steps for testing stale-refresh-time option (default).
    187 # 1. Prime cache data.example txt
    188 # 2. Disable responses from authoritative server.
    189 # 3. Sleep for TTL duration so rrset TTL expires (2 sec)
    190 # 4. Query data.example
    191 # 5. Check if response come from stale rrset (4 sec TTL)
    192 # 6. Enable responses from authoritative server.
    193 # 7. Query data.example
    194 # 8. Check if response come from stale rrset, since the query
    195 #    is within stale-refresh-time window.
    196 n=$((n+1))
    197 echo_i "check 'rndc serve-stale status' ($n)"
    198 ret=0
    199 $RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
    200 grep '_default: on (stale-answer-ttl=4 max-stale-ttl=3600 stale-refresh-time=30)' rndc.out.test$n > /dev/null || ret=1
    201 if [ $ret != 0 ]; then echo_i "failed"; fi
    202 status=$((status+ret))
    203 
    204 # Step 1-3 done above.
    205 
    206 # Step 4.
    207 n=$((n+1))
    208 echo_i "sending query for test ($n)"
    209 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n
    210 
    211 # Step 5.
    212 echo_i "check stale data.example (stale-refresh-time) ($n)"
    213 ret=0
    214 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    215 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    216 grep "data\.example\..*4.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
    217 if [ $ret != 0 ]; then echo_i "failed"; fi
    218 status=$((status+ret))
    219 
    220 # Step 6.
    221 n=$((n+1))
    222 echo_i "enable responses from authoritative server ($n)"
    223 ret=0
    224 $DIG -p ${PORT} @10.53.0.2 txt enable > dig.out.test$n
    225 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    226 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
    227 if [ $ret != 0 ]; then echo_i "failed"; fi
    228 status=$((status+ret))
    229 
    230 # Step 7.
    231 echo_i "sending query for test $((n+1))"
    232 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1))
    233 
    234 # Step 8.
    235 n=$((n+1))
    236 echo_i "check stale data.example comes from cache (stale-refresh-time) ($n)"
    237 ret=0
    238 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    239 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    240 grep "data\.example\..*4.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
    241 if [ $ret != 0 ]; then echo_i "failed"; fi
    242 status=$((status+ret))
    243 
    244 #
    245 # Test disabling serve-stale via rndc.
    246 #
    247 n=$((n+1))
    248 echo_i "disable responses from authoritative server ($n)"
    249 ret=0
    250 $DIG -p ${PORT} @10.53.0.2 txt disable  > dig.out.test$n
    251 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    252 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
    253 if [ $ret != 0 ]; then echo_i "failed"; fi
    254 status=$((status+ret))
    255 
    256 n=$((n+1))
    257 echo_i "running 'rndc serve-stale off' ($n)"
    258 ret=0
    259 $RNDCCMD 10.53.0.1 serve-stale off || ret=1
    260 if [ $ret != 0 ]; then echo_i "failed"; fi
    261 status=$((status+ret))
    262 
    263 n=$((n+1))
    264 echo_i "check 'rndc serve-stale status' ($n)"
    265 ret=0
    266 $RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
    267 grep '_default: off (rndc) (stale-answer-ttl=4 max-stale-ttl=3600 stale-refresh-time=30)' rndc.out.test$n > /dev/null || ret=1
    268 if [ $ret != 0 ]; then echo_i "failed"; fi
    269 status=$((status+ret))
    270 
    271 echo_i "sending queries for tests $((n+1))-$((n+4))..."
    272 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
    273 $DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
    274 $DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
    275 $DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
    276 
    277 wait
    278 
    279 n=$((n+1))
    280 echo_i "check stale data.example (serve-stale off) ($n)"
    281 ret=0
    282 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
    283 if [ $ret != 0 ]; then echo_i "failed"; fi
    284 status=$((status+ret))
    285 
    286 n=$((n+1))
    287 echo_i "check stale othertype.example (serve-stale off) ($n)"
    288 ret=0
    289 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
    290 if [ $ret != 0 ]; then echo_i "failed"; fi
    291 status=$((status+ret))
    292 
    293 n=$((n+1))
    294 echo_i "check stale nodata.example (serve-stale off) ($n)"
    295 ret=0
    296 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
    297 if [ $ret != 0 ]; then echo_i "failed"; fi
    298 status=$((status+ret))
    299 
    300 n=$((n+1))
    301 echo_i "check stale nxdomain.example (serve-stale off) ($n)"
    302 ret=0
    303 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
    304 if [ $ret != 0 ]; then echo_i "failed"; fi
    305 status=$((status+ret))
    306 
    307 #
    308 # Test enabling serve-stale via rndc.
    309 #
    310 n=$((n+1))
    311 echo_i "running 'rndc serve-stale on' ($n)"
    312 ret=0
    313 $RNDCCMD 10.53.0.1 serve-stale on || ret=1
    314 if [ $ret != 0 ]; then echo_i "failed"; fi
    315 status=$((status+ret))
    316 
    317 n=$((n+1))
    318 echo_i "check 'rndc serve-stale status' ($n)"
    319 ret=0
    320 $RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
    321 grep '_default: on (rndc) (stale-answer-ttl=4 max-stale-ttl=3600 stale-refresh-time=30)' rndc.out.test$n > /dev/null || ret=1
    322 if [ $ret != 0 ]; then echo_i "failed"; fi
    323 status=$((status+ret))
    324 
    325 echo_i "sending queries for tests $((n+1))-$((n+4))..."
    326 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
    327 $DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
    328 $DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
    329 $DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
    330 
    331 wait
    332 
    333 n=$((n+1))
    334 echo_i "check stale data.example (serve-stale on) ($n)"
    335 ret=0
    336 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    337 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    338 grep "data\.example\..*4.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
    339 if [ $ret != 0 ]; then echo_i "failed"; fi
    340 status=$((status+ret))
    341 
    342 n=$((n+1))
    343 echo_i "check stale othertype.example (serve-stale on) ($n)"
    344 ret=0
    345 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    346 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    347 grep "othertype\.example\..*4.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1
    348 if [ $ret != 0 ]; then echo_i "failed"; fi
    349 status=$((status+ret))
    350 
    351 n=$((n+1))
    352 echo_i "check stale nodata.example (serve-stale on) ($n)"
    353 ret=0
    354 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    355 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    356 grep "example\..*4.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
    357 if [ $ret != 0 ]; then echo_i "failed"; fi
    358 status=$((status+ret))
    359 
    360 n=$((n+1))
    361 echo_i "check stale nxdomain.example (serve-stale on) ($n)"
    362 ret=0
    363 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
    364 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    365 grep "example\..*4.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
    366 if [ $ret != 0 ]; then echo_i "failed"; fi
    367 status=$((status+ret))
    368 
    369 n=$((n+1))
    370 echo_i "running 'rndc serve-stale off' ($n)"
    371 ret=0
    372 $RNDCCMD 10.53.0.1 serve-stale off || ret=1
    373 if [ $ret != 0 ]; then echo_i "failed"; fi
    374 status=$((status+ret))
    375 
    376 n=$((n+1))
    377 echo_i "running 'rndc serve-stale reset' ($n)"
    378 ret=0
    379 $RNDCCMD 10.53.0.1 serve-stale reset || ret=1
    380 if [ $ret != 0 ]; then echo_i "failed"; fi
    381 status=$((status+ret))
    382 
    383 n=$((n+1))
    384 echo_i "check 'rndc serve-stale status' ($n)"
    385 ret=0
    386 $RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
    387 grep '_default: on (stale-answer-ttl=4 max-stale-ttl=3600 stale-refresh-time=30)' rndc.out.test$n > /dev/null || ret=1
    388 if [ $ret != 0 ]; then echo_i "failed"; fi
    389 status=$((status+ret))
    390 
    391 echo_i "sending queries for tests $((n+1))-$((n+4))..."
    392 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
    393 $DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
    394 $DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
    395 $DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
    396 
    397 wait
    398 
    399 n=$((n+1))
    400 echo_i "check stale data.example (serve-stale reset) ($n)"
    401 ret=0
    402 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    403 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    404 grep "data\.example\..*4.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
    405 if [ $ret != 0 ]; then echo_i "failed"; fi
    406 status=$((status+ret))
    407 
    408 n=$((n+1))
    409 echo_i "check stale othertype.example (serve-stale reset) ($n)"
    410 ret=0
    411 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    412 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    413 grep "othertype.example\..*4.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1
    414 if [ $ret != 0 ]; then echo_i "failed"; fi
    415 status=$((status+ret))
    416 
    417 n=$((n+1))
    418 echo_i "check stale nodata.example (serve-stale reset) ($n)"
    419 ret=0
    420 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    421 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    422 grep "example\..*4.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
    423 if [ $ret != 0 ]; then echo_i "failed"; fi
    424 status=$((status+ret))
    425 
    426 n=$((n+1))
    427 echo_i "check stale nxdomain.example (serve-stale reset) ($n)"
    428 ret=0
    429 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
    430 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    431 grep "example\..*4.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
    432 if [ $ret != 0 ]; then echo_i "failed"; fi
    433 status=$((status+ret))
    434 
    435 n=$((n+1))
    436 echo_i "running 'rndc serve-stale off' ($n)"
    437 ret=0
    438 $RNDCCMD 10.53.0.1 serve-stale off || ret=1
    439 if [ $ret != 0 ]; then echo_i "failed"; fi
    440 status=$((status+ret))
    441 
    442 n=$((n+1))
    443 echo_i "check 'rndc serve-stale status' ($n)"
    444 ret=0
    445 $RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
    446 grep '_default: off (rndc) (stale-answer-ttl=4 max-stale-ttl=3600 stale-refresh-time=30)' rndc.out.test$n > /dev/null || ret=1
    447 if [ $ret != 0 ]; then echo_i "failed"; fi
    448 status=$((status+ret))
    449 
    450 #
    451 # Update named.conf.
    452 # Test server with low max-stale-ttl.
    453 #
    454 echo_i "test server with serve-stale options set, low max-stale-ttl"
    455 
    456 n=$((n+1))
    457 echo_i "updating ns1/named.conf ($n)"
    458 ret=0
    459 copy_setports ns1/named2.conf.in ns1/named.conf
    460 if [ $ret != 0 ]; then echo_i "failed"; fi
    461 status=$((status+ret))
    462 
    463 n=$((n+1))
    464 echo_i "running 'rndc reload' ($n)"
    465 ret=0
    466 rndc_reload ns1 10.53.0.1
    467 if [ $ret != 0 ]; then echo_i "failed"; fi
    468 status=$((status+ret))
    469 
    470 n=$((n+1))
    471 echo_i "check 'rndc serve-stale status' ($n)"
    472 ret=0
    473 $RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
    474 grep '_default: off (rndc) (stale-answer-ttl=3 max-stale-ttl=20 stale-refresh-time=30)' rndc.out.test$n > /dev/null || ret=1
    475 if [ $ret != 0 ]; then echo_i "failed"; fi
    476 status=$((status+ret))
    477 
    478 n=$((n+1))
    479 echo_i "flush cache, re-enable serve-stale and query again ($n)"
    480 ret=0
    481 $RNDCCMD 10.53.0.1 flushtree example > rndc.out.test$n.1 2>&1 || ret=1
    482 $RNDCCMD 10.53.0.1 serve-stale on > rndc.out.test$n.2 2>&1 || ret=1
    483 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n
    484 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
    485 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    486 if [ $ret != 0 ]; then echo_i "failed"; fi
    487 status=$((status+ret))
    488 
    489 n=$((n+1))
    490 echo_i "check 'rndc serve-stale status' ($n)"
    491 ret=0
    492 $RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
    493 grep '_default: on (rndc) (stale-answer-ttl=3 max-stale-ttl=20 stale-refresh-time=30)' rndc.out.test$n > /dev/null || ret=1
    494 if [ $ret != 0 ]; then echo_i "failed"; fi
    495 status=$((status+ret))
    496 
    497 n=$((n+1))
    498 echo_i "enable responses from authoritative server ($n)"
    499 ret=0
    500 $DIG -p ${PORT} @10.53.0.2 txt enable  > dig.out.test$n
    501 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    502 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
    503 if [ $ret != 0 ]; then echo_i "failed"; fi
    504 status=$((status+ret))
    505 
    506 n=$((n+1))
    507 echo_i "prime cache longttl.example (low max-stale-ttl) ($n)"
    508 ret=0
    509 $DIG -p ${PORT} @10.53.0.1 longttl.example TXT > dig.out.test$n
    510 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    511 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    512 if [ $ret != 0 ]; then echo_i "failed"; fi
    513 status=$((status+ret))
    514 
    515 n=$((n+1))
    516 echo_i "prime cache data.example (low max-stale-ttl) ($n)"
    517 ret=0
    518 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n
    519 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    520 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    521 if [ $ret != 0 ]; then echo_i "failed"; fi
    522 status=$((status+ret))
    523 
    524 n=$((n+1))
    525 echo_i "prime cache othertype.example (low max-stale-ttl) ($n)"
    526 ret=0
    527 $DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$n
    528 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    529 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    530 if [ $ret != 0 ]; then echo_i "failed"; fi
    531 status=$((status+ret))
    532 
    533 n=$((n+1))
    534 echo_i "prime cache nodata.example (low max-stale-ttl) ($n)"
    535 ret=0
    536 $DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$n
    537 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    538 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    539 if [ $ret != 0 ]; then echo_i "failed"; fi
    540 status=$((status+ret))
    541 
    542 n=$((n+1))
    543 echo_i "prime cache nxdomain.example (low max-stale-ttl) ($n)"
    544 ret=0
    545 $DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$n
    546 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
    547 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    548 if [ $ret != 0 ]; then echo_i "failed"; fi
    549 status=$((status+ret))
    550 
    551 # Keep track of time so we can access these RRset later, when we expect them
    552 # to become ancient.
    553 t1=`$PERL -e 'print time()'`
    554 
    555 n=$((n+1))
    556 echo_i "verify prime cache statistics (low max-stale-ttl) ($n)"
    557 ret=0
    558 rm -f ns1/named.stats
    559 $RNDCCMD 10.53.0.1 stats > /dev/null 2>&1
    560 [ -f ns1/named.stats ] || ret=1
    561 cp ns1/named.stats ns1/named.stats.$n
    562 # Check first 10 lines of Cache DB statistics.  After prime queries, we expect
    563 # two active TXT RRsets, one active Others, one nxrrset TXT, and one NXDOMAIN.
    564 grep -A 10 "++ Cache DB RRsets ++" ns1/named.stats.$n > ns1/named.stats.$n.cachedb || ret=1
    565 grep "2 TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
    566 grep "1 Others" ns1/named.stats.$n.cachedb > /dev/null || ret=1
    567 grep "1 !TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
    568 grep "1 NXDOMAIN" ns1/named.stats.$n.cachedb > /dev/null || ret=1
    569 status=$((status+ret))
    570 if [ $ret != 0 ]; then echo_i "failed"; fi
    571 
    572 n=$((n+1))
    573 echo_i "disable responses from authoritative server ($n)"
    574 ret=0
    575 $DIG -p ${PORT} @10.53.0.2 txt disable  > dig.out.test$n
    576 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    577 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
    578 if [ $ret != 0 ]; then echo_i "failed"; fi
    579 status=$((status+ret))
    580 
    581 sleep 2
    582 
    583 echo_i "sending queries for tests $((n+1))-$((n+4))..."
    584 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
    585 $DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
    586 $DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
    587 $DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
    588 
    589 wait
    590 
    591 n=$((n+1))
    592 echo_i "check stale data.example (low max-stale-ttl) ($n)"
    593 ret=0
    594 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    595 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    596 grep "data\.example\..*3.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
    597 if [ $ret != 0 ]; then echo_i "failed"; fi
    598 status=$((status+ret))
    599 
    600 n=$((n+1))
    601 echo_i "check stale othertype.example (low max-stale-ttl) ($n)"
    602 ret=0
    603 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    604 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    605 grep "othertype\.example\..*3.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1
    606 if [ $ret != 0 ]; then echo_i "failed"; fi
    607 status=$((status+ret))
    608 
    609 n=$((n+1))
    610 echo_i "check stale nodata.example (low max-stale-ttl) ($n)"
    611 ret=0
    612 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    613 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    614 grep "example\..*3.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
    615 if [ $ret != 0 ]; then echo_i "failed"; fi
    616 status=$((status+ret))
    617 
    618 n=$((n+1))
    619 echo_i "check stale nxdomain.example (low max-stale-ttl) ($n)"
    620 ret=0
    621 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
    622 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    623 grep "example\..*3.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
    624 if [ $ret != 0 ]; then echo_i "failed"; fi
    625 status=$((status+ret))
    626 
    627 n=$((n+1))
    628 echo_i "verify stale cache statistics (low max-stale-ttl) ($n)"
    629 ret=0
    630 rm -f ns1/named.stats
    631 $RNDCCMD 10.53.0.1 stats > /dev/null 2>&1
    632 [ -f ns1/named.stats ] || ret=1
    633 cp ns1/named.stats ns1/named.stats.$n
    634 # Check first 10 lines of Cache DB statistics.  After serve-stale queries, we
    635 # expect one active TXT RRset, one stale TXT, one stale nxrrset TXT, and one
    636 # stale NXDOMAIN.
    637 grep -A 10 "++ Cache DB RRsets ++" ns1/named.stats.$n > ns1/named.stats.$n.cachedb || ret=1
    638 grep "1 TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
    639 grep "1 #TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
    640 grep "1 #Others" ns1/named.stats.$n.cachedb > /dev/null || ret=1
    641 grep "1 #!TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
    642 grep "1 #NXDOMAIN" ns1/named.stats.$n.cachedb > /dev/null || ret=1
    643 
    644 status=$((status+ret))
    645 if [ $ret != 0 ]; then echo_i "failed"; fi
    646 
    647 # Retrieve max-stale-ttl value.
    648 interval_to_ancient=`grep 'max-stale-ttl' ns1/named2.conf.in  | awk '{ print $2 }' | tr -d ';'`
    649 # We add 2 seconds to it since this is the ttl value of the records being
    650 # tested.
    651 interval_to_ancient=$((interval_to_ancient + 2))
    652 t2=`$PERL -e 'print time()'`
    653 elapsed=$((t2 - t1))
    654 
    655 # If elapsed time so far is less than max-stale-ttl + 2 seconds, then we sleep
    656 # enough to ensure that we'll ask for ancient RRsets in the next queries.
    657 if [ $elapsed -lt $interval_to_ancient ]; then
    658     sleep $((interval_to_ancient - elapsed))
    659 fi
    660 
    661 echo_i "sending queries for tests $((n+1))-$((n+4))..."
    662 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
    663 $DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
    664 $DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
    665 $DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
    666 
    667 wait
    668 
    669 n=$((n+1))
    670 echo_i "check ancient data.example (low max-stale-ttl) ($n)"
    671 ret=0
    672 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
    673 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    674 if [ $ret != 0 ]; then echo_i "failed"; fi
    675 status=$((status+ret))
    676 
    677 n=$((n+1))
    678 echo_i "check ancient othertype.example (low max-stale-ttl) ($n)"
    679 ret=0
    680 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
    681 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    682 if [ $ret != 0 ]; then echo_i "failed"; fi
    683 status=$((status+ret))
    684 
    685 n=$((n+1))
    686 echo_i "check ancient nodata.example (low max-stale-ttl) ($n)"
    687 ret=0
    688 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
    689 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    690 if [ $ret != 0 ]; then echo_i "failed"; fi
    691 status=$((status+ret))
    692 
    693 n=$((n+1))
    694 echo_i "check ancient nxdomain.example (low max-stale-ttl) ($n)"
    695 ret=0
    696 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
    697 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    698 if [ $ret != 0 ]; then echo_i "failed"; fi
    699 status=$((status+ret))
    700 
    701 # Test stale-refresh-time when serve-stale is enabled via rndc.
    702 # Steps for testing stale-refresh-time option (default).
    703 # 1. Prime cache data.example txt
    704 # 2. Disable responses from authoritative server.
    705 # 3. Sleep for TTL duration so rrset TTL expires (2 sec)
    706 # 4. Query data.example
    707 # 5. Check if response come from stale rrset (3 sec TTL)
    708 # 6. Enable responses from authoritative server.
    709 # 7. Query data.example
    710 # 8. Check if response come from stale rrset, since the query
    711 #    is within stale-refresh-time window.
    712 n=$((n+1))
    713 echo_i "flush cache, enable responses from authoritative server ($n)"
    714 ret=0
    715 $RNDCCMD 10.53.0.1 flushtree example > rndc.out.test$n.1 2>&1 || ret=1
    716 $DIG -p ${PORT} @10.53.0.2 txt enable  > dig.out.test$n
    717 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    718 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
    719 if [ $ret != 0 ]; then echo_i "failed"; fi
    720 status=$((status+ret))
    721 
    722 n=$((n+1))
    723 echo_i "check 'rndc serve-stale status' ($n)"
    724 ret=0
    725 $RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
    726 grep '_default: on (rndc) (stale-answer-ttl=3 max-stale-ttl=20 stale-refresh-time=30)' rndc.out.test$n > /dev/null || ret=1
    727 if [ $ret != 0 ]; then echo_i "failed"; fi
    728 status=$((status+ret))
    729 
    730 # Step 1.
    731 n=$((n+1))
    732 echo_i "prime cache data.example (stale-refresh-time rndc) ($n)"
    733 ret=0
    734 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n
    735 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    736 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    737 grep "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
    738 if [ $ret != 0 ]; then echo_i "failed"; fi
    739 status=$((status+ret))
    740 
    741 # Step 2.
    742 n=$((n+1))
    743 echo_i "disable responses from authoritative server ($n)"
    744 ret=0
    745 $DIG -p ${PORT} @10.53.0.2 txt disable  > dig.out.test$n
    746 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    747 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
    748 if [ $ret != 0 ]; then echo_i "failed"; fi
    749 status=$((status+ret))
    750 
    751 # Step 3.
    752 sleep 2
    753 
    754 # Step 4.
    755 n=$((n+1))
    756 echo_i "sending query for test ($n)"
    757 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n
    758 
    759 # Step 5.
    760 echo_i "check stale data.example (stale-refresh-time rndc) ($n)"
    761 ret=0
    762 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    763 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    764 grep "data\.example\..*3.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
    765 if [ $ret != 0 ]; then echo_i "failed"; fi
    766 status=$((status+ret))
    767 
    768 # Step 6.
    769 n=$((n+1))
    770 echo_i "enable responses from authoritative server ($n)"
    771 ret=0
    772 $DIG -p ${PORT} @10.53.0.2 txt enable > dig.out.test$n
    773 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    774 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
    775 if [ $ret != 0 ]; then echo_i "failed"; fi
    776 status=$((status+ret))
    777 
    778 # Step 7.
    779 echo_i "sending query for test $((n+1))"
    780 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1))
    781 
    782 # Step 8.
    783 n=$((n+1))
    784 echo_i "check stale data.example comes from cache (stale-refresh-time rndc) ($n)"
    785 ret=0
    786 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    787 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    788 grep "data\.example\..*3.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
    789 if [ $ret != 0 ]; then echo_i "failed"; fi
    790 status=$((status+ret))
    791 
    792 # Steps for testing stale-refresh-time option (disabled).
    793 # 1. Prime cache data.example txt
    794 # 2. Disable responses from authoritative server.
    795 # 3. Sleep for TTL duration so rrset TTL expires (2 sec)
    796 # 4. Query data.example
    797 # 5. Check if response come from stale rrset (3 sec TTL)
    798 # 6. Enable responses from authoritative server.
    799 # 7. Query data.example
    800 # 8. Check if response come from stale rrset, since the query
    801 #    is within stale-refresh-time window.
    802 n=$((n+1))
    803 echo_i "updating ns1/named.conf ($n)"
    804 ret=0
    805 copy_setports ns1/named3.conf.in ns1/named.conf
    806 if [ $ret != 0 ]; then echo_i "failed"; fi
    807 status=$((status+ret))
    808 
    809 n=$((n+1))
    810 echo_i "running 'rndc reload' ($n)"
    811 ret=0
    812 rndc_reload ns1 10.53.0.1
    813 if [ $ret != 0 ]; then echo_i "failed"; fi
    814 status=$((status+ret))
    815 
    816 n=$((n+1))
    817 echo_i "check 'rndc serve-stale status' ($n)"
    818 ret=0
    819 $RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
    820 grep '_default: on (rndc) (stale-answer-ttl=3 max-stale-ttl=20 stale-refresh-time=0)' rndc.out.test$n > /dev/null || ret=1
    821 if [ $ret != 0 ]; then echo_i "failed"; fi
    822 status=$((status+ret))
    823 
    824 n=$((n+1))
    825 echo_i "flush cache, enable responses from authoritative server ($n)"
    826 ret=0
    827 $RNDCCMD 10.53.0.1 flushtree example > rndc.out.test$n.1 2>&1 || ret=1
    828 $DIG -p ${PORT} @10.53.0.2 txt enable  > dig.out.test$n
    829 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    830 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
    831 if [ $ret != 0 ]; then echo_i "failed"; fi
    832 status=$((status+ret))
    833 
    834 # Step 1.
    835 n=$((n+1))
    836 echo_i "prime cache data.example (stale-refresh-time disabled) ($n)"
    837 ret=0
    838 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n
    839 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    840 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    841 grep "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
    842 if [ $ret != 0 ]; then echo_i "failed"; fi
    843 status=$((status+ret))
    844 
    845 # Step 2.
    846 n=$((n+1))
    847 echo_i "disable responses from authoritative server ($n)"
    848 ret=0
    849 $DIG -p ${PORT} @10.53.0.2 txt disable  > dig.out.test$n
    850 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    851 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
    852 if [ $ret != 0 ]; then echo_i "failed"; fi
    853 status=$((status+ret))
    854 
    855 # Step 3.
    856 sleep 2
    857 
    858 # Step 4.
    859 n=$((n+1))
    860 echo_i "sending query for test ($n)"
    861 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n
    862 
    863 # Step 5.
    864 echo_i "check stale data.example (stale-refresh-time disabled) ($n)"
    865 ret=0
    866 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    867 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    868 grep "data\.example\..*3.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
    869 if [ $ret != 0 ]; then echo_i "failed"; fi
    870 status=$((status+ret))
    871 
    872 # Step 6.
    873 n=$((n+1))
    874 echo_i "enable responses from authoritative server ($n)"
    875 ret=0
    876 $DIG -p ${PORT} @10.53.0.2 txt enable > dig.out.test$n
    877 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    878 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
    879 if [ $ret != 0 ]; then echo_i "failed"; fi
    880 status=$((status+ret))
    881 
    882 # Step 7.
    883 echo_i "sending query for test $((n+1))"
    884 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1))
    885 
    886 # Step 8.
    887 n=$((n+1))
    888 echo_i "check data.example comes from authoritative (stale-refresh-time disabled) ($n)"
    889 ret=0
    890 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    891 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    892 grep "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
    893 if [ $ret != 0 ]; then echo_i "failed"; fi
    894 status=$((status+ret))
    895 
    896 #
    897 # Now test server with no serve-stale options set.
    898 #
    899 echo_i "test server with no serve-stale options set"
    900 
    901 n=$((n+1))
    902 echo_i "enable responses from authoritative server ($n)"
    903 ret=0
    904 $DIG -p ${PORT} @10.53.0.2 txt enable  > dig.out.test$n
    905 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    906 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
    907 if [ $ret != 0 ]; then echo_i "failed"; fi
    908 status=$((status+ret))
    909 
    910 n=$((n+1))
    911 echo_i "prime cache longttl.example (max-stale-ttl default) ($n)"
    912 ret=0
    913 $DIG -p ${PORT} @10.53.0.3 longttl.example TXT > dig.out.test$n
    914 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    915 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    916 if [ $ret != 0 ]; then echo_i "failed"; fi
    917 status=$((status+ret))
    918 
    919 n=$((n+1))
    920 echo_i "prime cache data.example (max-stale-ttl default) ($n)"
    921 ret=0
    922 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
    923 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    924 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    925 grep "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
    926 if [ $ret != 0 ]; then echo_i "failed"; fi
    927 status=$((status+ret))
    928 
    929 n=$((n+1))
    930 echo_i "prime cache othertype.example (max-stale-ttl default) ($n)"
    931 ret=0
    932 $DIG -p ${PORT} @10.53.0.3 othertype.example CAA > dig.out.test$n
    933 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    934 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    935 grep "othertype\.example\..*2.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1
    936 if [ $ret != 0 ]; then echo_i "failed"; fi
    937 status=$((status+ret))
    938 
    939 n=$((n+1))
    940 echo_i "prime cache nodata.example (max-stale-ttl default) ($n)"
    941 ret=0
    942 $DIG -p ${PORT} @10.53.0.3 nodata.example TXT > dig.out.test$n
    943 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    944 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    945 grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
    946 if [ $ret != 0 ]; then echo_i "failed"; fi
    947 status=$((status+ret))
    948 
    949 n=$((n+1))
    950 echo_i "prime cache nxdomain.example (max-stale-ttl default) ($n)"
    951 ret=0
    952 $DIG -p ${PORT} @10.53.0.3 nxdomain.example TXT > dig.out.test$n
    953 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
    954 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    955 grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
    956 if [ $ret != 0 ]; then echo_i "failed"; fi
    957 status=$((status+ret))
    958 
    959 n=$((n+1))
    960 echo_i "verify prime cache statistics (max-stale-ttl default) ($n)"
    961 ret=0
    962 rm -f ns3/named.stats
    963 $RNDCCMD 10.53.0.3 stats > /dev/null 2>&1
    964 [ -f ns3/named.stats ] || ret=1
    965 cp ns3/named.stats ns3/named.stats.$n
    966 # Check first 10 lines of Cache DB statistics.  After prime queries, we expect
    967 # two active TXT RRsets, one active Others, one nxrrset TXT, and one NXDOMAIN.
    968 grep -A 10 "++ Cache DB RRsets ++" ns3/named.stats.$n > ns3/named.stats.$n.cachedb || ret=1
    969 grep "2 TXT" ns3/named.stats.$n.cachedb > /dev/null || ret=1
    970 grep "1 Others" ns3/named.stats.$n.cachedb > /dev/null || ret=1
    971 grep "1 !TXT" ns3/named.stats.$n.cachedb > /dev/null || ret=1
    972 grep "1 NXDOMAIN" ns3/named.stats.$n.cachedb > /dev/null || ret=1
    973 status=$((status+ret))
    974 if [ $ret != 0 ]; then echo_i "failed"; fi
    975 
    976 n=$((n+1))
    977 echo_i "disable responses from authoritative server ($n)"
    978 ret=0
    979 $DIG -p ${PORT} @10.53.0.2 txt disable  > dig.out.test$n
    980 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    981 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
    982 if [ $ret != 0 ]; then echo_i "failed"; fi
    983 status=$((status+ret))
    984 
    985 n=$((n+1))
    986 echo_i "check 'rndc serve-stale status' ($n)"
    987 ret=0
    988 $RNDCCMD 10.53.0.3 serve-stale status > rndc.out.test$n 2>&1 || ret=1
    989 grep "_default: off (stale-answer-ttl=$stale_answer_ttl max-stale-ttl=$max_stale_ttl stale-refresh-time=30)" rndc.out.test$n > /dev/null || ret=1
    990 if [ $ret != 0 ]; then echo_i "failed"; fi
    991 status=$((status+ret))
    992 
    993 sleep 2
    994 
    995 echo_i "sending queries for tests $((n+1))-$((n+4))..."
    996 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$((n+1)) &
    997 $DIG -p ${PORT} @10.53.0.3 othertype.example CAA > dig.out.test$((n+2)) &
    998 $DIG -p ${PORT} @10.53.0.3 nodata.example TXT > dig.out.test$((n+3)) &
    999 $DIG -p ${PORT} @10.53.0.3 nxdomain.example TXT > dig.out.test$((n+4))
   1000 
   1001 wait
   1002 
   1003 n=$((n+1))
   1004 echo_i "check fail of data.example (max-stale-ttl default) ($n)"
   1005 ret=0
   1006 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
   1007 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
   1008 if [ $ret != 0 ]; then echo_i "failed"; fi
   1009 status=$((status+ret))
   1010 
   1011 n=$((n+1))
   1012 echo_i "check fail of othertype.example (max-stale-ttl default) ($n)"
   1013 ret=0
   1014 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
   1015 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
   1016 if [ $ret != 0 ]; then echo_i "failed"; fi
   1017 status=$((status+ret))
   1018 
   1019 n=$((n+1))
   1020 echo_i "check fail of nodata.example (max-stale-ttl default) ($n)"
   1021 ret=0
   1022 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
   1023 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
   1024 if [ $ret != 0 ]; then echo_i "failed"; fi
   1025 status=$((status+ret))
   1026 
   1027 n=$((n+1))
   1028 echo_i "check fail of nxdomain.example (max-stale-ttl default) ($n)"
   1029 ret=0
   1030 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
   1031 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
   1032 if [ $ret != 0 ]; then echo_i "failed"; fi
   1033 status=$((status+ret))
   1034 
   1035 n=$((n+1))
   1036 echo_i "verify stale cache statistics (max-stale-ttl default) ($n)"
   1037 ret=0
   1038 rm -f ns3/named.stats
   1039 $RNDCCMD 10.53.0.3 stats > /dev/null 2>&1
   1040 [ -f ns3/named.stats ] || ret=1
   1041 cp ns3/named.stats ns3/named.stats.$n
   1042 # Check first 10 lines of Cache DB statistics. After last queries, we expect
   1043 # one active TXT RRset, one stale TXT, one stale nxrrset TXT, and one stale
   1044 # NXDOMAIN.
   1045 grep -A 10 "++ Cache DB RRsets ++" ns3/named.stats.$n > ns3/named.stats.$n.cachedb || ret=1
   1046 grep "1 TXT" ns3/named.stats.$n.cachedb > /dev/null || ret=1
   1047 grep "1 #TXT" ns3/named.stats.$n.cachedb > /dev/null || ret=1
   1048 grep "1 #Others" ns3/named.stats.$n.cachedb > /dev/null || ret=1
   1049 grep "1 #!TXT" ns3/named.stats.$n.cachedb > /dev/null || ret=1
   1050 grep "1 #NXDOMAIN" ns3/named.stats.$n.cachedb > /dev/null || ret=1
   1051 
   1052 status=$((status+ret))
   1053 if [ $ret != 0 ]; then echo_i "failed"; fi
   1054 
   1055 n=$((n+1))
   1056 echo_i "check 'rndc serve-stale on' ($n)"
   1057 ret=0
   1058 $RNDCCMD 10.53.0.3 serve-stale on > rndc.out.test$n 2>&1 || ret=1
   1059 if [ $ret != 0 ]; then echo_i "failed"; fi
   1060 status=$((status+ret))
   1061 
   1062 n=$((n+1))
   1063 echo_i "check 'rndc serve-stale status' ($n)"
   1064 ret=0
   1065 $RNDCCMD 10.53.0.3 serve-stale status > rndc.out.test$n 2>&1 || ret=1
   1066 grep "_default: on (rndc) (stale-answer-ttl=$stale_answer_ttl max-stale-ttl=$max_stale_ttl stale-refresh-time=30)" rndc.out.test$n > /dev/null || ret=1
   1067 if [ $ret != 0 ]; then echo_i "failed"; fi
   1068 status=$((status+ret))
   1069 
   1070 sleep 2
   1071 
   1072 # Check that if we don't have stale data for a domain name, we will
   1073 # not answer anything until the resolver query timeout.
   1074 n=$((n+1))
   1075 echo_i "check notincache.example times out (max-stale-ttl default) ($n)"
   1076 ret=0
   1077 $DIG -p ${PORT} +tries=1 +timeout=3  @10.53.0.3 notfound.example TXT > dig.out.test$n 2>&1
   1078 grep "connection timed out" dig.out.test$n > /dev/null || ret=1
   1079 if [ $ret != 0 ]; then echo_i "failed"; fi
   1080 status=$((status+ret))
   1081 
   1082 echo_i "sending queries for tests $((n+1))-$((n+4))..."
   1083 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$((n+1)) &
   1084 $DIG -p ${PORT} @10.53.0.3 othertype.example CAA > dig.out.test$((n+2)) &
   1085 $DIG -p ${PORT} @10.53.0.3 nodata.example TXT > dig.out.test$((n+3)) &
   1086 $DIG -p ${PORT} @10.53.0.3 nxdomain.example TXT > dig.out.test$((n+4)) &
   1087 $DIG -p ${PORT} @10.53.0.3 notfound.example TXT > dig.out.test$((n+5))
   1088 
   1089 wait
   1090 
   1091 n=$((n+1))
   1092 echo_i "check data.example (max-stale-ttl default) ($n)"
   1093 ret=0
   1094 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   1095 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1096 grep "data\.example\..*30.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
   1097 if [ $ret != 0 ]; then echo_i "failed"; fi
   1098 status=$((status+ret))
   1099 
   1100 n=$((n+1))
   1101 echo_i "check othertype.example (max-stale-ttl default) ($n)"
   1102 ret=0
   1103 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   1104 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1105 grep "example\..*30.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1
   1106 if [ $ret != 0 ]; then echo_i "failed"; fi
   1107 status=$((status+ret))
   1108 
   1109 n=$((n+1))
   1110 echo_i "check nodata.example (max-stale-ttl default) ($n)"
   1111 ret=0
   1112 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   1113 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
   1114 grep "example\..*30.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
   1115 if [ $ret != 0 ]; then echo_i "failed"; fi
   1116 status=$((status+ret))
   1117 
   1118 n=$((n+1))
   1119 echo_i "check nxdomain.example (max-stale-ttl default) ($n)"
   1120 ret=0
   1121 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
   1122 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
   1123 grep "example\..*30.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
   1124 if [ $ret != 0 ]; then echo_i "failed"; fi
   1125 status=$((status+ret))
   1126 
   1127 # The notfound.example check is different than nxdomain.example because
   1128 # we didn't send a prime query to add notfound.example to the cache.
   1129 n=$((n+1))
   1130 echo_i "check notfound.example (max-stale-ttl default) ($n)"
   1131 ret=0
   1132 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
   1133 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
   1134 if [ $ret != 0 ]; then echo_i "failed"; fi
   1135 status=$((status+ret))
   1136 
   1137 #
   1138 # Now test server with serve-stale answers disabled.
   1139 #
   1140 echo_i "test server with serve-stale disabled"
   1141 
   1142 n=$((n+1))
   1143 echo_i "enable responses from authoritative server ($n)"
   1144 ret=0
   1145 $DIG -p ${PORT} @10.53.0.2 txt enable  > dig.out.test$n
   1146 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1147 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
   1148 if [ $ret != 0 ]; then echo_i "failed"; fi
   1149 status=$((status+ret))
   1150 
   1151 n=$((n+1))
   1152 echo_i "prime cache longttl.example (serve-stale answers disabled) ($n)"
   1153 ret=0
   1154 $DIG -p ${PORT} @10.53.0.4 longttl.example TXT > dig.out.test$n
   1155 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   1156 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1157 if [ $ret != 0 ]; then echo_i "failed"; fi
   1158 status=$((status+ret))
   1159 
   1160 n=$((n+1))
   1161 echo_i "prime cache data.example (serve-stale answers disabled) ($n)"
   1162 ret=0
   1163 $DIG -p ${PORT} @10.53.0.4 data.example TXT > dig.out.test$n
   1164 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   1165 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1166 grep "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
   1167 if [ $ret != 0 ]; then echo_i "failed"; fi
   1168 status=$((status+ret))
   1169 
   1170 n=$((n+1))
   1171 echo_i "prime cache othertype.example (serve-stale answers disabled) ($n)"
   1172 ret=0
   1173 $DIG -p ${PORT} @10.53.0.4 othertype.example CAA > dig.out.test$n
   1174 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   1175 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1176 grep "othertype\.example\..*2.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1
   1177 if [ $ret != 0 ]; then echo_i "failed"; fi
   1178 status=$((status+ret))
   1179 
   1180 n=$((n+1))
   1181 echo_i "prime cache nodata.example (serve-stale answers disabled) ($n)"
   1182 ret=0
   1183 $DIG -p ${PORT} @10.53.0.4 nodata.example TXT > dig.out.test$n
   1184 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   1185 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
   1186 grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
   1187 if [ $ret != 0 ]; then echo_i "failed"; fi
   1188 status=$((status+ret))
   1189 
   1190 n=$((n+1))
   1191 echo_i "prime cache nxdomain.example (serve-stale answers disabled) ($n)"
   1192 ret=0
   1193 $DIG -p ${PORT} @10.53.0.4 nxdomain.example TXT > dig.out.test$n
   1194 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
   1195 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
   1196 grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
   1197 if [ $ret != 0 ]; then echo_i "failed"; fi
   1198 status=$((status+ret))
   1199 
   1200 n=$((n+1))
   1201 echo_i "verify prime cache statistics (serve-stale answers disabled) ($n)"
   1202 ret=0
   1203 rm -f ns4/named.stats
   1204 $RNDCCMD 10.53.0.4 stats > /dev/null 2>&1
   1205 [ -f ns4/named.stats ] || ret=1
   1206 cp ns4/named.stats ns4/named.stats.$n
   1207 # Check first 10 lines of Cache DB statistics.  After prime queries, we expect
   1208 # two active TXT RRsets, one active Others, one nxrrset TXT, and one NXDOMAIN.
   1209 grep -A 10 "++ Cache DB RRsets ++" ns4/named.stats.$n > ns4/named.stats.$n.cachedb || ret=1
   1210 grep "2 TXT" ns4/named.stats.$n.cachedb > /dev/null || ret=1
   1211 grep "1 Others" ns4/named.stats.$n.cachedb > /dev/null || ret=1
   1212 grep "1 !TXT" ns4/named.stats.$n.cachedb > /dev/null || ret=1
   1213 grep "1 NXDOMAIN" ns4/named.stats.$n.cachedb > /dev/null || ret=1
   1214 status=$((status+ret))
   1215 if [ $ret != 0 ]; then echo_i "failed"; fi
   1216 
   1217 n=$((n+1))
   1218 echo_i "disable responses from authoritative server ($n)"
   1219 ret=0
   1220 $DIG -p ${PORT} @10.53.0.2 txt disable  > dig.out.test$n
   1221 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1222 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
   1223 if [ $ret != 0 ]; then echo_i "failed"; fi
   1224 status=$((status+ret))
   1225 
   1226 n=$((n+1))
   1227 echo_i "check 'rndc serve-stale status' ($n)"
   1228 ret=0
   1229 $RNDCCMD 10.53.0.4 serve-stale status > rndc.out.test$n 2>&1 || ret=1
   1230 grep "_default: off (stale-answer-ttl=$stale_answer_ttl max-stale-ttl=$max_stale_ttl stale-refresh-time=30)" rndc.out.test$n > /dev/null || ret=1
   1231 if [ $ret != 0 ]; then echo_i "failed"; fi
   1232 status=$((status+ret))
   1233 
   1234 sleep 2
   1235 
   1236 echo_i "sending queries for tests $((n+1))-$((n+4))..."
   1237 $DIG -p ${PORT} @10.53.0.4 data.example TXT > dig.out.test$((n+1)) &
   1238 $DIG -p ${PORT} @10.53.0.4 othertype.example CAA > dig.out.test$((n+2)) &
   1239 $DIG -p ${PORT} @10.53.0.4 nodata.example TXT > dig.out.test$((n+3)) &
   1240 $DIG -p ${PORT} @10.53.0.4 nxdomain.example TXT > dig.out.test$((n+4))
   1241 
   1242 wait
   1243 
   1244 n=$((n+1))
   1245 echo_i "check fail of data.example (serve-stale answers disabled) ($n)"
   1246 ret=0
   1247 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
   1248 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
   1249 if [ $ret != 0 ]; then echo_i "failed"; fi
   1250 status=$((status+ret))
   1251 
   1252 n=$((n+1))
   1253 echo_i "check fail of othertype.example (serve-stale answers disabled) ($n)"
   1254 ret=0
   1255 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
   1256 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
   1257 if [ $ret != 0 ]; then echo_i "failed"; fi
   1258 status=$((status+ret))
   1259 
   1260 n=$((n+1))
   1261 echo_i "check fail of nodata.example (serve-stale answers disabled) ($n)"
   1262 ret=0
   1263 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
   1264 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
   1265 if [ $ret != 0 ]; then echo_i "failed"; fi
   1266 status=$((status+ret))
   1267 
   1268 n=$((n+1))
   1269 echo_i "check fail of nxdomain.example (serve-stale answers disabled) ($n)"
   1270 ret=0
   1271 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
   1272 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
   1273 if [ $ret != 0 ]; then echo_i "failed"; fi
   1274 status=$((status+ret))
   1275 
   1276 n=$((n+1))
   1277 echo_i "verify stale cache statistics (serve-stale answers disabled) ($n)"
   1278 ret=0
   1279 rm -f ns4/named.stats
   1280 $RNDCCMD 10.53.0.4 stats > /dev/null 2>&1
   1281 [ -f ns4/named.stats ] || ret=1
   1282 cp ns4/named.stats ns4/named.stats.$n
   1283 # Check first 10 lines of Cache DB statistics. After last queries, we expect
   1284 # one active TXT RRset, one stale TXT, one stale nxrrset TXT, and one stale
   1285 # NXDOMAIN.
   1286 grep -A 10 "++ Cache DB RRsets ++" ns4/named.stats.$n > ns4/named.stats.$n.cachedb || ret=1
   1287 grep "1 TXT" ns4/named.stats.$n.cachedb > /dev/null || ret=1
   1288 grep "1 #TXT" ns4/named.stats.$n.cachedb > /dev/null || ret=1
   1289 grep "1 #Others" ns4/named.stats.$n.cachedb > /dev/null || ret=1
   1290 grep "1 #!TXT" ns4/named.stats.$n.cachedb > /dev/null || ret=1
   1291 grep "1 #NXDOMAIN" ns4/named.stats.$n.cachedb > /dev/null || ret=1
   1292 status=$((status+ret))
   1293 if [ $ret != 0 ]; then echo_i "failed"; fi
   1294 
   1295 # Dump the cache.
   1296 n=$((n+1))
   1297 echo_i "dump the cache (serve-stale answers disabled) ($n)"
   1298 ret=0
   1299 rndc_dumpdb ns4 -cache || ret=1
   1300 if [ $ret != 0 ]; then echo_i "failed"; fi
   1301 status=$((status+ret))
   1302 
   1303 echo_i "stop ns4"
   1304 $PERL $SYSTEMTESTTOP/stop.pl --use-rndc --port ${CONTROLPORT} serve-stale ns4
   1305 
   1306 # Load the cache as if it was five minutes (RBTDB_VIRTUAL) older. Since
   1307 # max-stale-ttl defaults to a week, we need to adjust the date by one week and
   1308 # five minutes.
   1309 LASTWEEK=`TZ=UTC perl -e 'my $now = time();
   1310         my $oneWeekAgo = $now - 604800;
   1311         my $fiveMinutesAgo = $oneWeekAgo - 300;
   1312         my ($s, $m, $h, $d, $mo, $y) = (localtime($fiveMinutesAgo))[0, 1, 2, 3, 4, 5];
   1313         printf("%04d%02d%02d%02d%02d%02d", $y+1900, $mo+1, $d, $h, $m, $s);'`
   1314 
   1315 echo_i "mock the cache date to $LASTWEEK (serve-stale answers disabled) ($n)"
   1316 ret=0
   1317 sed -E "s/DATE [0-9]{14}/DATE $LASTWEEK/g" ns4/named_dump.db.test$n > ns4/named_dump.db.out || ret=1
   1318 cp ns4/named_dump.db.out ns4/named_dump.db
   1319 if [ $ret != 0 ]; then echo_i "failed"; fi
   1320 status=$((status+ret))
   1321 
   1322 echo_i "start ns4"
   1323 $PERL $SYSTEMTESTTOP/start.pl --noclean --restart --port ${PORT} serve-stale ns4
   1324 
   1325 n=$((n+1))
   1326 echo_i "verify ancient cache statistics (serve-stale answers disabled) ($n)"
   1327 ret=0
   1328 rm -f ns4/named.stats
   1329 $RNDCCMD 10.53.0.4 stats #> /dev/null 2>&1
   1330 [ -f ns4/named.stats ] || ret=1
   1331 cp ns4/named.stats ns4/named.stats.$n
   1332 # Check first 10 lines of Cache DB statistics. After last queries, we expect
   1333 # everything to be removed or scheduled to be removed.
   1334 grep -A 10 "++ Cache DB RRsets ++" ns4/named.stats.$n > ns4/named.stats.$n.cachedb || ret=1
   1335 grep "#TXT" ns4/named.stats.$n.cachedb > /dev/null && ret=1
   1336 grep "#Others" ns4/named.stats.$n.cachedb > /dev/null && ret=1
   1337 grep "#!TXT" ns4/named.stats.$n.cachedb > /dev/null && ret=1
   1338 grep "#NXDOMAIN" ns4/named.stats.$n.cachedb > /dev/null && ret=1
   1339 status=$((status+ret))
   1340 if [ $ret != 0 ]; then echo_i "failed"; fi
   1341 
   1342 #
   1343 # Test the server with stale-cache disabled.
   1344 #
   1345 echo_i "test server with serve-stale cache disabled"
   1346 
   1347 n=$((n+1))
   1348 echo_i "enable responses from authoritative server ($n)"
   1349 ret=0
   1350 $DIG -p ${PORT} @10.53.0.2 txt enable  > dig.out.test$n
   1351 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1352 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
   1353 if [ $ret != 0 ]; then echo_i "failed"; fi
   1354 status=$((status+ret))
   1355 
   1356 n=$((n+1))
   1357 echo_i "prime cache longttl.example (serve-stale cache disabled) ($n)"
   1358 ret=0
   1359 $DIG -p ${PORT} @10.53.0.5 longttl.example TXT > dig.out.test$n
   1360 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   1361 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1362 if [ $ret != 0 ]; then echo_i "failed"; fi
   1363 status=$((status+ret))
   1364 
   1365 n=$((n+1))
   1366 echo_i "prime cache data.example (serve-stale cache disabled) ($n)"
   1367 ret=0
   1368 $DIG -p ${PORT} @10.53.0.5 data.example TXT > dig.out.test$n
   1369 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   1370 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1371 grep "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
   1372 if [ $ret != 0 ]; then echo_i "failed"; fi
   1373 status=$((status+ret))
   1374 
   1375 n=$((n+1))
   1376 echo_i "prime cache othertype.example (serve-stale cache disabled) ($n)"
   1377 ret=0
   1378 $DIG -p ${PORT} @10.53.0.5 othertype.example CAA > dig.out.test$n
   1379 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   1380 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1381 grep "othertype\.example\..*2.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1
   1382 if [ $ret != 0 ]; then echo_i "failed"; fi
   1383 status=$((status+ret))
   1384 
   1385 n=$((n+1))
   1386 echo_i "prime cache nodata.example (serve-stale cache disabled) ($n)"
   1387 ret=0
   1388 $DIG -p ${PORT} @10.53.0.5 nodata.example TXT > dig.out.test$n
   1389 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   1390 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
   1391 grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
   1392 if [ $ret != 0 ]; then echo_i "failed"; fi
   1393 status=$((status+ret))
   1394 
   1395 n=$((n+1))
   1396 echo_i "prime cache nxdomain.example (serve-stale cache disabled) ($n)"
   1397 ret=0
   1398 $DIG -p ${PORT} @10.53.0.5 nxdomain.example TXT > dig.out.test$n
   1399 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
   1400 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
   1401 grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
   1402 if [ $ret != 0 ]; then echo_i "failed"; fi
   1403 status=$((status+ret))
   1404 
   1405 n=$((n+1))
   1406 echo_i "verify prime cache statistics (serve-stale cache disabled) ($n)"
   1407 ret=0
   1408 rm -f ns5/named.stats
   1409 $RNDCCMD 10.53.0.5 stats > /dev/null 2>&1
   1410 [ -f ns5/named.stats ] || ret=1
   1411 cp ns5/named.stats ns5/named.stats.$n
   1412 # Check first 10 lines of Cache DB statistics.  After serve-stale queries,
   1413 # we expect two active TXT RRsets, one active Others, one nxrrset TXT, and
   1414 # one NXDOMAIN.
   1415 grep -A 10 "++ Cache DB RRsets ++" ns5/named.stats.$n > ns5/named.stats.$n.cachedb || ret=1
   1416 grep "2 TXT" ns5/named.stats.$n.cachedb > /dev/null || ret=1
   1417 grep "1 Others" ns5/named.stats.$n.cachedb > /dev/null || ret=1
   1418 grep "1 !TXT" ns5/named.stats.$n.cachedb > /dev/null || ret=1
   1419 grep "1 NXDOMAIN" ns5/named.stats.$n.cachedb > /dev/null || ret=1
   1420 status=$((status+ret))
   1421 if [ $ret != 0 ]; then echo_i "failed"; fi
   1422 
   1423 n=$((n+1))
   1424 echo_i "disable responses from authoritative server ($n)"
   1425 ret=0
   1426 $DIG -p ${PORT} @10.53.0.2 txt disable  > dig.out.test$n
   1427 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1428 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
   1429 if [ $ret != 0 ]; then echo_i "failed"; fi
   1430 status=$((status+ret))
   1431 
   1432 n=$((n+1))
   1433 echo_i "check 'rndc serve-stale status' ($n)"
   1434 ret=0
   1435 $RNDCCMD 10.53.0.5 serve-stale status > rndc.out.test$n 2>&1 || ret=1
   1436 grep "_default: off (not-cached)" rndc.out.test$n > /dev/null || ret=1
   1437 if [ $ret != 0 ]; then echo_i "failed"; fi
   1438 status=$((status+ret))
   1439 
   1440 sleep 2
   1441 
   1442 echo_i "sending queries for tests $((n+1))-$((n+4))..."
   1443 $DIG -p ${PORT} @10.53.0.5 data.example TXT > dig.out.test$((n+1)) &
   1444 $DIG -p ${PORT} @10.53.0.5 othertype.example CAA > dig.out.test$((n+2)) &
   1445 $DIG -p ${PORT} @10.53.0.5 nodata.example TXT > dig.out.test$((n+3)) &
   1446 $DIG -p ${PORT} @10.53.0.5 nxdomain.example TXT > dig.out.test$((n+4))
   1447 
   1448 wait
   1449 
   1450 n=$((n+1))
   1451 echo_i "check fail of data.example (serve-stale cache disabled) ($n)"
   1452 ret=0
   1453 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
   1454 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
   1455 if [ $ret != 0 ]; then echo_i "failed"; fi
   1456 status=$((status+ret))
   1457 
   1458 n=$((n+1))
   1459 echo_i "check fail of othertype.example (serve-stale cache disabled) ($n)"
   1460 ret=0
   1461 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
   1462 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
   1463 if [ $ret != 0 ]; then echo_i "failed"; fi
   1464 status=$((status+ret))
   1465 
   1466 n=$((n+1))
   1467 echo_i "check fail of nodata.example (serve-stale cache disabled) ($n)"
   1468 ret=0
   1469 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
   1470 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
   1471 if [ $ret != 0 ]; then echo_i "failed"; fi
   1472 status=$((status+ret))
   1473 
   1474 n=$((n+1))
   1475 echo_i "check fail of nxdomain.example (serve-stale cache disabled) ($n)"
   1476 ret=0
   1477 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
   1478 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
   1479 if [ $ret != 0 ]; then echo_i "failed"; fi
   1480 status=$((status+ret))
   1481 
   1482 n=$((n+1))
   1483 echo_i "verify stale cache statistics (serve-stale cache disabled) ($n)"
   1484 ret=0
   1485 rm -f ns5/named.stats
   1486 $RNDCCMD 10.53.0.5 stats > /dev/null 2>&1
   1487 [ -f ns5/named.stats ] || ret=1
   1488 cp ns5/named.stats ns5/named.stats.$n
   1489 # Check first 10 lines of Cache DB statistics.  After serve-stale queries,
   1490 # we expect one active TXT (longttl) and the rest to be expired from cache,
   1491 # but since we keep everything for 5 minutes (RBTDB_VIRTUAL) in the cache
   1492 # after expiry, they still show up in the stats.
   1493 grep -A 10 "++ Cache DB RRsets ++" ns5/named.stats.$n > ns5/named.stats.$n.cachedb || ret=1
   1494 grep -F "1 Others" ns5/named.stats.$n.cachedb > /dev/null || ret=1
   1495 grep -F "2 TXT" ns5/named.stats.$n.cachedb > /dev/null || ret=1
   1496 grep -F "1 !TXT" ns5/named.stats.$n.cachedb > /dev/null || ret=1
   1497 grep -F "1 NXDOMAIN" ns5/named.stats.$n.cachedb > /dev/null || ret=1
   1498 status=$((status+ret))
   1499 if [ $ret != 0 ]; then echo_i "failed"; fi
   1500 
   1501 # Dump the cache.
   1502 n=$((n+1))
   1503 echo_i "dump the cache (serve-stale cache disabled) ($n)"
   1504 ret=0
   1505 rndc_dumpdb ns5 || ret=1
   1506 if [ $ret != 0 ]; then echo_i "failed"; fi
   1507 status=$((status+ret))
   1508 # Check that expired records are not dumped.
   1509 ret=0
   1510 grep "; expired since .* (awaiting cleanup)" ns5/named_dump.db.test$n && ret=1
   1511 if [ $ret != 0 ]; then echo_i "failed"; fi
   1512 status=$((status+ret))
   1513 
   1514 # Dump the cache including expired entries.
   1515 n=$((n+1))
   1516 echo_i "dump the cache including expired entries (serve-stale cache disabled) ($n)"
   1517 ret=0
   1518 rndc_dumpdb ns5 -expired || ret=1
   1519 if [ $ret != 0 ]; then echo_i "failed"; fi
   1520 status=$((status+ret))
   1521 
   1522 # Check that expired records are dumped.
   1523 echo_i "check rndc dump expired data.example ($n)"
   1524 ret=0
   1525 awk '/; expired/ { x=$0; getline; print x, $0}' ns5/named_dump.db.test$n |
   1526     grep "; expired since .* (awaiting cleanup) data\.example\..*A text record with a 2 second ttl" > /dev/null 2>&1 || ret=1
   1527 awk '/; expired/ { x=$0; getline; print x, $0}' ns5/named_dump.db.test$n |
   1528     grep "; expired since .* (awaiting cleanup) nodata\.example\." > /dev/null 2>&1 || ret=1
   1529 awk '/; expired/ { x=$0; getline; print x, $0}' ns5/named_dump.db.test$n |
   1530     grep "; expired since .* (awaiting cleanup) nxdomain\.example\." > /dev/null 2>&1 || ret=1
   1531 awk '/; expired/ { x=$0; getline; print x, $0}' ns5/named_dump.db.test$n |
   1532     grep "; expired since .* (awaiting cleanup) othertype\.example\." > /dev/null 2>&1 || ret=1
   1533 # Also make sure the not expired data does not have an expired comment.
   1534 awk '/; answer/ { x=$0; getline; print x, $0}' ns5/named_dump.db.test$n |
   1535     grep "; answer longttl\.example.*A text record with a 600 second ttl" > /dev/null 2>&1 || ret=1
   1536 if [ $ret != 0 ]; then echo_i "failed"; fi
   1537 status=$((status+ret))
   1538 
   1539 echo_i "stop ns5"
   1540 $PERL ../stop.pl --use-rndc --port ${CONTROLPORT} serve-stale ns5
   1541 
   1542 # Load the cache as if it was five minutes (RBTDB_VIRTUAL) older.
   1543 cp ns5/named_dump.db.test$n ns5/named_dump.db
   1544 FIVEMINUTESAGO=`TZ=UTC perl -e 'my $now = time();
   1545         my $fiveMinutesAgo = 300;
   1546         my ($s, $m, $h, $d, $mo, $y) = (localtime($fiveMinutesAgo))[0, 1, 2, 3, 4, 5];
   1547         printf("%04d%02d%02d%02d%02d%02d", $y+1900, $mo+1, $d, $h, $m, $s);'`
   1548 
   1549 n=$((n+1))
   1550 echo_i "mock the cache date to $FIVEMINUTESAGO (serve-stale cache disabled) ($n)"
   1551 ret=0
   1552 sed -E "s/DATE [0-9]{14}/DATE $FIVEMINUTESAGO/g" ns5/named_dump.db > ns5/named_dump.db.out || ret=1
   1553 cp ns5/named_dump.db.out ns5/named_dump.db
   1554 if [ $ret != 0 ]; then echo_i "failed"; fi
   1555 status=$((status+ret))
   1556 
   1557 echo_i "start ns5"
   1558 start_server --noclean --restart --port ${PORT} serve-stale ns5
   1559 
   1560 n=$((n+1))
   1561 echo_i "verify ancient cache statistics (serve-stale cache disabled) ($n)"
   1562 ret=0
   1563 rm -f ns5/named.stats
   1564 $RNDCCMD 10.53.0.5 stats #> /dev/null 2>&1
   1565 [ -f ns5/named.stats ] || ret=1
   1566 cp ns5/named.stats ns5/named.stats.$n
   1567 # Check first 10 lines of Cache DB statistics. After last queries, we expect
   1568 # everything to be removed or scheduled to be removed.
   1569 grep -A 10 "++ Cache DB RRsets ++" ns5/named.stats.$n > ns5/named.stats.$n.cachedb || ret=1
   1570 grep -F "#TXT" ns5/named.stats.$n.cachedb > /dev/null && ret=1
   1571 grep -F "#Others" ns5/named.stats.$n.cachedb > /dev/null && ret=1
   1572 grep -F "#!TXT" ns5/named.stats.$n.cachedb > /dev/null && ret=1
   1573 grep -F "#NXDOMAIN" ns5/named.stats.$n.cachedb > /dev/null && ret=1
   1574 status=$((status+ret))
   1575 if [ $ret != 0 ]; then echo_i "failed"; fi
   1576 
   1577 ################################################
   1578 # Test for stale-answer-client-timeout (1.8s). #
   1579 ################################################
   1580 echo_i "test stale-answer-client-timeout (1.8)"
   1581 
   1582 n=$((n+1))
   1583 echo_i "updating ns3/named.conf ($n)"
   1584 ret=0
   1585 copy_setports ns3/named2.conf.in ns3/named.conf
   1586 if [ $ret != 0 ]; then echo_i "failed"; fi
   1587 status=$((status+ret))
   1588 
   1589 echo_i "restart ns3"
   1590 $PERL ../stop.pl --use-rndc --port ${CONTROLPORT} serve-stale ns3
   1591 start_server --noclean --restart --port ${PORT} serve-stale ns3
   1592 
   1593 n=$((n+1))
   1594 echo_i "check 'rndc serve-stale status' ($n)"
   1595 ret=0
   1596 $RNDCCMD 10.53.0.3 serve-stale status > rndc.out.test$n 2>&1 || ret=1
   1597 grep '_default: on (stale-answer-ttl=3 max-stale-ttl=3600 stale-refresh-time=0)' rndc.out.test$n > /dev/null || ret=1
   1598 if [ $ret != 0 ]; then echo_i "failed"; fi
   1599 status=$((status+ret))
   1600 
   1601 n=$((n+1))
   1602 echo_i "enable responses from authoritative server ($n)"
   1603 ret=0
   1604 $DIG -p ${PORT} @10.53.0.2 txt enable  > dig.out.test$n
   1605 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1606 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
   1607 if [ $ret != 0 ]; then echo_i "failed"; fi
   1608 status=$((status+ret))
   1609 
   1610 n=$((n+1))
   1611 echo_i "prime cache data.example (stale-answer-client-timeout)"
   1612 ret=0
   1613 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
   1614 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   1615 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1616 if [ $ret != 0 ]; then echo_i "failed"; fi
   1617 status=$((status+ret))
   1618 
   1619 n=$((n+1))
   1620 echo_i "prime cache nodata.example (stale-answer-client-timeout)"
   1621 ret=0
   1622 $DIG -p ${PORT} @10.53.0.3 nodata.example TXT > dig.out.test$n
   1623 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   1624 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
   1625 if [ $ret != 0 ]; then echo_i "failed"; fi
   1626 status=$((status+ret))
   1627 
   1628 n=$((n+1))
   1629 echo_i "disable responses from authoritative server ($n)"
   1630 ret=0
   1631 $DIG -p ${PORT} @10.53.0.2 txt disable  > dig.out.test$n
   1632 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1633 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
   1634 if [ $ret != 0 ]; then echo_i "failed"; fi
   1635 status=$((status+ret))
   1636 
   1637 # Allow RRset to become stale.
   1638 sleep 2
   1639 
   1640 echo_i "sending queries for tests $((n+1))-$((n+2))..."
   1641 $DIG -p ${PORT} +tries=1 +timeout=10  @10.53.0.3 data.example TXT > dig.out.test$((n+1)) &
   1642 $DIG -p ${PORT} +tries=1 +timeout=10  @10.53.0.3 nodata.example TXT > dig.out.test$((n+2))
   1643 wait
   1644 
   1645 # We configured a long value of 30 seconds for resolver-query-timeout.
   1646 # That should give us enough time to receive an stale answer from cache
   1647 # after stale-answer-client-timeout timer of 1.8 sec triggers.
   1648 n=$((n+1))
   1649 echo_i "check stale data.example comes from cache (default stale-answer-client-timeout) ($n)"
   1650 nextpart ns3/named.run > /dev/null
   1651 t1=`$PERL -e 'print time()'`
   1652 t2=`$PERL -e 'print time()'`
   1653 wait_for_log 5 "data.example client timeout, stale answer used" ns3/named.run || ret=1
   1654 ret=0
   1655 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   1656 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1657 grep "data\.example\..*3.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
   1658 # Default stale-answer-client-timeout is 1.8s, we allow some extra time
   1659 # just in case other tests are taking too much cpu.
   1660 [ $((t2 - t1)) -le 10 ] || { echo_i "query took $((t2 - t1))s to resolve.";  ret=1; }
   1661 if [ $ret != 0 ]; then echo_i "failed"; fi
   1662 status=$((status+ret))
   1663 
   1664 n=$((n+1))
   1665 echo_i "check stale nodata.example comes from cache (default stale-answer-client-timeout) ($n)"
   1666 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   1667 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
   1668 grep "example\..*3.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
   1669 if [ $ret != 0 ]; then echo_i "failed"; fi
   1670 status=$((status+ret))
   1671 
   1672 #############################################
   1673 # Test for stale-answer-client-timeout off. #
   1674 #############################################
   1675 echo_i "test stale-answer-client-timeout (off)"
   1676 
   1677 n=$((n+1))
   1678 echo_i "updating ns3/named.conf ($n)"
   1679 ret=0
   1680 copy_setports ns3/named3.conf.in ns3/named.conf
   1681 if [ $ret != 0 ]; then echo_i "failed"; fi
   1682 status=$((status+ret))
   1683 
   1684 n=$((n+1))
   1685 echo_i "running 'rndc reload' ($n)"
   1686 ret=0
   1687 rndc_reload ns3 10.53.0.3
   1688 if [ $ret != 0 ]; then echo_i "failed"; fi
   1689 status=$((status+ret))
   1690 
   1691 # Send a query, auth server is disabled, we will enable it after a while in
   1692 # order to receive an answer before resolver-query-timeout expires. Since
   1693 # stale-answer-client-timeout is disabled we must receive an answer from
   1694 # authoritative server.
   1695 echo_i "sending query for test $((n+2))"
   1696 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$((n+2)) &
   1697 sleep 3
   1698 
   1699 n=$((n+1))
   1700 echo_i "enable responses from authoritative server ($n)"
   1701 ret=0
   1702 $DIG -p ${PORT} @10.53.0.2 txt enable  > dig.out.test$n
   1703 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1704 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
   1705 if [ $ret != 0 ]; then echo_i "failed"; fi
   1706 status=$((status+ret))
   1707 
   1708 # Wait until dig is done.
   1709 wait
   1710 
   1711 n=$((n+1))
   1712 echo_i "check data.example comes from authoritative server (stale-answer-client-timeout off) ($n)"
   1713 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   1714 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1715 grep "data\.example\..*[12].*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
   1716 if [ $ret != 0 ]; then echo_i "failed"; fi
   1717 status=$((status+ret))
   1718 
   1719 #############################################
   1720 # Test for stale-answer-client-timeout 0.   #
   1721 #############################################
   1722 echo_i "test stale-answer-client-timeout (0)"
   1723 
   1724 n=$((n+1))
   1725 echo_i "updating ns3/named.conf ($n)"
   1726 ret=0
   1727 copy_setports ns3/named4.conf.in ns3/named.conf
   1728 if [ $ret != 0 ]; then echo_i "failed"; fi
   1729 status=$((status+ret))
   1730 
   1731 echo_i "restart ns3"
   1732 $PERL ../stop.pl --use-rndc --port ${CONTROLPORT} serve-stale ns3
   1733 start_server --noclean --restart --port ${PORT} serve-stale ns3
   1734 
   1735 n=$((n+1))
   1736 echo_i "prime cache data.example (stale-answer-client-timeout 0)"
   1737 ret=0
   1738 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
   1739 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   1740 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1741 if [ $ret != 0 ]; then echo_i "failed"; fi
   1742 status=$((status+ret))
   1743 
   1744 n=$((n+1))
   1745 echo_i "prime cache nodata.example (stale-answer-client-timeout 0)"
   1746 ret=0
   1747 $DIG -p ${PORT} @10.53.0.3 nodata.example TXT > dig.out.test$n
   1748 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   1749 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
   1750 if [ $ret != 0 ]; then echo_i "failed"; fi
   1751 status=$((status+ret))
   1752 
   1753 n=$((n+1))
   1754 echo_i "disable responses from authoritative server ($n)"
   1755 ret=0
   1756 $DIG -p ${PORT} @10.53.0.2 txt disable  > dig.out.test$n
   1757 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1758 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
   1759 if [ $ret != 0 ]; then echo_i "failed"; fi
   1760 status=$((status+ret))
   1761 
   1762 # Allow RRset to become stale.
   1763 sleep 2
   1764 
   1765 n=$((n+1))
   1766 ret=0
   1767 echo_i "check stale nodata.example comes from cache (stale-answer-client-timeout 0) ($n)"
   1768 nextpart ns3/named.run > /dev/null
   1769 $DIG -p ${PORT} @10.53.0.3 nodata.example TXT > dig.out.test$n
   1770 wait_for_log 5 "nodata.example stale answer used, an attempt to refresh the RRset" ns3/named.run || ret=1
   1771 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   1772 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
   1773 grep "example\..*3.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
   1774 if [ $ret != 0 ]; then echo_i "failed"; fi
   1775 status=$((status+ret))
   1776 
   1777 n=$((n+1))
   1778 ret=0
   1779 echo_i "check stale data.example comes from cache (stale-answer-client-timeout 0) ($n)"
   1780 nextpart ns3/named.run > /dev/null
   1781 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
   1782 wait_for_log 5 "data.example stale answer used, an attempt to refresh the RRset" ns3/named.run || ret=1
   1783 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   1784 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1785 grep "data\.example\..*3.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
   1786 if [ $ret != 0 ]; then echo_i "failed"; fi
   1787 status=$((status+ret))
   1788 
   1789 n=$((n+1))
   1790 echo_i "enable responses from authoritative server ($n)"
   1791 ret=0
   1792 $DIG -p ${PORT} @10.53.0.2 txt enable  > dig.out.test$n
   1793 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1794 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
   1795 if [ $ret != 0 ]; then echo_i "failed"; fi
   1796 status=$((status+ret))
   1797 
   1798 wait_for_rrset_refresh() {
   1799 	nextpart ns3/named.run | grep 'data.example.*2.*TXT.*"A text record with a 2 second ttl"' > /dev/null && return 0
   1800 	return 1
   1801 }
   1802 
   1803 # This test ensures that after we get stale data due to
   1804 # stale-answer-client-timeout 0, enabling the authoritative server will allow
   1805 # the RRset to be updated.
   1806 n=$((n+1))
   1807 ret=0
   1808 echo_i "check stale data.example was refreshed (stale-answer-client-timeout 0) ($n)"
   1809 retry_quiet 10 wait_for_rrset_refresh || ret=1
   1810 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
   1811 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   1812 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1813 grep "data\.example\..*[12].*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
   1814 if [ $ret != 0 ]; then echo_i "failed"; fi
   1815 status=$((status+ret))
   1816 
   1817 wait_for_nodata_refresh() {
   1818 	$DIG -p ${PORT} @10.53.0.3 nodata.example TXT > dig.out.test$n
   1819 	grep "status: NOERROR" dig.out.test$n > /dev/null || return 1
   1820 	grep "ANSWER: 0," dig.out.test$n > /dev/null || return 1
   1821 	grep "example\..*[12].*IN.*SOA" dig.out.test$n > /dev/null || return 1
   1822 	return 0
   1823 }
   1824 
   1825 n=$((n+1))
   1826 ret=0
   1827 echo_i "check stale nodata.example was refreshed (stale-answer-client-timeout 0) ($n)"
   1828 retry_quiet 10 wait_for_nodata_refresh || ret=1
   1829 if [ $ret != 0 ]; then echo_i "failed"; fi
   1830 status=$((status+ret))
   1831 
   1832 ####################################################################
   1833 # Test for stale-answer-client-timeout 0 and stale-refresh-time 4. #
   1834 ####################################################################
   1835 echo_i "test stale-answer-client-timeout (0) and stale-refresh-time (4)"
   1836 
   1837 n=$((n+1))
   1838 echo_i "updating ns3/named.conf ($n)"
   1839 ret=0
   1840 copy_setports ns3/named5.conf.in ns3/named.conf
   1841 if [ $ret != 0 ]; then echo_i "failed"; fi
   1842 status=$((status+ret))
   1843 
   1844 n=$((n+1))
   1845 echo_i "running 'rndc reload' ($n)"
   1846 ret=0
   1847 rndc_reload ns3 10.53.0.3
   1848 if [ $ret != 0 ]; then echo_i "failed"; fi
   1849 status=$((status+ret))
   1850 
   1851 n=$((n+1))
   1852 echo_i "flush cache, enable responses from authoritative server ($n)"
   1853 ret=0
   1854 $RNDCCMD 10.53.0.3 flushtree example > rndc.out.test$n.1 2>&1 || ret=1
   1855 $DIG -p ${PORT} @10.53.0.2 txt enable  > dig.out.test$n
   1856 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1857 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
   1858 if [ $ret != 0 ]; then echo_i "failed"; fi
   1859 status=$((status+ret))
   1860 
   1861 n=$((n+1))
   1862 echo_i "prime cache data.example (stale-answer-client-timeout 0, stale-refresh-time 4) ($n)"
   1863 ret=0
   1864 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
   1865 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   1866 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1867 grep "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
   1868 if [ $ret != 0 ]; then echo_i "failed"; fi
   1869 status=$((status+ret))
   1870 
   1871 # Allow RRset to become stale.
   1872 sleep 2
   1873 
   1874 n=$((n+1))
   1875 echo_i "disable responses from authoritative server ($n)"
   1876 ret=0
   1877 $DIG -p ${PORT} @10.53.0.2 txt disable  > dig.out.test$n
   1878 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1879 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
   1880 if [ $ret != 0 ]; then echo_i "failed"; fi
   1881 status=$((status+ret))
   1882 
   1883 n=$((n+1))
   1884 ret=0
   1885 echo_i "check stale data.example comes from cache (stale-answer-client-timeout 0 stale-refresh-time 4) ($n)"
   1886 nextpart ns3/named.run > /dev/null
   1887 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
   1888 wait_for_log 5 "data.example stale answer used, an attempt to refresh the RRset" ns3/named.run || ret=1
   1889 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   1890 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1891 grep "data\.example\..*3.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
   1892 if [ $ret != 0 ]; then echo_i "failed"; fi
   1893 status=$((status+ret))
   1894 
   1895 n=$((n+1))
   1896 echo_i "enable responses from authoritative server ($n)"
   1897 ret=0
   1898 $DIG -p ${PORT} @10.53.0.2 txt enable  > dig.out.test$n
   1899 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1900 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
   1901 if [ $ret != 0 ]; then echo_i "failed"; fi
   1902 status=$((status+ret))
   1903 
   1904 # This test ensures that after we get stale data due to
   1905 # stale-answer-client-timeout 0, enabling the authoritative server will allow
   1906 # the RRset to be updated.
   1907 n=$((n+1))
   1908 ret=0
   1909 echo_i "check stale data.example was refreshed (stale-answer-client-timeout 0 stale-refresh-time 4) ($n)"
   1910 retry_quiet 10 wait_for_rrset_refresh || ret=1
   1911 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
   1912 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   1913 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1914 grep "data\.example\..*[12].*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
   1915 if [ $ret != 0 ]; then echo_i "failed"; fi
   1916 status=$((status+ret))
   1917 
   1918 # Allow RRset to become stale.
   1919 sleep 2
   1920 
   1921 n=$((n+1))
   1922 echo_i "disable responses from authoritative server ($n)"
   1923 ret=0
   1924 $DIG -p ${PORT} @10.53.0.2 txt disable  > dig.out.test$n
   1925 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1926 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
   1927 if [ $ret != 0 ]; then echo_i "failed"; fi
   1928 status=$((status+ret))
   1929 
   1930 n=$((n+1))
   1931 ret=0
   1932 echo_i "check stale data.example comes from cache (stale-answer-client-timeout 0 stale-refresh-time 4) ($n)"
   1933 nextpart ns3/named.run > /dev/null
   1934 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
   1935 wait_for_log 5 "data.example stale answer used, an attempt to refresh the RRset" ns3/named.run || ret=1
   1936 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   1937 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1938 grep "data\.example\..*3.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
   1939 if [ $ret != 0 ]; then echo_i "failed"; fi
   1940 status=$((status+ret))
   1941 
   1942 # Allow stale-refresh-time to be activated.
   1943 n=$((n+1))
   1944 ret=0
   1945 echo_i "wait until resolver query times out, activating stale-refresh-time"
   1946 wait_for_log 15 "data.example resolver failure, stale answer used" ns3/named.run || ret=1
   1947 if [ $ret != 0 ]; then echo_i "failed"; fi
   1948 status=$((status+ret))
   1949 
   1950 n=$((n+1))
   1951 ret=0
   1952 echo_i "check stale data.example comes from cache within stale-refresh-time (stale-answer-client-timeout 0 stale-refresh-time 4) ($n)"
   1953 nextpart ns3/named.run > /dev/null
   1954 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
   1955 wait_for_log 5 "data.example query within stale refresh time" ns3/named.run || ret=1
   1956 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   1957 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1958 grep "data\.example\..*3.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
   1959 if [ $ret != 0 ]; then echo_i "failed"; fi
   1960 status=$((status+ret))
   1961 
   1962 n=$((n+1))
   1963 echo_i "enable responses from authoritative server ($n)"
   1964 ret=0
   1965 $DIG -p ${PORT} @10.53.0.2 txt enable  > dig.out.test$n
   1966 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1967 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
   1968 if [ $ret != 0 ]; then echo_i "failed"; fi
   1969 status=$((status+ret))
   1970 
   1971 # We give BIND some time to ensure that after we enable authoritative server,
   1972 # this RRset is still not refreshed because it was hit during
   1973 # stale-refresh-time window.
   1974 sleep 1
   1975 
   1976 n=$((n+1))
   1977 ret=0
   1978 echo_i "check stale data.example was not refreshed (stale-answer-client-timeout 0 stale-refresh-time 4) ($n)"
   1979 nextpart ns3/named.run > /dev/null
   1980 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
   1981 wait_for_log 5 "data.example query within stale refresh time" ns3/named.run || ret=1
   1982 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   1983 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1984 grep "data\.example\..*3.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
   1985 if [ $ret != 0 ]; then echo_i "failed"; fi
   1986 status=$((status+ret))
   1987 
   1988 # After the refresh-time-window, the RRset will be refreshed.
   1989 sleep 4
   1990 
   1991 n=$((n+1))
   1992 ret=0
   1993 echo_i "check stale data.example comes from cache (stale-answer-client-timeout 0 stale-refresh-time 4) ($n)"
   1994 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
   1995 wait_for_log 5 "data.example stale answer used, an attempt to refresh the RRset" ns3/named.run || ret=1
   1996 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   1997 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   1998 grep "data\.example\..*3.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
   1999 if [ $ret != 0 ]; then echo_i "failed"; fi
   2000 status=$((status+ret))
   2001 
   2002 n=$((n+1))
   2003 ret=0
   2004 echo_i "check stale data.example was refreshed (stale-answer-client-timeout 0 stale-refresh-time 4) ($n)"
   2005 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
   2006 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   2007 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   2008 grep "data\.example\..*[12].*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
   2009 if [ $ret != 0 ]; then echo_i "failed"; fi
   2010 status=$((status+ret))
   2011 
   2012 ####################################################################
   2013 # Test serve-stale's interaction with fetch limits (cache only) #
   2014 #################################################################
   2015 echo_i "test serve-stale's interaction with fetch-limits (cache only)"
   2016 
   2017 # We update the named configuration to enable fetch-limits. The fetch-limits
   2018 # are set to 1, which is ridiciously low, but that is because for this test we
   2019 # want to reach the fetch-limits.
   2020 n=$((n+1))
   2021 echo_i "updating ns3/named.conf ($n)"
   2022 ret=0
   2023 copy_setports ns3/named6.conf.in ns3/named.conf
   2024 if [ $ret != 0 ]; then echo_i "failed"; fi
   2025 status=$((status+ret))
   2026 
   2027 n=$((n+1))
   2028 echo_i "running 'rndc reload' ($n)"
   2029 ret=0
   2030 rndc_reload ns3 10.53.0.3
   2031 if [ $ret != 0 ]; then echo_i "failed"; fi
   2032 status=$((status+ret))
   2033 
   2034 # Disable responses from authoritative server. If we can't resolve the example
   2035 # zone, fetch limits will be reached.
   2036 n=$((n+1))
   2037 echo_i "disable responses from authoritative server ($n)"
   2038 ret=0
   2039 $DIG -p ${PORT} @10.53.0.2 txt disable  > dig.out.test$n
   2040 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   2041 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
   2042 if [ $ret != 0 ]; then echo_i "failed"; fi
   2043 status=$((status+ret))
   2044 
   2045 # Allow RRset to become stale.
   2046 sleep 2
   2047 
   2048 # Turn on serve-stale.
   2049 n=$((n+1))
   2050 echo_i "running 'rndc serve-stale on' ($n)"
   2051 ret=0
   2052 $RNDCCMD 10.53.0.3 serve-stale on || ret=1
   2053 if [ $ret != 0 ]; then echo_i "failed"; fi
   2054 status=$((status+ret))
   2055 
   2056 n=$((n+1))
   2057 echo_i "check 'rndc serve-stale status' ($n)"
   2058 ret=0
   2059 $RNDCCMD 10.53.0.3 serve-stale status > rndc.out.test$n 2>&1 || ret=1
   2060 grep '_default: on (rndc) (stale-answer-ttl=3 max-stale-ttl=3600 stale-refresh-time=4)' rndc.out.test$n > /dev/null || ret=1
   2061 if [ $ret != 0 ]; then echo_i "failed"; fi
   2062 status=$((status+ret))
   2063 
   2064 # Hit the fetch-limits. We burst the name server with a small batch of queries.
   2065 # Only 2 queries are required to hit the fetch-limits. The first query will
   2066 # start to resolve, the second one hit the fetch-limits.
   2067 burst() {
   2068 	num=${1}
   2069 	rm -f burst.input.$$
   2070 	while [ $num -gt 0 ]; do
   2071 		num=`expr $num - 1`
   2072 		echo "fetch${num}.example A" >> burst.input.$$
   2073 	done
   2074 	$PERL ../ditch.pl -p ${PORT} -s 10.53.0.3 burst.input.$$
   2075 	rm -f burst.input.$$
   2076 }
   2077 
   2078 wait_for_fetchlimits() {
   2079 	burst 2
   2080 	# We expect a query for nx.example to fail because fetch-limits for
   2081 	# the domain 'example.' (and everything below) has been reached.
   2082 	$DIG -p ${PORT} +tries=1 +timeout=1 @10.53.0.3 nx.example > dig.out.test$n
   2083 	grep "status: SERVFAIL" dig.out.test$n > /dev/null || return 1
   2084 }
   2085 
   2086 n=$((n+1))
   2087 echo_i "hit fetch limits ($n)"
   2088 ret=0
   2089 retry_quiet 10 wait_for_fetchlimits || ret=1
   2090 if [ $ret != 0 ]; then echo_i "failed"; fi
   2091 status=$((status+ret))
   2092 
   2093 # Expect stale data now (because fetch-limits for the domain 'example.' (and
   2094 # everything below) has been reached. But we have a stale RRset for
   2095 # 'data.example/TXT' that can be used.
   2096 n=$((n+1))
   2097 ret=0
   2098 echo_i "check stale data.example comes from cache (fetch-limits) ($n)"
   2099 nextpart ns3/named.run > /dev/null
   2100 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
   2101 wait_for_log 5 "data.example resolver failure, stale answer used" ns3/named.run || ret=1
   2102 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   2103 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   2104 grep "data\.example\..*3.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
   2105 if [ $ret != 0 ]; then echo_i "failed"; fi
   2106 status=$((status+ret))
   2107 
   2108 # The previous query should not have started the stale-refresh-time window.
   2109 n=$((n+1))
   2110 ret=0
   2111 echo_i "check stale data.example comes from cache again (fetch-limits) ($n)"
   2112 nextpart ns3/named.run > /dev/null
   2113 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
   2114 wait_for_log 5 "data.example resolver failure, stale answer used" ns3/named.run || ret=1
   2115 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
   2116 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
   2117 grep "data\.example\..*3.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
   2118 if [ $ret != 0 ]; then echo_i "failed"; fi
   2119 status=$((status+ret))
   2120 
   2121 ########################################################################
   2122 # Test serve-stale's interaction with fetch limits (dual-mode) #
   2123 ########################################################################
   2124 echo_i "test serve-stale's interaction with fetch limits (dual-mode)"
   2125 
   2126 # Update named configuration so that ns3 becomes a recursive resolver which is
   2127 # also a secondary server for the root zone.
   2128 n=$((n+1))
   2129 echo_i "updating ns3/named.conf ($n)"
   2130 ret=0
   2131 copy_setports ns3/named7.conf.in ns3/named.conf
   2132 if [ $ret != 0 ]; then echo_i "failed"; fi
   2133 status=$((status+ret))
   2134 
   2135 n=$((n+1))
   2136 echo_i "running 'rndc reload' ($n)"
   2137 ret=0
   2138 rndc_reload ns3 10.53.0.3
   2139 if [ $ret != 0 ]; then echo_i "failed"; fi
   2140 status=$((status+ret))
   2141 
   2142 # Flush the cache to ensure the example/NS RRset cached during previous tests
   2143 # does not override the authoritative delegation found in the root zone.
   2144 n=$((n+1))
   2145 echo_i "flush cache ($n)"
   2146 ret=0
   2147 $RNDCCMD 10.53.0.3 flush > rndc.out.test$n 2>&1 || ret=1
   2148 if [ $ret != 0 ]; then echo_i "failed"; fi
   2149 status=$((status+ret))
   2150 
   2151 # Query name server with low fetch limits. The authoritative server (ans2) is
   2152 # not responding. Sending queries for multiple names in the 'example' zone
   2153 # in parallel causes the fetch limit for that zone (set to 1) to be
   2154 # reached. This should not trigger a crash.
   2155 echo_i "sending queries for tests $((n+1))-$((n+4))..."
   2156 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$((n+1)) &
   2157 $DIG -p ${PORT} @10.53.0.3 othertype.example CAA > dig.out.test$((n+2)) &
   2158 $DIG -p ${PORT} @10.53.0.3 nodata.example TXT > dig.out.test$((n+3)) &
   2159 $DIG -p ${PORT} @10.53.0.3 nxdomain.example TXT > dig.out.test$((n+4))
   2160 
   2161 wait
   2162 
   2163 # Expect SERVFAIL for the entries not in cache.
   2164 n=$((n+1))
   2165 echo_i "check stale data.example (fetch-limits dual-mode) ($n)"
   2166 ret=0
   2167 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
   2168 if [ $ret != 0 ]; then echo_i "failed"; fi
   2169 status=$((status+ret))
   2170 
   2171 n=$((n+1))
   2172 echo_i "check stale othertype.example (fetch-limits dual-mode) ($n)"
   2173 ret=0
   2174 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
   2175 if [ $ret != 0 ]; then echo_i "failed"; fi
   2176 status=$((status+ret))
   2177 
   2178 n=$((n+1))
   2179 echo_i "check stale nodata.example (fetch-limits dual-mode) ($n)"
   2180 ret=0
   2181 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
   2182 if [ $ret != 0 ]; then echo_i "failed"; fi
   2183 status=$((status+ret))
   2184 
   2185 n=$((n+1))
   2186 echo_i "check stale nxdomain.example (fetch-limits dual-mode) ($n)"
   2187 ret=0
   2188 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
   2189 if [ $ret != 0 ]; then echo_i "failed"; fi
   2190 status=$((status+ret))
   2191 
   2192 echo_i "exit status: $status"
   2193 [ $status -eq 0 ] || exit 1
   2194