aboutsummaryrefslogtreecommitdiff
path: root/middleware/file/cname_test.go
blob: 1b1e4dfd3d41cdff63b5dc6f4959c05224fb2102 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
package file

import (
	"sort"
	"strings"
	"testing"

	"github.com/miekg/coredns/middleware/pkg/dnsrecorder"
	"github.com/miekg/coredns/middleware/proxy"
	"github.com/miekg/coredns/middleware/test"

	"github.com/miekg/dns"
	"golang.org/x/net/context"
)

func TestLookupCNAMEChain(t *testing.T) {
	name := "example.org."
	zone, err := Parse(strings.NewReader(dbExampleCNAME), name, "stdin")
	if err != nil {
		t.Fatalf("Expected no error when reading zone, got %q", err)
	}

	fm := File{Next: test.ErrorHandler(), Zones: Zones{Z: map[string]*Zone{name: zone}, Names: []string{name}}}
	ctx := context.TODO()

	for _, tc := range cnameTestCases {
		m := tc.Msg()

		rec := dnsrecorder.New(&test.ResponseWriter{})
		_, err := fm.ServeDNS(ctx, rec, m)
		if err != nil {
			t.Errorf("Expected no error, got %v\n", err)
			return
		}

		resp := rec.Msg
		sort.Sort(test.RRSet(resp.Answer))
		sort.Sort(test.RRSet(resp.Ns))
		sort.Sort(test.RRSet(resp.Extra))

		if !test.Header(t, tc, resp) {
			t.Logf("%v\n", resp)
			continue
		}

		if !test.Section(t, tc, test.Answer, resp.Answer) {
			t.Logf("%v\n", resp)
		}
		if !test.Section(t, tc, test.Ns, resp.Ns) {
			t.Logf("%v\n", resp)

		}
		if !test.Section(t, tc, test.Extra, resp.Extra) {
			t.Logf("%v\n", resp)
		}
	}
}

var cnameTestCases = []test.Case{
	{
		Qname: "a.example.org.", Qtype: dns.TypeA,
		Answer: []dns.RR{
			test.A("a.example.org. 1800	IN	A 127.0.0.1"),
		},
	},
	{
		Qname: "www3.example.org.", Qtype: dns.TypeCNAME,
		Answer: []dns.RR{
			test.CNAME("www3.example.org. 1800	IN	CNAME www2.example.org."),
		},
	},
	{
		Qname: "dangling.example.org.", Qtype: dns.TypeA,
		Answer: []dns.RR{
			test.CNAME("dangling.example.org. 1800	IN	CNAME foo.example.org."),
		},
	},
	{
		Qname: "www3.example.org.", Qtype: dns.TypeA,
		Answer: []dns.RR{
			test.A("a.example.org. 1800	IN	A 127.0.0.1"),
			test.CNAME("www.example.org. 1800	IN	CNAME a.example.org."),
			test.CNAME("www1.example.org. 1800	IN	CNAME www.example.org."),
			test.CNAME("www2.example.org. 1800	IN	CNAME www1.example.org."),
			test.CNAME("www3.example.org. 1800	IN	CNAME www2.example.org."),
		},
	},
}

func TestLookupCNAMEExternal(t *testing.T) {
	name := "example.org."
	zone, err := Parse(strings.NewReader(dbExampleCNAME), name, "stdin")
	if err != nil {
		t.Fatalf("Expected no error when reading zone, got %q", err)
	}
	zone.Proxy = proxy.NewLookup([]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}}}
	ctx := context.TODO()

	for _, tc := range exernalTestCases {
		m := tc.Msg()

		rec := dnsrecorder.New(&test.ResponseWriter{})
		_, err := fm.ServeDNS(ctx, rec, m)
		if err != nil {
			t.Errorf("Expected no error, got %v\n", err)
			return
		}

		resp := rec.Msg
		sort.Sort(test.RRSet(resp.Answer))
		sort.Sort(test.RRSet(resp.Ns))
		sort.Sort(test.RRSet(resp.Extra))

		if !test.Header(t, tc, resp) {
			t.Logf("%v\n", resp)
			continue
		}

		if !test.Section(t, tc, test.Answer, resp.Answer) {
			t.Logf("%v\n", resp)
		}
		if !test.Section(t, tc, test.Ns, resp.Ns) {
			t.Logf("%v\n", resp)

		}
		if !test.Section(t, tc, test.Extra, resp.Extra) {
			t.Logf("%v\n", resp)
		}
	}
}

var exernalTestCases = []test.Case{
	{
		Qname: "external.example.org.", Qtype: dns.TypeA,
		Answer: []dns.RR{
			test.CNAME("external.example.org. 1800	CNAME	www.example.net."),
			// magic 303 TTL that says: don't check TTL.
			test.A("www.example.net.	303	IN	A	93.184.216.34"),
		},
	},
}

const dbExampleCNAME = `
$TTL    30M
$ORIGIN example.org.
@       IN      SOA     linode.atoom.net. miek.miek.nl. (
                             1282630057 ; Serial
                             4H         ; Refresh
                             1H         ; Retry
                             7D         ; Expire
                             4H )       ; Negative Cache TTL

a               IN      A       127.0.0.1
www3            IN      CNAME   www2
www2            IN      CNAME   www1
www1            IN      CNAME   www
www             IN      CNAME   a
dangling        IN      CNAME   foo
external        IN      CNAME   www.example.net.`