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