Home | History | Annotate | Line # | Download | only in serve-stale
tests.sh revision 1.1.1.6
      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 http://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 $SYSTEMTESTTOP/common/rndc.conf -p ${CONTROLPORT} -s"
     16 
     17 # wait up to ten seconds to ensure that a file has been written
     18 waitfile () {
     19     for try in 0 1 2 3 4 5 6 7 8 9; do
     20         [ -s "$1" ] && break
     21         sleep 1
     22     done
     23 }
     24 
     25 status=0
     26 n=0
     27 
     28 #
     29 # First test server with serve-stale options set.
     30 #
     31 echo_i "test server with serve-stale options set"
     32 
     33 n=$((n+1))
     34 echo_i "prime cache longttl.example ($n)"
     35 ret=0
     36 $DIG -p ${PORT} @10.53.0.1 longttl.example TXT > dig.out.test$n
     37 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
     38 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
     39 if [ $ret != 0 ]; then echo_i "failed"; fi
     40 status=$((status+ret))
     41 
     42 n=$((n+1))
     43 echo_i "prime cache data.example ($n)"
     44 ret=0
     45 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n
     46 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
     47 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
     48 if [ $ret != 0 ]; then echo_i "failed"; fi
     49 status=$((status+ret))
     50 
     51 n=$((n+1))
     52 echo_i "prime cache othertype.example ($n)"
     53 ret=0
     54 $DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$n
     55 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
     56 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
     57 if [ $ret != 0 ]; then echo_i "failed"; fi
     58 status=$((status+ret))
     59 
     60 n=$((n+1))
     61 echo_i "prime cache nodata.example ($n)"
     62 ret=0
     63 $DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$n
     64 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
     65 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
     66 if [ $ret != 0 ]; then echo_i "failed"; fi
     67 status=$((status+ret))
     68 
     69 n=$((n+1))
     70 echo_i "prime cache nxdomain.example ($n)"
     71 ret=0
     72 $DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$n
     73 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
     74 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
     75 if [ $ret != 0 ]; then echo_i "failed"; fi
     76 status=$((status+ret))
     77 
     78 n=$((n+1))
     79 echo_i "verify prime cache statistics ($n)"
     80 ret=0
     81 rm -f ns1/named.stats
     82 $RNDCCMD 10.53.0.1 stats > /dev/null 2>&1
     83 [ -f ns1/named.stats ] || ret=1
     84 cp ns1/named.stats ns1/named.stats.$n
     85 # Check first 10 lines of Cache DB statistics.  After prime queries, we expect
     86 # two active TXT one nxrrset TXT, and one NXDOMAIN.
     87 grep -A 10 "++ Cache DB RRsets ++" ns1/named.stats.$n > ns1/named.stats.$n.cachedb || ret=1
     88 grep "1 Others" ns1/named.stats.$n.cachedb > /dev/null || ret=1
     89 grep "2 TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
     90 grep "1 !TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
     91 grep "1 NXDOMAIN" ns1/named.stats.$n.cachedb > /dev/null || ret=1
     92 if [ $ret != 0 ]; then echo_i "failed"; fi
     93 status=$((status+ret))
     94 
     95 n=$((n+1))
     96 echo_i "disable responses from authoritative server ($n)"
     97 ret=0
     98 $DIG -p ${PORT} @10.53.0.2 txt disable  > dig.out.test$n
     99 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    100 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
    101 if [ $ret != 0 ]; then echo_i "failed"; fi
    102 status=$((status+ret))
    103 
    104 n=$((n+1))
    105 echo_i "check 'rndc serve-stale status' ($n)"
    106 ret=0
    107 $RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
    108 grep '_default: on (stale-answer-ttl=2 max-stale-ttl=3600)' rndc.out.test$n > /dev/null || ret=1
    109 if [ $ret != 0 ]; then echo_i "failed"; fi
    110 status=$((status+ret))
    111 
    112 sleep 2
    113 
    114 echo_i "sending queries for tests $((n+1))-$((n+4))..."
    115 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
    116 $DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
    117 $DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
    118 $DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
    119 
    120 # ensure all files have been written before proceeding
    121 waitfile dig.out.test$((n+1))
    122 waitfile dig.out.test$((n+2))
    123 waitfile dig.out.test$((n+3))
    124 waitfile dig.out.test$((n+4))
    125 
    126 n=$((n+1))
    127 echo_i "check stale data.example ($n)"
    128 ret=0
    129 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    130 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    131 grep "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
    132 # Run rndc dumpdb, test whether the stale data has correct comment printed.
    133 # The max-stale-ttl is 3600 seconds, so the comment should say the data is
    134 # stale for somewhere between 3500-3599 seconds.
    135 rndc_dumpdb ns1 || ret=1
    136 awk '/; stale/ { x=$0; getline; print x, $0}' ns1/named_dump.db.test$n |
    137     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
    138 # Also make sure the not expired data does not have a stale comment.
    139 awk '/; answer/ { x=$0; getline; print x, $0}' ns1/named_dump.db.test$n |
    140     grep "; answer longttl\.example.*A text record with a 600 second ttl" > /dev/null 2>&1 || ret=1
    141 if [ $ret != 0 ]; then echo_i "failed"; fi
    142 status=$((status+ret))
    143 
    144 n=$((n+1))
    145 echo_i "check stale othertype.example ($n)"
    146 ret=0
    147 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    148 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    149 grep "othertype\.example\..*2.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1
    150 if [ $ret != 0 ]; then echo_i "failed"; fi
    151 status=$((status+ret))
    152 
    153 n=$((n+1))
    154 echo_i "check stale nodata.example ($n)"
    155 ret=0
    156 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    157 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    158 grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
    159 if [ $ret != 0 ]; then echo_i "failed"; fi
    160 status=$((status+ret))
    161 
    162 n=$((n+1))
    163 echo_i "check stale nxdomain.example ($n)"
    164 ret=0
    165 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
    166 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    167 grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
    168 if [ $ret != 0 ]; then echo_i "failed"; fi
    169 status=$((status+ret))
    170 
    171 n=$((n+1))
    172 echo_i "verify stale cache statistics ($n)"
    173 ret=0
    174 rm -f ns1/named.stats
    175 $RNDCCMD 10.53.0.1 stats > /dev/null 2>&1
    176 [ -f ns1/named.stats ] || ret=1
    177 cp ns1/named.stats ns1/named.stats.$n
    178 # Check first 10 lines of Cache DB statistics.  After serve-stale queries, we
    179 # expect one active TXT RRset, one stale TXT, one stale nxrrset TXT, and one
    180 # stale NXDOMAIN.
    181 grep -A 10 "++ Cache DB RRsets ++" ns1/named.stats.$n > ns1/named.stats.$n.cachedb || ret=1
    182 grep "1 TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
    183 grep "1 #Others" ns1/named.stats.$n.cachedb > /dev/null || ret=1
    184 grep "1 #TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
    185 grep "1 #!TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
    186 grep "1 #NXDOMAIN" ns1/named.stats.$n.cachedb > /dev/null || ret=1
    187 status=$((status+ret))
    188 if [ $ret != 0 ]; then echo_i "failed"; fi
    189 
    190 n=$((n+1))
    191 echo_i "running 'rndc serve-stale off' ($n)"
    192 ret=0
    193 $RNDCCMD 10.53.0.1 serve-stale off || ret=1
    194 if [ $ret != 0 ]; then echo_i "failed"; fi
    195 status=$((status+ret))
    196 
    197 n=$((n+1))
    198 echo_i "check 'rndc serve-stale status' ($n)"
    199 ret=0
    200 $RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
    201 grep '_default: off (rndc) (stale-answer-ttl=2 max-stale-ttl=3600)' rndc.out.test$n > /dev/null || ret=1
    202 if [ $ret != 0 ]; then echo_i "failed"; fi
    203 status=$((status+ret))
    204 
    205 echo_i "sending queries for tests $((n+1))-$((n+4))..."
    206 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
    207 $DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
    208 $DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
    209 $DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
    210 
    211 # ensure all files have been written before proceeding
    212 waitfile dig.out.test$((n+1))
    213 waitfile dig.out.test$((n+2))
    214 waitfile dig.out.test$((n+3))
    215 waitfile dig.out.test$((n+4))
    216 
    217 n=$((n+1))
    218 echo_i "check stale data.example (serve-stale off) ($n)"
    219 ret=0
    220 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
    221 if [ $ret != 0 ]; then echo_i "failed"; fi
    222 status=$((status+ret))
    223 
    224 n=$((n+1))
    225 echo_i "check stale othertype.example (serve-stale off) ($n)"
    226 ret=0
    227 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
    228 if [ $ret != 0 ]; then echo_i "failed"; fi
    229 status=$((status+ret))
    230 
    231 n=$((n+1))
    232 echo_i "check stale nodata.example (serve-stale off) ($n)"
    233 ret=0
    234 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
    235 if [ $ret != 0 ]; then echo_i "failed"; fi
    236 status=$((status+ret))
    237 
    238 n=$((n+1))
    239 echo_i "check stale nxdomain.example (serve-stale off) ($n)"
    240 ret=0
    241 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
    242 if [ $ret != 0 ]; then echo_i "failed"; fi
    243 status=$((status+ret))
    244 
    245 n=$((n+1))
    246 echo_i "running 'rndc serve-stale on' ($n)"
    247 ret=0
    248 $RNDCCMD 10.53.0.1 serve-stale on || ret=1
    249 if [ $ret != 0 ]; then echo_i "failed"; fi
    250 status=$((status+ret))
    251 
    252 n=$((n+1))
    253 echo_i "check 'rndc serve-stale status' ($n)"
    254 ret=0
    255 $RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
    256 grep '_default: on (rndc) (stale-answer-ttl=2 max-stale-ttl=3600)' rndc.out.test$n > /dev/null || ret=1
    257 if [ $ret != 0 ]; then echo_i "failed"; fi
    258 status=$((status+ret))
    259 
    260 echo_i "sending queries for tests $((n+1))-$((n+4))..."
    261 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
    262 $DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
    263 $DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
    264 $DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
    265 
    266 # ensure all files have been written before proceeding
    267 waitfile dig.out.test$((n+1))
    268 waitfile dig.out.test$((n+2))
    269 waitfile dig.out.test$((n+3))
    270 waitfile dig.out.test$((n+4))
    271 
    272 n=$((n+1))
    273 echo_i "check stale data.example (serve-stale on) ($n)"
    274 ret=0
    275 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    276 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    277 grep "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
    278 if [ $ret != 0 ]; then echo_i "failed"; fi
    279 status=$((status+ret))
    280 
    281 n=$((n+1))
    282 echo_i "check stale othertype.example (serve-stale on) ($n)"
    283 ret=0
    284 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    285 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    286 grep "othertype\.example\..*2.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1
    287 if [ $ret != 0 ]; then echo_i "failed"; fi
    288 status=$((status+ret))
    289 
    290 n=$((n+1))
    291 echo_i "check stale nodata.example (serve-stale on) ($n)"
    292 ret=0
    293 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    294 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    295 grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
    296 if [ $ret != 0 ]; then echo_i "failed"; fi
    297 status=$((status+ret))
    298 
    299 n=$((n+1))
    300 echo_i "check stale nxdomain.example (serve-stale on) ($n)"
    301 ret=0
    302 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
    303 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    304 grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
    305 if [ $ret != 0 ]; then echo_i "failed"; fi
    306 status=$((status+ret))
    307 
    308 n=$((n+1))
    309 echo_i "running 'rndc serve-stale off' ($n)"
    310 ret=0
    311 $RNDCCMD 10.53.0.1 serve-stale off || ret=1
    312 if [ $ret != 0 ]; then echo_i "failed"; fi
    313 status=$((status+ret))
    314 
    315 n=$((n+1))
    316 echo_i "running 'rndc serve-stale reset' ($n)"
    317 ret=0
    318 $RNDCCMD 10.53.0.1 serve-stale reset || ret=1
    319 if [ $ret != 0 ]; then echo_i "failed"; fi
    320 status=$((status+ret))
    321 
    322 n=$((n+1))
    323 echo_i "check 'rndc serve-stale status' ($n)"
    324 ret=0
    325 $RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
    326 grep '_default: on (stale-answer-ttl=2 max-stale-ttl=3600)' rndc.out.test$n > /dev/null || ret=1
    327 if [ $ret != 0 ]; then echo_i "failed"; fi
    328 status=$((status+ret))
    329 
    330 echo_i "sending queries for tests $((n+1))-$((n+4))..."
    331 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
    332 $DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
    333 $DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
    334 $DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
    335 
    336 # ensure all files have been written before proceeding
    337 waitfile dig.out.test$((n+1))
    338 waitfile dig.out.test$((n+2))
    339 waitfile dig.out.test$((n+3))
    340 waitfile dig.out.test$((n+4))
    341 
    342 n=$((n+1))
    343 echo_i "check stale data.example (serve-stale reset) ($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 "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" 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 othertype.example (serve-stale reset) ($n)"
    353 ret=0
    354 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    355 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    356 grep "othertype.example\..*2.*IN.*CAA.*0.*issue" 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 nodata.example (serve-stale reset) ($n)"
    362 ret=0
    363 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    364 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    365 grep "example\..*2.*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 "check stale nxdomain.example (serve-stale reset) ($n)"
    371 ret=0
    372 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
    373 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    374 grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
    375 if [ $ret != 0 ]; then echo_i "failed"; fi
    376 status=$((status+ret))
    377 
    378 n=$((n+1))
    379 echo_i "running 'rndc serve-stale off' ($n)"
    380 ret=0
    381 $RNDCCMD 10.53.0.1 serve-stale off || ret=1
    382 if [ $ret != 0 ]; then echo_i "failed"; fi
    383 status=$((status+ret))
    384 
    385 n=$((n+1))
    386 echo_i "check 'rndc serve-stale status' ($n)"
    387 ret=0
    388 $RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
    389 grep '_default: off (rndc) (stale-answer-ttl=2 max-stale-ttl=3600)' rndc.out.test$n > /dev/null || ret=1
    390 if [ $ret != 0 ]; then echo_i "failed"; fi
    391 status=$((status+ret))
    392 
    393 #
    394 # Update named.conf.
    395 # Test server with low max-stale-ttl.
    396 #
    397 echo_i "test server with serve-stale options set, low max-stale-ttl"
    398 
    399 n=$((n+1))
    400 echo_i "updating ns1/named.conf ($n)"
    401 ret=0
    402 copy_setports ns1/named2.conf.in ns1/named.conf
    403 if [ $ret != 0 ]; then echo_i "failed"; fi
    404 status=$((status+ret))
    405 
    406 n=$((n+1))
    407 echo_i "running 'rndc reload' ($n)"
    408 ret=0
    409 rndc_reload ns1 10.53.0.1
    410 if [ $ret != 0 ]; then echo_i "failed"; fi
    411 status=$((status+ret))
    412 
    413 n=$((n+1))
    414 echo_i "check 'rndc serve-stale status' ($n)"
    415 ret=0
    416 $RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
    417 grep '_default: off (rndc) (stale-answer-ttl=3 max-stale-ttl=20)' rndc.out.test$n > /dev/null || ret=1
    418 if [ $ret != 0 ]; then echo_i "failed"; fi
    419 status=$((status+ret))
    420 
    421 n=$((n+1))
    422 echo_i "flush cache, re-enable serve-stale and query again ($n)"
    423 ret=0
    424 $RNDCCMD 10.53.0.1 flushtree example > rndc.out.test$n.1 2>&1 || ret=1
    425 $RNDCCMD 10.53.0.1 serve-stale on > rndc.out.test$n.2 2>&1 || ret=1
    426 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n
    427 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
    428 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    429 if [ $ret != 0 ]; then echo_i "failed"; fi
    430 status=$((status+ret))
    431 
    432 n=$((n+1))
    433 echo_i "check 'rndc serve-stale status' ($n)"
    434 ret=0
    435 $RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
    436 grep '_default: on (rndc) (stale-answer-ttl=3 max-stale-ttl=20)' rndc.out.test$n > /dev/null || ret=1
    437 if [ $ret != 0 ]; then echo_i "failed"; fi
    438 status=$((status+ret))
    439 
    440 n=$((n+1))
    441 echo_i "enable responses from authoritative server ($n)"
    442 ret=0
    443 $DIG -p ${PORT} @10.53.0.2 txt enable  > dig.out.test$n
    444 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    445 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
    446 if [ $ret != 0 ]; then echo_i "failed"; fi
    447 status=$((status+ret))
    448 
    449 n=$((n+1))
    450 echo_i "prime cache longttl.example (low max-stale-ttl) ($n)"
    451 ret=0
    452 $DIG -p ${PORT} @10.53.0.1 longttl.example TXT > dig.out.test$n
    453 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    454 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    455 if [ $ret != 0 ]; then echo_i "failed"; fi
    456 status=$((status+ret))
    457 
    458 n=$((n+1))
    459 echo_i "prime cache data.example (low max-stale-ttl) ($n)"
    460 ret=0
    461 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n
    462 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    463 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    464 if [ $ret != 0 ]; then echo_i "failed"; fi
    465 status=$((status+ret))
    466 
    467 n=$((n+1))
    468 echo_i "prime cache othertype.example (low max-stale-ttl) ($n)"
    469 ret=0
    470 $DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$n
    471 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    472 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    473 if [ $ret != 0 ]; then echo_i "failed"; fi
    474 status=$((status+ret))
    475 
    476 n=$((n+1))
    477 echo_i "prime cache nodata.example (low max-stale-ttl) ($n)"
    478 ret=0
    479 $DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$n
    480 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    481 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    482 if [ $ret != 0 ]; then echo_i "failed"; fi
    483 status=$((status+ret))
    484 
    485 n=$((n+1))
    486 echo_i "prime cache nxdomain.example (low max-stale-ttl) ($n)"
    487 ret=0
    488 $DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$n
    489 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
    490 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    491 if [ $ret != 0 ]; then echo_i "failed"; fi
    492 status=$((status+ret))
    493 
    494 n=$((n+1))
    495 echo_i "verify prime cache statistics (low max-stale-ttl) ($n)"
    496 ret=0
    497 rm -f ns1/named.stats
    498 $RNDCCMD 10.53.0.1 stats > /dev/null 2>&1
    499 [ -f ns1/named.stats ] || ret=1
    500 cp ns1/named.stats ns1/named.stats.$n
    501 # Check first 10 lines of Cache DB statistics.  After prime queries, we expect
    502 # two active TXT RRsets, one nxrrset TXT, and one NXDOMAIN.
    503 grep -A 10 "++ Cache DB RRsets ++" ns1/named.stats.$n > ns1/named.stats.$n.cachedb || ret=1
    504 grep "2 TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
    505 grep "1 Others" ns1/named.stats.$n.cachedb > /dev/null || ret=1
    506 grep "1 !TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
    507 grep "1 NXDOMAIN" ns1/named.stats.$n.cachedb > /dev/null || ret=1
    508 status=$((status+ret))
    509 if [ $ret != 0 ]; then echo_i "failed"; fi
    510 
    511 n=$((n+1))
    512 echo_i "disable responses from authoritative server ($n)"
    513 ret=0
    514 $DIG -p ${PORT} @10.53.0.2 txt disable  > dig.out.test$n
    515 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    516 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
    517 if [ $ret != 0 ]; then echo_i "failed"; fi
    518 status=$((status+ret))
    519 
    520 sleep 2
    521 
    522 echo_i "sending queries for tests $((n+1))-$((n+4))..."
    523 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
    524 $DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
    525 $DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
    526 $DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
    527 
    528 # ensure all files have been written before proceeding
    529 waitfile dig.out.test$((n+1))
    530 waitfile dig.out.test$((n+2))
    531 waitfile dig.out.test$((n+3))
    532 waitfile dig.out.test$((n+4))
    533 
    534 n=$((n+1))
    535 echo_i "check stale data.example (low max-stale-ttl) ($n)"
    536 ret=0
    537 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    538 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    539 grep "data\.example\..*3.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
    540 if [ $ret != 0 ]; then echo_i "failed"; fi
    541 status=$((status+ret))
    542 
    543 n=$((n+1))
    544 echo_i "check stale othertype.example (low max-stale-ttl) ($n)"
    545 ret=0
    546 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    547 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    548 grep "othertype\.example\..*3.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1
    549 if [ $ret != 0 ]; then echo_i "failed"; fi
    550 status=$((status+ret))
    551 
    552 n=$((n+1))
    553 echo_i "check stale nodata.example (low max-stale-ttl) ($n)"
    554 ret=0
    555 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    556 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    557 grep "example\..*3.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
    558 if [ $ret != 0 ]; then echo_i "failed"; fi
    559 status=$((status+ret))
    560 
    561 n=$((n+1))
    562 echo_i "check stale nxdomain.example (low max-stale-ttl) ($n)"
    563 ret=0
    564 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
    565 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    566 grep "example\..*3.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
    567 if [ $ret != 0 ]; then echo_i "failed"; fi
    568 status=$((status+ret))
    569 
    570 n=$((n+1))
    571 echo_i "verify stale cache statistics (low max-stale-ttl) ($n)"
    572 ret=0
    573 rm -f ns1/named.stats
    574 $RNDCCMD 10.53.0.1 stats > /dev/null 2>&1
    575 [ -f ns1/named.stats ] || ret=1
    576 cp ns1/named.stats ns1/named.stats.$n
    577 # Check first 10 lines of Cache DB statistics.  After serve-stale queries, we
    578 # expect one active TXT RRset, one stale TXT, one stale nxrrset TXT, and one
    579 # stale NXDOMAIN.
    580 grep -A 10 "++ Cache DB RRsets ++" ns1/named.stats.$n > ns1/named.stats.$n.cachedb || ret=1
    581 grep "1 TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
    582 grep "1 #TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
    583 grep "1 #Others" ns1/named.stats.$n.cachedb > /dev/null || ret=1
    584 grep "1 #!TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
    585 grep "1 #NXDOMAIN" ns1/named.stats.$n.cachedb > /dev/null || ret=1
    586 
    587 status=$((status+ret))
    588 if [ $ret != 0 ]; then echo_i "failed"; fi
    589 
    590 echo_i "sending queries for tests $((n+1))-$((n+4))..."
    591 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
    592 $DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
    593 $DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
    594 $DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
    595 
    596 # ensure all files have been written before proceeding
    597 waitfile dig.out.test$((n+1))
    598 waitfile dig.out.test$((n+2))
    599 waitfile dig.out.test$((n+3))
    600 waitfile dig.out.test$((n+4))
    601 
    602 n=$((n+1))
    603 echo_i "check ancient data.example (low max-stale-ttl) ($n)"
    604 ret=0
    605 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
    606 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    607 if [ $ret != 0 ]; then echo_i "failed"; fi
    608 status=$((status+ret))
    609 
    610 n=$((n+1))
    611 echo_i "check ancient othertype.example (low max-stale-ttl) ($n)"
    612 ret=0
    613 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
    614 grep "ANSWER: 0," 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 ancient nodata.example (low max-stale-ttl) ($n)"
    620 ret=0
    621 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
    622 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    623 if [ $ret != 0 ]; then echo_i "failed"; fi
    624 status=$((status+ret))
    625 
    626 n=$((n+1))
    627 echo_i "check ancient nxdomain.example (low max-stale-ttl) ($n)"
    628 ret=0
    629 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
    630 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    631 if [ $ret != 0 ]; then echo_i "failed"; fi
    632 status=$((status+ret))
    633 
    634 #
    635 # Now test server with no serve-stale options set.
    636 #
    637 echo_i "test server with no serve-stale options set"
    638 
    639 n=$((n+1))
    640 echo_i "enable responses from authoritative server ($n)"
    641 ret=0
    642 $DIG -p ${PORT} @10.53.0.2 txt enable  > dig.out.test$n
    643 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    644 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
    645 if [ $ret != 0 ]; then echo_i "failed"; fi
    646 status=$((status+ret))
    647 
    648 n=$((n+1))
    649 echo_i "prime cache longttl.example (max-stale-ttl default) ($n)"
    650 ret=0
    651 $DIG -p ${PORT} @10.53.0.3 longttl.example TXT > dig.out.test$n
    652 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    653 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    654 if [ $ret != 0 ]; then echo_i "failed"; fi
    655 status=$((status+ret))
    656 
    657 n=$((n+1))
    658 echo_i "prime cache data.example (max-stale-ttl default) ($n)"
    659 ret=0
    660 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
    661 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    662 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    663 grep "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
    664 if [ $ret != 0 ]; then echo_i "failed"; fi
    665 status=$((status+ret))
    666 
    667 n=$((n+1))
    668 echo_i "prime cache othertype.example (max-stale-ttl default) ($n)"
    669 ret=0
    670 $DIG -p ${PORT} @10.53.0.3 othertype.example CAA > dig.out.test$n
    671 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    672 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    673 grep "othertype\.example\..*2.*IN.*CAA.*0.*issue" 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 "prime cache nodata.example (max-stale-ttl default) ($n)"
    679 ret=0
    680 $DIG -p ${PORT} @10.53.0.3 nodata.example TXT > dig.out.test$n
    681 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    682 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    683 grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
    684 if [ $ret != 0 ]; then echo_i "failed"; fi
    685 status=$((status+ret))
    686 
    687 n=$((n+1))
    688 echo_i "prime cache nxdomain.example (max-stale-ttl default) ($n)"
    689 ret=0
    690 $DIG -p ${PORT} @10.53.0.3 nxdomain.example TXT > dig.out.test$n
    691 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
    692 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    693 grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
    694 if [ $ret != 0 ]; then echo_i "failed"; fi
    695 status=$((status+ret))
    696 
    697 n=$((n+1))
    698 echo_i "verify prime cache statistics (max-stale-ttl default) ($n)"
    699 ret=0
    700 rm -f ns3/named.stats
    701 $RNDCCMD 10.53.0.3 stats > /dev/null 2>&1
    702 [ -f ns3/named.stats ] || ret=1
    703 cp ns3/named.stats ns3/named.stats.$n
    704 # Check first 10 lines of Cache DB statistics.  After prime queries, we expect
    705 # two active TXT RRsets, one nxrrset TXT, and one NXDOMAIN.
    706 grep -A 10 "++ Cache DB RRsets ++" ns3/named.stats.$n > ns3/named.stats.$n.cachedb || ret=1
    707 grep "2 TXT" ns3/named.stats.$n.cachedb > /dev/null || ret=1
    708 grep "1 Others" ns3/named.stats.$n.cachedb > /dev/null || ret=1
    709 grep "1 !TXT" ns3/named.stats.$n.cachedb > /dev/null || ret=1
    710 grep "1 NXDOMAIN" ns3/named.stats.$n.cachedb > /dev/null || ret=1
    711 status=$((status+ret))
    712 if [ $ret != 0 ]; then echo_i "failed"; fi
    713 
    714 n=$((n+1))
    715 echo_i "disable responses from authoritative server ($n)"
    716 ret=0
    717 $DIG -p ${PORT} @10.53.0.2 txt disable  > dig.out.test$n
    718 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    719 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
    720 if [ $ret != 0 ]; then echo_i "failed"; fi
    721 status=$((status+ret))
    722 
    723 n=$((n+1))
    724 echo_i "check 'rndc serve-stale status' ($n)"
    725 ret=0
    726 $RNDCCMD 10.53.0.3 serve-stale status > rndc.out.test$n 2>&1 || ret=1
    727 grep '_default: off (stale-answer-ttl=1 max-stale-ttl=604800)' rndc.out.test$n > /dev/null || ret=1
    728 if [ $ret != 0 ]; then echo_i "failed"; fi
    729 status=$((status+ret))
    730 
    731 sleep 2
    732 
    733 echo_i "sending queries for tests $((n+1))-$((n+4))..."
    734 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$((n+1)) &
    735 $DIG -p ${PORT} @10.53.0.3 othertype.example CAA > dig.out.test$((n+2)) &
    736 $DIG -p ${PORT} @10.53.0.3 nodata.example TXT > dig.out.test$((n+3)) &
    737 $DIG -p ${PORT} @10.53.0.3 nxdomain.example TXT > dig.out.test$((n+4))
    738 
    739 # ensure all files have been written before proceeding
    740 waitfile dig.out.test$((n+1))
    741 waitfile dig.out.test$((n+2))
    742 waitfile dig.out.test$((n+3))
    743 waitfile dig.out.test$((n+4))
    744 
    745 n=$((n+1))
    746 echo_i "check fail of data.example (max-stale-ttl default) ($n)"
    747 ret=0
    748 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
    749 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    750 if [ $ret != 0 ]; then echo_i "failed"; fi
    751 status=$((status+ret))
    752 
    753 n=$((n+1))
    754 echo_i "check fail of othertype.example (max-stale-ttl default) ($n)"
    755 ret=0
    756 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
    757 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    758 if [ $ret != 0 ]; then echo_i "failed"; fi
    759 status=$((status+ret))
    760 
    761 n=$((n+1))
    762 echo_i "check fail of nodata.example (max-stale-ttl default) ($n)"
    763 ret=0
    764 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
    765 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    766 if [ $ret != 0 ]; then echo_i "failed"; fi
    767 status=$((status+ret))
    768 
    769 n=$((n+1))
    770 echo_i "check fail of nxdomain.example (max-stale-ttl default) ($n)"
    771 ret=0
    772 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
    773 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    774 if [ $ret != 0 ]; then echo_i "failed"; fi
    775 status=$((status+ret))
    776 
    777 n=$((n+1))
    778 echo_i "verify stale cache statistics (max-stale-ttl default) ($n)"
    779 ret=0
    780 rm -f ns3/named.stats
    781 $RNDCCMD 10.53.0.3 stats > /dev/null 2>&1
    782 [ -f ns3/named.stats ] || ret=1
    783 cp ns3/named.stats ns3/named.stats.$n
    784 # Check first 10 lines of Cache DB statistics. After last queries, we expect
    785 # one active TXT RRset, one stale TXT, one stale nxrrset TXT, and one
    786 # stale NXDOMAIN.
    787 grep -A 10 "++ Cache DB RRsets ++" ns3/named.stats.$n > ns3/named.stats.$n.cachedb || ret=1
    788 grep "1 TXT" ns3/named.stats.$n.cachedb > /dev/null || ret=1
    789 grep "1 #TXT" ns3/named.stats.$n.cachedb > /dev/null || ret=1
    790 grep "1 #Others" ns3/named.stats.$n.cachedb > /dev/null || ret=1
    791 grep "1 #!TXT" ns3/named.stats.$n.cachedb > /dev/null || ret=1
    792 grep "1 #NXDOMAIN" ns3/named.stats.$n.cachedb > /dev/null || ret=1
    793 
    794 status=$((status+ret))
    795 if [ $ret != 0 ]; then echo_i "failed"; fi
    796 
    797 n=$((n+1))
    798 echo_i "check 'rndc serve-stale on' ($n)"
    799 ret=0
    800 $RNDCCMD 10.53.0.3 serve-stale on > rndc.out.test$n 2>&1 || ret=1
    801 if [ $ret != 0 ]; then echo_i "failed"; fi
    802 status=$((status+ret))
    803 
    804 n=$((n+1))
    805 echo_i "check 'rndc serve-stale status' ($n)"
    806 ret=0
    807 $RNDCCMD 10.53.0.3 serve-stale status > rndc.out.test$n 2>&1 || ret=1
    808 grep '_default: on (rndc) (stale-answer-ttl=1 max-stale-ttl=604800)' rndc.out.test$n > /dev/null || ret=1
    809 if [ $ret != 0 ]; then echo_i "failed"; fi
    810 status=$((status+ret))
    811 
    812 sleep 2
    813 
    814 echo_i "sending queries for tests $((n+1))-$((n+4))..."
    815 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$((n+1)) &
    816 $DIG -p ${PORT} @10.53.0.3 othertype.example CAA > dig.out.test$((n+2)) &
    817 $DIG -p ${PORT} @10.53.0.3 nodata.example TXT > dig.out.test$((n+3)) &
    818 $DIG -p ${PORT} @10.53.0.3 nxdomain.example TXT > dig.out.test$((n+4))
    819 
    820 # ensure all files have been written before proceeding
    821 waitfile dig.out.test$((n+1))
    822 waitfile dig.out.test$((n+2))
    823 waitfile dig.out.test$((n+3))
    824 waitfile dig.out.test$((n+4))
    825 
    826 n=$((n+1))
    827 echo_i "check data.example (max-stale-ttl default) ($n)"
    828 ret=0
    829 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    830 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    831 grep "data\.example\..*1.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
    832 if [ $ret != 0 ]; then echo_i "failed"; fi
    833 status=$((status+ret))
    834 
    835 n=$((n+1))
    836 echo_i "check othertype.example (max-stale-ttl default) ($n)"
    837 ret=0
    838 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    839 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    840 grep "example\..*1.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1
    841 if [ $ret != 0 ]; then echo_i "failed"; fi
    842 status=$((status+ret))
    843 
    844 n=$((n+1))
    845 echo_i "check nodata.example (max-stale-ttl default) ($n)"
    846 ret=0
    847 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    848 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    849 grep "example\..*1.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
    850 if [ $ret != 0 ]; then echo_i "failed"; fi
    851 status=$((status+ret))
    852 
    853 n=$((n+1))
    854 echo_i "check nxdomain.example (max-stale-ttl default) ($n)"
    855 ret=0
    856 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
    857 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    858 grep "example\..*1.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
    859 if [ $ret != 0 ]; then echo_i "failed"; fi
    860 status=$((status+ret))
    861 
    862 #
    863 # Now test server with serve-stale disabled.
    864 #
    865 echo_i "test server with serve-stale disabled"
    866 
    867 n=$((n+1))
    868 echo_i "enable responses from authoritative server ($n)"
    869 ret=0
    870 $DIG -p ${PORT} @10.53.0.2 txt enable  > dig.out.test$n
    871 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    872 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
    873 if [ $ret != 0 ]; then echo_i "failed"; fi
    874 status=$((status+ret))
    875 
    876 n=$((n+1))
    877 echo_i "prime cache longttl.example (serve-stale disabled) ($n)"
    878 ret=0
    879 $DIG -p ${PORT} @10.53.0.4 longttl.example TXT > dig.out.test$n
    880 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    881 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    882 if [ $ret != 0 ]; then echo_i "failed"; fi
    883 status=$((status+ret))
    884 
    885 n=$((n+1))
    886 echo_i "prime cache data.example (serve-stale disabled) ($n)"
    887 ret=0
    888 $DIG -p ${PORT} @10.53.0.4 data.example TXT > dig.out.test$n
    889 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    890 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    891 grep "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
    892 if [ $ret != 0 ]; then echo_i "failed"; fi
    893 status=$((status+ret))
    894 
    895 n=$((n+1))
    896 echo_i "prime cache othertype.example (serve-stale disabled) ($n)"
    897 ret=0
    898 $DIG -p ${PORT} @10.53.0.4 othertype.example CAA > dig.out.test$n
    899 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    900 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    901 grep "othertype\.example\..*2.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1
    902 if [ $ret != 0 ]; then echo_i "failed"; fi
    903 status=$((status+ret))
    904 
    905 n=$((n+1))
    906 echo_i "prime cache nodata.example (serve-stale disabled) ($n)"
    907 ret=0
    908 $DIG -p ${PORT} @10.53.0.4 nodata.example TXT > dig.out.test$n
    909 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    910 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    911 grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
    912 if [ $ret != 0 ]; then echo_i "failed"; fi
    913 status=$((status+ret))
    914 
    915 n=$((n+1))
    916 echo_i "prime cache nxdomain.example (serve-stale disabled) ($n)"
    917 ret=0
    918 $DIG -p ${PORT} @10.53.0.4 nxdomain.example TXT > dig.out.test$n
    919 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
    920 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    921 grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
    922 if [ $ret != 0 ]; then echo_i "failed"; fi
    923 status=$((status+ret))
    924 
    925 n=$((n+1))
    926 echo_i "verify prime cache statistics (serve-stale disabled) ($n)"
    927 ret=0
    928 rm -f ns4/named.stats
    929 $RNDCCMD 10.53.0.4 stats > /dev/null 2>&1
    930 [ -f ns4/named.stats ] || ret=1
    931 cp ns4/named.stats ns4/named.stats.$n
    932 # Check first 10 lines of Cache DB statistics.  After prime queries, we expect
    933 # two active TXT RRsets, one nxrrset TXT, and one NXDOMAIN.
    934 grep -A 10 "++ Cache DB RRsets ++" ns4/named.stats.$n > ns4/named.stats.$n.cachedb || ret=1
    935 grep "2 TXT" ns4/named.stats.$n.cachedb > /dev/null || ret=1
    936 grep "1 Others" ns4/named.stats.$n.cachedb > /dev/null || ret=1
    937 grep "1 !TXT" ns4/named.stats.$n.cachedb > /dev/null || ret=1
    938 grep "1 NXDOMAIN" ns4/named.stats.$n.cachedb > /dev/null || ret=1
    939 status=$((status+ret))
    940 if [ $ret != 0 ]; then echo_i "failed"; fi
    941 
    942 n=$((n+1))
    943 echo_i "disable responses from authoritative server ($n)"
    944 ret=0
    945 $DIG -p ${PORT} @10.53.0.2 txt disable  > dig.out.test$n
    946 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
    947 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
    948 if [ $ret != 0 ]; then echo_i "failed"; fi
    949 status=$((status+ret))
    950 
    951 n=$((n+1))
    952 echo_i "check 'rndc serve-stale status' ($n)"
    953 ret=0
    954 $RNDCCMD 10.53.0.4 serve-stale status > rndc.out.test$n 2>&1 || ret=1
    955 grep '_default: off (stale-answer-ttl=1 max-stale-ttl=604800)' rndc.out.test$n > /dev/null || ret=1
    956 if [ $ret != 0 ]; then echo_i "failed"; fi
    957 status=$((status+ret))
    958 
    959 sleep 2
    960 
    961 echo_i "sending queries for tests $((n+1))-$((n+4))..."
    962 $DIG -p ${PORT} @10.53.0.4 data.example TXT > dig.out.test$((n+1)) &
    963 $DIG -p ${PORT} @10.53.0.4 othertype.example CAA > dig.out.test$((n+2)) &
    964 $DIG -p ${PORT} @10.53.0.4 nodata.example TXT > dig.out.test$((n+3)) &
    965 $DIG -p ${PORT} @10.53.0.4 nxdomain.example TXT > dig.out.test$((n+4))
    966 
    967 # ensure all files have been written before proceeding
    968 waitfile dig.out.test$((n+1))
    969 waitfile dig.out.test$((n+2))
    970 waitfile dig.out.test$((n+3))
    971 waitfile dig.out.test$((n+4))
    972 
    973 n=$((n+1))
    974 echo_i "check fail of data.example (serve-stale disabled) ($n)"
    975 ret=0
    976 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
    977 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    978 if [ $ret != 0 ]; then echo_i "failed"; fi
    979 status=$((status+ret))
    980 
    981 n=$((n+1))
    982 echo_i "check fail of othertype.example (serve-stale disabled) ($n)"
    983 ret=0
    984 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
    985 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    986 if [ $ret != 0 ]; then echo_i "failed"; fi
    987 status=$((status+ret))
    988 
    989 n=$((n+1))
    990 echo_i "check fail of nodata.example (serve-stale disabled) ($n)"
    991 ret=0
    992 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
    993 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
    994 if [ $ret != 0 ]; then echo_i "failed"; fi
    995 status=$((status+ret))
    996 
    997 n=$((n+1))
    998 echo_i "check fail of nxdomain.example (serve-stale disabled) ($n)"
    999 ret=0
   1000 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
   1001 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
   1002 if [ $ret != 0 ]; then echo_i "failed"; fi
   1003 status=$((status+ret))
   1004 
   1005 n=$((n+1))
   1006 echo_i "verify stale cache statistics (serve-stale disabled) ($n)"
   1007 ret=0
   1008 rm -f ns4/named.stats
   1009 $RNDCCMD 10.53.0.4 stats > /dev/null 2>&1
   1010 [ -f ns4/named.stats ] || ret=1
   1011 cp ns4/named.stats ns4/named.stats.$n
   1012 # Check first 10 lines of Cache DB statistics. After last queries, we expect
   1013 # one active TXT RRset, one stale TXT, one stale nxrrset TXT, and one
   1014 # stale NXDOMAIN.
   1015 grep -A 10 "++ Cache DB RRsets ++" ns4/named.stats.$n > ns4/named.stats.$n.cachedb || ret=1
   1016 grep "1 TXT" ns4/named.stats.$n.cachedb > /dev/null || ret=1
   1017 grep "1 #TXT" ns4/named.stats.$n.cachedb > /dev/null || ret=1
   1018 grep "1 #Others" ns4/named.stats.$n.cachedb > /dev/null || ret=1
   1019 grep "1 #!TXT" ns4/named.stats.$n.cachedb > /dev/null || ret=1
   1020 grep "1 #NXDOMAIN" ns4/named.stats.$n.cachedb > /dev/null || ret=1
   1021 status=$((status+ret))
   1022 if [ $ret != 0 ]; then echo_i "failed"; fi
   1023 
   1024 # Dump the cache.
   1025 n=$((n+1))
   1026 echo_i "dump the cache (serve-stale disabled) ($n)"
   1027 ret=0
   1028 $RNDCCMD 10.53.0.4 dumpdb -cache > rndc.out.test$n 2>&1 || ret=1
   1029 done=0
   1030 for i in 0 1 2 3 4 5 6 7 8 9; do
   1031 	grep '^; Dump complete$' ns4/named_dump4.db > /dev/null 2>&1 && done=1
   1032 	if [ $done != 1 ]; then sleep 1; fi
   1033 done
   1034 if [ $done != 1 ]; then ret=1; fi
   1035 status=$((status+ret))
   1036 if [ $ret != 0 ]; then echo_i "failed"; fi
   1037 
   1038 echo_i "stop ns4"
   1039 $PERL $SYSTEMTESTTOP/stop.pl --use-rndc --port ${CONTROLPORT} serve-stale ns4
   1040 
   1041 # Load the cache as if it was five minutes (RBTDB_VIRTUAL) older.
   1042 # Since max-stale-ttl defaults to a week, we need to adjust the date by
   1043 # one week and five minutes.
   1044 LASTWEEK=`TZ=UTC perl -e 'my $now = time();
   1045         my $oneWeekAgo = $now - 604800;
   1046         my $fiveMinutesAgo = $oneWeekAgo - 300;
   1047         my ($s, $m, $h, $d, $mo, $y) = (localtime($fiveMinutesAgo))[0, 1, 2, 3, 4, 5];
   1048         printf("%04d%02d%02d%02d%02d%02d", $y+1900, $mo+1, $d, $h, $m, $s);'`
   1049 
   1050 n=$((n+1))
   1051 echo_i "mock the cache date to $LASTWEEK (serve-stale disabled) ($n)"
   1052 ret=0
   1053 sed -E "s/DATE [0-9]{14}/DATE $LASTWEEK/g" ns4/named_dump4.db > ns4/named_dumpdb4.db.out || ret=1
   1054 cp ns4/named_dumpdb4.db.out ns4/named_dumpdb4.db
   1055 if [ $ret != 0 ]; then echo_i "failed"; fi
   1056 status=$((status+ret))
   1057 
   1058 echo_i "start ns4"
   1059 $PERL $SYSTEMTESTTOP/start.pl --noclean --restart --port ${PORT} serve-stale ns4
   1060 
   1061 n=$((n+1))
   1062 echo_i "verify ancient cache statistics (serve-stale disabled) ($n)"
   1063 ret=0
   1064 rm -f ns4/named.stats
   1065 $RNDCCMD 10.53.0.4 stats #> /dev/null 2>&1
   1066 [ -f ns4/named.stats ] || ret=1
   1067 cp ns4/named.stats ns4/named.stats.$n
   1068 # Check first 10 lines of Cache DB statistics. After last queries, we expect
   1069 # everything to be removed or scheduled to be removed.
   1070 grep -A 10 "++ Cache DB RRsets ++" ns4/named.stats.$n > ns4/named.stats.$n.cachedb || ret=1
   1071 grep "#TXT" ns4/named.stats.$n.cachedb > /dev/null && ret=1
   1072 grep "#Others" ns4/named.stats.$n.cachedb > /dev/null && ret=1
   1073 grep "#!TXT" ns4/named.stats.$n.cachedb > /dev/null && ret=1
   1074 grep "#NXDOMAIN" ns4/named.stats.$n.cachedb > /dev/null && ret=1
   1075 status=$((status+ret))
   1076 if [ $ret != 0 ]; then echo_i "failed"; fi
   1077 
   1078 echo_i "exit status: $status"
   1079 [ $status -eq 0 ] || exit 1
   1080