coredns/test/file_upstream_test.go
Miek Gieben 26c41a0c17
plugin/file: fix local CNAME lookup (#1866)
* plugin/file: fix local CNAME lookup

Issue #1864 explains it will, when we serve the child zone as well we
should just recursive into ourself (upstream self). Thus relax the
IsSubDomain check in file/lookup.go and just query (even if the query
will hit a remote server).

I've looped over all other plugins that do something similar (CNAME
resolving) and they didn't do the IsSubDomain check; therefor I've
removed it from *file* as well.

Added test in file_upstream_test that shows this failed before but now
results in a reply.

Fixes #1864

* self does not need to be exported

* Fix test

We don't know if we had a valid reply. Check this.
2018-06-12 14:54:37 +01:00

119 lines
2.8 KiB
Go

package test
import (
"testing"
"github.com/miekg/dns"
)
func TestFileUpstream(t *testing.T) {
name, rm, err := TempFile(".", `$ORIGIN example.org.
@ 3600 IN SOA sns.dns.icann.org. noc.dns.icann.org. (
2017042745 ; serial
7200 ; refresh (2 hours)
3600 ; retry (1 hour)
1209600 ; expire (2 weeks)
3600 ; minimum (1 hour)
)
3600 IN NS a.iana-servers.net.
3600 IN NS b.iana-servers.net.
www 3600 IN CNAME www.example.net.
`)
if err != nil {
t.Fatalf("Failed to create zone: %s", err)
}
defer rm()
corefile := `.:0 {
file ` + name + ` example.org {
upstream
}
hosts {
10.0.0.1 www.example.net.
fallthrough
}
}
`
i, udp, _, err := CoreDNSServerAndPorts(corefile)
if err != nil {
t.Fatalf("Could not get CoreDNS serving instance: %s", err)
}
defer i.Stop()
m := new(dns.Msg)
m.SetQuestion("www.example.org.", dns.TypeA)
m.SetEdns0(4096, true)
r, err := dns.Exchange(m, udp)
if err != nil {
t.Fatalf("Could not exchange msg: %s", err)
}
if r.Rcode == dns.RcodeServerFailure {
t.Fatalf("Rcode should not be dns.RcodeServerFailure")
}
if x := r.Answer[1].(*dns.A).A.String(); x != "10.0.0.1" {
t.Errorf("Failed to get address for CNAME, expected 10.0.0.1 got %s", x)
}
}
// TestFileUpstreamAdditional runs two CoreDNS servers that serve example.org and foo.example.org.
// example.org contains a cname to foo.example.org; this should be resolved via upstream.Self.
func TestFileUpstreamAdditional(t *testing.T) {
name, rm, err := TempFile(".", `$ORIGIN example.org.
@ 3600 IN SOA sns.dns.icann.org. noc.dns.icann.org. 2017042745 7200 3600 1209600 3600
3600 IN NS b.iana-servers.net.
www 3600 IN CNAME www.foo
`)
if err != nil {
t.Fatalf("Failed to create zone: %s", err)
}
defer rm()
name2, rm2, err2 := TempFile(".", `$ORIGIN foo.example.org.
@ 3600 IN SOA sns.dns.icann.org. noc.dns.icann.org. 2017042745 7200 3600 1209600 3600
3600 IN NS b.iana-servers.net.
www 3600 IN A 127.0.0.53
`)
if err2 != nil {
t.Fatalf("Failed to create zone: %s", err2)
}
defer rm2()
corefile := `.:0 {
file ` + name + ` example.org {
upstream
}
file ` + name2 + ` foo.example.org {
upstream
}
}
`
i, udp, _, err := CoreDNSServerAndPorts(corefile)
if err != nil {
t.Fatalf("Could not get CoreDNS serving instance: %s", err)
}
defer i.Stop()
m := new(dns.Msg)
m.SetQuestion("www.example.org.", dns.TypeA)
r, err := dns.Exchange(m, udp)
if err != nil {
t.Fatalf("Could not exchange msg: %s", err)
}
if r.Rcode == dns.RcodeServerFailure {
t.Fatalf("Rcode should not be dns.RcodeServerFailure")
}
if x := len(r.Answer); x != 2 {
t.Errorf("Expected 2 RR in reply, got %d", x)
}
if x := r.Answer[1].(*dns.A).A.String(); x != "127.0.0.53" {
t.Errorf("Failed to get address for CNAME, expected 127.0.0.53, got %s", x)
}
}