OSDN Git Service

Merge pull request #41 from Bytom/dev
[bytom/vapor.git] / vendor / github.com / btcsuite / btcd / wire / common_test.go
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         "fmt"
10         "io"
11         "reflect"
12         "strings"
13         "testing"
14
15         "github.com/btcsuite/btcd/chaincfg/chainhash"
16         "github.com/davecgh/go-spew/spew"
17 )
18
19 // mainNetGenesisHash is the hash of the first block in the block chain for the
20 // main network (genesis block).
21 var mainNetGenesisHash = chainhash.Hash([chainhash.HashSize]byte{ // Make go vet happy.
22         0x6f, 0xe2, 0x8c, 0x0a, 0xb6, 0xf1, 0xb3, 0x72,
23         0xc1, 0xa6, 0xa2, 0x46, 0xae, 0x63, 0xf7, 0x4f,
24         0x93, 0x1e, 0x83, 0x65, 0xe1, 0x5a, 0x08, 0x9c,
25         0x68, 0xd6, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
26 })
27
28 // mainNetGenesisMerkleRoot is the hash of the first transaction in the genesis
29 // block for the main network.
30 var mainNetGenesisMerkleRoot = chainhash.Hash([chainhash.HashSize]byte{ // Make go vet happy.
31         0x3b, 0xa3, 0xed, 0xfd, 0x7a, 0x7b, 0x12, 0xb2,
32         0x7a, 0xc7, 0x2c, 0x3e, 0x67, 0x76, 0x8f, 0x61,
33         0x7f, 0xc8, 0x1b, 0xc3, 0x88, 0x8a, 0x51, 0x32,
34         0x3a, 0x9f, 0xb8, 0xaa, 0x4b, 0x1e, 0x5e, 0x4a,
35 })
36
37 // fakeRandReader implements the io.Reader interface and is used to force
38 // errors in the RandomUint64 function.
39 type fakeRandReader struct {
40         n   int
41         err error
42 }
43
44 // Read returns the fake reader error and the lesser of the fake reader value
45 // and the length of p.
46 func (r *fakeRandReader) Read(p []byte) (int, error) {
47         n := r.n
48         if n > len(p) {
49                 n = len(p)
50         }
51         return n, r.err
52 }
53
54 // TestElementWire tests wire encode and decode for various element types.  This
55 // is mainly to test the "fast" paths in readElement and writeElement which use
56 // type assertions to avoid reflection when possible.
57 func TestElementWire(t *testing.T) {
58         type writeElementReflect int32
59
60         tests := []struct {
61                 in  interface{} // Value to encode
62                 buf []byte      // Wire encoding
63         }{
64                 {int32(1), []byte{0x01, 0x00, 0x00, 0x00}},
65                 {uint32(256), []byte{0x00, 0x01, 0x00, 0x00}},
66                 {
67                         int64(65536),
68                         []byte{0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00},
69                 },
70                 {
71                         uint64(4294967296),
72                         []byte{0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00},
73                 },
74                 {
75                         true,
76                         []byte{0x01},
77                 },
78                 {
79                         false,
80                         []byte{0x00},
81                 },
82                 {
83                         [4]byte{0x01, 0x02, 0x03, 0x04},
84                         []byte{0x01, 0x02, 0x03, 0x04},
85                 },
86                 {
87                         [CommandSize]byte{
88                                 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
89                                 0x09, 0x0a, 0x0b, 0x0c,
90                         },
91                         []byte{
92                                 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
93                                 0x09, 0x0a, 0x0b, 0x0c,
94                         },
95                 },
96                 {
97                         [16]byte{
98                                 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
99                                 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
100                         },
101                         []byte{
102                                 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
103                                 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
104                         },
105                 },
106                 {
107                         (*chainhash.Hash)(&[chainhash.HashSize]byte{ // Make go vet happy.
108                                 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
109                                 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
110                                 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
111                                 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
112                         }),
113                         []byte{
114                                 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
115                                 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
116                                 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
117                                 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
118                         },
119                 },
120                 {
121                         ServiceFlag(SFNodeNetwork),
122                         []byte{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
123                 },
124                 {
125                         InvType(InvTypeTx),
126                         []byte{0x01, 0x00, 0x00, 0x00},
127                 },
128                 {
129                         BitcoinNet(MainNet),
130                         []byte{0xf9, 0xbe, 0xb4, 0xd9},
131                 },
132                 // Type not supported by the "fast" path and requires reflection.
133                 {
134                         writeElementReflect(1),
135                         []byte{0x01, 0x00, 0x00, 0x00},
136                 },
137         }
138
139         t.Logf("Running %d tests", len(tests))
140         for i, test := range tests {
141                 // Write to wire format.
142                 var buf bytes.Buffer
143                 err := writeElement(&buf, test.in)
144                 if err != nil {
145                         t.Errorf("writeElement #%d error %v", i, err)
146                         continue
147                 }
148                 if !bytes.Equal(buf.Bytes(), test.buf) {
149                         t.Errorf("writeElement #%d\n got: %s want: %s", i,
150                                 spew.Sdump(buf.Bytes()), spew.Sdump(test.buf))
151                         continue
152                 }
153
154                 // Read from wire format.
155                 rbuf := bytes.NewReader(test.buf)
156                 val := test.in
157                 if reflect.ValueOf(test.in).Kind() != reflect.Ptr {
158                         val = reflect.New(reflect.TypeOf(test.in)).Interface()
159                 }
160                 err = readElement(rbuf, val)
161                 if err != nil {
162                         t.Errorf("readElement #%d error %v", i, err)
163                         continue
164                 }
165                 ival := val
166                 if reflect.ValueOf(test.in).Kind() != reflect.Ptr {
167                         ival = reflect.Indirect(reflect.ValueOf(val)).Interface()
168                 }
169                 if !reflect.DeepEqual(ival, test.in) {
170                         t.Errorf("readElement #%d\n got: %s want: %s", i,
171                                 spew.Sdump(ival), spew.Sdump(test.in))
172                         continue
173                 }
174         }
175 }
176
177 // TestElementWireErrors performs negative tests against wire encode and decode
178 // of various element types to confirm error paths work correctly.
179 func TestElementWireErrors(t *testing.T) {
180         tests := []struct {
181                 in       interface{} // Value to encode
182                 max      int         // Max size of fixed buffer to induce errors
183                 writeErr error       // Expected write error
184                 readErr  error       // Expected read error
185         }{
186                 {int32(1), 0, io.ErrShortWrite, io.EOF},
187                 {uint32(256), 0, io.ErrShortWrite, io.EOF},
188                 {int64(65536), 0, io.ErrShortWrite, io.EOF},
189                 {true, 0, io.ErrShortWrite, io.EOF},
190                 {[4]byte{0x01, 0x02, 0x03, 0x04}, 0, io.ErrShortWrite, io.EOF},
191                 {
192                         [CommandSize]byte{
193                                 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
194                                 0x09, 0x0a, 0x0b, 0x0c,
195                         },
196                         0, io.ErrShortWrite, io.EOF,
197                 },
198                 {
199                         [16]byte{
200                                 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
201                                 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
202                         },
203                         0, io.ErrShortWrite, io.EOF,
204                 },
205                 {
206                         (*chainhash.Hash)(&[chainhash.HashSize]byte{ // Make go vet happy.
207                                 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
208                                 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
209                                 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
210                                 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
211                         }),
212                         0, io.ErrShortWrite, io.EOF,
213                 },
214                 {ServiceFlag(SFNodeNetwork), 0, io.ErrShortWrite, io.EOF},
215                 {InvType(InvTypeTx), 0, io.ErrShortWrite, io.EOF},
216                 {BitcoinNet(MainNet), 0, io.ErrShortWrite, io.EOF},
217         }
218
219         t.Logf("Running %d tests", len(tests))
220         for i, test := range tests {
221                 // Encode to wire format.
222                 w := newFixedWriter(test.max)
223                 err := writeElement(w, test.in)
224                 if err != test.writeErr {
225                         t.Errorf("writeElement #%d wrong error got: %v, want: %v",
226                                 i, err, test.writeErr)
227                         continue
228                 }
229
230                 // Decode from wire format.
231                 r := newFixedReader(test.max, nil)
232                 val := test.in
233                 if reflect.ValueOf(test.in).Kind() != reflect.Ptr {
234                         val = reflect.New(reflect.TypeOf(test.in)).Interface()
235                 }
236                 err = readElement(r, val)
237                 if err != test.readErr {
238                         t.Errorf("readElement #%d wrong error got: %v, want: %v",
239                                 i, err, test.readErr)
240                         continue
241                 }
242         }
243 }
244
245 // TestVarIntWire tests wire encode and decode for variable length integers.
246 func TestVarIntWire(t *testing.T) {
247         pver := ProtocolVersion
248
249         tests := []struct {
250                 in   uint64 // Value to encode
251                 out  uint64 // Expected decoded value
252                 buf  []byte // Wire encoding
253                 pver uint32 // Protocol version for wire encoding
254         }{
255                 // Latest protocol version.
256                 // Single byte
257                 {0, 0, []byte{0x00}, pver},
258                 // Max single byte
259                 {0xfc, 0xfc, []byte{0xfc}, pver},
260                 // Min 2-byte
261                 {0xfd, 0xfd, []byte{0xfd, 0x0fd, 0x00}, pver},
262                 // Max 2-byte
263                 {0xffff, 0xffff, []byte{0xfd, 0xff, 0xff}, pver},
264                 // Min 4-byte
265                 {0x10000, 0x10000, []byte{0xfe, 0x00, 0x00, 0x01, 0x00}, pver},
266                 // Max 4-byte
267                 {0xffffffff, 0xffffffff, []byte{0xfe, 0xff, 0xff, 0xff, 0xff}, pver},
268                 // Min 8-byte
269                 {
270                         0x100000000, 0x100000000,
271                         []byte{0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00},
272                         pver,
273                 },
274                 // Max 8-byte
275                 {
276                         0xffffffffffffffff, 0xffffffffffffffff,
277                         []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
278                         pver,
279                 },
280         }
281
282         t.Logf("Running %d tests", len(tests))
283         for i, test := range tests {
284                 // Encode to wire format.
285                 var buf bytes.Buffer
286                 err := WriteVarInt(&buf, test.pver, test.in)
287                 if err != nil {
288                         t.Errorf("WriteVarInt #%d error %v", i, err)
289                         continue
290                 }
291                 if !bytes.Equal(buf.Bytes(), test.buf) {
292                         t.Errorf("WriteVarInt #%d\n got: %s want: %s", i,
293                                 spew.Sdump(buf.Bytes()), spew.Sdump(test.buf))
294                         continue
295                 }
296
297                 // Decode from wire format.
298                 rbuf := bytes.NewReader(test.buf)
299                 val, err := ReadVarInt(rbuf, test.pver)
300                 if err != nil {
301                         t.Errorf("ReadVarInt #%d error %v", i, err)
302                         continue
303                 }
304                 if val != test.out {
305                         t.Errorf("ReadVarInt #%d\n got: %d want: %d", i,
306                                 val, test.out)
307                         continue
308                 }
309         }
310 }
311
312 // TestVarIntWireErrors performs negative tests against wire encode and decode
313 // of variable length integers to confirm error paths work correctly.
314 func TestVarIntWireErrors(t *testing.T) {
315         pver := ProtocolVersion
316
317         tests := []struct {
318                 in       uint64 // Value to encode
319                 buf      []byte // Wire encoding
320                 pver     uint32 // Protocol version for wire encoding
321                 max      int    // Max size of fixed buffer to induce errors
322                 writeErr error  // Expected write error
323                 readErr  error  // Expected read error
324         }{
325                 // Force errors on discriminant.
326                 {0, []byte{0x00}, pver, 0, io.ErrShortWrite, io.EOF},
327                 // Force errors on 2-byte read/write.
328                 {0xfd, []byte{0xfd}, pver, 2, io.ErrShortWrite, io.ErrUnexpectedEOF},
329                 // Force errors on 4-byte read/write.
330                 {0x10000, []byte{0xfe}, pver, 2, io.ErrShortWrite, io.ErrUnexpectedEOF},
331                 // Force errors on 8-byte read/write.
332                 {0x100000000, []byte{0xff}, pver, 2, io.ErrShortWrite, io.ErrUnexpectedEOF},
333         }
334
335         t.Logf("Running %d tests", len(tests))
336         for i, test := range tests {
337                 // Encode to wire format.
338                 w := newFixedWriter(test.max)
339                 err := WriteVarInt(w, test.pver, test.in)
340                 if err != test.writeErr {
341                         t.Errorf("WriteVarInt #%d wrong error got: %v, want: %v",
342                                 i, err, test.writeErr)
343                         continue
344                 }
345
346                 // Decode from wire format.
347                 r := newFixedReader(test.max, test.buf)
348                 _, err = ReadVarInt(r, test.pver)
349                 if err != test.readErr {
350                         t.Errorf("ReadVarInt #%d wrong error got: %v, want: %v",
351                                 i, err, test.readErr)
352                         continue
353                 }
354         }
355 }
356
357 // TestVarIntNonCanonical ensures variable length integers that are not encoded
358 // canonically return the expected error.
359 func TestVarIntNonCanonical(t *testing.T) {
360         pver := ProtocolVersion
361
362         tests := []struct {
363                 name string // Test name for easier identification
364                 in   []byte // Value to decode
365                 pver uint32 // Protocol version for wire encoding
366         }{
367                 {
368                         "0 encoded with 3 bytes", []byte{0xfd, 0x00, 0x00},
369                         pver,
370                 },
371                 {
372                         "max single-byte value encoded with 3 bytes",
373                         []byte{0xfd, 0xfc, 0x00}, pver,
374                 },
375                 {
376                         "0 encoded with 5 bytes",
377                         []byte{0xfe, 0x00, 0x00, 0x00, 0x00}, pver,
378                 },
379                 {
380                         "max three-byte value encoded with 5 bytes",
381                         []byte{0xfe, 0xff, 0xff, 0x00, 0x00}, pver,
382                 },
383                 {
384                         "0 encoded with 9 bytes",
385                         []byte{0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
386                         pver,
387                 },
388                 {
389                         "max five-byte value encoded with 9 bytes",
390                         []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00},
391                         pver,
392                 },
393         }
394
395         t.Logf("Running %d tests", len(tests))
396         for i, test := range tests {
397                 // Decode from wire format.
398                 rbuf := bytes.NewReader(test.in)
399                 val, err := ReadVarInt(rbuf, test.pver)
400                 if _, ok := err.(*MessageError); !ok {
401                         t.Errorf("ReadVarInt #%d (%s) unexpected error %v", i,
402                                 test.name, err)
403                         continue
404                 }
405                 if val != 0 {
406                         t.Errorf("ReadVarInt #%d (%s)\n got: %d want: 0", i,
407                                 test.name, val)
408                         continue
409                 }
410         }
411 }
412
413 // TestVarIntWire tests the serialize size for variable length integers.
414 func TestVarIntSerializeSize(t *testing.T) {
415         tests := []struct {
416                 val  uint64 // Value to get the serialized size for
417                 size int    // Expected serialized size
418         }{
419                 // Single byte
420                 {0, 1},
421                 // Max single byte
422                 {0xfc, 1},
423                 // Min 2-byte
424                 {0xfd, 3},
425                 // Max 2-byte
426                 {0xffff, 3},
427                 // Min 4-byte
428                 {0x10000, 5},
429                 // Max 4-byte
430                 {0xffffffff, 5},
431                 // Min 8-byte
432                 {0x100000000, 9},
433                 // Max 8-byte
434                 {0xffffffffffffffff, 9},
435         }
436
437         t.Logf("Running %d tests", len(tests))
438         for i, test := range tests {
439                 serializedSize := VarIntSerializeSize(test.val)
440                 if serializedSize != test.size {
441                         t.Errorf("VarIntSerializeSize #%d got: %d, want: %d", i,
442                                 serializedSize, test.size)
443                         continue
444                 }
445         }
446 }
447
448 // TestVarStringWire tests wire encode and decode for variable length strings.
449 func TestVarStringWire(t *testing.T) {
450         pver := ProtocolVersion
451
452         // str256 is a string that takes a 2-byte varint to encode.
453         str256 := strings.Repeat("test", 64)
454
455         tests := []struct {
456                 in   string // String to encode
457                 out  string // String to decoded value
458                 buf  []byte // Wire encoding
459                 pver uint32 // Protocol version for wire encoding
460         }{
461                 // Latest protocol version.
462                 // Empty string
463                 {"", "", []byte{0x00}, pver},
464                 // Single byte varint + string
465                 {"Test", "Test", append([]byte{0x04}, []byte("Test")...), pver},
466                 // 2-byte varint + string
467                 {str256, str256, append([]byte{0xfd, 0x00, 0x01}, []byte(str256)...), pver},
468         }
469
470         t.Logf("Running %d tests", len(tests))
471         for i, test := range tests {
472                 // Encode to wire format.
473                 var buf bytes.Buffer
474                 err := WriteVarString(&buf, test.pver, test.in)
475                 if err != nil {
476                         t.Errorf("WriteVarString #%d error %v", i, err)
477                         continue
478                 }
479                 if !bytes.Equal(buf.Bytes(), test.buf) {
480                         t.Errorf("WriteVarString #%d\n got: %s want: %s", i,
481                                 spew.Sdump(buf.Bytes()), spew.Sdump(test.buf))
482                         continue
483                 }
484
485                 // Decode from wire format.
486                 rbuf := bytes.NewReader(test.buf)
487                 val, err := ReadVarString(rbuf, test.pver)
488                 if err != nil {
489                         t.Errorf("ReadVarString #%d error %v", i, err)
490                         continue
491                 }
492                 if val != test.out {
493                         t.Errorf("ReadVarString #%d\n got: %s want: %s", i,
494                                 val, test.out)
495                         continue
496                 }
497         }
498 }
499
500 // TestVarStringWireErrors performs negative tests against wire encode and
501 // decode of variable length strings to confirm error paths work correctly.
502 func TestVarStringWireErrors(t *testing.T) {
503         pver := ProtocolVersion
504
505         // str256 is a string that takes a 2-byte varint to encode.
506         str256 := strings.Repeat("test", 64)
507
508         tests := []struct {
509                 in       string // Value to encode
510                 buf      []byte // Wire encoding
511                 pver     uint32 // Protocol version for wire encoding
512                 max      int    // Max size of fixed buffer to induce errors
513                 writeErr error  // Expected write error
514                 readErr  error  // Expected read error
515         }{
516                 // Latest protocol version with intentional read/write errors.
517                 // Force errors on empty string.
518                 {"", []byte{0x00}, pver, 0, io.ErrShortWrite, io.EOF},
519                 // Force error on single byte varint + string.
520                 {"Test", []byte{0x04}, pver, 2, io.ErrShortWrite, io.ErrUnexpectedEOF},
521                 // Force errors on 2-byte varint + string.
522                 {str256, []byte{0xfd}, pver, 2, io.ErrShortWrite, io.ErrUnexpectedEOF},
523         }
524
525         t.Logf("Running %d tests", len(tests))
526         for i, test := range tests {
527                 // Encode to wire format.
528                 w := newFixedWriter(test.max)
529                 err := WriteVarString(w, test.pver, test.in)
530                 if err != test.writeErr {
531                         t.Errorf("WriteVarString #%d wrong error got: %v, want: %v",
532                                 i, err, test.writeErr)
533                         continue
534                 }
535
536                 // Decode from wire format.
537                 r := newFixedReader(test.max, test.buf)
538                 _, err = ReadVarString(r, test.pver)
539                 if err != test.readErr {
540                         t.Errorf("ReadVarString #%d wrong error got: %v, want: %v",
541                                 i, err, test.readErr)
542                         continue
543                 }
544         }
545 }
546
547 // TestVarStringOverflowErrors performs tests to ensure deserializing variable
548 // length strings intentionally crafted to use large values for the string
549 // length are handled properly.  This could otherwise potentially be used as an
550 // attack vector.
551 func TestVarStringOverflowErrors(t *testing.T) {
552         pver := ProtocolVersion
553
554         tests := []struct {
555                 buf  []byte // Wire encoding
556                 pver uint32 // Protocol version for wire encoding
557                 err  error  // Expected error
558         }{
559                 {[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
560                         pver, &MessageError{}},
561                 {[]byte{0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
562                         pver, &MessageError{}},
563         }
564
565         t.Logf("Running %d tests", len(tests))
566         for i, test := range tests {
567                 // Decode from wire format.
568                 rbuf := bytes.NewReader(test.buf)
569                 _, err := ReadVarString(rbuf, test.pver)
570                 if reflect.TypeOf(err) != reflect.TypeOf(test.err) {
571                         t.Errorf("ReadVarString #%d wrong error got: %v, "+
572                                 "want: %v", i, err, reflect.TypeOf(test.err))
573                         continue
574                 }
575         }
576
577 }
578
579 // TestVarBytesWire tests wire encode and decode for variable length byte array.
580 func TestVarBytesWire(t *testing.T) {
581         pver := ProtocolVersion
582
583         // bytes256 is a byte array that takes a 2-byte varint to encode.
584         bytes256 := bytes.Repeat([]byte{0x01}, 256)
585
586         tests := []struct {
587                 in   []byte // Byte Array to write
588                 buf  []byte // Wire encoding
589                 pver uint32 // Protocol version for wire encoding
590         }{
591                 // Latest protocol version.
592                 // Empty byte array
593                 {[]byte{}, []byte{0x00}, pver},
594                 // Single byte varint + byte array
595                 {[]byte{0x01}, []byte{0x01, 0x01}, pver},
596                 // 2-byte varint + byte array
597                 {bytes256, append([]byte{0xfd, 0x00, 0x01}, bytes256...), pver},
598         }
599
600         t.Logf("Running %d tests", len(tests))
601         for i, test := range tests {
602                 // Encode to wire format.
603                 var buf bytes.Buffer
604                 err := WriteVarBytes(&buf, test.pver, test.in)
605                 if err != nil {
606                         t.Errorf("WriteVarBytes #%d error %v", i, err)
607                         continue
608                 }
609                 if !bytes.Equal(buf.Bytes(), test.buf) {
610                         t.Errorf("WriteVarBytes #%d\n got: %s want: %s", i,
611                                 spew.Sdump(buf.Bytes()), spew.Sdump(test.buf))
612                         continue
613                 }
614
615                 // Decode from wire format.
616                 rbuf := bytes.NewReader(test.buf)
617                 val, err := ReadVarBytes(rbuf, test.pver, MaxMessagePayload,
618                         "test payload")
619                 if err != nil {
620                         t.Errorf("ReadVarBytes #%d error %v", i, err)
621                         continue
622                 }
623                 if !bytes.Equal(buf.Bytes(), test.buf) {
624                         t.Errorf("ReadVarBytes #%d\n got: %s want: %s", i,
625                                 val, test.buf)
626                         continue
627                 }
628         }
629 }
630
631 // TestVarBytesWireErrors performs negative tests against wire encode and
632 // decode of variable length byte arrays to confirm error paths work correctly.
633 func TestVarBytesWireErrors(t *testing.T) {
634         pver := ProtocolVersion
635
636         // bytes256 is a byte array that takes a 2-byte varint to encode.
637         bytes256 := bytes.Repeat([]byte{0x01}, 256)
638
639         tests := []struct {
640                 in       []byte // Byte Array to write
641                 buf      []byte // Wire encoding
642                 pver     uint32 // Protocol version for wire encoding
643                 max      int    // Max size of fixed buffer to induce errors
644                 writeErr error  // Expected write error
645                 readErr  error  // Expected read error
646         }{
647                 // Latest protocol version with intentional read/write errors.
648                 // Force errors on empty byte array.
649                 {[]byte{}, []byte{0x00}, pver, 0, io.ErrShortWrite, io.EOF},
650                 // Force error on single byte varint + byte array.
651                 {[]byte{0x01, 0x02, 0x03}, []byte{0x04}, pver, 2, io.ErrShortWrite, io.ErrUnexpectedEOF},
652                 // Force errors on 2-byte varint + byte array.
653                 {bytes256, []byte{0xfd}, pver, 2, io.ErrShortWrite, io.ErrUnexpectedEOF},
654         }
655
656         t.Logf("Running %d tests", len(tests))
657         for i, test := range tests {
658                 // Encode to wire format.
659                 w := newFixedWriter(test.max)
660                 err := WriteVarBytes(w, test.pver, test.in)
661                 if err != test.writeErr {
662                         t.Errorf("WriteVarBytes #%d wrong error got: %v, want: %v",
663                                 i, err, test.writeErr)
664                         continue
665                 }
666
667                 // Decode from wire format.
668                 r := newFixedReader(test.max, test.buf)
669                 _, err = ReadVarBytes(r, test.pver, MaxMessagePayload,
670                         "test payload")
671                 if err != test.readErr {
672                         t.Errorf("ReadVarBytes #%d wrong error got: %v, want: %v",
673                                 i, err, test.readErr)
674                         continue
675                 }
676         }
677 }
678
679 // TestVarBytesOverflowErrors performs tests to ensure deserializing variable
680 // length byte arrays intentionally crafted to use large values for the array
681 // length are handled properly.  This could otherwise potentially be used as an
682 // attack vector.
683 func TestVarBytesOverflowErrors(t *testing.T) {
684         pver := ProtocolVersion
685
686         tests := []struct {
687                 buf  []byte // Wire encoding
688                 pver uint32 // Protocol version for wire encoding
689                 err  error  // Expected error
690         }{
691                 {[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
692                         pver, &MessageError{}},
693                 {[]byte{0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
694                         pver, &MessageError{}},
695         }
696
697         t.Logf("Running %d tests", len(tests))
698         for i, test := range tests {
699                 // Decode from wire format.
700                 rbuf := bytes.NewReader(test.buf)
701                 _, err := ReadVarBytes(rbuf, test.pver, MaxMessagePayload,
702                         "test payload")
703                 if reflect.TypeOf(err) != reflect.TypeOf(test.err) {
704                         t.Errorf("ReadVarBytes #%d wrong error got: %v, "+
705                                 "want: %v", i, err, reflect.TypeOf(test.err))
706                         continue
707                 }
708         }
709
710 }
711
712 // TestRandomUint64 exercises the randomness of the random number generator on
713 // the system by ensuring the probability of the generated numbers.  If the RNG
714 // is evenly distributed as a proper cryptographic RNG should be, there really
715 // should only be 1 number < 2^56 in 2^8 tries for a 64-bit number.  However,
716 // use a higher number of 5 to really ensure the test doesn't fail unless the
717 // RNG is just horrendous.
718 func TestRandomUint64(t *testing.T) {
719         tries := 1 << 8              // 2^8
720         watermark := uint64(1 << 56) // 2^56
721         maxHits := 5
722         badRNG := "The random number generator on this system is clearly " +
723                 "terrible since we got %d values less than %d in %d runs " +
724                 "when only %d was expected"
725
726         numHits := 0
727         for i := 0; i < tries; i++ {
728                 nonce, err := RandomUint64()
729                 if err != nil {
730                         t.Errorf("RandomUint64 iteration %d failed - err %v",
731                                 i, err)
732                         return
733                 }
734                 if nonce < watermark {
735                         numHits++
736                 }
737                 if numHits > maxHits {
738                         str := fmt.Sprintf(badRNG, numHits, watermark, tries, maxHits)
739                         t.Errorf("Random Uint64 iteration %d failed - %v %v", i,
740                                 str, numHits)
741                         return
742                 }
743         }
744 }
745
746 // TestRandomUint64Errors uses a fake reader to force error paths to be executed
747 // and checks the results accordingly.
748 func TestRandomUint64Errors(t *testing.T) {
749         // Test short reads.
750         fr := &fakeRandReader{n: 2, err: io.EOF}
751         nonce, err := randomUint64(fr)
752         if err != io.ErrUnexpectedEOF {
753                 t.Errorf("Error not expected value of %v [%v]",
754                         io.ErrUnexpectedEOF, err)
755         }
756         if nonce != 0 {
757                 t.Errorf("Nonce is not 0 [%v]", nonce)
758         }
759 }