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="+short -p ${PORT}"
18RNDCCMD="$RNDC -p ${CONTROLPORT} -c ../common/rndc.conf"
19
20status=0
21
22# dnstap_data_ready <fstrm_capture_PID> <capture_file> <min_file_size>
23# Flushes capture_file and checks wheter its size is >= min_file_size.
24dnstap_data_ready() {
25	# Process id of running fstrm_capture.
26	fstrm_capture_pid=$1
27	# Output file provided to fstrm_capture via -w switch.
28	capture_file=$2
29	# Minimum expected file size.
30	min_size_expected=$3
31
32	kill -HUP $fstrm_capture_pid
33	file_size=`wc -c < "$capture_file" | tr -d ' '`
34	if [ $file_size -lt $min_size_expected ]; then
35		return 1
36	fi
37}
38
39
40for bad in bad-*.conf
41do
42	ret=0
43	echo_i "checking that named-checkconf detects error in $bad"
44	$CHECKCONF $bad > /dev/null 2>&1
45	if [ $? != 1 ]; then echo_i "failed"; ret=1; fi
46	status=`expr $status + $ret`
47done
48
49for good in good-*.conf
50do
51	ret=0
52	echo_i "checking that named-checkconf detects no error in $good"
53	$CHECKCONF $good > /dev/null 2>&1
54	if [ $? != 0 ]; then echo_i "failed"; ret=1; fi
55	status=`expr $status + $ret`
56done
57
58echo_i "wait for servers to finish loading"
59ret=0
60wait_for_log 20 "all zones loaded" ns1/named.run || ret=1
61wait_for_log 20 "all zones loaded" ns2/named.run || ret=1
62wait_for_log 20 "all zones loaded" ns3/named.run || ret=1
63wait_for_log 20 "all zones loaded" ns4/named.run || ret=1
64if [ $ret != 0 ]; then echo_i "failed"; fi
65status=`expr $status + $ret`
66
67# both the 'a.example/A' lookup and the './NS' lookup to ns1
68# need tocomplete before reopening/rolling for the counts to
69# be correct.
70
71$DIG $DIGOPTS @10.53.0.3 a.example > dig.out
72wait_for_log 20 "(./NS): query_reset" ns1/named.run || true
73
74# check three different dnstap reopen/roll methods:
75# ns1: dnstap-reopen; ns2: dnstap -reopen; ns3: dnstap -roll
76mv ns1/dnstap.out ns1/dnstap.out.save
77mv ns2/dnstap.out ns2/dnstap.out.save
78
79if [ -n "$FSTRM_CAPTURE" ] ; then
80	$FSTRM_CAPTURE -t protobuf:dnstap.Dnstap -u ns4/dnstap.out \
81		-w dnstap.out > fstrm_capture.out 2>&1 &
82	fstrm_capture_pid=$!
83fi
84
85$RNDCCMD -s 10.53.0.1 dnstap-reopen | sed 's/^/ns1 /' | cat_i
86$RNDCCMD -s 10.53.0.2 dnstap -reopen | sed 's/^/ns2 /' | cat_i
87$RNDCCMD -s 10.53.0.3 dnstap -roll | sed 's/^/ns3 /' | cat_i
88$RNDCCMD -s 10.53.0.4 dnstap -reopen | sed 's/^/ns4 /' | cat_i
89
90$DIG $DIGOPTS @10.53.0.3 a.example > dig.out
91
92# send an UPDATE to ns2
93$NSUPDATE <<- EOF
94server 10.53.0.2 ${PORT}
95zone example
96update add b.example 3600 in a 10.10.10.10
97send
98EOF
99
100# XXX: file output should be flushed once a second according
101# to the libfstrm source, but it doesn't seem to happen until
102# enough data has accumulated. to get all the output, we stop
103# the name servers, forcing a flush on shutdown. it would be
104# nice to find a better way to do this.
105$RNDCCMD -s 10.53.0.1 stop | sed 's/^/ns1 /' | cat_i
106$RNDCCMD -s 10.53.0.2 stop | sed 's/^/ns2 /' | cat_i
107$RNDCCMD -s 10.53.0.3 stop | sed 's/^/ns3 /' | cat_i
108
109sleep 1
110
111echo_i "checking initial message counts"
112
113udp1=`$DNSTAPREAD ns1/dnstap.out.save | grep "UDP " | wc -l`
114tcp1=`$DNSTAPREAD ns1/dnstap.out.save | grep "TCP " | wc -l`
115aq1=`$DNSTAPREAD ns1/dnstap.out.save | grep "AQ " | wc -l`
116ar1=`$DNSTAPREAD ns1/dnstap.out.save | grep "AR " | wc -l`
117cq1=`$DNSTAPREAD ns1/dnstap.out.save | grep "CQ " | wc -l`
118cr1=`$DNSTAPREAD ns1/dnstap.out.save | grep "CR " | wc -l`
119rq1=`$DNSTAPREAD ns1/dnstap.out.save | grep "RQ " | wc -l`
120rr1=`$DNSTAPREAD ns1/dnstap.out.save | grep "RR " | wc -l`
121uq1=`$DNSTAPREAD ns1/dnstap.out.save | grep "UQ " | wc -l`
122ur1=`$DNSTAPREAD ns1/dnstap.out.save | grep "UR " | wc -l`
123
124udp2=`$DNSTAPREAD ns2/dnstap.out.save | grep "UDP " | wc -l`
125tcp2=`$DNSTAPREAD ns2/dnstap.out.save | grep "TCP " | wc -l`
126aq2=`$DNSTAPREAD ns2/dnstap.out.save | grep "AQ " | wc -l`
127ar2=`$DNSTAPREAD ns2/dnstap.out.save | grep "AR " | wc -l`
128cq2=`$DNSTAPREAD ns2/dnstap.out.save | grep "CQ " | wc -l`
129cr2=`$DNSTAPREAD ns2/dnstap.out.save | grep "CR " | wc -l`
130rq2=`$DNSTAPREAD ns2/dnstap.out.save | grep "RQ " | wc -l`
131rr2=`$DNSTAPREAD ns2/dnstap.out.save | grep "RR " | wc -l`
132uq2=`$DNSTAPREAD ns2/dnstap.out.save | grep "UQ " | wc -l`
133ur2=`$DNSTAPREAD ns2/dnstap.out.save | grep "UR " | wc -l`
134
135mv ns3/dnstap.out.0 ns3/dnstap.out.save
136udp3=`$DNSTAPREAD ns3/dnstap.out.save | grep "UDP " | wc -l`
137tcp3=`$DNSTAPREAD ns3/dnstap.out.save | grep "TCP " | wc -l`
138aq3=`$DNSTAPREAD ns3/dnstap.out.save | grep "AQ " | wc -l`
139ar3=`$DNSTAPREAD ns3/dnstap.out.save | grep "AR " | wc -l`
140cq3=`$DNSTAPREAD ns3/dnstap.out.save | grep "CQ " | wc -l`
141cr3=`$DNSTAPREAD ns3/dnstap.out.save | grep "CR " | wc -l`
142rq3=`$DNSTAPREAD ns3/dnstap.out.save | grep "RQ " | wc -l`
143rr3=`$DNSTAPREAD ns3/dnstap.out.save | grep "RR " | wc -l`
144uq3=`$DNSTAPREAD ns3/dnstap.out.save | grep "UQ " | wc -l`
145ur3=`$DNSTAPREAD ns3/dnstap.out.save | grep "UR " | wc -l`
146
147echo_i "checking UDP message counts"
148ret=0
149[ $udp1 -eq 0 ] || {
150	echo_i "ns1 $udp1 expected 0"
151	ret=1
152}
153[ $udp2 -eq 2 ] || {
154	echo_i "ns2 $udp2 expected 2"
155	ret=1
156}
157[ $udp3 -eq 4 ] || {
158	echo_i "ns3 $udp3 expected 4"
159	ret=1
160}
161if [ $ret != 0 ]; then echo_i "failed"; fi
162status=`expr $status + $ret`
163
164echo_i "checking TCP message counts"
165ret=0
166[ $tcp1 -eq 6 ] || {
167	echo_i "ns1 $tcp1 expected 6"
168	ret=1
169}
170[ $tcp2 -eq 2 ] || {
171	echo_i "ns2 $tcp2 expected 2"
172	ret=1
173}
174[ $tcp3 -eq 6 ] || {
175	echo_i "ns3 $tcp3 expected 6"
176	ret=1
177}
178if [ $ret != 0 ]; then echo_i "failed"; fi
179status=`expr $status + $ret`
180
181echo_i "checking AUTH_QUERY message counts"
182ret=0
183[ $aq1 -eq 3 ] || {
184	echo_i "ns1 $aq1 exepcted 3"
185	ret=1
186}
187[ $aq2 -eq 2 ] || {
188	echo_i "ns2 $aq2 expected 2"
189	ret=1
190}
191[ $aq3 -eq 1 ] || {
192	echo_i "ns3 $aq3 expected 1"
193	ret=1
194}
195if [ $ret != 0 ]; then echo_i "failed"; fi
196status=`expr $status + $ret`
197
198echo_i "checking AUTH_RESPONSE message counts"
199ret=0
200[ $ar1 -eq 2 ] || {
201	echo_i "ns1 $ar1 expected 2"
202	ret=1
203}
204[ $ar2 -eq 1 ] || {
205	echo_i "ns2 $ar2 expected 1"
206	ret=1
207}
208[ $ar3 -eq 0 ] || {
209	echo_i "ns3 $ar3 expected 0"
210	ret=1
211}
212if [ $ret != 0 ]; then echo_i "failed"; fi
213status=`expr $status + $ret`
214
215echo_i "checking CLIENT_QUERY message counts"
216ret=0
217[ $cq1 -eq 0 ] || {
218	echo_i "ns1 $cq1 expected 0"
219	ret=1
220}
221[ $cq2 -eq 0 ] || {
222	echo_i "ns2 $cq2 expected 0"
223	ret=1
224}
225[ $cq3 -eq 1 ] || {
226	echo_i "ns3 $cq3 expected 1"
227	ret=1
228}
229if [ $ret != 0 ]; then echo_i "failed"; fi
230status=`expr $status + $ret`
231
232echo_i "checking CLIENT_RESPONSE message counts"
233ret=0
234[ $cr1 -eq 1 ] || {
235	echo_i "ns1 $cr1 expected 1"
236	ret=1
237}
238[ $cr2 -eq 1 ] || {
239	echo_i "ns2 $cr2 expected 1"
240	ret=1
241}
242[ $cr3 -eq 2 ] || {
243	echo_i "ns3 $cr3 expected 2"
244	ret=1
245}
246if [ $ret != 0 ]; then echo_i "failed"; fi
247status=`expr $status + $ret`
248
249echo_i "checking RESOLVER_QUERY message counts"
250ret=0
251[ $rq1 -eq 0 ] || {
252	echo_i "ns1 $rq1 expected 0"
253	ret=1
254}
255[ $rq2 -eq 0 ] || {
256	echo_i "ns2 $rq2 expected 0"
257	ret=1
258}
259[ $rq3 -eq 3 ] || {
260	echo_i "ns3 $rq3 expected 3"
261	ret=1
262}
263if [ $ret != 0 ]; then echo_i "failed"; fi
264status=`expr $status + $ret`
265
266echo_i "checking RESOLVER_RESPONSE message counts"
267ret=0
268[ $rr1 -eq 0 ] || {
269	echo_i "ns1 $rr1 expected 0"
270	ret=1
271}
272[ $rr2 -eq 0 ] || {
273	echo_i "ns2 $rr2 expected 0"
274	ret=1
275}
276[ $rr3 -eq 3 ] || {
277	echo_i "ns3 $rr3 expected 3"
278	ret=1
279}
280if [ $ret != 0 ]; then echo_i "failed"; fi
281status=`expr $status + $ret`
282
283echo_i "checking UPDATE_QUERY message counts"
284ret=0
285[ $uq1 -eq 0 ] || {
286	echo_i "ns1 $uq1 expected 0"
287	ret=1
288}
289[ $uq2 -eq 0 ] || {
290	echo_i "ns2 $uq2 expected 0"
291	ret=1
292}
293[ $uq3 -eq 0 ] || {
294	echo_i "ns3 $uq3 expected 0"
295	ret=1
296}
297if [ $ret != 0 ]; then echo_i "failed"; fi
298status=`expr $status + $ret`
299
300echo_i "checking UPDATE_RESPONSE message counts"
301ret=0
302[ $ur1 -eq 0 ] || {
303	echo_i "ns1 $ur1 expected 0"
304	ret=1
305}
306[ $ur2 -eq 0 ] || {
307	echo_i "ns2 $ur2 expected 0"
308	ret=1
309}
310[ $ur3 -eq 0 ] || {
311	echo_i "ns3 $ur3 expected 0"
312	ret=1
313}
314if [ $ret != 0 ]; then echo_i "failed"; fi
315status=`expr $status + $ret`
316
317echo_i "checking reopened message counts"
318
319udp1=`$DNSTAPREAD ns1/dnstap.out | grep "UDP " | wc -l`
320tcp1=`$DNSTAPREAD ns1/dnstap.out | grep "TCP " | wc -l`
321aq1=`$DNSTAPREAD ns1/dnstap.out | grep "AQ " | wc -l`
322ar1=`$DNSTAPREAD ns1/dnstap.out | grep "AR " | wc -l`
323cq1=`$DNSTAPREAD ns1/dnstap.out | grep "CQ " | wc -l`
324cr1=`$DNSTAPREAD ns1/dnstap.out | grep "CR " | wc -l`
325rq1=`$DNSTAPREAD ns1/dnstap.out | grep "RQ " | wc -l`
326rr1=`$DNSTAPREAD ns1/dnstap.out | grep "RR " | wc -l`
327uq1=`$DNSTAPREAD ns1/dnstap.out | grep "UQ " | wc -l`
328ur1=`$DNSTAPREAD ns1/dnstap.out | grep "UR " | wc -l`
329
330udp2=`$DNSTAPREAD ns2/dnstap.out | grep "UDP " | wc -l`
331tcp2=`$DNSTAPREAD ns2/dnstap.out | grep "TCP " | wc -l`
332aq2=`$DNSTAPREAD ns2/dnstap.out | grep "AQ " | wc -l`
333ar2=`$DNSTAPREAD ns2/dnstap.out | grep "AR " | wc -l`
334cq2=`$DNSTAPREAD ns2/dnstap.out | grep "CQ " | wc -l`
335cr2=`$DNSTAPREAD ns2/dnstap.out | grep "CR " | wc -l`
336rq2=`$DNSTAPREAD ns2/dnstap.out | grep "RQ " | wc -l`
337rr2=`$DNSTAPREAD ns2/dnstap.out | grep "RR " | wc -l`
338uq2=`$DNSTAPREAD ns2/dnstap.out | grep "UQ " | wc -l`
339ur2=`$DNSTAPREAD ns2/dnstap.out | grep "UR " | wc -l`
340
341udp3=`$DNSTAPREAD ns3/dnstap.out | grep "UDP " | wc -l`
342tcp3=`$DNSTAPREAD ns3/dnstap.out | grep "TCP " | wc -l`
343aq3=`$DNSTAPREAD ns3/dnstap.out | grep "AQ " | wc -l`
344ar3=`$DNSTAPREAD ns3/dnstap.out | grep "AR " | wc -l`
345cq3=`$DNSTAPREAD ns3/dnstap.out | grep "CQ " | wc -l`
346cr3=`$DNSTAPREAD ns3/dnstap.out | grep "CR " | wc -l`
347rq3=`$DNSTAPREAD ns3/dnstap.out | grep "RQ " | wc -l`
348rr3=`$DNSTAPREAD ns3/dnstap.out | grep "RR " | wc -l`
349uq3=`$DNSTAPREAD ns3/dnstap.out | grep "UQ " | wc -l`
350ur3=`$DNSTAPREAD ns3/dnstap.out | grep "UR " | wc -l`
351
352echo_i "checking UDP message counts"
353ret=0
354[ $udp1 -eq 0 ] || {
355	echo_i "ns1 $udp1 expected 0"
356	ret=1
357}
358[ $udp2 -eq 2 ] || {
359	echo_i "ns2 $udp2 expected 2"
360	ret=1
361}
362[ $udp3 -eq 2 ] || {
363	echo_i "ns3 $udp3 expected 2"
364	ret=1
365}
366if [ $ret != 0 ]; then echo_i "failed"; fi
367status=`expr $status + $ret`
368
369echo_i "checking TCP message counts"
370ret=0
371[ $tcp1 -eq 0 ] || {
372	echo_i "ns1 $tcp1 expected 0"
373	ret=1
374}
375[ $tcp2 -eq 0 ] || {
376	echo_i "ns2 $tcp2 expected 0"
377	ret=1
378}
379[ $tcp3 -eq 0 ] || {
380	echo_i "ns3 $tcp3 expected 0"
381	ret=1
382}
383if [ $ret != 0 ]; then echo_i "failed"; fi
384status=`expr $status + $ret`
385
386echo_i "checking AUTH_QUERY message counts"
387ret=0
388[ $aq1 -eq 0 ] || {
389	echo_i "ns1 $aq1 exepcted 0"
390	ret=1
391}
392[ $aq2 -eq 0 ] || {
393	echo_i "ns2 $aq2 expected 0"
394	ret=1
395}
396[ $aq3 -eq 0 ] || {
397	echo_i "ns3 $aq3 expected 0"
398	ret=1
399}
400if [ $ret != 0 ]; then echo_i "failed"; fi
401status=`expr $status + $ret`
402
403echo_i "checking AUTH_RESPONSE message counts"
404ret=0
405[ $ar1 -eq 0 ] || {
406	echo_i "ns1 $ar1 expected 0"
407	ret=1
408}
409[ $ar2 -eq 0 ] || {
410	echo_i "ns2 $ar2 expected 0"
411	ret=1
412}
413[ $ar3 -eq 0 ] || {
414	echo_i "ns3 $ar3 expected 0"
415	ret=1
416}
417if [ $ret != 0 ]; then echo_i "failed"; fi
418status=`expr $status + $ret`
419
420echo_i "checking CLIENT_QUERY message counts"
421ret=0
422[ $cq1 -eq 0 ] || {
423	echo_i "ns1 $cq1 expected 0"
424	ret=1
425}
426[ $cq2 -eq 0 ] || {
427	echo_i "ns2 $cq2 expected 0"
428	ret=1
429}
430[ $cq3 -eq 1 ] || {
431	echo_i "ns3 $cq3 expected 1"
432	ret=1
433}
434if [ $ret != 0 ]; then echo_i "failed"; fi
435status=`expr $status + $ret`
436
437echo_i "checking CLIENT_RESPONSE message counts"
438ret=0
439[ $cr1 -eq 0 ] || {
440	echo_i "ns1 $cr1 expected 0"
441	ret=1
442}
443[ $cr2 -eq 0 ] || {
444	echo_i "ns2 $cr2 expected 0"
445	ret=1
446}
447[ $cr3 -eq 1 ] || {
448	echo_i "ns3 $cr3 expected 1"
449	ret=1
450}
451if [ $ret != 0 ]; then echo_i "failed"; fi
452status=`expr $status + $ret`
453
454echo_i "checking RESOLVER_QUERY message counts"
455ret=0
456[ $rq1 -eq 0 ] || {
457	echo_i "ns1 $rq1 expected 0"
458	ret=1
459}
460[ $rq2 -eq 0 ] || {
461	echo_i "ns2 $rq2 expected 0"
462	ret=1
463}
464[ $rq3 -eq 0 ] || {
465	echo_i "ns3 $rq3 expected 0"
466	ret=1
467}
468if [ $ret != 0 ]; then echo_i "failed"; fi
469status=`expr $status + $ret`
470
471echo_i "checking RESOLVER_RESPONSE message counts"
472ret=0
473[ $rr1 -eq 0 ] || {
474	echo_i "ns1 $rr1 expected 0"
475	ret=1
476}
477[ $rr2 -eq 0 ] || {
478	echo_i "ns2 $rr2 expected 0"
479	ret=1
480}
481[ $rr3 -eq 0 ] || {
482	echo_i "ns3 $rr3 expected 0"
483	ret=1
484}
485if [ $ret != 0 ]; then echo_i "failed"; fi
486status=`expr $status + $ret`
487
488echo_i "checking UPDATE_QUERY message counts"
489ret=0
490[ $uq1 -eq 0 ] || {
491	echo_i "ns1 $uq1 expected 0"
492	ret=1
493}
494[ $uq2 -eq 1 ] || {
495	echo_i "ns2 $uq2 expected 1"
496	ret=1
497}
498[ $uq3 -eq 0 ] || {
499	echo_i "ns3 $uq3 expected 0"
500	ret=1
501}
502if [ $ret != 0 ]; then echo_i "failed"; fi
503status=`expr $status + $ret`
504
505echo_i "checking UPDATE_RESPONSE message counts"
506ret=0
507[ $ur1 -eq 0 ] || {
508	echo_i "ns1 $ur1 expected 0"
509	ret=1
510}
511[ $ur2 -eq 1 ] || {
512	echo_i "ns2 $ur2 expected 1"
513	ret=1
514}
515[ $ur3 -eq 0 ] || {
516	echo_i "ns3 $ur3 expected 0"
517	ret=1
518}
519if [ $ret != 0 ]; then echo_i "failed"; fi
520status=`expr $status + $ret`
521
522HAS_PYYAML=0
523if [ -n "$PYTHON" ] ; then
524	$PYTHON -c "import yaml" 2> /dev/null && HAS_PYYAML=1
525fi
526
527if [ $HAS_PYYAML -ne 0 ] ; then
528	echo_i "checking dnstap-read YAML output"
529	ret=0
530        {
531	  $PYTHON ydump.py "$DNSTAPREAD" "ns3/dnstap.out.save" > ydump.out || ret=1
532        } | cat_i
533	if [ $ret != 0 ]; then echo_i "failed"; fi
534	status=`expr $status + $ret`
535fi
536
537echo_i "checking dnstap-read hex output"
538ret=0
539hex=`$DNSTAPREAD -x ns3/dnstap.out | tail -1`
540echo $hex | $WIRETEST > dnstap.hex
541grep 'status: NOERROR' dnstap.hex > /dev/null 2>&1 || ret=1
542grep 'ANSWER: 3, AUTHORITY: 1' dnstap.hex > /dev/null 2>&1 || ret=1
543if [ $ret != 0 ]; then echo_i "failed"; fi
544status=`expr $status + $ret`
545
546if [ -n "$FSTRM_CAPTURE" ] ; then
547	$DIG $DIGOPTS @10.53.0.4 a.example > dig.out
548
549	# send an UPDATE to ns4
550	$NSUPDATE <<- EOF > nsupdate.out 2>&1
551	server 10.53.0.4 ${PORT}
552	zone example
553	update add b.example 3600 in a 10.10.10.10
554	send
555EOF
556	grep "update failed: NOTAUTH" nsupdate.out > /dev/null || ret=1
557
558	echo_i "checking unix socket message counts"
559	sleep 2
560	retry_quiet 5 dnstap_data_ready $fstrm_capture_pid dnstap.out 470
561	kill $fstrm_capture_pid
562	wait
563	udp4=`$DNSTAPREAD dnstap.out | grep "UDP " | wc -l`
564	tcp4=`$DNSTAPREAD dnstap.out | grep "TCP " | wc -l`
565	aq4=`$DNSTAPREAD dnstap.out | grep "AQ " | wc -l`
566	ar4=`$DNSTAPREAD dnstap.out | grep "AR " | wc -l`
567	cq4=`$DNSTAPREAD dnstap.out | grep "CQ " | wc -l`
568	cr4=`$DNSTAPREAD dnstap.out | grep "CR " | wc -l`
569	rq4=`$DNSTAPREAD dnstap.out | grep "RQ " | wc -l`
570	rr4=`$DNSTAPREAD dnstap.out | grep "RR " | wc -l`
571	uq4=`$DNSTAPREAD dnstap.out | grep "UQ " | wc -l`
572	ur4=`$DNSTAPREAD dnstap.out | grep "UR " | wc -l`
573
574	echo_i "checking UDP message counts"
575	ret=0
576	[ $udp4 -eq 4 ] || {
577		echo_i "ns4 $udp4 expected 4"
578		ret=1
579	}
580	if [ $ret != 0 ]; then echo_i "failed"; fi
581	status=`expr $status + $ret`
582
583	echo_i "checking TCP message counts"
584	ret=0
585	[ $tcp4 -eq 0 ] || {
586		echo_i "ns4 $tcp4 expected 0"
587		ret=1
588	}
589	if [ $ret != 0 ]; then echo_i "failed"; fi
590	status=`expr $status + $ret`
591
592	echo_i "checking AUTH_QUERY message counts"
593	ret=0
594	[ $aq4 -eq 0 ] || {
595		echo_i "ns4 $aq4 expected 0"
596		ret=1
597	}
598	if [ $ret != 0 ]; then echo_i "failed"; fi
599	status=`expr $status + $ret`
600
601	echo_i "checking AUTH_RESPONSE message counts"
602	ret=0
603	[ $ar4 -eq 0 ] || {
604		echo_i "ns4 $ar4 expected 0"
605		ret=1
606	}
607	if [ $ret != 0 ]; then echo_i "failed"; fi
608	status=`expr $status + $ret`
609
610	echo_i "checking CLIENT_QUERY message counts"
611	ret=0
612	[ $cq4 -eq 1 ] || {
613		echo_i "ns4 $cq4 expected 1"
614		ret=1
615	}
616	if [ $ret != 0 ]; then echo_i "failed"; fi
617	status=`expr $status + $ret`
618
619	echo_i "checking CLIENT_RESPONSE message counts"
620	ret=0
621	[ $cr4 -eq 1 ] || {
622		echo_i "ns4 $cr4 expected 1"
623		ret=1
624	}
625	if [ $ret != 0 ]; then echo_i "failed"; fi
626	status=`expr $status + $ret`
627
628	echo_i "checking RESOLVER_QUERY message counts"
629	ret=0
630	[ $rq4 -eq 0 ] || {
631		echo_i "ns4 $rq4 expected 0"
632		ret=1
633	}
634	if [ $ret != 0 ]; then echo_i "failed"; fi
635	status=`expr $status + $ret`
636
637	echo_i "checking RESOLVER_RESPONSE message counts"
638	ret=0
639	[ $rr4 -eq 0 ] || {
640		echo_i "ns4 $rr4 expected 0"
641		ret=1
642	}
643
644	echo_i "checking UPDATE_QUERY message counts"
645	ret=0
646	[ $uq4 -eq 1 ] || {
647		echo_i "ns4 $uq4 expected 1"
648		ret=1
649	}
650	if [ $ret != 0 ]; then echo_i "failed"; fi
651	status=`expr $status + $ret`
652
653	echo_i "checking UPDATE_RESPONSE message counts"
654	ret=0
655	[ $ur4 -eq 1 ] || {
656		echo_i "ns4 $ur4 expected 1"
657		ret=1
658	}
659	if [ $ret != 0 ]; then echo_i "failed"; fi
660	status=`expr $status + $ret`
661
662	mv dnstap.out dnstap.out.save
663
664	$FSTRM_CAPTURE -t protobuf:dnstap.Dnstap -u ns4/dnstap.out \
665		-w dnstap.out > fstrm_capture.out 2>&1 &
666	fstrm_capture_pid=$!
667	$RNDCCMD -s 10.53.0.4 dnstap -reopen | sed 's/^/ns4 /' | cat_i
668	$DIG $DIGOPTS @10.53.0.4 a.example > dig.out
669
670	echo_i "checking reopened unix socket message counts"
671	sleep 2
672	retry_quiet 5 dnstap_data_ready $fstrm_capture_pid dnstap.out 270
673	kill $fstrm_capture_pid
674	wait
675	udp4=`$DNSTAPREAD dnstap.out | grep "UDP " | wc -l`
676	tcp4=`$DNSTAPREAD dnstap.out | grep "TCP " | wc -l`
677	aq4=`$DNSTAPREAD dnstap.out | grep "AQ " | wc -l`
678	ar4=`$DNSTAPREAD dnstap.out | grep "AR " | wc -l`
679	cq4=`$DNSTAPREAD dnstap.out | grep "CQ " | wc -l`
680	cr4=`$DNSTAPREAD dnstap.out | grep "CR " | wc -l`
681	rq4=`$DNSTAPREAD dnstap.out | grep "RQ " | wc -l`
682	rr4=`$DNSTAPREAD dnstap.out | grep "RR " | wc -l`
683	uq4=`$DNSTAPREAD dnstap.out | grep "UQ " | wc -l`
684	ur4=`$DNSTAPREAD dnstap.out | grep "UR " | wc -l`
685
686	echo_i "checking UDP message counts"
687	ret=0
688	[ $udp4 -eq 2 ] || {
689		echo_i "ns4 $udp4 expected 2"
690		ret=1
691	}
692	if [ $ret != 0 ]; then echo_i "failed"; fi
693	status=`expr $status + $ret`
694
695	echo_i "checking TCP message counts"
696	ret=0
697	[ $tcp4 -eq 0 ] || {
698		echo_i "ns4 $tcp4 expected 0"
699		ret=1
700	}
701	if [ $ret != 0 ]; then echo_i "failed"; fi
702	status=`expr $status + $ret`
703
704	echo_i "checking AUTH_QUERY message counts"
705	ret=0
706	[ $aq4 -eq 0 ] || {
707		echo_i "ns4 $aq4 expected 0"
708		ret=1
709	}
710	if [ $ret != 0 ]; then echo_i "failed"; fi
711	status=`expr $status + $ret`
712
713	echo_i "checking AUTH_RESPONSE message counts"
714	ret=0
715	[ $ar4 -eq 0 ] || {
716		echo_i "ns4 $ar4 expected 0"
717		ret=1
718	}
719	if [ $ret != 0 ]; then echo_i "failed"; fi
720	status=`expr $status + $ret`
721
722	echo_i "checking CLIENT_QUERY message counts"
723	ret=0
724	[ $cq4 -eq 1 ] || {
725		echo_i "ns4 $cq4 expected 1"
726		ret=1
727	}
728	if [ $ret != 0 ]; then echo_i "failed"; fi
729	status=`expr $status + $ret`
730
731	echo_i "checking CLIENT_RESPONSE message counts"
732	ret=0
733	[ $cr4 -eq 1 ] || {
734		echo_i "ns4 $cr4 expected 1"
735		ret=1
736	}
737	if [ $ret != 0 ]; then echo_i "failed"; fi
738	status=`expr $status + $ret`
739
740	echo_i "checking RESOLVER_QUERY message counts"
741	ret=0
742	[ $rq4 -eq 0 ] || {
743		echo_i "ns4 $rq4 expected 0"
744		ret=1
745	}
746	if [ $ret != 0 ]; then echo_i "failed"; fi
747	status=`expr $status + $ret`
748
749	echo_i "checking RESOLVER_RESPONSE message counts"
750	ret=0
751	[ $rr4 -eq 0 ] || {
752		echo_i "ns4 $rr4 expected 0"
753		ret=1
754	}
755
756	echo_i "checking UPDATE_QUERY message counts"
757	ret=0
758	[ $uq4 -eq 0 ] || {
759		echo_i "ns4 $uq4 expected 0"
760		ret=1
761	}
762	if [ $ret != 0 ]; then echo_i "failed"; fi
763	status=`expr $status + $ret`
764
765	echo_i "checking UPDATE_RESPONSE message counts"
766	ret=0
767	[ $ur4 -eq 0 ] || {
768		echo_i "ns4 $ur4 expected 0"
769		ret=1
770	}
771	if [ $ret != 0 ]; then echo_i "failed"; fi
772	status=`expr $status + $ret`
773fi
774
775echo_i "checking large packet printing"
776ret=0
777# Expect one occurrence of "opcode: QUERY" below "reponse_message_data" and
778# another one below "response_message".
779lines=`$DNSTAPREAD -y large-answer.fstrm | grep -c "opcode: QUERY"`
780[ $lines -eq 2 ] || ret=1
781if [ $ret != 0 ]; then echo_i "failed"; fi
782status=`expr $status + $ret`
783
784test_dnstap_roll() (
785    ip="$1"
786    ns="$2"
787    n="$3"
788    $RNDCCMD -s "${ip}" dnstap -roll "${n}" | sed "s/^/${ns} /" | cat_i &&
789    files=$(find "$ns" -name "dnstap.out.[0-9]" | wc -l) &&
790    test "$files" -le "${n}" && test "$files" -ge "1"
791)
792
793echo_i "checking 'rndc -roll <value>' (no versions)"
794ret=0
795start_server --noclean --restart --port "${PORT}" dnstap ns3
796_repeat 5 test_dnstap_roll 10.53.0.3 ns3 3 || ret=1
797if [ $ret != 0 ]; then echo_i "failed"; fi
798status=$((status+ret))
799
800echo_i "checking 'rndc -roll <value>' (versions)"
801ret=0
802start_server --noclean --restart --port "${PORT}" dnstap ns2
803_repeat 5 test_dnstap_roll 10.53.0.2 ns2 3 || ret=1
804if [ $ret != 0 ]; then echo_i "failed"; fi
805status=$((status+ret))
806
807echo_i "exit status: $status"
808[ "$status" -eq 0 ] || exit 1
809