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