1*00b67f09SDavid van Moolenbroek#!/bin/sh 2*00b67f09SDavid van Moolenbroek# 3*00b67f09SDavid van Moolenbroek# Copyright (C) 2004, 2007, 2011-2014 Internet Systems Consortium, Inc. ("ISC") 4*00b67f09SDavid van Moolenbroek# Copyright (C) 2001 Internet Software Consortium. 5*00b67f09SDavid van Moolenbroek# 6*00b67f09SDavid van Moolenbroek# Permission to use, copy, modify, and/or distribute this software for any 7*00b67f09SDavid van Moolenbroek# purpose with or without fee is hereby granted, provided that the above 8*00b67f09SDavid van Moolenbroek# copyright notice and this permission notice appear in all copies. 9*00b67f09SDavid van Moolenbroek# 10*00b67f09SDavid van Moolenbroek# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 11*00b67f09SDavid van Moolenbroek# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 12*00b67f09SDavid van Moolenbroek# AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 13*00b67f09SDavid van Moolenbroek# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 14*00b67f09SDavid van Moolenbroek# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 15*00b67f09SDavid van Moolenbroek# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 16*00b67f09SDavid van Moolenbroek# PERFORMANCE OF THIS SOFTWARE. 17*00b67f09SDavid van Moolenbroek 18*00b67f09SDavid van Moolenbroek# Id: tests.sh,v 1.10 2011/09/01 05:28:14 marka Exp 19*00b67f09SDavid van Moolenbroek 20*00b67f09SDavid van MoolenbroekSYSTEMTESTTOP=.. 21*00b67f09SDavid van Moolenbroek. $SYSTEMTESTTOP/conf.sh 22*00b67f09SDavid van Moolenbroek 23*00b67f09SDavid van Moolenbroekstatus=0 24*00b67f09SDavid van Moolenbroek 25*00b67f09SDavid van MoolenbroekRNDCOPTS="-c ../common/rndc.conf -s 10.53.0.2 -p 9953" 26*00b67f09SDavid van MoolenbroekDIGOPTS="+nosea +nocomm +nocmd +noquest +noadd +noauth +nocomm \ 27*00b67f09SDavid van Moolenbroek +nostat @10.53.0.2 -p 5300" 28*00b67f09SDavid van Moolenbroek 29*00b67f09SDavid van Moolenbroek# fill the cache with nodes from flushtest.example zone 30*00b67f09SDavid van Moolenbroekload_cache () { 31*00b67f09SDavid van Moolenbroek # empty all existing cache data 32*00b67f09SDavid van Moolenbroek $RNDC $RNDCOPTS flush 33*00b67f09SDavid van Moolenbroek 34*00b67f09SDavid van Moolenbroek # load the positive cache entries 35*00b67f09SDavid van Moolenbroek $DIG $DIGOPTS -f - << EOF > /dev/null 2>&1 36*00b67f09SDavid van Moolenbroektxt top1.flushtest.example 37*00b67f09SDavid van Moolenbroektxt second1.top1.flushtest.example 38*00b67f09SDavid van Moolenbroektxt third1.second1.top1.flushtest.example 39*00b67f09SDavid van Moolenbroektxt third2.second1.top1.flushtest.example 40*00b67f09SDavid van Moolenbroektxt second2.top1.flushtest.example 41*00b67f09SDavid van Moolenbroektxt second3.top1.flushtest.example 42*00b67f09SDavid van Moolenbroektxt second1.top2.flushtest.example 43*00b67f09SDavid van Moolenbroektxt second2.top2.flushtest.example 44*00b67f09SDavid van Moolenbroektxt second3.top2.flushtest.example 45*00b67f09SDavid van Moolenbroektxt top3.flushtest.example 46*00b67f09SDavid van Moolenbroektxt second1.top3.flushtest.example 47*00b67f09SDavid van Moolenbroektxt third1.second1.top3.flushtest.example 48*00b67f09SDavid van Moolenbroektxt third2.second1.top3.flushtest.example 49*00b67f09SDavid van Moolenbroektxt third1.second2.top3.flushtest.example 50*00b67f09SDavid van Moolenbroektxt third2.second2.top3.flushtest.example 51*00b67f09SDavid van Moolenbroektxt second3.top3.flushtest.example 52*00b67f09SDavid van MoolenbroekEOF 53*00b67f09SDavid van Moolenbroek 54*00b67f09SDavid van Moolenbroek # load the negative cache entries 55*00b67f09SDavid van Moolenbroek # nxrrset: 56*00b67f09SDavid van Moolenbroek $DIG $DIGOPTS a third1.second1.top1.flushtest.example > /dev/null 57*00b67f09SDavid van Moolenbroek # nxdomain: 58*00b67f09SDavid van Moolenbroek $DIG $DIGOPTS txt top4.flushtest.example > /dev/null 59*00b67f09SDavid van Moolenbroek # empty nonterminal: 60*00b67f09SDavid van Moolenbroek $DIG $DIGOPTS txt second2.top3.flushtest.example > /dev/null 61*00b67f09SDavid van Moolenbroek 62*00b67f09SDavid van Moolenbroek # sleep 2 seconds ensure the TTLs will be lower on cached data 63*00b67f09SDavid van Moolenbroek sleep 2 64*00b67f09SDavid van Moolenbroek} 65*00b67f09SDavid van Moolenbroek 66*00b67f09SDavid van Moolenbroekdump_cache () { 67*00b67f09SDavid van Moolenbroek rm -f ns2/named_dump.db 68*00b67f09SDavid van Moolenbroek $RNDC $RNDCOPTS dumpdb -cache _default 69*00b67f09SDavid van Moolenbroek sleep 1 70*00b67f09SDavid van Moolenbroek} 71*00b67f09SDavid van Moolenbroek 72*00b67f09SDavid van Moolenbroekclear_cache () { 73*00b67f09SDavid van Moolenbroek $RNDC $RNDCOPTS flush 74*00b67f09SDavid van Moolenbroek} 75*00b67f09SDavid van Moolenbroek 76*00b67f09SDavid van Moolenbroekin_cache () { 77*00b67f09SDavid van Moolenbroek ttl=`$DIG $DIGOPTS "$@" | awk '{print $2}'` 78*00b67f09SDavid van Moolenbroek [ -z "$ttl" ] && { 79*00b67f09SDavid van Moolenbroek ttl=`$DIG $DIGOPTS +noanswer +auth "$@" | awk '{print $2}'` 80*00b67f09SDavid van Moolenbroek [ "$ttl" -ge 3599 ] && return 1 81*00b67f09SDavid van Moolenbroek return 0 82*00b67f09SDavid van Moolenbroek } 83*00b67f09SDavid van Moolenbroek [ "$ttl" -ge 3599 ] && return 1 84*00b67f09SDavid van Moolenbroek return 0 85*00b67f09SDavid van Moolenbroek} 86*00b67f09SDavid van Moolenbroek 87*00b67f09SDavid van Moolenbroekecho "I:check correctness of routine cache cleaning" 88*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +tcp +keepopen -b 10.53.0.7 -f dig.batch > dig.out.ns2 || status=1 89*00b67f09SDavid van Moolenbroekgrep ";" dig.out.ns2 90*00b67f09SDavid van Moolenbroek 91*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl --lc dig.out.ns2 knowngood.dig.out || status=1 92*00b67f09SDavid van Moolenbroek 93*00b67f09SDavid van Moolenbroekecho "I:only one tcp socket was used" 94*00b67f09SDavid van Moolenbroektcpclients=`grep "client 10.53.0.7#[0-9]*:" ns2/named.run | awk '{print $4}' | sort | uniq -c | wc -l` 95*00b67f09SDavid van Moolenbroek 96*00b67f09SDavid van Moolenbroektest $tcpclients -eq 1 || { status=1; echo "I:failed"; } 97*00b67f09SDavid van Moolenbroek 98*00b67f09SDavid van Moolenbroekecho "I:reset and check that records are correctly cached initially" 99*00b67f09SDavid van Moolenbroekret=0 100*00b67f09SDavid van Moolenbroekload_cache 101*00b67f09SDavid van Moolenbroekdump_cache 102*00b67f09SDavid van Moolenbroeknrecords=`grep flushtest.example ns2/named_dump.db | grep -v '^;' | egrep '(TXT|ANY)'| wc -l` 103*00b67f09SDavid van Moolenbroek[ $nrecords -eq 17 ] || { ret=1; echo "I: found $nrecords records expected 17"; } 104*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi 105*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret` 106*00b67f09SDavid van Moolenbroek 107*00b67f09SDavid van Moolenbroekecho "I:check flushing of the full cache" 108*00b67f09SDavid van Moolenbroekret=0 109*00b67f09SDavid van Moolenbroekclear_cache 110*00b67f09SDavid van Moolenbroekdump_cache 111*00b67f09SDavid van Moolenbroeknrecords=`grep flushtest.example ns2/named_dump.db | grep -v '^;' | wc -l` 112*00b67f09SDavid van Moolenbroek[ $nrecords -eq 0 ] || ret=1 113*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi 114*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret` 115*00b67f09SDavid van Moolenbroek 116*00b67f09SDavid van Moolenbroekecho "I:check flushing of individual nodes (interior node)" 117*00b67f09SDavid van Moolenbroekret=0 118*00b67f09SDavid van Moolenbroekclear_cache 119*00b67f09SDavid van Moolenbroekload_cache 120*00b67f09SDavid van Moolenbroek# interior node 121*00b67f09SDavid van Moolenbroekin_cache txt top1.flushtest.example || ret=1 122*00b67f09SDavid van Moolenbroek$RNDC $RNDCOPTS flushname top1.flushtest.example 123*00b67f09SDavid van Moolenbroekin_cache txt top1.flushtest.example && ret=1 124*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi 125*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret` 126*00b67f09SDavid van Moolenbroek 127*00b67f09SDavid van Moolenbroekecho "I:check flushing of individual nodes (leaf node, under the interior node)" 128*00b67f09SDavid van Moolenbroekret=0 129*00b67f09SDavid van Moolenbroek# leaf node, under the interior node (should still exist) 130*00b67f09SDavid van Moolenbroekin_cache txt third2.second1.top1.flushtest.example || ret=1 131*00b67f09SDavid van Moolenbroek$RNDC $RNDCOPTS flushname third2.second1.top1.flushtest.example 132*00b67f09SDavid van Moolenbroekin_cache txt third2.second1.top1.flushtest.example && ret=1 133*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi 134*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret` 135*00b67f09SDavid van Moolenbroek 136*00b67f09SDavid van Moolenbroekecho "I:check flushing of individual nodes (another leaf node, with both positive and negative cache entries)" 137*00b67f09SDavid van Moolenbroekret=0 138*00b67f09SDavid van Moolenbroek# another leaf node, with both positive and negative cache entries 139*00b67f09SDavid van Moolenbroekin_cache a third1.second1.top1.flushtest.example || ret=1 140*00b67f09SDavid van Moolenbroekin_cache txt third1.second1.top1.flushtest.example || ret=1 141*00b67f09SDavid van Moolenbroek$RNDC $RNDCOPTS flushname third1.second1.top1.flushtest.example 142*00b67f09SDavid van Moolenbroekin_cache a third1.second1.top1.flushtest.example && ret=1 143*00b67f09SDavid van Moolenbroekin_cache txt third1.second1.top1.flushtest.example && ret=1 144*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi 145*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret` 146*00b67f09SDavid van Moolenbroek 147*00b67f09SDavid van Moolenbroekecho "I:check flushing a nonexistent name" 148*00b67f09SDavid van Moolenbroekret=0 149*00b67f09SDavid van Moolenbroek$RNDC $RNDCOPTS flushname fake.flushtest.example || ret=1 150*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi 151*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret` 152*00b67f09SDavid van Moolenbroek 153*00b67f09SDavid van Moolenbroekecho "I:check flushing of namespaces" 154*00b67f09SDavid van Moolenbroekret=0 155*00b67f09SDavid van Moolenbroekclear_cache 156*00b67f09SDavid van Moolenbroekload_cache 157*00b67f09SDavid van Moolenbroek# flushing leaf node should leave the interior node: 158*00b67f09SDavid van Moolenbroekin_cache txt third1.second1.top1.flushtest.example || ret=1 159*00b67f09SDavid van Moolenbroekin_cache txt top1.flushtest.example || ret=1 160*00b67f09SDavid van Moolenbroek$RNDC $RNDCOPTS flushtree third1.second1.top1.flushtest.example 161*00b67f09SDavid van Moolenbroekin_cache txt third1.second1.top1.flushtest.example && ret=1 162*00b67f09SDavid van Moolenbroekin_cache txt top1.flushtest.example || ret=1 163*00b67f09SDavid van Moolenbroekin_cache txt second1.top1.flushtest.example || ret=1 164*00b67f09SDavid van Moolenbroekin_cache txt third2.second1.top1.flushtest.example || ret=1 165*00b67f09SDavid van Moolenbroek$RNDC $RNDCOPTS flushtree second1.top1.flushtest.example 166*00b67f09SDavid van Moolenbroekin_cache txt top1.flushtest.example || ret=1 167*00b67f09SDavid van Moolenbroekin_cache txt second1.top1.flushtest.example && ret=1 168*00b67f09SDavid van Moolenbroekin_cache txt third2.second1.top1.flushtest.example && ret=1 169*00b67f09SDavid van Moolenbroek 170*00b67f09SDavid van Moolenbroek# flushing from an empty node should still remove all its children 171*00b67f09SDavid van Moolenbroekin_cache txt second1.top2.flushtest.example || ret=1 172*00b67f09SDavid van Moolenbroek$RNDC $RNDCOPTS flushtree top2.flushtest.example 173*00b67f09SDavid van Moolenbroekin_cache txt second1.top2.flushtest.example && ret=1 174*00b67f09SDavid van Moolenbroekin_cache txt second2.top2.flushtest.example && ret=1 175*00b67f09SDavid van Moolenbroekin_cache txt second3.top2.flushtest.example && ret=1 176*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi 177*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret` 178*00b67f09SDavid van Moolenbroek 179*00b67f09SDavid van Moolenbroekecho "I:check flushing a nonexistent namespace" 180*00b67f09SDavid van Moolenbroekret=0 181*00b67f09SDavid van Moolenbroek$RNDC $RNDCOPTS flushtree fake.flushtest.example || ret=1 182*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi 183*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret` 184*00b67f09SDavid van Moolenbroek 185*00b67f09SDavid van Moolenbroekecho "I:check the number of cached records remaining" 186*00b67f09SDavid van Moolenbroekret=0 187*00b67f09SDavid van Moolenbroekdump_cache 188*00b67f09SDavid van Moolenbroeknrecords=`grep flushtest.example ns2/named_dump.db | grep -v '^;' | egrep '(TXT|ANY)' | wc -l` 189*00b67f09SDavid van Moolenbroek[ $nrecords -eq 17 ] || { ret=1; echo "I: found $nrecords records expected 17"; } 190*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi 191*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret` 192*00b67f09SDavid van Moolenbroek 193*00b67f09SDavid van Moolenbroekecho "I:check flushtree clears adb correctly" 194*00b67f09SDavid van Moolenbroekret=0 195*00b67f09SDavid van Moolenbroekload_cache 196*00b67f09SDavid van Moolenbroekdump_cache 197*00b67f09SDavid van Moolenbroekawk '/plain success\/timeout/ {getline; getline; if ($2 == "ns.flushtest.example") exit(0); exit(1); }' ns2/named_dump.db || ret=1 198*00b67f09SDavid van Moolenbroek$RNDC $RNDCOPTS flushtree flushtest.example || ret=1 199*00b67f09SDavid van Moolenbroekdump_cache 200*00b67f09SDavid van Moolenbroekawk '/plain success\/timeout/ {getline; getline; if ($2 == "ns.flushtest.example") exit(1); exit(0); }' ns2/named_dump.db || ret=1 201*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi 202*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret` 203*00b67f09SDavid van Moolenbroek 204*00b67f09SDavid van Moolenbroekecho "I:check expire option returned from slave zone" 205*00b67f09SDavid van Moolenbroekret=0 206*00b67f09SDavid van Moolenbroek$DIG @10.53.0.2 -p 5300 +expire soa expire-test > dig.out.expire 207*00b67f09SDavid van Moolenbroekgrep EXPIRE: dig.out.expire > /dev/null || ret=1 208*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi 209*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret` 210*00b67f09SDavid van Moolenbroek 211*00b67f09SDavid van Moolenbroekecho "I:exit status: $status" 212*00b67f09SDavid van Moolenbroekexit $status 213