aboutsummaryrefslogtreecommitdiff
path: root/plugin/transfer/transfer_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/transfer/transfer_test.go')
-rw-r--r--plugin/transfer/transfer_test.go141
1 files changed, 64 insertions, 77 deletions
diff --git a/plugin/transfer/transfer_test.go b/plugin/transfer/transfer_test.go
index 8dce4c6e1..c4b3891db 100644
--- a/plugin/transfer/transfer_test.go
+++ b/plugin/transfer/transfer_test.go
@@ -12,18 +12,18 @@ import (
"github.com/miekg/dns"
)
-// transfererPlugin implements transfer.Transferer and plugin.Handler
+// transfererPlugin implements transfer.Transferer and plugin.Handler.
type transfererPlugin struct {
Zone string
Serial uint32
Next plugin.Handler
}
-// Name implements plugin.Handler
-func (transfererPlugin) Name() string { return "transfererplugin" }
+// Name implements plugin.Handler.
+func (*transfererPlugin) Name() string { return "transfererplugin" }
-// ServeDNS implements plugin.Handler
-func (p transfererPlugin) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
+// ServeDNS implements plugin.Handler.
+func (p *transfererPlugin) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
if r.Question[0].Name != p.Zone {
return p.Next.ServeDNS(ctx, w, r)
}
@@ -31,12 +31,12 @@ func (p transfererPlugin) ServeDNS(ctx context.Context, w dns.ResponseWriter, r
}
// Transfer implements transfer.Transferer - it returns a static AXFR response, or
-// if serial is current, an abbreviated IXFR response
-func (p transfererPlugin) Transfer(zone string, serial uint32) (<-chan []dns.RR, error) {
+// if serial is current, an abbreviated IXFR response.
+func (p *transfererPlugin) Transfer(zone string, serial uint32) (<-chan []dns.RR, error) {
if zone != p.Zone {
return nil, ErrNotAuthoritative
}
- ch := make(chan []dns.RR, 2)
+ ch := make(chan []dns.RR, 3) // sending 3 bits and don't want to block, nor do a waitgroup
defer close(ch)
ch <- []dns.RR{test.SOA(fmt.Sprintf("%s 100 IN SOA ns.dns.%s hostmaster.%s %d 7200 1800 86400 100", p.Zone, p.Zone, p.Zone, p.Serial))}
if serial >= p.Serial {
@@ -46,30 +46,31 @@ func (p transfererPlugin) Transfer(zone string, serial uint32) (<-chan []dns.RR,
test.NS(fmt.Sprintf("%s 100 IN NS ns.dns.%s", p.Zone, p.Zone)),
test.A(fmt.Sprintf("ns.dns.%s 100 IN A 1.2.3.4", p.Zone)),
}
+ ch <- []dns.RR{test.SOA(fmt.Sprintf("%s 100 IN SOA ns.dns.%s hostmaster.%s %d 7200 1800 86400 100", p.Zone, p.Zone, p.Zone, p.Serial))}
return ch, nil
}
type terminatingPlugin struct{}
-// Name implements plugin.Handler
-func (terminatingPlugin) Name() string { return "testplugin" }
+// Name implements plugin.Handler.
+func (*terminatingPlugin) Name() string { return "testplugin" }
-// ServeDNS implements plugin.Handler that returns NXDOMAIN for all requests
-func (terminatingPlugin) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
+// ServeDNS implements plugin.Handler that returns NXDOMAIN for all requests.
+func (*terminatingPlugin) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
m := new(dns.Msg)
m.SetRcode(r, dns.RcodeNameError)
w.WriteMsg(m)
return dns.RcodeNameError, nil
}
-func newTestTransfer() Transfer {
+func newTestTransfer() *Transfer {
nextPlugin1 := transfererPlugin{Zone: "example.com.", Serial: 12345}
nextPlugin2 := transfererPlugin{Zone: "example.org.", Serial: 12345}
- nextPlugin2.Next = terminatingPlugin{}
- nextPlugin1.Next = nextPlugin2
+ nextPlugin2.Next = &terminatingPlugin{}
+ nextPlugin1.Next = &nextPlugin2
- transfer := Transfer{
- Transferers: []Transferer{nextPlugin1, nextPlugin2},
+ transfer := &Transfer{
+ Transferers: []Transferer{&nextPlugin1, &nextPlugin2},
xfrs: []*xfr{
{
Zones: []string{"example.org."},
@@ -80,22 +81,21 @@ func newTestTransfer() Transfer {
to: []string{"*"},
},
},
- Next: nextPlugin1,
+ Next: &nextPlugin1,
}
return transfer
}
func TestTransferNonZone(t *testing.T) {
-
transfer := newTestTransfer()
ctx := context.TODO()
for _, tc := range []string{"sub.example.org.", "example.test."} {
w := dnstest.NewRecorder(&test.ResponseWriter{})
- dnsmsg := &dns.Msg{}
- dnsmsg.SetAxfr(tc)
+ m := &dns.Msg{}
+ m.SetAxfr(tc)
- _, err := transfer.ServeDNS(ctx, w, dnsmsg)
+ _, err := transfer.ServeDNS(ctx, w, m)
if err != nil {
t.Error(err)
}
@@ -111,15 +111,14 @@ func TestTransferNonZone(t *testing.T) {
}
func TestTransferNotAXFRorIXFR(t *testing.T) {
-
transfer := newTestTransfer()
ctx := context.TODO()
w := dnstest.NewRecorder(&test.ResponseWriter{})
- dnsmsg := &dns.Msg{}
- dnsmsg.SetQuestion("test.domain.", dns.TypeA)
+ m := &dns.Msg{}
+ m.SetQuestion("test.domain.", dns.TypeA)
- _, err := transfer.ServeDNS(ctx, w, dnsmsg)
+ _, err := transfer.ServeDNS(ctx, w, m)
if err != nil {
t.Error(err)
}
@@ -134,15 +133,14 @@ func TestTransferNotAXFRorIXFR(t *testing.T) {
}
func TestTransferAXFRExampleOrg(t *testing.T) {
-
transfer := newTestTransfer()
ctx := context.TODO()
w := dnstest.NewMultiRecorder(&test.ResponseWriter{})
- dnsmsg := &dns.Msg{}
- dnsmsg.SetAxfr(transfer.xfrs[0].Zones[0])
+ m := &dns.Msg{}
+ m.SetAxfr(transfer.xfrs[0].Zones[0])
- _, err := transfer.ServeDNS(ctx, w, dnsmsg)
+ _, err := transfer.ServeDNS(ctx, w, m)
if err != nil {
t.Error(err)
}
@@ -151,15 +149,14 @@ func TestTransferAXFRExampleOrg(t *testing.T) {
}
func TestTransferAXFRExampleCom(t *testing.T) {
-
transfer := newTestTransfer()
ctx := context.TODO()
w := dnstest.NewMultiRecorder(&test.ResponseWriter{})
- dnsmsg := &dns.Msg{}
- dnsmsg.SetAxfr(transfer.xfrs[1].Zones[0])
+ m := &dns.Msg{}
+ m.SetAxfr(transfer.xfrs[1].Zones[0])
- _, err := transfer.ServeDNS(ctx, w, dnsmsg)
+ _, err := transfer.ServeDNS(ctx, w, m)
if err != nil {
t.Error(err)
}
@@ -167,70 +164,61 @@ func TestTransferAXFRExampleCom(t *testing.T) {
validateAXFRResponse(t, w)
}
-func TestTransferIXFRFallback(t *testing.T) {
-
+func TestTransferIXFRCurrent(t *testing.T) {
transfer := newTestTransfer()
- testPlugin := transfer.Transferers[0].(transfererPlugin)
+ testPlugin := transfer.Transferers[0].(*transfererPlugin)
ctx := context.TODO()
w := dnstest.NewMultiRecorder(&test.ResponseWriter{})
- dnsmsg := &dns.Msg{}
- dnsmsg.SetIxfr(
- transfer.xfrs[0].Zones[0],
- testPlugin.Serial-1,
- "ns.dns."+testPlugin.Zone,
- "hostmaster.dns."+testPlugin.Zone,
- )
+ m := &dns.Msg{}
+ m.SetIxfr(transfer.xfrs[0].Zones[0], testPlugin.Serial, "ns.dns."+testPlugin.Zone, "hostmaster.dns."+testPlugin.Zone)
- _, err := transfer.ServeDNS(ctx, w, dnsmsg)
+ _, err := transfer.ServeDNS(ctx, w, m)
if err != nil {
t.Error(err)
}
- validateAXFRResponse(t, w)
-}
+ if len(w.Msgs) == 0 {
+ t.Fatal("Did not get back a zone response")
+ }
-func TestTransferIXFRCurrent(t *testing.T) {
+ if len(w.Msgs[0].Answer) != 1 {
+ t.Logf("%+v\n", w)
+ t.Fatalf("Expected 1 answer, got %d", len(w.Msgs[0].Answer))
+ }
+ // Ensure the answer is the SOA
+ if w.Msgs[0].Answer[0].Header().Rrtype != dns.TypeSOA {
+ t.Error("Answer does not contain the SOA record")
+ }
+}
+
+func TestTransferIXFRFallback(t *testing.T) {
transfer := newTestTransfer()
- testPlugin := transfer.Transferers[0].(transfererPlugin)
+ testPlugin := transfer.Transferers[0].(*transfererPlugin)
ctx := context.TODO()
w := dnstest.NewMultiRecorder(&test.ResponseWriter{})
- dnsmsg := &dns.Msg{}
- dnsmsg.SetIxfr(
+ m := &dns.Msg{}
+ m.SetIxfr(
transfer.xfrs[0].Zones[0],
- testPlugin.Serial,
+ testPlugin.Serial-1,
"ns.dns."+testPlugin.Zone,
"hostmaster.dns."+testPlugin.Zone,
)
- _, err := transfer.ServeDNS(ctx, w, dnsmsg)
+ _, err := transfer.ServeDNS(ctx, w, m)
if err != nil {
t.Error(err)
}
- if len(w.Msgs) == 0 {
- t.Logf("%+v\n", w)
- t.Fatal("Did not get back a zone response")
- }
-
- if len(w.Msgs[0].Answer) != 1 {
- t.Logf("%+v\n", w)
- t.Fatalf("Expected 1 answer, got %d", len(w.Msgs[0].Answer))
- }
-
- // Ensure the answer is the SOA
- if w.Msgs[0].Answer[0].Header().Rrtype != dns.TypeSOA {
- t.Error("Answer does not contain the SOA record")
- }
+ validateAXFRResponse(t, w)
}
func validateAXFRResponse(t *testing.T, w *dnstest.MultiRecorder) {
if len(w.Msgs) == 0 {
- t.Logf("%+v\n", w)
t.Fatal("Did not get back a zone response")
}
@@ -263,29 +251,28 @@ func TestTransferNotAllowed(t *testing.T) {
nextPlugin := transfererPlugin{Zone: "example.org.", Serial: 12345}
transfer := Transfer{
- Transferers: []Transferer{nextPlugin},
+ Transferers: []Transferer{&nextPlugin},
xfrs: []*xfr{
{
Zones: []string{"example.org."},
to: []string{"1.2.3.4"},
},
},
- Next: nextPlugin,
+ Next: &nextPlugin,
}
ctx := context.TODO()
- w := dnstest.NewMultiRecorder(&test.ResponseWriter{})
- dnsmsg := &dns.Msg{}
- dnsmsg.SetAxfr(transfer.xfrs[0].Zones[0])
+ w := dnstest.NewRecorder(&test.ResponseWriter{})
+ m := &dns.Msg{}
+ m.SetAxfr(transfer.xfrs[0].Zones[0])
- rcode, err := transfer.ServeDNS(ctx, w, dnsmsg)
+ _, err := transfer.ServeDNS(ctx, w, m)
if err != nil {
t.Error(err)
}
- if rcode != dns.RcodeRefused {
- t.Errorf("Expected REFUSED response code, got %s", dns.RcodeToString[rcode])
+ if w.Msg.Rcode != dns.RcodeRefused {
+ t.Errorf("Expected REFUSED response code, got %s", dns.RcodeToString[w.Msg.Rcode])
}
-
}