github.com/Finschia/finschia-sdk@v0.48.1/baseapp/msg_service_router_test.go (about)

     1  package baseapp_test
     2  
     3  import (
     4  	"os"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/require"
     8  	abci "github.com/tendermint/tendermint/abci/types"
     9  	tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
    10  	dbm "github.com/tendermint/tm-db"
    11  
    12  	ocabci "github.com/Finschia/ostracon/abci/types"
    13  	"github.com/Finschia/ostracon/libs/log"
    14  
    15  	"github.com/Finschia/finschia-sdk/baseapp"
    16  	"github.com/Finschia/finschia-sdk/client/tx"
    17  	"github.com/Finschia/finschia-sdk/simapp"
    18  	"github.com/Finschia/finschia-sdk/testutil/testdata"
    19  	"github.com/Finschia/finschia-sdk/types/tx/signing"
    20  	authsigning "github.com/Finschia/finschia-sdk/x/auth/signing"
    21  )
    22  
    23  func TestRegisterMsgService(t *testing.T) {
    24  	db := dbm.NewMemDB()
    25  
    26  	// Create an encoding config that doesn't register testdata Msg services.
    27  	encCfg := simapp.MakeTestEncodingConfig()
    28  	app := baseapp.NewBaseApp("test", log.NewOCLogger(log.NewSyncWriter(os.Stdout)), db, encCfg.TxConfig.TxDecoder())
    29  	app.SetInterfaceRegistry(encCfg.InterfaceRegistry)
    30  	require.Panics(t, func() {
    31  		testdata.RegisterMsgServer(
    32  			app.MsgServiceRouter(),
    33  			testdata.MsgServerImpl{},
    34  		)
    35  	})
    36  
    37  	// Register testdata Msg services, and rerun `RegisterService`.
    38  	testdata.RegisterInterfaces(encCfg.InterfaceRegistry)
    39  	require.NotPanics(t, func() {
    40  		testdata.RegisterMsgServer(
    41  			app.MsgServiceRouter(),
    42  			testdata.MsgServerImpl{},
    43  		)
    44  	})
    45  }
    46  
    47  func TestRegisterMsgServiceTwice(t *testing.T) {
    48  	// Setup baseapp.
    49  	db := dbm.NewMemDB()
    50  	encCfg := simapp.MakeTestEncodingConfig()
    51  	app := baseapp.NewBaseApp("test", log.NewOCLogger(log.NewSyncWriter(os.Stdout)), db, encCfg.TxConfig.TxDecoder())
    52  	app.SetInterfaceRegistry(encCfg.InterfaceRegistry)
    53  	testdata.RegisterInterfaces(encCfg.InterfaceRegistry)
    54  
    55  	// First time registering service shouldn't panic.
    56  	require.NotPanics(t, func() {
    57  		testdata.RegisterMsgServer(
    58  			app.MsgServiceRouter(),
    59  			testdata.MsgServerImpl{},
    60  		)
    61  	})
    62  
    63  	// Second time should panic.
    64  	require.Panics(t, func() {
    65  		testdata.RegisterMsgServer(
    66  			app.MsgServiceRouter(),
    67  			testdata.MsgServerImpl{},
    68  		)
    69  	})
    70  }
    71  
    72  func TestMsgService(t *testing.T) {
    73  	priv, _, _ := testdata.KeyTestPubAddr()
    74  	encCfg := simapp.MakeTestEncodingConfig()
    75  	testdata.RegisterInterfaces(encCfg.InterfaceRegistry)
    76  	db := dbm.NewMemDB()
    77  	app := baseapp.NewBaseApp("test", log.NewOCLogger(log.NewSyncWriter(os.Stdout)), db, encCfg.TxConfig.TxDecoder())
    78  	app.SetInterfaceRegistry(encCfg.InterfaceRegistry)
    79  	testdata.RegisterMsgServer(
    80  		app.MsgServiceRouter(),
    81  		testdata.MsgServerImpl{},
    82  	)
    83  	_ = app.BeginBlock(ocabci.RequestBeginBlock{Header: tmproto.Header{Height: 1}})
    84  
    85  	msg := testdata.MsgCreateDog{Dog: &testdata.Dog{Name: "Spot"}}
    86  	txBuilder := encCfg.TxConfig.NewTxBuilder()
    87  	txBuilder.SetFeeAmount(testdata.NewTestFeeAmount())
    88  	txBuilder.SetGasLimit(testdata.NewTestGasLimit())
    89  	err := txBuilder.SetMsgs(&msg)
    90  	require.NoError(t, err)
    91  
    92  	// First round: we gather all the signer infos. We use the "set empty
    93  	// signature" hack to do that.
    94  	sigV2 := signing.SignatureV2{
    95  		PubKey: priv.PubKey(),
    96  		Data: &signing.SingleSignatureData{
    97  			SignMode:  encCfg.TxConfig.SignModeHandler().DefaultMode(),
    98  			Signature: nil,
    99  		},
   100  		Sequence: 0,
   101  	}
   102  
   103  	err = txBuilder.SetSignatures(sigV2)
   104  	require.NoError(t, err)
   105  
   106  	// Second round: all signer infos are set, so each signer can sign.
   107  	signerData := authsigning.SignerData{
   108  		ChainID:       "test",
   109  		AccountNumber: 0,
   110  		Sequence:      0,
   111  	}
   112  	sigV2, err = tx.SignWithPrivKey(
   113  		encCfg.TxConfig.SignModeHandler().DefaultMode(), signerData,
   114  		txBuilder, priv, encCfg.TxConfig, 0)
   115  	require.NoError(t, err)
   116  	err = txBuilder.SetSignatures(sigV2)
   117  	require.NoError(t, err)
   118  
   119  	// Send the tx to the app
   120  	txBytes, err := encCfg.TxConfig.TxEncoder()(txBuilder.GetTx())
   121  	require.NoError(t, err)
   122  	res := app.DeliverTx(abci.RequestDeliverTx{Tx: txBytes})
   123  	require.Equal(t, abci.CodeTypeOK, res.Code, "res=%+v", res)
   124  }