github.com/cosmos/cosmos-sdk@v0.50.10/x/gov/migrations/v2/store_test.go (about) 1 package v2_test 2 3 import ( 4 "bytes" 5 "testing" 6 "time" 7 8 "github.com/stretchr/testify/require" 9 10 "cosmossdk.io/math" 11 storetypes "cosmossdk.io/store/types" 12 13 "github.com/cosmos/cosmos-sdk/runtime" 14 "github.com/cosmos/cosmos-sdk/testutil" 15 "github.com/cosmos/cosmos-sdk/testutil/testdata" 16 sdk "github.com/cosmos/cosmos-sdk/types" 17 "github.com/cosmos/cosmos-sdk/types/address" 18 moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil" 19 v1 "github.com/cosmos/cosmos-sdk/x/gov/migrations/v1" 20 v2 "github.com/cosmos/cosmos-sdk/x/gov/migrations/v2" 21 "github.com/cosmos/cosmos-sdk/x/gov/types" 22 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" 23 ) 24 25 func TestMigrateStore(t *testing.T) { 26 cdc := moduletestutil.MakeTestEncodingConfig().Codec 27 govKey := storetypes.NewKVStoreKey("gov") 28 ctx := testutil.DefaultContext(govKey, storetypes.NewTransientStoreKey("transient_test")) 29 store := ctx.KVStore(govKey) 30 31 _, _, addr1 := testdata.KeyTestPubAddr() 32 proposalID := uint64(6) 33 now := time.Now() 34 // Use dummy value for keys where we don't test values. 35 dummyValue := []byte("foo") 36 // Use real values for votes, as we're testing weighted votes. 37 oldVote := v1beta1.Vote{ProposalId: 1, Voter: "foobar", Option: v1beta1.OptionNoWithVeto} 38 oldVoteValue := cdc.MustMarshal(&oldVote) 39 newVote := v1beta1.Vote{ProposalId: 1, Voter: "foobar", Options: v1beta1.WeightedVoteOptions{{Option: v1beta1.OptionNoWithVeto, Weight: math.LegacyNewDec(1)}}} 40 newVoteValue := cdc.MustMarshal(&newVote) 41 42 testCases := []struct { 43 name string 44 oldKey, oldValue, newKey, newValue []byte 45 }{ 46 { 47 "ProposalKey", 48 v1.ProposalKey(proposalID), dummyValue, 49 append(types.ProposalsKeyPrefix, sdk.Uint64ToBigEndian(proposalID)...), dummyValue, 50 }, 51 { 52 "ActiveProposalQueue", 53 v1.ActiveProposalQueueKey(proposalID, now), dummyValue, 54 activeProposalQueueKey(proposalID, now), dummyValue, 55 }, 56 { 57 "InactiveProposalQueue", 58 v1.InactiveProposalQueueKey(proposalID, now), dummyValue, 59 inactiveProposalQueueKey(proposalID, now), dummyValue, 60 }, 61 { 62 "ProposalIDKey", 63 v1.ProposalIDKey, dummyValue, 64 types.ProposalIDKey, dummyValue, 65 }, 66 { 67 "DepositKey", 68 v1.DepositKey(proposalID, addr1), dummyValue, 69 depositKey(proposalID, addr1), dummyValue, 70 }, 71 { 72 "VotesKeyPrefix", 73 v1.VoteKey(proposalID, addr1), oldVoteValue, 74 voteKey(proposalID, addr1), newVoteValue, 75 }, 76 } 77 78 // Set all the old keys to the store 79 for _, tc := range testCases { 80 store.Set(tc.oldKey, tc.oldValue) 81 } 82 83 // Run migratio 84 storeService := runtime.NewKVStoreService(govKey) 85 err := v2.MigrateStore(ctx, storeService, cdc) 86 require.NoError(t, err) 87 88 // Make sure the new keys are set and old keys are deleted. 89 for _, tc := range testCases { 90 tc := tc 91 t.Run(tc.name, func(t *testing.T) { 92 if !bytes.Equal(tc.oldKey, tc.newKey) { 93 require.Nil(t, store.Get(tc.oldKey)) 94 } 95 require.Equal(t, tc.newValue, store.Get(tc.newKey)) 96 }) 97 } 98 } 99 100 // TODO(tip): remove all the functions below once we delete the migrations 101 102 func depositKey(proposalID uint64, depositorAddr sdk.AccAddress) []byte { 103 return append(append(types.DepositsKeyPrefix, sdk.Uint64ToBigEndian(proposalID)...), address.MustLengthPrefix(depositorAddr.Bytes())...) 104 } 105 106 func voteKey(proposalID uint64, addr sdk.AccAddress) []byte { 107 return append(append(types.VotesKeyPrefix, sdk.Uint64ToBigEndian(proposalID)...), address.MustLengthPrefix(addr.Bytes())...) 108 } 109 110 func activeProposalQueueKey(proposalID uint64, endTime time.Time) []byte { 111 return append(append(types.ActiveProposalQueuePrefix, sdk.FormatTimeBytes(endTime)...), sdk.Uint64ToBigEndian(proposalID)...) 112 } 113 114 // InactiveProposalQueueKey returns the key for a proposalID in the inactiveProposalQueue 115 func inactiveProposalQueueKey(proposalID uint64, endTime time.Time) []byte { 116 return append(append(types.InactiveProposalQueuePrefix, sdk.FormatTimeBytes(endTime)...), sdk.Uint64ToBigEndian(proposalID)...) 117 }