mirror of
https://github.com/coredns/coredns.git
synced 2025-10-28 00:34:24 -04:00
Add AXFR test
Test shouldTransfer by upping a testserver and sending the SOA query. Remove state from DefaultErrorHandler and just get it from the request. Add more logging to show what is going on. This also adds the infrastructure for future tests.
This commit is contained in:
128
middleware/file/secondary_test.go
Normal file
128
middleware/file/secondary_test.go
Normal file
@@ -0,0 +1,128 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user