1package dns
2
3import "testing"
4
5var (
6	tsigSecret  = map[string]string{"axfr.": "so6ZGir4GPAqINNh9U5c3A=="}
7	xfrSoa      = testRR(`miek.nl.	0	IN	SOA	linode.atoom.net. miek.miek.nl. 2009032802 21600 7200 604800 3600`)
8	xfrA        = testRR(`x.miek.nl.	1792	IN	A	10.0.0.1`)
9	xfrMX       = testRR(`miek.nl.	1800	IN	MX	1	x.miek.nl.`)
10	xfrTestData = []RR{xfrSoa, xfrA, xfrMX, xfrSoa}
11)
12
13func InvalidXfrServer(w ResponseWriter, req *Msg) {
14	ch := make(chan *Envelope)
15	tr := new(Transfer)
16
17	go tr.Out(w, req, ch)
18	ch <- &Envelope{RR: []RR{}}
19	close(ch)
20	w.Hijack()
21}
22
23func SingleEnvelopeXfrServer(w ResponseWriter, req *Msg) {
24	ch := make(chan *Envelope)
25	tr := new(Transfer)
26
27	go tr.Out(w, req, ch)
28	ch <- &Envelope{RR: xfrTestData}
29	close(ch)
30	w.Hijack()
31}
32
33func MultipleEnvelopeXfrServer(w ResponseWriter, req *Msg) {
34	ch := make(chan *Envelope)
35	tr := new(Transfer)
36
37	go tr.Out(w, req, ch)
38
39	for _, rr := range xfrTestData {
40		ch <- &Envelope{RR: []RR{rr}}
41	}
42	close(ch)
43	w.Hijack()
44}
45
46func TestInvalidXfr(t *testing.T) {
47	HandleFunc("miek.nl.", InvalidXfrServer)
48	defer HandleRemove("miek.nl.")
49
50	s, addrstr, _, err := RunLocalTCPServer(":0")
51	if err != nil {
52		t.Fatalf("unable to run test server: %s", err)
53	}
54	defer s.Shutdown()
55
56	tr := new(Transfer)
57	m := new(Msg)
58	m.SetAxfr("miek.nl.")
59
60	c, err := tr.In(m, addrstr)
61	if err != nil {
62		t.Fatal("failed to zone transfer in", err)
63	}
64
65	for msg := range c {
66		if msg.Error == nil {
67			t.Fatal("failed to catch 'no SOA' error")
68		}
69	}
70}
71
72func TestSingleEnvelopeXfr(t *testing.T) {
73	HandleFunc("miek.nl.", SingleEnvelopeXfrServer)
74	defer HandleRemove("miek.nl.")
75
76	s, addrstr, _, err := RunLocalTCPServer(":0", func(srv *Server) {
77		srv.TsigSecret = tsigSecret
78	})
79	if err != nil {
80		t.Fatalf("unable to run test server: %s", err)
81	}
82	defer s.Shutdown()
83
84	axfrTestingSuite(t, addrstr)
85}
86
87func TestMultiEnvelopeXfr(t *testing.T) {
88	HandleFunc("miek.nl.", MultipleEnvelopeXfrServer)
89	defer HandleRemove("miek.nl.")
90
91	s, addrstr, _, err := RunLocalTCPServer(":0", func(srv *Server) {
92		srv.TsigSecret = tsigSecret
93	})
94	if err != nil {
95		t.Fatalf("unable to run test server: %s", err)
96	}
97	defer s.Shutdown()
98
99	axfrTestingSuite(t, addrstr)
100}
101
102func axfrTestingSuite(t *testing.T, addrstr string) {
103	tr := new(Transfer)
104	m := new(Msg)
105	m.SetAxfr("miek.nl.")
106
107	c, err := tr.In(m, addrstr)
108	if err != nil {
109		t.Fatal("failed to zone transfer in", err)
110	}
111
112	var records []RR
113	for msg := range c {
114		if msg.Error != nil {
115			t.Fatal(msg.Error)
116		}
117		records = append(records, msg.RR...)
118	}
119
120	if len(records) != len(xfrTestData) {
121		t.Fatalf("bad axfr: expected %v, got %v", records, xfrTestData)
122	}
123
124	for i, rr := range records {
125		if !IsDuplicate(rr, xfrTestData[i]) {
126			t.Fatalf("bad axfr: expected %v, got %v", records, xfrTestData)
127		}
128	}
129}
130