github.com/cosmos/cosmos-sdk@v0.50.10/x/gov/migrations/v4/store_test.go (about) 1 package v4_test 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/stretchr/testify/require" 8 9 "cosmossdk.io/math" 10 storetypes "cosmossdk.io/store/types" 11 12 "github.com/cosmos/cosmos-sdk/runtime" 13 "github.com/cosmos/cosmos-sdk/testutil" 14 "github.com/cosmos/cosmos-sdk/testutil/testdata" 15 sdk "github.com/cosmos/cosmos-sdk/types" 16 moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil" 17 authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" 18 "github.com/cosmos/cosmos-sdk/x/bank" 19 banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" 20 "github.com/cosmos/cosmos-sdk/x/gov" 21 v1gov "github.com/cosmos/cosmos-sdk/x/gov/migrations/v1" 22 v4 "github.com/cosmos/cosmos-sdk/x/gov/migrations/v4" 23 "github.com/cosmos/cosmos-sdk/x/gov/types" 24 v1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" 25 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" 26 ) 27 28 var ( 29 _, _, addr = testdata.KeyTestPubAddr() 30 govAcct = authtypes.NewModuleAddress(types.ModuleName) 31 TestProposal = getTestProposal() 32 ) 33 34 type mockSubspace struct { 35 dp v1.DepositParams 36 vp v1.VotingParams 37 tp v1.TallyParams 38 } 39 40 func newMockSubspace(p v1.Params) mockSubspace { 41 return mockSubspace{ 42 dp: v1.DepositParams{ 43 MinDeposit: p.MinDeposit, 44 MaxDepositPeriod: p.MaxDepositPeriod, 45 }, 46 vp: v1.VotingParams{ 47 VotingPeriod: p.VotingPeriod, 48 }, 49 tp: v1.TallyParams{ 50 Quorum: p.Quorum, 51 Threshold: p.Threshold, 52 VetoThreshold: p.VetoThreshold, 53 }, 54 } 55 } 56 57 func (ms mockSubspace) Get(ctx sdk.Context, key []byte, ptr interface{}) { 58 switch string(key) { 59 case string(v1.ParamStoreKeyDepositParams): 60 *ptr.(*v1.DepositParams) = ms.dp 61 case string(v1.ParamStoreKeyVotingParams): 62 *ptr.(*v1.VotingParams) = ms.vp 63 case string(v1.ParamStoreKeyTallyParams): 64 *ptr.(*v1.TallyParams) = ms.tp 65 } 66 } 67 68 func TestMigrateStore(t *testing.T) { 69 cdc := moduletestutil.MakeTestEncodingConfig(gov.AppModuleBasic{}, bank.AppModuleBasic{}).Codec 70 govKey := storetypes.NewKVStoreKey("gov") 71 ctx := testutil.DefaultContext(govKey, storetypes.NewTransientStoreKey("transient_test")) 72 store := ctx.KVStore(govKey) 73 74 legacySubspace := newMockSubspace(v1.DefaultParams()) 75 76 propTime := time.Unix(1e9, 0) 77 78 // Create 2 proposals 79 prop1Content, err := v1.NewLegacyContent(v1beta1.NewTextProposal("Test", "description"), authtypes.NewModuleAddress("gov").String()) 80 require.NoError(t, err) 81 proposal1, err := v1.NewProposal([]sdk.Msg{prop1Content}, 1, propTime, propTime, "some metadata for the legacy content", "Test", "description", sdk.AccAddress("cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r"), false) 82 require.NoError(t, err) 83 prop1Bz, err := cdc.Marshal(&proposal1) 84 require.NoError(t, err) 85 store.Set(v1gov.ProposalKey(proposal1.Id), prop1Bz) 86 87 proposal2, err := v1.NewProposal(getTestProposal(), 2, propTime, propTime, "some metadata for the legacy content", "Test", "description", sdk.AccAddress("cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r"), false) 88 proposal2.Status = v1.StatusVotingPeriod 89 require.NoError(t, err) 90 prop2Bz, err := cdc.Marshal(&proposal2) 91 require.NoError(t, err) 92 store.Set(v1gov.ProposalKey(proposal2.Id), prop2Bz) 93 94 // Run migrations. 95 storeService := runtime.NewKVStoreService(govKey) 96 err = v4.MigrateStore(ctx, storeService, legacySubspace, cdc) 97 require.NoError(t, err) 98 99 // Check params 100 var params v1.Params 101 bz := store.Get(v4.ParamsKey) 102 require.NoError(t, cdc.Unmarshal(bz, ¶ms)) 103 require.NotNil(t, params) 104 require.Equal(t, legacySubspace.dp.MinDeposit, params.MinDeposit) 105 require.Equal(t, legacySubspace.dp.MaxDepositPeriod, params.MaxDepositPeriod) 106 require.Equal(t, legacySubspace.vp.VotingPeriod, params.VotingPeriod) 107 require.Equal(t, legacySubspace.tp.Quorum, params.Quorum) 108 require.Equal(t, legacySubspace.tp.Threshold, params.Threshold) 109 require.Equal(t, legacySubspace.tp.VetoThreshold, params.VetoThreshold) 110 require.Equal(t, math.LegacyZeroDec().String(), params.MinInitialDepositRatio) 111 112 // Check proposals' status 113 var migratedProp1 v1.Proposal 114 bz = store.Get(v1gov.ProposalKey(proposal1.Id)) 115 require.NoError(t, cdc.Unmarshal(bz, &migratedProp1)) 116 require.Equal(t, v1.StatusDepositPeriod, migratedProp1.Status) 117 118 var migratedProp2 v1.Proposal 119 bz = store.Get(v1gov.ProposalKey(proposal2.Id)) 120 require.NoError(t, cdc.Unmarshal(bz, &migratedProp2)) 121 require.Equal(t, v1.StatusVotingPeriod, migratedProp2.Status) 122 123 // Check if proposal 2 is in the new store but not proposal 1 124 require.Nil(t, store.Get(v4.VotingPeriodProposalKey(proposal1.Id))) 125 require.Equal(t, []byte{0x1}, store.Get(v4.VotingPeriodProposalKey(proposal2.Id))) 126 } 127 128 func getTestProposal() []sdk.Msg { 129 legacyProposalMsg, err := v1.NewLegacyContent(v1beta1.NewTextProposal("Title", "description"), authtypes.NewModuleAddress(types.ModuleName).String()) 130 if err != nil { 131 panic(err) 132 } 133 134 return []sdk.Msg{ 135 banktypes.NewMsgSend(govAcct, addr, sdk.NewCoins(sdk.NewCoin("stake", math.NewInt(1000)))), 136 legacyProposalMsg, 137 } 138 }