tests.sh 37.7 KB
Newer Older
1
2
#!/bin/sh
#
3
# Copyright (C) Internet Systems Consortium, Inc. ("ISC")
Evan Hunt's avatar
Evan Hunt committed
4
#
5
6
7
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
8
9
10
#
# See the COPYRIGHT file distributed with this work for additional
# information regarding copyright ownership.
Evan Hunt's avatar
Evan Hunt committed
11

12
# shellcheck source=conf.sh
13
SYSTEMTESTTOP=..
14
. "$SYSTEMTESTTOP/conf.sh"
Evan Hunt's avatar
Evan Hunt committed
15

16
17
set -e

Evan Hunt's avatar
Evan Hunt committed
18
19
status=0
n=0
20

21
sendcmd() {
22
    "$PERL" "$SYSTEMTESTTOP/send.pl" "${1}" "$EXTRAPORT1"
23
24
25
26
27
28
29
30
31
32
}

dig_with_opts() {
    "$DIG" -p "$PORT" "$@"
}

mdig_with_opts() {
    "$MDIG" -p "$PORT" "$@"
}

Mark Andrews's avatar
Mark Andrews committed
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# Check if response in file $1 has the correct TTL range.
# The response record must have RRtype $2 and class IN (CLASS1).
# Maximum TTL is given by $3.  This works in most cases where TTL is
# the second word on the line.  TTL position can be adjusted with
# setting the position $4, but that requires updating this function.
check_ttl_range() {
    file=$1
    pos=$4

    case "$pos" in
    "3")
    awk -v rrtype="$2" -v ttl="$3" '($4 == "IN" || $4 == "CLASS1" ) && $5 == rrtype { if ($3 <= ttl) { ok=1 } } END { exit(ok?0:1) }' < $file
    ;;
    *)
    awk -v rrtype="$2" -v ttl="$3" '($3 == "IN" || $3 == "CLASS1" ) && $4 == rrtype { if ($2 <= ttl) { ok=1 } } END { exit(ok?0:1) }' < $file
    ;;
    esac

   result=$?
   [ $result -eq 0 ] || echo_i "ttl check failed"
   return $result
}

56
57
# using delv insecure mode as not testing dnssec here
delv_with_opts() {
Mark Andrews's avatar
Mark Andrews committed
58
    "$DELV" +noroot +nodlv -p "$PORT" "$@"
59
60
61
}

KEYID="$(cat ns2/keyid)"
62
63
KEYDATA="$(< ns2/keydata sed -e 's/+/[+]/g')"
NOSPLIT="$(< ns2/keydata sed -e 's/+/[+]/g' -e 's/ //g')"
64
65
66

if [ -x "$DIG" ] ; then
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
67
  echo_i "checking dig short form works ($n)"
68
  ret=0
69
70
71
72
  dig_with_opts @10.53.0.3 +short a a.example > dig.out.test$n || ret=1
  test "$(wc -l < dig.out.test$n)" -eq 1 || ret=1
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
73

74
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
75
  echo_i "checking dig split width works ($n)"
76
  ret=0
77
  dig_with_opts @10.53.0.3 +split=4 -t sshfp foo.example > dig.out.test$n || ret=1
78
  grep " 9ABC DEF6 7890 " < dig.out.test$n > /dev/null || ret=1
Matthijs Mekking's avatar
Matthijs Mekking committed
79
  check_ttl_range dig.out.test$n "SSHFP" 300 || ret=1
80
81
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
82

83
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
84
  echo_i "checking dig +unknownformat works ($n)"
85
  ret=0
86
  dig_with_opts @10.53.0.3 +unknownformat a a.example > dig.out.test$n || ret=1
87
  grep "CLASS1[ 	][ 	]*TYPE1[ 	][ 	]*\\\\# 4 0A000001" < dig.out.test$n > /dev/null || ret=1
Matthijs Mekking's avatar
Matthijs Mekking committed
88
  check_ttl_range dig.out.test$n "TYPE1" 300 || ret=1
89
90
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
91

92
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
93
  echo_i "checking dig with reverse lookup works ($n)"
94
  ret=0
95
  dig_with_opts @10.53.0.3 -x 127.0.0.1 > dig.out.test$n 2>&1 || ret=1
96
  # doesn't matter if has answer
97
  grep -i "127\\.in-addr\\.arpa\\." < dig.out.test$n > /dev/null || ret=1
Matthijs Mekking's avatar
Matthijs Mekking committed
98
  check_ttl_range dig.out.test$n "SOA" 86400 || ret=1
99
100
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
101

102
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
103
  echo_i "checking dig over TCP works ($n)"
104
  ret=0
105
  dig_with_opts +tcp @10.53.0.3 a a.example > dig.out.test$n || ret=1
106
  grep "10\\.0\\.0\\.1$" < dig.out.test$n > /dev/null || ret=1
Matthijs Mekking's avatar
Matthijs Mekking committed
107
  check_ttl_range dig.out.test$n "A" 300 || ret=1
108
109
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
110

111
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
112
  echo_i "checking dig +multi +norrcomments works for dnskey (when default is rrcomments)($n)"
Evan Hunt's avatar
Evan Hunt committed
113
  ret=0
114
115
  dig_with_opts +tcp @10.53.0.3 +multi +norrcomments DNSKEY dnskey.example > dig.out.test$n || ret=1
  grep "; ZSK; alg = $DEFAULT_ALGORITHM ; key id = $KEYID" < dig.out.test$n > /dev/null && ret=1
Matthijs Mekking's avatar
Matthijs Mekking committed
116
  check_ttl_range dig.out.test$n "DNSKEY" 300 || ret=1
