aboutsummaryrefslogtreecommitdiff
path: root/plugin/dnstap/handler_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/dnstap/handler_test.go')
-rw-r--r--plugin/dnstap/handler_test.go67
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)
+ }
+}