Commit 177e32b6 authored by Miek Gieben's avatar Miek Gieben Committed by Yong Tang

plugin/forward: add REFUSED test (#1878)

add a test to see if we copy the rcode correctly. Some minor cleanup in
import ordering and renaming NewUpstream to New as we already are in the
upstream package.
parent 70c957d8
...@@ -153,7 +153,7 @@ func autoParse(c *caddy.Controller) (Auto, error) { ...@@ -153,7 +153,7 @@ func autoParse(c *caddy.Controller) (Auto, error) {
return a, c.ArgErr() return a, c.ArgErr()
} }
var err error var err error
a.loader.upstream, err = upstream.NewUpstream(args) a.loader.upstream, err = upstream.New(args)
if err != nil { if err != nil {
return a, err return a, err
} }
......
...@@ -95,7 +95,7 @@ func etcdParse(c *caddy.Controller) (*Etcd, bool, error) { ...@@ -95,7 +95,7 @@ func etcdParse(c *caddy.Controller) (*Etcd, bool, error) {
if len(args) == 0 { if len(args) == 0 {
return nil, false, c.ArgErr() return nil, false, c.ArgErr()
} }
u, err := upstream.NewUpstream(args) u, err := upstream.New(args)
if err != nil { if err != nil {
return nil, false, err return nil, false, err
} }
......
...@@ -74,7 +74,7 @@ func TestLookupCNAMEExternal(t *testing.T) { ...@@ -74,7 +74,7 @@ func TestLookupCNAMEExternal(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("Expected no error when reading zone, got %q", err) t.Fatalf("Expected no error when reading zone, got %q", err)
} }
zone.Upstream, _ = upstream.NewUpstream([]string{"8.8.8.8:53"}) // TODO(miek): point to local instance zone.Upstream, _ = upstream.New([]string{"8.8.8.8:53"}) // TODO(miek): point to local instance
fm := File{Next: test.ErrorHandler(), Zones: Zones{Z: map[string]*Zone{name: zone}, Names: []string{name}}} fm := File{Next: test.ErrorHandler(), Zones: Zones{Z: map[string]*Zone{name: zone}, Names: []string{name}}}
ctx := context.TODO() ctx := context.TODO()
......
...@@ -110,7 +110,7 @@ func fileParse(c *caddy.Controller) (Zones, error) { ...@@ -110,7 +110,7 @@ func fileParse(c *caddy.Controller) (Zones, error) {
case "upstream": case "upstream":
args := c.RemainingArgs() args := c.RemainingArgs()
upstr, err = upstream.NewUpstream(args) upstr, err = upstream.New(args)
if err != nil { if err != nil {
return Zones{}, err return Zones{}, err
} }
......
...@@ -41,3 +41,28 @@ func TestForward(t *testing.T) { ...@@ -41,3 +41,28 @@ func TestForward(t *testing.T) {
t.Errorf("Expected 127.0.0.1, got: %s", resp.Answer[0].(*dns.A).A.String()) t.Errorf("Expected 127.0.0.1, got: %s", resp.Answer[0].(*dns.A).A.String())
} }
} }
func TestForwardRefused(t *testing.T) {
s := dnstest.NewServer(func(w dns.ResponseWriter, r *dns.Msg) {
ret := new(dns.Msg)
ret.SetReply(r)
ret.Rcode = dns.RcodeRefused
w.WriteMsg(ret)
})
defer s.Close()
p := NewProxy(s.Addr, nil)
f := New()
f.SetProxy(p)
defer f.Close()
state := request.Request{W: &test.ResponseWriter{}, Req: new(dns.Msg)}
state.Req.SetQuestion("example.org.", dns.TypeA)
resp, err := f.Forward(state)
if err != nil {
t.Fatal("Expected to receive reply, but didn't")
}
if resp.Rcode != dns.RcodeRefused {
t.Errorf("Expected rcode to be %d, got %d", dns.RcodeRefused, resp.Rcode)
}
}
...@@ -218,7 +218,7 @@ func ParseStanza(c *caddy.Controller) (*Kubernetes, error) { ...@@ -218,7 +218,7 @@ func ParseStanza(c *caddy.Controller) (*Kubernetes, error) {
k8s.Fall.SetZonesFromArgs(c.RemainingArgs()) k8s.Fall.SetZonesFromArgs(c.RemainingArgs())
case "upstream": case "upstream":
args := c.RemainingArgs() args := c.RemainingArgs()
u, err := upstream.NewUpstream(args) u, err := upstream.New(args)
if err != nil { if err != nil {
return nil, err return nil, err
} }
......
...@@ -18,9 +18,9 @@ type Upstream struct { ...@@ -18,9 +18,9 @@ type Upstream struct {
Forward *proxy.Proxy Forward *proxy.Proxy
} }
// NewUpstream creates a new Upstream for given destination(s). If dests is empty // New creates a new Upstream for given destination(s). If dests is empty it default to upstreaming to
// it default to upstreaming to Self. // the coredns process.
func NewUpstream(dests []string) (Upstream, error) { func New(dests []string) (Upstream, error) {
u := Upstream{} u := Upstream{}
if len(dests) == 0 { if len(dests) == 0 {
u.self = true u.self = true
......
...@@ -9,7 +9,12 @@ import ( ...@@ -9,7 +9,12 @@ import (
"testing" "testing"
"time" "time"
"github.com/coredns/coredns/plugin/pkg/dnstest"
"github.com/coredns/coredns/plugin/test"
"github.com/coredns/coredns/request"
"github.com/mholt/caddy/caddyfile" "github.com/mholt/caddy/caddyfile"
"github.com/miekg/dns"
) )
func TestStop(t *testing.T) { func TestStop(t *testing.T) {
...@@ -70,3 +75,25 @@ func TestStop(t *testing.T) { ...@@ -70,3 +75,25 @@ func TestStop(t *testing.T) {
}) })
} }
} }
func TestProxyRefused(t *testing.T) {
s := dnstest.NewServer(func(w dns.ResponseWriter, r *dns.Msg) {
ret := new(dns.Msg)
ret.SetReply(r)
ret.Rcode = dns.RcodeRefused
w.WriteMsg(ret)
})
defer s.Close()
p := NewLookup([]string{s.Addr})
state := request.Request{W: &test.ResponseWriter{}, Req: new(dns.Msg)}
state.Req.SetQuestion("example.org.", dns.TypeA)
resp, err := p.Forward(state)
if err != nil {
t.Fatal("Expected to receive reply, but didn't")
}
if resp.Rcode != dns.RcodeRefused {
t.Errorf("Expected rcode to be %d, got %d", dns.RcodeRefused, resp.Rcode)
}
}
...@@ -81,7 +81,7 @@ func secondaryParse(c *caddy.Controller) (file.Zones, error) { ...@@ -81,7 +81,7 @@ func secondaryParse(c *caddy.Controller) (file.Zones, error) {
case "upstream": case "upstream":
args := c.RemainingArgs() args := c.RemainingArgs()
var err error var err error
upstr, err = upstream.NewUpstream(args) upstr, err = upstream.New(args)
if err != nil { if err != nil {
return file.Zones{}, err return file.Zones{}, err
} }
......
...@@ -145,7 +145,7 @@ func templateParse(c *caddy.Controller) (handler Handler, err error) { ...@@ -145,7 +145,7 @@ func templateParse(c *caddy.Controller) (handler Handler, err error) {
case "upstream": case "upstream":
args := c.RemainingArgs() args := c.RemainingArgs()
u, err := upstream.NewUpstream(args) u, err := upstream.New(args)
if err != nil { if err != nil {
return handler, err return handler, err
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment