mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-31 18:23:13 -04:00 
			
		
		
		
	
		
			
	
	
		
			143 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			143 lines
		
	
	
		
			3.3 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
 | ||
|  | 			}
 | ||
|  | 			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
 | ||
|  | }
 |