rsc.io/go@v0.0.0-20150416155037-e040fd465409/src/net/dnsmsg_test.go (about)

     1  // Copyright 2011 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package net
     6  
     7  import (
     8  	"encoding/hex"
     9  	"reflect"
    10  	"testing"
    11  )
    12  
    13  func TestDNSParseSRVReply(t *testing.T) {
    14  	data, err := hex.DecodeString(dnsSRVReply)
    15  	if err != nil {
    16  		t.Fatal(err)
    17  	}
    18  	msg := new(dnsMsg)
    19  	ok := msg.Unpack(data)
    20  	if !ok {
    21  		t.Fatal("unpacking packet failed")
    22  	}
    23  	msg.String() // exercise this code path
    24  	if g, e := len(msg.answer), 5; g != e {
    25  		t.Errorf("len(msg.answer) = %d; want %d", g, e)
    26  	}
    27  	for idx, rr := range msg.answer {
    28  		if g, e := rr.Header().Rrtype, uint16(dnsTypeSRV); g != e {
    29  			t.Errorf("rr[%d].Header().Rrtype = %d; want %d", idx, g, e)
    30  		}
    31  		if _, ok := rr.(*dnsRR_SRV); !ok {
    32  			t.Errorf("answer[%d] = %T; want *dnsRR_SRV", idx, rr)
    33  		}
    34  	}
    35  	for _, name := range [...]string{
    36  		"_xmpp-server._tcp.google.com.",
    37  		"_XMPP-Server._TCP.Google.COM.",
    38  		"_XMPP-SERVER._TCP.GOOGLE.COM.",
    39  	} {
    40  		_, addrs, err := answer(name, "foo:53", msg, uint16(dnsTypeSRV))
    41  		if err != nil {
    42  			t.Error(err)
    43  		}
    44  		if g, e := len(addrs), 5; g != e {
    45  			t.Errorf("len(addrs) = %d; want %d", g, e)
    46  			t.Logf("addrs = %#v", addrs)
    47  		}
    48  	}
    49  	// repack and unpack.
    50  	data2, ok := msg.Pack()
    51  	msg2 := new(dnsMsg)
    52  	msg2.Unpack(data2)
    53  	switch {
    54  	case !ok:
    55  		t.Error("failed to repack message")
    56  	case !reflect.DeepEqual(msg, msg2):
    57  		t.Error("repacked message differs from original")
    58  	}
    59  }
    60  
    61  func TestDNSParseCorruptSRVReply(t *testing.T) {
    62  	data, err := hex.DecodeString(dnsSRVCorruptReply)
    63  	if err != nil {
    64  		t.Fatal(err)
    65  	}
    66  	msg := new(dnsMsg)
    67  	ok := msg.Unpack(data)
    68  	if !ok {
    69  		t.Fatalf("unpacking packet failed")
    70  	}
    71  	msg.String() // exercise this code path
    72  	if g, e := len(msg.answer), 5; g != e {
    73  		t.Errorf("len(msg.answer) = %d; want %d", g, e)
    74  	}
    75  	for idx, rr := range msg.answer {
    76  		if g, e := rr.Header().Rrtype, uint16(dnsTypeSRV); g != e {
    77  			t.Errorf("rr[%d].Header().Rrtype = %d; want %d", idx, g, e)
    78  		}
    79  		if idx == 4 {
    80  			if _, ok := rr.(*dnsRR_Header); !ok {
    81  				t.Errorf("answer[%d] = %T; want *dnsRR_Header", idx, rr)
    82  			}
    83  		} else {
    84  			if _, ok := rr.(*dnsRR_SRV); !ok {
    85  				t.Errorf("answer[%d] = %T; want *dnsRR_SRV", idx, rr)
    86  			}
    87  		}
    88  	}
    89  	_, addrs, err := answer("_xmpp-server._tcp.google.com.", "foo:53", msg, uint16(dnsTypeSRV))
    90  	if err != nil {
    91  		t.Fatalf("answer: %v", err)
    92  	}
    93  	if g, e := len(addrs), 4; g != e {
    94  		t.Errorf("len(addrs) = %d; want %d", g, e)
    95  		t.Logf("addrs = %#v", addrs)
    96  	}
    97  }
    98  
    99  // Valid DNS SRV reply
   100  const dnsSRVReply = "0901818000010005000000000c5f786d70702d736572766572045f74637006676f6f67" +
   101  	"6c6503636f6d0000210001c00c002100010000012c00210014000014950c786d70702d" +
   102  	"73657276657234016c06676f6f676c6503636f6d00c00c002100010000012c00210014" +
   103  	"000014950c786d70702d73657276657232016c06676f6f676c6503636f6d00c00c0021" +
   104  	"00010000012c00210014000014950c786d70702d73657276657233016c06676f6f676c" +
   105  	"6503636f6d00c00c002100010000012c00200005000014950b786d70702d7365727665" +
   106  	"72016c06676f6f676c6503636f6d00c00c002100010000012c00210014000014950c78" +
   107  	"6d70702d73657276657231016c06676f6f676c6503636f6d00"
   108  
   109  // Corrupt DNS SRV reply, with its final RR having a bogus length
   110  // (perhaps it was truncated, or it's malicious) The mutation is the
   111  // capital "FF" below, instead of the proper "21".
   112  const dnsSRVCorruptReply = "0901818000010005000000000c5f786d70702d736572766572045f74637006676f6f67" +
   113  	"6c6503636f6d0000210001c00c002100010000012c00210014000014950c786d70702d" +
   114  	"73657276657234016c06676f6f676c6503636f6d00c00c002100010000012c00210014" +
   115  	"000014950c786d70702d73657276657232016c06676f6f676c6503636f6d00c00c0021" +
   116  	"00010000012c00210014000014950c786d70702d73657276657233016c06676f6f676c" +
   117  	"6503636f6d00c00c002100010000012c00200005000014950b786d70702d7365727665" +
   118  	"72016c06676f6f676c6503636f6d00c00c002100010000012c00FF0014000014950c78" +
   119  	"6d70702d73657276657231016c06676f6f676c6503636f6d00"