xref: /netbsd-src/external/mpl/bind/dist/bin/tests/system/qmin/tests.sh (revision 0a3071956a3a9fdebdbf7f338cf2d439b45fc728)
1#!/bin/sh
2
3# Copyright (C) Internet Systems Consortium, Inc. ("ISC")
4#
5# SPDX-License-Identifier: MPL-2.0
6#
7# This Source Code Form is subject to the terms of the Mozilla Public
8# License, v. 2.0.  If a copy of the MPL was not distributed with this
9# file, you can obtain one at https://mozilla.org/MPL/2.0/.
10#
11# See the COPYRIGHT file distributed with this work for additional
12# information regarding copyright ownership.
13
14set -e
15
16. ../conf.sh
17
18DIGOPTS="-p ${PORT}"
19RNDCCMD="$RNDC -c ../_common/rndc.conf -p ${CONTROLPORT} -s"
20CLEANQL="rm -f ans*/query.log"
21status=0
22n=0
23
24n=$((n + 1))
25echo_i "query for .good is not minimized when qname-minimization is off ($n)"
26ret=0
27$CLEANQL
28$RNDCCMD 10.53.0.5 flush
29$DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.good. @10.53.0.5 >dig.out.test$n
30grep "status: NOERROR" dig.out.test$n >/dev/null || ret=1
31grep "icky.icky.icky.ptang.zoop.boing.good. 1	IN A	192.0.2.1" dig.out.test$n >/dev/null || ret=1
32sleep 1
33cat <<__EOF | diff ans2/query.log - >/dev/null || ret=1
34ADDR icky.icky.icky.ptang.zoop.boing.good.
35ADDR ns3.good.
36ADDR ns3.good.
37ADDR a.bit.longer.ns.name.good.
38ADDR a.bit.longer.ns.name.good.
39__EOF
40echo "ADDR icky.icky.icky.ptang.zoop.boing.good." | diff ans3/query.log - >/dev/null || ret=1
41echo "ADDR icky.icky.icky.ptang.zoop.boing.good." | diff ans4/query.log - >/dev/null || ret=1
42for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
43if [ $ret != 0 ]; then echo_i "failed"; fi
44status=$((status + ret))
45
46n=$((n + 1))
47echo_i "query for .bad is not minimized when qname-minimization is off ($n)"
48ret=0
49$CLEANQL
50$RNDCCMD 10.53.0.5 flush
51$DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.bad. @10.53.0.5 >dig.out.test$n
52grep "status: NOERROR" dig.out.test$n >/dev/null || ret=1
53grep "icky.icky.icky.ptang.zoop.boing.bad. 1 IN A	192.0.2.1" dig.out.test$n >/dev/null || ret=1
54sleep 1
55cat <<__EOF | diff ans2/query.log - >/dev/null || ret=1
56ADDR icky.icky.icky.ptang.zoop.boing.bad.
57ADDR ns3.bad.
58ADDR ns3.bad.
59ADDR a.bit.longer.ns.name.bad.
60ADDR a.bit.longer.ns.name.bad.
61__EOF
62echo "ADDR icky.icky.icky.ptang.zoop.boing.bad." | diff ans3/query.log - >/dev/null || ret=1
63echo "ADDR icky.icky.icky.ptang.zoop.boing.bad." | diff ans4/query.log - >/dev/null || ret=1
64for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
65if [ $ret != 0 ]; then echo_i "failed"; fi
66status=$((status + ret))
67
68n=$((n + 1))
69echo_i "query for .slow is not minimized when qname-minimization is off ($n)"
70ret=0
71$CLEANQL
72$RNDCCMD 10.53.0.5 flush
73$DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.slow. @10.53.0.5 >dig.out.test$n
74sleep 5
75grep "status: NOERROR" dig.out.test$n >/dev/null || ret=1
76grep "icky.icky.icky.ptang.zoop.boing.slow. 1	IN A	192.0.2.1" dig.out.test$n >/dev/null || ret=1
77sleep 1
78cat <<__EOF | diff ans2/query.log - >/dev/null || ret=1
79ADDR icky.icky.icky.ptang.zoop.boing.slow.
80ADDR ns3.slow.
81ADDR ns3.slow.
82ADDR a.bit.longer.ns.name.slow.
83ADDR a.bit.longer.ns.name.slow.
84__EOF
85echo "ADDR icky.icky.icky.ptang.zoop.boing.slow." | diff ans3/query.log - >/dev/null || ret=1
86echo "ADDR icky.icky.icky.ptang.zoop.boing.slow." | diff ans4/query.log - >/dev/null || ret=1
87for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
88if [ $ret != 0 ]; then echo_i "failed"; fi
89status=$((status + ret))
90
91n=$((n + 1))
92echo_i "query for .ugly is not minimized when qname-minimization is off ($n)"
93ret=0
94$CLEANQL
95$RNDCCMD 10.53.0.5 flush
96$DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.ugly. @10.53.0.5 >dig.out.test$n
97sleep 5
98grep "status: NOERROR" dig.out.test$n >/dev/null || ret=1
99grep "icky.icky.icky.ptang.zoop.boing.ugly. 1	IN A	192.0.2.1" dig.out.test$n >/dev/null || ret=1
100sleep 1
101cat <<__EOF | diff ans2/query.log - >/dev/null || ret=1
102ADDR icky.icky.icky.ptang.zoop.boing.ugly.
103ADDR ns3.ugly.
104ADDR ns3.ugly.
105ADDR a.bit.longer.ns.name.ugly.
106ADDR a.bit.longer.ns.name.ugly.
107__EOF
108echo "ADDR icky.icky.icky.ptang.zoop.boing.ugly." | diff ans3/query.log - >/dev/null || ret=1
109echo "ADDR icky.icky.icky.ptang.zoop.boing.ugly." | diff ans4/query.log - >/dev/null || ret=1
110for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
111if [ $ret != 0 ]; then echo_i "failed"; fi
112status=$((status + ret))
113
114n=$((n + 1))
115echo_i "query for .good is properly minimized when qname-minimization is in strict mode ($n)"
116ret=0
117$CLEANQL
118$RNDCCMD 10.53.0.6 flush
119$DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.good. @10.53.0.6 >dig.out.test$n
120grep "status: NOERROR" dig.out.test$n >/dev/null || ret=1
121grep "icky.icky.icky.ptang.zoop.boing.good. 1	IN A	192.0.2.1" dig.out.test$n >/dev/null || ret=1
122sleep 1
123sort ans2/query.log >ans2/query.log.sorted
124cat <<__EOF | diff ans2/query.log.sorted - >/dev/null || ret=1
125ADDR a.bit.longer.ns.name.good.
126ADDR a.bit.longer.ns.name.good.
127ADDR ns2.good.
128ADDR ns3.good.
129ADDR ns3.good.
130NS boing.good.
131NS good.
132NS zoop.boing.good.
133__EOF
134cat <<__EOF | diff ans3/query.log - >/dev/null || ret=1
135NS zoop.boing.good.
136NS ptang.zoop.boing.good.
137NS icky.ptang.zoop.boing.good.
138__EOF
139cat <<__EOF | diff ans4/query.log - >/dev/null || ret=1
140NS icky.ptang.zoop.boing.good.
141NS icky.icky.ptang.zoop.boing.good.
142ADDR icky.icky.icky.ptang.zoop.boing.good.
143__EOF
144for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
145if [ $ret != 0 ]; then echo_i "failed"; fi
146status=$((status + ret))
147
148n=$((n + 1))
149echo_i "query for .good is properly minimized when qname-minimization is in relaxed mode ($n)"
150ret=0
151$CLEANQL
152$RNDCCMD 10.53.0.7 flush
153$DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.good. @10.53.0.7 >dig.out.test$n
154grep "status: NOERROR" dig.out.test$n >/dev/null || ret=1
155grep "icky.icky.icky.ptang.zoop.boing.good. 1	IN A	192.0.2.1" dig.out.test$n >/dev/null || ret=1
156sleep 1
157sort ans2/query.log >ans2/query.log.sorted
158cat <<__EOF | diff ans2/query.log.sorted - >/dev/null || ret=1
159ADDR a.bit.longer.ns.name.good.
160ADDR a.bit.longer.ns.name.good.
161ADDR ns2.good.
162ADDR ns3.good.
163ADDR ns3.good.
164NS boing.good.
165NS zoop.boing.good.
166__EOF
167cat <<__EOF | diff ans3/query.log - >/dev/null || ret=1
168NS ptang.zoop.boing.good.
169NS icky.ptang.zoop.boing.good.
170__EOF
171cat <<__EOF | diff ans4/query.log - >/dev/null || ret=1
172NS icky.icky.ptang.zoop.boing.good.
173ADDR icky.icky.icky.ptang.zoop.boing.good.
174__EOF
175for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
176if [ $ret != 0 ]; then echo_i "failed"; fi
177status=$((status + ret))
178
179n=$((n + 1))
180echo_i "query for .bad fails when qname-minimization is in strict mode ($n)"
181ret=0
182$CLEANQL
183$RNDCCMD 10.53.0.6 flush
184$DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.bad. @10.53.0.6 >dig.out.test$n
185grep "status: NXDOMAIN" dig.out.test$n >/dev/null || ret=1
186sleep 1
187sort ans2/query.log >ans2/query.log.sorted
188cat <<__EOF | diff ans2/query.log.sorted - >/dev/null || ret=1
189ADDR ns2.bad.
190NS bad.
191NS boing.bad.
192__EOF
193for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
194if [ $ret != 0 ]; then echo_i "failed"; fi
195status=$((status + ret))
196
197n=$((n + 1))
198echo_i "query for .bad succeeds when qname-minimization is in relaxed mode ($n)"
199ret=0
200$CLEANQL
201$RNDCCMD 10.53.0.7 flush
202$DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.bad. @10.53.0.7 >dig.out.test$n
203grep "status: NOERROR" dig.out.test$n >/dev/null || ret=1
204grep "icky.icky.icky.ptang.zoop.boing.bad. 1 IN A	192.0.2.1" dig.out.test$n >/dev/null || ret=1
205sleep 1
206sort ans2/query.log >ans2/query.log.sorted
207cat <<__EOF | diff ans2/query.log.sorted - >/dev/null || ret=1
208ADDR a.bit.longer.ns.name.bad.
209ADDR a.bit.longer.ns.name.bad.
210ADDR icky.icky.icky.ptang.zoop.boing.bad.
211ADDR ns2.bad.
212ADDR ns3.bad.
213ADDR ns3.bad.
214NS boing.bad.
215__EOF
216cat <<__EOF | diff ans3/query.log - >/dev/null || ret=1
217ADDR icky.icky.icky.ptang.zoop.boing.bad.
218__EOF
219cat <<__EOF | diff ans4/query.log - >/dev/null || ret=1
220ADDR icky.icky.icky.ptang.zoop.boing.bad.
221__EOF
222for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
223if [ $ret != 0 ]; then echo_i "failed"; fi
224status=$((status + ret))
225
226n=$((n + 1))
227echo_i "query for .ugly fails when qname-minimization is in strict mode ($n)"
228ret=0
229$CLEANQL
230$RNDCCMD 10.53.0.6 flush
231$DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.ugly. @10.53.0.6 >dig.out.test$n
232grep "status: SERVFAIL" dig.out.test$n >/dev/null || ret=1
233sleep 1
234sort ans2/query.log >ans2/query.log.sorted
235cat <<__EOF | diff ans2/query.log.sorted - >/dev/null || ret=1
236ADDR ns2.ugly.
237NS boing.ugly.
238NS ugly.
239__EOF
240for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
241if [ $ret != 0 ]; then echo_i "failed"; fi
242status=$((status + ret))
243$RNDCCMD 10.53.0.6 flush
244
245n=$((n + 1))
246echo_i "query for .ugly succeeds when qname-minimization is in relaxed mode ($n)"
247ret=0
248$CLEANQL
249$RNDCCMD 10.53.0.7 flush
250$DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.ugly. @10.53.0.7 >dig.out.test$n
251grep "status: NOERROR" dig.out.test$n >/dev/null || ret=1
252grep "icky.icky.icky.ptang.zoop.boing.ugly. 1	IN A	192.0.2.1" dig.out.test$n >/dev/null || ret=1
253sleep 1
254sort ans2/query.log >ans2/query.log.sorted
255cat <<__EOF | diff ans2/query.log.sorted - >/dev/null || ret=1
256ADDR a.bit.longer.ns.name.ugly.
257ADDR a.bit.longer.ns.name.ugly.
258ADDR icky.icky.icky.ptang.zoop.boing.ugly.
259ADDR ns2.ugly.
260ADDR ns3.ugly.
261ADDR ns3.ugly.
262NS boing.ugly.
263__EOF
264echo "ADDR icky.icky.icky.ptang.zoop.boing.ugly." | diff ans3/query.log - >/dev/null || ret=1
265echo "ADDR icky.icky.icky.ptang.zoop.boing.ugly." | diff ans4/query.log - >/dev/null || ret=1
266for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
267if [ $ret != 0 ]; then echo_i "failed"; fi
268status=$((status + ret))
269$RNDCCMD 10.53.0.7 flush
270
271n=$((n + 1))
272echo_i "information that minimization was unsuccessful for .ugly is logged in relaxed mode ($n)"
273ret=0
274wait_for_log 5 "success resolving 'icky.icky.icky.ptang.zoop.boing.ugly/A' after disabling qname minimization" ns7/named.run >/dev/null || ret=1
275if [ $ret != 0 ]; then echo_i "failed"; fi
276status=$((status + ret))
277
278n=$((n + 1))
279echo_i "query for .slow is properly minimized when qname-minimization is on ($n)"
280ret=0
281$CLEANQL
282$RNDCCMD 10.53.0.6 flush
283$DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.slow. @10.53.0.6 >dig.out.test$n
284sleep 5
285grep "status: NOERROR" dig.out.test$n >/dev/null || ret=1
286grep "icky.icky.icky.ptang.zoop.boing.slow. 1	IN A	192.0.2.1" dig.out.test$n >/dev/null || ret=1
287sort ans2/query.log >ans2/query.log.sorted
288cat <<__EOF | diff ans2/query.log.sorted - >/dev/null || ret=1
289ADDR a.bit.longer.ns.name.slow.
290ADDR a.bit.longer.ns.name.slow.
291ADDR ns2.slow.
292ADDR ns3.slow.
293ADDR ns3.slow.
294NS boing.slow.
295NS slow.
296NS zoop.boing.slow.
297__EOF
298cat <<__EOF | diff ans3/query.log - >/dev/null || ret=1
299NS zoop.boing.slow.
300NS ptang.zoop.boing.slow.
301NS icky.ptang.zoop.boing.slow.
302__EOF
303cat <<__EOF | diff ans4/query.log - >/dev/null || ret=1
304NS icky.ptang.zoop.boing.slow.
305NS icky.icky.ptang.zoop.boing.slow.
306ADDR icky.icky.icky.ptang.zoop.boing.slow.
307__EOF
308for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
309if [ $ret != 0 ]; then echo_i "failed"; fi
310status=$((status + ret))
311
312n=$((n + 1))
313echo_i "query for .ip6.arpa succeeds and skips on proper boundaries when qname-minimization is on ($n)"
314ret=0
315$CLEANQL
316$RNDCCMD 10.53.0.6 flush
317$DIG $DIGOPTS -x 2001:4f8::1 @10.53.0.6 >dig.out.test$n
318grep "status: NOERROR" dig.out.test$n >/dev/null || ret=1
319grep "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.f.4.0.1.0.0.2.ip6.arpa. 1 IN PTR nee.com." dig.out.test$n >/dev/null || ret=1
320sleep 1
321grep -v ADDR ans2/query.log >ans2/query.log.trimmed
322cat <<__EOF | diff ans2/query.log.trimmed - >/dev/null || ret=1
323NS 1.0.0.2.ip6.arpa.
324NS 8.f.4.0.1.0.0.2.ip6.arpa.
325NS 0.0.0.0.8.f.4.0.1.0.0.2.ip6.arpa.
326NS 0.0.0.0.0.0.8.f.4.0.1.0.0.2.ip6.arpa.
327NS 0.0.0.0.0.0.0.0.8.f.4.0.1.0.0.2.ip6.arpa.
328PTR 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.f.4.0.1.0.0.2.ip6.arpa.
329__EOF
330for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
331if [ $ret != 0 ]; then echo_i "failed"; fi
332status=$((status + ret))
333
334n=$((n + 1))
335echo_i "query for multiple label name skips after 7th label ($n)"
336ret=0
337$CLEANQL
338$RNDCCMD 10.53.0.6 flush
339$DIG $DIGOPTS more.icky.icky.icky.ptang.zoop.boing.good. @10.53.0.6 >dig.out.test$n
340grep "status: NOERROR" dig.out.test$n >/dev/null || ret=1
341grep "more.icky.icky.icky.ptang.zoop.boing.good. 1 IN	A 192.0.2.2" dig.out.test$n >/dev/null || ret=1
342sleep 1
343sort ans2/query.log >ans2/query.log.sorted
344cat <<__EOF | diff ans2/query.log.sorted - >/dev/null || ret=1
345ADDR a.bit.longer.ns.name.good.
346ADDR a.bit.longer.ns.name.good.
347ADDR ns2.good.
348ADDR ns3.good.
349ADDR ns3.good.
350NS boing.good.
351NS good.
352NS zoop.boing.good.
353__EOF
354cat <<__EOF | diff ans3/query.log - >/dev/null || ret=1
355NS zoop.boing.good.
356NS ptang.zoop.boing.good.
357NS icky.ptang.zoop.boing.good.
358__EOF
359# There's no NS icky.icky.icky.ptang.zoop.boing.good. query - we skipped it.
360cat <<__EOF | diff ans4/query.log - >/dev/null || ret=1
361NS icky.ptang.zoop.boing.good.
362NS icky.icky.ptang.zoop.boing.good.
363ADDR more.icky.icky.icky.ptang.zoop.boing.good.
364__EOF
365for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
366if [ $ret != 0 ]; then echo_i "failed"; fi
367status=$((status + ret))
368
369n=$((n + 1))
370echo_i "qname minimization is disabled when forwarding ($n)"
371ret=0
372$CLEANQL
373$RNDCCMD 10.53.0.7 flush
374$DIG $DIGOPTS a.bit.longer.ns.name.fwd. @10.53.0.7 >dig.out.test$n
375grep "status: NOERROR" dig.out.test$n >/dev/null || ret=1
376grep "a.bit.longer.ns.name.fwd. 1	IN	A	10.53.0.4" dig.out.test$n >/dev/null || ret=1
377sleep 1
378cat <<__EOF | diff ans2/query.log - >/dev/null || ret=1
379ADDR a.bit.longer.ns.name.fwd.
380__EOF
381for ans in ans2; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
382if [ $ret != 0 ]; then echo_i "failed"; fi
383status=$((status + ret))
384
385n=$((n + 1))
386echo_i "qname minimization resolves unusual ip6.arpa. names ($n)"
387ret=0
388$CLEANQL
389$DIG $DIGOPTS test1.test2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.9.0.9.4.1.1.1.1.8.2.6.0.1.0.0.2.ip6.arpa. txt @10.53.0.7 >dig.out.test$n 2>&1
390grep "status: NOERROR" dig.out.test$n >/dev/null || ret=1
391# Expected output in dig.out.test$n:
392# ;; ANSWER SECTION:
393# test1.test2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.9.0.9.4.1.1.1.1.8.2.6.0.1.0.0.2.ip6.arpa. 1 IN TXT "long_ip6_name"
394grep 'ip6\.arpa.*TXT.*long_ip6_name' dig.out.test$n >/dev/null || ret=1
395for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
396if [ $ret != 0 ]; then echo_i "failed"; fi
397status=$((status + ret))
398
399# Below are test cases for GL #2665: The QNAME minimization (if enabled) should
400# also occur on the second query, after the RRsets have expired from cache.
401# BIND will still have the entries in cache, but marked stale. These stale
402# entries should not prevent the resolver from minimizing the QNAME.
403# We query for the test domain a.b.stale. in all cases (QNAME minimization off,
404# strict mode, and relaxed mode) and expect it to behave the same the second
405# time when we have a stale delegation structure in cache.
406n=$((n + 1))
407echo_i "query for .stale is not minimized when qname-minimization is off ($n)"
408ret=0
409$CLEANQL
410$RNDCCMD 10.53.0.5 flush
411$DIG $DIGOPTS @10.53.0.5 txt a.b.stale. >dig.out.test$n
412grep "status: NOERROR" dig.out.test$n >/dev/null || ret=1
413grep "a\.b\.stale\..*1.*IN.*TXT.*peekaboo" dig.out.test$n >/dev/null || ret=1
414sleep 1
415echo "TXT a.b.stale." | diff ans2/query.log - >/dev/null || ret=1
416echo "TXT a.b.stale." | diff ans3/query.log - >/dev/null || ret=1
417test -f ans4/query.log && ret=1
418for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
419if [ $ret != 0 ]; then echo_i "failed"; fi
420status=$((status + ret))
421
422n=$((n + 1))
423echo_i "query for .stale is properly minimized when qname-minimization is in strict mode ($n)"
424ret=0
425$CLEANQL
426$RNDCCMD 10.53.0.6 flush
427$DIG $DIGOPTS @10.53.0.6 txt a.b.stale. >dig.out.test$n
428grep "status: NOERROR" dig.out.test$n >/dev/null || ret=1
429grep "a\.b\.stale\..*1.*IN.*TXT.*hooray" dig.out.test$n >/dev/null || ret=1
430sleep 1
431sort ans2/query.log >ans2/query.log.sorted
432cat <<__EOF | diff ans2/query.log.sorted - >/dev/null || ret=1
433ADDR ns.b.stale.
434ADDR ns2.stale.
435NS b.stale.
436NS stale.
437__EOF
438test -f ans3/query.log && ret=1
439sort ans4/query.log >ans4/query.log.sorted
440cat <<__EOF | diff ans4/query.log.sorted - >/dev/null || ret=1
441ADDR ns.b.stale.
442NS b.stale.
443TXT a.b.stale.
444__EOF
445for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
446if [ $ret != 0 ]; then echo_i "failed"; fi
447status=$((status + ret))
448
449n=$((n + 1))
450echo_i "query for .stale is properly minimized when qname-minimization is in relaxed mode ($n)"
451ret=0
452$CLEANQL
453$RNDCCMD 10.53.0.7 flush
454$DIG $DIGOPTS @10.53.0.7 txt a.b.stale. >dig.out.test$n
455grep "status: NOERROR" dig.out.test$n >/dev/null || ret=1
456grep "a\.b\.stale\..*1.*IN.*TXT.*hooray" dig.out.test$n >/dev/null || ret=1
457sleep 1
458sort ans2/query.log >ans2/query.log.sorted
459cat <<__EOF | diff ans2/query.log.sorted - >/dev/null || ret=1
460ADDR ns.b.stale.
461ADDR ns2.stale.
462NS b.stale.
463__EOF
464test -f ans3/query.log && ret=1
465sort ans4/query.log >ans4/query.log.sorted
466cat <<__EOF | diff ans4/query.log.sorted - >/dev/null || ret=1
467ADDR ns.b.stale.
468TXT a.b.stale.
469__EOF
470for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
471if [ $ret != 0 ]; then echo_i "failed"; fi
472status=$((status + ret))
473
474echo_i "sleep 2, allow entries in cache to go stale"
475sleep 2
476
477n=$((n + 1))
478echo_i "query for .stale is not minimized when qname-minimization is off (stale cache) ($n)"
479ret=0
480$CLEANQL
481$DIG $DIGOPTS @10.53.0.5 txt a.b.stale. >dig.out.test$n
482grep "status: NOERROR" dig.out.test$n >/dev/null || ret=1
483grep "a\.b\.stale\..*1.*IN.*TXT.*peekaboo" dig.out.test$n >/dev/null || ret=1
484sleep 1
485echo "TXT a.b.stale." | diff ans2/query.log - >/dev/null || ret=1
486echo "TXT a.b.stale." | diff ans3/query.log - >/dev/null || ret=1
487test -f ans4/query.log && ret=1
488for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
489if [ $ret != 0 ]; then echo_i "failed"; fi
490status=$((status + ret))
491
492n=$((n + 1))
493echo_i "query for .stale is properly minimized when qname-minimization is in strict mode (stale cache) ($n)"
494ret=0
495$CLEANQL
496$DIG $DIGOPTS @10.53.0.6 txt a.b.stale. >dig.out.test$n
497grep "status: NOERROR" dig.out.test$n >/dev/null || ret=1
498grep "a\.b\.stale\..*1.*IN.*TXT.*hooray" dig.out.test$n >/dev/null || ret=1
499sleep 1
500sort ans2/query.log >ans2/query.log.sorted
501cat <<__EOF | diff ans2/query.log.sorted - >/dev/null || ret=1
502NS b.stale.
503NS stale.
504__EOF
505test -f ans3/query.log && ret=1
506sort ans4/query.log >ans4/query.log.sorted
507cat <<__EOF | diff ans4/query.log.sorted - >/dev/null || ret=1
508NS b.stale.
509TXT a.b.stale.
510__EOF
511for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
512if [ $ret != 0 ]; then echo_i "failed"; fi
513status=$((status + ret))
514
515n=$((n + 1))
516echo_i "query for .stale is properly minimized when qname-minimization is in relaxed mode (stale cache) ($n)"
517ret=0
518$CLEANQL
519$DIG $DIGOPTS @10.53.0.7 txt a.b.stale. >dig.out.test$n
520grep "status: NOERROR" dig.out.test$n >/dev/null || ret=1
521grep "a\.b\.stale\..*1.*IN.*TXT.*hooray" dig.out.test$n >/dev/null || ret=1
522sleep 1
523sort ans2/query.log >ans2/query.log.sorted
524cat <<__EOF | diff ans2/query.log.sorted - >/dev/null || ret=1
525NS b.stale.
526__EOF
527test -f ans3/query.log && ret=1
528sort ans4/query.log >ans4/query.log.sorted
529cat <<__EOF | diff ans4/query.log.sorted - >/dev/null || ret=1
530TXT a.b.stale.
531__EOF
532for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
533if [ $ret != 0 ]; then echo_i "failed"; fi
534status=$((status + ret))
535
536echo_i "exit status: $status"
537[ $status -eq 0 ] || exit 1
538