mirror of
				https://github.com/coredns/coredns.git
				synced 2025-11-04 03:03:14 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			97 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package loadbalance
 | 
						|
 | 
						|
import (
 | 
						|
	"net"
 | 
						|
	"testing"
 | 
						|
 | 
						|
	"github.com/coredns/coredns/plugin/test"
 | 
						|
 | 
						|
	"github.com/miekg/dns"
 | 
						|
)
 | 
						|
 | 
						|
func TestSortPreferred(t *testing.T) {
 | 
						|
	records := []dns.RR{
 | 
						|
		test.A("example.org. 300 IN A 10.9.30.1"),
 | 
						|
		test.A("example.org. 300 IN A 10.9.20.5"),
 | 
						|
		test.A("example.org. 300 IN A 192.168.1.2"),
 | 
						|
		test.A("example.org. 300 IN A 10.10.0.1"),
 | 
						|
		test.A("example.org. 300 IN A 10.9.20.3"),
 | 
						|
		test.A("example.org. 300 IN A 172.16.0.1"),
 | 
						|
		test.AAAA("example.org. 300 IN AAAA 2001:db8::1"),
 | 
						|
		test.AAAA("example.org. 300 IN AAAA 2001:db8:abcd::1"),
 | 
						|
		test.AAAA("example.org. 300 IN AAAA fd00::1"),
 | 
						|
		test.CNAME("example.org. 300 IN CNAME alias.example.org."),
 | 
						|
	}
 | 
						|
 | 
						|
	subnets := []*net.IPNet{}
 | 
						|
	cidrs := []string{"2001:db8::/32", "10.9.20.0/24", "10.9.30.0/24"}
 | 
						|
	for _, cidr := range cidrs {
 | 
						|
		_, subnet, err := net.ParseCIDR(cidr)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatalf("Failed to parse CIDR: %v", err)
 | 
						|
		}
 | 
						|
		subnets = append(subnets, subnet)
 | 
						|
	}
 | 
						|
 | 
						|
	msg := &dns.Msg{Answer: records}
 | 
						|
	reorderPreferredSubnets(msg, subnets)
 | 
						|
	sorted := msg.Answer
 | 
						|
 | 
						|
	expectedOrder := []string{
 | 
						|
		"alias.example.org.",
 | 
						|
		"2001:db8::1",
 | 
						|
		"2001:db8:abcd::1",
 | 
						|
		"10.9.20.5",
 | 
						|
		"10.9.20.3",
 | 
						|
		"10.9.30.1",
 | 
						|
		"192.168.1.2",
 | 
						|
		"10.10.0.1",
 | 
						|
		"172.16.0.1",
 | 
						|
		"fd00::1",
 | 
						|
	}
 | 
						|
 | 
						|
	if len(sorted) != len(expectedOrder) {
 | 
						|
		t.Fatalf("Expected %d records, got %d", len(expectedOrder), len(sorted))
 | 
						|
	}
 | 
						|
 | 
						|
	for i, rr := range sorted {
 | 
						|
		expected := expectedOrder[i]
 | 
						|
		switch r := rr.(type) {
 | 
						|
		case *dns.CNAME:
 | 
						|
			if r.Target != expected {
 | 
						|
				t.Errorf("Record %d: expected CNAME %s, got %s", i, expected, r.Target)
 | 
						|
			}
 | 
						|
		case *dns.A:
 | 
						|
			if r.A.String() != expected {
 | 
						|
				t.Errorf("Record %d: expected A IP %s, got %s", i, expected, r.A.String())
 | 
						|
			}
 | 
						|
		case *dns.AAAA:
 | 
						|
			if r.AAAA.String() != expected {
 | 
						|
				t.Errorf("Record %d: expected AAAA IP %s, got %s", i, expected, r.AAAA.String())
 | 
						|
			}
 | 
						|
		default:
 | 
						|
			t.Errorf("Record %d: unexpected RR type %T", i, r)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestExtractIP(t *testing.T) {
 | 
						|
	a := test.A("example.org. 300 IN A 10.0.0.1")
 | 
						|
	ip := extractIP(a)
 | 
						|
	if ip.String() != "10.0.0.1" {
 | 
						|
		t.Errorf("Expected 10.0.0.1, got %s", ip.String())
 | 
						|
	}
 | 
						|
 | 
						|
	aaaa := test.AAAA("example.org. 300 IN AAAA ::1")
 | 
						|
	ip = extractIP(aaaa)
 | 
						|
	if ip.String() != "::1" {
 | 
						|
		t.Errorf("Expected ::1, got %s", ip.String())
 | 
						|
	}
 | 
						|
 | 
						|
	cname := test.CNAME("example.org. 300 IN CNAME other.org.")
 | 
						|
	ip = extractIP(cname)
 | 
						|
	if ip != nil {
 | 
						|
		t.Errorf("Expected nil for CNAME, got %v", ip)
 | 
						|
	}
 | 
						|
}
 |