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