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