6139ce
From a64853318ade406ef0db744918bb2828cf0a6247 Mon Sep 17 00:00:00 2001
6139ce
From: Stephen Morris <stephen@isc.org>
6139ce
Date: Thu, 5 Mar 2020 18:46:46 +0000
6139ce
Subject: [PATCH] Add test for reduction in number of fetches
6139ce
6139ce
Add a system test that counts how many address fetches are made
6139ce
for different numbers of NS records and checks that the number
6139ce
are successfully limited.
6139ce
6139ce
(cherry picked from commit 5fb65f45443225180296b361a12be0fead5049f2)
6139ce
---
6139ce
 bin/tests/system/resolver/clean.sh          |  4 +-
6139ce
 bin/tests/system/resolver/ns4/named.conf.in |  5 ++
6139ce
 bin/tests/system/resolver/ns4/root.db       |  4 +
6139ce
 bin/tests/system/resolver/ns4/sourcens.db   | 89 +++++++++++++++++++++
6139ce
 bin/tests/system/resolver/ns5/named.conf.in |  9 ++-
6139ce
 bin/tests/system/resolver/ns6/named.conf.in | 15 ++++
6139ce
 bin/tests/system/resolver/ns6/targetns.db   | 23 ++++++
6139ce
 bin/tests/system/resolver/tests.sh          | 34 ++++++++
6139ce
 8 files changed, 180 insertions(+), 3 deletions(-)
6139ce
 create mode 100644 bin/tests/system/resolver/ns4/sourcens.db
6139ce
 create mode 100644 bin/tests/system/resolver/ns6/targetns.db
6139ce
6139ce
diff --git a/bin/tests/system/resolver/clean.sh b/bin/tests/system/resolver/clean.sh
6139ce
index 4dfde1f3e7..b3e4bc0b5d 100644
6139ce
--- a/bin/tests/system/resolver/clean.sh
6139ce
+++ b/bin/tests/system/resolver/clean.sh
6139ce
@@ -17,8 +17,7 @@ rm -f */named.memstats
6139ce
 rm -f */named.run
6139ce
 rm -f */ans.run
