github.com/Finschia/finschia-sdk@v0.48.1/x/evidence/handler_test.go (about) 1 package evidence_test 2 3 import ( 4 "fmt" 5 "testing" 6 "time" 7 8 "github.com/stretchr/testify/require" 9 "github.com/stretchr/testify/suite" 10 tmproto "github.com/tendermint/tendermint/proto/tendermint/types" 11 12 "github.com/Finschia/finschia-sdk/crypto/keys/ed25519" 13 "github.com/Finschia/finschia-sdk/simapp" 14 sdk "github.com/Finschia/finschia-sdk/types" 15 "github.com/Finschia/finschia-sdk/x/evidence" 16 "github.com/Finschia/finschia-sdk/x/evidence/exported" 17 "github.com/Finschia/finschia-sdk/x/evidence/keeper" 18 "github.com/Finschia/finschia-sdk/x/evidence/types" 19 ) 20 21 type HandlerTestSuite struct { 22 suite.Suite 23 24 handler sdk.Handler 25 app *simapp.SimApp 26 } 27 28 func testMsgSubmitEvidence(r *require.Assertions, e exported.Evidence, s sdk.AccAddress) exported.MsgSubmitEvidenceI { 29 msg, err := types.NewMsgSubmitEvidence(s, e) 30 r.NoError(err) 31 return msg 32 } 33 34 func testEquivocationHandler(k interface{}) types.Handler { 35 return func(ctx sdk.Context, e exported.Evidence) error { 36 if err := e.ValidateBasic(); err != nil { 37 return err 38 } 39 40 ee, ok := e.(*types.Equivocation) 41 if !ok { 42 return fmt.Errorf("unexpected evidence type: %T", e) 43 } 44 if ee.Height%2 == 0 { 45 return fmt.Errorf("unexpected even evidence height: %d", ee.Height) 46 } 47 48 return nil 49 } 50 } 51 52 func (suite *HandlerTestSuite) SetupTest() { 53 checkTx := false 54 app := simapp.Setup(checkTx) 55 56 // recreate keeper in order to use custom testing types 57 evidenceKeeper := keeper.NewKeeper( 58 app.AppCodec(), app.GetKey(types.StoreKey), app.StakingKeeper, app.SlashingKeeper, 59 ) 60 router := types.NewRouter() 61 router = router.AddRoute(types.RouteEquivocation, testEquivocationHandler(*evidenceKeeper)) 62 evidenceKeeper.SetRouter(router) 63 64 app.EvidenceKeeper = *evidenceKeeper 65 66 suite.handler = evidence.NewHandler(*evidenceKeeper) 67 suite.app = app 68 } 69 70 func (suite *HandlerTestSuite) TestMsgSubmitEvidence() { 71 pk := ed25519.GenPrivKey() 72 s := sdk.AccAddress("test________________") 73 74 testCases := []struct { 75 msg sdk.Msg 76 expectErr bool 77 }{ 78 { 79 testMsgSubmitEvidence( 80 suite.Require(), 81 &types.Equivocation{ 82 Height: 11, 83 Time: time.Now().UTC(), 84 Power: 100, 85 ConsensusAddress: pk.PubKey().Address().String(), 86 }, 87 s, 88 ), 89 false, 90 }, 91 { 92 testMsgSubmitEvidence( 93 suite.Require(), 94 &types.Equivocation{ 95 Height: 10, 96 Time: time.Now().UTC(), 97 Power: 100, 98 ConsensusAddress: pk.PubKey().Address().String(), 99 }, 100 s, 101 ), 102 true, 103 }, 104 } 105 106 for i, tc := range testCases { 107 ctx := suite.app.BaseApp.NewContext(false, tmproto.Header{Height: suite.app.LastBlockHeight() + 1}) 108 109 res, err := suite.handler(ctx, tc.msg) 110 if tc.expectErr { 111 suite.Require().Error(err, "expected error; tc #%d", i) 112 } else { 113 suite.Require().NoError(err, "unexpected error; tc #%d", i) 114 suite.Require().NotNil(res, "expected non-nil result; tc #%d", i) 115 116 msg := tc.msg.(exported.MsgSubmitEvidenceI) 117 118 var resultData types.MsgSubmitEvidenceResponse 119 suite.app.AppCodec().Unmarshal(res.Data, &resultData) 120 suite.Require().Equal(msg.GetEvidence().Hash().Bytes(), resultData.Hash, "invalid hash; tc #%d", i) 121 } 122 } 123 } 124 125 func TestHandlerTestSuite(t *testing.T) { 126 suite.Run(t, new(HandlerTestSuite)) 127 }