aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorGravatar Chris O'Haver <cohaver@infoblox.com> 2018-06-21 14:38:29 -0400
committerGravatar GitHub <noreply@github.com> 2018-06-21 14:38:29 -0400
commit716791aa094b54ea17241112a14eeecac10dcfa5 (patch)
tree41f30d187229214436907febcd2d93f1dbb1f066 /test
parentad8021230c775f129556fe7f681f0b09a59d480e (diff)
downloadcoredns-716791aa094b54ea17241112a14eeecac10dcfa5.tar.gz
coredns-716791aa094b54ea17241112a14eeecac10dcfa5.tar.zst
coredns-716791aa094b54ea17241112a14eeecac10dcfa5.zip
plugin/template: fix CNAME upstream handling (#1886)
Diffstat (limited to 'test')
-rw-r--r--test/template_upstream_test.go71
1 files changed, 71 insertions, 0 deletions
diff --git a/test/template_upstream_test.go b/test/template_upstream_test.go
new file mode 100644
index 000000000..0353616ab
--- /dev/null
+++ b/test/template_upstream_test.go
@@ -0,0 +1,71 @@
+package test
+
+import (
+ "testing"
+
+ "github.com/miekg/dns"
+)
+
+func TestTemplateUpstream(t *testing.T) {
+ corefile := `.:0 {
+ # CNAME
+ template IN ANY cname.example.net. {
+ match ".*"
+ answer "cname.example.net. 60 IN CNAME target.example.net."
+ upstream
+ }
+
+ # Target
+ template IN A target.example.net. {
+ match ".*"
+ answer "target.example.net. 60 IN A 1.2.3.4"
+ }
+}
+`
+ i, udp, _, err := CoreDNSServerAndPorts(corefile)
+ if err != nil {
+ t.Fatalf("Could not get CoreDNS serving instance: %s", err)
+ }
+ defer i.Stop()
+
+ // Test that an A query returns a CNAME and an A record
+ m := new(dns.Msg)
+ m.SetQuestion("cname.example.net.", dns.TypeA)
+ m.SetEdns0(4096, true) // need this?
+
+ r, err := dns.Exchange(m, udp)
+ if err != nil {
+ t.Fatalf("Could not send msg: %s", err)
+ }
+ if r.Rcode == dns.RcodeServerFailure {
+ t.Fatalf("Rcode should not be dns.RcodeServerFailure")
+ }
+ if len(r.Answer) < 2 {
+ t.Fatalf("Expected 2 answers, got %v", len(r.Answer))
+ }
+ if x := r.Answer[0].(*dns.CNAME).Target; x != "target.example.net." {
+ t.Fatalf("Failed to get address for CNAME, expected target.example.net. got %s", x)
+ }
+ if x := r.Answer[1].(*dns.A).A.String(); x != "1.2.3.4" {
+ t.Fatalf("Failed to get address for CNAME, expected 1.2.3.4 got %s", x)
+ }
+
+ // Test that a CNAME query only returns a CNAME
+ m = new(dns.Msg)
+ m.SetQuestion("cname.example.net.", dns.TypeCNAME)
+ m.SetEdns0(4096, true) // need this?
+
+ r, err = dns.Exchange(m, udp)
+ if err != nil {
+ t.Fatalf("Could not send msg: %s", err)
+ }
+ if r.Rcode == dns.RcodeServerFailure {
+ t.Fatalf("Rcode should not be dns.RcodeServerFailure")
+ }
+ if len(r.Answer) < 1 {
+ t.Fatalf("Expected 1 answer, got %v", len(r.Answer))
+ }
+ if x := r.Answer[0].(*dns.CNAME).Target; x != "target.example.net." {
+ t.Fatalf("Failed to get address for CNAME, expected target.example.net. got %s", x)
+ }
+}