10 "github.com/tendermint/tmlibs/flowrate"
12 "github.com/vapor/consensus"
13 "github.com/vapor/event"
14 "github.com/vapor/netsync/peers"
15 "github.com/vapor/p2p"
16 "github.com/vapor/protocol/bc"
17 "github.com/vapor/protocol/bc/types"
23 func (p *p2peer) Addr() net.Addr {
27 func (p *p2peer) ID() string {
31 func (p *p2peer) RemoteAddrHost() string {
34 func (p *p2peer) ServiceFlag() consensus.ServiceFlag {
37 func (p *p2peer) TrafficStatus() (*flowrate.Status, *flowrate.Status) {
40 func (p *p2peer) TrySend(byte, interface{}) bool {
43 func (p *p2peer) IsLAN() bool {
47 func mockBlocks(startBlock *types.Block, height uint64) []*types.Block {
48 blocks := []*types.Block{}
49 indexBlock := &types.Block{}
50 if startBlock == nil {
51 indexBlock = &types.Block{BlockHeader: types.BlockHeader{Version: uint64(rand.Uint32())}}
52 blocks = append(blocks, indexBlock)
54 indexBlock = startBlock
57 for indexBlock.Height < height {
58 block := &types.Block{
59 BlockHeader: types.BlockHeader{
60 Height: indexBlock.Height + 1,
61 PreviousBlockHash: indexBlock.Hash(),
62 Version: uint64(rand.Uint32()),
65 blocks = append(blocks, block)
74 func (s *mockSW) AddReactor(name string, reactor p2p.Reactor) p2p.Reactor {
78 type mockChain struct {
81 func (c *mockChain) BestBlockHeight() uint64 {
85 func (c *mockChain) GetHeaderByHash(*bc.Hash) (*types.BlockHeader, error) {
89 func (c *mockChain) ProcessBlock(*types.Block) (bool, error) {
93 func (c *mockChain) ProcessBlockSignature(signature, pubkey []byte, blockHash *bc.Hash) error {
97 type mockPeers struct {
101 knownSignature *[]byte
104 func newMockPeers(msgCount *int, knownBlock *bc.Hash, blockHeight *uint64, signature *[]byte) *mockPeers {
107 knownBlock: knownBlock,
108 blockHeight: blockHeight,
109 knownSignature: signature,
113 func (ps *mockPeers) AddPeer(peer peers.BasePeer) {
117 func (ps *mockPeers) BroadcastMsg(bm peers.BroadcastMsg) error {
121 func (ps *mockPeers) GetPeer(id string) *peers.Peer {
122 return &peers.Peer{BasePeer: &p2peer{}}
124 func (ps *mockPeers) MarkBlock(peerID string, hash *bc.Hash) {
125 *ps.knownBlock = *hash
128 func (ps *mockPeers) MarkBlockSignature(peerID string, signature []byte) {
129 *ps.knownSignature = append(*ps.knownSignature, signature...)
132 func (ps *mockPeers) ProcessIllegal(peerID string, level byte, reason string) {
135 func (p *mockPeers) RemovePeer(peerID string) {
138 func (ps *mockPeers) SetStatus(peerID string, height uint64, hash *bc.Hash) {
139 *ps.blockHeight = height
142 func TestBlockProposeMsgBroadcastLoop(t *testing.T) {
143 dispatcher := event.NewDispatcher()
146 mgr := NewManager(&mockSW{}, &mockChain{}, newMockPeers(&msgCount, nil, nil, nil), dispatcher)
147 blocks := mockBlocks(nil, uint64(blockHeight))
151 time.Sleep(10 * time.Millisecond)
152 for _, block := range blocks {
153 mgr.eventDispatcher.Post(event.NewProposedBlockEvent{Block: *block})
155 time.Sleep(10 * time.Millisecond)
156 if msgCount != blockHeight+1 {
157 t.Fatalf("broad propose block msg err. got:%d\n want:%d", msgCount, blockHeight+1)
161 func TestBlockSignatureMsgBroadcastLoop(t *testing.T) {
162 dispatcher := event.NewDispatcher()
165 mgr := NewManager(&mockSW{}, &mockChain{}, newMockPeers(&msgCount, nil, nil, nil), dispatcher)
166 blocks := mockBlocks(nil, uint64(blockHeight))
170 time.Sleep(10 * time.Millisecond)
171 for _, block := range blocks {
172 mgr.eventDispatcher.Post(event.BlockSignatureEvent{BlockHash: block.Hash(), Signature: []byte{0x1, 0x2}, XPub: []byte{0x011, 0x022}})
174 time.Sleep(10 * time.Millisecond)
175 if msgCount != blockHeight+1 {
176 t.Fatalf("broad propose block msg err. got:%d\n want:%d", msgCount, blockHeight+1)
180 func TestProcessBlockProposeMsg(t *testing.T) {
181 dispatcher := event.NewDispatcher()
183 var knownBlock bc.Hash
184 blockHeight := uint64(0)
186 mgr := NewManager(&mockSW{}, &mockChain{}, newMockPeers(&msgCount, &knownBlock, &blockHeight, nil), dispatcher)
187 block := &types.Block{
188 BlockHeader: types.BlockHeader{
190 PreviousBlockHash: bc.NewHash([32]byte{0x1}),
191 Version: uint64(rand.Uint32()),
194 msg, err := NewBlockProposeMsg(block)
196 t.Fatal("create new block propose msg err", err)
199 mgr.processMsg(peerID, 0, msg)
200 if knownBlock != block.Hash() {
201 t.Fatalf("mark propose block msg err. got:%d\n want:%d", knownBlock, block.Hash())
204 if blockHeight != block.Height {
205 t.Fatalf("set peer status err. got:%d\n want:%d", blockHeight, block.Height)
209 func TestProcessBlockSignatureMsg(t *testing.T) {
210 dispatcher := event.NewDispatcher()
212 knownSignature := []byte{}
214 mgr := NewManager(&mockSW{}, &mockChain{}, newMockPeers(&msgCount, nil, nil, &knownSignature), dispatcher)
215 block := &types.Block{
216 BlockHeader: types.BlockHeader{
218 PreviousBlockHash: bc.NewHash([32]byte{0x1}),
219 Version: uint64(rand.Uint32()),
223 signature := []byte{0x01, 0x02}
224 msg := NewBlockSignatureMsg(block.Hash(), signature, []byte{0x03, 0x04})
226 mgr.processMsg(peerID, 0, msg)
228 if !reflect.DeepEqual(knownSignature, signature) {
229 t.Fatalf("set peer status err. got:%d\n want:%d", knownSignature, signature)