117
118
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
Evan Hunt's avatar
Evan Hunt committed
119

120
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
121
  echo_i "checking dig +multi +norrcomments works for soa (when default is rrcomments)($n)"
Evan Hunt's avatar
Evan Hunt committed
122
  ret=0
123
124
  dig_with_opts +tcp @10.53.0.3 +multi +norrcomments SOA example > dig.out.test$n || ret=1
  grep "; ZSK; alg = $DEFAULT_ALGORITHM ; key id = $KEYID" < dig.out.test$n > /dev/null && ret=1
Matthijs Mekking's avatar
Matthijs Mekking committed
125
  check_ttl_range dig.out.test$n "SOA" 300 || ret=1
126
127
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
Evan Hunt's avatar
Evan Hunt committed
128

129
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
130
  echo_i "checking dig +rrcomments works for DNSKEY($n)"
Evan Hunt's avatar
Evan Hunt committed
131
  ret=0
132
133
  dig_with_opts +tcp @10.53.0.3 +rrcomments DNSKEY dnskey.example > dig.out.test$n || ret=1
  grep "; ZSK; alg = $DEFAULT_ALGORITHM ; key id = $KEYID" < dig.out.test$n > /dev/null || ret=1
Matthijs Mekking's avatar
Matthijs Mekking committed
134
  check_ttl_range dig.out.test$n "DNSKEY" 300 || ret=1
135
136
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
Evan Hunt's avatar
Evan Hunt committed
137

138
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
139
  echo_i "checking dig +short +rrcomments works for DNSKEY ($n)"
Evan Hunt's avatar
Evan Hunt committed
140
  ret=0
141
142
143
144
  dig_with_opts +tcp @10.53.0.3 +short +rrcomments DNSKEY dnskey.example > dig.out.test$n || ret=1
  grep "; ZSK; alg = $DEFAULT_ALGORITHM ; key id = $KEYID" < dig.out.test$n > /dev/null || ret=1
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
Evan Hunt's avatar
Evan Hunt committed
145

146
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
147
  echo_i "checking dig +short +nosplit works($n)"
148
  ret=0
149
150
151
152
  dig_with_opts +tcp @10.53.0.3 +short +nosplit DNSKEY dnskey.example > dig.out.test$n || ret=1
  grep "$NOSPLIT" < dig.out.test$n > /dev/null || ret=1
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
153

154
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
155
  echo_i "checking dig +short +rrcomments works($n)"
156
  ret=0
157
  dig_with_opts +tcp @10.53.0.3 +short +rrcomments DNSKEY dnskey.example > dig.out.test$n || ret=1
158
  grep -q "$KEYDATA  ; ZSK; alg = $DEFAULT_ALGORITHM ; key id = $KEYID\$" < dig.out.test$n || ret=1
159
160
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
161

162
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
163
  echo_i "checking dig multi flag is local($n)"
164
  ret=0
165
166
167
168
169
170
171
172
173
174
175
176
  dig_with_opts +tcp @10.53.0.3 -t DNSKEY dnskey.example +nomulti dnskey.example +nomulti > dig.out.nn.$n || ret=1
  dig_with_opts +tcp @10.53.0.3 -t DNSKEY dnskey.example +multi dnskey.example +nomulti > dig.out.mn.$n || ret=1
  dig_with_opts +tcp @10.53.0.3 -t DNSKEY dnskey.example +nomulti dnskey.example +multi > dig.out.nm.$n || ret=1
  dig_with_opts +tcp @10.53.0.3 -t DNSKEY dnskey.example +multi dnskey.example +multi > dig.out.mm.$n || ret=1
  lcnn=$(wc -l < dig.out.nn.$n)
  lcmn=$(wc -l < dig.out.mn.$n)
  lcnm=$(wc -l < dig.out.nm.$n)
  lcmm=$(wc -l < dig.out.mm.$n)
  test "$lcmm" -ge "$lcnm" || ret=1
  test "$lcmm" -ge "$lcmn" || ret=1
  test "$lcnm" -ge "$lcnn" || ret=1
  test "$lcmn" -ge "$lcnn" || ret=1
Matthijs Mekking's avatar
Matthijs Mekking committed
177
178
179
180
  check_ttl_range dig.out.nn.$n "DNSKEY" 300 || ret=1
  check_ttl_range dig.out.mn.$n "DNSKEY" 300 || ret=1
  check_ttl_range dig.out.nm.$n "DNSKEY" 300 || ret=1
  check_ttl_range dig.out.mm.$n "DNSKEY" 300 || ret=1
181
182
183
184
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))

  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
185
  echo_i "checking dig +noheader-only works ($n)"
186
  ret=0
187
  dig_with_opts +tcp @10.53.0.3 +noheader-only A example > dig.out.test$n || ret=1
188
  grep "Got answer:" < dig.out.test$n > /dev/null || ret=1
Matthijs Mekking's avatar
Matthijs Mekking committed
189
  check_ttl_range dig.out.test$n "SOA" 300 || ret=1
190
191
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
192

193
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
194
  echo_i "checking dig +short +rrcomments works($n)"
195
  ret=0
196
  dig_with_opts +tcp @10.53.0.3 +short +rrcomments DNSKEY dnskey.example > dig.out.test$n || ret=1
197
  grep -q "$KEYDATA  ; ZSK; alg = $DEFAULT_ALGORITHM ; key id = $KEYID\$" < dig.out.test$n || ret=1
198
199
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
200

201
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
202
  echo_i "checking dig +header-only works ($n)"
203
  ret=0
204
  dig_with_opts +tcp @10.53.0.3 +header-only example > dig.out.test$n || ret=1
