Home | History | Annotate | Line # | Download | only in qmin
tests.sh revision 1.1.1.6
      1 #!/bin/sh
      2 
      3 # Copyright (C) Internet Systems Consortium, Inc. ("ISC")
      4 #
      5 # SPDX-License-Identifier: MPL-2.0
      6 #
      7 # This Source Code Form is subject to the terms of the Mozilla Public
      8 # License, v. 2.0.  If a copy of the MPL was not distributed with this
      9 # file, you can obtain one at https://mozilla.org/MPL/2.0/.
     10 #
     11 # See the COPYRIGHT file distributed with this work for additional
     12 # information regarding copyright ownership.
     13 
     14 SYSTEMTESTTOP=..
     15 . $SYSTEMTESTTOP/conf.sh
     16 
     17 DIGOPTS="-p ${PORT}"
     18 RNDCCMD="$RNDC -c $SYSTEMTESTTOP/common/rndc.conf -p ${CONTROLPORT} -s"
     19 CLEANQL="rm -f ans*/query.log"
     20 status=0
     21 n=0
     22 
     23 n=$((n+1))
     24 echo_i "query for .good is not minimized when qname-minimization is off ($n)"
     25 ret=0
     26 $CLEANQL
     27 $RNDCCMD 10.53.0.5 flush
     28 $DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.good. @10.53.0.5 > dig.out.test$n
     29 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
     30 grep "icky.icky.icky.ptang.zoop.boing.good. 1	IN A	192.0.2.1" dig.out.test$n > /dev/null || ret=1
     31 sleep 1
     32 cat << __EOF | $DIFF ans2/query.log - > /dev/null || ret=1
     33 ADDR icky.icky.icky.ptang.zoop.boing.good.
     34 ADDR ns3.good.
     35 ADDR ns3.good.
     36 ADDR a.bit.longer.ns.name.good.
     37 ADDR a.bit.longer.ns.name.good.
     38 __EOF
     39 echo "ADDR icky.icky.icky.ptang.zoop.boing.good." | $DIFF ans3/query.log - > /dev/null || ret=1
     40 echo "ADDR icky.icky.icky.ptang.zoop.boing.good." | $DIFF ans4/query.log - > /dev/null || ret=1
     41 for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
     42 if [ $ret != 0 ]; then echo_i "failed"; fi
     43 status=$((status+ret))
     44 
     45 n=$((n+1))
     46 echo_i "query for .bad is not minimized when qname-minimization is off ($n)"
     47 ret=0
     48 $CLEANQL
     49 $RNDCCMD 10.53.0.5 flush
     50 $DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.bad. @10.53.0.5 > dig.out.test$n
     51 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
     52 grep "icky.icky.icky.ptang.zoop.boing.bad. 1 IN A	192.0.2.1" dig.out.test$n > /dev/null || ret=1
     53 sleep 1
     54 cat << __EOF | $DIFF ans2/query.log - > /dev/null || ret=1
     55 ADDR icky.icky.icky.ptang.zoop.boing.bad.
     56 ADDR ns3.bad.
     57 ADDR ns3.bad.
     58 ADDR a.bit.longer.ns.name.bad.
     59 ADDR a.bit.longer.ns.name.bad.
     60 __EOF
     61 echo "ADDR icky.icky.icky.ptang.zoop.boing.bad." | $DIFF ans3/query.log - > /dev/null || ret=1
     62 echo "ADDR icky.icky.icky.ptang.zoop.boing.bad." | $DIFF ans4/query.log - > /dev/null || ret=1
     63 for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
     64 if [ $ret != 0 ]; then echo_i "failed"; fi
     65 status=$((status+ret))
     66 
     67 n=$((n+1))
     68 echo_i "query for .slow is not minimized when qname-minimization is off ($n)"
     69 ret=0
     70 $CLEANQL
     71 $RNDCCMD 10.53.0.5 flush
     72 $DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.slow. @10.53.0.5 > dig.out.test$n
     73 sleep 5
     74 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
     75 grep "icky.icky.icky.ptang.zoop.boing.slow. 1	IN A	192.0.2.1" dig.out.test$n > /dev/null || ret=1
     76 sleep 1
     77 cat << __EOF | $DIFF ans2/query.log - > /dev/null || ret=1
     78 ADDR icky.icky.icky.ptang.zoop.boing.slow.
     79 ADDR ns3.slow.
     80 ADDR ns3.slow.
     81 ADDR a.bit.longer.ns.name.slow.
     82 ADDR a.bit.longer.ns.name.slow.
     83 __EOF
     84 echo "ADDR icky.icky.icky.ptang.zoop.boing.slow." | $DIFF ans3/query.log - > /dev/null || ret=1
     85 echo "ADDR icky.icky.icky.ptang.zoop.boing.slow." | $DIFF ans4/query.log - > /dev/null || ret=1
     86 for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
     87 if [ $ret != 0 ]; then echo_i "failed"; fi
     88 status=$((status+ret))
     89 
     90 n=$((n+1))
     91 echo_i "query for .ugly is not minimized when qname-minimization is off ($n)"
     92 ret=0
     93 $CLEANQL
     94 $RNDCCMD 10.53.0.5 flush
     95 $DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.ugly. @10.53.0.5 > dig.out.test$n
     96 sleep 5
     97 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
     98 grep "icky.icky.icky.ptang.zoop.boing.ugly. 1	IN A	192.0.2.1" dig.out.test$n > /dev/null || ret=1
     99 sleep 1
    100 cat << __EOF | $DIFF ans2/query.log - > /dev/null || ret=1
    101 ADDR icky.icky.icky.ptang.zoop.boing.ugly.
    102 ADDR ns3.ugly.
    103 ADDR ns3.ugly.
    104 ADDR a.bit.longer.ns.name.ugly.
    105 ADDR a.bit.longer.ns.name.ugly.
    106 __EOF
    107 echo "ADDR icky.icky.icky.ptang.zoop.boing.ugly." | $DIFF ans3/query.log - > /dev/null || ret=1
    108 echo "ADDR icky.icky.icky.ptang.zoop.boing.ugly." | $DIFF ans4/query.log - > /dev/null || ret=1
    109 for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
    110 if [ $ret != 0 ]; then echo_i "failed"; fi
    111 status=$((status+ret))
    112 
    113 n=$((n+1))
    114 echo_i "query for .good is properly minimized when qname-minimization is in strict mode ($n)"
    115 ret=0
    116 $CLEANQL
    117 $RNDCCMD 10.53.0.6 flush
    118 $DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.good. @10.53.0.6 > dig.out.test$n
    119 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    120 grep "icky.icky.icky.ptang.zoop.boing.good. 1	IN A	192.0.2.1" dig.out.test$n > /dev/null || ret=1
    121 sleep 1
    122 sort ans2/query.log > ans2/query.log.sorted
    123 cat << __EOF | $DIFF ans2/query.log.sorted - > /dev/null || ret=1
    124 ADDR a.bit.longer.ns.name.good.
    125 ADDR a.bit.longer.ns.name.good.
    126 ADDR ns2.good.
    127 ADDR ns3.good.
    128 ADDR ns3.good.
    129 NS boing.good.
    130 NS good.
    131 NS zoop.boing.good.
    132 __EOF
    133 cat << __EOF | $DIFF ans3/query.log - > /dev/null || ret=1
    134 NS zoop.boing.good.
    135 NS ptang.zoop.boing.good.
    136 NS icky.ptang.zoop.boing.good.
    137 __EOF
    138 cat << __EOF | $DIFF ans4/query.log - > /dev/null || ret=1
    139 NS icky.ptang.zoop.boing.good.
    140 NS icky.icky.ptang.zoop.boing.good.
    141 ADDR icky.icky.icky.ptang.zoop.boing.good.
    142 __EOF
    143 for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
    144 if [ $ret != 0 ]; then echo_i "failed"; fi
    145 status=$((status+ret))
    146 
    147 n=$((n+1))
    148 echo_i "query for .good is properly minimized when qname-minimization is in relaxed mode ($n)"
    149 ret=0
    150 $CLEANQL
    151 $RNDCCMD 10.53.0.7 flush
    152 $DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.good. @10.53.0.7 > dig.out.test$n
    153 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    154 grep "icky.icky.icky.ptang.zoop.boing.good. 1	IN A	192.0.2.1" dig.out.test$n > /dev/null || ret=1
    155 sleep 1
    156 sort ans2/query.log > ans2/query.log.sorted
    157 cat << __EOF | $DIFF ans2/query.log.sorted - > /dev/null || ret=1
    158 ADDR _.boing.good.
    159 ADDR _.zoop.boing.good.
    160 ADDR a.bit.longer.ns.name.good.
    161 ADDR a.bit.longer.ns.name.good.
    162 ADDR ns2.good.
    163 ADDR ns3.good.
    164 ADDR ns3.good.
    165 __EOF
    166 cat << __EOF | $DIFF ans3/query.log - > /dev/null || ret=1
    167 ADDR _.ptang.zoop.boing.good.
    168 ADDR _.icky.ptang.zoop.boing.good.
    169 __EOF
    170 cat << __EOF | $DIFF ans4/query.log - > /dev/null || ret=1
    171 ADDR _.icky.icky.ptang.zoop.boing.good.
    172 ADDR icky.icky.icky.ptang.zoop.boing.good.
    173 __EOF
    174 for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
    175 if [ $ret != 0 ]; then echo_i "failed"; fi
    176 status=$((status+ret))
    177 
    178 n=$((n+1))
    179 echo_i "query for .bad fails when qname-minimization is in strict mode ($n)"
    180 ret=0
    181 $CLEANQL
    182 $RNDCCMD 10.53.0.6 flush
    183 $DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.bad. @10.53.0.6 > dig.out.test$n
    184 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
    185 sleep 1
    186 sort ans2/query.log > ans2/query.log.sorted
    187 cat << __EOF | $DIFF ans2/query.log.sorted - > /dev/null || ret=1
    188 ADDR ns2.bad.
    189 NS bad.
    190 NS boing.bad.
    191 __EOF
    192 for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
    193 if [ $ret != 0 ]; then echo_i "failed"; fi
    194 status=$((status+ret))
    195 
    196 n=$((n+1))
    197 echo_i "query for .bad succeeds when qname-minimization is in relaxed mode ($n)"
    198 ret=0
    199 $CLEANQL
    200 $RNDCCMD 10.53.0.7 flush
    201 $DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.bad. @10.53.0.7 > dig.out.test$n
    202 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    203 grep "icky.icky.icky.ptang.zoop.boing.bad. 1 IN A	192.0.2.1" dig.out.test$n > /dev/null || ret=1
    204 sleep 1
    205 sort ans2/query.log > ans2/query.log.sorted
    206 cat << __EOF | $DIFF ans2/query.log.sorted - > /dev/null || ret=1
    207 ADDR _.boing.bad.
    208 ADDR _.zoop.boing.bad.
    209 ADDR a.bit.longer.ns.name.bad.
    210 ADDR a.bit.longer.ns.name.bad.
    211 ADDR ns2.bad.
    212 ADDR ns3.bad.
    213 ADDR ns3.bad.
    214 __EOF
    215 cat << __EOF | $DIFF ans3/query.log - > /dev/null || ret=1
    216 ADDR _.ptang.zoop.boing.bad.
    217 ADDR _.icky.ptang.zoop.boing.bad.
    218 __EOF
    219 cat << __EOF | $DIFF ans4/query.log - > /dev/null || ret=1
    220 ADDR _.icky.icky.ptang.zoop.boing.bad.
    221 ADDR icky.icky.icky.ptang.zoop.boing.bad.
    222 __EOF
    223 for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
    224 if [ $ret != 0 ]; then echo_i "failed"; fi
    225 status=$((status+ret))
    226 
    227 n=$((n+1))
    228 echo_i "query for .ugly fails when qname-minimization is in strict mode ($n)"
    229 ret=0
    230 $CLEANQL
    231 $RNDCCMD 10.53.0.6 flush
    232 $DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.ugly. @10.53.0.6 > dig.out.test$n
    233 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
    234 sleep 1
    235 sort ans2/query.log > ans2/query.log.sorted
    236 cat << __EOF | $DIFF ans2/query.log.sorted - > /dev/null || ret=1
    237 ADDR ns2.ugly.
    238 NS boing.ugly.
    239 NS boing.ugly.
    240 NS ugly.
    241 __EOF
    242 for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
    243 if [ $ret != 0 ]; then echo_i "failed"; fi
    244 status=$((status+ret))
    245 $RNDCCMD 10.53.0.6 flush
    246 
    247 n=$((n+1))
    248 echo_i "query for .ugly succeeds when qname-minimization is in relaxed mode ($n)"
    249 ret=0
    250 $CLEANQL
    251 $RNDCCMD 10.53.0.7 flush
    252 $DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.ugly. @10.53.0.7 > dig.out.test$n
    253 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    254 grep "icky.icky.icky.ptang.zoop.boing.ugly. 1	IN A	192.0.2.1" dig.out.test$n > /dev/null || ret=1
    255 sleep 1
    256 
    257 sort ans2/query.log > ans2/query.log.sorted
    258 cat << __EOF | $DIFF ans2/query.log.sorted - > /dev/null || ret=1
    259 ADDR _.boing.ugly.
    260 ADDR _.boing.ugly.
    261 ADDR a.bit.longer.ns.name.ugly.
    262 ADDR a.bit.longer.ns.name.ugly.
    263 ADDR icky.icky.icky.ptang.zoop.boing.ugly.
    264 ADDR ns2.ugly.
    265 ADDR ns3.ugly.
    266 ADDR ns3.ugly.
    267 __EOF
    268 echo "ADDR icky.icky.icky.ptang.zoop.boing.ugly." | $DIFF ans3/query.log - > /dev/null || ret=1
    269 echo "ADDR icky.icky.icky.ptang.zoop.boing.ugly." | $DIFF ans4/query.log - > /dev/null || ret=1
    270 for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
    271 if [ $ret != 0 ]; then echo_i "failed"; fi
    272 status=$((status+ret))
    273 $RNDCCMD 10.53.0.7 flush
    274 
    275 n=$((n+1))
    276 echo_i "information that minimization was unsuccessful for .ugly is logged ($n)"
    277 ret=0
    278 grep "success resolving 'icky.icky.icky.ptang.zoop.boing.ugly/A' after disabling qname minimization due to 'FORMERR'" ns7/named.run > /dev/null || ret=1
    279 if [ $ret != 0 ]; then echo_i "failed"; fi
    280 status=$((status+ret))
    281 
    282 n=$((n+1))
    283 echo_i "query for .slow is properly minimized when qname-minimization is on ($n)"
    284 ret=0
    285 $CLEANQL
    286 $RNDCCMD 10.53.0.6 flush
    287 $DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.slow. @10.53.0.6 > dig.out.test$n
    288 sleep 5
    289 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    290 grep "icky.icky.icky.ptang.zoop.boing.slow. 1	IN A	192.0.2.1" dig.out.test$n > /dev/null || ret=1
    291 sort ans2/query.log > ans2/query.log.sorted
    292 cat << __EOF | $DIFF ans2/query.log.sorted - > /dev/null || ret=1
    293 ADDR a.bit.longer.ns.name.slow.
    294 ADDR a.bit.longer.ns.name.slow.
    295 ADDR ns2.slow.
    296 ADDR ns3.slow.
    297 ADDR ns3.slow.
    298 NS boing.slow.
    299 NS slow.
    300 NS zoop.boing.slow.
    301 __EOF
    302 cat << __EOF | $DIFF ans3/query.log - > /dev/null || ret=1
    303 NS zoop.boing.slow.
    304 NS ptang.zoop.boing.slow.
    305 NS icky.ptang.zoop.boing.slow.
    306 __EOF
    307 cat << __EOF | $DIFF ans4/query.log - > /dev/null || ret=1
    308 NS icky.ptang.zoop.boing.slow.
    309 NS icky.icky.ptang.zoop.boing.slow.
    310 ADDR icky.icky.icky.ptang.zoop.boing.slow.
    311 __EOF
    312 for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
    313 if [ $ret != 0 ]; then echo_i "failed"; fi
    314 status=$((status+ret))
    315 
    316 n=$((n+1))
    317 echo_i "query for .ip6.arpa succeeds and skips on proper boundaries when qname-minimization is on ($n)"
    318 ret=0
    319 $CLEANQL
    320 $RNDCCMD 10.53.0.6 flush
    321 $DIG $DIGOPTS -x 2001:4f8::1 @10.53.0.6 > dig.out.test$n
    322 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    323 grep "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.f.4.0.1.0.0.2.ip6.arpa. 1 IN PTR nee.com." dig.out.test$n > /dev/null || ret=1
    324 sleep 1
    325 grep -v ADDR ans2/query.log > ans2/query.log.trimmed
    326 cat << __EOF | $DIFF ans2/query.log.trimmed - > /dev/null || ret=1
    327 NS 1.0.0.2.ip6.arpa.
    328 NS 8.f.4.0.1.0.0.2.ip6.arpa.
    329 NS 0.0.0.0.8.f.4.0.1.0.0.2.ip6.arpa.
    330 NS 0.0.0.0.0.0.8.f.4.0.1.0.0.2.ip6.arpa.
    331 NS 0.0.0.0.0.0.0.0.8.f.4.0.1.0.0.2.ip6.arpa.
    332 PTR 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.f.4.0.1.0.0.2.ip6.arpa.
    333 __EOF
    334 for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
    335 if [ $ret != 0 ]; then echo_i "failed"; fi
    336 status=$((status+ret))
    337 
    338 n=$((n+1))
    339 echo_i "query for multiple label name skips after 7th label ($n)"
    340 ret=0
    341 $CLEANQL
    342 $RNDCCMD 10.53.0.6 flush
    343 $DIG $DIGOPTS more.icky.icky.icky.ptang.zoop.boing.good. @10.53.0.6 > dig.out.test$n
    344 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    345 grep "more.icky.icky.icky.ptang.zoop.boing.good. 1 IN	A 192.0.2.2" dig.out.test$n > /dev/null || ret=1
    346 sleep 1
    347 sort ans2/query.log > ans2/query.log.sorted
    348 cat << __EOF | $DIFF ans2/query.log.sorted - > /dev/null || ret=1
    349 ADDR a.bit.longer.ns.name.good.
    350 ADDR a.bit.longer.ns.name.good.
    351 ADDR ns2.good.
    352 ADDR ns3.good.
    353 ADDR ns3.good.
    354 NS boing.good.
    355 NS good.
    356 NS zoop.boing.good.
    357 __EOF
    358 cat << __EOF | $DIFF ans3/query.log - > /dev/null || ret=1
    359 NS zoop.boing.good.
    360 NS ptang.zoop.boing.good.
    361 NS icky.ptang.zoop.boing.good.
    362 __EOF
    363 # There's no NS icky.icky.icky.ptang.zoop.boing.good. query - we skipped it.
    364 cat << __EOF | $DIFF ans4/query.log - > /dev/null || ret=1
    365 NS icky.ptang.zoop.boing.good.
    366 NS icky.icky.ptang.zoop.boing.good.
    367 ADDR more.icky.icky.icky.ptang.zoop.boing.good.
    368 __EOF
    369 for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
    370 if [ $ret != 0 ]; then echo_i "failed"; fi
    371 status=$((status+ret))
    372 
    373 n=$((n+1))
    374 echo_i "qname minimization is disabled when forwarding ($n)"
    375 ret=0
    376 $CLEANQL
    377 $RNDCCMD 10.53.0.7 flush
    378 $DIG $DIGOPTS a.bit.longer.ns.name.fwd. @10.53.0.7 > dig.out.test$n
    379 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    380 grep "a.bit.longer.ns.name.fwd. 1	IN	A	10.53.0.4" dig.out.test$n >/dev/null || ret=1
    381 sleep 1
    382 cat << __EOF | $DIFF ans2/query.log - > /dev/null || ret=1
    383 ADDR a.bit.longer.ns.name.fwd.
    384 __EOF
    385 for ans in ans2; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
    386 if [ $ret != 0 ]; then echo_i "failed"; fi
    387 status=$((status+ret))
    388 
    389 n=$((n+1))
    390 echo_i "qname minimization resolves unusual ip6.arpa. names ($n)"
    391 ret=0
    392 $CLEANQL
    393 $DIG $DIGOPTS test1.test2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.9.0.9.4.1.1.1.1.8.2.6.0.1.0.0.2.ip6.arpa. txt @10.53.0.7 > dig.out.test$n 2>&1
    394 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    395 # Expected output in dig.out.test$n:
    396 # ;; ANSWER SECTION:
    397 # test1.test2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.9.0.9.4.1.1.1.1.8.2.6.0.1.0.0.2.ip6.arpa. 1 IN TXT "long_ip6_name"
    398 grep 'ip6\.arpa.*TXT.*long_ip6_name' dig.out.test$n > /dev/null || ret=1
    399 for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
    400 if [ $ret != 0 ]; then echo_i "failed"; fi
    401 status=$((status+ret))
    402 
    403 # Below are test cases for GL #2665: The QNAME minimization (if enabled) should
    404 # also occur on the second query, after the RRsets have expired from cache.
    405 # BIND will still have the entries in cache, but marked stale. These stale
    406 # entries should not prevent the resolver from minimizing the QNAME.
    407 # We query for the test domain a.b.stale. in all cases (QNAME minimization off,
    408 # strict mode, and relaxed mode) and expect it to behave the same the second
    409 # time when we have a stale delegation structure in cache.
    410 n=$((n+1))
    411 echo_i "query for .stale is not minimized when qname-minimization is off ($n)"
    412 ret=0
    413 $CLEANQL
    414 $RNDCCMD 10.53.0.5 flush
    415 $DIG $DIGOPTS @10.53.0.5 txt a.b.stale. > dig.out.test$n
    416 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    417 grep "a\.b\.stale\..*1.*IN.*TXT.*peekaboo" dig.out.test$n > /dev/null || ret=1
    418 sleep 1
    419 echo "TXT a.b.stale." | $DIFF ans2/query.log - > /dev/null || ret=1
    420 echo "TXT a.b.stale." | $DIFF ans3/query.log - > /dev/null || ret=1
    421 test -f  ans4/query.log && ret=1
    422 for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
    423 if [ $ret != 0 ]; then echo_i "failed"; fi
    424 status=$((status+ret))
    425 
    426 n=$((n+1))
    427 echo_i "query for .stale is properly minimized when qname-minimization is in strict mode ($n)"
    428 ret=0
    429 $CLEANQL
    430 $RNDCCMD 10.53.0.6 flush
    431 $DIG $DIGOPTS @10.53.0.6 txt a.b.stale. > dig.out.test$n
    432 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    433 grep "a\.b\.stale\..*1.*IN.*TXT.*hooray" dig.out.test$n > /dev/null || ret=1
    434 sleep 1
    435 sort ans2/query.log > ans2/query.log.sorted
    436 cat << __EOF | $DIFF ans2/query.log.sorted - > /dev/null || ret=1
    437 ADDR ns.b.stale.
    438 ADDR ns2.stale.
    439 NS b.stale.
    440 NS stale.
    441 __EOF
    442 test -f  ans3/query.log && ret=1
    443 sort ans4/query.log > ans4/query.log.sorted
    444 cat << __EOF | $DIFF ans4/query.log.sorted - > /dev/null || ret=1
    445 ADDR ns.b.stale.
    446 NS b.stale.
    447 TXT a.b.stale.
    448 __EOF
    449 for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
    450 if [ $ret != 0 ]; then echo_i "failed"; fi
    451 status=$((status+ret))
    452 
    453 n=$((n+1))
    454 echo_i "query for .stale is properly minimized when qname-minimization is in relaxed mode ($n)"
    455 ret=0
    456 $CLEANQL
    457 $RNDCCMD 10.53.0.7 flush
    458 $DIG $DIGOPTS @10.53.0.7 txt a.b.stale. > dig.out.test$n
    459 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    460 grep "a\.b\.stale\..*1.*IN.*TXT.*hooray" dig.out.test$n > /dev/null || ret=1
    461 sleep 1
    462 sort ans2/query.log > ans2/query.log.sorted
    463 cat << __EOF | $DIFF ans2/query.log.sorted - > /dev/null || ret=1
    464 ADDR _.b.stale.
    465 ADDR ns.b.stale.
    466 ADDR ns2.stale.
    467 __EOF
    468 test -f  ans3/query.log && ret=1
    469 sort ans4/query.log > ans4/query.log.sorted
    470 cat << __EOF | $DIFF ans4/query.log.sorted - > /dev/null || ret=1
    471 ADDR ns.b.stale.
    472 TXT a.b.stale.
    473 __EOF
    474 for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
    475 if [ $ret != 0 ]; then echo_i "failed"; fi
    476 status=$((status+ret))
    477 
    478 echo_i "sleep 2, allow entries in cache to go stale"
    479 sleep 2
    480 
    481 n=$((n+1))
    482 echo_i "query for .stale is not minimized when qname-minimization is off (stale cache) ($n)"
    483 ret=0
    484 $CLEANQL
    485 $DIG $DIGOPTS @10.53.0.5 txt a.b.stale. > dig.out.test$n
    486 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    487 grep "a\.b\.stale\..*1.*IN.*TXT.*peekaboo" dig.out.test$n > /dev/null || ret=1
    488 sleep 1
    489 echo "TXT a.b.stale." | $DIFF ans2/query.log - > /dev/null || ret=1
    490 echo "TXT a.b.stale." | $DIFF ans3/query.log - > /dev/null || ret=1
    491 test -f  ans4/query.log && ret=1
    492 for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
    493 if [ $ret != 0 ]; then echo_i "failed"; fi
    494 status=$((status+ret))
    495 
    496 n=$((n+1))
    497 echo_i "query for .stale is properly minimized when qname-minimization is in strict mode (stale cache) ($n)"
    498 ret=0
    499 $CLEANQL
    500 $DIG $DIGOPTS @10.53.0.6 txt a.b.stale. > dig.out.test$n
    501 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    502 grep "a\.b\.stale\..*1.*IN.*TXT.*hooray" dig.out.test$n > /dev/null || ret=1
    503 sleep 1
    504 sort ans2/query.log > ans2/query.log.sorted
    505 cat << __EOF | $DIFF ans2/query.log.sorted - > /dev/null || ret=1
    506 NS b.stale.
    507 NS stale.
    508 __EOF
    509 test -f  ans3/query.log && ret=1
    510 sort ans4/query.log > ans4/query.log.sorted
    511 cat << __EOF | $DIFF ans4/query.log.sorted - > /dev/null || ret=1
    512 NS b.stale.
    513 TXT a.b.stale.
    514 __EOF
    515 for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
    516 if [ $ret != 0 ]; then echo_i "failed"; fi
    517 status=$((status+ret))
    518 
    519 n=$((n+1))
    520 echo_i "query for .stale is properly minimized when qname-minimization is in relaxed mode (stale cache) ($n)"
    521 ret=0
    522 $CLEANQL
    523 $DIG $DIGOPTS @10.53.0.7 txt a.b.stale. > dig.out.test$n
    524 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
    525 grep "a\.b\.stale\..*1.*IN.*TXT.*hooray" dig.out.test$n > /dev/null || ret=1
    526 sleep 1
    527 sort ans2/query.log > ans2/query.log.sorted
    528 cat << __EOF | $DIFF ans2/query.log.sorted - > /dev/null || ret=1
    529 ADDR _.b.stale.
    530 __EOF
    531 test -f  ans3/query.log && ret=1
    532 sort ans4/query.log > ans4/query.log.sorted
    533 cat << __EOF | $DIFF ans4/query.log.sorted - > /dev/null || ret=1
    534 TXT a.b.stale.
    535 __EOF
    536 for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
    537 if [ $ret != 0 ]; then echo_i "failed"; fi
    538 status=$((status+ret))
    539 
    540 echo_i "exit status: $status"
    541 [ $status -eq 0 ] || exit 1
    542