Skip to content

Commit a19eead

Browse files
refactor: x/crisis audit changes (#13990)
* wip: nits * add tests for VerifyInvariant and increase codecov for keeper * add genesis test * cover all keeper code in tests Co-authored-by: Julien Robert <[email protected]>
1 parent e260fc1 commit a19eead

File tree

10 files changed

+176
-12
lines changed

10 files changed

+176
-12
lines changed

proto/cosmos/crisis/module/v1/module.proto

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ message Module {
1010
go_import: "github.com/cosmos/cosmos-sdk/x/crisis"
1111
};
1212

13+
// fee_collector_name is the name of the FeeCollector ModuleAccount.
1314
string fee_collector_name = 1;
1415

1516
// authority defines the custom module authority. If not set, defaults to the governance module.

proto/cosmos/crisis/v1beta1/tx.proto

+6-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import "cosmos/base/v1beta1/coin.proto";
1313
service Msg {
1414
option (cosmos.msg.v1.service) = true;
1515

16-
// VerifyInvariant defines a method to verify a particular invariance.
16+
// VerifyInvariant defines a method to verify a particular invariant.
1717
rpc VerifyInvariant(MsgVerifyInvariant) returns (MsgVerifyInvariantResponse);
1818

1919
// UpdateParams defines a governance operation for updating the x/crisis module
@@ -31,8 +31,13 @@ message MsgVerifyInvariant {
3131
option (gogoproto.equal) = false;
3232
option (gogoproto.goproto_getters) = false;
3333

34+
// sender is the account address of private key to send coins to fee collector account.
3435
string sender = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"];
36+
37+
// name of the invariant module.
3538
string invariant_module_name = 2;
39+
40+
// invariant_route is the msg's invariant route.
3641
string invariant_route = 3;
3742
}
3843

x/crisis/exported/exported.go

-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ type (
1313
//
1414
// NOTE: This is used solely for migration of x/params managed parameters.
1515
Subspace interface {
16-
// GetParamSet(ctx sdk.Context, ps ParamSet)
1716
Get(ctx sdk.Context, key []byte, ptr interface{})
1817
}
1918
)

x/crisis/keeper/genesis_test.go

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package keeper_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/golang/mock/gomock"
7+
"github.com/stretchr/testify/suite"
8+
9+
"github.com/cosmos/cosmos-sdk/codec"
10+
"github.com/cosmos/cosmos-sdk/testutil"
11+
sdk "github.com/cosmos/cosmos-sdk/types"
12+
moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil"
13+
"github.com/cosmos/cosmos-sdk/x/crisis"
14+
"github.com/cosmos/cosmos-sdk/x/crisis/keeper"
15+
crisistestutil "github.com/cosmos/cosmos-sdk/x/crisis/testutil"
16+
"github.com/cosmos/cosmos-sdk/x/crisis/types"
17+
)
18+
19+
type GenesisTestSuite struct {
20+
suite.Suite
21+
22+
sdkCtx sdk.Context
23+
keeper keeper.Keeper
24+
cdc codec.BinaryCodec
25+
}
26+
27+
func TestGenesisTestSuite(t *testing.T) {
28+
suite.Run(t, new(GenesisTestSuite))
29+
}
30+
31+
func (s *GenesisTestSuite) SetupTest() {
32+
key := sdk.NewKVStoreKey(types.StoreKey)
33+
testCtx := testutil.DefaultContextWithDB(s.T(), key, sdk.NewTransientStoreKey("transient_test"))
34+
encCfg := moduletestutil.MakeTestEncodingConfig(crisis.AppModuleBasic{})
35+
36+
// gomock initializations
37+
ctrl := gomock.NewController(s.T())
38+
s.cdc = codec.NewProtoCodec(encCfg.InterfaceRegistry)
39+
s.sdkCtx = testCtx.Ctx
40+
41+
supplyKeeper := crisistestutil.NewMockSupplyKeeper(ctrl)
42+
43+
s.keeper = *keeper.NewKeeper(s.cdc, key, 5, supplyKeeper, "", "")
44+
}
45+
46+
func (s *GenesisTestSuite) TestImportExportGenesis() {
47+
// default params
48+
constantFee := sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1000))
49+
err := s.keeper.SetConstantFee(s.sdkCtx, constantFee)
50+
s.Require().NoError(err)
51+
genesis := s.keeper.ExportGenesis(s.sdkCtx)
52+
53+
// set constant fee to zero
54+
constantFee = sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(0))
55+
err = s.keeper.SetConstantFee(s.sdkCtx, constantFee)
56+
s.Require().NoError(err)
57+
58+
s.keeper.InitGenesis(s.sdkCtx, genesis)
59+
newGenesis := s.keeper.ExportGenesis(s.sdkCtx)
60+
s.Require().Equal(genesis, newGenesis)
61+
}
62+
63+
func (s *GenesisTestSuite) TestInitGenesis() {
64+
genesisState := types.DefaultGenesisState()
65+
genesisState.ConstantFee = sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1000))
66+
s.keeper.InitGenesis(s.sdkCtx, genesisState)
67+
68+
constantFee := s.keeper.GetConstantFee(s.sdkCtx)
69+
s.Require().Equal(genesisState.ConstantFee, constantFee)
70+
}

