github.com/palcoin-project/palcd@v1.0.0/wire/invvect_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 "reflect" 10 "testing" 11 12 "github.com/davecgh/go-spew/spew" 13 "github.com/palcoin-project/palcd/chaincfg/chainhash" 14 ) 15 16 // TestInvVectStringer tests the stringized output for inventory vector types. 17 func TestInvTypeStringer(t *testing.T) { 18 tests := []struct { 19 in InvType 20 want string 21 }{ 22 {InvTypeError, "ERROR"}, 23 {InvTypeTx, "MSG_TX"}, 24 {InvTypeBlock, "MSG_BLOCK"}, 25 {0xffffffff, "Unknown InvType (4294967295)"}, 26 } 27 28 t.Logf("Running %d tests", len(tests)) 29 for i, test := range tests { 30 result := test.in.String() 31 if result != test.want { 32 t.Errorf("String #%d\n got: %s want: %s", i, result, 33 test.want) 34 continue 35 } 36 } 37 38 } 39 40 // TestInvVect tests the InvVect API. 41 func TestInvVect(t *testing.T) { 42 ivType := InvTypeBlock 43 hash := chainhash.Hash{} 44 45 // Ensure we get the same payload and signature back out. 46 iv := NewInvVect(ivType, &hash) 47 if iv.Type != ivType { 48 t.Errorf("NewInvVect: wrong type - got %v, want %v", 49 iv.Type, ivType) 50 } 51 if !iv.Hash.IsEqual(&hash) { 52 t.Errorf("NewInvVect: wrong hash - got %v, want %v", 53 spew.Sdump(iv.Hash), spew.Sdump(hash)) 54 } 55 56 } 57 58 // TestInvVectWire tests the InvVect wire encode and decode for various 59 // protocol versions and supported inventory vector types. 60 func TestInvVectWire(t *testing.T) { 61 // Block 203707 hash. 62 hashStr := "3264bc2ac36a60840790ba1d475d01367e7c723da941069e9dc" 63 baseHash, err := chainhash.NewHashFromStr(hashStr) 64 if err != nil { 65 t.Errorf("NewHashFromStr: %v", err) 66 } 67 68 // errInvVect is an inventory vector with an error. 69 errInvVect := InvVect{ 70 Type: InvTypeError, 71 Hash: chainhash.Hash{}, 72 } 73 74 // errInvVectEncoded is the wire encoded bytes of errInvVect. 75 errInvVectEncoded := []byte{ 76 0x00, 0x00, 0x00, 0x00, // InvTypeError 77 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 78 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 79 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 80 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // No hash 81 } 82 83 // txInvVect is an inventory vector representing a transaction. 84 txInvVect := InvVect{ 85 Type: InvTypeTx, 86 Hash: *baseHash, 87 } 88 89 // txInvVectEncoded is the wire encoded bytes of txInvVect. 90 txInvVectEncoded := []byte{ 91 0x01, 0x00, 0x00, 0x00, // InvTypeTx 92 0xdc, 0xe9, 0x69, 0x10, 0x94, 0xda, 0x23, 0xc7, 93 0xe7, 0x67, 0x13, 0xd0, 0x75, 0xd4, 0xa1, 0x0b, 94 0x79, 0x40, 0x08, 0xa6, 0x36, 0xac, 0xc2, 0x4b, 95 0x26, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Block 203707 hash 96 } 97 98 // blockInvVect is an inventory vector representing a block. 99 blockInvVect := InvVect{ 100 Type: InvTypeBlock, 101 Hash: *baseHash, 102 } 103 104 // blockInvVectEncoded is the wire encoded bytes of blockInvVect. 105 blockInvVectEncoded := []byte{ 106 0x02, 0x00, 0x00, 0x00, // InvTypeBlock 107 0xdc, 0xe9, 0x69, 0x10, 0x94, 0xda, 0x23, 0xc7, 108 0xe7, 0x67, 0x13, 0xd0, 0x75, 0xd4, 0xa1, 0x0b, 109 0x79, 0x40, 0x08, 0xa6, 0x36, 0xac, 0xc2, 0x4b, 110 0x26, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Block 203707 hash 111 } 112 113 tests := []struct { 114 in InvVect // NetAddress to encode 115 out InvVect // Expected decoded NetAddress 116 buf []byte // Wire encoding 117 pver uint32 // Protocol version for wire encoding 118 }{ 119 // Latest protocol version error inventory vector. 120 { 121 errInvVect, 122 errInvVect, 123 errInvVectEncoded, 124 ProtocolVersion, 125 }, 126 127 // Latest protocol version tx inventory vector. 128 { 129 txInvVect, 130 txInvVect, 131 txInvVectEncoded, 132 ProtocolVersion, 133 }, 134 135 // Latest protocol version block inventory vector. 136 { 137 blockInvVect, 138 blockInvVect, 139 blockInvVectEncoded, 140 ProtocolVersion, 141 }, 142 143 // Protocol version BIP0035Version error inventory vector. 144 { 145 errInvVect, 146 errInvVect, 147 errInvVectEncoded, 148 BIP0035Version, 149 }, 150 151 // Protocol version BIP0035Version tx inventory vector. 152 { 153 txInvVect, 154 txInvVect, 155 txInvVectEncoded, 156 BIP0035Version, 157 }, 158 159 // Protocol version BIP0035Version block inventory vector. 160 { 161 blockInvVect, 162 blockInvVect, 163 blockInvVectEncoded, 164 BIP0035Version, 165 }, 166 167 // Protocol version BIP0031Version error inventory vector. 168 { 169 errInvVect, 170 errInvVect, 171 errInvVectEncoded, 172 BIP0031Version, 173 }, 174 175 // Protocol version BIP0031Version tx inventory vector. 176 { 177 txInvVect, 178 txInvVect, 179 txInvVectEncoded, 180 BIP0031Version, 181 }, 182 183 // Protocol version BIP0031Version block inventory vector. 184 { 185 blockInvVect, 186 blockInvVect, 187 blockInvVectEncoded, 188 BIP0031Version, 189 }, 190 191 // Protocol version NetAddressTimeVersion error inventory vector. 192 { 193 errInvVect, 194 errInvVect, 195 errInvVectEncoded, 196 NetAddressTimeVersion, 197 }, 198 199 // Protocol version NetAddressTimeVersion tx inventory vector. 200 { 201 txInvVect, 202 txInvVect, 203 txInvVectEncoded, 204 NetAddressTimeVersion, 205 }, 206 207 // Protocol version NetAddressTimeVersion block inventory vector. 208 { 209 blockInvVect, 210 blockInvVect, 211 blockInvVectEncoded, 212 NetAddressTimeVersion, 213 }, 214 215 // Protocol version MultipleAddressVersion error inventory vector. 216 { 217 errInvVect, 218 errInvVect, 219 errInvVectEncoded, 220 MultipleAddressVersion, 221 }, 222 223 // Protocol version MultipleAddressVersion tx inventory vector. 224 { 225 txInvVect, 226 txInvVect, 227 txInvVectEncoded, 228 MultipleAddressVersion, 229 }, 230 231 // Protocol version MultipleAddressVersion block inventory vector. 232 { 233 blockInvVect, 234 blockInvVect, 235 blockInvVectEncoded, 236 MultipleAddressVersion, 237 }, 238 } 239 240 t.Logf("Running %d tests", len(tests)) 241 for i, test := range tests { 242 // Encode to wire format. 243 var buf bytes.Buffer 244 err := writeInvVect(&buf, test.pver, &test.in) 245 if err != nil { 246 t.Errorf("writeInvVect #%d error %v", i, err) 247 continue 248 } 249 if !bytes.Equal(buf.Bytes(), test.buf) { 250 t.Errorf("writeInvVect #%d\n got: %s want: %s", i, 251 spew.Sdump(buf.Bytes()), spew.Sdump(test.buf)) 252 continue 253 } 254 255 // Decode the message from wire format. 256 var iv InvVect 257 rbuf := bytes.NewReader(test.buf) 258 err = readInvVect(rbuf, test.pver, &iv) 259 if err != nil { 260 t.Errorf("readInvVect #%d error %v", i, err) 261 continue 262 } 263 if !reflect.DeepEqual(iv, test.out) { 264 t.Errorf("readInvVect #%d\n got: %s want: %s", i, 265 spew.Sdump(iv), spew.Sdump(test.out)) 266 continue 267 } 268 } 269 }