github.com/palcoin-project/palcd@v1.0.0/wire/msgheaders_test.go (about) 1 // Copyright (c) 2013-2016 The btcsuite developers 2 // Use of this source code is governed by an ISC 3 // license that can be found in the LICENSE file. 4 5 package wire 6 7 import ( 8 "bytes" 9 "io" 10 "reflect" 11 "testing" 12 13 "github.com/davecgh/go-spew/spew" 14 ) 15 16 // TestHeaders tests the MsgHeaders API. 17 func TestHeaders(t *testing.T) { 18 pver := uint32(60002) 19 20 // Ensure the command is expected value. 21 wantCmd := "headers" 22 msg := NewMsgHeaders() 23 if cmd := msg.Command(); cmd != wantCmd { 24 t.Errorf("NewMsgHeaders: wrong command - got %v want %v", 25 cmd, wantCmd) 26 } 27 28 // Ensure max payload is expected value for latest protocol version. 29 // Num headers (varInt) + max allowed headers (header length + 1 byte 30 // for the number of transactions which is always 0). 31 wantPayload := uint32(162009) 32 maxPayload := msg.MaxPayloadLength(pver) 33 if maxPayload != wantPayload { 34 t.Errorf("MaxPayloadLength: wrong max payload length for "+ 35 "protocol version %d - got %v, want %v", pver, 36 maxPayload, wantPayload) 37 } 38 39 // Ensure headers are added properly. 40 bh := &blockOne.Header 41 msg.AddBlockHeader(bh) 42 if !reflect.DeepEqual(msg.Headers[0], bh) { 43 t.Errorf("AddHeader: wrong header - got %v, want %v", 44 spew.Sdump(msg.Headers), 45 spew.Sdump(bh)) 46 } 47 48 // Ensure adding more than the max allowed headers per message returns 49 // error. 50 var err error 51 for i := 0; i < MaxBlockHeadersPerMsg+1; i++ { 52 err = msg.AddBlockHeader(bh) 53 } 54 if reflect.TypeOf(err) != reflect.TypeOf(&MessageError{}) { 55 t.Errorf("AddBlockHeader: expected error on too many headers " + 56 "not received") 57 } 58 } 59 60 // TestHeadersWire tests the MsgHeaders wire encode and decode for various 61 // numbers of headers and protocol versions. 62 func TestHeadersWire(t *testing.T) { 63 hash := mainNetGenesisHash 64 merkleHash := blockOne.Header.MerkleRoot 65 bits := uint32(0x1d00ffff) 66 nonce := uint32(0x9962e301) 67 bh := NewBlockHeader(1, &hash, &merkleHash, bits, nonce) 68 bh.Version = blockOne.Header.Version 69 bh.Timestamp = blockOne.Header.Timestamp 70 71 // Empty headers message. 72 noHeaders := NewMsgHeaders() 73 noHeadersEncoded := []byte{ 74 0x00, // Varint for number of headers 75 } 76 77 // Headers message with one header. 78 oneHeader := NewMsgHeaders() 79 oneHeader.AddBlockHeader(bh) 80 oneHeaderEncoded := []byte{ 81 0x01, // VarInt for number of headers. 82 0x01, 0x00, 0x00, 0x00, // Version 1 83 0x6f, 0xe2, 0x8c, 0x0a, 0xb6, 0xf1, 0xb3, 0x72, 84 0xc1, 0xa6, 0xa2, 0x46, 0xae, 0x63, 0xf7, 0x4f, 85 0x93, 0x1e, 0x83, 0x65, 0xe1, 0x5a, 0x08, 0x9c, 86 0x68, 0xd6, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, // PrevBlock 87 0x98, 0x20, 0x51, 0xfd, 0x1e, 0x4b, 0xa7, 0x44, 88 0xbb, 0xbe, 0x68, 0x0e, 0x1f, 0xee, 0x14, 0x67, 89 0x7b, 0xa1, 0xa3, 0xc3, 0x54, 0x0b, 0xf7, 0xb1, 90 0xcd, 0xb6, 0x06, 0xe8, 0x57, 0x23, 0x3e, 0x0e, // MerkleRoot 91 0x61, 0xbc, 0x66, 0x49, // Timestamp 92 0xff, 0xff, 0x00, 0x1d, // Bits 93 0x01, 0xe3, 0x62, 0x99, // Nonce 94 0x00, // TxnCount (0 for headers message) 95 } 96 97 tests := []struct { 98 in *MsgHeaders // Message to encode 99 out *MsgHeaders // Expected decoded message 100 buf []byte // Wire encoding 101 pver uint32 // Protocol version for wire encoding 102 enc MessageEncoding // Message encoding format 103 }{ 104 // Latest protocol version with no headers. 105 { 106 noHeaders, 107 noHeaders, 108 noHeadersEncoded, 109 ProtocolVersion, 110 BaseEncoding, 111 }, 112 113 // Latest protocol version with one header. 114 { 115 oneHeader, 116 oneHeader, 117 oneHeaderEncoded, 118 ProtocolVersion, 119 BaseEncoding, 120 }, 121 122 // Protocol version BIP0035Version with no headers. 123 { 124 noHeaders, 125 noHeaders, 126 noHeadersEncoded, 127 BIP0035Version, 128 BaseEncoding, 129 }, 130 131 // Protocol version BIP0035Version with one header. 132 { 133 oneHeader, 134 oneHeader, 135 oneHeaderEncoded, 136 BIP0035Version, 137 BaseEncoding, 138 }, 139 140 // Protocol version BIP0031Version with no headers. 141 { 142 noHeaders, 143 noHeaders, 144 noHeadersEncoded, 145 BIP0031Version, 146 BaseEncoding, 147 }, 148 149 // Protocol version BIP0031Version with one header. 150 { 151 oneHeader, 152 oneHeader, 153 oneHeaderEncoded, 154 BIP0031Version, 155 BaseEncoding, 156 }, 157 // Protocol version NetAddressTimeVersion with no headers. 158 { 159 noHeaders, 160 noHeaders, 161 noHeadersEncoded, 162 NetAddressTimeVersion, 163 BaseEncoding, 164 }, 165 166 // Protocol version NetAddressTimeVersion with one header. 167 { 168 oneHeader, 169 oneHeader, 170 oneHeaderEncoded, 171 NetAddressTimeVersion, 172 BaseEncoding, 173 }, 174 175 // Protocol version MultipleAddressVersion with no headers. 176 { 177 noHeaders, 178 noHeaders, 179 noHeadersEncoded, 180 MultipleAddressVersion, 181 BaseEncoding, 182 }, 183 184 // Protocol version MultipleAddressVersion with one header. 185 { 186 oneHeader, 187 oneHeader, 188 oneHeaderEncoded, 189 MultipleAddressVersion, 190 BaseEncoding, 191 }, 192 } 193 194 t.Logf("Running %d tests", len(tests)) 195 for i, test := range tests { 196 // Encode the message to wire format. 197 var buf bytes.Buffer 198 err := test.in.BtcEncode(&buf, test.pver, test.enc) 199 if err != nil { 200 t.Errorf("BtcEncode #%d error %v", i, err) 201 continue 202 } 203 if !bytes.Equal(buf.Bytes(), test.buf) { 204 t.Errorf("BtcEncode #%d\n got: %s want: %s", i, 205 spew.Sdump(buf.Bytes()), spew.Sdump(test.buf)) 206 continue 207 } 208 209 // Decode the message from wire format. 210 var msg MsgHeaders 211 rbuf := bytes.NewReader(test.buf) 212 err = msg.BtcDecode(rbuf, test.pver, test.enc) 213 if err != nil { 214 t.Errorf("BtcDecode #%d error %v", i, err) 215 continue 216 } 217 if !reflect.DeepEqual(&msg, test.out) { 218 t.Errorf("BtcDecode #%d\n got: %s want: %s", i, 219 spew.Sdump(&msg), spew.Sdump(test.out)) 220 continue 221 } 222 } 223 } 224 225 // TestHeadersWireErrors performs negative tests against wire encode and decode 226 // of MsgHeaders to confirm error paths work correctly. 227 func TestHeadersWireErrors(t *testing.T) { 228 pver := ProtocolVersion 229 wireErr := &MessageError{} 230 231 hash := mainNetGenesisHash 232 merkleHash := blockOne.Header.MerkleRoot 233 bits := uint32(0x1d00ffff) 234 nonce := uint32(0x9962e301) 235 bh := NewBlockHeader(1, &hash, &merkleHash, bits, nonce) 236 bh.Version = blockOne.Header.Version 237 bh.Timestamp = blockOne.Header.Timestamp 238 239 // Headers message with one header. 240 oneHeader := NewMsgHeaders() 241 oneHeader.AddBlockHeader(bh) 242 oneHeaderEncoded := []byte{ 243 0x01, // VarInt for number of headers. 244 0x01, 0x00, 0x00, 0x00, // Version 1 245 0x6f, 0xe2, 0x8c, 0x0a, 0xb6, 0xf1, 0xb3, 0x72, 246 0xc1, 0xa6, 0xa2, 0x46, 0xae, 0x63, 0xf7, 0x4f, 247 0x93, 0x1e, 0x83, 0x65, 0xe1, 0x5a, 0x08, 0x9c, 248 0x68, 0xd6, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, // PrevBlock 249 0x98, 0x20, 0x51, 0xfd, 0x1e, 0x4b, 0xa7, 0x44, 250 0xbb, 0xbe, 0x68, 0x0e, 0x1f, 0xee, 0x14, 0x67, 251 0x7b, 0xa1, 0xa3, 0xc3, 0x54, 0x0b, 0xf7, 0xb1, 252 0xcd, 0xb6, 0x06, 0xe8, 0x57, 0x23, 0x3e, 0x0e, // MerkleRoot 253 0x61, 0xbc, 0x66, 0x49, // Timestamp 254 0xff, 0xff, 0x00, 0x1d, // Bits 255 0x01, 0xe3, 0x62, 0x99, // Nonce 256 0x00, // TxnCount (0 for headers message) 257 } 258 259 // Message that forces an error by having more than the max allowed 260 // headers. 261 maxHeaders := NewMsgHeaders() 262 for i := 0; i < MaxBlockHeadersPerMsg; i++ { 263 maxHeaders.AddBlockHeader(bh) 264 } 265 maxHeaders.Headers = append(maxHeaders.Headers, bh) 266 maxHeadersEncoded := []byte{ 267 0xfd, 0xd1, 0x07, // Varint for number of addresses (2001)7D1 268 } 269 270 // Intentionally invalid block header that has a transaction count used 271 // to force errors. 272 bhTrans := NewBlockHeader(1, &hash, &merkleHash, bits, nonce) 273 bhTrans.Version = blockOne.Header.Version 274 bhTrans.Timestamp = blockOne.Header.Timestamp 275 276 transHeader := NewMsgHeaders() 277 transHeader.AddBlockHeader(bhTrans) 278 transHeaderEncoded := []byte{ 279 0x01, // VarInt for number of headers. 280 0x01, 0x00, 0x00, 0x00, // Version 1 281 0x6f, 0xe2, 0x8c, 0x0a, 0xb6, 0xf1, 0xb3, 0x72, 282 0xc1, 0xa6, 0xa2, 0x46, 0xae, 0x63, 0xf7, 0x4f, 283 0x93, 0x1e, 0x83, 0x65, 0xe1, 0x5a, 0x08, 0x9c, 284 0x68, 0xd6, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, // PrevBlock 285 0x98, 0x20, 0x51, 0xfd, 0x1e, 0x4b, 0xa7, 0x44, 286 0xbb, 0xbe, 0x68, 0x0e, 0x1f, 0xee, 0x14, 0x67, 287 0x7b, 0xa1, 0xa3, 0xc3, 0x54, 0x0b, 0xf7, 0xb1, 288 0xcd, 0xb6, 0x06, 0xe8, 0x57, 0x23, 0x3e, 0x0e, // MerkleRoot 289 0x61, 0xbc, 0x66, 0x49, // Timestamp 290 0xff, 0xff, 0x00, 0x1d, // Bits 291 0x01, 0xe3, 0x62, 0x99, // Nonce 292 0x01, // TxnCount (should be 0 for headers message, but 1 to force error) 293 } 294 295 tests := []struct { 296 in *MsgHeaders // Value to encode 297 buf []byte // Wire encoding 298 pver uint32 // Protocol version for wire encoding 299 enc MessageEncoding // Message encoding format 300 max int // Max size of fixed buffer to induce errors 301 writeErr error // Expected write error 302 readErr error // Expected read error 303 }{ 304 // Latest protocol version with intentional read/write errors. 305 // Force error in header count. 306 {oneHeader, oneHeaderEncoded, pver, BaseEncoding, 0, io.ErrShortWrite, io.EOF}, 307 // Force error in block header. 308 {oneHeader, oneHeaderEncoded, pver, BaseEncoding, 5, io.ErrShortWrite, io.EOF}, 309 // Force error with greater than max headers. 310 {maxHeaders, maxHeadersEncoded, pver, BaseEncoding, 3, wireErr, wireErr}, 311 // Force error with number of transactions. 312 {transHeader, transHeaderEncoded, pver, BaseEncoding, 81, io.ErrShortWrite, io.EOF}, 313 // Force error with included transactions. 314 {transHeader, transHeaderEncoded, pver, BaseEncoding, len(transHeaderEncoded), nil, wireErr}, 315 } 316 317 t.Logf("Running %d tests", len(tests)) 318 for i, test := range tests { 319 // Encode to wire format. 320 w := newFixedWriter(test.max) 321 err := test.in.BtcEncode(w, test.pver, test.enc) 322 if reflect.TypeOf(err) != reflect.TypeOf(test.writeErr) { 323 t.Errorf("BtcEncode #%d wrong error got: %v, want: %v", 324 i, err, test.writeErr) 325 continue 326 } 327 328 // For errors which are not of type MessageError, check them for 329 // equality. 330 if _, ok := err.(*MessageError); !ok { 331 if err != test.writeErr { 332 t.Errorf("BtcEncode #%d wrong error got: %v, "+ 333 "want: %v", i, err, test.writeErr) 334 continue 335 } 336 } 337 338 // Decode from wire format. 339 var msg MsgHeaders 340 r := newFixedReader(test.max, test.buf) 341 err = msg.BtcDecode(r, test.pver, test.enc) 342 if reflect.TypeOf(err) != reflect.TypeOf(test.readErr) { 343 t.Errorf("BtcDecode #%d wrong error got: %v, want: %v", 344 i, err, test.readErr) 345 continue 346 } 347 348 // For errors which are not of type MessageError, check them for 349 // equality. 350 if _, ok := err.(*MessageError); !ok { 351 if err != test.readErr { 352 t.Errorf("BtcDecode #%d wrong error got: %v, "+ 353 "want: %v", i, err, test.readErr) 354 continue 355 } 356 } 357 358 } 359 }