github.com/ari-anchor/sei-tendermint@v0.0.0-20230519144642-dc826b7b56bb/privval/grpc/client_test.go (about)

     1  package grpc_test
     2  
     3  import (
     4  	"context"
     5  	"net"
     6  	"testing"
     7  	"time"
     8  
     9  	"google.golang.org/grpc"
    10  	"google.golang.org/grpc/test/bufconn"
    11  
    12  	"github.com/stretchr/testify/assert"
    13  	"github.com/stretchr/testify/require"
    14  
    15  	"github.com/ari-anchor/sei-tendermint/crypto"
    16  	"github.com/ari-anchor/sei-tendermint/libs/log"
    17  	tmrand "github.com/ari-anchor/sei-tendermint/libs/rand"
    18  	tmgrpc "github.com/ari-anchor/sei-tendermint/privval/grpc"
    19  	privvalproto "github.com/ari-anchor/sei-tendermint/proto/tendermint/privval"
    20  	tmproto "github.com/ari-anchor/sei-tendermint/proto/tendermint/types"
    21  	"github.com/ari-anchor/sei-tendermint/types"
    22  )
    23  
    24  const chainID = "chain-id"
    25  
    26  func dialer(t *testing.T, pv types.PrivValidator, logger log.Logger) (*grpc.Server, func(context.Context, string) (net.Conn, error)) {
    27  	listener := bufconn.Listen(1024 * 1024)
    28  
    29  	server := grpc.NewServer()
    30  
    31  	s := tmgrpc.NewSignerServer(logger, chainID, pv)
    32  
    33  	privvalproto.RegisterPrivValidatorAPIServer(server, s)
    34  
    35  	go func() { require.NoError(t, server.Serve(listener)) }()
    36  
    37  	return server, func(context.Context, string) (net.Conn, error) {
    38  		return listener.Dial()
    39  	}
    40  }
    41  
    42  func TestSignerClient_GetPubKey(t *testing.T) {
    43  
    44  	ctx, cancel := context.WithCancel(context.Background())
    45  	defer cancel()
    46  
    47  	mockPV := types.NewMockPV()
    48  	logger := log.NewTestingLogger(t)
    49  	srv, dialer := dialer(t, mockPV, logger)
    50  	defer srv.Stop()
    51  
    52  	conn, err := grpc.DialContext(ctx, "",
    53  		grpc.WithInsecure(),
    54  		grpc.WithContextDialer(dialer),
    55  	)
    56  	require.NoError(t, err)
    57  	defer conn.Close()
    58  
    59  	client, err := tmgrpc.NewSignerClient(conn, chainID, logger)
    60  	require.NoError(t, err)
    61  
    62  	pk, err := client.GetPubKey(ctx)
    63  	require.NoError(t, err)
    64  	assert.Equal(t, mockPV.PrivKey.PubKey(), pk)
    65  }
    66  
    67  func TestSignerClient_SignVote(t *testing.T) {
    68  	ctx, cancel := context.WithCancel(context.Background())
    69  	defer cancel()
    70  
    71  	mockPV := types.NewMockPV()
    72  	logger := log.NewTestingLogger(t)
    73  	srv, dialer := dialer(t, mockPV, logger)
    74  	defer srv.Stop()
    75  
    76  	conn, err := grpc.DialContext(ctx, "",
    77  		grpc.WithInsecure(),
    78  		grpc.WithContextDialer(dialer),
    79  	)
    80  	require.NoError(t, err)
    81  	defer conn.Close()
    82  
    83  	client, err := tmgrpc.NewSignerClient(conn, chainID, logger)
    84  	require.NoError(t, err)
    85  
    86  	ts := time.Now()
    87  	hash := tmrand.Bytes(crypto.HashSize)
    88  	valAddr := tmrand.Bytes(crypto.AddressSize)
    89  
    90  	want := &types.Vote{
    91  		Type:             tmproto.PrecommitType,
    92  		Height:           1,
    93  		Round:            2,
    94  		BlockID:          types.BlockID{Hash: hash, PartSetHeader: types.PartSetHeader{Hash: hash, Total: 2}},
    95  		Timestamp:        ts,
    96  		ValidatorAddress: valAddr,
    97  		ValidatorIndex:   1,
    98  	}
    99  
   100  	have := &types.Vote{
   101  		Type:             tmproto.PrecommitType,
   102  		Height:           1,
   103  		Round:            2,
   104  		BlockID:          types.BlockID{Hash: hash, PartSetHeader: types.PartSetHeader{Hash: hash, Total: 2}},
   105  		Timestamp:        ts,
   106  		ValidatorAddress: valAddr,
   107  		ValidatorIndex:   1,
   108  	}
   109  
   110  	pbHave := have.ToProto()
   111  
   112  	err = client.SignVote(ctx, chainID, pbHave)
   113  	require.NoError(t, err)
   114  
   115  	pbWant := want.ToProto()
   116  
   117  	require.NoError(t, mockPV.SignVote(ctx, chainID, pbWant))
   118  
   119  	assert.Equal(t, pbWant.Signature, pbHave.Signature)
   120  }
   121  
   122  func TestSignerClient_SignProposal(t *testing.T) {
   123  	ctx, cancel := context.WithCancel(context.Background())
   124  	defer cancel()
   125  
   126  	mockPV := types.NewMockPV()
   127  	logger := log.NewTestingLogger(t)
   128  	srv, dialer := dialer(t, mockPV, logger)
   129  	defer srv.Stop()
   130  
   131  	conn, err := grpc.DialContext(ctx, "",
   132  		grpc.WithInsecure(),
   133  		grpc.WithContextDialer(dialer),
   134  	)
   135  	require.NoError(t, err)
   136  	defer conn.Close()
   137  
   138  	client, err := tmgrpc.NewSignerClient(conn, chainID, logger)
   139  	require.NoError(t, err)
   140  
   141  	ts := time.Now()
   142  	hash := tmrand.Bytes(crypto.HashSize)
   143  
   144  	have := &types.Proposal{
   145  		Type:      tmproto.ProposalType,
   146  		Height:    1,
   147  		Round:     2,
   148  		POLRound:  2,
   149  		BlockID:   types.BlockID{Hash: hash, PartSetHeader: types.PartSetHeader{Hash: hash, Total: 2}},
   150  		Timestamp: ts,
   151  	}
   152  	want := &types.Proposal{
   153  		Type:      tmproto.ProposalType,
   154  		Height:    1,
   155  		Round:     2,
   156  		POLRound:  2,
   157  		BlockID:   types.BlockID{Hash: hash, PartSetHeader: types.PartSetHeader{Hash: hash, Total: 2}},
   158  		Timestamp: ts,
   159  	}
   160  
   161  	pbHave := have.ToProto()
   162  
   163  	err = client.SignProposal(ctx, chainID, pbHave)
   164  	require.NoError(t, err)
   165  
   166  	pbWant := want.ToProto()
   167  
   168  	require.NoError(t, mockPV.SignProposal(ctx, chainID, pbWant))
   169  
   170  	assert.Equal(t, pbWant.Signature, pbHave.Signature)
   171  }