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.
This commit is contained in:
Miek Gieben 2018-06-15 16:12:56 +01:00 committed by Yong Tang
parent 70c957d885
commit 177e32b62e
10 changed files with 62 additions and 10 deletions

View file

@ -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
} }

View file

@ -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
} }

View file

@ -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()

View file

@ -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
} }

View file

@ -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)
}
}

View file

@ -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
} }

View file

@ -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

View file

@ -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) {
}) })
} }
} }
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)
}
}

View file

@ -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
} }

View file

@ -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
} }