Skip to content

Commit 1802e30

Browse files
committed
test: add test codes for genesis
1 parent c9801a2 commit 1802e30

File tree

10 files changed

+147
-95
lines changed

10 files changed

+147
-95
lines changed

app/export.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ func (app *FarmingApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddr
146146
counter := int16(0)
147147

148148
for ; iter.Valid(); iter.Next() {
149-
addr := sdk.ValAddress(iter.Key()[1:])
149+
addr := sdk.ValAddress(stakingtypes.AddressFromValidatorsKey(iter.Key()))
150150
validator, found := app.StakingKeeper.GetValidator(ctx, addr)
151151
if !found {
152152
panic("expected validator, not found")

proto/tendermint/farming/v1beta1/genesis.proto

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ message PlanRecord {
5959
option (gogoproto.goproto_getters) = false;
6060

6161
// plan specifies the plan interface; it can be FixedAmountPlan or RatioPlan
62-
google.protobuf.Any plan = 1 [(gogoproto.nullable) = false];
62+
google.protobuf.Any plan = 1 [(gogoproto.nullable) = false, (cosmos_proto.accepts_interface) = "PlanI"];
6363

6464
// farming_pool_coins specifies balance of the farming pool for the plan
6565
// this param is needed for import/export validation

x/farming/keeper/genesis.go

+8-23
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,7 @@ import (
88

99
// InitGenesis initializes the farming module's state from a given genesis state.
1010
func (k Keeper) InitGenesis(ctx sdk.Context, genState types.GenesisState) {
11-
if err := k.ValidateGenesis(ctx, genState); err != nil {
12-
panic(err)
13-
}
14-
11+
ctx, applyCache := ctx.CacheContext()
1512
k.SetParams(ctx, genState.Params)
1613
moduleAcc := k.accountKeeper.GetModuleAccount(ctx, types.ModuleName)
1714
k.accountKeeper.SetModuleAccount(ctx, moduleAcc)
@@ -36,6 +33,13 @@ func (k Keeper) InitGenesis(ctx sdk.Context, genState types.GenesisState) {
3633
for _, reward := range genState.Rewards {
3734
k.SetReward(ctx, reward.StakingCoinDenom, reward.GetFarmer(), reward.RewardCoins)
3835
}
36+
if err := k.ValidateRemainingRewardsAmount(ctx); err != nil {
37+
panic(err)
38+
}
39+
if err := k.ValidateStakingReservedAmount(ctx); err != nil {
40+
panic(err)
41+
}
42+
applyCache()
3943
}
4044

4145
// ExportGenesis returns the farming module's genesis state.
@@ -61,22 +65,3 @@ func (k Keeper) ExportGenesis(ctx sdk.Context) *types.GenesisState {
6165
epochTime, _ := k.GetLastEpochTime(ctx)
6266
return types.NewGenesisState(params, planRecords, stakings, rewards, k.bankKeeper.GetAllBalances(ctx, types.StakingReserveAcc), k.bankKeeper.GetAllBalances(ctx, types.RewardsReserveAcc), epochTime)
6367
}
64-
65-
// ValidateGenesis validates the farming module's genesis state.
66-
func (k Keeper) ValidateGenesis(ctx sdk.Context, genState types.GenesisState) error {
67-
err := types.ValidateRatioPlans(genState)
68-
if err != nil {
69-
return nil
70-
}
71-
72-
// TODO: Make it more efficient by eliminating duplicate init
73-
cc, _ := ctx.CacheContext()
74-
k.InitGenesis(cc, genState)
75-
if err := k.ValidateRemainingRewardsAmount(cc); err != nil {
76-
return err
77-
}
78-
if err := k.ValidateStakingReservedAmount(cc); err != nil {
79-
return err
80-
}
81-
return nil
82-
}

x/farming/keeper/genesis_test.go

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package keeper_test
2+
3+
import (
4+
sdk "github.com/cosmos/cosmos-sdk/types"
5+
6+
"github.com/tendermint/farming/x/farming/types"
7+
)
8+
9+
func (suite *KeeperTestSuite) TestInitGenesis() {
10+
plans := []types.PlanI{
11+
types.NewFixedAmountPlan(
12+
types.NewBasePlan(
13+
1,
14+
"",
15+
types.PlanTypePrivate,
16+
suite.addrs[0].String(),
17+
suite.addrs[0].String(),
18+
sdk.NewDecCoins(
19+
sdk.NewDecCoinFromDec(denom1, sdk.NewDecWithPrec(3, 1)),
20+
sdk.NewDecCoinFromDec(denom2, sdk.NewDecWithPrec(7, 1))),
21+
mustParseRFC3339("2021-07-30T00:00:00Z"),
22+
mustParseRFC3339("2021-08-30T00:00:00Z"),
23+
),
24+
sdk.NewCoins(sdk.NewInt64Coin(denom3, 1_000_000))),
25+
types.NewRatioPlan(
26+
types.NewBasePlan(
27+
2,
28+
"",
29+
types.PlanTypePublic,
30+
suite.addrs[0].String(),
31+
suite.addrs[0].String(),
32+
sdk.NewDecCoins(
33+
sdk.NewDecCoinFromDec(denom1, sdk.NewDecWithPrec(3, 1)),
34+
sdk.NewDecCoinFromDec(denom2, sdk.NewDecWithPrec(7, 1))),
35+
mustParseRFC3339("2021-07-30T00:00:00Z"),
36+
mustParseRFC3339("2021-08-30T00:00:00Z"),
37+
),
38+
sdk.MustNewDecFromStr("0.01")),
39+
}
40+
//for _, plan := range plans {
41+
// suite.keeper.SetPlan(suite.ctx, plan)
42+
//}
43+
suite.keeper.SetPlan(suite.ctx, plans[1])
44+
suite.keeper.SetPlan(suite.ctx, plans[0])
45+
46+
suite.Stake(suite.addrs[1], sdk.NewCoins(
47+
sdk.NewInt64Coin(denom1, 1_000_000),
48+
sdk.NewInt64Coin(denom2, 1_000_000)))
49+
suite.keeper.ProcessQueuedCoins(suite.ctx)
50+
51+
suite.ctx = suite.ctx.WithBlockTime(mustParseRFC3339("2021-07-31T00:00:00Z"))
52+
err := suite.keeper.DistributeRewards(suite.ctx)
53+
suite.Require().NoError(err)
54+
55+
var genState *types.GenesisState
56+
suite.Require().NotPanics(func() {
57+
genState = suite.keeper.ExportGenesis(suite.ctx)
58+
},
59+
)
60+
err = types.ValidateGenesis(*genState)
61+
suite.Require().NoError(err)
62+
63+
suite.Require().NotPanics(func() {
64+
suite.keeper.InitGenesis(suite.ctx, *genState)
65+
},
66+
)
67+
suite.Require().Equal(genState, suite.keeper.ExportGenesis(suite.ctx))
68+
}

x/farming/types/genesis.go

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package types
22

33
import (
4+
"fmt"
45
"time"
56

67
sdk "github.com/cosmos/cosmos-sdk/types"
@@ -27,8 +28,7 @@ func DefaultGenesisState() *GenesisState {
2728
[]PlanRecord{},
2829
[]Staking{},
2930
[]Reward{},
30-
// TODO: zero or nil
31-
nil,
31+
sdk.Coins{},
3232
sdk.Coins{},
3333
time.Time{},
3434
)
@@ -39,6 +39,7 @@ func ValidateGenesis(data GenesisState) error {
3939
if err := data.Params.Validate(); err != nil {
4040
return err
4141
}
42+
id := uint64(0)
4243
var plans []PlanI
4344
for _, record := range data.PlanRecords {
4445
if err := record.Validate(); err != nil {
@@ -48,6 +49,9 @@ func ValidateGenesis(data GenesisState) error {
4849
if err != nil {
4950
return err
5051
}
52+
if plan.GetId() < id {
53+
fmt.Errorf("pool records must be sorted")
54+
}
5155
plans = append(plans, plan)
5256
}
5357
err := ValidateRatioPlans(plans)

x/farming/types/genesis.pb.go

+39-38
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

x/farming/types/genesis_test.go

+11-10
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ package types_test
33
import (
44
"testing"
55

6-
sdk "github.com/cosmos/cosmos-sdk/types"
76
"github.com/stretchr/testify/require"
7+
88
"github.com/tendermint/farming/x/farming/types"
99
)
1010

@@ -15,21 +15,22 @@ func TestValidateGenesis(t *testing.T) {
1515
expectedErr string
1616
}{
1717
{
18-
"happy case",
18+
"default case",
1919
func(genState *types.GenesisState) {
2020
params := types.DefaultParams()
21-
params.PrivatePlanCreationFee = sdk.NewCoins(sdk.NewCoin("uatom", sdk.NewInt(100)))
2221
genState.Params = params
2322
},
2423
"",
2524
},
26-
// {
27-
// "invalid case",
28-
// func(genState *types.GenesisState) {
29-
// genState.PoolRecords = []types.PoolRecord{{}}
30-
// },
31-
// "bad msg index of the batch",
32-
// },
25+
{
26+
"invalid EpochDays case",
27+
func(genState *types.GenesisState) {
28+
params := types.DefaultParams()
29+
params.EpochDays = 0
30+
genState.Params = params
31+
},
32+
"epoch days must be positive: 0",
33+
},
3334
}
3435
for _, tc := range testCases {
3536
t.Run(tc.name, func(t *testing.T) {

x/farming/types/params.go

+1-9
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,6 @@ func validatePrivatePlanCreationFee(i interface{}) error {
8686
return err
8787
}
8888

89-
if v.Empty() {
90-
return fmt.Errorf("private plan creation fee must not be empty")
91-
}
92-
9389
return nil
9490
}
9591

@@ -103,10 +99,6 @@ func validateStakingCreationFee(i interface{}) error {
10399
return err
104100
}
105101

106-
if v.Empty() {
107-
return fmt.Errorf("staking creation fee must not be empty")
108-
}
109-
110102
return nil
111103
}
112104

@@ -116,7 +108,7 @@ func validateEpochDays(i interface{}) error {
116108
return fmt.Errorf("invalid parameter type: %T", i)
117109
}
118110

119-
if v == 0 {
111+
if v <= 0 {
120112
return fmt.Errorf("epoch days must be positive: %d", v)
121113
}
122114

x/farming/types/params_test.go

+11-6
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ farming_fee_collector: cosmos1h292smhhttwy0rl3qr4p6xsvpvxc4v05s6rxtczwq3cs6qc462
2929
require.Equal(t, paramsStr, defaultParams.String())
3030
}
3131

32-
func TestParams_Validate(t *testing.T) {
32+
func TestParamsValidate(t *testing.T) {
3333
require.NoError(t, types.DefaultParams().Validate())
3434

3535
testCases := []struct {
@@ -42,14 +42,14 @@ func TestParams_Validate(t *testing.T) {
4242
func(params *types.Params) {
4343
params.PrivatePlanCreationFee = sdk.NewCoins()
4444
},
45-
"private plan creation fee must not be empty",
45+
"",
4646
},
4747
{
4848
"EmptyStakingCreationFee",
4949
func(params *types.Params) {
50-
params.StakingCreationFee = sdk.NewCoins()
50+
params.StakingCreationFee = nil
5151
},
52-
"staking creation fee must not be empty",
52+
"",
5353
},
5454
{
5555
"NegativeEpochDays",
@@ -72,7 +72,6 @@ func TestParams_Validate(t *testing.T) {
7272
params := types.DefaultParams()
7373
tc.configure(&params)
7474
err := params.Validate()
75-
require.EqualError(t, err, tc.expectedErr)
7675

7776
var err2 error
7877
for _, p := range params.ParamSetPairs() {
@@ -82,7 +81,13 @@ func TestParams_Validate(t *testing.T) {
8281
break
8382
}
8483
}
85-
require.EqualError(t, err2, tc.expectedErr)
84+
if tc.expectedErr != "" {
85+
require.EqualError(t, err, tc.expectedErr)
86+
require.EqualError(t, err2, tc.expectedErr)
87+
} else {
88+
require.Nil(t, err)
89+
require.Nil(t, err2)
90+
}
8691
})
8792
}
8893
}

x/farming/types/plan.go

+1-5
Original file line numberDiff line numberDiff line change
@@ -292,11 +292,7 @@ func ValidateRatioPlans(i interface{}) error {
292292

293293
// PackPlan converts PlanI to Any
294294
func PackPlan(plan PlanI) (*codectypes.Any, error) {
295-
msg, ok := plan.(proto.Message)
296-
if !ok {
297-
return nil, fmt.Errorf("cannot proto marshal %T", plan)
298-
}
299-
any, err := codectypes.NewAnyWithValue(msg)
295+
any, err := codectypes.NewAnyWithValue(plan)
300296
if err != nil {
301297
return nil, err
302298
}

0 commit comments

Comments
 (0)