--- /dev/null
+package consensusmgr
+
+import (
+ "reflect"
+ "testing"
+
+ "github.com/davecgh/go-spew/spew"
+ "github.com/tendermint/go-wire"
+
+ "github.com/vapor/protocol/bc"
+ "github.com/vapor/protocol/bc/types"
+)
+
+var _ = wire.RegisterInterface(
+ struct{ ConsensusMessage }{},
+ wire.ConcreteType{O: &BlockSignatureMsg{}, Byte: blockSignatureByte},
+ wire.ConcreteType{O: &BlockProposeMsg{}, Byte: blockProposeByte},
+)
+
+func TestDecodeMessage(t *testing.T) {
+ testCases := []struct {
+ msg ConsensusMessage
+ msgType byte
+ }{
+ {
+ msg: &BlockSignatureMsg{
+ BlockHash: [32]byte{0x01},
+ Signature: []byte{0x00},
+ PubKey: []byte{0x01},
+ },
+ msgType: blockSignatureByte,
+ },
+ {
+ msg: &BlockProposeMsg{
+ RawBlock: []byte{0x01, 0x02},
+ },
+ msgType: blockProposeByte,
+ },
+ }
+ for i, c := range testCases {
+ binMsg := wire.BinaryBytes(struct{ ConsensusMessage }{c.msg})
+ gotMsgType, gotMsg, err := decodeMessage(binMsg)
+ if err != nil {
+ t.Fatalf("index:%d decode Message err %s", i, err)
+ }
+ if gotMsgType != c.msgType {
+ t.Fatalf("index:%d decode Message type err. got:%d want:%d", i, gotMsgType, c.msg)
+ }
+ if !reflect.DeepEqual(gotMsg, c.msg) {
+ t.Fatalf("index:%d decode Message err. got:%s\n want:%s", i, spew.Sdump(gotMsg), spew.Sdump(c.msg))
+ }
+ }
+}
+
+func TestBlockSignBroadcastMsg(t *testing.T) {
+ blockSignMsg := &BlockSignatureMsg{
+ BlockHash: [32]byte{0x01},
+ Height: 100,
+ Signature: []byte{0x00},
+ PubKey: []byte{0x01},
+ }
+ signatureBroadcastMsg := NewBroadcastMsg(NewBlockSignatureMsg(bc.NewHash(blockSignMsg.BlockHash), blockSignMsg.Height, blockSignMsg.Signature, blockSignMsg.PubKey), consensusChannel)
+
+ binMsg := wire.BinaryBytes(signatureBroadcastMsg.GetMsg())
+ gotMsgType, gotMsg, err := decodeMessage(binMsg)
+ if err != nil {
+ t.Fatalf("decode Message err %s", err)
+ }
+ if gotMsgType != blockSignatureByte {
+ t.Fatalf("decode Message type err. got:%d want:%d", gotMsgType, blockSignatureByte)
+ }
+ if !reflect.DeepEqual(gotMsg, blockSignMsg) {
+ t.Fatalf("decode Message err. got:%s\n want:%s", spew.Sdump(gotMsg), spew.Sdump(blockSignMsg))
+ }
+}
+
+func TestBlockProposeBroadcastMsg(t *testing.T) {
+ blockProposeMsg, _ := NewBlockProposeMsg(testBlock)
+
+ proposeBroadcastMsg := NewBroadcastMsg(blockProposeMsg, consensusChannel)
+
+ binMsg := wire.BinaryBytes(proposeBroadcastMsg.GetMsg())
+ gotMsgType, gotMsg, err := decodeMessage(binMsg)
+ if err != nil {
+ t.Fatalf("decode Message err %s", err)
+ }
+ if gotMsgType != blockProposeByte {
+ t.Fatalf("decode Message type err. got:%d want:%d", gotMsgType, blockProposeByte)
+ }
+ if !reflect.DeepEqual(gotMsg, blockProposeMsg) {
+ t.Fatalf("decode Message err. got:%s\n want:%s", spew.Sdump(gotMsg), spew.Sdump(blockProposeMsg))
+ }
+}
+
+var testBlock = &types.Block{
+ BlockHeader: types.BlockHeader{
+ Version: 1,
+ Height: 0,
+ Timestamp: 1528945000,
+ BlockCommitment: types.BlockCommitment{
+ TransactionsMerkleRoot: bc.Hash{V0: uint64(0x11)},
+ TransactionStatusHash: bc.Hash{V0: uint64(0x55)},
+ },
+ },
+}
+
+func TestBlockProposeMsg(t *testing.T) {
+ blockMsg, err := NewBlockProposeMsg(testBlock)
+ if err != nil {
+ t.Fatalf("create new mine block msg err:%s", err)
+ }
+
+ gotBlock, err := blockMsg.(*BlockProposeMsg).GetProposeBlock()
+ if err != nil {
+ t.Fatalf("got block err:%s", err)
+ }
+
+ if !reflect.DeepEqual(gotBlock.BlockHeader, testBlock.BlockHeader) {
+ t.Errorf("block msg test err: got %s\nwant %s", spew.Sdump(gotBlock.BlockHeader), spew.Sdump(testBlock.BlockHeader))
+ }
+
+ wantString := "{block_height: 0, block_hash: f59514e2541488a38bc2667940bc2c24027e4a3a371d884b55570d036997bb57}"
+ if blockMsg.String() != wantString {
+ t.Errorf("block msg test err. got:%s want:%s", blockMsg.String(), wantString)
+ }
+
+ blockMsg.(*BlockProposeMsg).RawBlock[1] = blockMsg.(*BlockProposeMsg).RawBlock[1] + 0x1
+ _, err = blockMsg.(*BlockProposeMsg).GetProposeBlock()
+ if err == nil {
+ t.Fatalf("get mine block err")
+ }
+
+ wantString = "{err: wrong message}"
+ if blockMsg.String() != wantString {
+ t.Errorf("block msg test err. got:%s want:%s", blockMsg.String(), wantString)
+ }
+}
+
+func TestBlockSignatureMsg(t *testing.T) {
+ msg := &BlockSignatureMsg{
+ BlockHash: [32]byte{0x01},
+ Height: 100,
+ Signature: []byte{0x00},
+ PubKey: []byte{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ }
+ gotMsg := NewBlockSignatureMsg(bc.NewHash(msg.BlockHash), msg.Height, msg.Signature, msg.PubKey)
+
+ if !reflect.DeepEqual(gotMsg, msg) {
+ t.Fatalf("test block signature message err. got:%s\n want:%s", spew.Sdump(gotMsg), spew.Sdump(msg))
+ }
+ wantString := "{block_hash: 0100000000000000000000000000000000000000000000000000000000000000,block_height:100,signature:00,pubkey:01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000}"
+ if gotMsg.String() != wantString {
+ t.Fatalf("test block signature message err. got string:%s\n want string:%s", gotMsg.String(), wantString)
+ }
+}