aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/etcd_test.go11
-rw-r--r--test/fail_start_test.go21
-rw-r--r--test/file.go20
-rw-r--r--test/file_test.go11
-rw-r--r--test/helpers.go250
-rw-r--r--test/helpers_test.go5
-rw-r--r--test/kubernetes_test.go29
-rw-r--r--test/middleware_dnssec_test.go7
-rw-r--r--test/middleware_test.go8
-rw-r--r--test/proxy_test.go17
-rw-r--r--test/responsewriter.go28
-rw-r--r--test/server.go91
-rw-r--r--test/server_test.go18
-rw-r--r--test/tests.go18
14 files changed, 461 insertions, 73 deletions
diff --git a/test/etcd_test.go b/test/etcd_test.go
index ceec936e7..6beb4cff2 100644
--- a/test/etcd_test.go
+++ b/test/etcd_test.go
@@ -46,13 +46,18 @@ func TestEtcdStubAndProxyLookup(t *testing.T) {
proxy . 8.8.8.8:53
}`
- etc := etcdMiddleware()
- ex, _, udp, err := Server(t, corefile)
+ ex, err := CoreDNSServer(corefile)
if err != nil {
- t.Fatalf("Could get server: %s", err)
+ t.Fatalf("could not get CoreDNS serving instance: %s", err)
+ }
+
+ udp, _ := CoreDNSServerPorts(ex, 0)
+ if udp == "" {
+ t.Fatalf("could not get udp listening port")
}
defer ex.Stop()
+ etc := etcdMiddleware()
log.SetOutput(ioutil.Discard)
var ctx = context.TODO()
diff --git a/test/fail_start_test.go b/test/fail_start_test.go
deleted file mode 100644
index aa1b137af..000000000
--- a/test/fail_start_test.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package test
-
-import (
- "testing"
-
- "github.com/miekg/coredns/core"
-)
-
-// Bind to low port should fail.
-func TestFailStartServer(t *testing.T) {
- corefile := `.:53 {
- chaos CoreDNS-001 miek@miek.nl
-}
-`
- srv, _ := core.TestServer(t, corefile)
- err := srv.ListenAndServe()
- if err == nil {
- srv.Stop()
- t.Fatalf("Low port startup should fail")
- }
-}
diff --git a/test/file.go b/test/file.go
new file mode 100644
index 000000000..b6068a32b
--- /dev/null
+++ b/test/file.go
@@ -0,0 +1,20 @@
+package test
+
+import (
+ "io/ioutil"
+ "os"
+ "testing"
+)
+
+// TempFile will create a temporary file on disk and returns the name and a cleanup function to remove it later.
+func TempFile(t *testing.T, dir, content string) (string, func(), error) {
+ f, err := ioutil.TempFile(dir, "go-test-tmpfile")
+ if err != nil {
+ return "", nil, err
+ }
+ if err := ioutil.WriteFile(f.Name(), []byte(content), 0644); err != nil {
+ return "", nil, err
+ }
+ rmFunc := func() { os.Remove(f.Name()) }
+ return f.Name(), rmFunc, nil
+}
diff --git a/test/file_test.go b/test/file_test.go
new file mode 100644
index 000000000..950ea7cff
--- /dev/null
+++ b/test/file_test.go
@@ -0,0 +1,11 @@
+package test
+
+import "testing"
+
+func TestTempFile(t *testing.T) {
+ _, f, e := TempFile(t, ".", "test")
+ if e != nil {
+ t.Fatalf("failed to create temp file: %s", e)
+ }
+ defer f()
+}
diff --git a/test/helpers.go b/test/helpers.go
new file mode 100644
index 000000000..01a6f156b
--- /dev/null
+++ b/test/helpers.go
@@ -0,0 +1,250 @@
+package test
+
+import (
+ "testing"
+
+ "github.com/miekg/dns"
+ "golang.org/x/net/context"
+)
+
+type Sect int
+
+const (
+ Answer Sect = iota
+ Ns
+ Extra
+)
+
+type RRSet []dns.RR
+
+func (p RRSet) Len() int { return len(p) }
+func (p RRSet) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
+func (p RRSet) Less(i, j int) bool { return p[i].String() < p[j].String() }
+
+// If the TTL of a record is 303 we don't care what the TTL is.
+type Case struct {
+ Qname string
+ Qtype uint16
+ Rcode int
+ Do bool
+ Answer []dns.RR
+ Ns []dns.RR
+ Extra []dns.RR
+}
+
+func (c Case) Msg() *dns.Msg {
+ m := new(dns.Msg)
+ m.SetQuestion(dns.Fqdn(c.Qname), c.Qtype)
+ if c.Do {
+ o := new(dns.OPT)
+ o.Hdr.Name = "."
+ o.Hdr.Rrtype = dns.TypeOPT
+ o.SetDo()
+ o.SetUDPSize(4096)
+ m.Extra = []dns.RR{o}
+ }
+ return m
+}
+
+func A(rr string) *dns.A { r, _ := dns.NewRR(rr); return r.(*dns.A) }
+func AAAA(rr string) *dns.AAAA { r, _ := dns.NewRR(rr); return r.(*dns.AAAA) }
+func CNAME(rr string) *dns.CNAME { r, _ := dns.NewRR(rr); return r.(*dns.CNAME) }
+func SRV(rr string) *dns.SRV { r, _ := dns.NewRR(rr); return r.(*dns.SRV) }
+func SOA(rr string) *dns.SOA { r, _ := dns.NewRR(rr); return r.(*dns.SOA) }
+func NS(rr string) *dns.NS { r, _ := dns.NewRR(rr); return r.(*dns.NS) }
+func PTR(rr string) *dns.PTR { r, _ := dns.NewRR(rr); return r.(*dns.PTR) }
+func TXT(rr string) *dns.TXT { r, _ := dns.NewRR(rr); return r.(*dns.TXT) }
+func MX(rr string) *dns.MX { r, _ := dns.NewRR(rr); return r.(*dns.MX) }
+func RRSIG(rr string) *dns.RRSIG { r, _ := dns.NewRR(rr); return r.(*dns.RRSIG) }
+func NSEC(rr string) *dns.NSEC { r, _ := dns.NewRR(rr); return r.(*dns.NSEC) }
+func DNSKEY(rr string) *dns.DNSKEY { r, _ := dns.NewRR(rr); return r.(*dns.DNSKEY) }
+
+func OPT(bufsize int, do bool) *dns.OPT {
+ o := new(dns.OPT)
+ o.Hdr.Name = "."
+ o.Hdr.Rrtype = dns.TypeOPT
+ o.SetVersion(0)
+ o.SetUDPSize(uint16(bufsize))
+ if do {
+ o.SetDo()
+ }
+ return o
+}
+
+func Header(t *testing.T, tc Case, resp *dns.Msg) bool {
+ if resp.Rcode != tc.Rcode {
+ t.Errorf("rcode is %q, expected %q", dns.RcodeToString[resp.Rcode], dns.RcodeToString[tc.Rcode])
+ return false
+ }
+
+ if len(resp.Answer) != len(tc.Answer) {
+ t.Errorf("answer for %q contained %d results, %d expected", tc.Qname, len(resp.Answer), len(tc.Answer))
+ return false
+ }
+ if len(resp.Ns) != len(tc.Ns) {
+ t.Errorf("authority for %q contained %d results, %d expected", tc.Qname, len(resp.Ns), len(tc.Ns))
+ return false
+ }
+ if len(resp.Extra) != len(tc.Extra) {
+ t.Errorf("additional for %q contained %d results, %d expected", tc.Qname, len(resp.Extra), len(tc.Extra))
+ return false
+ }
+ return true
+}
+
+func Section(t *testing.T, tc Case, sect Sect, rr []dns.RR) bool {
+ section := []dns.RR{}
+ switch sect {
+ case 0:
+ section = tc.Answer
+ case 1:
+ section = tc.Ns
+ case 2:
+ section = tc.Extra
+ }
+
+ for i, a := range rr {
+ if a.Header().Name != section[i].Header().Name {
+ t.Errorf("rr %d should have a Header Name of %q, but has %q", i, section[i].Header().Name, a.Header().Name)
+ return false
+ }
+ // 303 signals: don't care what the ttl is.
+ if section[i].Header().Ttl != 303 && a.Header().Ttl != section[i].Header().Ttl {
+ if _, ok := section[i].(*dns.OPT); !ok {
+ // we check edns0 bufize on this one
+ t.Errorf("rr %d should have a Header TTL of %d, but has %d", i, section[i].Header().Ttl, a.Header().Ttl)
+ return false
+ }
+ }
+ if a.Header().Rrtype != section[i].Header().Rrtype {
+ t.Errorf("rr %d should have a header rr type of %d, but has %d", i, section[i].Header().Rrtype, a.Header().Rrtype)
+ return false
+ }
+
+ switch x := a.(type) {
+ case *dns.SRV:
+ if x.Priority != section[i].(*dns.SRV).Priority {
+ t.Errorf("rr %d should have a Priority of %d, but has %d", i, section[i].(*dns.SRV).Priority, x.Priority)
+ return false
+ }
+ if x.Weight != section[i].(*dns.SRV).Weight {
+ t.Errorf("rr %d should have a Weight of %d, but has %d", i, section[i].(*dns.SRV).Weight, x.Weight)
+ return false
+ }
+ if x.Port != section[i].(*dns.SRV).Port {
+ t.Errorf("rr %d should have a Port of %d, but has %d", i, section[i].(*dns.SRV).Port, x.Port)
+ return false
+ }
+ if x.Target != section[i].(*dns.SRV).Target {
+ t.Errorf("rr %d should have a Target of %q, but has %q", i, section[i].(*dns.SRV).Target, x.Target)
+ return false
+ }
+ case *dns.RRSIG:
+ if x.TypeCovered != section[i].(*dns.RRSIG).TypeCovered {
+ t.Errorf("rr %d should have a TypeCovered of %d, but has %d", i, section[i].(*dns.RRSIG).TypeCovered, x.TypeCovered)
+ return false
+ }
+ if x.Labels != section[i].(*dns.RRSIG).Labels {
+ t.Errorf("rr %d should have a Labels of %d, but has %d", i, section[i].(*dns.RRSIG).Labels, x.Labels)
+ return false
+ }
+ if x.SignerName != section[i].(*dns.RRSIG).SignerName {
+ t.Errorf("rr %d should have a SignerName of %d, but has %d", i, section[i].(*dns.RRSIG).SignerName, x.SignerName)
+ return false
+ }
+ case *dns.NSEC:
+ if x.NextDomain != section[i].(*dns.NSEC).NextDomain {
+ t.Errorf("rr %d should have a NextDomain of %d, but has %d", i, section[i].(*dns.NSEC).NextDomain, x.NextDomain)
+ return false
+ }
+ // TypeBitMap
+ case *dns.A:
+ if x.A.String() != section[i].(*dns.A).A.String() {
+ t.Errorf("rr %d should have a Address of %q, but has %q", i, section[i].(*dns.A).A.String(), x.A.String())
+ return false
+ }
+ case *dns.AAAA:
+ if x.AAAA.String() != section[i].(*dns.AAAA).AAAA.String() {
+ t.Errorf("rr %d should have a Address of %q, but has %q", i, section[i].(*dns.AAAA).AAAA.String(), x.AAAA.String())
+ return false
+ }
+ case *dns.TXT:
+ for j, txt := range x.Txt {
+ if txt != section[i].(*dns.TXT).Txt[j] {
+ t.Errorf("rr %d should have a Txt of %q, but has %q", i, section[i].(*dns.TXT).Txt[j], txt)
+ return false
+ }
+ }
+ case *dns.SOA:
+ tt := section[i].(*dns.SOA)
+ if x.Ns != tt.Ns {
+ t.Errorf("SOA nameserver should be %q, but is %q", x.Ns, tt.Ns)
+ return false
+ }
+ case *dns.PTR:
+ tt := section[i].(*dns.PTR)
+ if x.Ptr != tt.Ptr {
+ t.Errorf("PTR ptr should be %q, but is %q", x.Ptr, tt.Ptr)
+ return false
+ }
+ case *dns.CNAME:
+ tt := section[i].(*dns.CNAME)
+ if x.Target != tt.Target {
+ t.Errorf("CNAME target should be %q, but is %q", x.Target, tt.Target)
+ return false
+ }
+ case *dns.MX:
+ tt := section[i].(*dns.MX)
+ if x.Mx != tt.Mx {
+ t.Errorf("MX Mx should be %q, but is %q", x.Mx, tt.Mx)
+ return false
+ }
+ if x.Preference != tt.Preference {
+ t.Errorf("MX Preference should be %q, but is %q", x.Preference, tt.Preference)
+ return false
+ }
+ case *dns.NS:
+ tt := section[i].(*dns.NS)
+ if x.Ns != tt.Ns {
+ t.Errorf("NS nameserver should be %q, but is %q", x.Ns, tt.Ns)
+ return false
+ }
+ case *dns.OPT:
+ tt := section[i].(*dns.OPT)
+ if x.UDPSize() != tt.UDPSize() {
+ t.Errorf("OPT UDPSize should be %d, but is %d", tt.UDPSize(), x.UDPSize())
+ return false
+ }
+ if x.Do() != tt.Do() {
+ t.Errorf("OPT DO should be %t, but is %t", tt.Do(), x.Do())
+ return false
+ }
+ }
+ }
+ return true
+}
+
+func ErrorHandler() Handler {
+ return HandlerFunc(func(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
+ m := new(dns.Msg)
+ m.SetRcode(r, dns.RcodeServerFailure)
+ w.WriteMsg(m)
+ return dns.RcodeServerFailure, nil
+ })
+}
+
+// Copied here to prevent an import cycle.
+type (
+ // HandlerFunc is a convenience type like dns.HandlerFunc, except
+ // ServeDNS returns an rcode and an error.
+ HandlerFunc func(context.Context, dns.ResponseWriter, *dns.Msg) (int, error)
+
+ Handler interface {
+ ServeDNS(context.Context, dns.ResponseWriter, *dns.Msg) (int, error)
+ }
+)
+
+// ServeDNS implements the Handler interface.
+func (f HandlerFunc) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
+ return f(ctx, w, r)
+}
diff --git a/test/helpers_test.go b/test/helpers_test.go
new file mode 100644
index 000000000..2aa1fe106
--- /dev/null
+++ b/test/helpers_test.go
@@ -0,0 +1,5 @@
+package test
+
+import "testing"
+
+func TestA(t *testing.T) { A("miek.nl. IN A 127.0.0.1") } // should not crash
diff --git a/test/kubernetes_test.go b/test/kubernetes_test.go
index 55939e350..009b50657 100644
--- a/test/kubernetes_test.go
+++ b/test/kubernetes_test.go
@@ -3,12 +3,12 @@
package test
import (
- "fmt"
"io/ioutil"
"log"
"testing"
"github.com/miekg/coredns/middleware/kubernetes/k8stest"
+
"github.com/miekg/dns"
)
@@ -64,9 +64,8 @@ var testdataLookupSRV = []struct {
}
func TestK8sIntegration(t *testing.T) {
- t.Log(" === RUN testLookupA")
+ // subtests here (Go 1.7 feature).
testLookupA(t)
- t.Log(" === RUN testLookupSRV")
testLookupSRV(t)
}
@@ -75,7 +74,7 @@ func testLookupA(t *testing.T) {
t.Skip("Skipping Kubernetes Integration tests. Kubernetes is not running")
}
- coreFile :=
+ corefile :=
`.:0 {
kubernetes coredns.local {
endpoint http://localhost:8080
@@ -83,16 +82,20 @@ func testLookupA(t *testing.T) {
}
`
- server, _, udp, err := Server(t, coreFile)
+ server, err := CoreDNSServer(corefile)
if err != nil {
- t.Fatal("Could not get server: %s", err)
+ t.Fatalf("could not get CoreDNS serving instance: %s", err)
+ }
+
+ udp, _ := CoreDNSServerPorts(server, 0)
+ if udp == "" {
+ t.Fatalf("could not get udp listening port")
}
defer server.Stop()
log.SetOutput(ioutil.Discard)
for _, testData := range testdataLookupA {
- t.Logf("[log] Testing query string: '%v'\n", testData.Query)
dnsClient := new(dns.Client)
dnsMessage := new(dns.Msg)
@@ -125,7 +128,7 @@ func testLookupSRV(t *testing.T) {
t.Skip("Skipping Kubernetes Integration tests. Kubernetes is not running")
}
- coreFile :=
+ corefile :=
`.:0 {
kubernetes coredns.local {
endpoint http://localhost:8080
@@ -133,9 +136,13 @@ func testLookupSRV(t *testing.T) {
}
`
- server, _, udp, err := Server(t, coreFile)
+ server, err := CoreDNSServer(corefile)
if err != nil {
- t.Fatal("Could not get server: %s", err)
+ t.Fatalf("could not get CoreDNS serving instance: %s", err)
+ }
+ udp, _ := CoreDNSServerPorts(server, 0)
+ if udp == "" {
+ t.Fatalf("could not get udp listening port")
}
defer server.Stop()
@@ -144,7 +151,6 @@ func testLookupSRV(t *testing.T) {
// TODO: Add checks for A records in additional section
for _, testData := range testdataLookupSRV {
- t.Logf("[log] Testing query string: '%v'\n", testData.Query)
dnsClient := new(dns.Client)
dnsMessage := new(dns.Msg)
@@ -158,7 +164,6 @@ func testLookupSRV(t *testing.T) {
// Count SRV records in the answer section
srvRecordCount := 0
for _, a := range res.Answer {
- fmt.Printf("RR: %v\n", a)
if a.Header().Rrtype == dns.TypeSRV {
srvRecordCount++
}
diff --git a/test/middleware_dnssec_test.go b/test/middleware_dnssec_test.go
index 434e7ad56..afde72a54 100644
--- a/test/middleware_dnssec_test.go
+++ b/test/middleware_dnssec_test.go
@@ -29,11 +29,12 @@ func TestLookupBalanceRewriteCacheDnssec(t *testing.T) {
loadbalance
}
`
- ex, _, udp, err := Server(t, corefile)
+ ex, err := CoreDNSServer(corefile)
if err != nil {
- t.Errorf("Could get server to start: %s", err)
- return
+ t.Fatalf("could not get CoreDNS serving instance: %s", err)
}
+
+ udp, _ := CoreDNSServerPorts(ex, 0)
defer ex.Stop()
log.SetOutput(ioutil.Discard)
diff --git a/test/middleware_test.go b/test/middleware_test.go
index ec90f0d71..f7fefe78a 100644
--- a/test/middleware_test.go
+++ b/test/middleware_test.go
@@ -10,7 +10,7 @@ import (
"github.com/miekg/dns"
)
-func BenchmarkLookupBalanceRewriteCache(b *testing.B) {
+func benchmarkLookupBalanceRewriteCache(b *testing.B) {
t := new(testing.T)
name, rm, err := test.TempFile(t, ".", exampleOrg)
if err != nil {
@@ -24,10 +24,12 @@ func BenchmarkLookupBalanceRewriteCache(b *testing.B) {
loadbalance
}
`
- ex, _, udp, err := Server(t, corefile)
+
+ ex, err := CoreDNSServer(corefile)
if err != nil {
- t.Fatalf("Could get server: %s", err)
+ t.Fatalf("could not get CoreDNS serving instance: %s", err)
}
+ udp, _ := CoreDNSServerPorts(ex, 0)
defer ex.Stop()
log.SetOutput(ioutil.Discard)
diff --git a/test/proxy_test.go b/test/proxy_test.go
index 56ef159fb..ca04e1ae8 100644
--- a/test/proxy_test.go
+++ b/test/proxy_test.go
@@ -28,14 +28,20 @@ func TestLookupProxy(t *testing.T) {
defer rm()
corefile := `example.org:0 {
- file ` + name + `
+ file ` + name + `
}
`
- ex, _, udp, err := Server(t, corefile)
+
+ i, err := CoreDNSServer(corefile)
if err != nil {
- t.Fatalf("Could get server: %s", err)
+ t.Fatalf("could not get CoreDNS serving instance: %s", err)
+ }
+
+ udp, _ := CoreDNSServerPorts(i, 0)
+ if udp == "" {
+ t.Fatalf("could not get udp listening port")
}
- defer ex.Stop()
+ defer i.Stop()
log.SetOutput(ioutil.Discard)
@@ -43,8 +49,7 @@ func TestLookupProxy(t *testing.T) {
state := middleware.State{W: &test.ResponseWriter{}, Req: new(dns.Msg)}
resp, err := p.Lookup(state, "example.org.", dns.TypeA)
if err != nil {
- t.Error("Expected to receive reply, but didn't")
- return
+ t.Fatal("Expected to receive reply, but didn't")
}
// expect answer section with A record in it
if len(resp.Answer) == 0 {
diff --git a/test/responsewriter.go b/test/responsewriter.go
new file mode 100644
index 000000000..fb70d7e8d
--- /dev/null
+++ b/test/responsewriter.go
@@ -0,0 +1,28 @@
+package test
+
+import (
+ "net"
+
+ "github.com/miekg/dns"
+)
+
+type ResponseWriter struct{}
+
+func (t *ResponseWriter) LocalAddr() net.Addr {
+ ip := net.ParseIP("127.0.0.1")
+ port := 53
+ return &net.UDPAddr{IP: ip, Port: port, Zone: ""}
+}
+
+func (t *ResponseWriter) RemoteAddr() net.Addr {
+ ip := net.ParseIP("10.240.0.1")
+ port := 40212
+ return &net.UDPAddr{IP: ip, Port: port, Zone: ""}
+}
+
+func (t *ResponseWriter) WriteMsg(m *dns.Msg) error { return nil }
+func (t *ResponseWriter) Write(buf []byte) (int, error) { return len(buf), nil }
+func (t *ResponseWriter) Close() error { return nil }
+func (t *ResponseWriter) TsigStatus() error { return nil }
+func (t *ResponseWriter) TsigTimersOnly(bool) { return }
+func (t *ResponseWriter) Hijack() { return }
diff --git a/test/server.go b/test/server.go
new file mode 100644
index 000000000..324ffdd8f
--- /dev/null
+++ b/test/server.go
@@ -0,0 +1,91 @@
+package test
+
+import (
+ "net"
+ "sync"
+ "testing"
+ "time"
+
+ _ "github.com/miekg/coredns/core"
+
+ "github.com/mholt/caddy"
+ "github.com/miekg/dns"
+)
+
+func TCPServer(t *testing.T, laddr string) (*dns.Server, string, error) {
+ l, err := net.Listen("tcp", laddr)
+ if err != nil {
+ return nil, "", err
+ }
+
+ server := &dns.Server{Listener: l, ReadTimeout: time.Hour, WriteTimeout: time.Hour}
+
+ waitLock := sync.Mutex{}
+ waitLock.Lock()
+ server.NotifyStartedFunc = func() { t.Logf("started TCP server on %s", l.Addr()); waitLock.Unlock() }
+
+ go func() {
+ server.ActivateAndServe()
+ l.Close()
+ }()
+
+ waitLock.Lock()
+ return server, l.Addr().String(), nil
+}
+
+func UDPServer(t *testing.T, laddr string) (*dns.Server, string, error) {
+ pc, err := net.ListenPacket("udp", laddr)
+ if err != nil {
+ return nil, "", err
+ }
+ server := &dns.Server{PacketConn: pc, ReadTimeout: time.Hour, WriteTimeout: time.Hour}
+
+ waitLock := sync.Mutex{}
+ waitLock.Lock()
+ server.NotifyStartedFunc = func() { t.Logf("started UDP server on %s", pc.LocalAddr()); waitLock.Unlock() }
+
+ go func() {
+ server.ActivateAndServe()
+ pc.Close()
+ }()
+
+ waitLock.Lock()
+ return server, pc.LocalAddr().String(), nil
+}
+
+// CoreDNSServer returns a test server. It just takes a normal Corefile as input.
+func CoreDNSServer(corefile string) (*caddy.Instance, error) { return caddy.Start(NewInput(corefile)) }
+
+// CoreDNSSserverStop stops a server.
+func CoreDNSServerStop(i *caddy.Instance) { i.Stop() }
+
+// CoreDNSServeRPorts returns the ports the instance is listening on. The integer k indicates
+// which ServerListener you want.
+func CoreDNSServerPorts(i *caddy.Instance, k int) (udp, tcp string) {
+ srvs := i.Servers()
+ if len(srvs) < k+1 {
+ return "", ""
+ }
+ u := srvs[k].LocalAddr()
+ t := srvs[k].Addr()
+
+ if u != nil {
+ udp = u.String()
+ }
+ if t != nil {
+ tcp = t.String()
+ }
+ return
+}
+
+type Input struct {
+ corefile []byte
+}
+
+func NewInput(corefile string) *Input {
+ return &Input{corefile: []byte(corefile)}
+}
+
+func (i *Input) Body() []byte { return i.corefile }
+func (i *Input) Path() string { return "Corefile" }
+func (i *Input) ServerType() string { return "dns" }
diff --git a/test/server_test.go b/test/server_test.go
index 6a86d022b..a03285bf3 100644
--- a/test/server_test.go
+++ b/test/server_test.go
@@ -12,24 +12,28 @@ func TestProxyToChaosServer(t *testing.T) {
chaos CoreDNS-001 miek@miek.nl
}
`
- chaos, tcpCH, udpCH, err := Server(t, corefile)
+ chaos, err := CoreDNSServer(corefile)
if err != nil {
- t.Fatalf("Could get server: %s", err)
+ t.Fatalf("could not get CoreDNS serving instance: %s", err)
}
+
+ udpChaos, tcpChaos := CoreDNSServerPorts(chaos, 0)
defer chaos.Stop()
corefileProxy := `.:0 {
- proxy . ` + udpCH + `
+ proxy . ` + udpChaos + `
}
`
- proxy, _, udp, err := Server(t, corefileProxy)
+ proxy, err := CoreDNSServer(corefileProxy)
if err != nil {
- t.Fatalf("Could get server: %s", err)
+ t.Fatalf("could not get CoreDNS serving instance")
}
+
+ udp, _ := CoreDNSServerPorts(proxy, 0)
defer proxy.Stop()
- chaosTest(t, udpCH, "udp")
- chaosTest(t, tcpCH, "tcp")
+ chaosTest(t, udpChaos, "udp")
+ chaosTest(t, tcpChaos, "tcp")
chaosTest(t, udp, "udp")
// chaosTest(t, tcp, "tcp"), commented out because we use the original transport to reach the
diff --git a/test/tests.go b/test/tests.go
index d38bf955f..0f9d12bae 100644
--- a/test/tests.go
+++ b/test/tests.go
@@ -1,12 +1,7 @@
package test
import (
- "testing"
- "time"
-
- "github.com/miekg/coredns/core"
"github.com/miekg/coredns/middleware"
- "github.com/miekg/coredns/server"
"github.com/miekg/dns"
)
@@ -25,16 +20,3 @@ func Exchange(m *dns.Msg, server, net string) (*dns.Msg, error) {
c.Net = net
return middleware.Exchange(c, m, server)
}
-
-// Server returns a test server and the tcp and udp listeners addresses.
-func Server(t *testing.T, corefile string) (*server.Server, string, string, error) {
- srv, err := core.TestServer(t, corefile)
- if err != nil {
- return nil, "", "", err
- }
- go srv.ListenAndServe()
-
- time.Sleep(1 * time.Second) // yeah... I regret nothing
- tcp, udp := srv.LocalAddr()
- return srv, tcp.String(), udp.String(), nil
-}