mirror of
https://github.com/btcsuite/btcd.git
synced 2024-11-19 18:00:11 +01:00
Add tests for optional message fields.
Since fields of a version message after the AddrMe field are optional, this commit adds a series of tests which ensure parsing version messages which omit each of the optional fields works properly.
This commit is contained in:
parent
c917899303
commit
8721348051
@ -341,6 +341,107 @@ func TestVersionWireErrors(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestVersionOptionalFields performs tests to ensure that an encoded version
|
||||||
|
// messages that omit optional fields are handled correctly.
|
||||||
|
func TestVersionOptionalFields(t *testing.T) {
|
||||||
|
// onlyRequiredVersion is a version message that only contains the
|
||||||
|
// required versions and all other values set to their default values.
|
||||||
|
onlyRequiredVersion := btcwire.MsgVersion{
|
||||||
|
ProtocolVersion: 60002,
|
||||||
|
Services: btcwire.SFNodeNetwork,
|
||||||
|
Timestamp: time.Unix(0x495fab29, 0), // 2009-01-03 12:15:05 -0600 CST)
|
||||||
|
AddrYou: btcwire.NetAddress{
|
||||||
|
Timestamp: time.Time{}, // Zero value -- no timestamp in version
|
||||||
|
Services: btcwire.SFNodeNetwork,
|
||||||
|
IP: net.ParseIP("192.168.0.1"),
|
||||||
|
Port: 8333,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
onlyRequiredVersionEncoded := make([]byte, len(baseVersionEncoded)-55)
|
||||||
|
copy(onlyRequiredVersionEncoded, baseVersionEncoded)
|
||||||
|
|
||||||
|
// addrMeVersion is a version message that contains all fields through
|
||||||
|
// the AddrMe field.
|
||||||
|
addrMeVersion := onlyRequiredVersion
|
||||||
|
addrMeVersion.AddrMe = btcwire.NetAddress{
|
||||||
|
Timestamp: time.Time{}, // Zero value -- no timestamp in version
|
||||||
|
Services: btcwire.SFNodeNetwork,
|
||||||
|
IP: net.ParseIP("127.0.0.1"),
|
||||||
|
Port: 8333,
|
||||||
|
}
|
||||||
|
addrMeVersionEncoded := make([]byte, len(baseVersionEncoded)-29)
|
||||||
|
copy(addrMeVersionEncoded, baseVersionEncoded)
|
||||||
|
|
||||||
|
// nonceVersion is a version message that contains all fields through
|
||||||
|
// the Nonce field.
|
||||||
|
nonceVersion := addrMeVersion
|
||||||
|
nonceVersion.Nonce = 123123 // 0x1e0f3
|
||||||
|
nonceVersionEncoded := make([]byte, len(baseVersionEncoded)-21)
|
||||||
|
copy(nonceVersionEncoded, baseVersionEncoded)
|
||||||
|
|
||||||
|
// uaVersion is a version message that contains all fields through
|
||||||
|
// the UserAgent field.
|
||||||
|
uaVersion := nonceVersion
|
||||||
|
uaVersion.UserAgent = "/btcdtest:0.0.1/"
|
||||||
|
uaVersionEncoded := make([]byte, len(baseVersionEncoded)-4)
|
||||||
|
copy(uaVersionEncoded, baseVersionEncoded)
|
||||||
|
|
||||||
|
// lastBlockVersion is a version message that contains all fields
|
||||||
|
// through the LastBlock field.
|
||||||
|
lastBlockVersion := uaVersion
|
||||||
|
lastBlockVersion.LastBlock = 234234 // 0x392fa
|
||||||
|
lastBlockVersionEncoded := make([]byte, len(baseVersionEncoded))
|
||||||
|
copy(lastBlockVersionEncoded, baseVersionEncoded)
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
msg *btcwire.MsgVersion // Expected message
|
||||||
|
buf []byte // Wire encoding
|
||||||
|
pver uint32 // Protocol version for wire encoding
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
&onlyRequiredVersion,
|
||||||
|
onlyRequiredVersionEncoded,
|
||||||
|
btcwire.ProtocolVersion,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
&addrMeVersion,
|
||||||
|
addrMeVersionEncoded,
|
||||||
|
btcwire.ProtocolVersion,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
&nonceVersion,
|
||||||
|
nonceVersionEncoded,
|
||||||
|
btcwire.ProtocolVersion,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
&uaVersion,
|
||||||
|
uaVersionEncoded,
|
||||||
|
btcwire.ProtocolVersion,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
&lastBlockVersion,
|
||||||
|
lastBlockVersionEncoded,
|
||||||
|
btcwire.ProtocolVersion,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, test := range tests {
|
||||||
|
// Decode the message from wire format.
|
||||||
|
var msg btcwire.MsgVersion
|
||||||
|
rbuf := bytes.NewBuffer(test.buf)
|
||||||
|
err := msg.BtcDecode(rbuf, test.pver)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("BtcDecode #%d error %v", i, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if !reflect.DeepEqual(&msg, test.msg) {
|
||||||
|
t.Errorf("BtcDecode #%d\n got: %s want: %s", i,
|
||||||
|
spew.Sdump(msg), spew.Sdump(test.msg))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// baseVersion is used in the various tests as a baseline MsgVersion.
|
// baseVersion is used in the various tests as a baseline MsgVersion.
|
||||||
var baseVersion = &btcwire.MsgVersion{
|
var baseVersion = &btcwire.MsgVersion{
|
||||||
ProtocolVersion: 60002,
|
ProtocolVersion: 60002,
|
||||||
|
Loading…
Reference in New Issue
Block a user