tests.sh revision 1.1.1.8 1 #!/bin/sh
2 #
3 # Copyright (C) Internet Systems Consortium, Inc. ("ISC")
4 #
5 # This Source Code Form is subject to the terms of the Mozilla Public
6 # License, v. 2.0. If a copy of the MPL was not distributed with this
7 # file, you can obtain one at https://mozilla.org/MPL/2.0/.
8 #
9 # See the COPYRIGHT file distributed with this work for additional
10 # information regarding copyright ownership.
11
12 SYSTEMTESTTOP=..
13 . $SYSTEMTESTTOP/conf.sh
14
15 RNDCCMD="$RNDC -c ../common/rndc.conf -p ${CONTROLPORT} -s"
16 DIG="$DIG +time=11"
17
18 max_stale_ttl=$(sed -ne 's,^[[:space:]]*max-stale-ttl \([[:digit:]]*\).*,\1,p' $TOP_SRCDIR/bin/named/config.c)
19 stale_answer_ttl=$(sed -ne 's,^[[:space:]]*stale-answer-ttl \([[:digit:]]*\).*,\1,p' $TOP_SRCDIR/bin/named/config.c)
20
21 status=0
22 n=0
23 #
24 # First test server with serve-stale options set.
25 #
26 echo_i "test server with serve-stale options set"
27
28 n=$((n+1))
29 echo_i "prime cache longttl.example ($n)"
30 ret=0
31 $DIG -p ${PORT} @10.53.0.1 longttl.example TXT > dig.out.test$n
32 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
33 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
34 if [ $ret != 0 ]; then echo_i "failed"; fi
35 status=$((status+ret))
36
37 n=$((n+1))
38 echo_i "prime cache data.example ($n)"
39 ret=0
40 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n
41 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
42 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
43 if [ $ret != 0 ]; then echo_i "failed"; fi
44 status=$((status+ret))
45
46 n=$((n+1))
47 echo_i "prime cache othertype.example ($n)"
48 ret=0
49 $DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$n
50 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
51 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
52 if [ $ret != 0 ]; then echo_i "failed"; fi
53 status=$((status+ret))
54
55 n=$((n+1))
56 echo_i "prime cache nodata.example ($n)"
57 ret=0
58 $DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$n
59 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
60 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
61 if [ $ret != 0 ]; then echo_i "failed"; fi
62 status=$((status+ret))
63
64 n=$((n+1))
65 echo_i "prime cache nxdomain.example ($n)"
66 ret=0
67 $DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$n
68 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
69 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
70 if [ $ret != 0 ]; then echo_i "failed"; fi
71 status=$((status+ret))
72
73 n=$((n+1))
74 echo_i "verify prime cache statistics ($n)"
75 ret=0
76 rm -f ns1/named.stats
77 $RNDCCMD 10.53.0.1 stats > /dev/null 2>&1
78 [ -f ns1/named.stats ] || ret=1
79 cp ns1/named.stats ns1/named.stats.$n
80 # Check first 10 lines of Cache DB statistics. After prime queries, we expect
81 # two active TXT, one active Others, one nxrrset TXT, and one NXDOMAIN.
82 grep -A 10 "++ Cache DB RRsets ++" ns1/named.stats.$n > ns1/named.stats.$n.cachedb || ret=1
83 grep "1 Others" ns1/named.stats.$n.cachedb > /dev/null || ret=1
84 grep "2 TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
85 grep "1 !TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
86 grep "1 NXDOMAIN" ns1/named.stats.$n.cachedb > /dev/null || ret=1
87 if [ $ret != 0 ]; then echo_i "failed"; fi
88 status=$((status+ret))
89
90 n=$((n+1))
91 echo_i "disable responses from authoritative server ($n)"
92 ret=0
93 $DIG -p ${PORT} @10.53.0.2 txt disable > dig.out.test$n
94 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
95 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
96 if [ $ret != 0 ]; then echo_i "failed"; fi
97 status=$((status+ret))
98
99 n=$((n+1))
100 echo_i "check 'rndc serve-stale status' ($n)"
101 ret=0
102 $RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
103 grep '_default: on (stale-answer-ttl=4 max-stale-ttl=3600 stale-refresh-time=30)' rndc.out.test$n > /dev/null || ret=1
104 if [ $ret != 0 ]; then echo_i "failed"; fi
105 status=$((status+ret))
106
107 sleep 2
108
109 echo_i "sending queries for tests $((n+1))-$((n+4))..."
110 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
111 $DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
112 $DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
113 $DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
114
115 wait
116
117 n=$((n+1))
118 echo_i "check stale data.example ($n)"
119 ret=0
120 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
121 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
122 grep "data\.example\..*4.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
123 if [ $ret != 0 ]; then echo_i "failed"; fi
124 status=$((status+ret))
125
126 # Run rndc dumpdb, test whether the stale data has correct comment printed.
127 # The max-stale-ttl is 3600 seconds, so the comment should say the data is
128 # stale for somewhere between 3500-3599 seconds.
129 echo_i "check rndc dump stale data.example ($n)"
130 rndc_dumpdb ns1 || ret=1
131 awk '/; stale/ { x=$0; getline; print x, $0}' ns1/named_dump.db.test$n |
132 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
133 # Also make sure the not expired data does not have a stale comment.
134 awk '/; answer/ { x=$0; getline; print x, $0}' ns1/named_dump.db.test$n |
135 grep "; answer longttl\.example.*A text record with a 600 second ttl" > /dev/null 2>&1 || ret=1
136 if [ $ret != 0 ]; then echo_i "failed"; fi
137 status=$((status+ret))
138
139 n=$((n+1))
140 echo_i "check stale othertype.example ($n)"
141 ret=0
142 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
143 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
144 grep "othertype\.example\..*4.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1
145 if [ $ret != 0 ]; then echo_i "failed"; fi
146 status=$((status+ret))
147
148 n=$((n+1))
149 echo_i "check stale nodata.example ($n)"
150 ret=0
151 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
152 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
153 grep "example\..*4.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
154 if [ $ret != 0 ]; then echo_i "failed"; fi
155 status=$((status+ret))
156
157 n=$((n+1))
158 echo_i "check stale nxdomain.example ($n)"
159 ret=0
160 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
161 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
162 grep "example\..*4.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
163 if [ $ret != 0 ]; then echo_i "failed"; fi
164 status=$((status+ret))
165
166 n=$((n+1))
167 echo_i "verify stale cache statistics ($n)"
168 ret=0
169 rm -f ns1/named.stats
170 $RNDCCMD 10.53.0.1 stats > /dev/null 2>&1
171 [ -f ns1/named.stats ] || ret=1
172 cp ns1/named.stats ns1/named.stats.$n
173 # Check first 10 lines of Cache DB statistics. After serve-stale queries, we
174 # expect one active TXT RRset, one stale TXT, one stale nxrrset TXT, and one
175 # stale NXDOMAIN.
176 grep -A 10 "++ Cache DB RRsets ++" ns1/named.stats.$n > ns1/named.stats.$n.cachedb || ret=1
177 grep "1 TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
178 grep "1 #Others" ns1/named.stats.$n.cachedb > /dev/null || ret=1
179 grep "1 #TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
180 grep "1 #!TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
181 grep "1 #NXDOMAIN" ns1/named.stats.$n.cachedb > /dev/null || ret=1
182 status=$((status+ret))
183 if [ $ret != 0 ]; then echo_i "failed"; fi
184
185 # Test stale-refresh-time when serve-stale is enabled via configuration.
186 # Steps for testing stale-refresh-time option (default).
187 # 1. Prime cache data.example txt
188 # 2. Disable responses from authoritative server.
189 # 3. Sleep for TTL duration so rrset TTL expires (2 sec)
190 # 4. Query data.example
191 # 5. Check if response come from stale rrset (4 sec TTL)
192 # 6. Enable responses from authoritative server.
193 # 7. Query data.example
194 # 8. Check if response come from stale rrset, since the query
195 # is within stale-refresh-time window.
196 n=$((n+1))
197 echo_i "check 'rndc serve-stale status' ($n)"
198 ret=0
199 $RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
200 grep '_default: on (stale-answer-ttl=4 max-stale-ttl=3600 stale-refresh-time=30)' rndc.out.test$n > /dev/null || ret=1
201 if [ $ret != 0 ]; then echo_i "failed"; fi
202 status=$((status+ret))
203
204 # Step 1-3 done above.
205
206 # Step 4.
207 n=$((n+1))
208 echo_i "sending query for test ($n)"
209 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n
210
211 # Step 5.
212 echo_i "check stale data.example (stale-refresh-time) ($n)"
213 ret=0
214 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
215 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
216 grep "data\.example\..*4.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
217 if [ $ret != 0 ]; then echo_i "failed"; fi
218 status=$((status+ret))
219
220 # Step 6.
221 n=$((n+1))
222 echo_i "enable responses from authoritative server ($n)"
223 ret=0
224 $DIG -p ${PORT} @10.53.0.2 txt enable > dig.out.test$n
225 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
226 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
227 if [ $ret != 0 ]; then echo_i "failed"; fi
228 status=$((status+ret))
229
230 # Step 7.
231 echo_i "sending query for test $((n+1))"
232 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1))
233
234 # Step 8.
235 n=$((n+1))
236 echo_i "check stale data.example comes from cache (stale-refresh-time) ($n)"
237 ret=0
238 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
239 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
240 grep "data\.example\..*4.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
241 if [ $ret != 0 ]; then echo_i "failed"; fi
242 status=$((status+ret))
243
244 #
245 # Test disabling serve-stale via rndc.
246 #
247 n=$((n+1))
248 echo_i "disable responses from authoritative server ($n)"
249 ret=0
250 $DIG -p ${PORT} @10.53.0.2 txt disable > dig.out.test$n
251 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
252 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
253 if [ $ret != 0 ]; then echo_i "failed"; fi
254 status=$((status+ret))
255
256 n=$((n+1))
257 echo_i "running 'rndc serve-stale off' ($n)"
258 ret=0
259 $RNDCCMD 10.53.0.1 serve-stale off || ret=1
260 if [ $ret != 0 ]; then echo_i "failed"; fi
261 status=$((status+ret))
262
263 n=$((n+1))
264 echo_i "check 'rndc serve-stale status' ($n)"
265 ret=0
266 $RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
267 grep '_default: off (rndc) (stale-answer-ttl=4 max-stale-ttl=3600 stale-refresh-time=30)' rndc.out.test$n > /dev/null || ret=1
268 if [ $ret != 0 ]; then echo_i "failed"; fi
269 status=$((status+ret))
270
271 echo_i "sending queries for tests $((n+1))-$((n+4))..."
272 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
273 $DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
274 $DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
275 $DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
276
277 wait
278
279 n=$((n+1))
280 echo_i "check stale data.example (serve-stale off) ($n)"
281 ret=0
282 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
283 if [ $ret != 0 ]; then echo_i "failed"; fi
284 status=$((status+ret))
285
286 n=$((n+1))
287 echo_i "check stale othertype.example (serve-stale off) ($n)"
288 ret=0
289 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
290 if [ $ret != 0 ]; then echo_i "failed"; fi
291 status=$((status+ret))
292
293 n=$((n+1))
294 echo_i "check stale nodata.example (serve-stale off) ($n)"
295 ret=0
296 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
297 if [ $ret != 0 ]; then echo_i "failed"; fi
298 status=$((status+ret))
299
300 n=$((n+1))
301 echo_i "check stale nxdomain.example (serve-stale off) ($n)"
302 ret=0
303 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
304 if [ $ret != 0 ]; then echo_i "failed"; fi
305 status=$((status+ret))
306
307 #
308 # Test enabling serve-stale via rndc.
309 #
310 n=$((n+1))
311 echo_i "running 'rndc serve-stale on' ($n)"
312 ret=0
313 $RNDCCMD 10.53.0.1 serve-stale on || ret=1
314 if [ $ret != 0 ]; then echo_i "failed"; fi
315 status=$((status+ret))
316
317 n=$((n+1))
318 echo_i "check 'rndc serve-stale status' ($n)"
319 ret=0
320 $RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
321 grep '_default: on (rndc) (stale-answer-ttl=4 max-stale-ttl=3600 stale-refresh-time=30)' rndc.out.test$n > /dev/null || ret=1
322 if [ $ret != 0 ]; then echo_i "failed"; fi
323 status=$((status+ret))
324
325 echo_i "sending queries for tests $((n+1))-$((n+4))..."
326 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
327 $DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
328 $DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
329 $DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
330
331 wait
332
333 n=$((n+1))
334 echo_i "check stale data.example (serve-stale on) ($n)"
335 ret=0
336 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
337 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
338 grep "data\.example\..*4.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
339 if [ $ret != 0 ]; then echo_i "failed"; fi
340 status=$((status+ret))
341
342 n=$((n+1))
343 echo_i "check stale othertype.example (serve-stale on) ($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 "othertype\.example\..*4.*IN.*CAA.*0.*issue" 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 nodata.example (serve-stale on) ($n)"
353 ret=0
354 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
355 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
356 grep "example\..*4.*IN.*SOA" 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 nxdomain.example (serve-stale on) ($n)"
362 ret=0
363 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
364 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
365 grep "example\..*4.*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 "running 'rndc serve-stale off' ($n)"
371 ret=0
372 $RNDCCMD 10.53.0.1 serve-stale off || ret=1
373 if [ $ret != 0 ]; then echo_i "failed"; fi
374 status=$((status+ret))
375
376 n=$((n+1))
377 echo_i "running 'rndc serve-stale reset' ($n)"
378 ret=0
379 $RNDCCMD 10.53.0.1 serve-stale reset || ret=1
380 if [ $ret != 0 ]; then echo_i "failed"; fi
381 status=$((status+ret))
382
383 n=$((n+1))
384 echo_i "check 'rndc serve-stale status' ($n)"
385 ret=0
386 $RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
387 grep '_default: on (stale-answer-ttl=4 max-stale-ttl=3600 stale-refresh-time=30)' rndc.out.test$n > /dev/null || ret=1
388 if [ $ret != 0 ]; then echo_i "failed"; fi
389 status=$((status+ret))
390
391 echo_i "sending queries for tests $((n+1))-$((n+4))..."
392 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
393 $DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
394 $DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
395 $DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
396
397 wait
398
399 n=$((n+1))
400 echo_i "check stale data.example (serve-stale reset) ($n)"
401 ret=0
402 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
403 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
404 grep "data\.example\..*4.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
405 if [ $ret != 0 ]; then echo_i "failed"; fi
406 status=$((status+ret))
407
408 n=$((n+1))
409 echo_i "check stale othertype.example (serve-stale reset) ($n)"
410 ret=0
411 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
412 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
413 grep "othertype.example\..*4.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1
414 if [ $ret != 0 ]; then echo_i "failed"; fi
415 status=$((status+ret))
416
417 n=$((n+1))
418 echo_i "check stale nodata.example (serve-stale reset) ($n)"
419 ret=0
420 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
421 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
422 grep "example\..*4.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
423 if [ $ret != 0 ]; then echo_i "failed"; fi
424 status=$((status+ret))
425
426 n=$((n+1))
427 echo_i "check stale nxdomain.example (serve-stale reset) ($n)"
428 ret=0
429 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
430 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
431 grep "example\..*4.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
432 if [ $ret != 0 ]; then echo_i "failed"; fi
433 status=$((status+ret))
434
435 n=$((n+1))
436 echo_i "running 'rndc serve-stale off' ($n)"
437 ret=0
438 $RNDCCMD 10.53.0.1 serve-stale off || ret=1
439 if [ $ret != 0 ]; then echo_i "failed"; fi
440 status=$((status+ret))
441
442 n=$((n+1))
443 echo_i "check 'rndc serve-stale status' ($n)"
444 ret=0
445 $RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
446 grep '_default: off (rndc) (stale-answer-ttl=4 max-stale-ttl=3600 stale-refresh-time=30)' rndc.out.test$n > /dev/null || ret=1
447 if [ $ret != 0 ]; then echo_i "failed"; fi
448 status=$((status+ret))
449
450 #
451 # Update named.conf.
452 # Test server with low max-stale-ttl.
453 #
454 echo_i "test server with serve-stale options set, low max-stale-ttl"
455
456 n=$((n+1))
457 echo_i "updating ns1/named.conf ($n)"
458 ret=0
459 copy_setports ns1/named2.conf.in ns1/named.conf
460 if [ $ret != 0 ]; then echo_i "failed"; fi
461 status=$((status+ret))
462
463 n=$((n+1))
464 echo_i "running 'rndc reload' ($n)"
465 ret=0
466 rndc_reload ns1 10.53.0.1
467 if [ $ret != 0 ]; then echo_i "failed"; fi
468 status=$((status+ret))
469
470 n=$((n+1))
471 echo_i "check 'rndc serve-stale status' ($n)"
472 ret=0
473 $RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
474 grep '_default: off (rndc) (stale-answer-ttl=3 max-stale-ttl=20 stale-refresh-time=30)' rndc.out.test$n > /dev/null || ret=1
475 if [ $ret != 0 ]; then echo_i "failed"; fi
476 status=$((status+ret))
477
478 n=$((n+1))
479 echo_i "flush cache, re-enable serve-stale and query again ($n)"
480 ret=0
481 $RNDCCMD 10.53.0.1 flushtree example > rndc.out.test$n.1 2>&1 || ret=1
482 $RNDCCMD 10.53.0.1 serve-stale on > rndc.out.test$n.2 2>&1 || ret=1
483 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n
484 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
485 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
486 if [ $ret != 0 ]; then echo_i "failed"; fi
487 status=$((status+ret))
488
489 n=$((n+1))
490 echo_i "check 'rndc serve-stale status' ($n)"
491 ret=0
492 $RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
493 grep '_default: on (rndc) (stale-answer-ttl=3 max-stale-ttl=20 stale-refresh-time=30)' rndc.out.test$n > /dev/null || ret=1
494 if [ $ret != 0 ]; then echo_i "failed"; fi
495 status=$((status+ret))
496
497 n=$((n+1))
498 echo_i "enable responses from authoritative server ($n)"
499 ret=0
500 $DIG -p ${PORT} @10.53.0.2 txt enable > dig.out.test$n
501 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
502 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
503 if [ $ret != 0 ]; then echo_i "failed"; fi
504 status=$((status+ret))
505
506 n=$((n+1))
507 echo_i "prime cache longttl.example (low max-stale-ttl) ($n)"
508 ret=0
509 $DIG -p ${PORT} @10.53.0.1 longttl.example TXT > dig.out.test$n
510 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
511 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
512 if [ $ret != 0 ]; then echo_i "failed"; fi
513 status=$((status+ret))
514
515 n=$((n+1))
516 echo_i "prime cache data.example (low max-stale-ttl) ($n)"
517 ret=0
518 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n
519 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
520 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
521 if [ $ret != 0 ]; then echo_i "failed"; fi
522 status=$((status+ret))
523
524 n=$((n+1))
525 echo_i "prime cache othertype.example (low max-stale-ttl) ($n)"
526 ret=0
527 $DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$n
528 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
529 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
530 if [ $ret != 0 ]; then echo_i "failed"; fi
531 status=$((status+ret))
532
533 n=$((n+1))
534 echo_i "prime cache nodata.example (low max-stale-ttl) ($n)"
535 ret=0
536 $DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$n
537 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
538 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
539 if [ $ret != 0 ]; then echo_i "failed"; fi
540 status=$((status+ret))
541
542 n=$((n+1))
543 echo_i "prime cache nxdomain.example (low max-stale-ttl) ($n)"
544 ret=0
545 $DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$n
546 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
547 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
548 if [ $ret != 0 ]; then echo_i "failed"; fi
549 status=$((status+ret))
550
551 # Keep track of time so we can access these RRset later, when we expect them
552 # to become ancient.
553 t1=`$PERL -e 'print time()'`
554
555 n=$((n+1))
556 echo_i "verify prime cache statistics (low max-stale-ttl) ($n)"
557 ret=0
558 rm -f ns1/named.stats
559 $RNDCCMD 10.53.0.1 stats > /dev/null 2>&1
560 [ -f ns1/named.stats ] || ret=1
561 cp ns1/named.stats ns1/named.stats.$n
562 # Check first 10 lines of Cache DB statistics. After prime queries, we expect
563 # two active TXT RRsets, one active Others, one nxrrset TXT, and one NXDOMAIN.
564 grep -A 10 "++ Cache DB RRsets ++" ns1/named.stats.$n > ns1/named.stats.$n.cachedb || ret=1
565 grep "2 TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
566 grep "1 Others" ns1/named.stats.$n.cachedb > /dev/null || ret=1
567 grep "1 !TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
568 grep "1 NXDOMAIN" ns1/named.stats.$n.cachedb > /dev/null || ret=1
569 status=$((status+ret))
570 if [ $ret != 0 ]; then echo_i "failed"; fi
571
572 n=$((n+1))
573 echo_i "disable responses from authoritative server ($n)"
574 ret=0
575 $DIG -p ${PORT} @10.53.0.2 txt disable > dig.out.test$n
576 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
577 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
578 if [ $ret != 0 ]; then echo_i "failed"; fi
579 status=$((status+ret))
580
581 sleep 2
582
583 echo_i "sending queries for tests $((n+1))-$((n+4))..."
584 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
585 $DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
586 $DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
587 $DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
588
589 wait
590
591 n=$((n+1))
592 echo_i "check stale data.example (low max-stale-ttl) ($n)"
593 ret=0
594 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
595 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
596 grep "data\.example\..*3.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
597 if [ $ret != 0 ]; then echo_i "failed"; fi
598 status=$((status+ret))
599
600 n=$((n+1))
601 echo_i "check stale othertype.example (low max-stale-ttl) ($n)"
602 ret=0
603 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
604 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
605 grep "othertype\.example\..*3.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1
606 if [ $ret != 0 ]; then echo_i "failed"; fi
607 status=$((status+ret))
608
609 n=$((n+1))
610 echo_i "check stale nodata.example (low max-stale-ttl) ($n)"
611 ret=0
612 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
613 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
614 grep "example\..*3.*IN.*SOA" 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 stale nxdomain.example (low max-stale-ttl) ($n)"
620 ret=0
621 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
622 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
623 grep "example\..*3.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
624 if [ $ret != 0 ]; then echo_i "failed"; fi
625 status=$((status+ret))
626
627 n=$((n+1))
628 echo_i "verify stale cache statistics (low max-stale-ttl) ($n)"
629 ret=0
630 rm -f ns1/named.stats
631 $RNDCCMD 10.53.0.1 stats > /dev/null 2>&1
632 [ -f ns1/named.stats ] || ret=1
633 cp ns1/named.stats ns1/named.stats.$n
634 # Check first 10 lines of Cache DB statistics. After serve-stale queries, we
635 # expect one active TXT RRset, one stale TXT, one stale nxrrset TXT, and one
636 # stale NXDOMAIN.
637 grep -A 10 "++ Cache DB RRsets ++" ns1/named.stats.$n > ns1/named.stats.$n.cachedb || ret=1
638 grep "1 TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
639 grep "1 #TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
640 grep "1 #Others" ns1/named.stats.$n.cachedb > /dev/null || ret=1
641 grep "1 #!TXT" ns1/named.stats.$n.cachedb > /dev/null || ret=1
642 grep "1 #NXDOMAIN" ns1/named.stats.$n.cachedb > /dev/null || ret=1
643
644 status=$((status+ret))
645 if [ $ret != 0 ]; then echo_i "failed"; fi
646
647 # Retrieve max-stale-ttl value.
648 interval_to_ancient=`grep 'max-stale-ttl' ns1/named2.conf.in | awk '{ print $2 }' | tr -d ';'`
649 # We add 2 seconds to it since this is the ttl value of the records being
650 # tested.
651 interval_to_ancient=$((interval_to_ancient + 2))
652 t2=`$PERL -e 'print time()'`
653 elapsed=$((t2 - t1))
654
655 # If elapsed time so far is less than max-stale-ttl + 2 seconds, then we sleep
656 # enough to ensure that we'll ask for ancient RRsets in the next queries.
657 if [ $elapsed -lt $interval_to_ancient ]; then
658 sleep $((interval_to_ancient - elapsed))
659 fi
660
661 echo_i "sending queries for tests $((n+1))-$((n+4))..."
662 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1)) &
663 $DIG -p ${PORT} @10.53.0.1 othertype.example CAA > dig.out.test$((n+2)) &
664 $DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$((n+3)) &
665 $DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$((n+4))
666
667 wait
668
669 n=$((n+1))
670 echo_i "check ancient data.example (low max-stale-ttl) ($n)"
671 ret=0
672 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
673 grep "ANSWER: 0," 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 "check ancient othertype.example (low max-stale-ttl) ($n)"
679 ret=0
680 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
681 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
682 if [ $ret != 0 ]; then echo_i "failed"; fi
683 status=$((status+ret))
684
685 n=$((n+1))
686 echo_i "check ancient nodata.example (low max-stale-ttl) ($n)"
687 ret=0
688 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
689 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
690 if [ $ret != 0 ]; then echo_i "failed"; fi
691 status=$((status+ret))
692
693 n=$((n+1))
694 echo_i "check ancient nxdomain.example (low max-stale-ttl) ($n)"
695 ret=0
696 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
697 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
698 if [ $ret != 0 ]; then echo_i "failed"; fi
699 status=$((status+ret))
700
701 # Test stale-refresh-time when serve-stale is enabled via rndc.
702 # Steps for testing stale-refresh-time option (default).
703 # 1. Prime cache data.example txt
704 # 2. Disable responses from authoritative server.
705 # 3. Sleep for TTL duration so rrset TTL expires (2 sec)
706 # 4. Query data.example
707 # 5. Check if response come from stale rrset (3 sec TTL)
708 # 6. Enable responses from authoritative server.
709 # 7. Query data.example
710 # 8. Check if response come from stale rrset, since the query
711 # is within stale-refresh-time window.
712 n=$((n+1))
713 echo_i "flush cache, enable responses from authoritative server ($n)"
714 ret=0
715 $RNDCCMD 10.53.0.1 flushtree example > rndc.out.test$n.1 2>&1 || ret=1
716 $DIG -p ${PORT} @10.53.0.2 txt enable > dig.out.test$n
717 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
718 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
719 if [ $ret != 0 ]; then echo_i "failed"; fi
720 status=$((status+ret))
721
722 n=$((n+1))
723 echo_i "check 'rndc serve-stale status' ($n)"
724 ret=0
725 $RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
726 grep '_default: on (rndc) (stale-answer-ttl=3 max-stale-ttl=20 stale-refresh-time=30)' rndc.out.test$n > /dev/null || ret=1
727 if [ $ret != 0 ]; then echo_i "failed"; fi
728 status=$((status+ret))
729
730 # Step 1.
731 n=$((n+1))
732 echo_i "prime cache data.example (stale-refresh-time rndc) ($n)"
733 ret=0
734 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n
735 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
736 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
737 grep "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
738 if [ $ret != 0 ]; then echo_i "failed"; fi
739 status=$((status+ret))
740
741 # Step 2.
742 n=$((n+1))
743 echo_i "disable responses from authoritative server ($n)"
744 ret=0
745 $DIG -p ${PORT} @10.53.0.2 txt disable > dig.out.test$n
746 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
747 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
748 if [ $ret != 0 ]; then echo_i "failed"; fi
749 status=$((status+ret))
750
751 # Step 3.
752 sleep 2
753
754 # Step 4.
755 n=$((n+1))
756 echo_i "sending query for test ($n)"
757 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n
758
759 # Step 5.
760 echo_i "check stale data.example (stale-refresh-time rndc) ($n)"
761 ret=0
762 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
763 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
764 grep "data\.example\..*3.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
765 if [ $ret != 0 ]; then echo_i "failed"; fi
766 status=$((status+ret))
767
768 # Step 6.
769 n=$((n+1))
770 echo_i "enable responses from authoritative server ($n)"
771 ret=0
772 $DIG -p ${PORT} @10.53.0.2 txt enable > dig.out.test$n
773 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
774 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
775 if [ $ret != 0 ]; then echo_i "failed"; fi
776 status=$((status+ret))
777
778 # Step 7.
779 echo_i "sending query for test $((n+1))"
780 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1))
781
782 # Step 8.
783 n=$((n+1))
784 echo_i "check stale data.example comes from cache (stale-refresh-time rndc) ($n)"
785 ret=0
786 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
787 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
788 grep "data\.example\..*3.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
789 if [ $ret != 0 ]; then echo_i "failed"; fi
790 status=$((status+ret))
791
792 # Steps for testing stale-refresh-time option (disabled).
793 # 1. Prime cache data.example txt
794 # 2. Disable responses from authoritative server.
795 # 3. Sleep for TTL duration so rrset TTL expires (2 sec)
796 # 4. Query data.example
797 # 5. Check if response come from stale rrset (3 sec TTL)
798 # 6. Enable responses from authoritative server.
799 # 7. Query data.example
800 # 8. Check if response come from stale rrset, since the query
801 # is within stale-refresh-time window.
802 n=$((n+1))
803 echo_i "updating ns1/named.conf ($n)"
804 ret=0
805 copy_setports ns1/named3.conf.in ns1/named.conf
806 if [ $ret != 0 ]; then echo_i "failed"; fi
807 status=$((status+ret))
808
809 n=$((n+1))
810 echo_i "running 'rndc reload' ($n)"
811 ret=0
812 rndc_reload ns1 10.53.0.1
813 if [ $ret != 0 ]; then echo_i "failed"; fi
814 status=$((status+ret))
815
816 n=$((n+1))
817 echo_i "check 'rndc serve-stale status' ($n)"
818 ret=0
819 $RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1
820 grep '_default: on (rndc) (stale-answer-ttl=3 max-stale-ttl=20 stale-refresh-time=0)' rndc.out.test$n > /dev/null || ret=1
821 if [ $ret != 0 ]; then echo_i "failed"; fi
822 status=$((status+ret))
823
824 n=$((n+1))
825 echo_i "flush cache, enable responses from authoritative server ($n)"
826 ret=0
827 $RNDCCMD 10.53.0.1 flushtree example > rndc.out.test$n.1 2>&1 || ret=1
828 $DIG -p ${PORT} @10.53.0.2 txt enable > dig.out.test$n
829 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
830 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
831 if [ $ret != 0 ]; then echo_i "failed"; fi
832 status=$((status+ret))
833
834 # Step 1.
835 n=$((n+1))
836 echo_i "prime cache data.example (stale-refresh-time disabled) ($n)"
837 ret=0
838 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n
839 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
840 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
841 grep "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
842 if [ $ret != 0 ]; then echo_i "failed"; fi
843 status=$((status+ret))
844
845 # Step 2.
846 n=$((n+1))
847 echo_i "disable responses from authoritative server ($n)"
848 ret=0
849 $DIG -p ${PORT} @10.53.0.2 txt disable > dig.out.test$n
850 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
851 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
852 if [ $ret != 0 ]; then echo_i "failed"; fi
853 status=$((status+ret))
854
855 # Step 3.
856 sleep 2
857
858 # Step 4.
859 n=$((n+1))
860 echo_i "sending query for test ($n)"
861 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n
862
863 # Step 5.
864 echo_i "check stale data.example (stale-refresh-time disabled) ($n)"
865 ret=0
866 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
867 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
868 grep "data\.example\..*3.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
869 if [ $ret != 0 ]; then echo_i "failed"; fi
870 status=$((status+ret))
871
872 # Step 6.
873 n=$((n+1))
874 echo_i "enable responses from authoritative server ($n)"
875 ret=0
876 $DIG -p ${PORT} @10.53.0.2 txt enable > dig.out.test$n
877 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
878 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
879 if [ $ret != 0 ]; then echo_i "failed"; fi
880 status=$((status+ret))
881
882 # Step 7.
883 echo_i "sending query for test $((n+1))"
884 $DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$((n+1))
885
886 # Step 8.
887 n=$((n+1))
888 echo_i "check data.example comes from authoritative (stale-refresh-time disabled) ($n)"
889 ret=0
890 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
891 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
892 grep "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
893 if [ $ret != 0 ]; then echo_i "failed"; fi
894 status=$((status+ret))
895
896 #
897 # Now test server with no serve-stale options set.
898 #
899 echo_i "test server with no serve-stale options set"
900
901 n=$((n+1))
902 echo_i "enable responses from authoritative server ($n)"
903 ret=0
904 $DIG -p ${PORT} @10.53.0.2 txt enable > dig.out.test$n
905 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
906 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
907 if [ $ret != 0 ]; then echo_i "failed"; fi
908 status=$((status+ret))
909
910 n=$((n+1))
911 echo_i "prime cache longttl.example (max-stale-ttl default) ($n)"
912 ret=0
913 $DIG -p ${PORT} @10.53.0.3 longttl.example TXT > dig.out.test$n
914 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
915 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
916 if [ $ret != 0 ]; then echo_i "failed"; fi
917 status=$((status+ret))
918
919 n=$((n+1))
920 echo_i "prime cache data.example (max-stale-ttl default) ($n)"
921 ret=0
922 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
923 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
924 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
925 grep "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
926 if [ $ret != 0 ]; then echo_i "failed"; fi
927 status=$((status+ret))
928
929 n=$((n+1))
930 echo_i "prime cache othertype.example (max-stale-ttl default) ($n)"
931 ret=0
932 $DIG -p ${PORT} @10.53.0.3 othertype.example CAA > dig.out.test$n
933 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
934 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
935 grep "othertype\.example\..*2.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1
936 if [ $ret != 0 ]; then echo_i "failed"; fi
937 status=$((status+ret))
938
939 n=$((n+1))
940 echo_i "prime cache nodata.example (max-stale-ttl default) ($n)"
941 ret=0
942 $DIG -p ${PORT} @10.53.0.3 nodata.example TXT > dig.out.test$n
943 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
944 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
945 grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
946 if [ $ret != 0 ]; then echo_i "failed"; fi
947 status=$((status+ret))
948
949 n=$((n+1))
950 echo_i "prime cache nxdomain.example (max-stale-ttl default) ($n)"
951 ret=0
952 $DIG -p ${PORT} @10.53.0.3 nxdomain.example TXT > dig.out.test$n
953 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
954 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
955 grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
956 if [ $ret != 0 ]; then echo_i "failed"; fi
957 status=$((status+ret))
958
959 n=$((n+1))
960 echo_i "verify prime cache statistics (max-stale-ttl default) ($n)"
961 ret=0
962 rm -f ns3/named.stats
963 $RNDCCMD 10.53.0.3 stats > /dev/null 2>&1
964 [ -f ns3/named.stats ] || ret=1
965 cp ns3/named.stats ns3/named.stats.$n
966 # Check first 10 lines of Cache DB statistics. After prime queries, we expect
967 # two active TXT RRsets, one active Others, one nxrrset TXT, and one NXDOMAIN.
968 grep -A 10 "++ Cache DB RRsets ++" ns3/named.stats.$n > ns3/named.stats.$n.cachedb || ret=1
969 grep "2 TXT" ns3/named.stats.$n.cachedb > /dev/null || ret=1
970 grep "1 Others" ns3/named.stats.$n.cachedb > /dev/null || ret=1
971 grep "1 !TXT" ns3/named.stats.$n.cachedb > /dev/null || ret=1
972 grep "1 NXDOMAIN" ns3/named.stats.$n.cachedb > /dev/null || ret=1
973 status=$((status+ret))
974 if [ $ret != 0 ]; then echo_i "failed"; fi
975
976 n=$((n+1))
977 echo_i "disable responses from authoritative server ($n)"
978 ret=0
979 $DIG -p ${PORT} @10.53.0.2 txt disable > dig.out.test$n
980 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
981 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
982 if [ $ret != 0 ]; then echo_i "failed"; fi
983 status=$((status+ret))
984
985 n=$((n+1))
986 echo_i "check 'rndc serve-stale status' ($n)"
987 ret=0
988 $RNDCCMD 10.53.0.3 serve-stale status > rndc.out.test$n 2>&1 || ret=1
989 grep "_default: off (stale-answer-ttl=$stale_answer_ttl max-stale-ttl=$max_stale_ttl stale-refresh-time=30)" rndc.out.test$n > /dev/null || ret=1
990 if [ $ret != 0 ]; then echo_i "failed"; fi
991 status=$((status+ret))
992
993 sleep 2
994
995 echo_i "sending queries for tests $((n+1))-$((n+4))..."
996 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$((n+1)) &
997 $DIG -p ${PORT} @10.53.0.3 othertype.example CAA > dig.out.test$((n+2)) &
998 $DIG -p ${PORT} @10.53.0.3 nodata.example TXT > dig.out.test$((n+3)) &
999 $DIG -p ${PORT} @10.53.0.3 nxdomain.example TXT > dig.out.test$((n+4))
1000
1001 wait
1002
1003 n=$((n+1))
1004 echo_i "check fail of data.example (max-stale-ttl default) ($n)"
1005 ret=0
1006 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
1007 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
1008 if [ $ret != 0 ]; then echo_i "failed"; fi
1009 status=$((status+ret))
1010
1011 n=$((n+1))
1012 echo_i "check fail of othertype.example (max-stale-ttl default) ($n)"
1013 ret=0
1014 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
1015 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
1016 if [ $ret != 0 ]; then echo_i "failed"; fi
1017 status=$((status+ret))
1018
1019 n=$((n+1))
1020 echo_i "check fail of nodata.example (max-stale-ttl default) ($n)"
1021 ret=0
1022 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
1023 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
1024 if [ $ret != 0 ]; then echo_i "failed"; fi
1025 status=$((status+ret))
1026
1027 n=$((n+1))
1028 echo_i "check fail of nxdomain.example (max-stale-ttl default) ($n)"
1029 ret=0
1030 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
1031 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
1032 if [ $ret != 0 ]; then echo_i "failed"; fi
1033 status=$((status+ret))
1034
1035 n=$((n+1))
1036 echo_i "verify stale cache statistics (max-stale-ttl default) ($n)"
1037 ret=0
1038 rm -f ns3/named.stats
1039 $RNDCCMD 10.53.0.3 stats > /dev/null 2>&1
1040 [ -f ns3/named.stats ] || ret=1
1041 cp ns3/named.stats ns3/named.stats.$n
1042 # Check first 10 lines of Cache DB statistics. After last queries, we expect
1043 # one active TXT RRset, one stale TXT, one stale nxrrset TXT, and one stale
1044 # NXDOMAIN.
1045 grep -A 10 "++ Cache DB RRsets ++" ns3/named.stats.$n > ns3/named.stats.$n.cachedb || ret=1
1046 grep "1 TXT" ns3/named.stats.$n.cachedb > /dev/null || ret=1
1047 grep "1 #TXT" ns3/named.stats.$n.cachedb > /dev/null || ret=1
1048 grep "1 #Others" ns3/named.stats.$n.cachedb > /dev/null || ret=1
1049 grep "1 #!TXT" ns3/named.stats.$n.cachedb > /dev/null || ret=1
1050 grep "1 #NXDOMAIN" ns3/named.stats.$n.cachedb > /dev/null || ret=1
1051
1052 status=$((status+ret))
1053 if [ $ret != 0 ]; then echo_i "failed"; fi
1054
1055 n=$((n+1))
1056 echo_i "check 'rndc serve-stale on' ($n)"
1057 ret=0
1058 $RNDCCMD 10.53.0.3 serve-stale on > rndc.out.test$n 2>&1 || ret=1
1059 if [ $ret != 0 ]; then echo_i "failed"; fi
1060 status=$((status+ret))
1061
1062 n=$((n+1))
1063 echo_i "check 'rndc serve-stale status' ($n)"
1064 ret=0
1065 $RNDCCMD 10.53.0.3 serve-stale status > rndc.out.test$n 2>&1 || ret=1
1066 grep "_default: on (rndc) (stale-answer-ttl=$stale_answer_ttl max-stale-ttl=$max_stale_ttl stale-refresh-time=30)" rndc.out.test$n > /dev/null || ret=1
1067 if [ $ret != 0 ]; then echo_i "failed"; fi
1068 status=$((status+ret))
1069
1070 sleep 2
1071
1072 echo_i "sending queries for tests $((n+1))-$((n+4))..."
1073 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$((n+1)) &
1074 $DIG -p ${PORT} @10.53.0.3 othertype.example CAA > dig.out.test$((n+2)) &
1075 $DIG -p ${PORT} @10.53.0.3 nodata.example TXT > dig.out.test$((n+3)) &
1076 $DIG -p ${PORT} @10.53.0.3 nxdomain.example TXT > dig.out.test$((n+4))
1077
1078 wait
1079
1080 n=$((n+1))
1081 echo_i "check data.example (max-stale-ttl default) ($n)"
1082 ret=0
1083 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
1084 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1085 grep "data\.example\..*30.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
1086 if [ $ret != 0 ]; then echo_i "failed"; fi
1087 status=$((status+ret))
1088
1089 n=$((n+1))
1090 echo_i "check othertype.example (max-stale-ttl default) ($n)"
1091 ret=0
1092 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
1093 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1094 grep "example\..*30.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1
1095 if [ $ret != 0 ]; then echo_i "failed"; fi
1096 status=$((status+ret))
1097
1098 n=$((n+1))
1099 echo_i "check nodata.example (max-stale-ttl default) ($n)"
1100 ret=0
1101 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
1102 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
1103 grep "example\..*30.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
1104 if [ $ret != 0 ]; then echo_i "failed"; fi
1105 status=$((status+ret))
1106
1107 n=$((n+1))
1108 echo_i "check nxdomain.example (max-stale-ttl default) ($n)"
1109 ret=0
1110 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
1111 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
1112 grep "example\..*30.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
1113 if [ $ret != 0 ]; then echo_i "failed"; fi
1114 status=$((status+ret))
1115
1116 #
1117 # Now test server with serve-stale answers disabled.
1118 #
1119 echo_i "test server with serve-stale disabled"
1120
1121 n=$((n+1))
1122 echo_i "enable responses from authoritative server ($n)"
1123 ret=0
1124 $DIG -p ${PORT} @10.53.0.2 txt enable > dig.out.test$n
1125 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1126 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
1127 if [ $ret != 0 ]; then echo_i "failed"; fi
1128 status=$((status+ret))
1129
1130 n=$((n+1))
1131 echo_i "prime cache longttl.example (serve-stale answers disabled) ($n)"
1132 ret=0
1133 $DIG -p ${PORT} @10.53.0.4 longttl.example TXT > dig.out.test$n
1134 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
1135 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1136 if [ $ret != 0 ]; then echo_i "failed"; fi
1137 status=$((status+ret))
1138
1139 n=$((n+1))
1140 echo_i "prime cache data.example (serve-stale answers disabled) ($n)"
1141 ret=0
1142 $DIG -p ${PORT} @10.53.0.4 data.example TXT > dig.out.test$n
1143 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
1144 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1145 grep "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
1146 if [ $ret != 0 ]; then echo_i "failed"; fi
1147 status=$((status+ret))
1148
1149 n=$((n+1))
1150 echo_i "prime cache othertype.example (serve-stale answers disabled) ($n)"
1151 ret=0
1152 $DIG -p ${PORT} @10.53.0.4 othertype.example CAA > dig.out.test$n
1153 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
1154 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1155 grep "othertype\.example\..*2.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1
1156 if [ $ret != 0 ]; then echo_i "failed"; fi
1157 status=$((status+ret))
1158
1159 n=$((n+1))
1160 echo_i "prime cache nodata.example (serve-stale answers disabled) ($n)"
1161 ret=0
1162 $DIG -p ${PORT} @10.53.0.4 nodata.example TXT > dig.out.test$n
1163 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
1164 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
1165 grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
1166 if [ $ret != 0 ]; then echo_i "failed"; fi
1167 status=$((status+ret))
1168
1169 n=$((n+1))
1170 echo_i "prime cache nxdomain.example (serve-stale answers disabled) ($n)"
1171 ret=0
1172 $DIG -p ${PORT} @10.53.0.4 nxdomain.example TXT > dig.out.test$n
1173 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
1174 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
1175 grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
1176 if [ $ret != 0 ]; then echo_i "failed"; fi
1177 status=$((status+ret))
1178
1179 n=$((n+1))
1180 echo_i "verify prime cache statistics (serve-stale answers disabled) ($n)"
1181 ret=0
1182 rm -f ns4/named.stats
1183 $RNDCCMD 10.53.0.4 stats > /dev/null 2>&1
1184 [ -f ns4/named.stats ] || ret=1
1185 cp ns4/named.stats ns4/named.stats.$n
1186 # Check first 10 lines of Cache DB statistics. After prime queries, we expect
1187 # two active TXT RRsets, one active Others, one nxrrset TXT, and one NXDOMAIN.
1188 grep -A 10 "++ Cache DB RRsets ++" ns4/named.stats.$n > ns4/named.stats.$n.cachedb || ret=1
1189 grep "2 TXT" ns4/named.stats.$n.cachedb > /dev/null || ret=1
1190 grep "1 Others" ns4/named.stats.$n.cachedb > /dev/null || ret=1
1191 grep "1 !TXT" ns4/named.stats.$n.cachedb > /dev/null || ret=1
1192 grep "1 NXDOMAIN" ns4/named.stats.$n.cachedb > /dev/null || ret=1
1193 status=$((status+ret))
1194 if [ $ret != 0 ]; then echo_i "failed"; fi
1195
1196 n=$((n+1))
1197 echo_i "disable responses from authoritative server ($n)"
1198 ret=0
1199 $DIG -p ${PORT} @10.53.0.2 txt disable > dig.out.test$n
1200 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1201 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
1202 if [ $ret != 0 ]; then echo_i "failed"; fi
1203 status=$((status+ret))
1204
1205 n=$((n+1))
1206 echo_i "check 'rndc serve-stale status' ($n)"
1207 ret=0
1208 $RNDCCMD 10.53.0.4 serve-stale status > rndc.out.test$n 2>&1 || ret=1
1209 grep "_default: off (stale-answer-ttl=$stale_answer_ttl max-stale-ttl=$max_stale_ttl stale-refresh-time=30)" rndc.out.test$n > /dev/null || ret=1
1210 if [ $ret != 0 ]; then echo_i "failed"; fi
1211 status=$((status+ret))
1212
1213 sleep 2
1214
1215 echo_i "sending queries for tests $((n+1))-$((n+4))..."
1216 $DIG -p ${PORT} @10.53.0.4 data.example TXT > dig.out.test$((n+1)) &
1217 $DIG -p ${PORT} @10.53.0.4 othertype.example CAA > dig.out.test$((n+2)) &
1218 $DIG -p ${PORT} @10.53.0.4 nodata.example TXT > dig.out.test$((n+3)) &
1219 $DIG -p ${PORT} @10.53.0.4 nxdomain.example TXT > dig.out.test$((n+4))
1220
1221 wait
1222
1223 n=$((n+1))
1224 echo_i "check fail of data.example (serve-stale answers disabled) ($n)"
1225 ret=0
1226 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
1227 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
1228 if [ $ret != 0 ]; then echo_i "failed"; fi
1229 status=$((status+ret))
1230
1231 n=$((n+1))
1232 echo_i "check fail of othertype.example (serve-stale answers disabled) ($n)"
1233 ret=0
1234 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
1235 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
1236 if [ $ret != 0 ]; then echo_i "failed"; fi
1237 status=$((status+ret))
1238
1239 n=$((n+1))
1240 echo_i "check fail of nodata.example (serve-stale answers disabled) ($n)"
1241 ret=0
1242 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
1243 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
1244 if [ $ret != 0 ]; then echo_i "failed"; fi
1245 status=$((status+ret))
1246
1247 n=$((n+1))
1248 echo_i "check fail of nxdomain.example (serve-stale answers disabled) ($n)"
1249 ret=0
1250 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
1251 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
1252 if [ $ret != 0 ]; then echo_i "failed"; fi
1253 status=$((status+ret))
1254
1255 n=$((n+1))
1256 echo_i "verify stale cache statistics (serve-stale answers disabled) ($n)"
1257 ret=0
1258 rm -f ns4/named.stats
1259 $RNDCCMD 10.53.0.4 stats > /dev/null 2>&1
1260 [ -f ns4/named.stats ] || ret=1
1261 cp ns4/named.stats ns4/named.stats.$n
1262 # Check first 10 lines of Cache DB statistics. After last queries, we expect
1263 # one active TXT RRset, one stale TXT, one stale nxrrset TXT, and one stale
1264 # NXDOMAIN.
1265 grep -A 10 "++ Cache DB RRsets ++" ns4/named.stats.$n > ns4/named.stats.$n.cachedb || ret=1
1266 grep "1 TXT" ns4/named.stats.$n.cachedb > /dev/null || ret=1
1267 grep "1 #TXT" ns4/named.stats.$n.cachedb > /dev/null || ret=1
1268 grep "1 #Others" ns4/named.stats.$n.cachedb > /dev/null || ret=1
1269 grep "1 #!TXT" ns4/named.stats.$n.cachedb > /dev/null || ret=1
1270 grep "1 #NXDOMAIN" ns4/named.stats.$n.cachedb > /dev/null || ret=1
1271 status=$((status+ret))
1272 if [ $ret != 0 ]; then echo_i "failed"; fi
1273
1274 # Dump the cache.
1275 n=$((n+1))
1276 echo_i "dump the cache (serve-stale answers disabled) ($n)"
1277 ret=0
1278 rndc_dumpdb ns4 -cache || ret=1
1279 if [ $ret != 0 ]; then echo_i "failed"; fi
1280 status=$((status+ret))
1281
1282 echo_i "stop ns4"
1283 $PERL $SYSTEMTESTTOP/stop.pl --use-rndc --port ${CONTROLPORT} serve-stale ns4
1284
1285 # Load the cache as if it was five minutes (RBTDB_VIRTUAL) older. Since
1286 # max-stale-ttl defaults to a week, we need to adjust the date by one week and
1287 # five minutes.
1288 LASTWEEK=`TZ=UTC perl -e 'my $now = time();
1289 my $oneWeekAgo = $now - 604800;
1290 my $fiveMinutesAgo = $oneWeekAgo - 300;
1291 my ($s, $m, $h, $d, $mo, $y) = (localtime($fiveMinutesAgo))[0, 1, 2, 3, 4, 5];
1292 printf("%04d%02d%02d%02d%02d%02d", $y+1900, $mo+1, $d, $h, $m, $s);'`
1293
1294 echo_i "mock the cache date to $LASTWEEK (serve-stale answers disabled) ($n)"
1295 ret=0
1296 sed -E "s/DATE [0-9]{14}/DATE $LASTWEEK/g" ns4/named_dump.db.test$n > ns4/named_dump.db.out || ret=1
1297 cp ns4/named_dump.db.out ns4/named_dump.db
1298 if [ $ret != 0 ]; then echo_i "failed"; fi
1299 status=$((status+ret))
1300
1301 echo_i "start ns4"
1302 $PERL $SYSTEMTESTTOP/start.pl --noclean --restart --port ${PORT} serve-stale ns4
1303
1304 n=$((n+1))
1305 echo_i "verify ancient cache statistics (serve-stale answers disabled) ($n)"
1306 ret=0
1307 rm -f ns4/named.stats
1308 $RNDCCMD 10.53.0.4 stats #> /dev/null 2>&1
1309 [ -f ns4/named.stats ] || ret=1
1310 cp ns4/named.stats ns4/named.stats.$n
1311 # Check first 10 lines of Cache DB statistics. After last queries, we expect
1312 # everything to be removed or scheduled to be removed.
1313 grep -A 10 "++ Cache DB RRsets ++" ns4/named.stats.$n > ns4/named.stats.$n.cachedb || ret=1
1314 grep "#TXT" ns4/named.stats.$n.cachedb > /dev/null && ret=1
1315 grep "#Others" ns4/named.stats.$n.cachedb > /dev/null && ret=1
1316 grep "#!TXT" ns4/named.stats.$n.cachedb > /dev/null && ret=1
1317 grep "#NXDOMAIN" ns4/named.stats.$n.cachedb > /dev/null && ret=1
1318 status=$((status+ret))
1319 if [ $ret != 0 ]; then echo_i "failed"; fi
1320
1321 #
1322 # Test the server with stale-cache disabled.
1323 #
1324 echo_i "test server with serve-stale cache disabled"
1325
1326 n=$((n+1))
1327 echo_i "enable responses from authoritative server ($n)"
1328 ret=0
1329 $DIG -p ${PORT} @10.53.0.2 txt enable > dig.out.test$n
1330 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1331 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
1332 if [ $ret != 0 ]; then echo_i "failed"; fi
1333 status=$((status+ret))
1334
1335 n=$((n+1))
1336 echo_i "prime cache longttl.example (serve-stale cache disabled) ($n)"
1337 ret=0
1338 $DIG -p ${PORT} @10.53.0.5 longttl.example TXT > dig.out.test$n
1339 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
1340 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1341 if [ $ret != 0 ]; then echo_i "failed"; fi
1342 status=$((status+ret))
1343
1344 n=$((n+1))
1345 echo_i "prime cache data.example (serve-stale cache disabled) ($n)"
1346 ret=0
1347 $DIG -p ${PORT} @10.53.0.5 data.example TXT > dig.out.test$n
1348 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
1349 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1350 grep "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
1351 if [ $ret != 0 ]; then echo_i "failed"; fi
1352 status=$((status+ret))
1353
1354 n=$((n+1))
1355 echo_i "prime cache othertype.example (serve-stale cache disabled) ($n)"
1356 ret=0
1357 $DIG -p ${PORT} @10.53.0.5 othertype.example CAA > dig.out.test$n
1358 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
1359 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1360 grep "othertype\.example\..*2.*IN.*CAA.*0.*issue" dig.out.test$n > /dev/null || ret=1
1361 if [ $ret != 0 ]; then echo_i "failed"; fi
1362 status=$((status+ret))
1363
1364 n=$((n+1))
1365 echo_i "prime cache nodata.example (serve-stale cache disabled) ($n)"
1366 ret=0
1367 $DIG -p ${PORT} @10.53.0.5 nodata.example TXT > dig.out.test$n
1368 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
1369 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
1370 grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
1371 if [ $ret != 0 ]; then echo_i "failed"; fi
1372 status=$((status+ret))
1373
1374 n=$((n+1))
1375 echo_i "prime cache nxdomain.example (serve-stale cache disabled) ($n)"
1376 ret=0
1377 $DIG -p ${PORT} @10.53.0.5 nxdomain.example TXT > dig.out.test$n
1378 grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
1379 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
1380 grep "example\..*2.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
1381 if [ $ret != 0 ]; then echo_i "failed"; fi
1382 status=$((status+ret))
1383
1384 n=$((n+1))
1385 echo_i "verify prime cache statistics (serve-stale cache disabled) ($n)"
1386 ret=0
1387 rm -f ns5/named.stats
1388 $RNDCCMD 10.53.0.5 stats > /dev/null 2>&1
1389 [ -f ns5/named.stats ] || ret=1
1390 cp ns5/named.stats ns5/named.stats.$n
1391 # Check first 10 lines of Cache DB statistics. After serve-stale queries,
1392 # we expect two active TXT RRsets, one active Others, one nxrrset TXT, and
1393 # one NXDOMAIN.
1394 grep -A 10 "++ Cache DB RRsets ++" ns5/named.stats.$n > ns5/named.stats.$n.cachedb || ret=1
1395 grep "2 TXT" ns5/named.stats.$n.cachedb > /dev/null || ret=1
1396 grep "1 Others" ns5/named.stats.$n.cachedb > /dev/null || ret=1
1397 grep "1 !TXT" ns5/named.stats.$n.cachedb > /dev/null || ret=1
1398 grep "1 NXDOMAIN" ns5/named.stats.$n.cachedb > /dev/null || ret=1
1399 status=$((status+ret))
1400 if [ $ret != 0 ]; then echo_i "failed"; fi
1401
1402 n=$((n+1))
1403 echo_i "disable responses from authoritative server ($n)"
1404 ret=0
1405 $DIG -p ${PORT} @10.53.0.2 txt disable > dig.out.test$n
1406 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1407 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
1408 if [ $ret != 0 ]; then echo_i "failed"; fi
1409 status=$((status+ret))
1410
1411 n=$((n+1))
1412 echo_i "check 'rndc serve-stale status' ($n)"
1413 ret=0
1414 $RNDCCMD 10.53.0.5 serve-stale status > rndc.out.test$n 2>&1 || ret=1
1415 grep "_default: off (not-cached)" rndc.out.test$n > /dev/null || ret=1
1416 if [ $ret != 0 ]; then echo_i "failed"; fi
1417 status=$((status+ret))
1418
1419 sleep 2
1420
1421 echo_i "sending queries for tests $((n+1))-$((n+4))..."
1422 $DIG -p ${PORT} @10.53.0.5 data.example TXT > dig.out.test$((n+1)) &
1423 $DIG -p ${PORT} @10.53.0.5 othertype.example CAA > dig.out.test$((n+2)) &
1424 $DIG -p ${PORT} @10.53.0.5 nodata.example TXT > dig.out.test$((n+3)) &
1425 $DIG -p ${PORT} @10.53.0.5 nxdomain.example TXT > dig.out.test$((n+4))
1426
1427 wait
1428
1429 n=$((n+1))
1430 echo_i "check fail of data.example (serve-stale cache disabled) ($n)"
1431 ret=0
1432 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
1433 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
1434 if [ $ret != 0 ]; then echo_i "failed"; fi
1435 status=$((status+ret))
1436
1437 n=$((n+1))
1438 echo_i "check fail of othertype.example (serve-stale cache disabled) ($n)"
1439 ret=0
1440 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
1441 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
1442 if [ $ret != 0 ]; then echo_i "failed"; fi
1443 status=$((status+ret))
1444
1445 n=$((n+1))
1446 echo_i "check fail of nodata.example (serve-stale cache disabled) ($n)"
1447 ret=0
1448 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
1449 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
1450 if [ $ret != 0 ]; then echo_i "failed"; fi
1451 status=$((status+ret))
1452
1453 n=$((n+1))
1454 echo_i "check fail of nxdomain.example (serve-stale cache disabled) ($n)"
1455 ret=0
1456 grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
1457 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
1458 if [ $ret != 0 ]; then echo_i "failed"; fi
1459 status=$((status+ret))
1460
1461 n=$((n+1))
1462 echo_i "verify stale cache statistics (serve-stale cache disabled) ($n)"
1463 ret=0
1464 rm -f ns5/named.stats
1465 $RNDCCMD 10.53.0.5 stats > /dev/null 2>&1
1466 [ -f ns5/named.stats ] || ret=1
1467 cp ns5/named.stats ns5/named.stats.$n
1468 # Check first 10 lines of Cache DB statistics. After serve-stale queries,
1469 # we expect one active TXT (longttl) and the rest to be expired from cache,
1470 # but since we keep everything for 5 minutes (RBTDB_VIRTUAL) in the cache
1471 # after expiry, they still show up in the stats.
1472 grep -A 10 "++ Cache DB RRsets ++" ns5/named.stats.$n > ns5/named.stats.$n.cachedb || ret=1
1473 grep -F "1 Others" ns5/named.stats.$n.cachedb > /dev/null || ret=1
1474 grep -F "2 TXT" ns5/named.stats.$n.cachedb > /dev/null || ret=1
1475 grep -F "1 !TXT" ns5/named.stats.$n.cachedb > /dev/null || ret=1
1476 grep -F "1 NXDOMAIN" ns5/named.stats.$n.cachedb > /dev/null || ret=1
1477 status=$((status+ret))
1478 if [ $ret != 0 ]; then echo_i "failed"; fi
1479
1480 # Dump the cache.
1481 n=$((n+1))
1482 echo_i "dump the cache (serve-stale cache disabled) ($n)"
1483 ret=0
1484 rndc_dumpdb ns5 || ret=1
1485 if [ $ret != 0 ]; then echo_i "failed"; fi
1486 status=$((status+ret))
1487 # Check that expired records are not dumped.
1488 ret=0
1489 grep "; expired since .* (awaiting cleanup)" ns5/named_dump.db.test$n && ret=1
1490 if [ $ret != 0 ]; then echo_i "failed"; fi
1491 status=$((status+ret))
1492
1493 # Dump the cache including expired entries.
1494 n=$((n+1))
1495 echo_i "dump the cache including expired entries (serve-stale cache disabled) ($n)"
1496 ret=0
1497 rndc_dumpdb ns5 -expired || ret=1
1498 if [ $ret != 0 ]; then echo_i "failed"; fi
1499 status=$((status+ret))
1500
1501 # Check that expired records are dumped.
1502 echo_i "check rndc dump expired data.example ($n)"
1503 ret=0
1504 awk '/; expired/ { x=$0; getline; print x, $0}' ns5/named_dump.db.test$n |
1505 grep "; expired since .* (awaiting cleanup) data\.example\..*A text record with a 2 second ttl" > /dev/null 2>&1 || ret=1
1506 awk '/; expired/ { x=$0; getline; print x, $0}' ns5/named_dump.db.test$n |
1507 grep "; expired since .* (awaiting cleanup) nodata\.example\." > /dev/null 2>&1 || ret=1
1508 awk '/; expired/ { x=$0; getline; print x, $0}' ns5/named_dump.db.test$n |
1509 grep "; expired since .* (awaiting cleanup) nxdomain\.example\." > /dev/null 2>&1 || ret=1
1510 awk '/; expired/ { x=$0; getline; print x, $0}' ns5/named_dump.db.test$n |
1511 grep "; expired since .* (awaiting cleanup) othertype\.example\." > /dev/null 2>&1 || ret=1
1512 # Also make sure the not expired data does not have an expired comment.
1513 awk '/; answer/ { x=$0; getline; print x, $0}' ns5/named_dump.db.test$n |
1514 grep "; answer longttl\.example.*A text record with a 600 second ttl" > /dev/null 2>&1 || ret=1
1515 if [ $ret != 0 ]; then echo_i "failed"; fi
1516 status=$((status+ret))
1517
1518 echo_i "stop ns5"
1519 $PERL ../stop.pl --use-rndc --port ${CONTROLPORT} serve-stale ns5
1520
1521 # Load the cache as if it was five minutes (RBTDB_VIRTUAL) older.
1522 cp ns5/named_dump.db.test$n ns5/named_dump.db
1523 FIVEMINUTESAGO=`TZ=UTC perl -e 'my $now = time();
1524 my $fiveMinutesAgo = 300;
1525 my ($s, $m, $h, $d, $mo, $y) = (localtime($fiveMinutesAgo))[0, 1, 2, 3, 4, 5];
1526 printf("%04d%02d%02d%02d%02d%02d", $y+1900, $mo+1, $d, $h, $m, $s);'`
1527
1528 n=$((n+1))
1529 echo_i "mock the cache date to $FIVEMINUTESAGO (serve-stale cache disabled) ($n)"
1530 ret=0
1531 sed -E "s/DATE [0-9]{14}/DATE $FIVEMINUTESAGO/g" ns5/named_dump.db > ns5/named_dump.db.out || ret=1
1532 cp ns5/named_dump.db.out ns5/named_dump.db
1533 if [ $ret != 0 ]; then echo_i "failed"; fi
1534 status=$((status+ret))
1535
1536 echo_i "start ns5"
1537 start_server --noclean --restart --port ${PORT} serve-stale ns5
1538
1539 n=$((n+1))
1540 echo_i "verify ancient cache statistics (serve-stale cache disabled) ($n)"
1541 ret=0
1542 rm -f ns5/named.stats
1543 $RNDCCMD 10.53.0.5 stats #> /dev/null 2>&1
1544 [ -f ns5/named.stats ] || ret=1
1545 cp ns5/named.stats ns5/named.stats.$n
1546 # Check first 10 lines of Cache DB statistics. After last queries, we expect
1547 # everything to be removed or scheduled to be removed.
1548 grep -A 10 "++ Cache DB RRsets ++" ns5/named.stats.$n > ns5/named.stats.$n.cachedb || ret=1
1549 grep -F "#TXT" ns5/named.stats.$n.cachedb > /dev/null && ret=1
1550 grep -F "#Others" ns5/named.stats.$n.cachedb > /dev/null && ret=1
1551 grep -F "#!TXT" ns5/named.stats.$n.cachedb > /dev/null && ret=1
1552 grep -F "#NXDOMAIN" ns5/named.stats.$n.cachedb > /dev/null && ret=1
1553 status=$((status+ret))
1554 if [ $ret != 0 ]; then echo_i "failed"; fi
1555
1556 ########################################################
1557 # Test for stale-answer-client-timeout (default 1.8s). #
1558 ########################################################
1559 echo_i "test stale-answer-client-timeout (default 1.8)"
1560
1561 n=$((n+1))
1562 echo_i "updating ns3/named.conf ($n)"
1563 ret=0
1564 copy_setports ns3/named2.conf.in ns3/named.conf
1565 if [ $ret != 0 ]; then echo_i "failed"; fi
1566 status=$((status+ret))
1567
1568 echo_i "restart ns3"
1569 $PERL ../stop.pl --use-rndc --port ${CONTROLPORT} serve-stale ns3
1570 start_server --noclean --restart --port ${PORT} serve-stale ns3
1571
1572 n=$((n+1))
1573 echo_i "check 'rndc serve-stale status' ($n)"
1574 ret=0
1575 $RNDCCMD 10.53.0.3 serve-stale status > rndc.out.test$n 2>&1 || ret=1
1576 grep '_default: on (stale-answer-ttl=3 max-stale-ttl=3600 stale-refresh-time=0)' rndc.out.test$n > /dev/null || ret=1
1577 if [ $ret != 0 ]; then echo_i "failed"; fi
1578 status=$((status+ret))
1579
1580 n=$((n+1))
1581 echo_i "enable responses from authoritative server ($n)"
1582 ret=0
1583 $DIG -p ${PORT} @10.53.0.2 txt enable > dig.out.test$n
1584 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1585 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
1586 if [ $ret != 0 ]; then echo_i "failed"; fi
1587 status=$((status+ret))
1588
1589 n=$((n+1))
1590 echo_i "prime cache data.example (stale-answer-client-timeout)"
1591 ret=0
1592 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
1593 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
1594 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1595 if [ $ret != 0 ]; then echo_i "failed"; fi
1596 status=$((status+ret))
1597
1598 n=$((n+1))
1599 echo_i "prime cache nodata.example (stale-answer-client-timeout)"
1600 ret=0
1601 $DIG -p ${PORT} @10.53.0.3 nodata.example TXT > dig.out.test$n
1602 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
1603 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
1604 if [ $ret != 0 ]; then echo_i "failed"; fi
1605 status=$((status+ret))
1606
1607 n=$((n+1))
1608 echo_i "disable responses from authoritative server ($n)"
1609 ret=0
1610 $DIG -p ${PORT} @10.53.0.2 txt disable > dig.out.test$n
1611 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1612 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
1613 if [ $ret != 0 ]; then echo_i "failed"; fi
1614 status=$((status+ret))
1615
1616 # Allow RRset to become stale.
1617 sleep 2
1618
1619 # We configured a long value of 30 seconds for resolver-query-timeout.
1620 # That should give us enough time to receive an stale answer from cache
1621 # after stale-answer-client-timeout timer of 1.8 sec triggers.
1622 n=$((n+1))
1623 echo_i "check stale data.example comes from cache (default stale-answer-client-timeout) ($n)"
1624 nextpart ns3/named.run > /dev/null
1625 t1=`$PERL -e 'print time()'`
1626 $DIG -p ${PORT} +tries=1 +timeout=10 @10.53.0.3 data.example TXT > dig.out.test$n
1627 t2=`$PERL -e 'print time()'`
1628 wait_for_log 5 "data.example client timeout, stale answer used" ns3/named.run || ret=1
1629 ret=0
1630 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
1631 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1632 grep "data\.example\..*3.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
1633 # Default stale-answer-client-timeout is 1.8s, we allow some extra time
1634 # just in case other tests are taking too much cpu.
1635 [ $((t2 - t1)) -le 10 ] || { echo_i "query took $((t2 - t1))s to resolve."; ret=1; }
1636 if [ $ret != 0 ]; then echo_i "failed"; fi
1637 status=$((status+ret))
1638
1639 echo_i "sending queries for tests $((n+1))-$((n+2))..."
1640 $DIG -p ${PORT} +tries=1 +timeout=3 @10.53.0.3 nodata.example TXT > dig.out.test$((n+1)) &
1641 $DIG -p ${PORT} +tries=1 +timeout=30 @10.53.0.3 nodata.example TXT > dig.out.test$((n+2))
1642 wait
1643
1644 # Since nodata.example is cached as NXRRSET and marked as stale at this point,
1645 # BIND must not return this RRset when stale-answer-client-timeout triggers,
1646 # instead, it must attempt to refresh the RRset. Since the authoritative
1647 # server is disabled and we are using resolver-query-timeout value of 10
1648 # seconds, we expect this query with a timeout of 3 seconds to time out.
1649 n=$((n+1))
1650 echo_i "check query for nodata.example times out (default stale-answer-client-timeout) ($n)"
1651 grep "connection timed out" dig.out.test$n > /dev/null || ret=1
1652 if [ $ret != 0 ]; then echo_i "failed"; fi
1653 status=$((status+ret))
1654
1655 # For this query we expect BIND to return stale NXRRSET data for
1656 # nodata.example after resolver-query-timeout expires.
1657 n=$((n+1))
1658 echo_i "check stale nodata.example comes from cache after resolver-query-timeout expires (default stale-answer-client-timeout) ($n)"
1659 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
1660 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
1661 grep "example\..*3.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
1662 if [ $ret != 0 ]; then echo_i "failed"; fi
1663 status=$((status+ret))
1664
1665 #############################################
1666 # Test for stale-answer-client-timeout off. #
1667 #############################################
1668 echo_i "test stale-answer-client-timeout (off)"
1669
1670 n=$((n+1))
1671 echo_i "updating ns3/named.conf ($n)"
1672 ret=0
1673 copy_setports ns3/named3.conf.in ns3/named.conf
1674 if [ $ret != 0 ]; then echo_i "failed"; fi
1675 status=$((status+ret))
1676
1677 n=$((n+1))
1678 echo_i "running 'rndc reload' ($n)"
1679 ret=0
1680 rndc_reload ns3 10.53.0.3
1681 if [ $ret != 0 ]; then echo_i "failed"; fi
1682 status=$((status+ret))
1683
1684 # Send a query, auth server is disabled, we will enable it after a while in
1685 # order to receive an answer before resolver-query-timeout expires. Since
1686 # stale-answer-client-timeout is disabled we must receive an answer from
1687 # authoritative server.
1688 echo_i "sending query for test $((n+2))"
1689 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$((n+2)) &
1690 sleep 3
1691
1692 n=$((n+1))
1693 echo_i "enable responses from authoritative server ($n)"
1694 ret=0
1695 $DIG -p ${PORT} @10.53.0.2 txt enable > dig.out.test$n
1696 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1697 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
1698 if [ $ret != 0 ]; then echo_i "failed"; fi
1699 status=$((status+ret))
1700
1701 # Wait until dig is done.
1702 wait
1703
1704 n=$((n+1))
1705 echo_i "check data.example comes from authoritative server (stale-answer-client-timeout off) ($n)"
1706 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
1707 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1708 grep "data\.example\..*[12].*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
1709 if [ $ret != 0 ]; then echo_i "failed"; fi
1710 status=$((status+ret))
1711
1712 #############################################
1713 # Test for stale-answer-client-timeout 0. #
1714 #############################################
1715 echo_i "test stale-answer-client-timeout (0)"
1716
1717 n=$((n+1))
1718 echo_i "updating ns3/named.conf ($n)"
1719 ret=0
1720 copy_setports ns3/named4.conf.in ns3/named.conf
1721 if [ $ret != 0 ]; then echo_i "failed"; fi
1722 status=$((status+ret))
1723
1724 echo_i "restart ns3"
1725 $PERL ../stop.pl --use-rndc --port ${CONTROLPORT} serve-stale ns3
1726 start_server --noclean --restart --port ${PORT} serve-stale ns3
1727
1728 n=$((n+1))
1729 echo_i "prime cache data.example (stale-answer-client-timeout 0)"
1730 ret=0
1731 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
1732 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
1733 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1734 if [ $ret != 0 ]; then echo_i "failed"; fi
1735 status=$((status+ret))
1736
1737 n=$((n+1))
1738 echo_i "prime cache nodata.example (stale-answer-client-timeout 0)"
1739 ret=0
1740 $DIG -p ${PORT} @10.53.0.3 nodata.example TXT > dig.out.test$n
1741 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
1742 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
1743 if [ $ret != 0 ]; then echo_i "failed"; fi
1744 status=$((status+ret))
1745
1746 n=$((n+1))
1747 echo_i "disable responses from authoritative server ($n)"
1748 ret=0
1749 $DIG -p ${PORT} @10.53.0.2 txt disable > dig.out.test$n
1750 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1751 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
1752 if [ $ret != 0 ]; then echo_i "failed"; fi
1753 status=$((status+ret))
1754
1755 # Allow RRset to become stale.
1756 sleep 2
1757
1758 n=$((n+1))
1759 ret=0
1760 echo_i "check stale data.example comes from cache (stale-answer-client-timeout 0) ($n)"
1761 nextpart ns3/named.run > /dev/null
1762 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
1763 wait_for_log 5 "data.example stale answer used, an attempt to refresh the RRset" ns3/named.run || ret=1
1764 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
1765 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1766 grep "data\.example\..*3.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
1767 if [ $ret != 0 ]; then echo_i "failed"; fi
1768 status=$((status+ret))
1769
1770 n=$((n+1))
1771 echo_i "enable responses from authoritative server ($n)"
1772 ret=0
1773 $DIG -p ${PORT} @10.53.0.2 txt enable > dig.out.test$n
1774 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1775 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
1776 if [ $ret != 0 ]; then echo_i "failed"; fi
1777 status=$((status+ret))
1778
1779 wait_for_rrset_refresh() {
1780 nextpart ns3/named.run | grep 'data.example.*2.*TXT.*"A text record with a 2 second ttl"' > /dev/null && return 0
1781 return 1
1782 }
1783
1784 # This test ensures that after we get stale data due to
1785 # stale-answer-client-timeout 0, enabling the authoritative server will allow
1786 # the RRset to be updated.
1787 n=$((n+1))
1788 ret=0
1789 echo_i "check stale data.example was refreshed (stale-answer-client-timeout 0) ($n)"
1790 retry_quiet 10 wait_for_rrset_refresh || ret=1
1791 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
1792 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
1793 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1794 grep "data\.example\..*[12].*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
1795 if [ $ret != 0 ]; then echo_i "failed"; fi
1796 status=$((status+ret))
1797
1798 n=$((n+1))
1799 echo_i "disable responses from authoritative server ($n)"
1800 ret=0
1801 $DIG -p ${PORT} @10.53.0.2 txt disable > dig.out.test$n
1802 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1803 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
1804 if [ $ret != 0 ]; then echo_i "failed"; fi
1805 status=$((status+ret))
1806
1807 echo_i "sending queries for tests $((n+1))-$((n+2))..."
1808 $DIG -p ${PORT} +tries=1 +timeout=3 @10.53.0.3 nodata.example TXT > dig.out.test$((n+1)) &
1809 $DIG -p ${PORT} +tries=1 +timeout=30 @10.53.0.3 nodata.example TXT > dig.out.test$((n+2))
1810 wait
1811
1812 # Since nodata.example is cached as NXRRSET and marked as stale at this point,
1813 # BIND must not prompty return this RRset due to
1814 # stale-answer-client-timeout == 0, instead, it must attempt to refresh the
1815 # RRset. Since the authoritative server is disabled and we are using
1816 # resolver-query-timeout value of 10 seconds, we expect this query with a
1817 # timeout of 3 seconds to time out.
1818 n=$((n+1))
1819 echo_i "check query for nodata.example times out (stale-answer-client-timeout 0) ($n)"
1820 grep "connection timed out" dig.out.test$n > /dev/null || ret=1
1821 if [ $ret != 0 ]; then echo_i "failed"; fi
1822 status=$((status+ret))
1823
1824 # For this query we expect BIND to return stale NXRRSET data for
1825 # nodata.example after resolver-query-timeout expires.
1826 n=$((n+1))
1827 echo_i "check stale nodata.example comes from cache after resolver-query-timeout expires (stale-answer-client-timeout 0) ($n)"
1828 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
1829 grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1
1830 grep "example\..*3.*IN.*SOA" dig.out.test$n > /dev/null || ret=1
1831 if [ $ret != 0 ]; then echo_i "failed"; fi
1832 status=$((status+ret))
1833
1834 ####################################################################
1835 # Test for stale-answer-client-timeout 0 and stale-refresh-time 4. #
1836 ####################################################################
1837 echo_i "test stale-answer-client-timeout (0) and stale-refresh-time (4)"
1838
1839 n=$((n+1))
1840 echo_i "updating ns3/named.conf ($n)"
1841 ret=0
1842 copy_setports ns3/named5.conf.in ns3/named.conf
1843 if [ $ret != 0 ]; then echo_i "failed"; fi
1844 status=$((status+ret))
1845
1846 n=$((n+1))
1847 echo_i "running 'rndc reload' ($n)"
1848 ret=0
1849 rndc_reload ns3 10.53.0.3
1850 if [ $ret != 0 ]; then echo_i "failed"; fi
1851 status=$((status+ret))
1852
1853 n=$((n+1))
1854 echo_i "flush cache, enable responses from authoritative server ($n)"
1855 ret=0
1856 $RNDCCMD 10.53.0.3 flushtree example > rndc.out.test$n.1 2>&1 || ret=1
1857 $DIG -p ${PORT} @10.53.0.2 txt enable > dig.out.test$n
1858 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1859 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
1860 if [ $ret != 0 ]; then echo_i "failed"; fi
1861 status=$((status+ret))
1862
1863 n=$((n+1))
1864 echo_i "prime cache data.example (stale-answer-client-timeout 0, stale-refresh-time 4) ($n)"
1865 ret=0
1866 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
1867 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
1868 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1869 grep "data\.example\..*2.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
1870 if [ $ret != 0 ]; then echo_i "failed"; fi
1871 status=$((status+ret))
1872
1873 # Allow RRset to become stale.
1874 sleep 2
1875
1876 n=$((n+1))
1877 echo_i "disable responses from authoritative server ($n)"
1878 ret=0
1879 $DIG -p ${PORT} @10.53.0.2 txt disable > dig.out.test$n
1880 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1881 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
1882 if [ $ret != 0 ]; then echo_i "failed"; fi
1883 status=$((status+ret))
1884
1885 n=$((n+1))
1886 ret=0
1887 echo_i "check stale data.example comes from cache (stale-answer-client-timeout 0 stale-refresh-time 4) ($n)"
1888 nextpart ns3/named.run > /dev/null
1889 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
1890 wait_for_log 5 "data.example stale answer used, an attempt to refresh the RRset" ns3/named.run || ret=1
1891 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
1892 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1893 grep "data\.example\..*3.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
1894 if [ $ret != 0 ]; then echo_i "failed"; fi
1895 status=$((status+ret))
1896
1897 n=$((n+1))
1898 echo_i "enable responses from authoritative server ($n)"
1899 ret=0
1900 $DIG -p ${PORT} @10.53.0.2 txt enable > dig.out.test$n
1901 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1902 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
1903 if [ $ret != 0 ]; then echo_i "failed"; fi
1904 status=$((status+ret))
1905
1906 # This test ensures that after we get stale data due to
1907 # stale-answer-client-timeout 0, enabling the authoritative server will allow
1908 # the RRset to be updated.
1909 n=$((n+1))
1910 ret=0
1911 echo_i "check stale data.example was refreshed (stale-answer-client-timeout 0 stale-refresh-time 4) ($n)"
1912 retry_quiet 10 wait_for_rrset_refresh || ret=1
1913 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
1914 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
1915 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1916 grep "data\.example\..*[12].*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
1917 if [ $ret != 0 ]; then echo_i "failed"; fi
1918 status=$((status+ret))
1919
1920 # Allow RRset to become stale.
1921 sleep 2
1922
1923 n=$((n+1))
1924 echo_i "disable responses from authoritative server ($n)"
1925 ret=0
1926 $DIG -p ${PORT} @10.53.0.2 txt disable > dig.out.test$n
1927 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1928 grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1
1929 if [ $ret != 0 ]; then echo_i "failed"; fi
1930 status=$((status+ret))
1931
1932 n=$((n+1))
1933 ret=0
1934 echo_i "check stale data.example comes from cache (stale-answer-client-timeout 0 stale-refresh-time 4) ($n)"
1935 nextpart ns3/named.run > /dev/null
1936 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
1937 wait_for_log 5 "data.example stale answer used, an attempt to refresh the RRset" ns3/named.run || ret=1
1938 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
1939 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1940 grep "data\.example\..*3.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
1941 if [ $ret != 0 ]; then echo_i "failed"; fi
1942 status=$((status+ret))
1943
1944 # Allow stale-refresh-time to be activated.
1945 n=$((n+1))
1946 ret=0
1947 echo_i "wait until resolver query times out, activating stale-refresh-time"
1948 wait_for_log 15 "data.example resolver failure, stale answer used" ns3/named.run || ret=1
1949 if [ $ret != 0 ]; then echo_i "failed"; fi
1950 status=$((status+ret))
1951
1952 n=$((n+1))
1953 ret=0
1954 echo_i "check stale data.example comes from cache within stale-refresh-time (stale-answer-client-timeout 0 stale-refresh-time 4) ($n)"
1955 nextpart ns3/named.run > /dev/null
1956 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
1957 wait_for_log 5 "data.example query within stale refresh time" ns3/named.run || ret=1
1958 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
1959 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1960 grep "data\.example\..*3.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
1961 if [ $ret != 0 ]; then echo_i "failed"; fi
1962 status=$((status+ret))
1963
1964 n=$((n+1))
1965 echo_i "enable responses from authoritative server ($n)"
1966 ret=0
1967 $DIG -p ${PORT} @10.53.0.2 txt enable > dig.out.test$n
1968 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1969 grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1
1970 if [ $ret != 0 ]; then echo_i "failed"; fi
1971 status=$((status+ret))
1972
1973 # We give BIND some time to ensure that after we enable authoritative server,
1974 # this RRset is still not refreshed because it was hit during
1975 # stale-refresh-time window.
1976 sleep 1
1977
1978 n=$((n+1))
1979 ret=0
1980 echo_i "check stale data.example was not refreshed (stale-answer-client-timeout 0 stale-refresh-time 4) ($n)"
1981 nextpart ns3/named.run > /dev/null
1982 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
1983 wait_for_log 5 "data.example query within stale refresh time" ns3/named.run || ret=1
1984 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
1985 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
1986 grep "data\.example\..*3.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
1987 if [ $ret != 0 ]; then echo_i "failed"; fi
1988 status=$((status+ret))
1989
1990 # After the refresh-time-window, the RRset will be refreshed.
1991 sleep 4
1992
1993 n=$((n+1))
1994 ret=0
1995 echo_i "check stale data.example comes from cache (stale-answer-client-timeout 0 stale-refresh-time 4) ($n)"
1996 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
1997 wait_for_log 5 "data.example stale answer used, an attempt to refresh the RRset" ns3/named.run || ret=1
1998 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
1999 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
2000 grep "data\.example\..*3.*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
2001 if [ $ret != 0 ]; then echo_i "failed"; fi
2002 status=$((status+ret))
2003
2004 n=$((n+1))
2005 ret=0
2006 echo_i "check stale data.example was refreshed (stale-answer-client-timeout 0 stale-refresh-time 4) ($n)"
2007 $DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n
2008 grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
2009 grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1
2010 grep "data\.example\..*[12].*IN.*TXT.*A text record with a 2 second ttl" dig.out.test$n > /dev/null || ret=1
2011 if [ $ret != 0 ]; then echo_i "failed"; fi
2012 status=$((status+ret))
2013
2014 echo_i "exit status: $status"
2015 [ $status -eq 0 ] || exit 1
2016