Commit 4fe39f9e authored by Miek Gieben's avatar Miek Gieben

Port tests from SkyDNS

This adds *most* of the tests from SkyDNS, things lacking is
the stubzone checking, groups and the trim prefix. These
will be added in subsequent PRs and in separate test files.
parent b45208e3
......@@ -24,6 +24,9 @@ type Etcd struct {
PathPrefix string
}
// Records looks up records in etcd. If exact is true, it will lookup just
// this name. This is used when find matches when completing SRV lookups
// for instance.
func (g Etcd) Records(name string, exact bool) ([]msg.Service, error) {
path, star := g.PathWithWildcard(name)
r, err := g.Get(path, true)
......
......@@ -197,15 +197,13 @@ func (e Etcd) SRV(zone string, state middleware.State) (records []dns.RR, extra
break
}
// Internal name, we should have some info on them, either v4 or v6
// Clients expect a complete answer, because we are a recursor in their
// view.
// Clients expect a complete answer, because we are a recursor in their view.
state1 := copyState(state, srv.Target, dns.TypeA)
// TODO(both is true here!
addr, e1 := e.A(zone, state1, nil)
if e1 == nil {
extra = append(extra, addr...)
}
// e.AAA(zone, state1, nil) as well...
// e.AAA(zone, state1, nil) as well...?
case ip.To4() != nil:
serv.Host = e.Domain(serv.Key)
srv := serv.NewSRV(state.QName(), weight)
......@@ -264,7 +262,6 @@ func (e Etcd) MX(zone string, state middleware.State) (records []dns.RR, extra [
break
}
// Internal name
// both is true here as well
state1 := copyState(state, mx.Mx, dns.TypeA)
addr, e1 := e.A(zone, state1, nil)
if e1 == nil {
......@@ -319,11 +316,15 @@ func (e Etcd) TXT(zone string, state middleware.State) (records []dns.RR, err er
}
// synthesis a SOA Record.
// TODO(miek): finish
func (e Etcd) SOA(zone string, state middleware.State) *dns.SOA {
header := dns.RR_Header{Name: zone, Rrtype: dns.TypeSOA, Ttl: 300, Class: dns.ClassINET}
return &dns.SOA{Hdr: header, Mbox: "hostmaster." + zone, Ns: "ns.dns." + zone}
}
// TODO(miek): NS records, DS and DNSKEY ones...? prolly so that the signing will
// work...
func isDuplicateCNAME(r *dns.CNAME, records []dns.RR) bool {
for _, rec := range records {
if v, ok := rec.(*dns.CNAME); ok {
......@@ -336,7 +337,7 @@ func isDuplicateCNAME(r *dns.CNAME, records []dns.RR) bool {
}
func copyState(state middleware.State, target string, typ uint16) middleware.State {
state1 := state
state1 := middleware.State{W: state.W, Req: state.Req.Copy()}
state1.Req.Question[0] = dns.Question{dns.Fqdn(target), dns.ClassINET, typ}
return state1
}
// +build net
// +build etcd
package etcd
......@@ -13,30 +13,28 @@ import (
// Note the key is encoded as DNS name, while in "reality" it is a etcd path.
var services = []*msg.Service{
{Host: "server1", Port: 8080, Key: "a.server1.dev.region1.skydns.test."},
{Host: "dev.server1", Port: 8080, Key: "a.server1.dev.region1.skydns.test."},
{Host: "10.0.0.1", Port: 8080, Key: "a.server1.prod.region1.skydns.test."},
{Host: "10.0.0.2", Port: 8080, Key: "b.server1.prod.region1.skydns.test."},
{Host: "::1", Port: 8080, Key: "b.server6.prod.region1.skydns.test."},
// CNAME dedup
{Host: "www.miek.nl", Key: "a.miek.nl.skydns.test."},
{Host: "www.miek.nl", Key: "b.miek.nl.skydns.test."},
// Unresolvable internal name
{Host: "unresolvable.skydns.test", Key: "cname.prod.region1.skydns.test."},
// priority
{Host: "server1", Priority: 333, Port: 8080, Key: "priority.skydns.test."},
{Host: "priority.server1", Priority: 333, Port: 8080, Key: "priority.skydns.test."},
// Subdomain
{Host: "server1", Port: 0, Key: "a.sub.region1.skydns.test."},
{Host: "server2", Port: 80, Key: "b.sub.region1.skydns.test."},
{Host: "sub.server1", Port: 0, Key: "a.sub.region1.skydns.test."},
{Host: "sub.server2", Port: 80, Key: "b.sub.region1.skydns.test."},
{Host: "10.0.0.1", Port: 8080, Key: "c.sub.region1.skydns.test."},
// Cname loop
{Host: "a.cname.skydns.test", Key: "b.cname.skydns.test."},
{Host: "b.cname.skydns.test", Key: "a.cname.skydns.test."},
}
var dnsTestCases = []dnsTestCase{
// SRV Test
{
Qname: "a.server1.dev.region1.skydns.test.", Qtype: dns.TypeSRV,
Answer: []dns.RR{newSRV("a.server1.dev.region1.skydns.test. 300 SRV 10 100 8080 server1.")},
Answer: []dns.RR{newSRV("a.server1.dev.region1.skydns.test. 300 SRV 10 100 8080 dev.server1.")},
},
// NXDOMAIN Test
{
......@@ -73,109 +71,80 @@ var dnsTestCases = []dnsTestCase{
// Priority Test
{
Qname: "priority.skydns.test.", Qtype: dns.TypeSRV,
Answer: []dns.RR{newSRV("priority.skydns.test. 300 SRV 333 100 8080 server1.")},
Answer: []dns.RR{newSRV("priority.skydns.test. 300 SRV 333 100 8080 priority.server1.")},
},
// Subdomain Test
{
Qname: "sub.region1.skydns.test.", Qtype: dns.TypeSRV,
Answer: []dns.RR{
newSRV("sub.region1.skydns.test. 300 IN SRV 10 33 0 server1."),
newSRV("sub.region1.skydns.test. 300 IN SRV 10 33 80 server2."),
newSRV("sub.region1.skydns.test. 300 IN SRV 10 33 0 sub.server1."),
newSRV("sub.region1.skydns.test. 300 IN SRV 10 33 80 sub.server2."),
newSRV("sub.region1.skydns.test. 300 IN SRV 10 33 8080 c.sub.region1.skydns.test."),
},
Extra: []dns.RR{newA("c.sub.region1.skydns.test. 300 IN A 10.0.0.1")},
},
// Multi SRV with the same target, should be dedupped.
{
Qname: "*.miek.nl.skydns.test.", Qtype: dns.TypeSRV,
Answer: []dns.RR{
newSRV("*.miek.nl.skydns.test. 300 IN SRV 10 100 0 www.miek.nl."),
},
// TODO(miek): bit stupid to rely on my home DNS setup for this...
Extra: []dns.RR{
// 303 ttl: don't care for the ttl on these RRs.
newA("a.miek.nl. 303 IN A 139.162.196.78"),
newAAAA("a.miek.nl. 303 IN AAAA 2a01:7e00::f03c:91ff:fef1:6735"),
newCNAME("www.miek.nl. 303 IN CNAME a.miek.nl."),
},
},
// CNAME (unresolvable internal name)
{
Qname: "cname.prod.region1.skydns.test.", Qtype: dns.TypeA,
Ns: []dns.RR{newSOA("skydns.test. 300 SOA ns.dns.skydns.test. hostmaster.skydns.test. 0 0 0 0 0")},
},
/*
// CNAME (resolvable external name)
{
Qname: "external1.cname.skydns.test.", Qtype: dns.TypeA,
Answer: []dns.RR{
newA("a.miek.nl. 60 IN A 139.162.196.78"),
newCNAME("external1.cname.skydns.test. 60 IN CNAME www.miek.nl."),
newCNAME("www.miek.nl. 60 IN CNAME a.miek.nl."),
},
},
// CNAME (unresolvable external name)
{
Qname: "external2.cname.skydns.test.", Qtype: dns.TypeA,
Answer: []dns.RR{},
Ns: []dns.RR{newSOA("skydns.test. 60 SOA ns.dns.skydns.test. hostmaster.skydns.test. 1407441600 28800 7200 604800 60")},
},
// CNAME loop detection
{
Qname: "3.cname.skydns.test.", Qtype: dns.TypeA,
Answer: []dns.RR{},
Ns: []dns.RR{newSOA("skydns.test. 60 SOA ns.dns.skydns.test. hostmaster.skydns.test. 1407441600 28800 7200 604800 60")},
},
// Wildcard Test
{
Qname: "*.region1.skydns.test.", Qtype: dns.TypeSRV,
Answer: []dns.RR{
newSRV("*.region1.skydns.test. 300 SRV 10 33 0 104.server1.dev.region1.skydns.test."),
newSRV("*.region1.skydns.test. 300 SRV 10 33 80 server2"),
newSRV("*.region1.skydns.test. 300 SRV 10 33 8080 server1.")},
Extra: []dns.RR{newA("104.server1.dev.region1.skydns.test. 300 A 10.0.0.1")},
},
// Wildcard Test
{
Qname: "prod.*.skydns.test.", Qtype: dns.TypeSRV,
Answer: []dns.RR{
newSRV("prod.*.skydns.test. 300 IN SRV 10 50 0 105.server3.prod.region2.skydns.test."),
newSRV("prod.*.skydns.test. 300 IN SRV 10 50 80 server2.")},
Extra: []dns.RR{newAAAA("105.server3.prod.region2.skydns.test. 300 IN AAAA 2001::8:8:8:8")},
// Wildcard Test
{
Qname: "*.region1.skydns.test.", Qtype: dns.TypeSRV,
Answer: []dns.RR{
newSRV("*.region1.skydns.test. 300 IN SRV 10 14 0 sub.server1."),
newSRV("*.region1.skydns.test. 300 IN SRV 10 14 0 unresolvable.skydns.test."),
newSRV("*.region1.skydns.test. 300 IN SRV 10 14 80 sub.server2."),
newSRV("*.region1.skydns.test. 300 IN SRV 10 14 8080 a.server1.prod.region1.skydns.test."),
newSRV("*.region1.skydns.test. 300 IN SRV 10 14 8080 b.server1.prod.region1.skydns.test."),
newSRV("*.region1.skydns.test. 300 IN SRV 10 14 8080 b.server6.prod.region1.skydns.test."),
newSRV("*.region1.skydns.test. 300 IN SRV 10 14 8080 dev.server1."),
},
// Wildcard Test
{
Qname: "prod.any.skydns.test.", Qtype: dns.TypeSRV,
Answer: []dns.RR{
newSRV("prod.any.skydns.test. 300 IN SRV 10 50 0 105.server3.prod.region2.skydns.test."),
newSRV("prod.any.skydns.test. 300 IN SRV 10 50 80 server2.")},
Extra: []dns.RR{newAAAA("105.server3.prod.region2.skydns.test. 300 IN AAAA 2001::8:8:8:8")},
Extra: []dns.RR{
newA("a.server1.prod.region1.skydns.test. 300 IN A 10.0.0.1"),
newA("b.server1.prod.region1.skydns.test. 300 IN A 10.0.0.2"),
newAAAA("b.server6.prod.region1.skydns.test. 300 IN AAAA ::1"),
},
// NODATA Test
{
Qname: "104.server1.dev.region1.skydns.test.", Qtype: dns.TypeTXT,
Ns: []dns.RR{newSOA("skydns.test. 300 SOA ns.dns.skydns.test. hostmaster.skydns.test. 0 0 0 0 0")},
},
// Wildcard Test
{
Qname: "prod.*.skydns.test.", Qtype: dns.TypeSRV,
Answer: []dns.RR{
newSRV("prod.*.skydns.test. 300 IN SRV 10 25 0 unresolvable.skydns.test."),
newSRV("prod.*.skydns.test. 300 IN SRV 10 25 8080 a.server1.prod.region1.skydns.test."),
newSRV("prod.*.skydns.test. 300 IN SRV 10 25 8080 b.server1.prod.region1.skydns.test."),
newSRV("prod.*.skydns.test. 300 IN SRV 10 25 8080 b.server6.prod.region1.skydns.test."),
},
// NODATA Test 2
{
Qname: "100.server1.dev.region1.skydns.test.", Qtype: dns.TypeA,
Rcode: dns.RcodeSuccess,
Ns: []dns.RR{newSOA("skydns.test. 300 SOA ns.dns.skydns.test. hostmaster.skydns.test. 0 0 0 0 0")},
Extra: []dns.RR{
newA("a.server1.prod.region1.skydns.test. 300 IN A 10.0.0.1"),
newA("b.server1.prod.region1.skydns.test. 300 IN A 10.0.0.2"),
newAAAA("b.server6.prod.region1.skydns.test. 300 IN AAAA ::1"),
},
{
// One has group, the other has not... Include the non-group always.
Qname: "dom2.skydns.test.", Qtype: dns.TypeA,
Answer: []dns.RR{
newA("dom2.skydns.test. IN A 127.0.0.1"),
newA("dom2.skydns.test. IN A 127.0.0.2"),
},
},
// Wildcard Test
{
Qname: "prod.any.skydns.test.", Qtype: dns.TypeSRV,
Answer: []dns.RR{
newSRV("prod.any.skydns.test. 300 IN SRV 10 25 0 unresolvable.skydns.test."),
newSRV("prod.any.skydns.test. 300 IN SRV 10 25 8080 a.server1.prod.region1.skydns.test."),
newSRV("prod.any.skydns.test. 300 IN SRV 10 25 8080 b.server1.prod.region1.skydns.test."),
newSRV("prod.any.skydns.test. 300 IN SRV 10 25 8080 b.server6.prod.region1.skydns.test."),
},
{
// The groups differ.
Qname: "dom1.skydns.test.", Qtype: dns.TypeA,
Answer: []dns.RR{
newA("dom1.skydns.test. IN A 127.0.0.1"),
},
Extra: []dns.RR{
newA("a.server1.prod.region1.skydns.test. 300 IN A 10.0.0.1"),
newA("b.server1.prod.region1.skydns.test. 300 IN A 10.0.0.2"),
newAAAA("b.server6.prod.region1.skydns.test. 300 IN AAAA ::1"),
},
*/
},
// CNAME loop detection
{
Qname: "a.cname.skydns.test.", Qtype: dns.TypeA,
Ns: []dns.RR{newSOA("skydns.test. 300 SOA ns.dns.skydns.test. hostmaster.skydns.test. 1407441600 28800 7200 604800 60")},
},
// NODATA Test
{
Qname: "a.server1.dev.region1.skydns.test.", Qtype: dns.TypeTXT,
Ns: []dns.RR{newSOA("skydns.test. 300 SOA ns.dns.skydns.test. hostmaster.skydns.test. 0 0 0 0 0")},
},
}
// +build etcd
package etcd
// etcd needs to be running on http://127.0.0.1:2379
......
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