205
206
  grep "^;; flags: qr rd; QUERY: 0, ANSWER: 0," < dig.out.test$n > /dev/null || ret=1
  grep "^;; QUESTION SECTION:" < dig.out.test$n > /dev/null && ret=1
207
208
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
209

210
  n=$((n+1))
211
212
  echo_i "checking dig +raflag works ($n)"
  ret=0
213
  dig_with_opts +tcp @10.53.0.3 +raflag +qr example > dig.out.test$n || ret=1
214
215
  grep "^;; flags: rd ra ad; QUERY: 1, ANSWER: 0," < dig.out.test$n > /dev/null || ret=1
  grep "^;; flags: qr rd ra; QUERY: 1, ANSWER: 0," < dig.out.test$n > /dev/null || ret=1
Matthijs Mekking's avatar
Matthijs Mekking committed
216
  check_ttl_range dig.out.test$n "SOA" 300 || ret=1
217
218
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
219

220
  n=$((n+1))
221
222
  echo_i "checking dig +tcflag works ($n)"
  ret=0
223
  dig_with_opts +tcp @10.53.0.3 +tcflag +qr example > dig.out.test$n || ret=1
224
225
  grep "^;; flags: tc rd ad; QUERY: 1, ANSWER: 0" < dig.out.test$n > /dev/null || ret=1
  grep "^;; flags: qr rd ra; QUERY: 1, ANSWER: 0," < dig.out.test$n > /dev/null || ret=1
Matthijs Mekking's avatar
Matthijs Mekking committed
226
  check_ttl_range dig.out.test$n "SOA" 300 || ret=1
227
228
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
229

230
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
231
  echo_i "checking dig +header-only works (with class and type set) ($n)"
232
  ret=0
233
  dig_with_opts +tcp @10.53.0.3 +header-only -c IN -t A example > dig.out.test$n || ret=1
234
235
  grep "^;; flags: qr rd; QUERY: 0, ANSWER: 0," < dig.out.test$n > /dev/null || ret=1
  grep "^;; QUESTION SECTION:" < dig.out.test$n > /dev/null && ret=1
236
237
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
238

239
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
240
  echo_i "checking dig +zflag works, and that BIND properly ignores it ($n)"
241
  ret=0
242
  dig_with_opts +tcp @10.53.0.3 +zflag +qr A example > dig.out.test$n || ret=1
243
244
  sed -n '/Sending:/,/Got answer:/p' dig.out.test$n | grep "^;; flags: rd ad; MBZ: 0x4;" > /dev/null || ret=1
  sed -n '/Got answer:/,/AUTHORITY SECTION:/p' dig.out.test$n | grep "^;; flags: qr rd ra; QUERY: 1" > /dev/null || ret=1
Matthijs Mekking's avatar
Matthijs Mekking committed
245
  check_ttl_range dig.out.test$n "SOA" 300 || ret=1
246
247
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
248

249
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
250
  echo_i "checking dig +qr +ednsopt=08 does not cause an INSIST failure ($n)"
251
  ret=0
252
  dig_with_opts @10.53.0.3 +ednsopt=08 +qr a a.example > dig.out.test$n || ret=1
253
254
  grep "INSIST" < dig.out.test$n > /dev/null && ret=1
  grep "FORMERR" < dig.out.test$n > /dev/null || ret=1
255
256
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
257

Matthijs Mekking's avatar
Matthijs Mekking committed
258
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
259
  echo_i "checking dig +ttlunits works ($n)"
260
  ret=0
261
  dig_with_opts +tcp @10.53.0.2 +ttlunits A weeks.example > dig.out.test$n || ret=1
262
  grep "^weeks.example.		3w" < dig.out.test$n > /dev/null || ret=1
263
  dig_with_opts +tcp @10.53.0.2 +ttlunits A days.example > dig.out.test$n || ret=1
264
  grep "^days.example.		3d" < dig.out.test$n > /dev/null || ret=1
265
  dig_with_opts +tcp @10.53.0.2 +ttlunits A hours.example > dig.out.test$n || ret=1
266
  grep "^hours.example.		3h" < dig.out.test$n > /dev/null || ret=1
267
  dig_with_opts +tcp @10.53.0.2 +ttlunits A minutes.example > dig.out.test$n || ret=1
268
  grep "^minutes.example.	45m" < dig.out.test$n > /dev/null || ret=1
269
  dig_with_opts +tcp @10.53.0.2 +ttlunits A seconds.example > dig.out.test$n || ret=1
270
  grep "^seconds.example.	45s" < dig.out.test$n > /dev/null || ret=1
271
272
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
273

274
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
275
  echo_i "checking dig respects precedence of options with +ttlunits ($n)"
276
  ret=0
277
  dig_with_opts +tcp @10.53.0.2 +ttlunits +nottlid A weeks.example > dig.out.test$n || ret=1
278
  grep "^weeks.example.		IN" < dig.out.test$n > /dev/null || ret=1
279
  dig_with_opts +tcp @10.53.0.2 +nottlid +ttlunits A weeks.example > dig.out.test$n || ret=1
280
  grep "^weeks.example.		3w" < dig.out.test$n > /dev/null || ret=1
281
  dig_with_opts +tcp @10.53.0.2 +nottlid +nottlunits A weeks.example > dig.out.test$n || ret=1
282
  grep "^weeks.example.		1814400" < dig.out.test$n > /dev/null || ret=1
283
284
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
Evan Hunt's avatar
Evan Hunt committed
285

286
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
287
  echo_i "checking dig preserves origin on TCP retries ($n)"
