github.com/Finschia/finschia-sdk@v0.49.1/x/gov/genesis_test.go (about) 1 package gov_test 2 3 import ( 4 "encoding/json" 5 "testing" 6 7 ocabci "github.com/Finschia/ostracon/abci/types" 8 "github.com/Finschia/ostracon/libs/log" 9 "github.com/stretchr/testify/require" 10 abci "github.com/tendermint/tendermint/abci/types" 11 tmproto "github.com/tendermint/tendermint/proto/tendermint/types" 12 dbm "github.com/tendermint/tm-db" 13 14 "github.com/Finschia/finschia-sdk/simapp" 15 sdk "github.com/Finschia/finschia-sdk/types" 16 "github.com/Finschia/finschia-sdk/x/auth" 17 authtypes "github.com/Finschia/finschia-sdk/x/auth/types" 18 banktypes "github.com/Finschia/finschia-sdk/x/bank/types" 19 "github.com/Finschia/finschia-sdk/x/gov" 20 "github.com/Finschia/finschia-sdk/x/gov/types" 21 ) 22 23 func TestImportExportQueues(t *testing.T) { 24 app := simapp.Setup(false) 25 ctx := app.BaseApp.NewContext(false, tmproto.Header{}) 26 addrs := simapp.AddTestAddrs(app, ctx, 2, valTokens) 27 28 SortAddresses(addrs) 29 30 header := tmproto.Header{Height: app.LastBlockHeight() + 1} 31 app.BeginBlock(ocabci.RequestBeginBlock{Header: header}) 32 33 ctx = app.BaseApp.NewContext(false, tmproto.Header{}) 34 35 // Create two proposals, put the second into the voting period 36 proposal := TestProposal 37 proposal1, err := app.GovKeeper.SubmitProposal(ctx, proposal) 38 require.NoError(t, err) 39 proposalID1 := proposal1.ProposalId 40 41 proposal2, err := app.GovKeeper.SubmitProposal(ctx, proposal) 42 require.NoError(t, err) 43 proposalID2 := proposal2.ProposalId 44 45 votingStarted, err := app.GovKeeper.AddDeposit(ctx, proposalID2, addrs[0], app.GovKeeper.GetDepositParams(ctx).MinDeposit) 46 require.NoError(t, err) 47 require.True(t, votingStarted) 48 49 proposal1, ok := app.GovKeeper.GetProposal(ctx, proposalID1) 50 require.True(t, ok) 51 proposal2, ok = app.GovKeeper.GetProposal(ctx, proposalID2) 52 require.True(t, ok) 53 require.True(t, proposal1.Status == types.StatusDepositPeriod) 54 require.True(t, proposal2.Status == types.StatusVotingPeriod) 55 56 authGenState := auth.ExportGenesis(ctx, app.AccountKeeper) 57 bankGenState := app.BankKeeper.ExportGenesis(ctx) 58 59 // export the state and import it into a new app 60 govGenState := gov.ExportGenesis(ctx, app.GovKeeper) 61 genesisState := simapp.NewDefaultGenesisState(app.AppCodec()) 62 63 genesisState[authtypes.ModuleName] = app.AppCodec().MustMarshalJSON(authGenState) 64 genesisState[banktypes.ModuleName] = app.AppCodec().MustMarshalJSON(bankGenState) 65 genesisState[types.ModuleName] = app.AppCodec().MustMarshalJSON(govGenState) 66 67 stateBytes, err := json.MarshalIndent(genesisState, "", " ") 68 if err != nil { 69 panic(err) 70 } 71 72 db := dbm.NewMemDB() 73 app2 := simapp.NewSimApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, simapp.DefaultNodeHome, 0, simapp.MakeTestEncodingConfig(), simapp.EmptyAppOptions{}) 74 75 app2.InitChain( 76 abci.RequestInitChain{ 77 Validators: []abci.ValidatorUpdate{}, 78 ConsensusParams: simapp.DefaultConsensusParams, 79 AppStateBytes: stateBytes, 80 }, 81 ) 82 83 app2.Commit() 84 app2.BeginBlock(ocabci.RequestBeginBlock{Header: tmproto.Header{Height: app2.LastBlockHeight() + 1}}) 85 86 header = tmproto.Header{Height: app2.LastBlockHeight() + 1} 87 app2.BeginBlock(ocabci.RequestBeginBlock{Header: header}) 88 89 ctx2 := app2.BaseApp.NewContext(false, tmproto.Header{}) 90 91 // Jump the time forward past the DepositPeriod and VotingPeriod 92 ctx2 = ctx2.WithBlockTime(ctx2.BlockHeader().Time.Add(app2.GovKeeper.GetDepositParams(ctx2).MaxDepositPeriod).Add(app2.GovKeeper.GetVotingParams(ctx2).VotingPeriod)) 93 94 // Make sure that they are still in the DepositPeriod and VotingPeriod respectively 95 proposal1, ok = app2.GovKeeper.GetProposal(ctx2, proposalID1) 96 require.True(t, ok) 97 proposal2, ok = app2.GovKeeper.GetProposal(ctx2, proposalID2) 98 require.True(t, ok) 99 require.True(t, proposal1.Status == types.StatusDepositPeriod) 100 require.True(t, proposal2.Status == types.StatusVotingPeriod) 101 102 macc := app2.GovKeeper.GetGovernanceAccount(ctx2) 103 require.Equal(t, app2.GovKeeper.GetDepositParams(ctx2).MinDeposit, app2.BankKeeper.GetAllBalances(ctx2, macc.GetAddress())) 104 105 // Run the endblocker. Check to make sure that proposal1 is removed from state, and proposal2 is finished VotingPeriod. 106 gov.EndBlocker(ctx2, app2.GovKeeper) 107 108 _, ok = app2.GovKeeper.GetProposal(ctx2, proposalID1) 109 require.False(t, ok) 110 111 proposal2, ok = app2.GovKeeper.GetProposal(ctx2, proposalID2) 112 require.True(t, ok) 113 require.True(t, proposal2.Status == types.StatusRejected) 114 } 115 116 func TestImportExportQueues_ErrorUnconsistentState(t *testing.T) { 117 app := simapp.Setup(false) 118 ctx := app.BaseApp.NewContext(false, tmproto.Header{}) 119 require.Panics(t, func() { 120 gov.InitGenesis(ctx, app.AccountKeeper, app.BankKeeper, app.GovKeeper, &types.GenesisState{ 121 Deposits: types.Deposits{ 122 { 123 ProposalId: 1234, 124 Depositor: "me", 125 Amount: sdk.Coins{ 126 sdk.NewCoin( 127 "stake", 128 sdk.NewInt(1234), 129 ), 130 }, 131 }, 132 }, 133 }) 134 }) 135 } 136 137 func TestEqualProposals(t *testing.T) { 138 app := simapp.Setup(false) 139 ctx := app.BaseApp.NewContext(false, tmproto.Header{}) 140 addrs := simapp.AddTestAddrs(app, ctx, 2, valTokens) 141 142 SortAddresses(addrs) 143 144 header := tmproto.Header{Height: app.LastBlockHeight() + 1} 145 app.BeginBlock(ocabci.RequestBeginBlock{Header: header}) 146 147 // Submit two proposals 148 proposal := TestProposal 149 proposal1, err := app.GovKeeper.SubmitProposal(ctx, proposal) 150 require.NoError(t, err) 151 152 proposal2, err := app.GovKeeper.SubmitProposal(ctx, proposal) 153 require.NoError(t, err) 154 155 // They are similar but their IDs should be different 156 require.NotEqual(t, proposal1, proposal2) 157 require.NotEqual(t, proposal1, proposal2) 158 159 // Now create two genesis blocks 160 state1 := types.GenesisState{Proposals: []types.Proposal{proposal1}} 161 state2 := types.GenesisState{Proposals: []types.Proposal{proposal2}} 162 require.NotEqual(t, state1, state2) 163 require.False(t, state1.Equal(state2)) 164 165 // Now make proposals identical by setting both IDs to 55 166 proposal1.ProposalId = 55 167 proposal2.ProposalId = 55 168 require.Equal(t, proposal1, proposal1) 169 require.Equal(t, proposal1, proposal2) 170 171 // Reassign proposals into state 172 state1.Proposals[0] = proposal1 173 state2.Proposals[0] = proposal2 174 175 // State should be identical now.. 176 require.Equal(t, state1, state2) 177 require.True(t, state1.Equal(state2)) 178 }