coredns/plugin/k8s_external/transfer_test.go
2022-07-10 11:06:33 -07:00

145 lines
3.4 KiB
Go

package external
import (
"strings"
"testing"
"github.com/coredns/coredns/plugin"
"github.com/coredns/coredns/plugin/kubernetes"
"github.com/coredns/coredns/plugin/test"
"github.com/coredns/coredns/plugin/transfer"
"github.com/miekg/dns"
)
func TestImplementsTransferer(t *testing.T) {
var e plugin.Handler
e = &External{}
_, ok := e.(transfer.Transferer)
if !ok {
t.Error("Transferer not implemented")
}
}
func TestTransferAXFR(t *testing.T) {
k := kubernetes.New([]string{"cluster.local."})
k.Namespaces = map[string]struct{}{"testns": {}}
k.APIConn = &external{}
e := New()
e.Zones = []string{"example.com."}
e.externalFunc = k.External
e.externalAddrFunc = externalAddress // internal test function
e.externalSerialFunc = externalSerial // internal test function
e.externalServicesFunc = k.ExternalServices
ch, err := e.Transfer("example.com.", 0)
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
var records []dns.RR
for rrs := range ch {
records = append(records, rrs...)
}
expect := []dns.RR{}
for _, tc := range append(tests, testsApex...) {
if tc.Rcode != dns.RcodeSuccess {
continue
}
for _, ans := range tc.Answer {
// Exclude wildcard test cases
if strings.Contains(ans.Header().Name, "*") {
continue
}
// Exclude TXT records
if ans.Header().Rrtype == dns.TypeTXT {
continue
}
// Exclude PTR records
if ans.Header().Rrtype == dns.TypePTR {
continue
}
expect = append(expect, ans)
}
}
diff := difference(expect, records)
if len(diff) != 0 {
t.Errorf("Got back %d records that do not exist in test cases, should be 0:", len(diff))
for _, rec := range diff {
t.Errorf("%+v", rec)
}
}
diff = difference(records, expect)
if len(diff) != 0 {
t.Errorf("Result is missing %d records, should be 0:", len(diff))
for _, rec := range diff {
t.Errorf("%+v", rec)
}
}
}
func TestTransferIXFR(t *testing.T) {
k := kubernetes.New([]string{"cluster.local."})
k.Namespaces = map[string]struct{}{"testns": {}}
k.APIConn = &external{}
e := New()
e.Zones = []string{"example.com."}
e.externalFunc = k.External
e.externalAddrFunc = externalAddress // internal test function
e.externalSerialFunc = externalSerial // internal test function
e.externalServicesFunc = k.ExternalServices
ch, err := e.Transfer("example.com.", externalSerial("example.com."))
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
var records []dns.RR
for rrs := range ch {
records = append(records, rrs...)
}
expect := []dns.RR{
test.SOA("example.com. 5 IN SOA ns1.dns.example.com. hostmaster.dns.example.com. 1499347823 7200 1800 86400 5"),
}
diff := difference(expect, records)
if len(diff) != 0 {
t.Errorf("Got back %d records that do not exist in test cases, should be 0:", len(diff))
for _, rec := range diff {
t.Errorf("%+v", rec)
}
}
diff = difference(records, expect)
if len(diff) != 0 {
t.Errorf("Result is missing %d records, should be 0:", len(diff))
for _, rec := range diff {
t.Errorf("%+v", rec)
}
}
}
// difference shows what we're missing when comparing two RR slices
func difference(testRRs []dns.RR, gotRRs []dns.RR) []dns.RR {
expectedRRs := map[string]struct{}{}
for _, rr := range testRRs {
expectedRRs[rr.String()] = struct{}{}
}
foundRRs := []dns.RR{}
for _, rr := range gotRRs {
if _, ok := expectedRRs[rr.String()]; !ok {
foundRRs = append(foundRRs, rr)
}
}
return foundRRs
}