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