Home | History | Annotate | Line # | Download | only in dnstap
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 https://mozilla.org/MPL/2.0/.
      8 #
      9 # See the COPYRIGHT file distributed with this work for additional
     10 # information regarding copyright ownership.
     11 
     12 SYSTEMTESTTOP=..
     13 . $SYSTEMTESTTOP/conf.sh
     14 
     15 DIGOPTS="+short -p ${PORT}"
     16 RNDCCMD="$RNDC -p ${CONTROLPORT} -c ../common/rndc.conf"
     17 
     18 status=0
     19 
     20 # dnstap_data_ready <fstrm_capture_PID> <capture_file> <min_file_size>
     21 # Flushes capture_file and checks wheter its size is >= min_file_size.
     22 dnstap_data_ready() {
     23 	# Process id of running fstrm_capture.
     24 	fstrm_capture_pid=$1
     25 	# Output file provided to fstrm_capture via -w switch.
     26 	capture_file=$2
     27 	# Minimum expected file size.
     28 	min_size_expected=$3
     29 
     30 	kill -HUP $fstrm_capture_pid
     31 	file_size=`wc -c < "$capture_file" | tr -d ' '`
     32 	if [ $file_size -lt $min_size_expected ]; then
     33 		return 1
     34 	fi
     35 }
     36 
     37 
     38 for bad in bad-*.conf
     39 do
     40 	ret=0
     41 	echo_i "checking that named-checkconf detects error in $bad"
     42 	$CHECKCONF $bad > /dev/null 2>&1
     43 	if [ $? != 1 ]; then echo_i "failed"; ret=1; fi
     44 	status=`expr $status + $ret`
     45 done
     46 
     47 for good in good-*.conf
     48 do
     49 	ret=0
     50 	echo_i "checking that named-checkconf detects no error in $good"
     51 	$CHECKCONF $good > /dev/null 2>&1
     52 	if [ $? != 0 ]; then echo_i "failed"; ret=1; fi
     53 	status=`expr $status + $ret`
     54 done
     55 
     56 echo_i "wait for servers to finish loading"
     57 ret=0
     58 wait_for_log 20 "all zones loaded" ns1/named.run || ret=1
     59 wait_for_log 20 "all zones loaded" ns2/named.run || ret=1
     60 wait_for_log 20 "all zones loaded" ns3/named.run || ret=1
     61 wait_for_log 20 "all zones loaded" ns4/named.run || ret=1
     62 if [ $ret != 0 ]; then echo_i "failed"; fi
     63 status=`expr $status + $ret`
     64 
     65 # both the 'a.example/A' lookup and the './NS' lookup to ns1
     66 # need tocomplete before reopening/rolling for the counts to
     67 # be correct.
     68 
     69 $DIG $DIGOPTS @10.53.0.3 a.example > dig.out
     70 wait_for_log 20 "(./NS): query_reset" ns1/named.run || true
     71 
     72 # check three different dnstap reopen/roll methods:
     73 # ns1: dnstap-reopen; ns2: dnstap -reopen; ns3: dnstap -roll
     74 mv ns1/dnstap.out ns1/dnstap.out.save
     75 mv ns2/dnstap.out ns2/dnstap.out.save
     76 
     77 if [ -n "$FSTRM_CAPTURE" ] ; then
     78 	$FSTRM_CAPTURE -t protobuf:dnstap.Dnstap -u ns4/dnstap.out \
     79 		-w dnstap.out > fstrm_capture.out 2>&1 &
     80 	fstrm_capture_pid=$!
     81 fi
     82 
     83 $RNDCCMD -s 10.53.0.1 dnstap-reopen | sed 's/^/ns1 /' | cat_i
     84 $RNDCCMD -s 10.53.0.2 dnstap -reopen | sed 's/^/ns2 /' | cat_i
     85 $RNDCCMD -s 10.53.0.3 dnstap -roll | sed 's/^/ns3 /' | cat_i
     86 $RNDCCMD -s 10.53.0.4 dnstap -reopen | sed 's/^/ns4 /' | cat_i
     87 
     88 $DIG $DIGOPTS @10.53.0.3 a.example > dig.out
     89 
     90 # send an UPDATE to ns2
     91 $NSUPDATE <<- EOF
     92 server 10.53.0.2 ${PORT}
     93 zone example
     94 update add b.example 3600 in a 10.10.10.10
     95 send
     96 EOF
     97 
     98 # XXX: file output should be flushed once a second according
     99 # to the libfstrm source, but it doesn't seem to happen until
    100 # enough data has accumulated. to get all the output, we stop
    101 # the name servers, forcing a flush on shutdown. it would be
    102 # nice to find a better way to do this.
    103 $RNDCCMD -s 10.53.0.1 stop | sed 's/^/ns1 /' | cat_i
    104 $RNDCCMD -s 10.53.0.2 stop | sed 's/^/ns2 /' | cat_i
    105 $RNDCCMD -s 10.53.0.3 stop | sed 's/^/ns3 /' | cat_i
    106 
    107 sleep 1
    108 
    109 echo_i "checking initial message counts"
    110 
    111 udp1=`$DNSTAPREAD ns1/dnstap.out.save | grep "UDP " | wc -l`
    112 tcp1=`$DNSTAPREAD ns1/dnstap.out.save | grep "TCP " | wc -l`
    113 aq1=`$DNSTAPREAD ns1/dnstap.out.save | grep "AQ " | wc -l`
    114 ar1=`$DNSTAPREAD ns1/dnstap.out.save | grep "AR " | wc -l`
    115 cq1=`$DNSTAPREAD ns1/dnstap.out.save | grep "CQ " | wc -l`
    116 cr1=`$DNSTAPREAD ns1/dnstap.out.save | grep "CR " | wc -l`
    117 rq1=`$DNSTAPREAD ns1/dnstap.out.save | grep "RQ " | wc -l`
    118 rr1=`$DNSTAPREAD ns1/dnstap.out.save | grep "RR " | wc -l`
    119 uq1=`$DNSTAPREAD ns1/dnstap.out.save | grep "UQ " | wc -l`
    120 ur1=`$DNSTAPREAD ns1/dnstap.out.save | grep "UR " | wc -l`
    121 
    122 udp2=`$DNSTAPREAD ns2/dnstap.out.save | grep "UDP " | wc -l`
    123 tcp2=`$DNSTAPREAD ns2/dnstap.out.save | grep "TCP " | wc -l`
    124 aq2=`$DNSTAPREAD ns2/dnstap.out.save | grep "AQ " | wc -l`
    125 ar2=`$DNSTAPREAD ns2/dnstap.out.save | grep "AR " | wc -l`
    126 cq2=`$DNSTAPREAD ns2/dnstap.out.save | grep "CQ " | wc -l`
    127 cr2=`$DNSTAPREAD ns2/dnstap.out.save | grep "CR " | wc -l`
    128 rq2=`$DNSTAPREAD ns2/dnstap.out.save | grep "RQ " | wc -l`
    129 rr2=`$DNSTAPREAD ns2/dnstap.out.save | grep "RR " | wc -l`
    130 uq2=`$DNSTAPREAD ns2/dnstap.out.save | grep "UQ " | wc -l`
    131 ur2=`$DNSTAPREAD ns2/dnstap.out.save | grep "UR " | wc -l`
    132 
    133 mv ns3/dnstap.out.0 ns3/dnstap.out.save
    134 udp3=`$DNSTAPREAD ns3/dnstap.out.save | grep "UDP " | wc -l`
    135 tcp3=`$DNSTAPREAD ns3/dnstap.out.save | grep "TCP " | wc -l`
    136 aq3=`$DNSTAPREAD ns3/dnstap.out.save | grep "AQ " | wc -l`
    137 ar3=`$DNSTAPREAD ns3/dnstap.out.save | grep "AR " | wc -l`
    138 cq3=`$DNSTAPREAD ns3/dnstap.out.save | grep "CQ " | wc -l`
    139 cr3=`$DNSTAPREAD ns3/dnstap.out.save | grep "CR " | wc -l`
    140 rq3=`$DNSTAPREAD ns3/dnstap.out.save | grep "RQ " | wc -l`
    141 rr3=`$DNSTAPREAD ns3/dnstap.out.save | grep "RR " | wc -l`
    142 uq3=`$DNSTAPREAD ns3/dnstap.out.save | grep "UQ " | wc -l`
    143 ur3=`$DNSTAPREAD ns3/dnstap.out.save | grep "UR " | wc -l`
    144 
    145 echo_i "checking UDP message counts"
    146 ret=0
    147 [ $udp1 -eq 0 ] || {
    148 	echo_i "ns1 $udp1 expected 0"
    149 	ret=1
    150 }
    151 [ $udp2 -eq 2 ] || {
    152 	echo_i "ns2 $udp2 expected 2"
    153 	ret=1
    154 }
    155 [ $udp3 -eq 4 ] || {
    156 	echo_i "ns3 $udp3 expected 4"
    157 	ret=1
    158 }
    159 if [ $ret != 0 ]; then echo_i "failed"; fi
    160 status=`expr $status + $ret`
    161 
    162 echo_i "checking TCP message counts"
    163 ret=0
    164 [ $tcp1 -eq 6 ] || {
    165 	echo_i "ns1 $tcp1 expected 6"
    166 	ret=1
    167 }
    168 [ $tcp2 -eq 2 ] || {
    169 	echo_i "ns2 $tcp2 expected 2"
    170 	ret=1
    171 }
    172 [ $tcp3 -eq 6 ] || {
    173 	echo_i "ns3 $tcp3 expected 6"
    174 	ret=1
    175 }
    176 if [ $ret != 0 ]; then echo_i "failed"; fi
    177 status=`expr $status + $ret`
    178 
    179 echo_i "checking AUTH_QUERY message counts"
    180 ret=0
    181 [ $aq1 -eq 3 ] || {
    182 	echo_i "ns1 $aq1 exepcted 3"
    183 	ret=1
    184 }
    185 [ $aq2 -eq 2 ] || {
    186 	echo_i "ns2 $aq2 expected 2"
    187 	ret=1
    188 }
    189 [ $aq3 -eq 1 ] || {
    190 	echo_i "ns3 $aq3 expected 1"
    191 	ret=1
    192 }
    193 if [ $ret != 0 ]; then echo_i "failed"; fi
    194 status=`expr $status + $ret`
    195 
    196 echo_i "checking AUTH_RESPONSE message counts"
    197 ret=0
    198 [ $ar1 -eq 2 ] || {
    199 	echo_i "ns1 $ar1 expected 2"
    200 	ret=1
    201 }
    202 [ $ar2 -eq 1 ] || {
    203 	echo_i "ns2 $ar2 expected 1"
    204 	ret=1
    205 }
    206 [ $ar3 -eq 0 ] || {
    207 	echo_i "ns3 $ar3 expected 0"
    208 	ret=1
    209 }
    210 if [ $ret != 0 ]; then echo_i "failed"; fi
    211 status=`expr $status + $ret`
    212 
    213 echo_i "checking CLIENT_QUERY message counts"
    214 ret=0
    215 [ $cq1 -eq 0 ] || {
    216 	echo_i "ns1 $cq1 expected 0"
    217 	ret=1
    218 }
    219 [ $cq2 -eq 0 ] || {
    220 	echo_i "ns2 $cq2 expected 0"
    221 	ret=1
    222 }
    223 [ $cq3 -eq 1 ] || {
    224 	echo_i "ns3 $cq3 expected 1"
    225 	ret=1
    226 }
    227 if [ $ret != 0 ]; then echo_i "failed"; fi
    228 status=`expr $status + $ret`
    229 
    230 echo_i "checking CLIENT_RESPONSE message counts"
    231 ret=0
    232 [ $cr1 -eq 1 ] || {
    233 	echo_i "ns1 $cr1 expected 1"
    234 	ret=1
    235 }
    236 [ $cr2 -eq 1 ] || {
    237 	echo_i "ns2 $cr2 expected 1"
    238 	ret=1
    239 }
    240 [ $cr3 -eq 2 ] || {
    241 	echo_i "ns3 $cr3 expected 2"
    242 	ret=1
    243 }
    244 if [ $ret != 0 ]; then echo_i "failed"; fi
    245 status=`expr $status + $ret`
    246 
    247 echo_i "checking RESOLVER_QUERY message counts"
    248 ret=0
    249 [ $rq1 -eq 0 ] || {
    250 	echo_i "ns1 $rq1 expected 0"
    251 	ret=1
    252 }
    253 [ $rq2 -eq 0 ] || {
    254 	echo_i "ns2 $rq2 expected 0"
    255 	ret=1
    256 }
    257 [ $rq3 -eq 3 ] || {
    258 	echo_i "ns3 $rq3 expected 3"
    259 	ret=1
    260 }
    261 if [ $ret != 0 ]; then echo_i "failed"; fi
    262 status=`expr $status + $ret`
    263 
    264 echo_i "checking RESOLVER_RESPONSE message counts"
    265 ret=0
    266 [ $rr1 -eq 0 ] || {
    267 	echo_i "ns1 $rr1 expected 0"
    268 	ret=1
    269 }
    270 [ $rr2 -eq 0 ] || {
    271 	echo_i "ns2 $rr2 expected 0"
    272 	ret=1
    273 }
    274 [ $rr3 -eq 3 ] || {
    275 	echo_i "ns3 $rr3 expected 3"
    276 	ret=1
    277 }
    278 if [ $ret != 0 ]; then echo_i "failed"; fi
    279 status=`expr $status + $ret`
    280 
    281 echo_i "checking UPDATE_QUERY message counts"
    282 ret=0
    283 [ $uq1 -eq 0 ] || {
    284 	echo_i "ns1 $uq1 expected 0"
    285 	ret=1
    286 }
    287 [ $uq2 -eq 0 ] || {
    288 	echo_i "ns2 $uq2 expected 0"
    289 	ret=1
    290 }
    291 [ $uq3 -eq 0 ] || {
    292 	echo_i "ns3 $uq3 expected 0"
    293 	ret=1
    294 }
    295 if [ $ret != 0 ]; then echo_i "failed"; fi
    296 status=`expr $status + $ret`
    297 
    298 echo_i "checking UPDATE_RESPONSE message counts"
    299 ret=0
    300 [ $ur1 -eq 0 ] || {
    301 	echo_i "ns1 $ur1 expected 0"
    302 	ret=1
    303 }
    304 [ $ur2 -eq 0 ] || {
    305 	echo_i "ns2 $ur2 expected 0"
    306 	ret=1
    307 }
    308 [ $ur3 -eq 0 ] || {
    309 	echo_i "ns3 $ur3 expected 0"
    310 	ret=1
    311 }
    312 if [ $ret != 0 ]; then echo_i "failed"; fi
    313 status=`expr $status + $ret`
    314 
    315 echo_i "checking reopened message counts"
    316 
    317 udp1=`$DNSTAPREAD ns1/dnstap.out | grep "UDP " | wc -l`
    318 tcp1=`$DNSTAPREAD ns1/dnstap.out | grep "TCP " | wc -l`
    319 aq1=`$DNSTAPREAD ns1/dnstap.out | grep "AQ " | wc -l`
    320 ar1=`$DNSTAPREAD ns1/dnstap.out | grep "AR " | wc -l`
    321 cq1=`$DNSTAPREAD ns1/dnstap.out | grep "CQ " | wc -l`
    322 cr1=`$DNSTAPREAD ns1/dnstap.out | grep "CR " | wc -l`
    323 rq1=`$DNSTAPREAD ns1/dnstap.out | grep "RQ " | wc -l`
    324 rr1=`$DNSTAPREAD ns1/dnstap.out | grep "RR " | wc -l`
    325 uq1=`$DNSTAPREAD ns1/dnstap.out | grep "UQ " | wc -l`
    326 ur1=`$DNSTAPREAD ns1/dnstap.out | grep "UR " | wc -l`
    327 
    328 udp2=`$DNSTAPREAD ns2/dnstap.out | grep "UDP " | wc -l`
    329 tcp2=`$DNSTAPREAD ns2/dnstap.out | grep "TCP " | wc -l`
    330 aq2=`$DNSTAPREAD ns2/dnstap.out | grep "AQ " | wc -l`
    331 ar2=`$DNSTAPREAD ns2/dnstap.out | grep "AR " | wc -l`
    332 cq2=`$DNSTAPREAD ns2/dnstap.out | grep "CQ " | wc -l`
    333 cr2=`$DNSTAPREAD ns2/dnstap.out | grep "CR " | wc -l`
    334 rq2=`$DNSTAPREAD ns2/dnstap.out | grep "RQ " | wc -l`
    335 rr2=`$DNSTAPREAD ns2/dnstap.out | grep "RR " | wc -l`
    336 uq2=`$DNSTAPREAD ns2/dnstap.out | grep "UQ " | wc -l`
    337 ur2=`$DNSTAPREAD ns2/dnstap.out | grep "UR " | wc -l`
    338 
    339 udp3=`$DNSTAPREAD ns3/dnstap.out | grep "UDP " | wc -l`
    340 tcp3=`$DNSTAPREAD ns3/dnstap.out | grep "TCP " | wc -l`
    341 aq3=`$DNSTAPREAD ns3/dnstap.out | grep "AQ " | wc -l`
    342 ar3=`$DNSTAPREAD ns3/dnstap.out | grep "AR " | wc -l`
    343 cq3=`$DNSTAPREAD ns3/dnstap.out | grep "CQ " | wc -l`
    344 cr3=`$DNSTAPREAD ns3/dnstap.out | grep "CR " | wc -l`
    345 rq3=`$DNSTAPREAD ns3/dnstap.out | grep "RQ " | wc -l`
    346 rr3=`$DNSTAPREAD ns3/dnstap.out | grep "RR " | wc -l`
    347 uq3=`$DNSTAPREAD ns3/dnstap.out | grep "UQ " | wc -l`
    348 ur3=`$DNSTAPREAD ns3/dnstap.out | grep "UR " | wc -l`
    349 
    350 echo_i "checking UDP message counts"
    351 ret=0
    352 [ $udp1 -eq 0 ] || {
    353 	echo_i "ns1 $udp1 expected 0"
    354 	ret=1
    355 }
    356 [ $udp2 -eq 2 ] || {
    357 	echo_i "ns2 $udp2 expected 2"
    358 	ret=1
    359 }
    360 [ $udp3 -eq 2 ] || {
    361 	echo_i "ns3 $udp3 expected 2"
    362 	ret=1
    363 }
    364 if [ $ret != 0 ]; then echo_i "failed"; fi
    365 status=`expr $status + $ret`
    366 
    367 echo_i "checking TCP message counts"
    368 ret=0
    369 [ $tcp1 -eq 0 ] || {
    370 	echo_i "ns1 $tcp1 expected 0"
    371 	ret=1
    372 }
    373 [ $tcp2 -eq 0 ] || {
    374 	echo_i "ns2 $tcp2 expected 0"
    375 	ret=1
    376 }
    377 [ $tcp3 -eq 0 ] || {
    378 	echo_i "ns3 $tcp3 expected 0"
    379 	ret=1
    380 }
    381 if [ $ret != 0 ]; then echo_i "failed"; fi
    382 status=`expr $status + $ret`
    383 
    384 echo_i "checking AUTH_QUERY message counts"
    385 ret=0
    386 [ $aq1 -eq 0 ] || {
    387 	echo_i "ns1 $aq1 exepcted 0"
    388 	ret=1
    389 }
    390 [ $aq2 -eq 0 ] || {
    391 	echo_i "ns2 $aq2 expected 0"
    392 	ret=1
    393 }
    394 [ $aq3 -eq 0 ] || {
    395 	echo_i "ns3 $aq3 expected 0"
    396 	ret=1
    397 }
    398 if [ $ret != 0 ]; then echo_i "failed"; fi
    399 status=`expr $status + $ret`
    400 
    401 echo_i "checking AUTH_RESPONSE message counts"
    402 ret=0
    403 [ $ar1 -eq 0 ] || {
    404 	echo_i "ns1 $ar1 expected 0"
    405 	ret=1
    406 }
    407 [ $ar2 -eq 0 ] || {
    408 	echo_i "ns2 $ar2 expected 0"
    409 	ret=1
    410 }
    411 [ $ar3 -eq 0 ] || {
    412 	echo_i "ns3 $ar3 expected 0"
    413 	ret=1
    414 }
    415 if [ $ret != 0 ]; then echo_i "failed"; fi
    416 status=`expr $status + $ret`
    417 
    418 echo_i "checking CLIENT_QUERY message counts"
    419 ret=0
    420 [ $cq1 -eq 0 ] || {
    421 	echo_i "ns1 $cq1 expected 0"
    422 	ret=1
    423 }
    424 [ $cq2 -eq 0 ] || {
    425 	echo_i "ns2 $cq2 expected 0"
    426 	ret=1
    427 }
    428 [ $cq3 -eq 1 ] || {
    429 	echo_i "ns3 $cq3 expected 1"
    430 	ret=1
    431 }
    432 if [ $ret != 0 ]; then echo_i "failed"; fi
    433 status=`expr $status + $ret`
    434 
    435 echo_i "checking CLIENT_RESPONSE message counts"
    436 ret=0
    437 [ $cr1 -eq 0 ] || {
    438 	echo_i "ns1 $cr1 expected 0"
    439 	ret=1
    440 }
    441 [ $cr2 -eq 0 ] || {
    442 	echo_i "ns2 $cr2 expected 0"
    443 	ret=1
    444 }
    445 [ $cr3 -eq 1 ] || {
    446 	echo_i "ns3 $cr3 expected 1"
    447 	ret=1
    448 }
    449 if [ $ret != 0 ]; then echo_i "failed"; fi
    450 status=`expr $status + $ret`
    451 
    452 echo_i "checking RESOLVER_QUERY message counts"
    453 ret=0
    454 [ $rq1 -eq 0 ] || {
    455 	echo_i "ns1 $rq1 expected 0"
    456 	ret=1
    457 }
    458 [ $rq2 -eq 0 ] || {
    459 	echo_i "ns2 $rq2 expected 0"
    460 	ret=1
    461 }
    462 [ $rq3 -eq 0 ] || {
    463 	echo_i "ns3 $rq3 expected 0"
    464 	ret=1
    465 }
    466 if [ $ret != 0 ]; then echo_i "failed"; fi
    467 status=`expr $status + $ret`
    468 
    469 echo_i "checking RESOLVER_RESPONSE message counts"
    470 ret=0
    471 [ $rr1 -eq 0 ] || {
    472 	echo_i "ns1 $rr1 expected 0"
    473 	ret=1
    474 }
    475 [ $rr2 -eq 0 ] || {
    476 	echo_i "ns2 $rr2 expected 0"
    477 	ret=1
    478 }
    479 [ $rr3 -eq 0 ] || {
    480 	echo_i "ns3 $rr3 expected 0"
    481 	ret=1
    482 }
    483 if [ $ret != 0 ]; then echo_i "failed"; fi
    484 status=`expr $status + $ret`
    485 
    486 echo_i "checking UPDATE_QUERY message counts"
    487 ret=0
    488 [ $uq1 -eq 0 ] || {
    489 	echo_i "ns1 $uq1 expected 0"
    490 	ret=1
    491 }
    492 [ $uq2 -eq 1 ] || {
    493 	echo_i "ns2 $uq2 expected 1"
    494 	ret=1
    495 }
    496 [ $uq3 -eq 0 ] || {
    497 	echo_i "ns3 $uq3 expected 0"
    498 	ret=1
    499 }
    500 if [ $ret != 0 ]; then echo_i "failed"; fi
    501 status=`expr $status + $ret`
    502 
    503 echo_i "checking UPDATE_RESPONSE message counts"
    504 ret=0
    505 [ $ur1 -eq 0 ] || {
    506 	echo_i "ns1 $ur1 expected 0"
    507 	ret=1
    508 }
    509 [ $ur2 -eq 1 ] || {
    510 	echo_i "ns2 $ur2 expected 1"
    511 	ret=1
    512 }
    513 [ $ur3 -eq 0 ] || {
    514 	echo_i "ns3 $ur3 expected 0"
    515 	ret=1
    516 }
    517 if [ $ret != 0 ]; then echo_i "failed"; fi
    518 status=`expr $status + $ret`
    519 
    520 HAS_PYYAML=0
    521 if [ -n "$PYTHON" ] ; then
    522 	$PYTHON -c "import yaml" 2> /dev/null && HAS_PYYAML=1
    523 fi
    524 
    525 if [ $HAS_PYYAML -ne 0 ] ; then
    526 	echo_i "checking dnstap-read YAML output"
    527 	ret=0
    528         {
    529 	  $PYTHON ydump.py "$DNSTAPREAD" "ns3/dnstap.out.save" > ydump.out || ret=1
    530         } | cat_i
    531 	if [ $ret != 0 ]; then echo_i "failed"; fi
    532 	status=`expr $status + $ret`
    533 fi
    534 
    535 echo_i "checking dnstap-read hex output"
    536 ret=0
    537 hex=`$DNSTAPREAD -x ns3/dnstap.out | tail -1`
    538 echo $hex | $WIRETEST > dnstap.hex
    539 grep 'status: NOERROR' dnstap.hex > /dev/null 2>&1 || ret=1
    540 grep 'ANSWER: 3, AUTHORITY: 1' dnstap.hex > /dev/null 2>&1 || ret=1
    541 if [ $ret != 0 ]; then echo_i "failed"; fi
    542 status=`expr $status + $ret`
    543 
    544 if [ -n "$FSTRM_CAPTURE" ] ; then
    545 	$DIG $DIGOPTS @10.53.0.4 a.example > dig.out
    546 
    547 	# send an UPDATE to ns4
    548 	$NSUPDATE <<- EOF > nsupdate.out 2>&1
    549 	server 10.53.0.4 ${PORT}
    550 	zone example
    551 	update add b.example 3600 in a 10.10.10.10
    552 	send
    553 EOF
    554 	grep "update failed: NOTAUTH" nsupdate.out > /dev/null || ret=1
    555 
    556 	echo_i "checking unix socket message counts"
    557 	sleep 2
    558 	retry_quiet 5 dnstap_data_ready $fstrm_capture_pid dnstap.out 470
    559 	kill $fstrm_capture_pid
    560 	wait
    561 	udp4=`$DNSTAPREAD dnstap.out | grep "UDP " | wc -l`
    562 	tcp4=`$DNSTAPREAD dnstap.out | grep "TCP " | wc -l`
    563 	aq4=`$DNSTAPREAD dnstap.out | grep "AQ " | wc -l`
    564 	ar4=`$DNSTAPREAD dnstap.out | grep "AR " | wc -l`
    565 	cq4=`$DNSTAPREAD dnstap.out | grep "CQ " | wc -l`
    566 	cr4=`$DNSTAPREAD dnstap.out | grep "CR " | wc -l`
    567 	rq4=`$DNSTAPREAD dnstap.out | grep "RQ " | wc -l`
    568 	rr4=`$DNSTAPREAD dnstap.out | grep "RR " | wc -l`
    569 	uq4=`$DNSTAPREAD dnstap.out | grep "UQ " | wc -l`
    570 	ur4=`$DNSTAPREAD dnstap.out | grep "UR " | wc -l`
    571 
    572 	echo_i "checking UDP message counts"
    573 	ret=0
    574 	[ $udp4 -eq 4 ] || {
    575 		echo_i "ns4 $udp4 expected 4"
    576 		ret=1
    577 	}
    578 	if [ $ret != 0 ]; then echo_i "failed"; fi
    579 	status=`expr $status + $ret`
    580 
    581 	echo_i "checking TCP message counts"
    582 	ret=0
    583 	[ $tcp4 -eq 0 ] || {
    584 		echo_i "ns4 $tcp4 expected 0"
    585 		ret=1
    586 	}
    587 	if [ $ret != 0 ]; then echo_i "failed"; fi
    588 	status=`expr $status + $ret`
    589 
    590 	echo_i "checking AUTH_QUERY message counts"
    591 	ret=0
    592 	[ $aq4 -eq 0 ] || {
    593 		echo_i "ns4 $aq4 expected 0"
    594 		ret=1
    595 	}
    596 	if [ $ret != 0 ]; then echo_i "failed"; fi
    597 	status=`expr $status + $ret`
    598 
    599 	echo_i "checking AUTH_RESPONSE message counts"
    600 	ret=0
    601 	[ $ar4 -eq 0 ] || {
    602 		echo_i "ns4 $ar4 expected 0"
    603 		ret=1
    604 	}
    605 	if [ $ret != 0 ]; then echo_i "failed"; fi
    606 	status=`expr $status + $ret`
    607 
    608 	echo_i "checking CLIENT_QUERY message counts"
    609 	ret=0
    610 	[ $cq4 -eq 1 ] || {
    611 		echo_i "ns4 $cq4 expected 1"
    612 		ret=1
    613 	}
    614 	if [ $ret != 0 ]; then echo_i "failed"; fi
    615 	status=`expr $status + $ret`
    616 
    617 	echo_i "checking CLIENT_RESPONSE message counts"
    618 	ret=0
    619 	[ $cr4 -eq 1 ] || {
    620 		echo_i "ns4 $cr4 expected 1"
    621 		ret=1
    622 	}
    623 	if [ $ret != 0 ]; then echo_i "failed"; fi
    624 	status=`expr $status + $ret`
    625 
    626 	echo_i "checking RESOLVER_QUERY message counts"
    627 	ret=0
    628 	[ $rq4 -eq 0 ] || {
    629 		echo_i "ns4 $rq4 expected 0"
    630 		ret=1
    631 	}
    632 	if [ $ret != 0 ]; then echo_i "failed"; fi
    633 	status=`expr $status + $ret`
    634 
    635 	echo_i "checking RESOLVER_RESPONSE message counts"
    636 	ret=0
    637 	[ $rr4 -eq 0 ] || {
    638 		echo_i "ns4 $rr4 expected 0"
    639 		ret=1
    640 	}
    641 
    642 	echo_i "checking UPDATE_QUERY message counts"
    643 	ret=0
    644 	[ $uq4 -eq 1 ] || {
    645 		echo_i "ns4 $uq4 expected 1"
    646 		ret=1
    647 	}
    648 	if [ $ret != 0 ]; then echo_i "failed"; fi
    649 	status=`expr $status + $ret`
    650 
    651 	echo_i "checking UPDATE_RESPONSE message counts"
    652 	ret=0
    653 	[ $ur4 -eq 1 ] || {
    654 		echo_i "ns4 $ur4 expected 1"
    655 		ret=1
    656 	}
    657 	if [ $ret != 0 ]; then echo_i "failed"; fi
    658 	status=`expr $status + $ret`
    659 
    660 	mv dnstap.out dnstap.out.save
    661 
    662 	$FSTRM_CAPTURE -t protobuf:dnstap.Dnstap -u ns4/dnstap.out \
    663 		-w dnstap.out > fstrm_capture.out 2>&1 &
    664 	fstrm_capture_pid=$!
    665 	$RNDCCMD -s 10.53.0.4 dnstap -reopen | sed 's/^/ns4 /' | cat_i
    666 	$DIG $DIGOPTS @10.53.0.4 a.example > dig.out
    667 
    668 	echo_i "checking reopened unix socket message counts"
    669 	sleep 2
    670 	retry_quiet 5 dnstap_data_ready $fstrm_capture_pid dnstap.out 270
    671 	kill $fstrm_capture_pid
    672 	wait
    673 	udp4=`$DNSTAPREAD dnstap.out | grep "UDP " | wc -l`
    674 	tcp4=`$DNSTAPREAD dnstap.out | grep "TCP " | wc -l`
    675 	aq4=`$DNSTAPREAD dnstap.out | grep "AQ " | wc -l`
    676 	ar4=`$DNSTAPREAD dnstap.out | grep "AR " | wc -l`
    677 	cq4=`$DNSTAPREAD dnstap.out | grep "CQ " | wc -l`
    678 	cr4=`$DNSTAPREAD dnstap.out | grep "CR " | wc -l`
    679 	rq4=`$DNSTAPREAD dnstap.out | grep "RQ " | wc -l`
    680 	rr4=`$DNSTAPREAD dnstap.out | grep "RR " | wc -l`
    681 	uq4=`$DNSTAPREAD dnstap.out | grep "UQ " | wc -l`
    682 	ur4=`$DNSTAPREAD dnstap.out | grep "UR " | wc -l`
    683 
    684 	echo_i "checking UDP message counts"
    685 	ret=0
    686 	[ $udp4 -eq 2 ] || {
    687 		echo_i "ns4 $udp4 expected 2"
    688 		ret=1
    689 	}
    690 	if [ $ret != 0 ]; then echo_i "failed"; fi
    691 	status=`expr $status + $ret`
    692 
    693 	echo_i "checking TCP message counts"
    694 	ret=0
    695 	[ $tcp4 -eq 0 ] || {
    696 		echo_i "ns4 $tcp4 expected 0"
    697 		ret=1
    698 	}
    699 	if [ $ret != 0 ]; then echo_i "failed"; fi
    700 	status=`expr $status + $ret`
    701 
    702 	echo_i "checking AUTH_QUERY message counts"
    703 	ret=0
    704 	[ $aq4 -eq 0 ] || {
    705 		echo_i "ns4 $aq4 expected 0"
    706 		ret=1
    707 	}
    708 	if [ $ret != 0 ]; then echo_i "failed"; fi
    709 	status=`expr $status + $ret`
    710 
    711 	echo_i "checking AUTH_RESPONSE message counts"
    712 	ret=0
    713 	[ $ar4 -eq 0 ] || {
    714 		echo_i "ns4 $ar4 expected 0"
    715 		ret=1
    716 	}
    717 	if [ $ret != 0 ]; then echo_i "failed"; fi
    718 	status=`expr $status + $ret`
    719 
    720 	echo_i "checking CLIENT_QUERY message counts"
    721 	ret=0
    722 	[ $cq4 -eq 1 ] || {
    723 		echo_i "ns4 $cq4 expected 1"
    724 		ret=1
    725 	}
    726 	if [ $ret != 0 ]; then echo_i "failed"; fi
    727 	status=`expr $status + $ret`
    728 
    729 	echo_i "checking CLIENT_RESPONSE message counts"
    730 	ret=0
    731 	[ $cr4 -eq 1 ] || {
    732 		echo_i "ns4 $cr4 expected 1"
    733 		ret=1
    734 	}
    735 	if [ $ret != 0 ]; then echo_i "failed"; fi
    736 	status=`expr $status + $ret`
    737 
    738 	echo_i "checking RESOLVER_QUERY message counts"
    739 	ret=0
    740 	[ $rq4 -eq 0 ] || {
    741 		echo_i "ns4 $rq4 expected 0"
    742 		ret=1
    743 	}
    744 	if [ $ret != 0 ]; then echo_i "failed"; fi
    745 	status=`expr $status + $ret`
    746 
    747 	echo_i "checking RESOLVER_RESPONSE message counts"
    748 	ret=0
    749 	[ $rr4 -eq 0 ] || {
    750 		echo_i "ns4 $rr4 expected 0"
    751 		ret=1
    752 	}
    753 
    754 	echo_i "checking UPDATE_QUERY message counts"
    755 	ret=0
    756 	[ $uq4 -eq 0 ] || {
    757 		echo_i "ns4 $uq4 expected 0"
    758 		ret=1
    759 	}
    760 	if [ $ret != 0 ]; then echo_i "failed"; fi
    761 	status=`expr $status + $ret`
    762 
    763 	echo_i "checking UPDATE_RESPONSE message counts"
    764 	ret=0
    765 	[ $ur4 -eq 0 ] || {
    766 		echo_i "ns4 $ur4 expected 0"
    767 		ret=1
    768 	}
    769 	if [ $ret != 0 ]; then echo_i "failed"; fi
    770 	status=`expr $status + $ret`
    771 fi
    772 
    773 echo_i "checking large packet printing"
    774 ret=0
    775 # Expect one occurrence of "opcode: QUERY" below "reponse_message_data" and
    776 # another one below "response_message".
    777 lines=`$DNSTAPREAD -y large-answer.fstrm | grep -c "opcode: QUERY"`
    778 [ $lines -eq 2 ] || ret=1
    779 if [ $ret != 0 ]; then echo_i "failed"; fi
    780 status=`expr $status + $ret`
    781 
    782 test_dnstap_roll() (
    783     ip="$1"
    784     ns="$2"
    785     n="$3"
    786     $RNDCCMD -s "${ip}" dnstap -roll "${n}" | sed "s/^/${ns} /" | cat_i &&
    787     files=$(find "$ns" -name "dnstap.out.[0-9]" | wc -l) &&
    788     test "$files" -le "${n}" && test "$files" -ge "1"
    789 )
    790 
    791 echo_i "checking 'rndc -roll <value>' (no versions)"
    792 ret=0
    793 start_server --noclean --restart --port "${PORT}" dnstap ns3
    794 _repeat 5 test_dnstap_roll 10.53.0.3 ns3 3 || ret=1
    795 if [ $ret != 0 ]; then echo_i "failed"; fi
    796 status=$((status+ret))
    797 
    798 echo_i "checking 'rndc -roll <value>' (versions)"
    799 ret=0
    800 start_server --noclean --restart --port "${PORT}" dnstap ns2
    801 _repeat 5 test_dnstap_roll 10.53.0.2 ns2 3 || ret=1
    802 if [ $ret != 0 ]; then echo_i "failed"; fi
    803 status=$((status+ret))
    804 
    805 echo_i "exit status: $status"
    806 [ "$status" -eq 0 ] || exit 1
    807