x/crisis/keeper/keeper_test.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ package keeper_test
33
import (
44
"testing"
55

6-
"github.com/cosmos/cosmos-sdk/testutil"
76
"github.com/golang/mock/gomock"
87
"github.com/stretchr/testify/require"
98

9+
"github.com/cosmos/cosmos-sdk/testutil"
1010
sdk "github.com/cosmos/cosmos-sdk/types"
1111
moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil"
1212
"github.com/cosmos/cosmos-sdk/x/crisis"
@@ -40,7 +40,8 @@ func TestInvariants(t *testing.T) {
4040

4141
orgInvRoutes := keeper.Routes()
4242
keeper.RegisterRoute("testModule", "testRoute", func(sdk.Context) (string, bool) { return "", false })
43-
require.Equal(t, len(keeper.Routes()), len(orgInvRoutes)+1)
43+
invar := keeper.Invariants()
44+
require.Equal(t, len(invar), len(orgInvRoutes)+1)
4445
}
4546

4647
func TestAssertInvariants(t *testing.T) {

x/crisis/keeper/migrator.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,17 @@ type Migrator struct {
1212
legacySubspace exported.Subspace
1313
}
1414

15+
// NewMigrator returns a new Migrator.
1516
func NewMigrator(k *Keeper, ss exported.Subspace) Migrator {
1617
return Migrator{
1718
keeper: k,
1819
legacySubspace: ss,
1920
}
2021
}
2122

22-
// Migrate1to2 migrates the x/mint module state from the consensus version 1 to
23+
// Migrate1to2 migrates the x/crisis module state from the consensus version 1 to
2324
// version 2. Specifically, it takes the parameters that are currently stored
24-
// and managed by the x/params modules and stores them directly into the x/mint
25+
// and managed by the x/params modules and stores them directly into the x/crisis
2526
// module state.
2627
func (m Migrator) Migrate1to2(ctx sdk.Context) error {
2728
return v2.MigrateStore(ctx, m.keeper.storeKey, m.legacySubspace, m.keeper.cdc)

x/crisis/keeper/msg_server.go

+4
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import (
1111

1212
var _ types.MsgServer = &Keeper{}
1313

14+
// VerifyInvariant implements MsgServer.VerifyInvariant method.
15+
// It defines a method to verify a particular invariant.
1416
func (k *Keeper) VerifyInvariant(goCtx context.Context, msg *types.MsgVerifyInvariant) (*types.MsgVerifyInvariantResponse, error) {
1517
ctx := sdk.UnwrapSDKContext(goCtx)
1618
constantFee := sdk.NewCoins(k.GetConstantFee(ctx))
@@ -62,6 +64,8 @@ func (k *Keeper) VerifyInvariant(goCtx context.Context, msg *types.MsgVerifyInva
6264
return &types.MsgVerifyInvariantResponse{}, nil
6365
}
6466

67+
// UpdateParams implements MsgServer.UpdateParams method.
68+
// It defines a method to update the x/crisis module parameters.
6569
func (k *Keeper) UpdateParams(goCtx context.Context, req *types.MsgUpdateParams) (*types.MsgUpdateParamsResponse, error) {
6670
if k.authority != req.Authority {
6771
return nil, errors.Wrapf(govtypes.ErrInvalidSigner, "invalid authority; expected %s, got %s", k.authority, req.Authority)

x/crisis/keeper/msg_server_test.go

+80-4
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,28 @@ package keeper_test
33
import (
44
"testing"
55

6+
"github.com/golang/mock/gomock"
7+
"github.com/stretchr/testify/suite"
8+
69
"github.com/cosmos/cosmos-sdk/testutil"
710
sdk "github.com/cosmos/cosmos-sdk/types"
811
moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil"
912
"github.com/cosmos/cosmos-sdk/x/crisis"
1013
"github.com/cosmos/cosmos-sdk/x/crisis/keeper"
1114
crisistestutil "github.com/cosmos/cosmos-sdk/x/crisis/testutil"
1215
"github.com/cosmos/cosmos-sdk/x/crisis/types"
13-
"github.com/golang/mock/gomock"
14-
"github.com/stretchr/testify/suite"
1516
)
1617

1718
type KeeperTestSuite struct {
1819
suite.Suite
1920

20-
ctx sdk.Context
21-
keeper *keeper.Keeper
21+
ctx sdk.Context
22+
authKeeper *crisistestutil.MockSupplyKeeper
23+
keeper *keeper.Keeper
2224
}
2325

2426
func (s *KeeperTestSuite) SetupTest() {
27+
// gomock initializations
2528
ctrl := gomock.NewController(s.T())
2629
supplyKeeper := crisistestutil.NewMockSupplyKeeper(ctrl)
2730

@@ -32,6 +35,79 @@ func (s *KeeperTestSuite) SetupTest() {
3235

3336
s.ctx = testCtx.Ctx
3437
s.keeper = keeper
38+
s.authKeeper = supplyKeeper
39+
}
40+
41+
func (s *KeeperTestSuite) TestMsgVerifyInvariant() {
42+
// default params
43+
constantFee := sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1000))
44+
err := s.keeper.SetConstantFee(s.ctx, constantFee)
45+
s.Require().NoError(err)
46+
47+
sender := sdk.AccAddress([]byte("addr1_______________"))
48+
49+
s.authKeeper.EXPECT().SendCoinsFromAccountToModule(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).Times(2)
50+
s.keeper.RegisterRoute("bank", "total-supply", func(sdk.Context) (string, bool) { return "", false })
51+
52+
testCases := []struct {
53+
name string
54+
input *types.MsgVerifyInvariant
55+
expErr bool
56+
expErrMsg string
57+
}{
58+
{
59+
name: "empty sender not allowed",
60+
input: &types.MsgVerifyInvariant{
61+
Sender: "",
62+
InvariantModuleName: "bank",
63+
InvariantRoute: "total-supply",
64+
},
65+
expErr: true,
66+
expErrMsg: "empty address string is not allowed",
67+
},
68+
{
69+
name: "invalid sender address",
70+
input: &types.MsgVerifyInvariant{
71+
Sender: "invalid address",
72+
InvariantModuleName: "bank",
73+
InvariantRoute: "total-supply",
74+
},
75+
expErr: true,
76+
expErrMsg: "decoding bech32 failed",
77+
},
78+
{
79+
name: "unregistered invariant route",
80+
input: &types.MsgVerifyInvariant{
81+
Sender: sender.String(),
82+
InvariantModuleName: "module",
83+
InvariantRoute: "invalidroute",
84+
},
85+
expErr: true,
86+
expErrMsg: "unknown invariant",
87+
},
88+
{
89+
name: "valid invariant",
90+
input: &types.MsgVerifyInvariant{
91+
Sender: sender.String(),
92+
InvariantModuleName: "bank",
93+
InvariantRoute: "total-supply",
94+
},
95+
expErr: false,
96+
},
97+
}
98+
99+
for _, tc := range testCases {
100+
tc := tc
101+
s.Run(tc.name, func() {
102+
_, err = s.keeper.VerifyInvariant(s.ctx, tc.input)
103+
if tc.expErr {
104+
s.Require().Error(err)
105+
s.Require().Contains(err.Error(), tc.expErrMsg)
106+
} else {
107+
s.Require().NoError(err)
108+
}
109+
})
110+
}
35111
}
36112

37113
func (s *KeeperTestSuite) TestMsgUpdateParams() {

x/crisis/types/codec.go

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) {
1919
legacy.RegisterAminoMsg(cdc, &MsgUpdateParams{}, "cosmos-sdk/x/crisis/MsgUpdateParams")
2020
}
2121

22+
// RegisterInterfaces registers the interfaces types with the Interface Registry.
2223
func RegisterInterfaces(registry codectypes.InterfaceRegistry) {
2324
registry.RegisterImplementations((*sdk.Msg)(nil),
2425
&MsgVerifyInvariant{},

x/crisis/types/msgs.go

+8-2
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,11 @@ func NewMsgVerifyInvariant(sender sdk.AccAddress, invModeName, invRoute string)
2424
}
2525
}
2626

27+
// Route returns the MsgVerifyInvariant's route.
2728
func (msg MsgVerifyInvariant) Route() string { return ModuleName }
28-
func (msg MsgVerifyInvariant) Type() string { return TypeMsgVerifyInvariant }
29+
30+
// Type returns the MsgVerifyInvariant's type.
31+
func (msg MsgVerifyInvariant) Type() string { return TypeMsgVerifyInvariant }
2932

3033
// get the bytes for the message signer to sign on
3134
func (msg MsgVerifyInvariant) GetSigners() []sdk.AccAddress {
@@ -52,8 +55,11 @@ func (msg MsgVerifyInvariant) FullInvariantRoute() string {
5255
return msg.InvariantModuleName + "/" + msg.InvariantRoute
5356
}
5457

58+
// Route returns the MsgUpdateParams's route.
5559
func (msg MsgUpdateParams) Route() string { return ModuleName }
56-
func (msg MsgUpdateParams) Type() string { return TypeMsgUpdateParams }
60+
61+
// Type returns the MsgUpdateParams's type.
62+
func (msg MsgUpdateParams) Type() string { return TypeMsgUpdateParams }
5763

5864
// GetSigners returns the signer addresses that are expected to sign the result
5965
// of GetSignBytes.

0 commit comments

Comments
 (0)