288
289
  ret=0
  # Ask ans4 to still accept TCP connections, but not respond to queries
290
  echo "//" | sendcmd 10.53.0.4
291
292
  dig_with_opts -d +tcp @10.53.0.4 +retry=1 +time=1 +domain=bar foo > dig.out.test$n 2>&1 && ret=1
  test "$(grep -c "trying origin bar" dig.out.test$n)" -eq 2 || ret=1
293
  grep "using root origin" < dig.out.test$n > /dev/null && ret=1
294
295
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
296

297
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
298
  echo_i "checking dig -6 -4 ($n)"
299
  ret=0
300
  dig_with_opts +tcp @10.53.0.2 -4 -6 A a.example > dig.out.test$n 2>&1 && ret=1
301
  grep "only one of -4 and -6 allowed" < dig.out.test$n > /dev/null || ret=1
302
303
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
Evan Hunt's avatar
Evan Hunt committed
304

305
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
306
  echo_i "checking dig @IPv6addr -4 A a.example ($n)"
307
  if $TESTSOCK6 fd92:7065:b8e:ffff::2 2>/dev/null
308
309
  then
    ret=0
310
    dig_with_opts +tcp @fd92:7065:b8e:ffff::2 -4 A a.example > dig.out.test$n 2>&1 && ret=1
311
    grep "address family not supported" < dig.out.test$n > /dev/null || ret=1
312
313
    if [ $ret -ne 0 ]; then echo_i "failed"; fi
    status=$((status+ret))
314
  else
Evan Hunt's avatar
Evan Hunt committed
315
    echo_i "IPv6 unavailable; skipping"
316
  fi
Evan Hunt's avatar
Evan Hunt committed
317

318
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
319
  echo_i "checking dig @IPv4addr -6 +mapped A a.example ($n)"
320
  if "$TESTSOCK6" fd92:7065:b8e:ffff::2 2>/dev/null && [ "$(uname -s)" != "OpenBSD" ]
321
322
323
  then
    ret=0
    ret=0
324
325
326
327
    dig_with_opts +tcp @10.53.0.2 -6 +mapped A a.example > dig.out.test$n 2>&1 || ret=1
    grep "SERVER: ::ffff:10.53.0.2#$PORT" < dig.out.test$n > /dev/null || ret=1
    if [ $ret -ne 0 ]; then echo_i "failed"; fi
    status=$((status+ret))
328
  else
Evan Hunt's avatar
Evan Hunt committed
329
    echo_i "IPv6 or IPv4-to-IPv6 mapping unavailable; skipping"
330
  fi
331

332
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
333
  echo_i "checking dig +tcp @IPv4addr -6 +nomapped A a.example ($n)"
334
  if $TESTSOCK6 fd92:7065:b8e:ffff::2 2>/dev/null
335
336
337
  then
    ret=0
    ret=0
338
339
340
341
    dig_with_opts +tcp @10.53.0.2 -6 +nomapped A a.example > dig.out.test$n 2>&1 || ret=1
    grep "SERVER: ::ffff:10.53.0.2#$PORT" < dig.out.test$n > /dev/null && ret=1
    if [ $ret -ne 0 ]; then echo_i "failed"; fi
    status=$((status+ret))
342
  else
Evan Hunt's avatar
Evan Hunt committed
343
    echo_i "IPv6 unavailable; skipping"
344
  fi
345
  n=$((n+1))
346

Evan Hunt's avatar
Evan Hunt committed
347
  echo_i "checking dig +notcp @IPv4addr -6 +nomapped A a.example ($n)"
348
  if $TESTSOCK6 fd92:7065:b8e:ffff::2 2>/dev/null
349
350
351
  then
    ret=0
    ret=0
352
353
354
355
    dig_with_opts +notcp @10.53.0.2 -6 +nomapped A a.example > dig.out.test$n 2>&1 || ret=1
    grep "SERVER: ::ffff:10.53.0.2#$PORT" < dig.out.test$n > /dev/null && ret=1
    if [ $ret -ne 0 ]; then echo_i "failed"; fi
    status=$((status+ret))
356
  else
Evan Hunt's avatar
Evan Hunt committed
357
    echo_i "IPv6 unavailable; skipping"
358
  fi
Evan Hunt's avatar
Evan Hunt committed
359

360
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
361
  echo_i "checking dig +subnet ($n)"
362
  ret=0
363
  dig_with_opts +tcp @10.53.0.2 +subnet=127.0.0.1 A a.example > dig.out.test$n 2>&1 || ret=1
364
  grep "CLIENT-SUBNET: 127.0.0.1/32/0" < dig.out.test$n > /dev/null || ret=1
Matthijs Mekking's avatar
Matthijs Mekking committed
365
  check_ttl_range dig.out.test$n "A" 300 || ret=1
366
367
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
368

369
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
370
  echo_i "checking dig +subnet +subnet ($n)"
371
  ret=0
372
  dig_with_opts +tcp @10.53.0.2 +subnet=127.0.0.0 +subnet=127.0.0.1 A a.example > dig.out.test$n 2>&1 || ret=1
373
  grep "CLIENT-SUBNET: 127.0.0.1/32/0" < dig.out.test$n > /dev/null || ret=1
Matthijs Mekking's avatar
Matthijs Mekking committed
374
  check_ttl_range dig.out.test$n "A" 300 || ret=1
375
376
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
377

378
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
379
  echo_i "checking dig +subnet with various prefix lengths ($n)"
380
381
  ret=0
  for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24; do
