diff options
Diffstat (limited to 'plugin/dnstap/handler_test.go')
-rw-r--r-- | plugin/dnstap/handler_test.go | 67 |
1 files changed, 63 insertions, 4 deletions
diff --git a/plugin/dnstap/handler_test.go b/plugin/dnstap/handler_test.go index 617c8e675..3809bc4d0 100644 --- a/plugin/dnstap/handler_test.go +++ b/plugin/dnstap/handler_test.go @@ -1,8 +1,12 @@ package dnstap import ( + "errors" + "net" + "strings" "testing" + "github.com/coredns/coredns/plugin" "github.com/coredns/coredns/plugin/dnstap/test" mwtest "github.com/coredns/coredns/plugin/test" @@ -20,8 +24,8 @@ func testCase(t *testing.T, tapq, tapr *tap.Message, q, r *dns.Msg) { return 0, w.WriteMsg(r) }), - IO: &w, - Pack: false, + IO: &w, + JoinRawMessage: false, } _, err := h.ServeDNS(context.TODO(), &mwtest.ResponseWriter{}, q) if err != nil { @@ -52,7 +56,62 @@ func TestDnstap(t *testing.T) { mwtest.A("example.org. 3600 IN A 10.0.0.1"), }, }.Msg() - tapq := test.TestingData().ToClientQuery() - tapr := test.TestingData().ToClientResponse() + tapq, _ := test.TestingData().ToClientQuery() + tapr, _ := test.TestingData().ToClientResponse() testCase(t, tapq, tapr, q, r) } + +type noWriter struct { +} + +func (n noWriter) Dnstap(d tap.Dnstap) { +} + +func endWith(c int, err error) plugin.Handler { + return mwtest.HandlerFunc(func(_ context.Context, w dns.ResponseWriter, _ *dns.Msg) (int, error) { + w.WriteMsg(nil) // trigger plugin dnstap to log client query and response + // maybe dnstap should log the client query when no message is written... + return c, err + }) +} + +type badAddr struct { +} + +func (bad badAddr) Network() string { + return "bad network" +} +func (bad badAddr) String() string { + return "bad address" +} + +type badRW struct { + dns.ResponseWriter +} + +func (bad *badRW) RemoteAddr() net.Addr { + return badAddr{} +} + +func TestError(t *testing.T) { + h := Dnstap{ + Next: endWith(0, nil), + IO: noWriter{}, + JoinRawMessage: false, + } + rw := &badRW{&mwtest.ResponseWriter{}} + + // the dnstap error will show only if there is no plugin error + _, err := h.ServeDNS(context.TODO(), rw, nil) + if err == nil || !strings.HasPrefix(err.Error(), "plugin/dnstap") { + t.Fatal("must return the dnstap error but have:", err) + } + + // plugin errors will always overwrite dnstap errors + pluginErr := errors.New("plugin error") + h.Next = endWith(0, pluginErr) + _, err = h.ServeDNS(context.TODO(), rw, nil) + if err != pluginErr { + t.Fatal("must return the plugin error but have:", err) + } +} |