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 := ¶ms.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 := ¶ms.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 }