mirror of
https://github.com/coredns/coredns.git
synced 2025-10-30 01:34:21 -04:00
129 lines
3.0 KiB
Go
129 lines
3.0 KiB
Go
|
|
package file
|
||
|
|
|
||
|
|
import (
|
||
|
|
"net"
|
||
|
|
"sync"
|
||
|
|
"testing"
|
||
|
|
"time"
|
||
|
|
|
||
|
|
"github.com/miekg/dns"
|
||
|
|
)
|
||
|
|
|
||
|
|
// TODO(miek): should test notifies as well, ie start test server (a real coredns one)...
|
||
|
|
// setup other test server that sends notify, see if CoreDNS comes calling for a zone
|
||
|
|
// tranfer
|
||
|
|
|
||
|
|
func TestLess(t *testing.T) {
|
||
|
|
const (
|
||
|
|
min = 0
|
||
|
|
max = 4294967295
|
||
|
|
low = 12345
|
||
|
|
high = 4000000000
|
||
|
|
)
|
||
|
|
|
||
|
|
if less(min, max) {
|
||
|
|
t.Fatalf("less: should be false")
|
||
|
|
}
|
||
|
|
if !less(max, min) {
|
||
|
|
t.Fatalf("less: should be true")
|
||
|
|
}
|
||
|
|
if !less(high, low) {
|
||
|
|
t.Fatalf("less: should be true")
|
||
|
|
}
|
||
|
|
if !less(7, 9) {
|
||
|
|
t.Fatalf("less; should be true")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TCPServer(laddr string) (*dns.Server, string, error) {
|
||
|
|
l, err := net.Listen("tcp", laddr)
|
||
|
|
if err != nil {
|
||
|
|
return nil, "", err
|
||
|
|
}
|
||
|
|
|
||
|
|
server := &dns.Server{Listener: l, ReadTimeout: time.Hour, WriteTimeout: time.Hour}
|
||
|
|
|
||
|
|
waitLock := sync.Mutex{}
|
||
|
|
waitLock.Lock()
|
||
|
|
server.NotifyStartedFunc = waitLock.Unlock
|
||
|
|
|
||
|
|
go func() {
|
||
|
|
server.ActivateAndServe()
|
||
|
|
l.Close()
|
||
|
|
}()
|
||
|
|
|
||
|
|
waitLock.Lock()
|
||
|
|
return server, l.Addr().String(), nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func UDPServer(laddr string) (*dns.Server, string, chan bool, error) {
|
||
|
|
pc, err := net.ListenPacket("udp", laddr)
|
||
|
|
if err != nil {
|
||
|
|
return nil, "", nil, err
|
||
|
|
}
|
||
|
|
server := &dns.Server{PacketConn: pc, ReadTimeout: time.Hour, WriteTimeout: time.Hour}
|
||
|
|
|
||
|
|
waitLock := sync.Mutex{}
|
||
|
|
waitLock.Lock()
|
||
|
|
server.NotifyStartedFunc = waitLock.Unlock
|
||
|
|
|
||
|
|
stop := make(chan bool)
|
||
|
|
|
||
|
|
go func() {
|
||
|
|
server.ActivateAndServe()
|
||
|
|
close(stop)
|
||
|
|
pc.Close()
|
||
|
|
}()
|
||
|
|
|
||
|
|
waitLock.Lock()
|
||
|
|
return server, pc.LocalAddr().String(), stop, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
type soa struct {
|
||
|
|
serial uint32
|
||
|
|
}
|
||
|
|
|
||
|
|
func (s *soa) Handler(w dns.ResponseWriter, req *dns.Msg) {
|
||
|
|
m := new(dns.Msg)
|
||
|
|
m.SetReply(req)
|
||
|
|
m.Answer = make([]dns.RR, 1)
|
||
|
|
m.Answer[0] = &dns.SOA{Hdr: dns.RR_Header{Name: m.Question[0].Name, Rrtype: dns.TypeSOA, Class: dns.ClassINET, Ttl: 100}, Ns: "bla.", Mbox: "bla.", Serial: s.serial}
|
||
|
|
w.WriteMsg(m)
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestShouldTransfer(t *testing.T) {
|
||
|
|
soa := soa{250}
|
||
|
|
|
||
|
|
dns.HandleFunc("secondary.miek.nl.", soa.Handler)
|
||
|
|
defer dns.HandleRemove("secondary.miek.nl.")
|
||
|
|
|
||
|
|
s, addrstr, err := TCPServer("127.0.0.1:0")
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("unable to run test server: %v", err)
|
||
|
|
}
|
||
|
|
defer s.Shutdown()
|
||
|
|
|
||
|
|
z := new(Zone)
|
||
|
|
z.name = "secondary.miek.nl."
|
||
|
|
z.TransferFrom = []string{addrstr}
|
||
|
|
|
||
|
|
// Serial smaller
|
||
|
|
z.SOA = &dns.SOA{Hdr: dns.RR_Header{Name: "secondary.miek.nl.", Rrtype: dns.TypeSOA, Class: dns.ClassINET, Ttl: 100}, Ns: "bla.", Mbox: "bla.", Serial: soa.serial - 1}
|
||
|
|
should, err := z.shouldTransfer()
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("unable to run shouldTransfer: %v", err)
|
||
|
|
}
|
||
|
|
if !should {
|
||
|
|
t.Fatalf("shouldTransfer should return true for serial: %q", soa.serial-1)
|
||
|
|
}
|
||
|
|
// Serial equal
|
||
|
|
z.SOA = &dns.SOA{Hdr: dns.RR_Header{Name: "secondary.miek.nl.", Rrtype: dns.TypeSOA, Class: dns.ClassINET, Ttl: 100}, Ns: "bla.", Mbox: "bla.", Serial: soa.serial}
|
||
|
|
should, err = z.shouldTransfer()
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("unable to run shouldTransfer: %v", err)
|
||
|
|
}
|
||
|
|
if should {
|
||
|
|
t.Fatalf("shouldTransfer should return false for serial: %d", soa.serial)
|
||
|
|
}
|
||
|
|
}
|