github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/rpc/prysm/v1alpha1/node/server_test.go (about)

     1  package node
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/ethereum/go-ethereum/common"
     9  	"github.com/ethereum/go-ethereum/crypto"
    10  	"github.com/ethereum/go-ethereum/p2p/enode"
    11  	mock "github.com/prysmaticlabs/prysm/beacon-chain/blockchain/testing"
    12  	dbutil "github.com/prysmaticlabs/prysm/beacon-chain/db/testing"
    13  	"github.com/prysmaticlabs/prysm/beacon-chain/p2p"
    14  	mockP2p "github.com/prysmaticlabs/prysm/beacon-chain/p2p/testing"
    15  	mockSync "github.com/prysmaticlabs/prysm/beacon-chain/sync/initial-sync/testing"
    16  	ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
    17  	"github.com/prysmaticlabs/prysm/shared/bytesutil"
    18  	"github.com/prysmaticlabs/prysm/shared/testutil"
    19  	"github.com/prysmaticlabs/prysm/shared/testutil/assert"
    20  	"github.com/prysmaticlabs/prysm/shared/testutil/require"
    21  	"github.com/prysmaticlabs/prysm/shared/version"
    22  	"google.golang.org/grpc"
    23  	"google.golang.org/grpc/reflection"
    24  	"google.golang.org/protobuf/types/known/emptypb"
    25  	"google.golang.org/protobuf/types/known/timestamppb"
    26  )
    27  
    28  func TestNodeServer_GetSyncStatus(t *testing.T) {
    29  	mSync := &mockSync.Sync{IsSyncing: false}
    30  	ns := &Server{
    31  		SyncChecker: mSync,
    32  	}
    33  	res, err := ns.GetSyncStatus(context.Background(), &emptypb.Empty{})
    34  	require.NoError(t, err)
    35  	assert.Equal(t, false, res.Syncing)
    36  	ns.SyncChecker = &mockSync.Sync{IsSyncing: true}
    37  	res, err = ns.GetSyncStatus(context.Background(), &emptypb.Empty{})
    38  	require.NoError(t, err)
    39  	assert.Equal(t, true, res.Syncing)
    40  }
    41  
    42  func TestNodeServer_GetGenesis(t *testing.T) {
    43  	db := dbutil.SetupDB(t)
    44  	ctx := context.Background()
    45  	addr := common.Address{1, 2, 3}
    46  	require.NoError(t, db.SaveDepositContractAddress(ctx, addr))
    47  	st, err := testutil.NewBeaconState()
    48  	require.NoError(t, err)
    49  	genValRoot := bytesutil.ToBytes32([]byte("I am root"))
    50  	ns := &Server{
    51  		BeaconDB:           db,
    52  		GenesisTimeFetcher: &mock.ChainService{},
    53  		GenesisFetcher: &mock.ChainService{
    54  			State:          st,
    55  			ValidatorsRoot: genValRoot,
    56  		},
    57  	}
    58  	res, err := ns.GetGenesis(context.Background(), &emptypb.Empty{})
    59  	require.NoError(t, err)
    60  	assert.DeepEqual(t, addr.Bytes(), res.DepositContractAddress)
    61  	pUnix := timestamppb.New(time.Unix(0, 0))
    62  	assert.Equal(t, res.GenesisTime.Seconds, pUnix.Seconds)
    63  	assert.DeepEqual(t, genValRoot[:], res.GenesisValidatorsRoot)
    64  
    65  	ns.GenesisTimeFetcher = &mock.ChainService{Genesis: time.Unix(10, 0)}
    66  	res, err = ns.GetGenesis(context.Background(), &emptypb.Empty{})
    67  	require.NoError(t, err)
    68  	pUnix = timestamppb.New(time.Unix(10, 0))
    69  	assert.Equal(t, res.GenesisTime.Seconds, pUnix.Seconds)
    70  }
    71  
    72  func TestNodeServer_GetVersion(t *testing.T) {
    73  	v := version.Version()
    74  	ns := &Server{}
    75  	res, err := ns.GetVersion(context.Background(), &emptypb.Empty{})
    76  	require.NoError(t, err)
    77  	assert.Equal(t, v, res.Version)
    78  }
    79  
    80  func TestNodeServer_GetImplementedServices(t *testing.T) {
    81  	server := grpc.NewServer()
    82  	ns := &Server{
    83  		Server: server,
    84  	}
    85  	ethpb.RegisterNodeServer(server, ns)
    86  	reflection.Register(server)
    87  
    88  	res, err := ns.ListImplementedServices(context.Background(), &emptypb.Empty{})
    89  	require.NoError(t, err)
    90  	// We verify the services include the node service + the registered reflection service.
    91  	assert.Equal(t, 2, len(res.Services))
    92  }
    93  
    94  func TestNodeServer_GetHost(t *testing.T) {
    95  	server := grpc.NewServer()
    96  	peersProvider := &mockP2p.MockPeersProvider{}
    97  	mP2P := mockP2p.NewTestP2P(t)
    98  	key, err := crypto.GenerateKey()
    99  	require.NoError(t, err)
   100  	db, err := enode.OpenDB("")
   101  	require.NoError(t, err)
   102  	lNode := enode.NewLocalNode(db, key)
   103  	record := lNode.Node().Record()
   104  	stringENR, err := p2p.SerializeENR(record)
   105  	require.NoError(t, err)
   106  	ns := &Server{
   107  		PeerManager:  &mockP2p.MockPeerManager{BHost: mP2P.BHost, Enr: record, PID: mP2P.BHost.ID()},
   108  		PeersFetcher: peersProvider,
   109  	}
   110  	ethpb.RegisterNodeServer(server, ns)
   111  	reflection.Register(server)
   112  	h, err := ns.GetHost(context.Background(), &emptypb.Empty{})
   113  	require.NoError(t, err)
   114  	assert.Equal(t, mP2P.PeerID().String(), h.PeerId)
   115  	assert.Equal(t, stringENR, h.Enr)
   116  }
   117  
   118  func TestNodeServer_GetPeer(t *testing.T) {
   119  	server := grpc.NewServer()
   120  	peersProvider := &mockP2p.MockPeersProvider{}
   121  	ns := &Server{
   122  		PeersFetcher: peersProvider,
   123  	}
   124  	ethpb.RegisterNodeServer(server, ns)
   125  	reflection.Register(server)
   126  	firstPeer := peersProvider.Peers().All()[0]
   127  
   128  	res, err := ns.GetPeer(context.Background(), &ethpb.PeerRequest{PeerId: firstPeer.String()})
   129  	require.NoError(t, err)
   130  	assert.Equal(t, firstPeer.String(), res.PeerId, "Unexpected peer ID")
   131  	assert.Equal(t, int(ethpb.PeerDirection_INBOUND), int(res.Direction), "Expected 1st peer to be an inbound connection")
   132  	assert.Equal(t, ethpb.ConnectionState_CONNECTED, res.ConnectionState, "Expected peer to be connected")
   133  }
   134  
   135  func TestNodeServer_ListPeers(t *testing.T) {
   136  	server := grpc.NewServer()
   137  	peersProvider := &mockP2p.MockPeersProvider{}
   138  	ns := &Server{
   139  		PeersFetcher: peersProvider,
   140  	}
   141  	ethpb.RegisterNodeServer(server, ns)
   142  	reflection.Register(server)
   143  
   144  	res, err := ns.ListPeers(context.Background(), &emptypb.Empty{})
   145  	require.NoError(t, err)
   146  	assert.Equal(t, 2, len(res.Peers))
   147  	assert.Equal(t, int(ethpb.PeerDirection_INBOUND), int(res.Peers[0].Direction))
   148  	assert.Equal(t, ethpb.PeerDirection_OUTBOUND, res.Peers[1].Direction)
   149  }