github.com/klaytn/klaytn@v1.10.2/node/cn/handler_test.go (about)

     1  // Copyright 2019 The klaytn Authors
     2  // This file is part of the klaytn library.
     3  //
     4  // The klaytn library is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU Lesser General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // The klaytn library is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  // GNU Lesser General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU Lesser General Public License
    15  // along with the klaytn library. If not, see <http://www.gnu.org/licenses/>.
    16  
    17  package cn
    18  
    19  import (
    20  	"crypto/ecdsa"
    21  	"fmt"
    22  	"math/big"
    23  	"math/rand"
    24  	"sort"
    25  	"testing"
    26  	"time"
    27  
    28  	"github.com/golang/mock/gomock"
    29  	"github.com/klaytn/klaytn/blockchain"
    30  	"github.com/klaytn/klaytn/blockchain/types"
    31  	"github.com/klaytn/klaytn/common"
    32  	"github.com/klaytn/klaytn/consensus"
    33  	consensusmocks "github.com/klaytn/klaytn/consensus/mocks"
    34  	"github.com/klaytn/klaytn/crypto"
    35  	"github.com/klaytn/klaytn/datasync/downloader"
    36  	"github.com/klaytn/klaytn/event"
    37  	"github.com/klaytn/klaytn/networks/p2p"
    38  	"github.com/klaytn/klaytn/networks/p2p/discover"
    39  	"github.com/klaytn/klaytn/node/cn/mocks"
    40  	"github.com/klaytn/klaytn/params"
    41  	"github.com/klaytn/klaytn/reward"
    42  	workmocks "github.com/klaytn/klaytn/work/mocks"
    43  	"github.com/stretchr/testify/assert"
    44  )
    45  
    46  const blockNum1 = 20190902
    47  
    48  var td1 = big.NewInt(123)
    49  
    50  const numVals = 6
    51  
    52  var (
    53  	addrs    []common.Address
    54  	keys     []*ecdsa.PrivateKey
    55  	nodeids  []discover.NodeID
    56  	p2pPeers []*p2p.Peer
    57  	blocks   []*types.Block
    58  	hashes   []common.Hash
    59  )
    60  
    61  var (
    62  	tx1 *types.Transaction
    63  	txs types.Transactions
    64  )
    65  
    66  var hash1 common.Hash
    67  
    68  var signer types.Signer
    69  
    70  func init() {
    71  	addrs = make([]common.Address, numVals)
    72  	keys = make([]*ecdsa.PrivateKey, numVals)
    73  	nodeids = make([]discover.NodeID, numVals)
    74  	p2pPeers = make([]*p2p.Peer, numVals)
    75  	blocks = make([]*types.Block, numVals)
    76  	hashes = make([]common.Hash, numVals)
    77  
    78  	for i := range keys {
    79  		keys[i], _ = crypto.GenerateKey()
    80  		addrs[i] = crypto.PubkeyToAddress(keys[i].PublicKey)
    81  		nodeids[i] = discover.PubkeyID(&keys[i].PublicKey)
    82  		p2pPeers[i] = p2p.NewPeer(nodeids[i], nodeids[i].String(), []p2p.Cap{})
    83  		blocks[i] = newBlock(i)
    84  		hashes[i] = blocks[i].Hash()
    85  	}
    86  
    87  	signer := types.MakeSigner(params.BFTTestChainConfig, big.NewInt(2019))
    88  	tx1 = types.NewTransaction(111, addrs[0], big.NewInt(111), 111, big.NewInt(111), addrs[0][:])
    89  
    90  	tx1.Sign(signer, keys[0])
    91  	tx1.Size()
    92  	txs = types.Transactions{tx1}
    93  
    94  	hash1 = tx1.Hash()
    95  }
    96  
    97  func newMocks(t *testing.T) (*gomock.Controller, *consensusmocks.MockEngine, *workmocks.MockBlockChain, *workmocks.MockTxPool) {
    98  	mockCtrl := gomock.NewController(t)
    99  	mockEngine := consensusmocks.NewMockEngine(mockCtrl)
   100  	mockBlockChain := workmocks.NewMockBlockChain(mockCtrl)
   101  	mockTxPool := workmocks.NewMockTxPool(mockCtrl)
   102  
   103  	return mockCtrl, mockEngine, mockBlockChain, mockTxPool
   104  }
   105  
   106  func newBlock(blockNum int) *types.Block {
   107  	header := &types.Header{
   108  		Number:     big.NewInt(int64(blockNum)),
   109  		BlockScore: big.NewInt(int64(1)),
   110  		Extra:      addrs[0][:],
   111  		Governance: addrs[0][:],
   112  		Vote:       addrs[0][:],
   113  	}
   114  	header.Hash()
   115  	block := types.NewBlockWithHeader(header)
   116  	block = block.WithBody(types.Transactions{})
   117  	block.Hash()
   118  	block.Size()
   119  	block.BlockScore()
   120  	return block
   121  }
   122  
   123  func newBlockWithParentHash(blockNum int, parentHash common.Hash) *types.Block {
   124  	header := &types.Header{
   125  		Number:     big.NewInt(int64(blockNum)),
   126  		BlockScore: big.NewInt(int64(1)),
   127  		Extra:      addrs[0][:],
   128  		Governance: addrs[0][:],
   129  		Vote:       addrs[0][:],
   130  		ParentHash: parentHash,
   131  	}
   132  	header.Hash()
   133  	block := types.NewBlockWithHeader(header)
   134  	block = block.WithBody(types.Transactions{})
   135  	block.Hash()
   136  	block.Size()
   137  	block.BlockScore()
   138  	return block
   139  }
   140  
   141  func newReceipt(gasUsed int) *types.Receipt {
   142  	rct := types.NewReceipt(uint(gasUsed), common.Hash{}, uint64(gasUsed))
   143  	rct.Logs = []*types.Log{}
   144  	rct.Bloom = types.Bloom{}
   145  	return rct
   146  }
   147  
   148  func newStakingInfo(blockNumber uint64) *reward.StakingInfo {
   149  	return &reward.StakingInfo{
   150  		BlockNum:              blockNumber,
   151  		CouncilNodeAddrs:      []common.Address{{0x1}, {0x1}},
   152  		CouncilStakingAddrs:   []common.Address{{0x2}, {0x2}},
   153  		CouncilRewardAddrs:    []common.Address{{0x3}, {0x3}},
   154  		CouncilStakingAmounts: []uint64{2, 5, 6},
   155  	}
   156  }
   157  
   158  func TestNewProtocolManager(t *testing.T) {
   159  	// 1. If consensus.Engine returns an empty Protocol, NewProtocolManager throws an error.
   160  	{
   161  		mockCtrl, mockEngine, mockBlockChain, mockTxPool := newMocks(t)
   162  		defer mockCtrl.Finish()
   163  
   164  		block := newBlock(blockNum1)
   165  		mockBlockChain.EXPECT().CurrentBlock().Return(block).Times(1)
   166  		mockEngine.EXPECT().Protocol().Return(consensus.Protocol{}).Times(1)
   167  
   168  		pm, err := NewProtocolManager(nil, downloader.FastSync, 0, nil, mockTxPool,
   169  			mockEngine, mockBlockChain, nil, 1, -1, &Config{})
   170  
   171  		assert.Nil(t, pm)
   172  		assert.Equal(t, errIncompatibleConfig, err)
   173  	}
   174  }
   175  
   176  func TestProtocolManager_RegisterValidator(t *testing.T) {
   177  	pm := &ProtocolManager{}
   178  	mockCtrl := gomock.NewController(t)
   179  	defer mockCtrl.Finish()
   180  
   181  	mockPeerSet := NewMockPeerSet(mockCtrl)
   182  	pm.peers = mockPeerSet
   183  
   184  	val := &ByPassValidator{}
   185  
   186  	mockPeerSet.EXPECT().RegisterValidator(common.CONSENSUSNODE, val).Times(1)
   187  	mockPeerSet.EXPECT().RegisterValidator(common.ENDPOINTNODE, val).Times(1)
   188  	mockPeerSet.EXPECT().RegisterValidator(common.PROXYNODE, val).Times(1)
   189  	mockPeerSet.EXPECT().RegisterValidator(common.BOOTNODE, val).Times(1)
   190  	mockPeerSet.EXPECT().RegisterValidator(common.UNKNOWNNODE, val).Times(1)
   191  
   192  	pm.RegisterValidator(common.CONSENSUSNODE, val)
   193  	pm.RegisterValidator(common.ENDPOINTNODE, val)
   194  	pm.RegisterValidator(common.PROXYNODE, val)
   195  	pm.RegisterValidator(common.BOOTNODE, val)
   196  	pm.RegisterValidator(common.UNKNOWNNODE, val)
   197  }
   198  
   199  func TestProtocolManager_getWSEndPoint(t *testing.T) {
   200  	pm := &ProtocolManager{}
   201  
   202  	ws1 := "abc"
   203  	ws2 := "123"
   204  
   205  	pm.SetWsEndPoint(ws1)
   206  	assert.Equal(t, ws1, pm.getWSEndPoint())
   207  
   208  	pm.SetWsEndPoint(ws2)
   209  	assert.Equal(t, ws2, pm.getWSEndPoint())
   210  }
   211  
   212  func TestProtocolManager_SetRewardbase(t *testing.T) {
   213  	pm := &ProtocolManager{rewardbase: addrs[0]}
   214  	assert.Equal(t, addrs[0], pm.rewardbase)
   215  
   216  	pm.SetRewardbase(addrs[1])
   217  	assert.Equal(t, addrs[1], pm.rewardbase)
   218  }
   219  
   220  func TestProtocolManager_removePeer(t *testing.T) {
   221  	peerID := nodeids[0].String()
   222  
   223  	{
   224  		pm := &ProtocolManager{}
   225  		mockCtrl := gomock.NewController(t)
   226  
   227  		mockPeerSet := NewMockPeerSet(mockCtrl)
   228  		pm.peers = mockPeerSet
   229  
   230  		mockPeerSet.EXPECT().Peer(peerID).Return(nil).Times(1)
   231  		pm.removePeer(peerID)
   232  
   233  		mockCtrl.Finish()
   234  	}
   235  
   236  	{
   237  		pm := &ProtocolManager{}
   238  		mockCtrl := gomock.NewController(t)
   239  
   240  		mockPeerSet := NewMockPeerSet(mockCtrl)
   241  		pm.peers = mockPeerSet
   242  
   243  		mockPeer := NewMockPeer(mockCtrl)
   244  
   245  		mockDownloader := mocks.NewMockProtocolManagerDownloader(mockCtrl)
   246  		mockDownloader.EXPECT().UnregisterPeer(peerID).Times(1)
   247  		pm.downloader = mockDownloader
   248  
   249  		// Return
   250  		mockPeer.EXPECT().ExistSnapExtension().Return(false).Times(1)
   251  
   252  		mockPeerSet.EXPECT().Unregister(peerID).Return(expectedErr).Times(1)
   253  
   254  		mockPeer.EXPECT().GetP2PPeer().Return(p2pPeers[0]).Times(1)
   255  
   256  		mockPeerSet.EXPECT().Peer(peerID).Return(mockPeer).Times(1)
   257  		pm.removePeer(peerID)
   258  
   259  		mockCtrl.Finish()
   260  	}
   261  
   262  	{
   263  		pm := &ProtocolManager{}
   264  		mockCtrl := gomock.NewController(t)
   265  
   266  		mockPeerSet := NewMockPeerSet(mockCtrl)
   267  		pm.peers = mockPeerSet
   268  
   269  		mockPeer := NewMockPeer(mockCtrl)
   270  
   271  		mockDownloader := mocks.NewMockProtocolManagerDownloader(mockCtrl)
   272  		mockDownloader.EXPECT().UnregisterPeer(peerID).Times(1)
   273  		pm.downloader = mockDownloader
   274  
   275  		// Return
   276  		mockPeer.EXPECT().ExistSnapExtension().Return(false).Times(1)
   277  
   278  		mockPeerSet.EXPECT().Unregister(peerID).Return(nil).Times(1)
   279  
   280  		mockPeer.EXPECT().GetP2PPeer().Return(p2pPeers[0]).Times(1)
   281  
   282  		mockPeerSet.EXPECT().Peer(peerID).Return(mockPeer).Times(1)
   283  		pm.removePeer(peerID)
   284  
   285  		mockCtrl.Finish()
   286  	}
   287  }
   288  
   289  func TestProtocolManager_getChainID(t *testing.T) {
   290  	pm := &ProtocolManager{}
   291  	mockCtrl := gomock.NewController(t)
   292  	defer mockCtrl.Finish()
   293  
   294  	cfg := &params.ChainConfig{ChainID: big.NewInt(12345)}
   295  
   296  	mockBlockChain := workmocks.NewMockBlockChain(mockCtrl)
   297  	mockBlockChain.EXPECT().Config().Return(cfg).AnyTimes()
   298  	pm.blockchain = mockBlockChain
   299  
   300  	assert.Equal(t, cfg.ChainID, pm.getChainID())
   301  }
   302  
   303  func TestProtocolManager_processMsg_panicRecover(t *testing.T) {
   304  	pm := &ProtocolManager{}
   305  	mockCtrl := gomock.NewController(t)
   306  	defer mockCtrl.Finish()
   307  
   308  	msgCh := make(chan p2p.Msg)
   309  	errCh := make(chan error)
   310  	addr := common.Address{}
   311  
   312  	mockPeer := NewMockPeer(mockCtrl)
   313  	mockPeer.EXPECT().GetVersion().Do(
   314  		func() { panic("panic test") },
   315  	)
   316  
   317  	// pm.processMsg will be panicked by the mockPeer
   318  	go pm.processMsg(msgCh, mockPeer, addr, errCh)
   319  
   320  	msgCh <- p2p.Msg{Code: NodeDataMsg}
   321  
   322  	// panic will be recovered and errCh will receive an error
   323  	err := <-errCh
   324  	assert.Equal(t, errUnknownProcessingError, err)
   325  }
   326  
   327  func TestSampleSize(t *testing.T) {
   328  	peers := make([]Peer, minNumPeersToSendBlock-1)
   329  	assert.Equal(t, len(peers), sampleSize(peers))
   330  
   331  	peers = make([]Peer, 4)
   332  	assert.Equal(t, minNumPeersToSendBlock, sampleSize(peers))
   333  
   334  	peers = make([]Peer, 16)
   335  	assert.Equal(t, 4, sampleSize(peers))
   336  }
   337  
   338  func TestSamplingPeers(t *testing.T) {
   339  	peers := make([]Peer, 10)
   340  	assert.Equal(t, peers, samplingPeers(peers, 20))
   341  	assert.Equal(t, peers[:5], samplingPeers(peers, 5))
   342  }
   343  
   344  func TestBroadcastBlock_NoParentExists(t *testing.T) {
   345  	pm := &ProtocolManager{}
   346  	pm.nodetype = common.ENDPOINTNODE
   347  	block := newBlock(blockNum1)
   348  	mockCtrl := gomock.NewController(t)
   349  	defer mockCtrl.Finish()
   350  
   351  	td := int64(100)
   352  	mockBlockChain := workmocks.NewMockBlockChain(mockCtrl)
   353  	mockBlockChain.EXPECT().GetBlock(block.ParentHash(), block.NumberU64()-1).Return(nil).Times(1)
   354  	mockBlockChain.EXPECT().GetTd(block.ParentHash(), block.NumberU64()-1).Return(big.NewInt(td)).Times(0)
   355  	pm.blockchain = mockBlockChain
   356  
   357  	mockPeers := NewMockPeerSet(mockCtrl)
   358  	pm.peers = mockPeers
   359  
   360  	mockPeer := NewMockPeer(mockCtrl)
   361  	mockPeers.EXPECT().SamplePeersToSendBlock(block, pm.nodetype).Return([]Peer{mockPeer}).Times(0)
   362  	mockPeer.EXPECT().AsyncSendNewBlock(block, new(big.Int).Add(block.BlockScore(), big.NewInt(td))).Times(0)
   363  
   364  	pm.BroadcastBlock(block)
   365  }
   366  
   367  func TestBroadcastBlock_ParentExists(t *testing.T) {
   368  	pm := &ProtocolManager{}
   369  	pm.nodetype = common.ENDPOINTNODE
   370  	block := newBlock(blockNum1)
   371  	mockCtrl := gomock.NewController(t)
   372  	defer mockCtrl.Finish()
   373  
   374  	td := int64(100)
   375  	mockBlockChain := workmocks.NewMockBlockChain(mockCtrl)
   376  	mockBlockChain.EXPECT().GetBlock(block.ParentHash(), block.NumberU64()-1).Return(block).Times(1)
   377  	mockBlockChain.EXPECT().GetTd(block.ParentHash(), block.NumberU64()-1).Return(big.NewInt(td)).Times(1)
   378  	pm.blockchain = mockBlockChain
   379  
   380  	mockPeers := NewMockPeerSet(mockCtrl)
   381  	pm.peers = mockPeers
   382  
   383  	mockPeer := NewMockPeer(mockCtrl)
   384  	mockPeers.EXPECT().SamplePeersToSendBlock(block, pm.nodetype).Return([]Peer{mockPeer}).Times(1)
   385  	mockPeer.EXPECT().AsyncSendNewBlock(block, new(big.Int).Add(block.BlockScore(), big.NewInt(td))).Times(1)
   386  
   387  	pm.BroadcastBlock(block)
   388  }
   389  
   390  func TestBroadcastBlockHash(t *testing.T) {
   391  	pm := &ProtocolManager{}
   392  	pm.nodetype = common.ENDPOINTNODE
   393  	block := newBlock(blockNum1)
   394  	mockCtrl := gomock.NewController(t)
   395  	defer mockCtrl.Finish()
   396  
   397  	// When the given block doesn't exist.
   398  	{
   399  		mockBlockChain := workmocks.NewMockBlockChain(mockCtrl)
   400  		mockBlockChain.EXPECT().HasBlock(block.Hash(), block.NumberU64()).Return(false).Times(1)
   401  		pm.blockchain = mockBlockChain
   402  		pm.BroadcastBlockHash(block)
   403  	}
   404  
   405  	// When the given block exists.
   406  	{
   407  		mockBlockChain := workmocks.NewMockBlockChain(mockCtrl)
   408  		mockBlockChain.EXPECT().HasBlock(block.Hash(), block.NumberU64()).Return(true).Times(1)
   409  		pm.blockchain = mockBlockChain
   410  
   411  		mockPeer := NewMockPeer(mockCtrl)
   412  		mockPeer.EXPECT().AsyncSendNewBlockHash(block).Times(1)
   413  
   414  		mockPeers := NewMockPeerSet(mockCtrl)
   415  		mockPeers.EXPECT().PeersWithoutBlock(block.Hash()).Return([]Peer{mockPeer}).Times(1)
   416  		pm.peers = mockPeers
   417  
   418  		pm.BroadcastBlockHash(block)
   419  	}
   420  }
   421  
   422  func TestProtocolManager_txBroadcastLoop_FromCN_CN_NotExists(t *testing.T) {
   423  	pm := &ProtocolManager{}
   424  	pm.nodetype = common.CONSENSUSNODE
   425  	mockCtrl := gomock.NewController(t)
   426  	defer mockCtrl.Finish()
   427  
   428  	txsCh := make(chan blockchain.NewTxsEvent, txChanSize)
   429  	pm.txsCh = txsCh
   430  
   431  	feed := &event.Feed{}
   432  	pm.txsSub = feed.Subscribe(txsCh)
   433  
   434  	peers := newPeerSet()
   435  	pm.peers = peers
   436  	cnPeer, pnPeer, enPeer := createAndRegisterPeers(mockCtrl, peers)
   437  
   438  	// Using gomock.Eq(txs) for AsyncSendTransactions calls,
   439  	// since transactions are put into a new list inside broadcastCNTx.
   440  	cnPeer.EXPECT().KnowsTx(tx1.Hash()).Return(true).Times(1)
   441  	cnPeer.EXPECT().AsyncSendTransactions(gomock.Eq(txs)).Times(0)
   442  	pnPeer.EXPECT().AsyncSendTransactions(gomock.Eq(txs)).Times(0)
   443  	enPeer.EXPECT().AsyncSendTransactions(gomock.Eq(txs)).Times(0)
   444  
   445  	go pm.txBroadcastLoop()
   446  
   447  	txsCh <- blockchain.NewTxsEvent{Txs: txs}
   448  
   449  	time.Sleep(500 * time.Millisecond)
   450  
   451  	pm.txsSub.Unsubscribe()
   452  }
   453  
   454  func TestBroadcastTxsFromCN_CN_NotExists(t *testing.T) {
   455  	pm := &ProtocolManager{}
   456  	pm.nodetype = common.CONSENSUSNODE
   457  	mockCtrl := gomock.NewController(t)
   458  	defer mockCtrl.Finish()
   459  
   460  	peers := newPeerSet()
   461  	pm.peers = peers
   462  	cnPeer, pnPeer, enPeer := createAndRegisterPeers(mockCtrl, peers)
   463  
   464  	// Using gomock.Eq(txs) for AsyncSendTransactions calls,
   465  	// since transactions are put into a new list inside broadcastCNTx.
   466  	cnPeer.EXPECT().KnowsTx(tx1.Hash()).Return(true).Times(1)
   467  	cnPeer.EXPECT().AsyncSendTransactions(gomock.Eq(txs)).Times(0)
   468  	pnPeer.EXPECT().AsyncSendTransactions(gomock.Eq(txs)).Times(0)
   469  	enPeer.EXPECT().AsyncSendTransactions(gomock.Eq(txs)).Times(0)
   470  
   471  	pm.BroadcastTxs(txs)
   472  }
   473  
   474  func TestBroadcastTxsFromCN_CN_Exists(t *testing.T) {
   475  	pm := &ProtocolManager{}
   476  	pm.nodetype = common.CONSENSUSNODE
   477  	mockCtrl := gomock.NewController(t)
   478  	defer mockCtrl.Finish()
   479  
   480  	peers := newPeerSet()
   481  	pm.peers = peers
   482  	cnPeer, pnPeer, enPeer := createAndRegisterPeers(mockCtrl, peers)
   483  
   484  	// Using gomock.Eq(txs) for AsyncSendTransactions calls,
   485  	// since transactions are put into a new list inside broadcastCNTx.
   486  	cnPeer.EXPECT().KnowsTx(tx1.Hash()).Return(false).Times(1)
   487  	cnPeer.EXPECT().AsyncSendTransactions(gomock.Eq(txs)).Times(1)
   488  	pnPeer.EXPECT().AsyncSendTransactions(gomock.Eq(txs)).Times(0)
   489  	enPeer.EXPECT().AsyncSendTransactions(gomock.Eq(txs)).Times(0)
   490  
   491  	pm.BroadcastTxs(txs)
   492  }
   493  
   494  func TestBroadcastTxsFromPN_PN_NotExists(t *testing.T) {
   495  	pm := &ProtocolManager{}
   496  	pm.nodetype = common.PROXYNODE
   497  	mockCtrl := gomock.NewController(t)
   498  	defer mockCtrl.Finish()
   499  
   500  	peers := newPeerSet()
   501  	pm.peers = peers
   502  	cnPeer, pnPeer, enPeer := createAndRegisterPeers(mockCtrl, peers)
   503  
   504  	cnPeer.EXPECT().KnowsTx(tx1.Hash()).Return(false).Times(1)
   505  
   506  	cnPeer.EXPECT().ConnType().Return(common.CONSENSUSNODE).Times(1)
   507  	pnPeer.EXPECT().ConnType().Return(common.PROXYNODE).Times(1)
   508  	enPeer.EXPECT().ConnType().Return(common.ENDPOINTNODE).Times(1)
   509  
   510  	pnPeer.EXPECT().KnowsTx(tx1.Hash()).Return(true).Times(1)
   511  
   512  	cnPeer.EXPECT().SendTransactions(gomock.Eq(txs)).Times(1)
   513  	pnPeer.EXPECT().SendTransactions(gomock.Eq(txs)).Times(0)
   514  	enPeer.EXPECT().SendTransactions(gomock.Eq(txs)).Times(0)
   515  
   516  	pm.BroadcastTxs(txs)
   517  }
   518  
   519  func TestBroadcastTxsFromPN_PN_Exists(t *testing.T) {
   520  	pm := &ProtocolManager{}
   521  	pm.nodetype = common.PROXYNODE
   522  	mockCtrl := gomock.NewController(t)
   523  	defer mockCtrl.Finish()
   524  
   525  	peers := newPeerSet()
   526  	pm.peers = peers
   527  	cnPeer, pnPeer, enPeer := createAndRegisterPeers(mockCtrl, peers)
   528  
   529  	cnPeer.EXPECT().KnowsTx(tx1.Hash()).Return(false).Times(1)
   530  
   531  	cnPeer.EXPECT().ConnType().Return(common.CONSENSUSNODE).Times(1)
   532  	pnPeer.EXPECT().ConnType().Return(common.PROXYNODE).Times(1)
   533  	enPeer.EXPECT().ConnType().Return(common.ENDPOINTNODE).Times(1)
   534  
   535  	pnPeer.EXPECT().KnowsTx(tx1.Hash()).Return(false).Times(1)
   536  
   537  	cnPeer.EXPECT().SendTransactions(gomock.Eq(txs)).Times(1)
   538  	pnPeer.EXPECT().SendTransactions(gomock.Eq(txs)).Times(1)
   539  	enPeer.EXPECT().SendTransactions(gomock.Eq(txs)).Times(0)
   540  
   541  	pm.BroadcastTxs(txs)
   542  }
   543  
   544  func TestBroadcastTxsFromEN_ALL_NotExists(t *testing.T) {
   545  	pm := &ProtocolManager{}
   546  	pm.nodetype = common.ENDPOINTNODE
   547  	mockCtrl := gomock.NewController(t)
   548  	defer mockCtrl.Finish()
   549  
   550  	peers := newPeerSet()
   551  	pm.peers = peers
   552  	cnPeer, pnPeer, enPeer := createAndRegisterPeers(mockCtrl, peers)
   553  
   554  	cnPeer.EXPECT().ConnType().Return(common.CONSENSUSNODE).AnyTimes()
   555  	pnPeer.EXPECT().ConnType().Return(common.PROXYNODE).AnyTimes()
   556  	enPeer.EXPECT().ConnType().Return(common.ENDPOINTNODE).AnyTimes()
   557  
   558  	cnPeer.EXPECT().KnowsTx(tx1.Hash()).Return(true).Times(1)
   559  	pnPeer.EXPECT().KnowsTx(tx1.Hash()).Return(true).Times(1)
   560  	enPeer.EXPECT().KnowsTx(tx1.Hash()).Return(true).Times(1)
   561  
   562  	cnPeer.EXPECT().SendTransactions(gomock.Eq(txs)).Times(0)
   563  	pnPeer.EXPECT().SendTransactions(gomock.Eq(txs)).Times(0)
   564  	enPeer.EXPECT().SendTransactions(gomock.Eq(txs)).Times(0)
   565  
   566  	pm.BroadcastTxs(txs)
   567  }
   568  
   569  func TestBroadcastTxsFromEN_ALL_Exists(t *testing.T) {
   570  	pm := &ProtocolManager{}
   571  	pm.nodetype = common.ENDPOINTNODE
   572  	mockCtrl := gomock.NewController(t)
   573  	defer mockCtrl.Finish()
   574  
   575  	peers := newPeerSet()
   576  	pm.peers = peers
   577  	cnPeer, pnPeer, enPeer := createAndRegisterPeers(mockCtrl, peers)
   578  
   579  	cnPeer.EXPECT().ConnType().Return(common.CONSENSUSNODE).AnyTimes()
   580  	pnPeer.EXPECT().ConnType().Return(common.PROXYNODE).AnyTimes()
   581  	enPeer.EXPECT().ConnType().Return(common.ENDPOINTNODE).AnyTimes()
   582  
   583  	cnPeer.EXPECT().KnowsTx(tx1.Hash()).Return(false).Times(1)
   584  	pnPeer.EXPECT().KnowsTx(tx1.Hash()).Return(false).Times(1)
   585  	enPeer.EXPECT().KnowsTx(tx1.Hash()).Return(false).Times(1)
   586  
   587  	cnPeer.EXPECT().SendTransactions(gomock.Eq(txs)).Times(1)
   588  	pnPeer.EXPECT().SendTransactions(gomock.Eq(txs)).Times(1)
   589  	enPeer.EXPECT().SendTransactions(gomock.Eq(txs)).Times(1)
   590  
   591  	pm.BroadcastTxs(txs)
   592  }
   593  
   594  func TestBroadcastTxsFrom_DefaultCase(t *testing.T) {
   595  	pm := &ProtocolManager{}
   596  	pm.nodetype = common.BOOTNODE
   597  	mockCtrl := gomock.NewController(t)
   598  	defer mockCtrl.Finish()
   599  
   600  	peers := newPeerSet()
   601  	pm.peers = peers
   602  	createAndRegisterPeers(mockCtrl, peers)
   603  
   604  	// There are no expected calls for the mocks.
   605  	pm.nodetype = common.BOOTNODE
   606  	pm.BroadcastTxs(txs)
   607  
   608  	pm.nodetype = common.UNKNOWNNODE
   609  	pm.BroadcastTxs(txs)
   610  }
   611  
   612  func TestProtocolManager_txResendLoop(t *testing.T) {
   613  	pm := &ProtocolManager{}
   614  	pm.nodetype = common.CONSENSUSNODE
   615  	mockCtrl := gomock.NewController(t)
   616  	defer mockCtrl.Finish()
   617  
   618  	peers := newPeerSet()
   619  	pm.peers = peers
   620  	createAndRegisterPeers(mockCtrl, peers)
   621  
   622  	pm.quitResendCh = make(chan struct{})
   623  
   624  	maxTxCount := 100
   625  	mockTxPool := workmocks.NewMockTxPool(mockCtrl)
   626  	mockTxPool.EXPECT().CachedPendingTxsByCount(maxTxCount).Return(txs).Times(1)
   627  
   628  	pm.txpool = mockTxPool
   629  
   630  	go pm.txResendLoop(1, maxTxCount)
   631  
   632  	time.Sleep(1500 * time.Millisecond)
   633  
   634  	pm.quitResendCh <- struct{}{}
   635  }
   636  
   637  func TestProtocolManager_txResend(t *testing.T) {
   638  	pm := &ProtocolManager{}
   639  	pm.nodetype = common.CONSENSUSNODE
   640  	mockCtrl := gomock.NewController(t)
   641  	defer mockCtrl.Finish()
   642  
   643  	peers := newPeerSet()
   644  	pm.peers = peers
   645  	createAndRegisterPeers(mockCtrl, peers)
   646  
   647  	pm.txResend(txs)
   648  }
   649  
   650  func TestReBroadcastTxs_CN(t *testing.T) {
   651  	pm := &ProtocolManager{}
   652  	pm.nodetype = common.CONSENSUSNODE
   653  	mockCtrl := gomock.NewController(t)
   654  	defer mockCtrl.Finish()
   655  
   656  	peers := newPeerSet()
   657  	pm.peers = peers
   658  	createAndRegisterPeers(mockCtrl, peers)
   659  
   660  	pm.ReBroadcastTxs(txs)
   661  }
   662  
   663  func TestReBroadcastTxs_PN(t *testing.T) {
   664  	// CN Peer=0, PN Peer=1
   665  	{
   666  		pm := &ProtocolManager{}
   667  		pm.nodetype = common.PROXYNODE
   668  		mockCtrl := gomock.NewController(t)
   669  
   670  		peers := newPeerSet()
   671  		pm.peers = peers
   672  
   673  		enPeer := NewMockPeer(mockCtrl)
   674  		enPeer.EXPECT().ConnType().Return(common.PROXYNODE).Times(2)
   675  		enPeer.EXPECT().SendTransactions(gomock.Eq(txs)).Times(1)
   676  
   677  		peers.enpeers[addrs[2]] = enPeer
   678  		peers.peers[fmt.Sprintf("%x", nodeids[2][:8])] = enPeer
   679  
   680  		pm.ReBroadcastTxs(txs)
   681  
   682  		mockCtrl.Finish()
   683  	}
   684  	// CN Peer=1, PN Peer=0
   685  	{
   686  		pm := &ProtocolManager{}
   687  		pm.nodetype = common.PROXYNODE
   688  		mockCtrl := gomock.NewController(t)
   689  
   690  		peers := newPeerSet()
   691  		pm.peers = peers
   692  
   693  		pnPeer := NewMockPeer(mockCtrl)
   694  		pnPeer.EXPECT().ConnType().Return(common.CONSENSUSNODE).Times(1)
   695  		pnPeer.EXPECT().SendTransactions(gomock.Eq(txs)).Times(1)
   696  
   697  		peers.pnpeers[addrs[2]] = pnPeer
   698  		peers.peers[fmt.Sprintf("%x", nodeids[2][:8])] = pnPeer
   699  
   700  		pm.ReBroadcastTxs(txs)
   701  
   702  		mockCtrl.Finish()
   703  	}
   704  }
   705  
   706  func TestReBroadcastTxs_EN(t *testing.T) {
   707  	// PN Peer=0, EN Peer=1
   708  	{
   709  		pm := &ProtocolManager{}
   710  		pm.nodetype = common.ENDPOINTNODE
   711  		mockCtrl := gomock.NewController(t)
   712  
   713  		peers := newPeerSet()
   714  		pm.peers = peers
   715  
   716  		enPeer := NewMockPeer(mockCtrl)
   717  		enPeer.EXPECT().ConnType().Return(common.ENDPOINTNODE).Times(3)
   718  		enPeer.EXPECT().SendTransactions(gomock.Eq(txs)).Times(1)
   719  
   720  		peers.enpeers[addrs[2]] = enPeer
   721  		peers.peers[fmt.Sprintf("%x", nodeids[2][:8])] = enPeer
   722  
   723  		pm.ReBroadcastTxs(txs)
   724  
   725  		mockCtrl.Finish()
   726  	}
   727  	// PN Peer=1, EN Peer=0
   728  	{
   729  		pm := &ProtocolManager{}
   730  		pm.nodetype = common.ENDPOINTNODE
   731  		mockCtrl := gomock.NewController(t)
   732  
   733  		peers := newPeerSet()
   734  		pm.peers = peers
   735  
   736  		pnPeer := NewMockPeer(mockCtrl)
   737  		pnPeer.EXPECT().ConnType().Return(common.PROXYNODE).Times(3)
   738  		pnPeer.EXPECT().SendTransactions(gomock.Eq(txs)).Times(1)
   739  
   740  		peers.pnpeers[addrs[2]] = pnPeer
   741  		peers.peers[fmt.Sprintf("%x", nodeids[2][:8])] = pnPeer
   742  
   743  		pm.ReBroadcastTxs(txs)
   744  
   745  		mockCtrl.Finish()
   746  	}
   747  }
   748  
   749  func TestUseTxResend(t *testing.T) {
   750  	testSet := [...]struct {
   751  		pm     *ProtocolManager
   752  		result bool
   753  	}{
   754  		{&ProtocolManager{nodetype: common.CONSENSUSNODE, txResendUseLegacy: true}, false},
   755  		{&ProtocolManager{nodetype: common.ENDPOINTNODE, txResendUseLegacy: true}, false},
   756  		{&ProtocolManager{nodetype: common.PROXYNODE, txResendUseLegacy: true}, false},
   757  		{&ProtocolManager{nodetype: common.BOOTNODE, txResendUseLegacy: true}, false},
   758  		{&ProtocolManager{nodetype: common.UNKNOWNNODE, txResendUseLegacy: true}, false},
   759  
   760  		{&ProtocolManager{nodetype: common.CONSENSUSNODE, txResendUseLegacy: false}, false},
   761  		{&ProtocolManager{nodetype: common.ENDPOINTNODE, txResendUseLegacy: false}, true},
   762  		{&ProtocolManager{nodetype: common.PROXYNODE, txResendUseLegacy: false}, true},
   763  		{&ProtocolManager{nodetype: common.BOOTNODE, txResendUseLegacy: false}, true},
   764  		{&ProtocolManager{nodetype: common.UNKNOWNNODE, txResendUseLegacy: false}, true},
   765  	}
   766  
   767  	for _, tc := range testSet {
   768  		assert.Equal(t, tc.result, tc.pm.useTxResend())
   769  	}
   770  }
   771  
   772  func TestNodeInfo(t *testing.T) {
   773  	pm := &ProtocolManager{}
   774  	pm.nodetype = common.ENDPOINTNODE
   775  	mockCtrl := gomock.NewController(t)
   776  	defer mockCtrl.Finish()
   777  
   778  	mockBlockChain := workmocks.NewMockBlockChain(mockCtrl)
   779  	pm.blockchain = mockBlockChain
   780  
   781  	genesis := newBlock(0)
   782  	block := newBlock(blockNum1)
   783  	config := &params.ChainConfig{ChainID: td1}
   784  
   785  	pm.networkId = 1234
   786  	mockBlockChain.EXPECT().CurrentBlock().Return(block).Times(1)
   787  	mockBlockChain.EXPECT().GetTd(block.Hash(), block.NumberU64()).Return(td1).Times(1)
   788  	mockBlockChain.EXPECT().Genesis().Return(genesis).Times(1)
   789  	mockBlockChain.EXPECT().Config().Return(config).Times(1)
   790  
   791  	expected := &NodeInfo{
   792  		Network:    pm.networkId,
   793  		BlockScore: td1,
   794  		Genesis:    genesis.Hash(),
   795  		Config:     config,
   796  		Head:       block.Hash(),
   797  	}
   798  
   799  	assert.Equal(t, *expected, *pm.NodeInfo())
   800  }
   801  
   802  func TestGetCNPeersAndGetENPeers(t *testing.T) {
   803  	pm := &ProtocolManager{}
   804  	pm.nodetype = common.ENDPOINTNODE
   805  	mockCtrl := gomock.NewController(t)
   806  	defer mockCtrl.Finish()
   807  
   808  	peers := newPeerSet()
   809  	pm.peers = peers
   810  
   811  	cnPeer := NewMockPeer(mockCtrl)
   812  	pnPeer := NewMockPeer(mockCtrl)
   813  	enPeer := NewMockPeer(mockCtrl)
   814  
   815  	peers.cnpeers[addrs[0]] = cnPeer
   816  	peers.pnpeers[addrs[1]] = pnPeer
   817  	peers.enpeers[addrs[2]] = enPeer
   818  
   819  	cnPeers := pm.GetCNPeers()
   820  	enPeers := pm.GetENPeers()
   821  
   822  	assert.Equal(t, 1, len(cnPeers))
   823  	assert.Equal(t, 1, len(enPeers))
   824  
   825  	assert.Equal(t, cnPeer, cnPeers[addrs[0]])
   826  	assert.Equal(t, enPeer, enPeers[addrs[2]])
   827  }
   828  
   829  func TestFindPeers_AddrExists(t *testing.T) {
   830  	pm := &ProtocolManager{}
   831  	pm.nodetype = common.ENDPOINTNODE
   832  	mockCtrl := gomock.NewController(t)
   833  	defer mockCtrl.Finish()
   834  
   835  	peers := NewMockPeerSet(mockCtrl)
   836  	pm.peers = peers
   837  
   838  	cnPeer := NewMockPeer(mockCtrl)
   839  	pnPeer := NewMockPeer(mockCtrl)
   840  	enPeer := NewMockPeer(mockCtrl)
   841  
   842  	peersResult := map[string]Peer{"cnPeer": cnPeer, "pnPeer": pnPeer, "enPeer": enPeer}
   843  
   844  	peers.EXPECT().Peers().Return(peersResult).Times(1)
   845  	cnPeer.EXPECT().GetAddr().Return(addrs[0]).Times(1)
   846  	pnPeer.EXPECT().GetAddr().Return(addrs[1]).Times(1)
   847  	enPeer.EXPECT().GetAddr().Return(addrs[2]).Times(1)
   848  
   849  	targets := make(map[common.Address]bool)
   850  	targets[addrs[0]] = true
   851  	targets[addrs[1]] = true
   852  	targets[addrs[2]] = false
   853  
   854  	foundPeers := pm.FindPeers(targets)
   855  
   856  	assert.Equal(t, 2, len(foundPeers))
   857  	assert.EqualValues(t, cnPeer, foundPeers[addrs[0]])
   858  	assert.EqualValues(t, pnPeer, foundPeers[addrs[1]])
   859  	assert.Nil(t, foundPeers[addrs[2]])
   860  }
   861  
   862  func TestFindPeers_AddrNotExists(t *testing.T) {
   863  	pm := &ProtocolManager{}
   864  	pm.nodetype = common.ENDPOINTNODE
   865  	mockCtrl := gomock.NewController(t)
   866  	defer mockCtrl.Finish()
   867  
   868  	peers := NewMockPeerSet(mockCtrl)
   869  	pm.peers = peers
   870  
   871  	cnPeer := NewMockPeer(mockCtrl)
   872  	pnPeer := NewMockPeer(mockCtrl)
   873  	enPeer := NewMockPeer(mockCtrl)
   874  
   875  	peersResult := map[string]Peer{"cnPeer": cnPeer, "pnPeer": pnPeer, "enPeer": enPeer}
   876  
   877  	peers.EXPECT().Peers().Return(peersResult).Times(1)
   878  	cnPeer.EXPECT().GetAddr().Return(common.Address{}).Times(1)
   879  	pnPeer.EXPECT().GetAddr().Return(common.Address{}).Times(1)
   880  	enPeer.EXPECT().GetAddr().Return(common.Address{}).Times(1)
   881  
   882  	cnPeer.EXPECT().GetP2PPeerID().Return(nodeids[0]).Times(1)
   883  	pnPeer.EXPECT().GetP2PPeerID().Return(nodeids[1]).Times(1)
   884  	enPeer.EXPECT().GetP2PPeerID().Return(nodeids[2]).Times(1)
   885  
   886  	cnPeer.EXPECT().SetAddr(addrs[0]).Times(1)
   887  	pnPeer.EXPECT().SetAddr(addrs[1]).Times(1)
   888  	enPeer.EXPECT().SetAddr(addrs[2]).Times(1)
   889  
   890  	targets := make(map[common.Address]bool)
   891  	targets[addrs[0]] = true
   892  	targets[addrs[1]] = true
   893  	targets[addrs[2]] = false
   894  
   895  	foundPeers := pm.FindPeers(targets)
   896  
   897  	assert.Equal(t, 2, len(foundPeers))
   898  	assert.EqualValues(t, cnPeer, foundPeers[addrs[0]])
   899  	assert.EqualValues(t, pnPeer, foundPeers[addrs[1]])
   900  	assert.Nil(t, foundPeers[addrs[2]])
   901  }
   902  
   903  func TestFindCNPeers(t *testing.T) {
   904  	pm := &ProtocolManager{}
   905  	pm.nodetype = common.ENDPOINTNODE
   906  	mockCtrl := gomock.NewController(t)
   907  	defer mockCtrl.Finish()
   908  
   909  	peers := newPeerSet()
   910  	pm.peers = peers
   911  
   912  	cnPeer1 := NewMockPeer(mockCtrl)
   913  	cnPeer2 := NewMockPeer(mockCtrl)
   914  	cnPeer3 := NewMockPeer(mockCtrl)
   915  
   916  	peers.cnpeers[addrs[0]] = cnPeer1
   917  	peers.cnpeers[addrs[1]] = cnPeer2
   918  	peers.cnpeers[addrs[2]] = cnPeer3
   919  
   920  	targets := make(map[common.Address]bool)
   921  	targets[addrs[0]] = true
   922  	targets[addrs[1]] = true
   923  	targets[addrs[2]] = false
   924  
   925  	foundCNPeers := pm.FindCNPeers(targets)
   926  
   927  	assert.Equal(t, 2, len(foundCNPeers))
   928  	assert.EqualValues(t, cnPeer1, foundCNPeers[addrs[0]])
   929  	assert.EqualValues(t, cnPeer2, foundCNPeers[addrs[1]])
   930  	assert.Nil(t, foundCNPeers[addrs[2]])
   931  }
   932  
   933  func TestGetPeers_AddrExists(t *testing.T) {
   934  	pm := &ProtocolManager{}
   935  	pm.nodetype = common.ENDPOINTNODE
   936  	mockCtrl := gomock.NewController(t)
   937  	defer mockCtrl.Finish()
   938  
   939  	peers := NewMockPeerSet(mockCtrl)
   940  	pm.peers = peers
   941  
   942  	cnPeer := NewMockPeer(mockCtrl)
   943  	pnPeer := NewMockPeer(mockCtrl)
   944  	enPeer := NewMockPeer(mockCtrl)
   945  
   946  	peersResult := map[string]Peer{"cnPeer": cnPeer, "pnPeer": pnPeer, "enPeer": enPeer}
   947  
   948  	peers.EXPECT().Peers().Return(peersResult).Times(1)
   949  	cnPeer.EXPECT().GetAddr().Return(addrs[0]).Times(1)
   950  	pnPeer.EXPECT().GetAddr().Return(addrs[1]).Times(1)
   951  	enPeer.EXPECT().GetAddr().Return(addrs[2]).Times(1)
   952  
   953  	foundAddrs := pm.GetPeers()
   954  
   955  	assert.Equal(t, 3, len(foundAddrs))
   956  	assert.True(t, contains(foundAddrs, addrs[0]))
   957  	assert.True(t, contains(foundAddrs, addrs[1]))
   958  	assert.True(t, contains(foundAddrs, addrs[2]))
   959  }
   960  
   961  func TestGetPeers_AddrNotExists(t *testing.T) {
   962  	pm := &ProtocolManager{}
   963  	pm.nodetype = common.ENDPOINTNODE
   964  	mockCtrl := gomock.NewController(t)
   965  	defer mockCtrl.Finish()
   966  
   967  	peers := NewMockPeerSet(mockCtrl)
   968  	pm.peers = peers
   969  
   970  	cnPeer := NewMockPeer(mockCtrl)
   971  	pnPeer := NewMockPeer(mockCtrl)
   972  	enPeer := NewMockPeer(mockCtrl)
   973  
   974  	peersResult := map[string]Peer{"cnPeer": cnPeer, "pnPeer": pnPeer, "enPeer": enPeer}
   975  
   976  	peers.EXPECT().Peers().Return(peersResult).Times(1)
   977  	cnPeer.EXPECT().GetAddr().Return(common.Address{}).Times(1)
   978  	pnPeer.EXPECT().GetAddr().Return(common.Address{}).Times(1)
   979  	enPeer.EXPECT().GetAddr().Return(common.Address{}).Times(1)
   980  
   981  	cnPeer.EXPECT().GetP2PPeerID().Return(nodeids[0]).Times(1)
   982  	pnPeer.EXPECT().GetP2PPeerID().Return(nodeids[1]).Times(1)
   983  	enPeer.EXPECT().GetP2PPeerID().Return(nodeids[2]).Times(1)
   984  
   985  	cnPeer.EXPECT().SetAddr(addrs[0]).Times(1)
   986  	pnPeer.EXPECT().SetAddr(addrs[1]).Times(1)
   987  	enPeer.EXPECT().SetAddr(addrs[2]).Times(1)
   988  
   989  	foundAddrs := pm.GetPeers()
   990  
   991  	assert.Equal(t, 3, len(foundAddrs))
   992  	assert.True(t, contains(foundAddrs, addrs[0]))
   993  	assert.True(t, contains(foundAddrs, addrs[1]))
   994  	assert.True(t, contains(foundAddrs, addrs[2]))
   995  }
   996  
   997  func TestEnqueue(t *testing.T) {
   998  	pm := &ProtocolManager{}
   999  	mockCtrl := gomock.NewController(t)
  1000  	defer mockCtrl.Finish()
  1001  
  1002  	fetcherMock := mocks.NewMockProtocolManagerFetcher(mockCtrl)
  1003  	pm.fetcher = fetcherMock
  1004  
  1005  	block := newBlock(blockNum1)
  1006  	id := nodeids[0].String()
  1007  
  1008  	fetcherMock.EXPECT().Enqueue(id, block).Times(1)
  1009  	pm.Enqueue(id, block)
  1010  }
  1011  
  1012  func TestProtocolManager_Downloader(t *testing.T) {
  1013  	pm := &ProtocolManager{}
  1014  	assert.Nil(t, pm.Downloader())
  1015  
  1016  	downloader := &downloader.Downloader{}
  1017  	pm.downloader = downloader
  1018  
  1019  	assert.Equal(t, downloader, pm.Downloader())
  1020  }
  1021  
  1022  func TestProtocolManager_SetWsEndPoint(t *testing.T) {
  1023  	pm := &ProtocolManager{}
  1024  	assert.Equal(t, "", pm.wsendpoint)
  1025  
  1026  	wsep := "wsep"
  1027  	pm.SetWsEndPoint(wsep)
  1028  	assert.Equal(t, wsep, pm.wsendpoint)
  1029  }
  1030  
  1031  func TestBroadcastTxsSortedByTime(t *testing.T) {
  1032  	// Generate a batch of accounts to start with
  1033  	keys := make([]*ecdsa.PrivateKey, 5)
  1034  	for i := 0; i < len(keys); i++ {
  1035  		keys[i], _ = crypto.GenerateKey()
  1036  	}
  1037  	signer := types.LatestSignerForChainID(big.NewInt(1))
  1038  
  1039  	// Generate a batch of transactions.
  1040  	txs := types.Transactions{}
  1041  	for _, key := range keys {
  1042  		tx, _ := types.SignTx(types.NewTransaction(0, common.Address{}, big.NewInt(100), 100, big.NewInt(1), nil), signer, key)
  1043  
  1044  		txs = append(txs, tx)
  1045  	}
  1046  
  1047  	// Shuffle transactions.
  1048  	rand.Seed(time.Now().Unix())
  1049  	rand.Shuffle(len(txs), func(i, j int) {
  1050  		txs[i], txs[j] = txs[j], txs[i]
  1051  	})
  1052  
  1053  	sortedTxs := make(types.Transactions, len(txs))
  1054  	copy(sortedTxs, txs)
  1055  
  1056  	// Sort transaction by time.
  1057  	sort.Sort(types.TxByTime(sortedTxs))
  1058  
  1059  	pm := &ProtocolManager{}
  1060  	pm.nodetype = common.ENDPOINTNODE
  1061  
  1062  	peers := newPeerSet()
  1063  	basePeer, _, oppositePipe := newBasePeer()
  1064  
  1065  	pm.peers = peers
  1066  	pm.peers.Register(basePeer, nil)
  1067  
  1068  	go func(t *testing.T) {
  1069  		pm.BroadcastTxs(txs)
  1070  	}(t)
  1071  
  1072  	receivedMsg, err := oppositePipe.ReadMsg()
  1073  	if err != nil {
  1074  		t.Fatal(err)
  1075  	}
  1076  
  1077  	var receivedTxs types.Transactions
  1078  	if err := receivedMsg.Decode(&receivedTxs); err != nil {
  1079  		t.Fatal(err)
  1080  	}
  1081  
  1082  	assert.Equal(t, len(txs), len(receivedTxs))
  1083  
  1084  	// It should be received transaction with sorted by times.
  1085  	for i, tx := range receivedTxs {
  1086  		assert.True(t, basePeer.KnowsTx(tx.Hash()))
  1087  		assert.Equal(t, sortedTxs[i].Hash(), tx.Hash())
  1088  		assert.False(t, sortedTxs[i].Time().Equal(tx.Time()))
  1089  	}
  1090  }
  1091  
  1092  func TestReBroadcastTxsSortedByTime(t *testing.T) {
  1093  	// Generate a batch of accounts to start with
  1094  	keys := make([]*ecdsa.PrivateKey, 5)
  1095  	for i := 0; i < len(keys); i++ {
  1096  		keys[i], _ = crypto.GenerateKey()
  1097  	}
  1098  	signer := types.LatestSignerForChainID(big.NewInt(1))
  1099  
  1100  	// Generate a batch of transactions.
  1101  	txs := types.Transactions{}
  1102  	for _, key := range keys {
  1103  		tx, _ := types.SignTx(types.NewTransaction(0, common.Address{}, big.NewInt(100), 100, big.NewInt(1), nil), signer, key)
  1104  
  1105  		txs = append(txs, tx)
  1106  	}
  1107  
  1108  	// Shuffle transactions.
  1109  	rand.Seed(time.Now().Unix())
  1110  	rand.Shuffle(len(txs), func(i, j int) {
  1111  		txs[i], txs[j] = txs[j], txs[i]
  1112  	})
  1113  
  1114  	sortedTxs := make(types.Transactions, len(txs))
  1115  	copy(sortedTxs, txs)
  1116  
  1117  	// Sort transaction by time.
  1118  	sort.Sort(types.TxByTime(sortedTxs))
  1119  
  1120  	pm := &ProtocolManager{}
  1121  	pm.nodetype = common.ENDPOINTNODE
  1122  
  1123  	peers := newPeerSet()
  1124  	basePeer, _, oppositePipe := newBasePeer()
  1125  
  1126  	pm.peers = peers
  1127  	pm.peers.Register(basePeer, nil)
  1128  
  1129  	go func(t *testing.T) {
  1130  		pm.ReBroadcastTxs(txs)
  1131  	}(t)
  1132  
  1133  	receivedMsg, err := oppositePipe.ReadMsg()
  1134  	if err != nil {
  1135  		t.Fatal(err)
  1136  	}
  1137  
  1138  	var receivedTxs types.Transactions
  1139  	if err := receivedMsg.Decode(&receivedTxs); err != nil {
  1140  		t.Fatal(err)
  1141  	}
  1142  
  1143  	assert.Equal(t, len(txs), len(receivedTxs))
  1144  
  1145  	// It should be received transaction with sorted by times.
  1146  	for i, tx := range receivedTxs {
  1147  		assert.Equal(t, sortedTxs[i].Hash(), tx.Hash())
  1148  		assert.False(t, sortedTxs[i].Time().Equal(tx.Time()))
  1149  	}
  1150  }
  1151  
  1152  func contains(addrs []common.Address, item common.Address) bool {
  1153  	for _, a := range addrs {
  1154  		if a == item {
  1155  			return true
  1156  		}
  1157  	}
  1158  	return false
  1159  }
  1160  
  1161  func createAndRegisterPeers(mockCtrl *gomock.Controller, peers *peerSet) (*MockPeer, *MockPeer, *MockPeer) {
  1162  	cnPeer := NewMockPeer(mockCtrl)
  1163  	pnPeer := NewMockPeer(mockCtrl)
  1164  	enPeer := NewMockPeer(mockCtrl)
  1165  
  1166  	peers.cnpeers[addrs[0]] = cnPeer
  1167  	peers.pnpeers[addrs[1]] = pnPeer
  1168  	peers.enpeers[addrs[2]] = enPeer
  1169  
  1170  	peers.peers[fmt.Sprintf("%x", nodeids[0][:8])] = cnPeer
  1171  	peers.peers[fmt.Sprintf("%x", nodeids[1][:8])] = pnPeer
  1172  	peers.peers[fmt.Sprintf("%x", nodeids[2][:8])] = enPeer
  1173  
  1174  	return cnPeer, pnPeer, enPeer
  1175  }