diff options
Diffstat (limited to 'plugin/forward/health_test.go')
-rw-r--r-- | plugin/forward/health_test.go | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/plugin/forward/health_test.go b/plugin/forward/health_test.go new file mode 100644 index 000000000..2698d13e2 --- /dev/null +++ b/plugin/forward/health_test.go @@ -0,0 +1,136 @@ +package forward + +import ( + "sync/atomic" + "testing" + "time" + + "github.com/coredns/coredns/plugin/pkg/dnstest" + "github.com/coredns/coredns/plugin/test" + + "github.com/miekg/dns" + "golang.org/x/net/context" +) + +func TestHealth(t *testing.T) { + const expected = 0 + i := uint32(0) + s := dnstest.NewServer(func(w dns.ResponseWriter, r *dns.Msg) { + if r.Question[0].Name == "." { + atomic.AddUint32(&i, 1) + } + ret := new(dns.Msg) + ret.SetReply(r) + w.WriteMsg(ret) + }) + defer s.Close() + + p := NewProxy(s.Addr, nil /* no TLS */) + f := New() + f.SetProxy(p) + defer f.Close() + + req := new(dns.Msg) + req.SetQuestion("example.org.", dns.TypeA) + + f.ServeDNS(context.TODO(), &test.ResponseWriter{}, req) + + time.Sleep(1 * time.Second) + i1 := atomic.LoadUint32(&i) + if i1 != expected { + t.Errorf("Expected number of health checks to be %d, got %d", expected, i1) + } +} + +func TestHealthTimeout(t *testing.T) { + const expected = 1 + i := uint32(0) + s := dnstest.NewServer(func(w dns.ResponseWriter, r *dns.Msg) { + if r.Question[0].Name == "." { + // health check, answer + atomic.AddUint32(&i, 1) + ret := new(dns.Msg) + ret.SetReply(r) + w.WriteMsg(ret) + } + // not a health check, do a timeout + }) + defer s.Close() + + p := NewProxy(s.Addr, nil /* no TLS */) + f := New() + f.SetProxy(p) + defer f.Close() + + req := new(dns.Msg) + req.SetQuestion("example.org.", dns.TypeA) + + f.ServeDNS(context.TODO(), &test.ResponseWriter{}, req) + + time.Sleep(1 * time.Second) + i1 := atomic.LoadUint32(&i) + if i1 != expected { + t.Errorf("Expected number of health checks to be %d, got %d", expected, i1) + } +} + +func TestHealthFailTwice(t *testing.T) { + const expected = 2 + i := uint32(0) + s := dnstest.NewServer(func(w dns.ResponseWriter, r *dns.Msg) { + if r.Question[0].Name == "." { + atomic.AddUint32(&i, 1) + i1 := atomic.LoadUint32(&i) + // Timeout health until we get the second one + if i1 < 2 { + return + } + ret := new(dns.Msg) + ret.SetReply(r) + w.WriteMsg(ret) + } + }) + defer s.Close() + + p := NewProxy(s.Addr, nil /* no TLS */) + f := New() + f.SetProxy(p) + defer f.Close() + + req := new(dns.Msg) + req.SetQuestion("example.org.", dns.TypeA) + + f.ServeDNS(context.TODO(), &test.ResponseWriter{}, req) + + time.Sleep(3 * time.Second) + i1 := atomic.LoadUint32(&i) + if i1 != expected { + t.Errorf("Expected number of health checks to be %d, got %d", expected, i1) + } +} + +func TestHealthMaxFails(t *testing.T) { + const expected = 0 + i := uint32(0) + s := dnstest.NewServer(func(w dns.ResponseWriter, r *dns.Msg) { + // timeout + }) + defer s.Close() + + p := NewProxy(s.Addr, nil /* no TLS */) + f := New() + f.maxfails = 0 + f.SetProxy(p) + defer f.Close() + + req := new(dns.Msg) + req.SetQuestion("example.org.", dns.TypeA) + + f.ServeDNS(context.TODO(), &test.ResponseWriter{}, req) + + time.Sleep(1 * time.Second) + i1 := atomic.LoadUint32(&i) + if i1 != expected { + t.Errorf("Expected number of health checks to be %d, got %d", expected, i1) + } +} |