cosmos-sdk/x/evidence/keeper/keeper_test.go
Julien Robert 015bbed0ed
feat: decouple x/evidence from simapp (#12245)
* feat: decouple x/evidence from simapp

* update docs

* remove mint

* updates

* fix test
2022-06-14 22:43:16 +02:00

239 lines
6.9 KiB
Go

package keeper_test
import (
"encoding/hex"
"fmt"
"time"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/suite"
tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
"github.com/cosmos/cosmos-sdk/baseapp"
"github.com/cosmos/cosmos-sdk/codec"
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
"github.com/cosmos/cosmos-sdk/crypto/keys/ed25519"
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
"github.com/cosmos/cosmos-sdk/runtime"
simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims"
sdk "github.com/cosmos/cosmos-sdk/types"
authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper"
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper"
"github.com/cosmos/cosmos-sdk/x/evidence/exported"
"github.com/cosmos/cosmos-sdk/x/evidence/keeper"
"github.com/cosmos/cosmos-sdk/x/evidence/testutil"
"github.com/cosmos/cosmos-sdk/x/evidence/types"
minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper"
stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper"
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
)
var (
pubkeys = []cryptotypes.PubKey{
newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB50"),
newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB51"),
newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB52"),
}
valAddresses = []sdk.ValAddress{
sdk.ValAddress(pubkeys[0].Address()),
sdk.ValAddress(pubkeys[1].Address()),
sdk.ValAddress(pubkeys[2].Address()),
}
// The default power validators are initialized to have within tests
initAmt = sdk.TokensFromConsensusPower(200, sdk.DefaultPowerReduction)
initCoins = sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, initAmt))
)
func newPubKey(pk string) (res cryptotypes.PubKey) {
pkBytes, err := hex.DecodeString(pk)
if err != nil {
panic(err)
}
pubkey := &ed25519.PubKey{Key: pkBytes}
return pubkey
}
func testEquivocationHandler(_ interface{}) types.Handler {
return func(ctx sdk.Context, e exported.Evidence) error {
if err := e.ValidateBasic(); err != nil {
return err
}
ee, ok := e.(*types.Equivocation)
if !ok {
return fmt.Errorf("unexpected evidence type: %T", e)
}
if ee.Height%2 == 0 {
return fmt.Errorf("unexpected even evidence height: %d", ee.Height)
}
return nil
}
}
type KeeperTestSuite struct {
suite.Suite
ctx sdk.Context
querier sdk.Querier
app *runtime.App
evidenceKeeper keeper.Keeper
bankKeeper bankkeeper.Keeper
accountKeeper authkeeper.AccountKeeper
slashingKeeper slashingkeeper.Keeper
stakingKeeper *stakingkeeper.Keeper
interfaceRegistry codectypes.InterfaceRegistry
queryClient types.QueryClient
}
func (suite *KeeperTestSuite) SetupTest() {
var (
legacyAmino *codec.LegacyAmino
evidenceKeeper keeper.Keeper
)
app, err := simtestutil.Setup(testutil.AppConfig,
&legacyAmino,
&evidenceKeeper,
&suite.interfaceRegistry,
&suite.accountKeeper,
&suite.bankKeeper,
&suite.slashingKeeper,
&suite.stakingKeeper,
)
require.NoError(suite.T(), err)
router := types.NewRouter()
router = router.AddRoute(types.RouteEquivocation, testEquivocationHandler(evidenceKeeper))
evidenceKeeper.SetRouter(router)
suite.ctx = app.BaseApp.NewContext(false, tmproto.Header{Height: 1})
suite.querier = keeper.NewQuerier(evidenceKeeper, legacyAmino)
suite.app = app
for i, addr := range valAddresses {
addr := sdk.AccAddress(addr)
suite.accountKeeper.SetAccount(suite.ctx, authtypes.NewBaseAccount(addr, pubkeys[i], uint64(i), 0))
}
suite.stakingKeeper.SetHooks(
stakingtypes.NewMultiStakingHooks(suite.slashingKeeper.Hooks()),
)
queryHelper := baseapp.NewQueryServerTestHelper(suite.ctx, suite.interfaceRegistry)
types.RegisterQueryServer(queryHelper, evidenceKeeper)
suite.queryClient = types.NewQueryClient(queryHelper)
suite.evidenceKeeper = evidenceKeeper
}
func (suite *KeeperTestSuite) populateEvidence(ctx sdk.Context, numEvidence int) []exported.Evidence {
evidence := make([]exported.Evidence, numEvidence)
for i := 0; i < numEvidence; i++ {
pk := ed25519.GenPrivKey()
evidence[i] = &types.Equivocation{
Height: 11,
Power: 100,
Time: time.Now().UTC(),
ConsensusAddress: sdk.ConsAddress(pk.PubKey().Address().Bytes()).String(),
}
suite.Nil(suite.evidenceKeeper.SubmitEvidence(ctx, evidence[i]))
}
return evidence
}
func (suite *KeeperTestSuite) populateValidators(ctx sdk.Context) {
// add accounts and set total supply
totalSupplyAmt := initAmt.MulRaw(int64(len(valAddresses)))
totalSupply := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, totalSupplyAmt))
suite.NoError(suite.bankKeeper.MintCoins(ctx, minttypes.ModuleName, totalSupply))
for _, addr := range valAddresses {
suite.NoError(suite.bankKeeper.SendCoinsFromModuleToAccount(ctx, minttypes.ModuleName, (sdk.AccAddress)(addr), initCoins))
}
}
func (suite *KeeperTestSuite) TestSubmitValidEvidence() {
ctx := suite.ctx.WithIsCheckTx(false)
pk := ed25519.GenPrivKey()
e := &types.Equivocation{
Height: 1,
Power: 100,
Time: time.Now().UTC(),
ConsensusAddress: sdk.ConsAddress(pk.PubKey().Address().Bytes()).String(),
}
suite.Nil(suite.evidenceKeeper.SubmitEvidence(ctx, e))
res, ok := suite.evidenceKeeper.GetEvidence(ctx, e.Hash())
suite.True(ok)
suite.Equal(e, res)
}
func (suite *KeeperTestSuite) TestSubmitValidEvidence_Duplicate() {
ctx := suite.ctx.WithIsCheckTx(false)
pk := ed25519.GenPrivKey()
e := &types.Equivocation{
Height: 1,
Power: 100,
Time: time.Now().UTC(),
ConsensusAddress: sdk.ConsAddress(pk.PubKey().Address().Bytes()).String(),
}
suite.Nil(suite.evidenceKeeper.SubmitEvidence(ctx, e))
suite.Error(suite.evidenceKeeper.SubmitEvidence(ctx, e))
res, ok := suite.evidenceKeeper.GetEvidence(ctx, e.Hash())
suite.True(ok)
suite.Equal(e, res)
}
func (suite *KeeperTestSuite) TestSubmitInvalidEvidence() {
ctx := suite.ctx.WithIsCheckTx(false)
pk := ed25519.GenPrivKey()
e := &types.Equivocation{
Height: 0,
Power: 100,
Time: time.Now().UTC(),
ConsensusAddress: sdk.ConsAddress(pk.PubKey().Address().Bytes()).String(),
}
suite.Error(suite.evidenceKeeper.SubmitEvidence(ctx, e))
res, ok := suite.evidenceKeeper.GetEvidence(ctx, e.Hash())
suite.False(ok)
suite.Nil(res)
}
func (suite *KeeperTestSuite) TestIterateEvidence() {
ctx := suite.ctx.WithIsCheckTx(false)
numEvidence := 100
suite.populateEvidence(ctx, numEvidence)
evidence := suite.evidenceKeeper.GetAllEvidence(ctx)
suite.Len(evidence, numEvidence)
}
func (suite *KeeperTestSuite) TestGetEvidenceHandler() {
handler, err := suite.evidenceKeeper.GetEvidenceHandler((&types.Equivocation{}).Route())
suite.NoError(err)
suite.NotNil(handler)
handler, err = suite.evidenceKeeper.GetEvidenceHandler("invalidHandler")
suite.Error(err)
suite.Nil(handler)
}