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  }