10 "github.com/tendermint/tmlibs/flowrate"
12 "github.com/bytom/vapor/consensus"
13 "github.com/bytom/vapor/event"
14 "github.com/bytom/vapor/netsync/peers"
15 "github.com/bytom/vapor/p2p"
16 "github.com/bytom/vapor/protocol/bc"
17 "github.com/bytom/vapor/protocol/bc/types"
23 func (p *p2peer) Addr() net.Addr {
27 func (p *p2peer) ID() string {
31 func (p *p2peer) Moniker() string {
35 func (p *p2peer) RemoteAddrHost() string {
38 func (p *p2peer) ServiceFlag() consensus.ServiceFlag {
41 func (p *p2peer) TrafficStatus() (*flowrate.Status, *flowrate.Status) {
44 func (p *p2peer) TrySend(byte, interface{}) bool {
47 func (p *p2peer) IsLAN() bool {
51 func mockBlocks(startBlock *types.Block, height uint64) []*types.Block {
52 blocks := []*types.Block{}
53 indexBlock := &types.Block{}
54 if startBlock == nil {
55 indexBlock = &types.Block{BlockHeader: types.BlockHeader{Version: uint64(rand.Uint32())}}
56 blocks = append(blocks, indexBlock)
58 indexBlock = startBlock
61 for indexBlock.Height < height {
62 block := &types.Block{
63 BlockHeader: types.BlockHeader{
64 Height: indexBlock.Height + 1,
65 PreviousBlockHash: indexBlock.Hash(),
66 Version: uint64(rand.Uint32()),
69 blocks = append(blocks, block)
78 func (s *mockSW) AddReactor(name string, reactor p2p.Reactor) p2p.Reactor {
82 type mockChain struct {
85 func (c *mockChain) BestBlockHeight() uint64 {
89 func (c *mockChain) GetHeaderByHash(*bc.Hash) (*types.BlockHeader, error) {
93 func (c *mockChain) ProcessBlock(*types.Block) (bool, error) {
97 func (c *mockChain) ProcessBlockSignature(signature, pubkey []byte, blockHash *bc.Hash) error {
101 type mockPeers struct {
105 knownSignature *[]byte
108 func newMockPeers(msgCount *int, knownBlock *bc.Hash, blockHeight *uint64, signature *[]byte) *mockPeers {
111 knownBlock: knownBlock,
112 blockHeight: blockHeight,
113 knownSignature: signature,
117 func (ps *mockPeers) AddPeer(peer peers.BasePeer) {
121 func (ps *mockPeers) BroadcastMsg(bm peers.BroadcastMsg) error {
125 func (ps *mockPeers) GetPeer(id string) *peers.Peer {
126 return &peers.Peer{BasePeer: &p2peer{}}
128 func (ps *mockPeers) MarkBlock(peerID string, hash *bc.Hash) {
129 *ps.knownBlock = *hash
132 func (ps *mockPeers) MarkBlockSignature(peerID string, signature []byte) {
133 *ps.knownSignature = append(*ps.knownSignature, signature...)
136 func (ps *mockPeers) ProcessIllegal(peerID string, level byte, reason string) {
139 func (p *mockPeers) RemovePeer(peerID string) {
142 func (ps *mockPeers) SetStatus(peerID string, height uint64, hash *bc.Hash) {
143 *ps.blockHeight = height
146 func TestBlockProposeMsgBroadcastLoop(t *testing.T) {
147 dispatcher := event.NewDispatcher()
150 mgr := NewManager(&mockSW{}, &mockChain{}, newMockPeers(&msgCount, nil, nil, nil), dispatcher)
151 blocks := mockBlocks(nil, uint64(blockHeight))
155 time.Sleep(10 * time.Millisecond)
156 for _, block := range blocks {
157 mgr.eventDispatcher.Post(event.NewProposedBlockEvent{Block: *block})
159 time.Sleep(10 * time.Millisecond)
160 if msgCount != blockHeight+1 {
161 t.Fatalf("broad propose block msg err. got:%d\n want:%d", msgCount, blockHeight+1)
165 func TestBlockSignatureMsgBroadcastLoop(t *testing.T) {
166 dispatcher := event.NewDispatcher()
169 mgr := NewManager(&mockSW{}, &mockChain{}, newMockPeers(&msgCount, nil, nil, nil), dispatcher)
170 blocks := mockBlocks(nil, uint64(blockHeight))
174 time.Sleep(10 * time.Millisecond)
175 for _, block := range blocks {
176 mgr.eventDispatcher.Post(event.BlockSignatureEvent{BlockHash: block.Hash(), Signature: []byte{0x1, 0x2}, XPub: []byte{0x011, 0x022}})
178 time.Sleep(10 * time.Millisecond)
179 if msgCount != blockHeight+1 {
180 t.Fatalf("broad propose block msg err. got:%d\n want:%d", msgCount, blockHeight+1)
184 func TestProcessBlockProposeMsg(t *testing.T) {
185 dispatcher := event.NewDispatcher()
187 var knownBlock bc.Hash
188 blockHeight := uint64(0)
190 mgr := NewManager(&mockSW{}, &mockChain{}, newMockPeers(&msgCount, &knownBlock, &blockHeight, nil), dispatcher)
191 block := &types.Block{
192 BlockHeader: types.BlockHeader{
194 PreviousBlockHash: bc.NewHash([32]byte{0x1}),
195 Version: uint64(rand.Uint32()),
198 msg, err := NewBlockProposeMsg(block)
200 t.Fatal("create new block propose msg err", err)
203 mgr.processMsg(peerID, 0, msg)
204 if knownBlock != block.Hash() {
205 t.Fatalf("mark propose block msg err. got:%d\n want:%d", knownBlock, block.Hash())
208 if blockHeight != block.Height {
209 t.Fatalf("set peer status err. got:%d\n want:%d", blockHeight, block.Height)
213 func TestProcessBlockSignatureMsg(t *testing.T) {
214 dispatcher := event.NewDispatcher()
216 knownSignature := []byte{}
218 mgr := NewManager(&mockSW{}, &mockChain{}, newMockPeers(&msgCount, nil, nil, &knownSignature), dispatcher)
219 block := &types.Block{
220 BlockHeader: types.BlockHeader{
222 PreviousBlockHash: bc.NewHash([32]byte{0x1}),
223 Version: uint64(rand.Uint32()),
227 signature := []byte{0x01, 0x02}
228 msg := NewBlockSignatureMsg(block.Hash(), signature, []byte{0x03, 0x04})
230 mgr.processMsg(peerID, 0, msg)
232 if !reflect.DeepEqual(knownSignature, signature) {
233 t.Fatalf("set peer status err. got:%d\n want:%d", knownSignature, signature)