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