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 }