xref: /netbsd-src/external/mpl/bind/dist/bin/tests/system/serve-stale/tests.sh (revision d90047b5d07facf36e6c01dcc0bded8997ce9cc2)
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 http://mozilla.org/MPL/2.0/.
8#
9# See the COPYRIGHT file distributed with this work for additional
10# information regarding copyright ownership.
11
12SYSTEMTESTTOP=..
13. $SYSTEMTESTTOP/conf.sh
14
15RNDCCMD="$RNDC -c $SYSTEMTESTTOP/common/rndc.conf -p ${CONTROLPORT} -s"
16
17# wait up to ten seconds to ensure that a file has been written
18waitfile () {
19    for try in 0 1 2 3 4 5 6 7 8 9; do
20        [ -s "$1" ] && break
21        sleep 1
22    done
23}
24
25status=0
26n=0
27
28#
29# First test server with serve-stale options set.
30#
31echo_i "test server with serve-stale options set"
32
33n=$((n+1))
34echo_i "prime cache longttl.example ($n)"
35ret=0
36$DIG -p ${PORT} @10.53.0.1 longttl.example TXT > dig.out.test$n
37grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
38grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
39if [ $ret != 0 ]; then echo_i "failed"; fi
40status=$((status+ret))
41
42n=$((n+1))
43echo_i "prime cache data.example ($n)"
44ret=0
45$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n
46grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
47grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
48if [ $ret != 0 ]; then echo_i "failed"; fi
49status=$((status+ret))
50
51n=$((n+1))
52echo_i "prime cache othertype.example ($n)"
53ret=0
54$DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$n
55grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
56grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
57if [ $ret != 0 ]; then echo_i "failed"; fi
58status=$((status+ret))
59
60n=$((n+1))
61echo_i "prime cache nodata.example ($n)"
62ret=0
63$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$n
64grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
65grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
66if [ $ret != 0 ]; then echo_i "failed"; fi
67status=$((status+ret))
68
69n=$((n+1))
70echo_i "prime cache nxdomain.example ($n)"
71ret=0
72$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$n
73grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
74grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
75if [ $ret != 0 ]; then echo_i "failed"; fi
76status=$((status+ret))
77
78n=$((n+1))
79echo_i "verify prime cache statistics ($n)"
80ret=0
81rm -f ns1/named.stats
82$RNDCCMD 10.53.0.1 stats > /dev/null 2>&1
83[ -f ns1/named.stats ] || ret=1
84cp ns1/named.stats ns1/named.stats.$n
85# Check first 10 lines of Cache DB statistics.  After prime queries, we expect
86# two active TXT one nxrrset TXT, and one NXDOMAIN.
87grep -A 10 "++ Cache DB RRsets ++" ns1/named.stats.$n > ns1/named.stats.$n.cachedb || ret=1
88grep "1 Others" ns1/named.stats.$n.cachedb > /dev/null || ret=1
89grep "2 TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
90grep "1 !TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
91grep "1 NXDOMAIN" ns1/named.stats.$n.cachedb > /dev/null || ret=1
92if [ $ret != 0 ]; then echo_i "failed"; fi
93status=$((status+ret))
94
95n=$((n+1))
96echo_i "disable responses from authoritative server ($n)"
97ret=0
98$DIG -p ${PORT} @10.53.0.2 txt disable  > dig.out.test$n
99grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
100grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
101if [ $ret != 0 ]; then echo_i "failed"; fi
102status=$((status+ret))
103
104n=$((n+1))
105echo_i "check 'rndc serve-stale status' ($n)"
106ret=0
107$RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
108grep '_default: on (stale-answer-ttl=2 max-stale-ttl=3600)' rndc.out.test$n > /dev/null || ret=1
109if [ $ret != 0 ]; then echo_i "failed"; fi
110status=$((status+ret))
111
112sleep 2
113
114echo_i "sending queries for tests $((n+1))-$((n+4))..."
115$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
116$DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
117$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
118$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
119
120# ensure all files have been written before proceeding
121waitfile dig.out.test$((n+1))
122waitfile dig.out.test$((n+2))
123waitfile dig.out.test$((n+3))
124waitfile dig.out.test$((n+4))
125
126n=$((n+1))
127echo_i "check stale data.example ($n)"
128ret=0
129grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
130grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
131grep "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
132# Run rndc dumpdb, test whether the stale data has correct comment printed.
133# The max-stale-ttl is 3600 seconds, so the comment should say the data is
134# stale for somewhere between 3500-3599 seconds.
135rndc_dumpdb ns1 || ret=1
136awk '/; stale/ { x=$0; getline; print x, $0}' ns1/named_dump.db.test$n |
137    grep "; stale (will be retained for 35.. more seconds) data\.example.*A text record with a 2 second ttl" > /dev/null 2>&1 || ret=1
138# Also make sure the not expired data does not have a stale comment.
139awk '/; answer/ { x=$0; getline; print x, $0}' ns1/named_dump.db.test$n |
140    grep "; answer longttl\.example.*A text record with a 600 second ttl" > /dev/null 2>&1 || ret=1
141if [ $ret != 0 ]; then echo_i "failed"; fi
142status=$((status+ret))
143
144n=$((n+1))
145echo_i "check stale othertype.example ($n)"
146ret=0
147grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
148grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
149grep "othertype\.example\..*2.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1
150if [ $ret != 0 ]; then echo_i "failed"; fi
151status=$((status+ret))
152
153n=$((n+1))
154echo_i "check stale nodata.example ($n)"
155ret=0
156grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
157grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
158grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
159if [ $ret != 0 ]; then echo_i "failed"; fi
160status=$((status+ret))
161
162n=$((n+1))
163echo_i "check stale nxdomain.example ($n)"
164ret=0
165grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
166grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
167grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
168if [ $ret != 0 ]; then echo_i "failed"; fi
169status=$((status+ret))
170
171n=$((n+1))
172echo_i "verify stale cache statistics ($n)"
173ret=0
174rm -f ns1/named.stats
175$RNDCCMD 10.53.0.1 stats > /dev/null 2>&1
176[ -f ns1/named.stats ] || ret=1
177cp ns1/named.stats ns1/named.stats.$n
178# Check first 10 lines of Cache DB statistics.  After serve-stale queries, we
179# expect one active TXT RRset, one stale TXT, one stale nxrrset TXT, and one
180# stale NXDOMAIN.
181grep -A 10 "++ Cache DB RRsets ++" ns1/named.stats.$n > ns1/named.stats.$n.cachedb || ret=1
182grep "1 TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
183grep "1 #Others" ns1/named.stats.$n.cachedb > /dev/null || ret=1
184grep "1 #TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
185grep "1 #!TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
186grep "1 #NXDOMAIN" ns1/named.stats.$n.cachedb > /dev/null || ret=1
187status=$((status+ret))
188if [ $ret != 0 ]; then echo_i "failed"; fi
189
190n=$((n+1))
191echo_i "running 'rndc serve-stale off' ($n)"
192ret=0
193$RNDCCMD 10.53.0.1 serve-stale off || ret=1
194if [ $ret != 0 ]; then echo_i "failed"; fi
195status=$((status+ret))
196
197n=$((n+1))
198echo_i "check 'rndc serve-stale status' ($n)"
199ret=0
200$RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
201grep '_default: off (rndc) (stale-answer-ttl=2 max-stale-ttl=3600)' rndc.out.test$n > /dev/null || ret=1
202if [ $ret != 0 ]; then echo_i "failed"; fi
203status=$((status+ret))
204
205echo_i "sending queries for tests $((n+1))-$((n+4))..."
206$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
207$DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
208$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
209$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
210
211# ensure all files have been written before proceeding
212waitfile dig.out.test$((n+1))
213waitfile dig.out.test$((n+2))
214waitfile dig.out.test$((n+3))
215waitfile dig.out.test$((n+4))
216
217n=$((n+1))
218echo_i "check stale data.example (serve-stale off) ($n)"
219ret=0
220grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
221if [ $ret != 0 ]; then echo_i "failed"; fi
222status=$((status+ret))
223
224n=$((n+1))
225echo_i "check stale othertype.example (serve-stale off) ($n)"
226ret=0
227grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
228if [ $ret != 0 ]; then echo_i "failed"; fi
229status=$((status+ret))
230
231n=$((n+1))
232echo_i "check stale nodata.example (serve-stale off) ($n)"
233ret=0
234grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
235if [ $ret != 0 ]; then echo_i "failed"; fi
236status=$((status+ret))
237
238n=$((n+1))
239echo_i "check stale nxdomain.example (serve-stale off) ($n)"
240ret=0
241grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
242if [ $ret != 0 ]; then echo_i "failed"; fi
243status=$((status+ret))
244
245n=$((n+1))
246echo_i "running 'rndc serve-stale on' ($n)"
247ret=0
248$RNDCCMD 10.53.0.1 serve-stale on || ret=1
249if [ $ret != 0 ]; then echo_i "failed"; fi
250status=$((status+ret))
251
252n=$((n+1))
253echo_i "check 'rndc serve-stale status' ($n)"
254ret=0
255$RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
256grep '_default: on (rndc) (stale-answer-ttl=2 max-stale-ttl=3600)' rndc.out.test$n > /dev/null || ret=1
257if [ $ret != 0 ]; then echo_i "failed"; fi
258status=$((status+ret))
259
260echo_i "sending queries for tests $((n+1))-$((n+4))..."
261$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
262$DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
263$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
264$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
265
266# ensure all files have been written before proceeding
267waitfile dig.out.test$((n+1))
268waitfile dig.out.test$((n+2))
269waitfile dig.out.test$((n+3))
270waitfile dig.out.test$((n+4))
271
272n=$((n+1))
273echo_i "check stale data.example (serve-stale on) ($n)"
274ret=0
275grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
276grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
277grep "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
278if [ $ret != 0 ]; then echo_i "failed"; fi
279status=$((status+ret))
280
281n=$((n+1))
282echo_i "check stale othertype.example (serve-stale on) ($n)"
283ret=0
284grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
285grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
286grep "othertype\.example\..*2.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1
287if [ $ret != 0 ]; then echo_i "failed"; fi
288status=$((status+ret))
289
290n=$((n+1))
291echo_i "check stale nodata.example (serve-stale on) ($n)"
292ret=0
293grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
294grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
295grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
296if [ $ret != 0 ]; then echo_i "failed"; fi
297status=$((status+ret))
298
299n=$((n+1))
300echo_i "check stale nxdomain.example (serve-stale on) ($n)"
301ret=0
302grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
303grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
304grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
305if [ $ret != 0 ]; then echo_i "failed"; fi
306status=$((status+ret))
307
308n=$((n+1))
309echo_i "running 'rndc serve-stale off' ($n)"
310ret=0
311$RNDCCMD 10.53.0.1 serve-stale off || ret=1
312if [ $ret != 0 ]; then echo_i "failed"; fi
313status=$((status+ret))
314
315n=$((n+1))
316echo_i "running 'rndc serve-stale reset' ($n)"
317ret=0
318$RNDCCMD 10.53.0.1 serve-stale reset || ret=1
319if [ $ret != 0 ]; then echo_i "failed"; fi
320status=$((status+ret))
321
322n=$((n+1))
323echo_i "check 'rndc serve-stale status' ($n)"
324ret=0
325$RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
326grep '_default: on (stale-answer-ttl=2 max-stale-ttl=3600)' rndc.out.test$n > /dev/null || ret=1
327if [ $ret != 0 ]; then echo_i "failed"; fi
328status=$((status+ret))
329
330echo_i "sending queries for tests $((n+1))-$((n+4))..."
331$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
332$DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
333$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
334$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
335
336# ensure all files have been written before proceeding
337waitfile dig.out.test$((n+1))
338waitfile dig.out.test$((n+2))
339waitfile dig.out.test$((n+3))
340waitfile dig.out.test$((n+4))
341
342n=$((n+1))
343echo_i "check stale data.example (serve-stale reset) ($n)"
344ret=0
345grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
346grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
347grep "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
348if [ $ret != 0 ]; then echo_i "failed"; fi
349status=$((status+ret))
350
351n=$((n+1))
352echo_i "check stale othertype.example (serve-stale reset) ($n)"
353ret=0
354grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
355grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
356grep "othertype.example\..*2.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1
357if [ $ret != 0 ]; then echo_i "failed"; fi
358status=$((status+ret))
359
360n=$((n+1))
361echo_i "check stale nodata.example (serve-stale reset) ($n)"
362ret=0
363grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
364grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
365grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
366if [ $ret != 0 ]; then echo_i "failed"; fi
367status=$((status+ret))
368
369n=$((n+1))
370echo_i "check stale nxdomain.example (serve-stale reset) ($n)"
371ret=0
372grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
373grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
374grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
375if [ $ret != 0 ]; then echo_i "failed"; fi
376status=$((status+ret))
377
378n=$((n+1))
379echo_i "running 'rndc serve-stale off' ($n)"
380ret=0
381$RNDCCMD 10.53.0.1 serve-stale off || ret=1
382if [ $ret != 0 ]; then echo_i "failed"; fi
383status=$((status+ret))
384
385n=$((n+1))
386echo_i "check 'rndc serve-stale status' ($n)"
387ret=0
388$RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
389grep '_default: off (rndc) (stale-answer-ttl=2 max-stale-ttl=3600)' rndc.out.test$n > /dev/null || ret=1
390if [ $ret != 0 ]; then echo_i "failed"; fi
391status=$((status+ret))
392
393#
394# Update named.conf.
395# Test server with low max-stale-ttl.
396#
397echo_i "test server with serve-stale options set, low max-stale-ttl"
398
399n=$((n+1))
400echo_i "updating ns1/named.conf ($n)"
401ret=0
402copy_setports ns1/named2.conf.in ns1/named.conf
403if [ $ret != 0 ]; then echo_i "failed"; fi
404status=$((status+ret))
405
406n=$((n+1))
407echo_i "running 'rndc reload' ($n)"
408ret=0
409rndc_reload ns1 10.53.0.1
410if [ $ret != 0 ]; then echo_i "failed"; fi
411status=$((status+ret))
412
413n=$((n+1))
414echo_i "check 'rndc serve-stale status' ($n)"
415ret=0
416$RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
417grep '_default: off (rndc) (stale-answer-ttl=3 max-stale-ttl=20)' rndc.out.test$n > /dev/null || ret=1
418if [ $ret != 0 ]; then echo_i "failed"; fi
419status=$((status+ret))
420
421n=$((n+1))
422echo_i "flush cache, re-enable serve-stale and query again ($n)"
423ret=0
424$RNDCCMD 10.53.0.1 flushtree example > rndc.out.test$n.1 2>&1 || ret=1
425$RNDCCMD 10.53.0.1 serve-stale on > rndc.out.test$n.2 2>&1 || ret=1
426$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n
427grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
428grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
429if [ $ret != 0 ]; then echo_i "failed"; fi
430status=$((status+ret))
431
432n=$((n+1))
433echo_i "check 'rndc serve-stale status' ($n)"
434ret=0
435$RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
436grep '_default: on (rndc) (stale-answer-ttl=3 max-stale-ttl=20)' rndc.out.test$n > /dev/null || ret=1
437if [ $ret != 0 ]; then echo_i "failed"; fi
438status=$((status+ret))
439
440n=$((n+1))
441echo_i "enable responses from authoritative server ($n)"
442ret=0
443$DIG -p ${PORT} @10.53.0.2 txt enable  > dig.out.test$n
444grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
445grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
446if [ $ret != 0 ]; then echo_i "failed"; fi
447status=$((status+ret))
448
449n=$((n+1))
450echo_i "prime cache longttl.example (low max-stale-ttl) ($n)"
451ret=0
452$DIG -p ${PORT} @10.53.0.1 longttl.example TXT > dig.out.test$n
453grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
454grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
455if [ $ret != 0 ]; then echo_i "failed"; fi
456status=$((status+ret))
457
458n=$((n+1))
459echo_i "prime cache data.example (low max-stale-ttl) ($n)"
460ret=0
461$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n
462grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
463grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
464if [ $ret != 0 ]; then echo_i "failed"; fi
465status=$((status+ret))
466
467n=$((n+1))
468echo_i "prime cache othertype.example (low max-stale-ttl) ($n)"
469ret=0
470$DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$n
471grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
472grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
473if [ $ret != 0 ]; then echo_i "failed"; fi
474status=$((status+ret))
475
476n=$((n+1))
477echo_i "prime cache nodata.example (low max-stale-ttl) ($n)"
478ret=0
479$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$n
480grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
481grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
482if [ $ret != 0 ]; then echo_i "failed"; fi
483status=$((status+ret))
484
485n=$((n+1))
486echo_i "prime cache nxdomain.example (low max-stale-ttl) ($n)"
487ret=0
488$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$n
489grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
490grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
491if [ $ret != 0 ]; then echo_i "failed"; fi
492status=$((status+ret))
493
494n=$((n+1))
495echo_i "verify prime cache statistics (low max-stale-ttl) ($n)"
496ret=0
497rm -f ns1/named.stats
498$RNDCCMD 10.53.0.1 stats > /dev/null 2>&1
499[ -f ns1/named.stats ] || ret=1
500cp ns1/named.stats ns1/named.stats.$n
501# Check first 10 lines of Cache DB statistics.  After prime queries, we expect
502# two active TXT RRsets, one nxrrset TXT, and one NXDOMAIN.
503grep -A 10 "++ Cache DB RRsets ++" ns1/named.stats.$n > ns1/named.stats.$n.cachedb || ret=1
504grep "2 TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
505grep "1 Others" ns1/named.stats.$n.cachedb > /dev/null || ret=1
506grep "1 !TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
507grep "1 NXDOMAIN" ns1/named.stats.$n.cachedb > /dev/null || ret=1
508status=$((status+ret))
509if [ $ret != 0 ]; then echo_i "failed"; fi
510
511n=$((n+1))
512echo_i "disable responses from authoritative server ($n)"
513ret=0
514$DIG -p ${PORT} @10.53.0.2 txt disable  > dig.out.test$n
515grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
516grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
517if [ $ret != 0 ]; then echo_i "failed"; fi
518status=$((status+ret))
519
520sleep 2
521
522echo_i "sending queries for tests $((n+1))-$((n+4))..."
523$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
524$DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
525$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
526$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
527
528# ensure all files have been written before proceeding
529waitfile dig.out.test$((n+1))
530waitfile dig.out.test$((n+2))
531waitfile dig.out.test$((n+3))
532waitfile dig.out.test$((n+4))
533
534n=$((n+1))
535echo_i "check stale data.example (low max-stale-ttl) ($n)"
536ret=0
537grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
538grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
539grep "data\.example\..*3.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
540if [ $ret != 0 ]; then echo_i "failed"; fi
541status=$((status+ret))
542
543n=$((n+1))
544echo_i "check stale othertype.example (low max-stale-ttl) ($n)"
545ret=0
546grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
547grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
548grep "othertype\.example\..*3.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1
549if [ $ret != 0 ]; then echo_i "failed"; fi
550status=$((status+ret))
551
552n=$((n+1))
553echo_i "check stale nodata.example (low max-stale-ttl) ($n)"
554ret=0
555grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
556grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
557grep "example\..*3.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
558if [ $ret != 0 ]; then echo_i "failed"; fi
559status=$((status+ret))
560
561n=$((n+1))
562echo_i "check stale nxdomain.example (low max-stale-ttl) ($n)"
563ret=0
564grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
565grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
566grep "example\..*3.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
567if [ $ret != 0 ]; then echo_i "failed"; fi
568status=$((status+ret))
569
570n=$((n+1))
571echo_i "verify stale cache statistics (low max-stale-ttl) ($n)"
572ret=0
573rm -f ns1/named.stats
574$RNDCCMD 10.53.0.1 stats > /dev/null 2>&1
575[ -f ns1/named.stats ] || ret=1
576cp ns1/named.stats ns1/named.stats.$n
577# Check first 10 lines of Cache DB statistics.  After serve-stale queries, we
578# expect one active TXT RRset, one stale TXT, one stale nxrrset TXT, and one
579# stale NXDOMAIN.
580grep -A 10 "++ Cache DB RRsets ++" ns1/named.stats.$n > ns1/named.stats.$n.cachedb || ret=1
581grep "1 TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
582grep "1 #TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
583grep "1 #Others" ns1/named.stats.$n.cachedb > /dev/null || ret=1
584grep "1 #!TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
585grep "1 #NXDOMAIN" ns1/named.stats.$n.cachedb > /dev/null || ret=1
586
587status=$((status+ret))
588if [ $ret != 0 ]; then echo_i "failed"; fi
589
590echo_i "sending queries for tests $((n+1))-$((n+4))..."
591$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
592$DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
593$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
594$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
595
596# ensure all files have been written before proceeding
597waitfile dig.out.test$((n+1))
598waitfile dig.out.test$((n+2))
599waitfile dig.out.test$((n+3))
600waitfile dig.out.test$((n+4))
601
602n=$((n+1))
603echo_i "check ancient data.example (low max-stale-ttl) ($n)"
604ret=0
605grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
606grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
607if [ $ret != 0 ]; then echo_i "failed"; fi
608status=$((status+ret))
609
610n=$((n+1))
611echo_i "check ancient othertype.example (low max-stale-ttl) ($n)"
612ret=0
613grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
614grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
615if [ $ret != 0 ]; then echo_i "failed"; fi
616status=$((status+ret))
617
618n=$((n+1))
619echo_i "check ancient nodata.example (low max-stale-ttl) ($n)"
620ret=0
621grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
622grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
623if [ $ret != 0 ]; then echo_i "failed"; fi
624status=$((status+ret))
625
626n=$((n+1))
627echo_i "check ancient nxdomain.example (low max-stale-ttl) ($n)"
628ret=0
629grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
630grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
631if [ $ret != 0 ]; then echo_i "failed"; fi
632status=$((status+ret))
633
634#
635# Now test server with no serve-stale options set.
636#
637echo_i "test server with no serve-stale options set"
638
639n=$((n+1))
640echo_i "enable responses from authoritative server ($n)"
641ret=0
642$DIG -p ${PORT} @10.53.0.2 txt enable  > dig.out.test$n
643grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
644grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
645if [ $ret != 0 ]; then echo_i "failed"; fi
646status=$((status+ret))
647
648n=$((n+1))
649echo_i "prime cache longttl.example (max-stale-ttl default) ($n)"
650ret=0
651$DIG -p ${PORT} @10.53.0.3 longttl.example TXT > dig.out.test$n
652grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
653grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
654if [ $ret != 0 ]; then echo_i "failed"; fi
655status=$((status+ret))
656
657n=$((n+1))
658echo_i "prime cache data.example (max-stale-ttl default) ($n)"
659ret=0
660$DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
661grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
662grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
663grep "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
664if [ $ret != 0 ]; then echo_i "failed"; fi
665status=$((status+ret))
666
667n=$((n+1))
668echo_i "prime cache othertype.example (max-stale-ttl default) ($n)"
669ret=0
670$DIG -p ${PORT} @10.53.0.3 othertype.example CAA > dig.out.test$n
671grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
672grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
673grep "othertype\.example\..*2.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1
674if [ $ret != 0 ]; then echo_i "failed"; fi
675status=$((status+ret))
676
677n=$((n+1))
678echo_i "prime cache nodata.example (max-stale-ttl default) ($n)"
679ret=0
680$DIG -p ${PORT} @10.53.0.3 nodata.example TXT > dig.out.test$n
681grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
682grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
683grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
684if [ $ret != 0 ]; then echo_i "failed"; fi
685status=$((status+ret))
686
687n=$((n+1))
688echo_i "prime cache nxdomain.example (max-stale-ttl default) ($n)"
689ret=0
690$DIG -p ${PORT} @10.53.0.3 nxdomain.example TXT > dig.out.test$n
691grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
692grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
693grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
694if [ $ret != 0 ]; then echo_i "failed"; fi
695status=$((status+ret))
696
697n=$((n+1))
698echo_i "verify prime cache statistics (max-stale-ttl default) ($n)"
699ret=0
700rm -f ns3/named.stats
701$RNDCCMD 10.53.0.3 stats > /dev/null 2>&1
702[ -f ns3/named.stats ] || ret=1
703cp ns3/named.stats ns3/named.stats.$n
704# Check first 10 lines of Cache DB statistics.  After prime queries, we expect
705# two active TXT RRsets, one nxrrset TXT, and one NXDOMAIN.
706grep -A 10 "++ Cache DB RRsets ++" ns3/named.stats.$n > ns3/named.stats.$n.cachedb || ret=1
707grep "2 TXT" ns3/named.stats.$n.cachedb > /dev/null || ret=1
708grep "1 Others" ns3/named.stats.$n.cachedb > /dev/null || ret=1
709grep "1 !TXT" ns3/named.stats.$n.cachedb > /dev/null || ret=1
710grep "1 NXDOMAIN" ns3/named.stats.$n.cachedb > /dev/null || ret=1
711status=$((status+ret))
712if [ $ret != 0 ]; then echo_i "failed"; fi
713
714n=$((n+1))
715echo_i "disable responses from authoritative server ($n)"
716ret=0
717$DIG -p ${PORT} @10.53.0.2 txt disable  > dig.out.test$n
718grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
719grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
720if [ $ret != 0 ]; then echo_i "failed"; fi
721status=$((status+ret))
722
723n=$((n+1))
724echo_i "check 'rndc serve-stale status' ($n)"
725ret=0
726$RNDCCMD 10.53.0.3 serve-stale status > rndc.out.test$n 2>&1 || ret=1
727grep '_default: off (stale-answer-ttl=1 max-stale-ttl=604800)' rndc.out.test$n > /dev/null || ret=1
728if [ $ret != 0 ]; then echo_i "failed"; fi
729status=$((status+ret))
730
731sleep 2
732
733echo_i "sending queries for tests $((n+1))-$((n+4))..."
734$DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$((n+1)) &
735$DIG -p ${PORT} @10.53.0.3 othertype.example CAA > dig.out.test$((n+2)) &
736$DIG -p ${PORT} @10.53.0.3 nodata.example TXT > dig.out.test$((n+3)) &
737$DIG -p ${PORT} @10.53.0.3 nxdomain.example TXT > dig.out.test$((n+4))
738
739# ensure all files have been written before proceeding
740waitfile dig.out.test$((n+1))
741waitfile dig.out.test$((n+2))
742waitfile dig.out.test$((n+3))
743waitfile dig.out.test$((n+4))
744
745n=$((n+1))
746echo_i "check fail of data.example (max-stale-ttl default) ($n)"
747ret=0
748grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
749grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
750if [ $ret != 0 ]; then echo_i "failed"; fi
751status=$((status+ret))
752
753n=$((n+1))
754echo_i "check fail of othertype.example (max-stale-ttl default) ($n)"
755ret=0
756grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
757grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
758if [ $ret != 0 ]; then echo_i "failed"; fi
759status=$((status+ret))
760
761n=$((n+1))
762echo_i "check fail of nodata.example (max-stale-ttl default) ($n)"
763ret=0
764grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
765grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
766if [ $ret != 0 ]; then echo_i "failed"; fi
767status=$((status+ret))
768
769n=$((n+1))
770echo_i "check fail of nxdomain.example (max-stale-ttl default) ($n)"
771ret=0
772grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
773grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
774if [ $ret != 0 ]; then echo_i "failed"; fi
775status=$((status+ret))
776
777n=$((n+1))
778echo_i "verify stale cache statistics (max-stale-ttl default) ($n)"
779ret=0
780rm -f ns3/named.stats
781$RNDCCMD 10.53.0.3 stats > /dev/null 2>&1
782[ -f ns3/named.stats ] || ret=1
783cp ns3/named.stats ns3/named.stats.$n
784# Check first 10 lines of Cache DB statistics. After last queries, we expect
785# one active TXT RRset, one stale TXT, one stale nxrrset TXT, and one
786# stale NXDOMAIN.
787grep -A 10 "++ Cache DB RRsets ++" ns3/named.stats.$n > ns3/named.stats.$n.cachedb || ret=1
788grep "1 TXT" ns3/named.stats.$n.cachedb > /dev/null || ret=1
789grep "1 #TXT" ns3/named.stats.$n.cachedb > /dev/null || ret=1
790grep "1 #Others" ns3/named.stats.$n.cachedb > /dev/null || ret=1
791grep "1 #!TXT" ns3/named.stats.$n.cachedb > /dev/null || ret=1
792grep "1 #NXDOMAIN" ns3/named.stats.$n.cachedb > /dev/null || ret=1
793
794status=$((status+ret))
795if [ $ret != 0 ]; then echo_i "failed"; fi
796
797n=$((n+1))
798echo_i "check 'rndc serve-stale on' ($n)"
799ret=0
800$RNDCCMD 10.53.0.3 serve-stale on > rndc.out.test$n 2>&1 || ret=1
801if [ $ret != 0 ]; then echo_i "failed"; fi
802status=$((status+ret))
803
804n=$((n+1))
805echo_i "check 'rndc serve-stale status' ($n)"
806ret=0
807$RNDCCMD 10.53.0.3 serve-stale status > rndc.out.test$n 2>&1 || ret=1
808grep '_default: on (rndc) (stale-answer-ttl=1 max-stale-ttl=604800)' rndc.out.test$n > /dev/null || ret=1
809if [ $ret != 0 ]; then echo_i "failed"; fi
810status=$((status+ret))
811
812sleep 2
813
814echo_i "sending queries for tests $((n+1))-$((n+4))..."
815$DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$((n+1)) &
816$DIG -p ${PORT} @10.53.0.3 othertype.example CAA > dig.out.test$((n+2)) &
817$DIG -p ${PORT} @10.53.0.3 nodata.example TXT > dig.out.test$((n+3)) &
818$DIG -p ${PORT} @10.53.0.3 nxdomain.example TXT > dig.out.test$((n+4))
819
820# ensure all files have been written before proceeding
821waitfile dig.out.test$((n+1))
822waitfile dig.out.test$((n+2))
823waitfile dig.out.test$((n+3))
824waitfile dig.out.test$((n+4))
825
826n=$((n+1))
827echo_i "check data.example (max-stale-ttl default) ($n)"
828ret=0
829grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
830grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
831grep "data\.example\..*1.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
832if [ $ret != 0 ]; then echo_i "failed"; fi
833status=$((status+ret))
834
835n=$((n+1))
836echo_i "check othertype.example (max-stale-ttl default) ($n)"
837ret=0
838grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
839grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
840grep "example\..*1.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1
841if [ $ret != 0 ]; then echo_i "failed"; fi
842status=$((status+ret))
843
844n=$((n+1))
845echo_i "check nodata.example (max-stale-ttl default) ($n)"
846ret=0
847grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
848grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
849grep "example\..*1.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
850if [ $ret != 0 ]; then echo_i "failed"; fi
851status=$((status+ret))
852
853n=$((n+1))
854echo_i "check nxdomain.example (max-stale-ttl default) ($n)"
855ret=0
856grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
857grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
858grep "example\..*1.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
859if [ $ret != 0 ]; then echo_i "failed"; fi
860status=$((status+ret))
861
862#
863# Now test server with serve-stale disabled.
864#
865echo_i "test server with serve-stale disabled"
866
867n=$((n+1))
868echo_i "enable responses from authoritative server ($n)"
869ret=0
870$DIG -p ${PORT} @10.53.0.2 txt enable  > dig.out.test$n
871grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
872grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
873if [ $ret != 0 ]; then echo_i "failed"; fi
874status=$((status+ret))
875
876n=$((n+1))
877echo_i "prime cache longttl.example (serve-stale disabled) ($n)"
878ret=0
879$DIG -p ${PORT} @10.53.0.4 longttl.example TXT > dig.out.test$n
880grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
881grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
882if [ $ret != 0 ]; then echo_i "failed"; fi
883status=$((status+ret))
884
885n=$((n+1))
886echo_i "prime cache data.example (serve-stale disabled) ($n)"
887ret=0
888$DIG -p ${PORT} @10.53.0.4 data.example TXT > dig.out.test$n
889grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
890grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
891grep "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
892if [ $ret != 0 ]; then echo_i "failed"; fi
893status=$((status+ret))
894
895n=$((n+1))
896echo_i "prime cache othertype.example (serve-stale disabled) ($n)"
897ret=0
898$DIG -p ${PORT} @10.53.0.4 othertype.example CAA > dig.out.test$n
899grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
900grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
901grep "othertype\.example\..*2.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1
902if [ $ret != 0 ]; then echo_i "failed"; fi
903status=$((status+ret))
904
905n=$((n+1))
906echo_i "prime cache nodata.example (serve-stale disabled) ($n)"
907ret=0
908$DIG -p ${PORT} @10.53.0.4 nodata.example TXT > dig.out.test$n
909grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
910grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
911grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
912if [ $ret != 0 ]; then echo_i "failed"; fi
913status=$((status+ret))
914
915n=$((n+1))
916echo_i "prime cache nxdomain.example (serve-stale disabled) ($n)"
917ret=0
918$DIG -p ${PORT} @10.53.0.4 nxdomain.example TXT > dig.out.test$n
919grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
920grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
921grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
922if [ $ret != 0 ]; then echo_i "failed"; fi
923status=$((status+ret))
924
925n=$((n+1))
926echo_i "verify prime cache statistics (serve-stale disabled) ($n)"
927ret=0
928rm -f ns4/named.stats
929$RNDCCMD 10.53.0.4 stats > /dev/null 2>&1
930[ -f ns4/named.stats ] || ret=1
931cp ns4/named.stats ns4/named.stats.$n
932# Check first 10 lines of Cache DB statistics.  After prime queries, we expect
933# two active TXT RRsets, one nxrrset TXT, and one NXDOMAIN.
934grep -A 10 "++ Cache DB RRsets ++" ns4/named.stats.$n > ns4/named.stats.$n.cachedb || ret=1
935grep "2 TXT" ns4/named.stats.$n.cachedb > /dev/null || ret=1
936grep "1 Others" ns4/named.stats.$n.cachedb > /dev/null || ret=1
937grep "1 !TXT" ns4/named.stats.$n.cachedb > /dev/null || ret=1
938grep "1 NXDOMAIN" ns4/named.stats.$n.cachedb > /dev/null || ret=1
939status=$((status+ret))
940if [ $ret != 0 ]; then echo_i "failed"; fi
941
942n=$((n+1))
943echo_i "disable responses from authoritative server ($n)"
944ret=0
945$DIG -p ${PORT} @10.53.0.2 txt disable  > dig.out.test$n
946grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
947grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
948if [ $ret != 0 ]; then echo_i "failed"; fi
949status=$((status+ret))
950
951n=$((n+1))
952echo_i "check 'rndc serve-stale status' ($n)"
953ret=0
954$RNDCCMD 10.53.0.4 serve-stale status > rndc.out.test$n 2>&1 || ret=1
955grep '_default: off (stale-answer-ttl=1 max-stale-ttl=604800)' rndc.out.test$n > /dev/null || ret=1
956if [ $ret != 0 ]; then echo_i "failed"; fi
957status=$((status+ret))
958
959sleep 2
960
961echo_i "sending queries for tests $((n+1))-$((n+4))..."
962$DIG -p ${PORT} @10.53.0.4 data.example TXT > dig.out.test$((n+1)) &
963$DIG -p ${PORT} @10.53.0.4 othertype.example CAA > dig.out.test$((n+2)) &
964$DIG -p ${PORT} @10.53.0.4 nodata.example TXT > dig.out.test$((n+3)) &
965$DIG -p ${PORT} @10.53.0.4 nxdomain.example TXT > dig.out.test$((n+4))
966
967# ensure all files have been written before proceeding
968waitfile dig.out.test$((n+1))
969waitfile dig.out.test$((n+2))
970waitfile dig.out.test$((n+3))
971waitfile dig.out.test$((n+4))
972
973n=$((n+1))
974echo_i "check fail of data.example (serve-stale disabled) ($n)"
975ret=0
976grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
977grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
978if [ $ret != 0 ]; then echo_i "failed"; fi
979status=$((status+ret))
980
981n=$((n+1))
982echo_i "check fail of othertype.example (serve-stale disabled) ($n)"
983ret=0
984grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
985grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
986if [ $ret != 0 ]; then echo_i "failed"; fi
987status=$((status+ret))
988
989n=$((n+1))
990echo_i "check fail of nodata.example (serve-stale disabled) ($n)"
991ret=0
992grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
993grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
994if [ $ret != 0 ]; then echo_i "failed"; fi
995status=$((status+ret))
996
997n=$((n+1))
998echo_i "check fail of nxdomain.example (serve-stale disabled) ($n)"
999ret=0
1000grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
1001grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
1002if [ $ret != 0 ]; then echo_i "failed"; fi
1003status=$((status+ret))
1004
1005n=$((n+1))
1006echo_i "verify stale cache statistics (serve-stale disabled) ($n)"
1007ret=0
1008rm -f ns4/named.stats
1009$RNDCCMD 10.53.0.4 stats > /dev/null 2>&1
1010[ -f ns4/named.stats ] || ret=1
1011cp ns4/named.stats ns4/named.stats.$n
1012# Check first 10 lines of Cache DB statistics. After last queries, we expect
1013# one active TXT RRset, one stale TXT, one stale nxrrset TXT, and one
1014# stale NXDOMAIN.
1015grep -A 10 "++ Cache DB RRsets ++" ns4/named.stats.$n > ns4/named.stats.$n.cachedb || ret=1
1016grep "1 TXT" ns4/named.stats.$n.cachedb > /dev/null || ret=1
1017grep "1 #TXT" ns4/named.stats.$n.cachedb > /dev/null || ret=1
1018grep "1 #Others" ns4/named.stats.$n.cachedb > /dev/null || ret=1
1019grep "1 #!TXT" ns4/named.stats.$n.cachedb > /dev/null || ret=1
1020grep "1 #NXDOMAIN" ns4/named.stats.$n.cachedb > /dev/null || ret=1
1021status=$((status+ret))
1022if [ $ret != 0 ]; then echo_i "failed"; fi
1023
1024# Dump the cache.
1025n=$((n+1))
1026echo_i "dump the cache (serve-stale disabled) ($n)"
1027ret=0
1028$RNDCCMD 10.53.0.4 dumpdb -cache > rndc.out.test$n 2>&1 || ret=1
1029done=0
1030for i in 0 1 2 3 4 5 6 7 8 9; do
1031	grep '^; Dump complete$' ns4/named_dump4.db > /dev/null 2>&1 && done=1
1032	if [ $done != 1 ]; then sleep 1; fi
1033done
1034if [ $done != 1 ]; then ret=1; fi
1035status=$((status+ret))
1036if [ $ret != 0 ]; then echo_i "failed"; fi
1037
1038echo_i "stop ns4"
1039$PERL $SYSTEMTESTTOP/stop.pl --use-rndc --port ${CONTROLPORT} serve-stale ns4
1040
1041# Load the cache as if it was five minutes (RBTDB_VIRTUAL) older.
1042# Since max-stale-ttl defaults to a week, we need to adjust the date by
1043# one week and five minutes.
1044LASTWEEK=`TZ=UTC perl -e 'my $now = time();
1045        my $oneWeekAgo = $now - 604800;
1046        my $fiveMinutesAgo = $oneWeekAgo - 300;
1047        my ($s, $m, $h, $d, $mo, $y) = (localtime($fiveMinutesAgo))[0, 1, 2, 3, 4, 5];
1048        printf("%04d%02d%02d%02d%02d%02d", $y+1900, $mo+1, $d, $h, $m, $s);'`
1049
1050n=$((n+1))
1051echo_i "mock the cache date to $LASTWEEK (serve-stale disabled) ($n)"
1052ret=0
1053sed -E "s/DATE [0-9]{14}/DATE $LASTWEEK/g" ns4/named_dump4.db > ns4/named_dumpdb4.db.out || ret=1
1054cp ns4/named_dumpdb4.db.out ns4/named_dumpdb4.db
1055if [ $ret != 0 ]; then echo_i "failed"; fi
1056status=$((status+ret))
1057
1058echo_i "start ns4"
1059$PERL $SYSTEMTESTTOP/start.pl --noclean --restart --port ${PORT} serve-stale ns4
1060
1061n=$((n+1))
1062echo_i "verify ancient cache statistics (serve-stale disabled) ($n)"
1063ret=0
1064rm -f ns4/named.stats
1065$RNDCCMD 10.53.0.4 stats #> /dev/null 2>&1
1066[ -f ns4/named.stats ] || ret=1
1067cp ns4/named.stats ns4/named.stats.$n
1068# Check first 10 lines of Cache DB statistics. After last queries, we expect
1069# everything to be removed or scheduled to be removed.
1070grep -A 10 "++ Cache DB RRsets ++" ns4/named.stats.$n > ns4/named.stats.$n.cachedb || ret=1
1071grep "#TXT" ns4/named.stats.$n.cachedb > /dev/null && ret=1
1072grep "#Others" ns4/named.stats.$n.cachedb > /dev/null && ret=1
1073grep "#!TXT" ns4/named.stats.$n.cachedb > /dev/null && ret=1
1074grep "#NXDOMAIN" ns4/named.stats.$n.cachedb > /dev/null && ret=1
1075status=$((status+ret))
1076if [ $ret != 0 ]; then echo_i "failed"; fi
1077
1078echo_i "exit status: $status"
1079[ $status -eq 0 ] || exit 1
1080