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