github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/p2p/testing/mock_peersprovider.go (about)

     1  package testing
     2  
     3  import (
     4  	"context"
     5  	"sync"
     6  
     7  	"github.com/ethereum/go-ethereum/crypto"
     8  	"github.com/ethereum/go-ethereum/p2p/enode"
     9  	"github.com/ethereum/go-ethereum/p2p/enr"
    10  	"github.com/libp2p/go-libp2p-core/network"
    11  	"github.com/libp2p/go-libp2p-core/peer"
    12  	ma "github.com/multiformats/go-multiaddr"
    13  	"github.com/prysmaticlabs/prysm/beacon-chain/p2p/peers"
    14  	"github.com/prysmaticlabs/prysm/beacon-chain/p2p/peers/scorers"
    15  	pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
    16  	log "github.com/sirupsen/logrus"
    17  )
    18  
    19  // MockPeersProvider implements PeersProvider for testing.
    20  type MockPeersProvider struct {
    21  	lock  sync.Mutex
    22  	peers *peers.Status
    23  }
    24  
    25  // ClearPeers removes all known peers.
    26  func (m *MockPeersProvider) ClearPeers() {
    27  	m.lock.Lock()
    28  	defer m.lock.Unlock()
    29  	m.peers = peers.NewStatus(context.Background(), &peers.StatusConfig{
    30  		PeerLimit: 30,
    31  		ScorerParams: &scorers.Config{
    32  			BadResponsesScorerConfig: &scorers.BadResponsesScorerConfig{
    33  				Threshold: 5,
    34  			},
    35  		},
    36  	})
    37  }
    38  
    39  // Peers provides access the peer status.
    40  func (m *MockPeersProvider) Peers() *peers.Status {
    41  	m.lock.Lock()
    42  	defer m.lock.Unlock()
    43  	if m.peers == nil {
    44  		m.peers = peers.NewStatus(context.Background(), &peers.StatusConfig{
    45  			PeerLimit: 30,
    46  			ScorerParams: &scorers.Config{
    47  				BadResponsesScorerConfig: &scorers.BadResponsesScorerConfig{
    48  					Threshold: 5,
    49  				},
    50  			},
    51  		})
    52  		// Pretend we are connected to two peers
    53  		id0, err := peer.Decode("16Uiu2HAkyWZ4Ni1TpvDS8dPxsozmHY85KaiFjodQuV6Tz5tkHVeR")
    54  		if err != nil {
    55  			log.WithError(err).Debug("Cannot decode")
    56  		}
    57  		ma0, err := ma.NewMultiaddr("/ip4/213.202.254.180/tcp/13000")
    58  		if err != nil {
    59  			log.WithError(err).Debug("Cannot decode")
    60  		}
    61  		m.peers.Add(createENR(), id0, ma0, network.DirInbound)
    62  		m.peers.SetConnectionState(id0, peers.PeerConnected)
    63  		m.peers.SetChainState(id0, &pb.Status{FinalizedEpoch: 10})
    64  		id1, err := peer.Decode("16Uiu2HAm4HgJ9N1o222xK61o7LSgToYWoAy1wNTJRkh9gLZapVAy")
    65  		if err != nil {
    66  			log.WithError(err).Debug("Cannot decode")
    67  		}
    68  		ma1, err := ma.NewMultiaddr("/ip4/52.23.23.253/tcp/30000/ipfs/QmfAgkmjiZNZhr2wFN9TwaRgHouMTBT6HELyzE5A3BT2wK/p2p-circuit")
    69  		if err != nil {
    70  			log.WithError(err).Debug("Cannot decode")
    71  		}
    72  		m.peers.Add(createENR(), id1, ma1, network.DirOutbound)
    73  		m.peers.SetConnectionState(id1, peers.PeerConnected)
    74  		m.peers.SetChainState(id1, &pb.Status{FinalizedEpoch: 11})
    75  	}
    76  	return m.peers
    77  }
    78  
    79  func createENR() *enr.Record {
    80  	key, err := crypto.GenerateKey()
    81  	if err != nil {
    82  		log.Error(err)
    83  	}
    84  	db, err := enode.OpenDB("")
    85  	if err != nil {
    86  		log.Error("could not open node's peer database")
    87  	}
    88  	lNode := enode.NewLocalNode(db, key)
    89  	return lNode.Node().Record()
    90  }