btcd/wire/msgaddrv2_test.go

74 lines
1.5 KiB
Go

package wire
import (
"bytes"
"io"
"testing"
)
// TestAddrV2Decode checks that decoding an addrv2 message off the wire behaves
// as expected. This means ignoring certain addresses, and failing in certain
// failure scenarios.
func TestAddrV2Decode(t *testing.T) {
tests := []struct {
buf []byte
expectedError bool
expectedAddrs int
}{
// Exceeding max addresses.
{
[]byte{0xfd, 0xff, 0xff},
true,
0,
},
// Invalid address size.
{
[]byte{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05},
true,
0,
},
// One valid address and one skipped address
{
[]byte{
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04,
0x7f, 0x00, 0x00, 0x01, 0x22, 0x22, 0x00, 0x00,
0x00, 0x00, 0x00, 0x02, 0x10, 0xfd, 0x87, 0xd8,
0x7e, 0xeb, 0x43, 0xff, 0xfe, 0xcc, 0x39, 0xa8,
0x73, 0x69, 0x15, 0xff, 0xff, 0x22, 0x22,
},
false,
1,
},
}
t.Logf("Running %d tests", len(tests))
for i, test := range tests {
r := bytes.NewReader(test.buf)
m := &MsgAddrV2{}
err := m.BtcDecode(r, 0, LatestEncoding)
if test.expectedError {
if err == nil {
t.Errorf("Test #%d expected error", i)
}
continue
} else if err != nil {
t.Errorf("Test #%d unexpected error %v", i, err)
}
// Trying to read more should give EOF.
var b [1]byte
if _, err := r.Read(b[:]); err != io.EOF {
t.Errorf("Test #%d did not cleanly finish reading", i)
}
if len(m.AddrList) != test.expectedAddrs {
t.Errorf("Test #%d expected %d addrs, instead of %d",
i, test.expectedAddrs, len(m.AddrList))
}
}
}