package keeper_test import ( "errors" "math/big" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/cerc-io/laconicd/x/evm/keeper" "github.com/cerc-io/laconicd/x/evm/statedb" "github.com/cerc-io/laconicd/x/evm/types" ) // LogRecordHook records all the logs type LogRecordHook struct { Logs []*ethtypes.Log } func (dh *LogRecordHook) PostTxProcessing(ctx sdk.Context, msg core.Message, receipt *ethtypes.Receipt) error { dh.Logs = receipt.Logs return nil } // FailureHook always fail type FailureHook struct{} func (dh FailureHook) PostTxProcessing(ctx sdk.Context, msg core.Message, receipt *ethtypes.Receipt) error { return errors.New("post tx processing failed") } func (suite *KeeperTestSuite) TestEvmHooks() { testCases := []struct { msg string setupHook func() types.EvmHooks expFunc func(hook types.EvmHooks, result error) }{ { "log collect hook", func() types.EvmHooks { return &LogRecordHook{} }, func(hook types.EvmHooks, result error) { suite.Require().NoError(result) suite.Require().Equal(1, len((hook.(*LogRecordHook).Logs))) }, }, { "always fail hook", func() types.EvmHooks { return &FailureHook{} }, func(hook types.EvmHooks, result error) { suite.Require().Error(result) }, }, } for _, tc := range testCases { suite.SetupTest() hook := tc.setupHook() suite.app.EvmKeeper.SetHooks(keeper.NewMultiEvmHooks(hook)) k := suite.app.EvmKeeper ctx := suite.ctx txHash := common.BigToHash(big.NewInt(1)) vmdb := statedb.New(ctx, k, statedb.NewTxConfig( common.BytesToHash(ctx.HeaderHash().Bytes()), txHash, 0, 0, )) vmdb.AddLog(ðtypes.Log{ Topics: []common.Hash{}, Address: suite.address, }) logs := vmdb.Logs() receipt := ðtypes.Receipt{ TxHash: txHash, Logs: logs, } result := k.PostTxProcessing(ctx, ethtypes.Message{}, receipt) tc.expFunc(hook, result) } }