382
      dig_with_opts +tcp @10.53.0.2 +subnet=255.255.255.255/$i A a.example > dig.out.$i.test$n 2>&1 || ret=1
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
      case $i in
      1|9|17) octet=128 ;;
      2|10|18) octet=192 ;;
      3|11|19) octet=224 ;;
      4|12|20) octet=240 ;;
      5|13|21) octet=248 ;;
      6|14|22) octet=252 ;;
      7|15|23) octet=254 ;;
      8|16|24) octet=255 ;;
      esac
      case $i in
      1|2|3|4|5|6|7|8) addr="${octet}.0.0.0";;
      9|10|11|12|13|14|15|16) addr="255.${octet}.0.0";;
      17|18|19|20|21|22|23|24) addr="255.255.${octet}.0" ;;
      esac
398
399
      grep "FORMERR" < dig.out.$i.test$n > /dev/null && ret=1
      grep "CLIENT-SUBNET: $addr/$i/0" < dig.out.$i.test$n > /dev/null || ret=1
Matthijs Mekking's avatar
Matthijs Mekking committed
400
      check_ttl_range dig.out.$i.test$n "A" 300 || ret=1
401
  done
402
403
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
404

405
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
406
  echo_i "checking dig +subnet=0/0 ($n)"
407
  ret=0
408
  dig_with_opts +tcp @10.53.0.2 +subnet=0/0 A a.example > dig.out.test$n 2>&1 || ret=1
409
410
411
  grep "status: NOERROR" < dig.out.test$n > /dev/null || ret=1
  grep "CLIENT-SUBNET: 0.0.0.0/0/0" < dig.out.test$n > /dev/null || ret=1
  grep "10.0.0.1" < dig.out.test$n > /dev/null || ret=1
Matthijs Mekking's avatar
Matthijs Mekking committed
412
  check_ttl_range dig.out.test$n "A" 300 || ret=1
413
414
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
415

416
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
417
  echo_i "checking dig +subnet=0 ($n)"
418
  ret=0
419
  dig_with_opts +tcp @10.53.0.2 +subnet=0 A a.example > dig.out.test$n 2>&1 || ret=1
420
421
422
  grep "status: NOERROR" < dig.out.test$n > /dev/null || ret=1
  grep "CLIENT-SUBNET: 0.0.0.0/0/0" < dig.out.test$n > /dev/null || ret=1
  grep "10.0.0.1" < dig.out.test$n > /dev/null || ret=1
Matthijs Mekking's avatar
Matthijs Mekking committed
423
  check_ttl_range dig.out.test$n "A" 300 || ret=1
424
425
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
426

427
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
428
  echo_i "checking dig +subnet=::/0 ($n)"
429
  ret=0
430
  dig_with_opts +tcp @10.53.0.2 +subnet=::/0 A a.example > dig.out.test$n 2>&1 || ret=1
431
432
433
  grep "status: NOERROR" < dig.out.test$n > /dev/null || ret=1
  grep "CLIENT-SUBNET: ::/0/0" < dig.out.test$n > /dev/null || ret=1
  grep "10.0.0.1" < dig.out.test$n > /dev/null || ret=1
Matthijs Mekking's avatar
Matthijs Mekking committed
434
  check_ttl_range dig.out.test$n "A" 300 || ret=1
435
436
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
437

438
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
439
  echo_i "checking dig +ednsopt=8:00000000 (family=0, source=0, scope=0) ($n)"
440
  ret=0
441
  dig_with_opts +tcp @10.53.0.2 +ednsopt=8:00000000 A a.example > dig.out.test$n 2>&1 || ret=1
442
  grep "status: NOERROR" < dig.out.test$n > /dev/null || ret=1
443
  grep "CLIENT-SUBNET: 0/0/0" < dig.out.test$n > /dev/null || ret=1
444
  grep "10.0.0.1" < dig.out.test$n > /dev/null || ret=1
Matthijs Mekking's avatar
Matthijs Mekking committed
445
  check_ttl_range dig.out.test$n "A" 300 || ret=1
446
447
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
448

449
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
450
  echo_i "checking dig +ednsopt=8:00030000 (family=3, source=0, scope=0) ($n)"
451
  ret=0
452
  dig_with_opts +qr +tcp @10.53.0.2 +ednsopt=8:00030000 A a.example > dig.out.test$n 2>&1 || ret=1
453
454
  grep "status: FORMERR" < dig.out.test$n > /dev/null || ret=1
  grep "CLIENT-SUBNET: 00 03 00 00" < dig.out.test$n > /dev/null || ret=1
455
456
457
  test "$(grep -c "CLIENT-SUBNET: 00 03 00 00" dig.out.test$n)" -eq 1 || ret=1
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
458

459
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
460
  echo_i "checking dig +subnet with prefix lengths between byte boundaries ($n)"
461
462
  ret=0
  for p in 9 10 11 12 13 14 15; do
463
    dig_with_opts +tcp @10.53.0.2 +subnet=10.53/$p A a.example > dig.out.test.$p.$n 2>&1 || ret=1
464
465
    grep "FORMERR" < dig.out.test.$p.$n > /dev/null && ret=1
    grep "CLIENT-SUBNET.*/$p/0" < dig.out.test.$p.$n > /dev/null || ret=1
Matthijs Mekking's avatar
Matthijs Mekking committed
466
    check_ttl_range dig.out.test.$p.$n "A" 300 || ret=1
467
  done
468
469
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
Evan Hunt's avatar
Evan Hunt committed
470

471
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
472
  echo_i "checking dig +sp works as an abbreviated form of split ($n)"
473
  ret=0
474
  dig_with_opts @10.53.0.3 +sp=4 -t sshfp foo.example > dig.out.test$n || ret=1
