github.com/Finschia/finschia-sdk@v0.49.1/x/auth/ante/setup_test.go (about) 1 package ante_test 2 3 import ( 4 cryptotypes "github.com/Finschia/finschia-sdk/crypto/types" 5 "github.com/Finschia/finschia-sdk/testutil/testdata" 6 sdk "github.com/Finschia/finschia-sdk/types" 7 sdkerrors "github.com/Finschia/finschia-sdk/types/errors" 8 "github.com/Finschia/finschia-sdk/x/auth/ante" 9 ) 10 11 func (suite *AnteTestSuite) TestSetup() { 12 suite.SetupTest(true) // setup 13 suite.txBuilder = suite.clientCtx.TxConfig.NewTxBuilder() 14 15 // keys and addresses 16 priv1, _, addr1 := testdata.KeyTestPubAddr() 17 18 // msg and signatures 19 msg := testdata.NewTestMsg(addr1) 20 feeAmount := testdata.NewTestFeeAmount() 21 gasLimit := testdata.NewTestGasLimit() 22 suite.Require().NoError(suite.txBuilder.SetMsgs(msg)) 23 suite.txBuilder.SetFeeAmount(feeAmount) 24 suite.txBuilder.SetGasLimit(gasLimit) 25 26 privs, accNums, accSeqs := []cryptotypes.PrivKey{priv1}, []uint64{0}, []uint64{0} 27 tx, err := suite.CreateTestTx(privs, accNums, accSeqs, suite.ctx.ChainID()) 28 suite.Require().NoError(err) 29 30 sud := ante.NewSetUpContextDecorator() 31 antehandler := sdk.ChainAnteDecorators(sud) 32 33 // Set height to non-zero value for GasMeter to be set 34 suite.ctx = suite.ctx.WithBlockHeight(1) 35 36 // Context GasMeter Limit not set 37 suite.Require().Equal(uint64(0), suite.ctx.GasMeter().Limit(), "GasMeter set with limit before setup") 38 39 newCtx, err := antehandler(suite.ctx, tx, false) 40 suite.Require().Nil(err, "SetUpContextDecorator returned error") 41 42 // Context GasMeter Limit should be set after SetUpContextDecorator runs 43 suite.Require().Equal(gasLimit, newCtx.GasMeter().Limit(), "GasMeter not set correctly") 44 } 45 46 func (suite *AnteTestSuite) TestRecoverPanic() { 47 suite.SetupTest(true) // setup 48 suite.txBuilder = suite.clientCtx.TxConfig.NewTxBuilder() 49 50 // keys and addresses 51 priv1, _, addr1 := testdata.KeyTestPubAddr() 52 53 // msg and signatures 54 msg := testdata.NewTestMsg(addr1) 55 feeAmount := testdata.NewTestFeeAmount() 56 gasLimit := testdata.NewTestGasLimit() 57 suite.Require().NoError(suite.txBuilder.SetMsgs(msg)) 58 suite.txBuilder.SetFeeAmount(feeAmount) 59 suite.txBuilder.SetGasLimit(gasLimit) 60 61 privs, accNums, accSeqs := []cryptotypes.PrivKey{priv1}, []uint64{0}, []uint64{0} 62 tx, err := suite.CreateTestTx(privs, accNums, accSeqs, suite.ctx.ChainID()) 63 suite.Require().NoError(err) 64 65 sud := ante.NewSetUpContextDecorator() 66 antehandler := sdk.ChainAnteDecorators(sud, OutOfGasDecorator{}) 67 68 // Set height to non-zero value for GasMeter to be set 69 suite.ctx = suite.ctx.WithBlockHeight(1) 70 71 newCtx, err := antehandler(suite.ctx, tx, false) 72 73 suite.Require().NotNil(err, "Did not return error on OutOfGas panic") 74 75 suite.Require().True(sdkerrors.ErrOutOfGas.Is(err), "Returned error is not an out of gas error") 76 suite.Require().Equal(gasLimit, newCtx.GasMeter().Limit()) 77 78 antehandler = sdk.ChainAnteDecorators(sud, PanicDecorator{}) 79 suite.Require().Panics(func() { antehandler(suite.ctx, tx, false) }, "Recovered from non-Out-of-Gas panic") // nolint:errcheck 80 } 81 82 type OutOfGasDecorator struct{} 83 84 // AnteDecorator that will throw OutOfGas panic 85 func (ogd OutOfGasDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (sdk.Context, error) { 86 overLimit := ctx.GasMeter().Limit() + 1 87 88 // Should panic with outofgas error 89 ctx.GasMeter().ConsumeGas(overLimit, "test panic") 90 91 // not reached 92 return next(ctx, tx, simulate) 93 } 94 95 type PanicDecorator struct{} 96 97 func (pd PanicDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (newCtx sdk.Context, err error) { 98 panic("random error") 99 }