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 }