github.com/Finschia/finschia-sdk@v0.48.1/x/evidence/keeper/keeper_test.go (about)

     1  package keeper_test
     2  
     3  import (
     4  	"encoding/hex"
     5  	"fmt"
     6  	"time"
     7  
     8  	"github.com/stretchr/testify/suite"
     9  	tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
    10  
    11  	"github.com/Finschia/finschia-sdk/baseapp"
    12  	"github.com/Finschia/finschia-sdk/crypto/keys/ed25519"
    13  	cryptotypes "github.com/Finschia/finschia-sdk/crypto/types"
    14  	"github.com/Finschia/finschia-sdk/simapp"
    15  	sdk "github.com/Finschia/finschia-sdk/types"
    16  	authtypes "github.com/Finschia/finschia-sdk/x/auth/types"
    17  	"github.com/Finschia/finschia-sdk/x/evidence/exported"
    18  	"github.com/Finschia/finschia-sdk/x/evidence/keeper"
    19  	"github.com/Finschia/finschia-sdk/x/evidence/types"
    20  	minttypes "github.com/Finschia/finschia-sdk/x/mint/types"
    21  	"github.com/Finschia/finschia-sdk/x/staking"
    22  )
    23  
    24  var (
    25  	pubkeys = []cryptotypes.PubKey{
    26  		newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB50"),
    27  		newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB51"),
    28  		newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB52"),
    29  	}
    30  
    31  	valAddresses = []sdk.ValAddress{
    32  		sdk.ValAddress(pubkeys[0].Address()),
    33  		sdk.ValAddress(pubkeys[1].Address()),
    34  		sdk.ValAddress(pubkeys[2].Address()),
    35  	}
    36  
    37  	// The default power validators are initialized to have within tests
    38  	initAmt   = sdk.TokensFromConsensusPower(200, sdk.DefaultPowerReduction)
    39  	initCoins = sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, initAmt))
    40  )
    41  
    42  func newPubKey(pk string) (res cryptotypes.PubKey) {
    43  	pkBytes, err := hex.DecodeString(pk)
    44  	if err != nil {
    45  		panic(err)
    46  	}
    47  
    48  	pubkey := &ed25519.PubKey{Key: pkBytes}
    49  
    50  	return pubkey
    51  }
    52  
    53  func testEquivocationHandler(_ interface{}) types.Handler {
    54  	return func(ctx sdk.Context, e exported.Evidence) error {
    55  		if err := e.ValidateBasic(); err != nil {
    56  			return err
    57  		}
    58  
    59  		ee, ok := e.(*types.Equivocation)
    60  		if !ok {
    61  			return fmt.Errorf("unexpected evidence type: %T", e)
    62  		}
    63  		if ee.Height%2 == 0 {
    64  			return fmt.Errorf("unexpected even evidence height: %d", ee.Height)
    65  		}
    66  
    67  		return nil
    68  	}
    69  }
    70  
    71  type KeeperTestSuite struct {
    72  	suite.Suite
    73  
    74  	ctx     sdk.Context
    75  	querier sdk.Querier
    76  	app     *simapp.SimApp
    77  
    78  	queryClient types.QueryClient
    79  	stakingHdl  sdk.Handler
    80  }
    81  
    82  func (suite *KeeperTestSuite) SetupTest() {
    83  	checkTx := false
    84  	app := simapp.Setup(checkTx)
    85  
    86  	// recreate keeper in order to use custom testing types
    87  	evidenceKeeper := keeper.NewKeeper(
    88  		app.AppCodec(), app.GetKey(types.StoreKey), app.StakingKeeper, app.SlashingKeeper,
    89  	)
    90  	router := types.NewRouter()
    91  	router = router.AddRoute(types.RouteEquivocation, testEquivocationHandler(*evidenceKeeper))
    92  	evidenceKeeper.SetRouter(router)
    93  
    94  	app.EvidenceKeeper = *evidenceKeeper
    95  
    96  	suite.ctx = app.BaseApp.NewContext(checkTx, tmproto.Header{Height: 1})
    97  	suite.querier = keeper.NewQuerier(*evidenceKeeper, app.LegacyAmino())
    98  	suite.app = app
    99  
   100  	for i, addr := range valAddresses {
   101  		addr := sdk.AccAddress(addr)
   102  		app.AccountKeeper.SetAccount(suite.ctx, authtypes.NewBaseAccount(addr, pubkeys[i], uint64(i), 0))
   103  	}
   104  
   105  	queryHelper := baseapp.NewQueryServerTestHelper(suite.ctx, app.InterfaceRegistry())
   106  	types.RegisterQueryServer(queryHelper, app.EvidenceKeeper)
   107  	suite.queryClient = types.NewQueryClient(queryHelper)
   108  	suite.stakingHdl = staking.NewHandler(app.StakingKeeper)
   109  }
   110  
   111  func (suite *KeeperTestSuite) populateEvidence(ctx sdk.Context, numEvidence int) []exported.Evidence {
   112  	evidence := make([]exported.Evidence, numEvidence)
   113  
   114  	for i := 0; i < numEvidence; i++ {
   115  		pk := ed25519.GenPrivKey()
   116  
   117  		evidence[i] = &types.Equivocation{
   118  			Height:           11,
   119  			Power:            100,
   120  			Time:             time.Now().UTC(),
   121  			ConsensusAddress: sdk.ConsAddress(pk.PubKey().Address().Bytes()).String(),
   122  		}
   123  
   124  		suite.Nil(suite.app.EvidenceKeeper.SubmitEvidence(ctx, evidence[i]))
   125  	}
   126  
   127  	return evidence
   128  }
   129  
   130  func (suite *KeeperTestSuite) populateValidators(ctx sdk.Context) {
   131  	// add accounts and set total supply
   132  	totalSupplyAmt := initAmt.MulRaw(int64(len(valAddresses)))
   133  	totalSupply := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, totalSupplyAmt))
   134  	suite.NoError(suite.app.BankKeeper.MintCoins(ctx, minttypes.ModuleName, totalSupply))
   135  
   136  	for _, addr := range valAddresses {
   137  		suite.NoError(suite.app.BankKeeper.SendCoinsFromModuleToAccount(ctx, minttypes.ModuleName, (sdk.AccAddress)(addr), initCoins))
   138  	}
   139  }
   140  
   141  func (suite *KeeperTestSuite) TestSubmitValidEvidence() {
   142  	ctx := suite.ctx.WithIsCheckTx(false)
   143  	pk := ed25519.GenPrivKey()
   144  
   145  	e := &types.Equivocation{
   146  		Height:           1,
   147  		Power:            100,
   148  		Time:             time.Now().UTC(),
   149  		ConsensusAddress: sdk.ConsAddress(pk.PubKey().Address().Bytes()).String(),
   150  	}
   151  
   152  	suite.Nil(suite.app.EvidenceKeeper.SubmitEvidence(ctx, e))
   153  
   154  	res, ok := suite.app.EvidenceKeeper.GetEvidence(ctx, e.Hash())
   155  	suite.True(ok)
   156  	suite.Equal(e, res)
   157  }
   158  
   159  func (suite *KeeperTestSuite) TestSubmitValidEvidence_Duplicate() {
   160  	ctx := suite.ctx.WithIsCheckTx(false)
   161  	pk := ed25519.GenPrivKey()
   162  
   163  	e := &types.Equivocation{
   164  		Height:           1,
   165  		Power:            100,
   166  		Time:             time.Now().UTC(),
   167  		ConsensusAddress: sdk.ConsAddress(pk.PubKey().Address().Bytes()).String(),
   168  	}
   169  
   170  	suite.Nil(suite.app.EvidenceKeeper.SubmitEvidence(ctx, e))
   171  	suite.Error(suite.app.EvidenceKeeper.SubmitEvidence(ctx, e))
   172  
   173  	res, ok := suite.app.EvidenceKeeper.GetEvidence(ctx, e.Hash())
   174  	suite.True(ok)
   175  	suite.Equal(e, res)
   176  }
   177  
   178  func (suite *KeeperTestSuite) TestSubmitInvalidEvidence() {
   179  	ctx := suite.ctx.WithIsCheckTx(false)
   180  	pk := ed25519.GenPrivKey()
   181  	e := &types.Equivocation{
   182  		Height:           0,
   183  		Power:            100,
   184  		Time:             time.Now().UTC(),
   185  		ConsensusAddress: sdk.ConsAddress(pk.PubKey().Address().Bytes()).String(),
   186  	}
   187  
   188  	suite.Error(suite.app.EvidenceKeeper.SubmitEvidence(ctx, e))
   189  
   190  	res, ok := suite.app.EvidenceKeeper.GetEvidence(ctx, e.Hash())
   191  	suite.False(ok)
   192  	suite.Nil(res)
   193  }
   194  
   195  func (suite *KeeperTestSuite) TestIterateEvidence() {
   196  	ctx := suite.ctx.WithIsCheckTx(false)
   197  	numEvidence := 100
   198  	suite.populateEvidence(ctx, numEvidence)
   199  
   200  	evidence := suite.app.EvidenceKeeper.GetAllEvidence(ctx)
   201  	suite.Len(evidence, numEvidence)
   202  }
   203  
   204  func (suite *KeeperTestSuite) TestGetEvidenceHandler() {
   205  	handler, err := suite.app.EvidenceKeeper.GetEvidenceHandler((&types.Equivocation{}).Route())
   206  	suite.NoError(err)
   207  	suite.NotNil(handler)
   208  
   209  	handler, err = suite.app.EvidenceKeeper.GetEvidenceHandler("invalidHandler")
   210  	suite.Error(err)
   211  	suite.Nil(handler)
   212  }