dns

DNS client and server implementations using the Go project's dnsmessage package
Log | Files | Refs | README | LICENSE

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 }