Make the receiver a pointer so that the uptdateStubZones map update will retain the stubzones found, unlike the current case where the update will be applied and then promptly forgotten, because it is working on a copy. Add test/etcd_test.go to test a large part of the code. This didn't catch the chaos middleware hack though. The chaos middleware zones are now *not* automatically added. You have to take care of that by yourself (docs updates). When using debug queries and falling through to the next middleware in etcd, restore the original (with o-o.debug) query before passing it on.
96 lines
2.7 KiB
Go
96 lines
2.7 KiB
Go
// +build etcd
|
|
|
|
package etcd
|
|
|
|
import (
|
|
"sort"
|
|
"testing"
|
|
|
|
"github.com/miekg/coredns/middleware"
|
|
"github.com/miekg/coredns/middleware/etcd/msg"
|
|
"github.com/miekg/coredns/middleware/test"
|
|
|
|
"github.com/miekg/dns"
|
|
)
|
|
|
|
func TestStubLookup(t *testing.T) {
|
|
for _, serv := range servicesStub {
|
|
set(t, etc, serv.Key, 0, serv)
|
|
defer delete(t, etc, serv.Key)
|
|
}
|
|
etc.updateStubZones()
|
|
defer func() { etc.Stubmap = nil }()
|
|
|
|
for _, tc := range dnsTestCasesStub {
|
|
m := tc.Msg()
|
|
|
|
rec := middleware.NewResponseRecorder(&test.ResponseWriter{})
|
|
_, err := etc.ServeDNS(ctxt, rec, m)
|
|
if err != nil {
|
|
if tc.Rcode != dns.RcodeServerFailure {
|
|
t.Errorf("expected no error, got %v\n", err)
|
|
}
|
|
// This is OK, we expect this backend to *not* work.
|
|
continue
|
|
}
|
|
resp := rec.Msg()
|
|
if resp == nil {
|
|
// etcd not running?
|
|
continue
|
|
}
|
|
|
|
sort.Sort(test.RRSet(resp.Answer))
|
|
sort.Sort(test.RRSet(resp.Ns))
|
|
sort.Sort(test.RRSet(resp.Extra))
|
|
|
|
if !test.Header(t, tc, resp) {
|
|
t.Logf("%v\n", resp)
|
|
continue
|
|
}
|
|
if !test.Section(t, tc, test.Answer, resp.Answer) {
|
|
t.Logf("%v\n", resp)
|
|
}
|
|
if !test.Section(t, tc, test.Ns, resp.Ns) {
|
|
t.Logf("%v\n", resp)
|
|
}
|
|
if !test.Section(t, tc, test.Extra, resp.Extra) {
|
|
t.Logf("%v\n", resp)
|
|
}
|
|
}
|
|
}
|
|
|
|
var servicesStub = []*msg.Service{
|
|
// Two tests, ask a question that should return servfail because remote it no accessible
|
|
// and one with edns0 option added, that should return refused.
|
|
{Host: "127.0.0.1", Port: 666, Key: "b.example.org.stub.dns.skydns.test."},
|
|
// Actual test that goes out to the internet.
|
|
{Host: "199.43.132.53", Key: "a.example.net.stub.dns.skydns.test."},
|
|
}
|
|
|
|
var dnsTestCasesStub = []test.Case{
|
|
{
|
|
Qname: "example.org.", Qtype: dns.TypeA, Rcode: dns.RcodeServerFailure,
|
|
},
|
|
{
|
|
Qname: "example.net.", Qtype: dns.TypeA,
|
|
Answer: []dns.RR{test.A("example.net. 86400 IN A 93.184.216.34")},
|
|
Ns: []dns.RR{
|
|
test.NS("example.net. 86400 IN NS a.iana-servers.net."),
|
|
test.NS("example.net. 86400 IN NS b.iana-servers.net."),
|
|
},
|
|
Extra: []dns.RR{test.OPT(4096, false)}, // This will have an EDNS0 section, because *we* added our local stub forward to detect loops.
|
|
},
|
|
{
|
|
Qname: "example.net.", Qtype: dns.TypeA, Do: true,
|
|
Answer: []dns.RR{
|
|
test.A("example.net. 86400 IN A 93.184.216.34"),
|
|
test.RRSIG("example.net. 86400 IN RRSIG A 8 2 86400 20160428060557 20160406182909 40948 example.net. Vm+rH5KN"),
|
|
},
|
|
Ns: []dns.RR{
|
|
test.NS("example.net. 86400 IN NS a.iana-servers.net."),
|
|
test.NS("example.net. 86400 IN NS b.iana-servers.net."),
|
|
test.RRSIG("example.net. 86400 IN RRSIG NS 8 2 86400 20160428110538 20160407002909 40948 example.net. z74YR2"),
|
|
},
|
|
Extra: []dns.RR{test.OPT(4096, true)},
|
|
},
|
|
}
|