1#!/bin/sh
2#
3# Copyright (C) Internet Systems Consortium, Inc. ("ISC")
4#
5# This Source Code Form is subject to the terms of the Mozilla Public
6# License, v. 2.0. If a copy of the MPL was not distributed with this
7# file, You can obtain one at http://mozilla.org/MPL/2.0/.
8#
9# See the COPYRIGHT file distributed with this work for additional
10# information regarding copyright ownership.
11
12SYSTEMTESTTOP=..
13. $SYSTEMTESTTOP/conf.sh
14
15DIGOPTS="-p ${PORT}"
16RNDCCMD="$RNDC -c $SYSTEMTESTTOP/common/rndc.conf -p ${CONTROLPORT} -s"
17CLEANQL="rm -f ans*/query.log"
18status=0
19n=0
20
21n=`expr $n + 1`
22echo_i "query for .good is not minimized when qname-minimization is off ($n)"
23ret=0
24$CLEANQL
25$RNDCCMD 10.53.0.5 flush
26$DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.good. @10.53.0.5 > dig.out.test$n
27grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
28grep "icky.icky.icky.ptang.zoop.boing.good. 1	IN A	192.0.2.1" dig.out.test$n > /dev/null || ret=1
29sleep 1
30cat << __EOF | $DIFF ans2/query.log - > /dev/null || ret=1
31ADDR icky.icky.icky.ptang.zoop.boing.good.
32ADDR ns3.good.
33ADDR ns3.good.
34ADDR a.bit.longer.ns.name.good.
35ADDR a.bit.longer.ns.name.good.
36__EOF
37echo "ADDR icky.icky.icky.ptang.zoop.boing.good." | $DIFF ans3/query.log - > /dev/null || ret=1
38echo "ADDR icky.icky.icky.ptang.zoop.boing.good." | $DIFF ans4/query.log - > /dev/null || ret=1
39for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
40if [ $ret != 0 ]; then echo_i "failed"; fi
41status=`expr $status + $ret`
42
43n=`expr $n + 1`
44echo_i "query for .bad is not minimized when qname-minimization is off ($n)"
45ret=0
46$CLEANQL
47$RNDCCMD 10.53.0.5 flush
48$DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.bad. @10.53.0.5 > dig.out.test$n
49grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
50grep "icky.icky.icky.ptang.zoop.boing.bad. 1 IN A	192.0.2.1" dig.out.test$n > /dev/null || ret=1
51sleep 1
52cat << __EOF | $DIFF ans2/query.log - > /dev/null || ret=1
53ADDR icky.icky.icky.ptang.zoop.boing.bad.
54ADDR ns3.bad.
55ADDR ns3.bad.
56ADDR a.bit.longer.ns.name.bad.
57ADDR a.bit.longer.ns.name.bad.
58__EOF
59echo "ADDR icky.icky.icky.ptang.zoop.boing.bad." | $DIFF ans3/query.log - > /dev/null || ret=1
60echo "ADDR icky.icky.icky.ptang.zoop.boing.bad." | $DIFF ans4/query.log - > /dev/null || ret=1
61for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
62if [ $ret != 0 ]; then echo_i "failed"; fi
63status=`expr $status + $ret`
64
65n=`expr $n + 1`
66echo_i "query for .slow is not minimized when qname-minimization is off ($n)"
67ret=0
68$CLEANQL
69$RNDCCMD 10.53.0.5 flush
70$DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.slow. @10.53.0.5 > dig.out.test$n
71sleep 5
72grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
73grep "icky.icky.icky.ptang.zoop.boing.slow. 1	IN A	192.0.2.1" dig.out.test$n > /dev/null || ret=1
74sleep 1
75cat << __EOF | $DIFF ans2/query.log - > /dev/null || ret=1
76ADDR icky.icky.icky.ptang.zoop.boing.slow.
77ADDR ns3.slow.
78ADDR ns3.slow.
79ADDR a.bit.longer.ns.name.slow.
80ADDR a.bit.longer.ns.name.slow.
81__EOF
82echo "ADDR icky.icky.icky.ptang.zoop.boing.slow." | $DIFF ans3/query.log - > /dev/null || ret=1
83echo "ADDR icky.icky.icky.ptang.zoop.boing.slow." | $DIFF ans4/query.log - > /dev/null || ret=1
84for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
85if [ $ret != 0 ]; then echo_i "failed"; fi
86status=`expr $status + $ret`
87
88n=`expr $n + 1`
89echo_i "query for .ugly is not minimized when qname-minimization is off ($n)"
90ret=0
91$CLEANQL
92$RNDCCMD 10.53.0.5 flush
93$DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.ugly. @10.53.0.5 > dig.out.test$n
94sleep 5
95grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
96grep "icky.icky.icky.ptang.zoop.boing.ugly. 1	IN A	192.0.2.1" dig.out.test$n > /dev/null || ret=1
97sleep 1
98cat << __EOF | $DIFF ans2/query.log - > /dev/null || ret=1
99ADDR icky.icky.icky.ptang.zoop.boing.ugly.
100ADDR ns3.ugly.
101ADDR ns3.ugly.
102ADDR a.bit.longer.ns.name.ugly.
103ADDR a.bit.longer.ns.name.ugly.
104__EOF
105echo "ADDR icky.icky.icky.ptang.zoop.boing.ugly." | $DIFF ans3/query.log - > /dev/null || ret=1
106echo "ADDR icky.icky.icky.ptang.zoop.boing.ugly." | $DIFF ans4/query.log - > /dev/null || ret=1
107for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
108if [ $ret != 0 ]; then echo_i "failed"; fi
109status=`expr $status + $ret`
110
111n=`expr $n + 1`
112echo_i "query for .good is properly minimized when qname-minimization is in strict mode ($n)"
113ret=0
114$CLEANQL
115$RNDCCMD 10.53.0.6 flush
116$DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.good. @10.53.0.6 > dig.out.test$n
117grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
118grep "icky.icky.icky.ptang.zoop.boing.good. 1	IN A	192.0.2.1" dig.out.test$n > /dev/null || ret=1
119sleep 1
120sort ans2/query.log > ans2/query.log.sorted
121cat << __EOF | $DIFF ans2/query.log.sorted - > /dev/null || ret=1
122ADDR a.bit.longer.ns.name.good.
123ADDR a.bit.longer.ns.name.good.
124ADDR ns2.good.
125ADDR ns3.good.
126ADDR ns3.good.
127NS boing.good.
128NS good.
129NS zoop.boing.good.
130__EOF
131cat << __EOF | $DIFF ans3/query.log - > /dev/null || ret=1
132NS zoop.boing.good.
133NS ptang.zoop.boing.good.
134NS icky.ptang.zoop.boing.good.
135__EOF
136cat << __EOF | $DIFF ans4/query.log - > /dev/null || ret=1
137NS icky.ptang.zoop.boing.good.
138NS icky.icky.ptang.zoop.boing.good.
139ADDR icky.icky.icky.ptang.zoop.boing.good.
140__EOF
141for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
142if [ $ret != 0 ]; then echo_i "failed"; fi
143status=`expr $status + $ret`
144
145n=`expr $n + 1`
146echo_i "query for .good is properly minimized when qname-minimization is in relaxed mode ($n)"
147ret=0
148$CLEANQL
149$RNDCCMD 10.53.0.7 flush
150$DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.good. @10.53.0.7 > dig.out.test$n
151grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
152grep "icky.icky.icky.ptang.zoop.boing.good. 1	IN A	192.0.2.1" dig.out.test$n > /dev/null || ret=1
153sleep 1
154sort ans2/query.log > ans2/query.log.sorted
155cat << __EOF | $DIFF ans2/query.log.sorted - > /dev/null || ret=1
156ADDR _.boing.good.
157ADDR _.zoop.boing.good.
158ADDR a.bit.longer.ns.name.good.
159ADDR a.bit.longer.ns.name.good.
160ADDR ns2.good.
161ADDR ns3.good.
162ADDR ns3.good.
163__EOF
164cat << __EOF | $DIFF ans3/query.log - > /dev/null || ret=1
165ADDR _.ptang.zoop.boing.good.
166ADDR _.icky.ptang.zoop.boing.good.
167__EOF
168cat << __EOF | $DIFF ans4/query.log - > /dev/null || ret=1
169ADDR _.icky.icky.ptang.zoop.boing.good.
170ADDR icky.icky.icky.ptang.zoop.boing.good.
171__EOF
172for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
173if [ $ret != 0 ]; then echo_i "failed"; fi
174status=`expr $status + $ret`
175
176n=`expr $n + 1`
177echo_i "query for .bad fails when qname-minimization is in strict mode ($n)"
178ret=0
179$CLEANQL
180$RNDCCMD 10.53.0.6 flush
181$DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.bad. @10.53.0.6 > dig.out.test$n
182grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1
183sleep 1
184sort ans2/query.log > ans2/query.log.sorted
185cat << __EOF | $DIFF ans2/query.log.sorted - > /dev/null || ret=1
186ADDR ns2.bad.
187NS bad.
188NS boing.bad.
189__EOF
190for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
191if [ $ret != 0 ]; then echo_i "failed"; fi
192status=`expr $status + $ret`
193
194n=`expr $n + 1`
195echo_i "query for .bad succeeds when qname-minimization is in relaxed mode ($n)"
196ret=0
197$CLEANQL
198$RNDCCMD 10.53.0.7 flush
199$DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.bad. @10.53.0.7 > dig.out.test$n
200grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
201grep "icky.icky.icky.ptang.zoop.boing.bad. 1 IN A	192.0.2.1" dig.out.test$n > /dev/null || ret=1
202sleep 1
203sort ans2/query.log > ans2/query.log.sorted
204cat << __EOF | $DIFF ans2/query.log.sorted - > /dev/null || ret=1
205ADDR _.boing.bad.
206ADDR _.zoop.boing.bad.
207ADDR a.bit.longer.ns.name.bad.
208ADDR a.bit.longer.ns.name.bad.
209ADDR ns2.bad.
210ADDR ns3.bad.
211ADDR ns3.bad.
212__EOF
213cat << __EOF | $DIFF ans3/query.log - > /dev/null || ret=1
214ADDR _.ptang.zoop.boing.bad.
215ADDR _.icky.ptang.zoop.boing.bad.
216__EOF
217cat << __EOF | $DIFF ans4/query.log - > /dev/null || ret=1
218ADDR _.icky.icky.ptang.zoop.boing.bad.
219ADDR icky.icky.icky.ptang.zoop.boing.bad.
220__EOF
221for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
222if [ $ret != 0 ]; then echo_i "failed"; fi
223status=`expr $status + $ret`
224
225n=`expr $n + 1`
226echo_i "query for .ugly fails when qname-minimization is in strict mode ($n)"
227ret=0
228$CLEANQL
229$RNDCCMD 10.53.0.6 flush
230$DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.ugly. @10.53.0.6 > dig.out.test$n
231grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1
232sleep 1
233sort ans2/query.log > ans2/query.log.sorted
234cat << __EOF | $DIFF ans2/query.log.sorted - > /dev/null || ret=1
235ADDR ns2.ugly.
236NS boing.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=`expr $status + $ret`
243$RNDCCMD 10.53.0.6 flush
244
245n=`expr $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
254
255sort ans2/query.log > ans2/query.log.sorted
256cat << __EOF | $DIFF ans2/query.log.sorted - > /dev/null || cat ans2/query.log.sorted
257ADDR _.boing.ugly.
258ADDR _.boing.ugly.
259ADDR a.bit.longer.ns.name.ugly.
260ADDR a.bit.longer.ns.name.ugly.
261ADDR icky.icky.icky.ptang.zoop.boing.ugly.
262ADDR ns2.ugly.
263ADDR ns3.ugly.
264ADDR ns3.ugly.
265__EOF
266echo "ADDR icky.icky.icky.ptang.zoop.boing.ugly." | $DIFF ans3/query.log - > /dev/null || ret=1
267echo "ADDR icky.icky.icky.ptang.zoop.boing.ugly." | $DIFF ans4/query.log - > /dev/null || ret=1
268for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
269if [ $ret != 0 ]; then echo_i "failed"; fi
270status=`expr $status + $ret`
271$RNDCCMD 10.53.0.7 flush
272
273n=`expr $n + 1`
274echo_i "information that minimization was unsuccessful for .ugly is logged ($n)"
275ret=0
276grep "success resolving 'icky.icky.icky.ptang.zoop.boing.ugly/A' after disabling qname minimization due to 'FORMERR'" ns7/named.run > /dev/null || ret=1
277if [ $ret != 0 ]; then echo_i "failed"; fi
278status=`expr $status + $ret`
279
280n=`expr $n + 1`
281echo_i "query for .slow is properly minimized when qname-minimization is on ($n)"
282ret=0
283$CLEANQL
284$RNDCCMD 10.53.0.6 flush
285$DIG $DIGOPTS icky.icky.icky.ptang.zoop.boing.slow. @10.53.0.6 > dig.out.test$n
286sleep 5
287grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
288grep "icky.icky.icky.ptang.zoop.boing.slow. 1	IN A	192.0.2.1" dig.out.test$n > /dev/null || ret=1
289sort ans2/query.log > ans2/query.log.sorted
290cat << __EOF | $DIFF ans2/query.log.sorted - > /dev/null || ret=1
291ADDR a.bit.longer.ns.name.slow.
292ADDR a.bit.longer.ns.name.slow.
293ADDR ns2.slow.
294ADDR ns3.slow.
295ADDR ns3.slow.
296NS boing.slow.
297NS slow.
298NS zoop.boing.slow.
299__EOF
300cat << __EOF | $DIFF ans3/query.log - > /dev/null || ret=1
301NS zoop.boing.slow.
302NS ptang.zoop.boing.slow.
303NS icky.ptang.zoop.boing.slow.
304__EOF
305cat << __EOF | $DIFF ans4/query.log - > /dev/null || ret=1
306NS icky.ptang.zoop.boing.slow.
307NS icky.icky.ptang.zoop.boing.slow.
308ADDR icky.icky.icky.ptang.zoop.boing.slow.
309__EOF
310for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
311if [ $ret != 0 ]; then echo_i "failed"; fi
312status=`expr $status + $ret`
313
314n=`expr $n + 1`
315echo_i "query for .ip6.arpa succeeds and skips on proper boundaries when qname-minimization is on ($n)"
316ret=0
317$CLEANQL
318$RNDCCMD 10.53.0.6 flush
319$DIG $DIGOPTS -x 2001:4f8::1 @10.53.0.6 > dig.out.test$n
320grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
321grep "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
322sleep 1
323grep -v ADDR ans2/query.log > ans2/query.log.trimmed
324cat << __EOF | $DIFF ans2/query.log.trimmed - > /dev/null || ret=1
325NS 1.0.0.2.ip6.arpa.
326NS 8.f.4.0.1.0.0.2.ip6.arpa.
327NS 0.0.0.0.8.f.4.0.1.0.0.2.ip6.arpa.
328NS 0.0.0.0.0.0.8.f.4.0.1.0.0.2.ip6.arpa.
329NS 0.0.0.0.0.0.0.0.8.f.4.0.1.0.0.2.ip6.arpa.
330PTR 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.
331__EOF
332for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
333if [ $ret != 0 ]; then echo_i "failed"; fi
334status=`expr $status + $ret`
335
336n=`expr $n + 1`
337echo_i "query for multiple label name skips after 7th label ($n)"
338ret=0
339$CLEANQL
340$RNDCCMD 10.53.0.6 flush
341$DIG $DIGOPTS more.icky.icky.icky.ptang.zoop.boing.good. @10.53.0.6 > dig.out.test$n
342grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
343grep "more.icky.icky.icky.ptang.zoop.boing.good. 1 IN	A 192.0.2.2" dig.out.test$n > /dev/null || ret=1
344sleep 1
345sort ans2/query.log > ans2/query.log.sorted
346cat << __EOF | $DIFF ans2/query.log.sorted - > /dev/null || ret=1
347ADDR a.bit.longer.ns.name.good.
348ADDR a.bit.longer.ns.name.good.
349ADDR ns2.good.
350ADDR ns3.good.
351ADDR ns3.good.
352NS boing.good.
353NS good.
354NS zoop.boing.good.
355__EOF
356cat << __EOF | $DIFF ans3/query.log - > /dev/null || ret=1
357NS zoop.boing.good.
358NS ptang.zoop.boing.good.
359NS icky.ptang.zoop.boing.good.
360__EOF
361# There's no NS icky.icky.icky.ptang.zoop.boing.good. query - we skipped it.
362cat << __EOF | $DIFF ans4/query.log - > /dev/null || ret=1
363NS icky.ptang.zoop.boing.good.
364NS icky.icky.ptang.zoop.boing.good.
365ADDR more.icky.icky.icky.ptang.zoop.boing.good.
366__EOF
367for ans in ans2 ans3 ans4; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
368if [ $ret != 0 ]; then echo_i "failed"; fi
369status=`expr $status + $ret`
370
371n=`expr $n + 1`
372echo_i "qname minimization is disabled when forwarding ($n)"
373ret=0
374$CLEANQL
375$RNDCCMD 10.53.0.7 flush
376$DIG $DIGOPTS a.bit.longer.ns.name.fwd. @10.53.0.7 > dig.out.test$n
377grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
378grep "a.bit.longer.ns.name.fwd. 1	IN	A	10.53.0.4" dig.out.test$n >/dev/null || ret=1
379sleep 1
380cat << __EOF | $DIFF ans2/query.log - > /dev/null || ret=1
381ADDR a.bit.longer.ns.name.fwd.
382__EOF
383for ans in ans2; do mv -f $ans/query.log query-$ans-$n.log 2>/dev/null || true; done
384if [ $ret != 0 ]; then echo_i "failed"; fi
385status=`expr $status + $ret`
386
387echo_i "exit status: $status"
388[ $status -eq 0 ] || exit 1
389