msgsendheaders_test.go raw

   1  package wire
   2  
   3  import (
   4  	"bytes"
   5  	"reflect"
   6  	"testing"
   7  	
   8  	"github.com/davecgh/go-spew/spew"
   9  )
  10  
  11  // TestSendHeaders tests the MsgSendHeaders API against the latest protocol version.
  12  func TestSendHeaders(t *testing.T) {
  13  	pver := ProtocolVersion
  14  	enc := BaseEncoding
  15  	// Ensure the command is expected value.
  16  	wantCmd := "sendheaders"
  17  	msg := NewMsgSendHeaders()
  18  	if cmd := msg.Command(); cmd != wantCmd {
  19  		t.Errorf("NewMsgSendHeaders: wrong command - got %v want %v",
  20  			cmd, wantCmd,
  21  		)
  22  	}
  23  	// Ensure max payload is expected value.
  24  	wantPayload := uint32(0)
  25  	maxPayload := msg.MaxPayloadLength(pver)
  26  	if maxPayload != wantPayload {
  27  		t.Errorf("MaxPayloadLength: wrong max payload length for "+
  28  			"protocol version %d - got %v, want %v", pver,
  29  			maxPayload, wantPayload,
  30  		)
  31  	}
  32  	// Test encode with latest protocol version.
  33  	var buf bytes.Buffer
  34  	e := msg.BtcEncode(&buf, pver, enc)
  35  	if e != nil {
  36  		t.Errorf("encode of MsgSendHeaders failed %v e <%v>", msg,
  37  			e,
  38  		)
  39  	}
  40  	// Older protocol versions should fail encode since message didn't exist yet.
  41  	oldPver := SendHeadersVersion - 1
  42  	e = msg.BtcEncode(&buf, oldPver, enc)
  43  	if e == nil {
  44  		s := "encode of MsgSendHeaders passed for old protocol " +
  45  			"version %v e <%v>"
  46  		t.Errorf(s, msg, e)
  47  	}
  48  	// Test decode with latest protocol version.
  49  	readmsg := NewMsgSendHeaders()
  50  	e = readmsg.BtcDecode(&buf, pver, enc)
  51  	if e != nil {
  52  		t.Errorf("decode of MsgSendHeaders failed [%v] e <%v>", buf,
  53  			e,
  54  		)
  55  	}
  56  	// Older protocol versions should fail decode since message didn't exist yet.
  57  	e = readmsg.BtcDecode(&buf, oldPver, enc)
  58  	if e == nil {
  59  		s := "decode of MsgSendHeaders passed for old protocol " +
  60  			"version %v e <%v>"
  61  		t.Errorf(s, msg, e)
  62  	}
  63  }
  64  
  65  // TestSendHeadersBIP0130 tests the MsgSendHeaders API against the protocol prior to version SendHeadersVersion.
  66  func TestSendHeadersBIP0130(t *testing.T) {
  67  	// Use the protocol version just prior to SendHeadersVersion changes.
  68  	pver := SendHeadersVersion - 1
  69  	enc := BaseEncoding
  70  	msg := NewMsgSendHeaders()
  71  	// Test encode with old protocol version.
  72  	var buf bytes.Buffer
  73  	e := msg.BtcEncode(&buf, pver, enc)
  74  	
  75  	if e == nil {
  76  		
  77  		t.Errorf("encode of MsgSendHeaders succeeded when it should " +
  78  			"have failed",
  79  		)
  80  	}
  81  	// Test decode with old protocol version.
  82  	readmsg := NewMsgSendHeaders()
  83  	e = readmsg.BtcDecode(&buf, pver, enc)
  84  	
  85  	if e == nil {
  86  		
  87  		t.Errorf("decode of MsgSendHeaders succeeded when it should " +
  88  			"have failed",
  89  		)
  90  	}
  91  }
  92  
  93  // TestSendHeadersCrossProtocol tests the MsgSendHeaders API when encoding with the latest protocol version and decoding with SendHeadersVersion.
  94  func TestSendHeadersCrossProtocol(t *testing.T) {
  95  	enc := BaseEncoding
  96  	msg := NewMsgSendHeaders()
  97  	// Encode with latest protocol version.
  98  	var buf bytes.Buffer
  99  	e := msg.BtcEncode(&buf, ProtocolVersion, enc)
 100  	if e != nil {
 101  		t.Errorf("encode of MsgSendHeaders failed %v e <%v>", msg, e)
 102  	}
 103  	// Decode with old protocol version.
 104  	readmsg := NewMsgSendHeaders()
 105  	e = readmsg.BtcDecode(&buf, SendHeadersVersion, enc)
 106  	if e != nil {
 107  		t.Errorf("decode of MsgSendHeaders failed [%v] e <%v>", buf, e)
 108  	}
 109  }
 110  
 111  // TestSendHeadersWire tests the MsgSendHeaders wire encode and decode for various protocol versions.
 112  func TestSendHeadersWire(t *testing.T) {
 113  	msgSendHeaders := NewMsgSendHeaders()
 114  	msgSendHeadersEncoded := []byte{}
 115  	tests := []struct {
 116  		in   *MsgSendHeaders // Message to encode
 117  		out  *MsgSendHeaders // Expected decoded message
 118  		buf  []byte          // Wire encoding
 119  		pver uint32          // Protocol version for wire encoding
 120  		enc  MessageEncoding // Message encoding format
 121  	}{
 122  		// Latest protocol version.
 123  		{
 124  			msgSendHeaders,
 125  			msgSendHeaders,
 126  			msgSendHeadersEncoded,
 127  			ProtocolVersion,
 128  			BaseEncoding,
 129  		},
 130  		// Protocol version SendHeadersVersion+1
 131  		{
 132  			msgSendHeaders,
 133  			msgSendHeaders,
 134  			msgSendHeadersEncoded,
 135  			SendHeadersVersion + 1,
 136  			BaseEncoding,
 137  		},
 138  		// Protocol version SendHeadersVersion
 139  		{
 140  			msgSendHeaders,
 141  			msgSendHeaders,
 142  			msgSendHeadersEncoded,
 143  			SendHeadersVersion,
 144  			BaseEncoding,
 145  		},
 146  	}
 147  	t.Logf("Running %d tests", len(tests))
 148  	for i, test := range tests {
 149  		// Encode the message to wire format.
 150  		var buf bytes.Buffer
 151  		e := test.in.BtcEncode(&buf, test.pver, test.enc)
 152  		if e != nil {
 153  			t.Errorf("BtcEncode #%d error %v", i, e)
 154  			continue
 155  		}
 156  		if !bytes.Equal(buf.Bytes(), test.buf) {
 157  			t.Errorf("BtcEncode #%d\n got: %s want: %s", i,
 158  				spew.Sdump(buf.Bytes()), spew.Sdump(test.buf),
 159  			)
 160  			continue
 161  		}
 162  		// Decode the message from wire format.
 163  		var msg MsgSendHeaders
 164  		rbuf := bytes.NewReader(test.buf)
 165  		e = msg.BtcDecode(rbuf, test.pver, test.enc)
 166  		if e != nil {
 167  			t.Errorf("BtcDecode #%d error %v", i, e)
 168  			continue
 169  		}
 170  		if !reflect.DeepEqual(&msg, test.out) {
 171  			t.Errorf("BtcDecode #%d\n got: %s want: %s", i,
 172  				spew.Sdump(msg), spew.Sdump(test.out),
 173  			)
 174  			continue
 175  		}
 176  	}
 177  }
 178