coredns/plugin/template/cname_test.go

96 lines
2.2 KiB
Go

package template
import (
"context"
"regexp"
"testing"
gotmpl "text/template"
"github.com/coredns/coredns/plugin/pkg/dnstest"
"github.com/coredns/coredns/plugin/test"
"github.com/coredns/coredns/request"
"github.com/miekg/dns"
)
func TestTruncatedCNAME(t *testing.T) {
up := &Upstub{
Qclass: dns.ClassINET,
Truncated: true,
Case: test.Case{
Qname: "cname.test.",
Qtype: dns.TypeA,
Rcode: dns.RcodeSuccess,
Answer: []dns.RR{
test.CNAME("cname.test. 600 IN CNAME test.up"),
test.A("test.up. 600 IN A 1.2.3.4"),
},
},
}
handler := Handler{
Zones: []string{"."},
Templates: []template{{
regex: []*regexp.Regexp{regexp.MustCompile(`^cname\.test\.$`)},
answer: []*gotmpl.Template{gotmpl.Must(gotmpl.New("answer").Parse(up.Answer[0].String()))},
qclass: dns.ClassINET,
qtype: dns.TypeA,
zones: []string{"test."},
upstream: up,
}},
}
r := &dns.Msg{Question: []dns.Question{{Name: up.Qname, Qclass: up.Qclass, Qtype: up.Qtype}}}
w := dnstest.NewRecorder(&test.ResponseWriter{})
_, err := handler.ServeDNS(context.TODO(), w, r)
if err != nil {
t.Fatalf("Unexpected error %q", err)
}
if w.Msg == nil {
t.Fatalf("Unexpected empty response.")
}
if !w.Msg.Truncated {
t.Error("Expected reply to be marked truncated.")
}
err = test.SortAndCheck(w.Msg, up.Case)
if err != nil {
t.Error(err)
}
}
// Upstub implements an Upstreamer that returns a set response for test purposes
type Upstub struct {
test.Case
Truncated bool
Qclass uint16
}
// Lookup returns a set response
func (t *Upstub) Lookup(ctx context.Context, state request.Request, name string, typ uint16) (*dns.Msg, error) {
var answer []dns.RR
// if query type is not CNAME, remove any CNAME with same name as qname from the answer
if t.Qtype != dns.TypeCNAME {
for _, a := range t.Answer {
if c, ok := a.(*dns.CNAME); ok && c.Header().Name == t.Qname {
continue
}
answer = append(answer, a)
}
} else {
answer = t.Answer
}
return &dns.Msg{
MsgHdr: dns.MsgHdr{
Response: true,
Truncated: t.Truncated,
Rcode: t.Rcode,
},
Question: []dns.Question{{Name: t.Qname, Qtype: t.Qtype, Qclass: t.Qclass}},
Answer: answer,
Extra: t.Extra,
Ns: t.Ns,
}, nil
}