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  }