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 }