475
  grep " 9ABC DEF6 7890 " < dig.out.test$n > /dev/null || ret=1
Matthijs Mekking's avatar
Matthijs Mekking committed
476
  check_ttl_range dig.out.test$n "SSHFP" 300 || ret=1
477
478
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
479

480
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
481
  echo_i "checking dig -c works ($n)"
482
  ret=0
483
  dig_with_opts @10.53.0.3 -c CHAOS -t txt version.bind > dig.out.test$n || ret=1
484
  grep "version.bind.		0	CH	TXT" < dig.out.test$n > /dev/null || ret=1
485
486
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
487

488
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
489
  echo_i "checking dig +dscp ($n)"
490
  ret=0
491
492
493
  dig_with_opts @10.53.0.3 +dscp=32 a a.example > /dev/null 2>&1 || ret=1
  dig_with_opts @10.53.0.3 +dscp=-1 a a.example > /dev/null 2>&1 && ret=1
  dig_with_opts @10.53.0.3 +dscp=64 a a.example > /dev/null 2>&1 && ret=1
494
495
  #TODO add a check to make sure dig is actually setting the dscp on the query
  #we might have to add better logging to named for this
496
497
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
498

499
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
500
  echo_i "checking dig +ednsopt with option number ($n)"
501
  ret=0
502
  dig_with_opts @10.53.0.3 +ednsopt=3 a.example > dig.out.test$n 2>&1 || ret=1
503
  grep 'NSID: .* ("ns3")' dig.out.test$n > /dev/null || ret=1
Matthijs Mekking's avatar
Matthijs Mekking committed
504
  check_ttl_range dig.out.test$n "A" 300 || ret=1
505
506
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
507

508
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
509
  echo_i "checking dig +ednsopt with option name ($n)"
510
  ret=0
511
  dig_with_opts @10.53.0.3 +ednsopt=nsid a.example > dig.out.test$n 2>&1 || ret=1
512
  grep 'NSID: .* ("ns3")' dig.out.test$n > /dev/null || ret=1
Matthijs Mekking's avatar
Matthijs Mekking committed
513
  check_ttl_range dig.out.test$n "A" 300 || ret=1
514
515
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
516

517
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
518
  echo_i "checking that dig warns about .local queries ($n)"
519
  ret=0
520
  dig_with_opts @10.53.0.3 local soa > dig.out.test$n 2>&1 || ret=1
521
  grep ";; WARNING: .local is reserved for Multicast DNS" dig.out.test$n > /dev/null || ret=1
522
523
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
524

525
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
526
  echo_i "check that dig processes +ednsopt=key-tag and FORMERR is returned ($n)"
527
  dig_with_opts @10.53.0.3 +ednsopt=key-tag a.example +qr > dig.out.test$n 2>&1 || ret=1
528
  grep "; KEY-TAG$" dig.out.test$n > /dev/null || ret=1
529
  grep "status: FORMERR" dig.out.test$n > /dev/null || ret=1
530
531
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
532

533
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
534
  echo_i "check that dig processes +ednsopt=key-tag:<value-list> ($n)"
535
  dig_with_opts @10.53.0.3 +ednsopt=key-tag:00010002 a.example +qr > dig.out.test$n 2>&1 || ret=1
536
  grep "; KEY-TAG: 1, 2$" dig.out.test$n > /dev/null || ret=1
537
  grep "status: FORMERR" dig.out.test$n > /dev/null && ret=1
Matthijs Mekking's avatar
Matthijs Mekking committed
538
  check_ttl_range dig.out.test$n "A" 300 || ret=1
539
540
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
541

542
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
543
  echo_i "check that dig processes +ednsopt=key-tag:<malformed-value-list> and FORMERR is returned ($n)"
544
  ret=0
545
  dig_with_opts @10.53.0.3 +ednsopt=key-tag:0001000201 a.example +qr > dig.out.test$n 2>&1 || ret=1
546
  grep "; KEY-TAG: 00 01 00 02 01" dig.out.test$n > /dev/null || ret=1
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
  grep "status: FORMERR" dig.out.test$n > /dev/null || ret=1
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))

  n=$((n+1))
  echo_i "check that dig processes +ednsopt=client-tag:value ($n)"
  dig_with_opts @10.53.0.3 +ednsopt=client-tag:0001 a.example +qr > dig.out.test$n 2>&1 || ret=1
  grep "; CLIENT-TAG: 1$" dig.out.test$n > /dev/null || ret=1
  grep "status: FORMERR" dig.out.test$n > /dev/null && ret=1
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))

  n=$((n+1))
  echo_i "check that FORMERR is returned for a too short client-tag ($n)"
  dig_with_opts @10.53.0.3 +ednsopt=client-tag:01 a.example +qr > dig.out.test$n 2>&1 || ret=1
  grep "; CLIENT-TAG" dig.out.test$n > /dev/null || ret=1
  grep "status: FORMERR" dig.out.test$n > /dev/null || ret=1
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))

  n=$((n+1))
  echo_i "check that FORMERR is returned for a too long client-tag ($n)"
  dig_with_opts @10.53.0.3 +ednsopt=client-tag:000001 a.example +qr > dig.out.test$n 2>&1 || ret=1
  grep "; CLIENT-TAG" dig.out.test$n > /dev/null || ret=1
  grep "status: FORMERR" dig.out.test$n > /dev/null || ret=1
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))

  n=$((n+1))
  echo_i "check that dig processes +ednsopt=server-tag:value ($n)"
  dig_with_opts @10.53.0.3 +ednsopt=server-tag:0001 a.example +qr > dig.out.test$n 2>&1 || ret=1
  grep "; SERVER-TAG: 1$" dig.out.test$n > /dev/null || ret=1
  grep "status: FORMERR" dig.out.test$n > /dev/null && ret=1
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))

  n=$((n+1))
  echo_i "check that FORMERR is returned for a too short server-tag ($n)"
  dig_with_opts @10.53.0.3 +ednsopt=server-tag:01 a.example +qr > dig.out.test$n 2>&1 || ret=1
  grep "; SERVER-TAG" dig.out.test$n > /dev/null || ret=1
  grep "status: FORMERR" dig.out.test$n > /dev/null || ret=1
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))

  n=$((n+1))
  echo_i "check that FORMERR is returned for a too long server-tag ($n)"
  dig_with_opts @10.53.0.3 +ednsopt=server-tag:000001 a.example +qr > dig.out.test$n 2>&1 || ret=1
  grep "; SERVER-TAG" dig.out.test$n > /dev/null || ret=1
