Blob


1 package dns
3 import (
4 "math/rand"
5 "net"
6 "testing"
8 "golang.org/x/net/dns/dnsmessage"
9 )
11 var testq = dnsmessage.Question{Name: dnsmessage.MustNewName("www.example.com."), Type: dnsmessage.TypeA, Class: dnsmessage.ClassINET}
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 }
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 }
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)
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 }
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 }