aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorGravatar Chris O'Haver <cohaver@infoblox.com> 2020-12-09 03:44:31 -0500
committerGravatar GitHub <noreply@github.com> 2020-12-09 09:44:31 +0100
commit6bbb48d403ce3e0974809200ef1da2a20e969c70 (patch)
tree3bdce0d97f473360456b8a1b77ceb7aec99a58a2 /test
parent5ecf23ae7b3c2c913c3aca13480c4276628fea9c (diff)
downloadcoredns-6bbb48d403ce3e0974809200ef1da2a20e969c70.tar.gz
coredns-6bbb48d403ce3e0974809200ef1da2a20e969c70.tar.zst
coredns-6bbb48d403ce3e0974809200ef1da2a20e969c70.zip
plugin/file: Use NXDOMAIN response if CNAME target is NXDOMAIN (#4303)
* pass through nxdomain results Signed-off-by: Chris O'Haver <cohaver@infoblox.com> * return srvfail and nodata results Signed-off-by: Chris O'Haver <cohaver@infoblox.com> * add test Signed-off-by: Chris O'Haver <cohaver@infoblox.com> * cover more response cases Signed-off-by: Chris O'Haver <cohaver@infoblox.com>
Diffstat (limited to 'test')
-rw-r--r--test/file_upstream_test.go107
-rw-r--r--test/go-test-tmpfile56515609719
2 files changed, 126 insertions, 0 deletions
diff --git a/test/file_upstream_test.go b/test/file_upstream_test.go
index 4d13a2ca0..6b796f90d 100644
--- a/test/file_upstream_test.go
+++ b/test/file_upstream_test.go
@@ -58,6 +58,113 @@ www 3600 IN CNAME www.example.net.
}
}
+func TestFileUpstreamError(t *testing.T) {
+ cases := map[string]test.Case{
+ "nxdomain": {
+ Qname: "nxdomain.example.org.", Qtype: dns.TypeA,
+ Answer: []dns.RR{
+ test.CNAME("nxdomain.example.org. 3600 IN CNAME nxdomain.example.net"),
+ },
+ Rcode: dns.RcodeNameError,
+ },
+ "nxdomain-chain": {
+ Qname: "chain1.example.org.", Qtype: dns.TypeA,
+ Answer: []dns.RR{
+ test.CNAME("chain1.example.org. 3600 IN CNAME nxdomain.example.org"),
+ test.CNAME("nxdomain.example.org. 3600 IN CNAME nxdomain.example.net"),
+ },
+ Rcode: dns.RcodeNameError,
+ },
+ "srvfail": {
+ Qname: "srvfail.example.org.", Qtype: dns.TypeA,
+ Rcode: dns.RcodeServerFailure,
+ },
+ "srvfail-chain": {
+ Qname: "chain2.example.org.", Qtype: dns.TypeA,
+ Rcode: dns.RcodeServerFailure,
+ },
+ "nodata": {
+ Qname: "nodata.example.org.", Qtype: dns.TypeA,
+ Answer: []dns.RR{
+ test.CNAME("nodata.example.org. 3600 IN CNAME nodata.example.net"),
+ },
+ Rcode: dns.RcodeSuccess,
+ },
+ "nodata-chain": {
+ Qname: "chain3.example.org.", Qtype: dns.TypeA,
+ Answer: []dns.RR{
+ test.CNAME("chain3.example.org. 3600 IN CNAME nodata.example.org"),
+ test.CNAME("nodata.example.org. 3600 IN CNAME nodata.example.net"),
+ },
+ Rcode: dns.RcodeSuccess,
+ },
+ }
+ name, rm, err := test.TempFile(".", `$ORIGIN example.org.
+@ 3600 IN SOA sns.dns.icann.org. noc.dns.icann.org. (
+ 2017042745 ; serial
+ 7200 ; refresh (2 hours)
+ 3600 ; retry (1 hour)
+ 1209600 ; expire (2 weeks)
+ 3600 ; minimum (1 hour)
+)
+
+ 3600 IN NS a.iana-servers.net.
+ 3600 IN NS b.iana-servers.net.
+
+chain1 3600 IN CNAME nxdomain
+nxdomain 3600 IN CNAME nxdomain.example.net.
+chain2 3600 IN CNAME srvfail
+srvfail 3600 IN CNAME srvfail.example.net.
+chain3 3600 IN CNAME nodata
+nodata 3600 IN CNAME nodata.example.net.
+
+`)
+ if err != nil {
+ t.Fatalf("Failed to create zone: %s", err)
+ }
+ defer rm()
+
+ corefile := `.:0 {
+ template ANY A nxdomain.example.net. {
+ rcode NXDOMAIN
+ }
+ template ANY A srvfail.example.net. {
+ rcode SERVFAIL
+ }
+ template ANY A nodata.example.net. {
+ }
+ file ` + name + ` example.org
+}`
+
+ i, udp, _, err := CoreDNSServerAndPorts(corefile)
+ if err != nil {
+ t.Fatalf("Could not get CoreDNS serving instance: %s", err)
+ }
+ defer i.Stop()
+
+ for n, tc := range cases {
+ t.Run(n, func(t *testing.T) {
+ m := new(dns.Msg)
+ m.SetQuestion(tc.Qname, tc.Qtype)
+ m.SetEdns0(4096, true)
+
+ r, err := dns.Exchange(m, udp)
+ if err != nil {
+ t.Fatalf("Could not exchange msg: %s", err)
+ }
+ if r.Rcode != tc.Rcode {
+ t.Fatalf("expected rcode %v, got %v", tc.Rcode, r.Rcode)
+ }
+ if n := len(r.Answer); n != len(tc.Answer) {
+ t.Fatalf("Expected %v answers, got %v", len(tc.Answer), n)
+ }
+ if err := test.Section(tc, test.Answer, r.Answer); err != nil {
+ t.Error(err)
+ }
+ })
+ }
+}
+
// TestFileUpstreamAdditional runs two CoreDNS servers that serve example.org and foo.example.org.
// example.org contains a cname to foo.example.org; this should be resolved via upstream.Self.
func TestFileUpstreamAdditional(t *testing.T) {
diff --git a/test/go-test-tmpfile565156097 b/test/go-test-tmpfile565156097
new file mode 100644
index 000000000..752ec30cf
--- /dev/null
+++ b/test/go-test-tmpfile565156097
@@ -0,0 +1,19 @@
+$ORIGIN example.org.
+@ 3600 IN SOA sns.dns.icann.org. noc.dns.icann.org. (
+ 2017042745 ; serial
+ 7200 ; refresh (2 hours)
+ 3600 ; retry (1 hour)
+ 1209600 ; expire (2 weeks)
+ 3600 ; minimum (1 hour)
+)
+
+ 3600 IN NS a.iana-servers.net.
+ 3600 IN NS b.iana-servers.net.
+
+chain1 3600 IN CNAME nxdomain
+nxdomain 3600 IN CNAME nxdomain.example.net.
+chain2 3600 IN CNAME srvfail
+srvfail 3600 IN CNAME srvfail.example.net.
+chain3 3600 IN CNAME nodata
+nodata 3600 IN CNAME nodata.example.net.
+