dns_test.go (2307B)
1 package dns 2 3 import ( 4 "math/rand" 5 "net" 6 "testing" 7 8 "golang.org/x/net/dns/dnsmessage" 9 ) 10 11 var testq = dnsmessage.Question{Name: dnsmessage.MustNewName("www.example.com."), Type: dnsmessage.TypeA, Class: dnsmessage.ClassINET} 12 13 func resolveBadly(w ResponseWriter, qmsg *dnsmessage.Message) { 14 rmsg := dnsmessage.Message{ 15 Header: dnsmessage.Header{ 16 ID: qmsg.Header.ID + 69, 17 Response: false, 18 RCode: dnsmessage.RCodeNameError, 19 }, 20 Questions: qmsg.Questions, 21 } 22 w.WriteMsg(rmsg) 23 } 24 25 func resolveWrongQuestion(w ResponseWriter, qmsg *dnsmessage.Message) { 26 wrongq := dnsmessage.Question{Name: dnsmessage.MustNewName("blabla.example.org."), Type: dnsmessage.TypeNS, Class: dnsmessage.ClassCHAOS} 27 rmsg := dnsmessage.Message{ 28 Header: dnsmessage.Header{ 29 ID: qmsg.Header.ID, 30 Response: true, 31 RCode: dnsmessage.RCodeSuccess, 32 Authoritative: true, 33 }, 34 Questions: []dnsmessage.Question{wrongq}, 35 } 36 w.WriteMsg(rmsg) 37 } 38 39 func TestBadResolver(t *testing.T) { 40 srv := Server{network: "udp", addr: "127.0.0.1", Handler: resolveBadly} 41 conn, err := net.ListenPacket("udp", "127.0.0.1:5359") 42 if err != nil { 43 t.Fatal(err) 44 } 45 go func() { 46 t.Fatal(srv.ServePacket(conn)) 47 }() 48 rmsg, err := Ask(testq, "127.0.0.1:5359") 49 if err == nil { 50 t.Error("wanted error, got nil") 51 } 52 t.Log(err) 53 t.Log("sent:", testq, "received", rmsg) 54 55 srv.Handler = resolveWrongQuestion 56 rmsg, err = Ask(testq, "127.0.0.1:5359") 57 if err == nil { 58 t.Error("wanted error, got nil") 59 } else if err != nil { 60 t.Log(err) 61 } 62 t.Log("sent:", testq, "received:", rmsg) 63 } 64 65 func buildmsg(s string) (dnsmessage.Message, error) { 66 name, err := dnsmessage.NewName(s) 67 if err != nil { 68 return dnsmessage.Message{}, err 69 } 70 var msg dnsmessage.Message 71 header := dnsmessage.Header{ID: uint16(rand.Intn(8192)), RecursionDesired: true} 72 buf := make([]byte, 2, 512+2) 73 b := dnsmessage.NewBuilder(buf, header) 74 b.EnableCompression() 75 q := dnsmessage.Question{Name: name, Type: dnsmessage.TypeA, Class: dnsmessage.ClassINET} 76 if err := b.StartQuestions(); err != nil { 77 return msg, err 78 } 79 if err := b.Question(q); err != nil { 80 return msg, err 81 } 82 packed, err := b.Finish() 83 if err != nil { 84 return msg, err 85 } 86 if err := msg.Unpack(packed[2:]); err != nil { 87 return msg, err 88 } 89 return msg, nil 90 }