6139ce
 rm -f */*.jdb
6139ce
-rm -f dig.out dig.out.*
6139ce
-rm -f dig.*.out.*
6139ce
+rm -f dig.out dig.out.* dig.*.out.*
6139ce
 rm -f dig.*.foo.*
6139ce
 rm -f dig.*.bar.*
6139ce
 rm -f dig.*.prime.*
6139ce
@@ -28,6 +27,7 @@ rm -f ns6/example.net.db.signed ns6/example.net.db
6139ce
 rm -f ns6/ds.example.net.db.signed ns6/ds.example.net.db
6139ce
 rm -f ns6/dsset-ds.example.net*
6139ce
 rm -f ns6/dsset-example.net* ns6/example.net.db.signed.jnl
6139ce
+rm -f ns6/named.stats*
6139ce
 rm -f ns6/to-be-removed.tld.db ns6/to-be-removed.tld.db.jnl
6139ce
 rm -f ns7/server.db ns7/server.db.jnl
6139ce
 rm -f resolve.out.*.test*
6139ce
diff --git a/bin/tests/system/resolver/ns4/named.conf.in b/bin/tests/system/resolver/ns4/named.conf.in
6139ce
index c679dc3151..56fe5d0dd8 100644
6139ce
--- a/bin/tests/system/resolver/ns4/named.conf.in
6139ce
+++ b/bin/tests/system/resolver/ns4/named.conf.in
6139ce
@@ -50,6 +50,11 @@ zone "broken" {
6139ce
 	file "broken.db";
6139ce
 };
6139ce
 
6139ce
+zone "sourcens" {
6139ce
+    type master;
6139ce
+    file "sourcens.db";
6139ce
+};
6139ce
+
6139ce
 key rndc_key {
6139ce
 	secret "1234abcd8765";
6139ce
 	algorithm hmac-sha256;
6139ce
diff --git a/bin/tests/system/resolver/ns4/root.db b/bin/tests/system/resolver/ns4/root.db
6139ce
index 721765d1be..ae541340da 100644
6139ce
--- a/bin/tests/system/resolver/ns4/root.db
6139ce
+++ b/bin/tests/system/resolver/ns4/root.db
6139ce
@@ -24,3 +24,7 @@ example.net.		NS	ns.example.net.
6139ce
 ns.example.net.		A	10.53.0.6
6139ce
 no-questions.		NS	ns.no-questions.
6139ce
 ns.no-questions.	A	10.53.0.8
6139ce
+sourcens.		NS	ns.sourcens.
6139ce
+ns.sourcens.		A	10.53.0.4
6139ce
+targetns. 		NS	ns.targetns.
6139ce
+ns.targetns.		A	10.53.0.6
6139ce
diff --git a/bin/tests/system/resolver/ns4/sourcens.db b/bin/tests/system/resolver/ns4/sourcens.db
6139ce
new file mode 100644
6139ce
index 0000000000..b02cc6e835
6139ce
--- /dev/null
6139ce
+++ b/bin/tests/system/resolver/ns4/sourcens.db
6139ce
@@ -0,0 +1,89 @@
6139ce
+; Copyright (C) Internet Systems Consortium, Inc. ("ISC")
6139ce
+;
6139ce
+; This Source Code Form is subject to the terms of the Mozilla Public
6139ce
+; License, v. 2.0. If a copy of the MPL was not distributed with this
6139ce
+; file, You can obtain one at http://mozilla.org/MPL/2.0/.
6139ce
+;
6139ce
+; See the COPYRIGHT file distributed with this work for additional
6139ce
+; information regarding copyright ownership.
6139ce
+
6139ce
+; This zone contains a set of delegations with varying numbers of NS
6139ce
+; records.  This is used to check that BIND is limiting the number of
6139ce
+; NS records it follows when resolving a delegation.  It tests all
6139ce
+; numbers of NS records up to twice the number followed.
6139ce
+
6139ce
+$TTL 60
6139ce
+@ 			IN SOA	marka.isc.org. ns.server. (
6139ce
+				2010   	; serial
6139ce
+				600         	; refresh
6139ce
+				600         	; retry
6139ce
+				1200    	; expire
6139ce
+				600       	; minimum
6139ce
+				)
6139ce
+@			NS	ns
6139ce
+ns			A	10.53.0.4
6139ce
+
6139ce
+target1  		NS	ns.fake11.targetns.
6139ce
+
6139ce
+target2  		NS	ns.fake21.targetns.
6139ce
+			NS	ns.fake22.targetns.
6139ce
+
6139ce
+target3  		NS	ns.fake31.targetns.
6139ce
+			NS	ns.fake32.targetns.
6139ce
+			NS	ns.fake33.targetns.
6139ce
+
6139ce
+target4  		NS	ns.fake41.targetns.
6139ce
+			NS	ns.fake42.targetns.
6139ce
+			NS	ns.fake43.targetns.
6139ce
+			NS	ns.fake44.targetns.
6139ce
+
6139ce
+target5  		NS	ns.fake51.targetns.
6139ce
+			NS	ns.fake52.targetns.
6139ce
+			NS	ns.fake53.targetns.
6139ce
+			NS	ns.fake54.targetns.
6139ce
+			NS	ns.fake55.targetns.
6139ce
+
6139ce
+target6  		NS	ns.fake61.targetns.
6139ce
+			NS	ns.fake62.targetns.
6139ce
+			NS	ns.fake63.targetns.
6139ce
+			NS	ns.fake64.targetns.
6139ce
+			NS	ns.fake65.targetns.
6139ce
+			NS	ns.fake66.targetns.
6139ce
+
6139ce
+target7  		NS	ns.fake71.targetns.
6139ce
+			NS	ns.fake72.targetns.
6139ce
+			NS	ns.fake73.targetns.
6139ce
+			NS	ns.fake74.targetns.
6139ce
+			NS	ns.fake75.targetns.
6139ce
+			NS	ns.fake76.targetns.
6139ce
+			NS	ns.fake77.targetns.
6139ce
+
6139ce
+target8  		NS	ns.fake81.targetns.
6139ce
+			NS	ns.fake82.targetns.
6139ce
+			NS	ns.fake83.targetns.
6139ce
+			NS	ns.fake84.targetns.
6139ce
+			NS	ns.fake85.targetns.
6139ce
+			NS	ns.fake86.targetns.
6139ce
+			NS	ns.fake87.targetns.
6139ce
+			NS	ns.fake88.targetns.
6139ce
+
6139ce
+target9  		NS	ns.fake91.targetns.
6139ce
+			NS	ns.fake92.targetns.
6139ce
+			NS	ns.fake93.targetns.
6139ce
+			NS	ns.fake94.targetns.
6139ce
+			NS	ns.fake95.targetns.
6139ce
+			NS	ns.fake96.targetns.
6139ce
+			NS	ns.fake97.targetns.
6139ce
+			NS	ns.fake98.targetns.
6139ce
+			NS	ns.fake99.targetns.
6139ce
+
6139ce
+target10  		NS	ns.fake101.targetns.
6139ce
+			NS	ns.fake102.targetns.
6139ce
+			NS	ns.fake103.targetns.
6139ce
+			NS	ns.fake104.targetns.
6139ce
+			NS	ns.fake105.targetns.
6139ce
+			NS	ns.fake106.targetns.
6139ce
+			NS	ns.fake107.targetns.
6139ce
+			NS	ns.fake108.targetns.
6139ce
+			NS	ns.fake109.targetns.
6139ce
+			NS	ns.fake1010.targetns.
6139ce
diff --git a/bin/tests/system/resolver/ns5/named.conf.in b/bin/tests/system/resolver/ns5/named.conf.in
6139ce
index 07205c9938..90818e4556 100644
6139ce
--- a/bin/tests/system/resolver/ns5/named.conf.in
6139ce
+++ b/bin/tests/system/resolver/ns5/named.conf.in
6139ce
@@ -46,4 +46,11 @@ zone "delegation-only" {
6139ce
        type delegation-only;
6139ce
 };
6139ce
 
6139ce
-include "trusted.conf";
6139ce
+key rndc_key {
6139ce
+	secret "1234abcd8765";
6139ce
+	algorithm hmac-sha256;
6139ce
+};
6139ce
+
6139ce
+controls {
6139ce
+	inet 10.53.0.5 port @CONTROLPORT@ allow { any; } keys { rndc_key; };
6139ce
+};
6139ce
diff --git a/bin/tests/system/resolver/ns6/named.conf.in b/bin/tests/system/resolver/ns6/named.conf.in
6139ce
index 7df48558b8..4b01f9ba14 100644
6139ce
--- a/bin/tests/system/resolver/ns6/named.conf.in
6139ce
+++ b/bin/tests/system/resolver/ns6/named.conf.in
6139ce
@@ -22,6 +22,7 @@ options {
6139ce
 	recursion no;
6139ce
 	// minimal-responses yes;
6139ce
 	querylog yes;
6139ce
+	statistics-file "named.stats";
6139ce
 	/*
6139ce
 	 * test that named loads with root-delegation-only that
6139ce
 	 * has a exclude list.
6139ce
@@ -67,3 +68,17 @@ zone "delegation-only" {
6139ce
 	type master;
6139ce
 	file "delegation-only.db";
6139ce
 };
6139ce
+
6139ce
+zone "targetns" {
6139ce
+	type master;
6139ce
+	file "targetns.db";
6139ce
+};
6139ce
+
6139ce
+key rndc_key {
6139ce
+	secret "1234abcd8765";
6139ce
+	algorithm hmac-sha256;
6139ce
+};
6139ce
+
6139ce
+controls {
6139ce
+	inet 10.53.0.6 port @CONTROLPORT@ allow { any; } keys { rndc_key; };
6139ce
+};
6139ce
diff --git a/bin/tests/system/resolver/ns6/targetns.db b/bin/tests/system/resolver/ns6/targetns.db
6139ce
new file mode 100644
6139ce
index 0000000000..036e64580b
6139ce
--- /dev/null
6139ce
+++ b/bin/tests/system/resolver/ns6/targetns.db
6139ce
@@ -0,0 +1,23 @@
6139ce
+; Copyright (C) Internet Systems Consortium, Inc. ("ISC")
6139ce
+;
6139ce
+; This Source Code Form is subject to the terms of the Mozilla Public
6139ce
+; License, v. 2.0. If a copy of the MPL was not distributed with this
6139ce
+; file, You can obtain one at http://mozilla.org/MPL/2.0/.
6139ce
+;
6139ce
+; See the COPYRIGHT file distributed with this work for additional
6139ce
+; information regarding copyright ownership.
6139ce
+
6139ce
+; In the test for checking how many NS records BIND will follow, this
6139ce
+; zone marks the server as the one to which the NS lookups will be
6139ce
+; directed.
6139ce
+
6139ce
+$TTL 300
6139ce
+@ 			IN SOA	marka.isc.org. ns.server. (
6139ce
+				2010   	; serial
6139ce
+				600         	; refresh
6139ce
+				600         	; retry
6139ce
+				1200    	; expire
6139ce
+				600       	; minimum
6139ce
+				)
6139ce
+			NS	ns
6139ce
+ns			A	10.53.0.6
6139ce
diff --git a/bin/tests/system/resolver/tests.sh b/bin/tests/system/resolver/tests.sh
6139ce
index 12d2819e30..178ba4d79b 100755
6139ce
--- a/bin/tests/system/resolver/tests.sh
6139ce
+++ b/bin/tests/system/resolver/tests.sh
6139ce
@@ -247,6 +247,40 @@ if [ -x ${RESOLVE} ] ; then
6139ce
     status=`expr $status + $ret`
6139ce
 fi
6139ce
 
6139ce
+n=`expr $n + 1`
6139ce
+echo_i "check that the resolver limits the number of NS records it follows in a referral response ($n)"
6139ce
+# ns5 is the recusor being tested.  ns4 holds the sourcens zone containing names with varying numbers of NS
6139ce
+# records pointing to non-existent nameservers in the targetns zone on ns6.
6139ce
+ret=0
6139ce
+$RNDCCMD 10.53.0.5 flush || ret=1   # Ensure cache is empty before doing this test
6139ce
+for nscount in 1 2 3 4 5 6 7 8 9 10
6139ce
+do
6139ce
+        # Verify number of NS records at source server
6139ce
+        $DIG $DIGOPTS +norecurse @10.53.0.4 target${nscount}.sourcens ns > dig.ns4.out.${nscount}.${n}
6139ce
+        sourcerecs=`grep NS dig.ns4.out.${nscount}.${n} | grep -v ';' | wc -l`
6139ce
+        test $sourcerecs -eq $nscount || ret=1
6139ce
+        test $sourcerecs -eq $nscount || echo_i "NS count incorrect for target${nscount}.sourcens"
6139ce
+        # Expected queries = 2 * number of NS records, up to a maximum of 10.
6139ce
+        expected=`expr 2 \* $nscount`
6139ce
+        if [ $expected -gt 10 ]; then expected=10; fi
6139ce
+        # Work out the queries made by checking statistics on the target before and after the test
6139ce
+        $RNDCCMD 10.53.0.6 stats || ret=1
6139ce
+        initial_count=`awk '/responses sent/ {print $1}' ns6/named.stats`
6139ce
+        mv ns6/named.stats ns6/named.stats.initial.${nscount}.${n}
6139ce
+        $DIG $DIGOPTS @10.53.0.5 target${nscount}.sourcens A > dig.ns5.out.${nscount}.${n} || ret=1
6139ce
+        $RNDCCMD 10.53.0.6 stats || ret=1
6139ce
+        final_count=`awk '/responses sent/ {print $1}' ns6/named.stats`
6139ce
+        mv ns6/named.stats ns6/named.stats.final.${nscount}.${n}
6139ce
+        # Check number of queries during the test is as expected
6139ce
+        actual=`expr $final_count - $initial_count`
6139ce
+        if [ $actual -ne $expected ]; then
6139ce
+                echo_i "query count error: $nscount NS records: expected queries $expected, actual $actual"
6139ce
+                ret=1
6139ce
+        fi
6139ce
+done
6139ce
+if [ $ret != 0 ]; then echo_i "failed"; fi
6139ce
+status=`expr $status + $ret`
6139ce
+
6139ce
 n=`expr $n + 1`
6139ce
 echo_i "RT21594 regression test check setup ($n)"
6139ce
 ret=0
6139ce
-- 
6139ce
2.21.1
6139ce