595
  grep "status: FORMERR" dig.out.test$n > /dev/null || ret=1
596
597
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
598

599
  n=$((n+1))
600
601
  echo_i "check that dig handles malformed option '+ednsopt=:' gracefully ($n)"
  ret=0
602
  dig_with_opts @10.53.0.3 +ednsopt=: a.example > dig.out.test$n 2>&1 && ret=1
603
  grep "ednsopt no code point specified" dig.out.test$n > /dev/null || ret=1
604
605
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
606

607
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
608
  echo_i "check that dig gracefully handles bad escape in domain name ($n)"
609
  ret=0
610
611
  digstatus=0
  dig_with_opts @10.53.0.3 '\0.' > dig.out.test$n 2>&1 || digstatus=$?
612
613
614
615
  echo digstatus=$digstatus >> dig.out.test$n
  test $digstatus -eq 10 || ret=1
  grep REQUIRE dig.out.test$n > /dev/null && ret=1
  grep "is not a legal name (bad escape)" dig.out.test$n > /dev/null || ret=1
616
617
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
618

619
  n=$((n+1))
Mark Andrews's avatar
Mark Andrews committed
620
621
  echo_i "check that dig -q -m works ($n)"
  ret=0
622
  dig_with_opts @10.53.0.3 -q -m > dig.out.test$n 2>&1
623
  grep '^;-m\..*IN.*A$' dig.out.test$n > /dev/null || ret=1
Mark Andrews's avatar
Mark Andrews committed
624
  grep "Dump of all outstanding memory allocations" dig.out.test$n > /dev/null && ret=1
625
626
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686

  n=$((n+1))
  echo_i "checking exit code for a retry upon TCP EOF (immediate -> immediate) ($n)"
  ret=0
  echo "no_response no_response" | sendcmd 10.53.0.5
  dig_with_opts @10.53.0.5 example AXFR +tries=1 > dig.out.test$n 2>&1 && ret=1
  # Sanity check: ensure ans5 behaves as expected.
  [ `grep "communications error.*end of file" dig.out.test$n | wc -l` -eq 2 ] || ret=1
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))

  n=$((n+1))
  echo_i "checking exit code for a retry upon TCP EOF (partial AXFR -> partial AXFR) ($n)"
  ret=0
  echo "partial_axfr partial_axfr" | sendcmd 10.53.0.5
  dig_with_opts @10.53.0.5 example AXFR +tries=1 > dig.out.test$n 2>&1 && ret=1
  # Sanity check: ensure ans5 behaves as expected.
  [ `grep "communications error.*end of file" dig.out.test$n | wc -l` -eq 2 ] || ret=1
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))

  n=$((n+1))
  echo_i "checking exit code for a retry upon TCP EOF (immediate -> partial AXFR) ($n)"
  ret=0
  echo "no_response partial_axfr" | sendcmd 10.53.0.5
  dig_with_opts @10.53.0.5 example AXFR +tries=1 > dig.out.test$n 2>&1 && ret=1
  # Sanity check: ensure ans5 behaves as expected.
  [ `grep "communications error.*end of file" dig.out.test$n | wc -l` -eq 2 ] || ret=1
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))

  n=$((n+1))
  echo_i "checking exit code for a retry upon TCP EOF (partial AXFR -> immediate) ($n)"
  ret=0
  echo "partial_axfr no_response" | sendcmd 10.53.0.5
  dig_with_opts @10.53.0.5 example AXFR +tries=1 > dig.out.test$n 2>&1 && ret=1
  # Sanity check: ensure ans5 behaves as expected.
  [ `grep "communications error.*end of file" dig.out.test$n | wc -l` -eq 2 ] || ret=1
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))

  n=$((n+1))
  echo_i "checking exit code for a retry upon TCP EOF (immediate -> complete AXFR) ($n)"
  ret=0
  echo "no_response complete_axfr" | sendcmd 10.53.0.5
  dig_with_opts @10.53.0.5 example AXFR +tries=1 > dig.out.test$n 2>&1 || ret=1
  # Sanity check: ensure ans5 behaves as expected.
  [ `grep "communications error.*end of file" dig.out.test$n | wc -l` -eq 1 ] || ret=1
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))

  n=$((n+1))
  echo_i "checking exit code for a retry upon TCP EOF (partial AXFR -> complete AXFR) ($n)"
  ret=0
  echo "partial_axfr complete_axfr" | sendcmd 10.53.0.5
  dig_with_opts @10.53.0.5 example AXFR +tries=1 > dig.out.test$n 2>&1 || ret=1
  # Sanity check: ensure ans5 behaves as expected.
  [ `grep "communications error.*end of file" dig.out.test$n | wc -l` -eq 1 ] || ret=1
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710

  n=$((n+1))
  echo_i "check that dig +expandaaaa works ($n)"
  ret=0
  dig_with_opts @10.53.0.3 +expandaaaa AAAA ns2.example > dig.out.test$n 2>&1 || ret=1
  grep "ns2.example.*fd92:7065:0b8e:ffff:0000:0000:0000:0002" dig.out.test$n > /dev/null || ret=1
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))

  n=$((n+1))
  echo_i "check that dig +noexpandaaaa works ($n)"
  ret=0
  dig_with_opts @10.53.0.3 +noexpandaaaa AAAA ns2.example > dig.out.test$n 2>&1 || ret=1
  grep "ns2.example.*fd92:7065:b8e:ffff::2" dig.out.test$n > /dev/null || ret=1
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))

  n=$((n+1))
  echo_i "check that dig default for +[no]expandaaa (+noexpandaaaa) works ($n)"
  ret=0
  dig_with_opts @10.53.0.3 AAAA ns2.example > dig.out.test$n 2>&1 || ret=1
  grep "ns2.example.*fd92:7065:b8e:ffff::2" dig.out.test$n > /dev/null || ret=1
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
711
else
Evan Hunt's avatar
Evan Hunt committed
712
  echo_i "$DIG is needed, so skipping these dig tests"
