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  }