713
714
fi

715
716
if [ -x "$MDIG" ] ; then
  n=$((n+1))
Mark Andrews's avatar
Mark Andrews committed
717
718
  echo_i "check that mdig handles malformed option '+ednsopt=:' gracefully ($n)"
  ret=0
719
  mdig_with_opts @10.53.0.3 +ednsopt=: a.example > dig.out.test$n 2>&1 && ret=1
Mark Andrews's avatar
Mark Andrews committed
720
  grep "ednsopt no code point specified" dig.out.test$n > /dev/null || ret=1
721
722
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
Mark Andrews's avatar
Mark Andrews committed
723
724
725
726
else
  echo_i "$MDIG is needed, so skipping these mdig tests"
fi

727
728
if [ -x "$DELV" ] ; then
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
729
  echo_i "checking delv short form works ($n)"
Evan Hunt's avatar
Evan Hunt committed
730
  ret=0
731
732
733
734
  delv_with_opts @10.53.0.3 +short a a.example > delv.out.test$n || ret=1
  test "$(wc -l < delv.out.test$n)" -eq 1 || ret=1
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
Evan Hunt's avatar
Evan Hunt committed
735

736
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
737
  echo_i "checking delv split width works ($n)"
Evan Hunt's avatar
Evan Hunt committed
738
  ret=0
739
  delv_with_opts @10.53.0.3 +split=4 -t sshfp foo.example > delv.out.test$n || ret=1
Evan Hunt's avatar
Evan Hunt committed
740
  grep " 9ABC DEF6 7890 " < delv.out.test$n > /dev/null || ret=1
Mark Andrews's avatar
Mark Andrews committed
741
  check_ttl_range delv.out.test$n "SSHFP" 300 || ret=1
742
743
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
Evan Hunt's avatar
Evan Hunt committed
744

745
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
746
  echo_i "checking delv +unknownformat works ($n)"
747
  ret=0
748
  delv_with_opts @10.53.0.3 +unknownformat a a.example > delv.out.test$n || ret=1
749
  grep "CLASS1[ 	][ 	]*TYPE1[ 	][ 	]*\\\\# 4 0A000001" < delv.out.test$n > /dev/null || ret=1
Mark Andrews's avatar
Mark Andrews committed
750
  check_ttl_range delv.out.test$n "TYPE1" 300 || ret=1
751
752
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
753

754
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
755
  echo_i "checking delv -4 -6 ($n)"
756
  ret=0
757
  delv_with_opts @10.53.0.3 -4 -6 A a.example > delv.out.test$n 2>&1 && ret=1
758
  grep "only one of -4 and -6 allowed" < delv.out.test$n > /dev/null || ret=1
759
760
  if [ $ret -ne 0 ]; then echo_i "failed"; fi
  status=$((status+ret))
761

762
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
763
  echo_i "checking delv with IPv6 on IPv4 does not work ($n)"
764
  if $TESTSOCK6 fd92:7065:b8e:ffff::3 2>/dev/null
Evan Hunt's avatar
Evan Hunt committed
765
766
767
  then
    ret=0
    # following should fail because @IPv4 overrides earlier @IPv6 above
768
769
    # and -6 forces IPv6 so this should fail, with a message
    # "Use of IPv4 disabled by -6"
770
    delv_with_opts @fd92:7065:b8e:ffff::3 @10.53.0.3 -6 -t txt foo.example > delv.out.test$n 2>&1 && ret=1
Evan Hunt's avatar
Evan Hunt committed
771
772
    # it should have no results but error output
    grep "testing" < delv.out.test$n > /dev/null && ret=1
773
    grep "Use of IPv4 disabled by -6" delv.out.test$n > /dev/null || ret=1
774
775
    if [ $ret -ne 0 ]; then echo_i "failed"; fi
    status=$((status+ret))
Evan Hunt's avatar
Evan Hunt committed
776
  else
Evan Hunt's avatar
Evan Hunt committed
777
    echo_i "IPv6 unavailable; skipping"
Evan Hunt's avatar
Evan Hunt committed
778
779
  fi

780
  n=$((n+1))
Evan Hunt's avatar
Evan Hunt committed
781
  echo_i "checking delv with IPv4 on IPv6 does not work ($n)"
782
783
784
785
786
787
  if $TESTSOCK6 fd92:7065:b8e:ffff::3 2>/dev/null
  then