From 8a34b91facbe8dd113163d4c92dfa66ae4caa9a9 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Sat, 7 Apr 2018 01:50:46 -0400 Subject: [PATCH] fix existing gaia tests --- cmd/gaia/app/account.go | 32 ------------------------ cmd/gaia/app/app.go | 53 ++++++++++++++++++++++++++++++++++------ cmd/gaia/app/app_test.go | 38 +++++++++++++++------------- x/stake/handler.go | 16 +++++++++++- x/stake/handler_test.go | 9 +++++++ x/stake/keeper.go | 12 --------- x/stake/keeper_test.go | 29 ---------------------- x/stake/test_common.go | 25 +++++++++++++++++++ x/stake/types.go | 24 +++++++++--------- 9 files changed, 127 insertions(+), 111 deletions(-) delete mode 100644 cmd/gaia/app/account.go diff --git a/cmd/gaia/app/account.go b/cmd/gaia/app/account.go deleted file mode 100644 index 3d5673b87..000000000 --- a/cmd/gaia/app/account.go +++ /dev/null @@ -1,32 +0,0 @@ -package app - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/auth" -) - -// State to Unmarshal -type GenesisState struct { - Accounts []GenesisAccount `json:"accounts"` -} - -// GenesisAccount doesn't need pubkey or sequence -type GenesisAccount struct { - Address sdk.Address `json:"address"` - Coins sdk.Coins `json:"coins"` -} - -func NewGenesisAccount(acc auth.BaseAccount) GenesisAccount { - return GenesisAccount{ - Address: acc.Address, - Coins: acc.Coins, - } -} - -// convert GenesisAccount to GaiaAccount -func (ga *GenesisAccount) ToAccount() (acc auth.BaseAccount) { - return auth.BaseAccount{ - Address: ga.Address, - Coins: ga.Coins.Sort(), - } -} diff --git a/cmd/gaia/app/app.go b/cmd/gaia/app/app.go index 64b1619f8..6cf67b0f2 100644 --- a/cmd/gaia/app/app.go +++ b/cmd/gaia/app/app.go @@ -35,6 +35,9 @@ type GaiaApp struct { // Manage getting and setting accounts accountMapper sdk.AccountMapper + coinKeeper bank.CoinKeeper + ibcMapper ibc.IBCMapper + stakeKeeper stake.Keeper } func NewGaiaApp(logger log.Logger, dbs map[string]dbm.DB) *GaiaApp { @@ -55,18 +58,18 @@ func NewGaiaApp(logger log.Logger, dbs map[string]dbm.DB) *GaiaApp { ) // add handlers - coinKeeper := bank.NewCoinKeeper(app.accountMapper) - ibcMapper := ibc.NewIBCMapper(app.cdc, app.capKeyIBCStore) - stakeKeeper := stake.NewKeeper(app.cdc, app.capKeyStakeStore, coinKeeper) + app.coinKeeper = bank.NewCoinKeeper(app.accountMapper) + app.ibcMapper = ibc.NewIBCMapper(app.cdc, app.capKeyIBCStore) + app.stakeKeeper = stake.NewKeeper(app.cdc, app.capKeyStakeStore, app.coinKeeper) app.Router(). - AddRoute("bank", bank.NewHandler(coinKeeper)). - AddRoute("ibc", ibc.NewHandler(ibcMapper, coinKeeper)). - AddRoute("stake", stake.NewHandler(stakeKeeper)) + AddRoute("bank", bank.NewHandler(app.coinKeeper)). + AddRoute("ibc", ibc.NewHandler(app.ibcMapper, app.coinKeeper)). + AddRoute("stake", stake.NewHandler(app.stakeKeeper)) // initialize BaseApp app.SetTxDecoder(app.txDecoder) app.SetInitChainer(app.initChainer) - app.SetEndBlocker(stake.NewEndBlocker(stakeKeeper)) + app.SetEndBlocker(stake.NewEndBlocker(app.stakeKeeper)) app.MountStoreWithDB(app.capKeyMainStore, sdk.StoreTypeIAVL, dbs["main"]) app.MountStoreWithDB(app.capKeyAccountStore, sdk.StoreTypeIAVL, dbs["acc"]) app.MountStoreWithDB(app.capKeyIBCStore, sdk.StoreTypeIAVL, dbs["ibc"]) @@ -150,9 +153,43 @@ func (app *GaiaApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) abci // return sdk.ErrGenesisParse("").TraceCause(err, "") } + // load the accounts for _, gacc := range genesisState.Accounts { acc := gacc.ToAccount() - app.accountMapper.SetAccount(ctx, &acc) + app.accountMapper.SetAccount(ctx, acc) } + + // load the initial stake information + stake.InitGenesis(ctx, app.stakeKeeper, genesisState.StakeData) + return abci.ResponseInitChain{} } + +//__________________________________________________________ + +// State to Unmarshal +type GenesisState struct { + Accounts []GenesisAccount `json:"accounts"` + StakeData json.RawMessage `json:"stake"` +} + +// GenesisAccount doesn't need pubkey or sequence +type GenesisAccount struct { + Address sdk.Address `json:"address"` + Coins sdk.Coins `json:"coins"` +} + +func NewGenesisAccount(acc *auth.BaseAccount) GenesisAccount { + return GenesisAccount{ + Address: acc.Address, + Coins: acc.Coins, + } +} + +// convert GenesisAccount to GaiaAccount +func (ga *GenesisAccount) ToAccount() (acc *auth.BaseAccount) { + return &auth.BaseAccount{ + Address: ga.Address, + Coins: ga.Coins.Sort(), + } +} diff --git a/cmd/gaia/app/app_test.go b/cmd/gaia/app/app_test.go index a440e7e38..a9cc4b739 100644 --- a/cmd/gaia/app/app_test.go +++ b/cmd/gaia/app/app_test.go @@ -13,6 +13,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/bank" "github.com/cosmos/cosmos-sdk/x/ibc" + "github.com/cosmos/cosmos-sdk/x/stake" abci "github.com/tendermint/abci/types" crypto "github.com/tendermint/go-crypto" @@ -100,14 +101,15 @@ func newGaiaApp() *GaiaApp { return NewGaiaApp(logger, dbs) } -func setGenesisAccounts(gapp *GaiaApp, accs ...auth.BaseAccount) error { +func setGenesis(gapp *GaiaApp, accs ...*auth.BaseAccount) error { genaccs := make([]GenesisAccount, len(accs)) for i, acc := range accs { genaccs[i] = NewGenesisAccount(acc) } genesisState := GenesisState{ - Accounts: genaccs, + Accounts: genaccs, + StakeData: stake.GetGenesisJSON(), } stateBytes, err := json.MarshalIndent(genesisState, "", "\t") @@ -127,6 +129,7 @@ func setGenesisAccounts(gapp *GaiaApp, accs ...auth.BaseAccount) error { func TestMsgs(t *testing.T) { gapp := newGaiaApp() + assert.Nil(t, setGenesis(gapp)) msgs := []struct { msg sdk.Msg @@ -180,6 +183,7 @@ func TestSortGenesis(t *testing.T) { require.Nil(t, err) // Ensure we can send + assert.Nil(t, setGenesis(gapp)) // initialize the pool SignCheckDeliver(t, gapp, sendMsg5, []int64{0}, true, priv1) } @@ -192,12 +196,12 @@ func TestGenesis(t *testing.T) { addr := pk.Address() coins, err := sdk.ParseCoins("77foocoin,99barcoin") require.Nil(t, err) - baseAcc := auth.BaseAccount{ + baseAcc := &auth.BaseAccount{ Address: addr, Coins: coins, } - err = setGenesisAccounts(gapp, baseAcc) + err = setGenesis(gapp, baseAcc) assert.Nil(t, err) // A checkTx context @@ -219,13 +223,13 @@ func TestSendMsgWithAccounts(t *testing.T) { // Give 77 foocoin to the first key coins, err := sdk.ParseCoins("77foocoin") require.Nil(t, err) - baseAcc := auth.BaseAccount{ + baseAcc := &auth.BaseAccount{ Address: addr1, Coins: coins, } // Construct genesis state - err = setGenesisAccounts(gapp, baseAcc) + err = setGenesis(gapp, baseAcc) assert.Nil(t, err) // A checkTx context (true) ctxCheck := gapp.BaseApp.NewContext(true, abci.Header{}) @@ -259,17 +263,17 @@ func TestSendMsgMultipleOut(t *testing.T) { genCoins, err := sdk.ParseCoins("42foocoin") require.Nil(t, err) - acc1 := auth.BaseAccount{ + acc1 := &auth.BaseAccount{ Address: addr1, Coins: genCoins, } - acc2 := auth.BaseAccount{ + acc2 := &auth.BaseAccount{ Address: addr2, Coins: genCoins, } - err = setGenesisAccounts(gapp, acc1, acc2) + err = setGenesis(gapp, acc1, acc2) assert.Nil(t, err) // Simulate a Block @@ -287,22 +291,22 @@ func TestSengMsgMultipleInOut(t *testing.T) { genCoins, err := sdk.ParseCoins("42foocoin") require.Nil(t, err) - acc1 := auth.BaseAccount{ + acc1 := &auth.BaseAccount{ Address: addr1, Coins: genCoins, } - acc2 := auth.BaseAccount{ + acc2 := &auth.BaseAccount{ Address: addr2, Coins: genCoins, } - acc4 := auth.BaseAccount{ + acc4 := &auth.BaseAccount{ Address: addr4, Coins: genCoins, } - err = setGenesisAccounts(gapp, acc1, acc2, acc4) + err = setGenesis(gapp, acc1, acc2, acc4) assert.Nil(t, err) // CheckDeliver @@ -321,12 +325,12 @@ func TestSendMsgDependent(t *testing.T) { genCoins, err := sdk.ParseCoins("42foocoin") require.Nil(t, err) - acc1 := auth.BaseAccount{ + acc1 := &auth.BaseAccount{ Address: addr1, Coins: genCoins, } - err = setGenesisAccounts(gapp, acc1) + err = setGenesis(gapp, acc1) assert.Nil(t, err) // CheckDeliver @@ -349,12 +353,12 @@ func TestIBCMsgs(t *testing.T) { sourceChain := "source-chain" destChain := "dest-chain" - baseAcc := auth.BaseAccount{ + baseAcc := &auth.BaseAccount{ Address: addr1, Coins: coins, } - err := setGenesisAccounts(gapp, baseAcc) + err := setGenesis(gapp, baseAcc) assert.Nil(t, err) // A checkTx context (true) ctxCheck := gapp.BaseApp.NewContext(true, abci.Header{}) diff --git a/x/stake/handler.go b/x/stake/handler.go index af1ad291d..36b4509da 100644 --- a/x/stake/handler.go +++ b/x/stake/handler.go @@ -2,6 +2,7 @@ package stake import ( "bytes" + "encoding/json" sdk "github.com/cosmos/cosmos-sdk/types" abci "github.com/tendermint/abci/types" @@ -35,7 +36,7 @@ func NewHandler(k Keeper) sdk.Handler { } } -//_______________________________________________ +//_____________________________________________________________________ // NewEndBlocker generates sdk.EndBlocker // Performs tick functionality @@ -48,6 +49,19 @@ func NewEndBlocker(k Keeper) sdk.EndBlocker { //_____________________________________________________________________ +// InitGenesis - store genesis parameters +func InitGenesis(ctx sdk.Context, k Keeper, data json.RawMessage) error { + var state GenesisState + if err := json.Unmarshal(data, &state); err != nil { + return err + } + k.setPool(ctx, state.Pool) + k.setParams(ctx, state.Params) + return nil +} + +//_____________________________________________________________________ + // These functions assume everything has been authenticated, // now we just perform action and save diff --git a/x/stake/handler_test.go b/x/stake/handler_test.go index 1f0bc6415..82b33cf2c 100644 --- a/x/stake/handler_test.go +++ b/x/stake/handler_test.go @@ -12,6 +12,15 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ) +func TestInitGenesis(t *testing.T) { + ctx, _, keeper := createTestInput(t, false, 0) + encoded := GetGenesisJSON() + err := InitGenesis(ctx, keeper, encoded) + require.Nil(t, err) + require.Equal(t, keeper.GetPool(ctx), initialPool()) + require.Equal(t, keeper.GetParams(ctx), defaultParams()) +} + //______________________________________________________________________ func newTestMsgDeclareCandidacy(address sdk.Address, pubKey crypto.PubKey, amt int64) MsgDeclareCandidacy { diff --git a/x/stake/keeper.go b/x/stake/keeper.go index ae3dfb7c7..8b73e81db 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -2,7 +2,6 @@ package stake import ( "bytes" - "encoding/json" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" @@ -34,17 +33,6 @@ func NewKeeper(ctx sdk.Context, cdc *wire.Codec, key sdk.StoreKey, ck bank.CoinK return keeper } -// InitGenesis - store genesis parameters -func (k Keeper) InitGenesis(ctx sdk.Context, data json.RawMessage) error { - var state GenesisState - if err := json.Unmarshal(data, &state); err != nil { - return err - } - k.setPool(ctx, state.Pool) - k.setParams(ctx, state.Params) - return nil -} - //_________________________________________________________________________ // get a single candidate diff --git a/x/stake/keeper_test.go b/x/stake/keeper_test.go index 088bc5e30..e8d8e0594 100644 --- a/x/stake/keeper_test.go +++ b/x/stake/keeper_test.go @@ -2,7 +2,6 @@ package stake import ( "bytes" - "encoding/json" "testing" sdk "github.com/cosmos/cosmos-sdk/types" @@ -584,31 +583,3 @@ func TestPool(t *testing.T) { resPool = keeper.GetPool(ctx) assert.Equal(t, expPool, resPool) } - -func TestInitGenesis(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) - jsonStr := `{ - "params": { - "inflation_rate_change": {"num": 13, "denom": 100}, - "inflation_max": {"num": 20, "denom": 100}, - "inflation_min": {"num": 7, "denom": 100}, - "goal_bonded": {"num": 67, "denom": 100}, - "max_validators": 100, - "bond_denom": "fermion" - }, - "pool": { - "total_supply": 0, - "bonded_shares": {"num": 0, "denom": 1}, - "unbonded_shares": {"num": 0, "denom": 1}, - "bonded_pool": 0, - "unbonded_pool": 0, - "inflation_last_time": 0, - "inflation": {"num": 7, "denom": 100} - } -}` - encoded := json.RawMessage(jsonStr) - err := keeper.InitGenesis(ctx, encoded) - require.Nil(t, err) - require.Equal(t, keeper.GetPool(ctx), initialPool()) - require.Equal(t, keeper.GetParams(ctx), defaultParams()) -} diff --git a/x/stake/test_common.go b/x/stake/test_common.go index 6470abbc7..5b0bc97e0 100644 --- a/x/stake/test_common.go +++ b/x/stake/test_common.go @@ -2,6 +2,7 @@ package stake import ( "encoding/hex" + "encoding/json" "testing" "github.com/stretchr/testify/require" @@ -75,6 +76,30 @@ func initialPool() Pool { } } +// get raw genesis raw message for testing +func GetGenesisJSON() json.RawMessage { + jsonStr := `{ + "params": { + "inflation_rate_change": {"num": 13, "denom": 100}, + "inflation_max": {"num": 20, "denom": 100}, + "inflation_min": {"num": 7, "denom": 100}, + "goal_bonded": {"num": 67, "denom": 100}, + "max_validators": 100, + "bond_denom": "fermion" + }, + "pool": { + "total_supply": 0, + "bonded_shares": {"num": 0, "denom": 1}, + "unbonded_shares": {"num": 0, "denom": 1}, + "bonded_pool": 0, + "unbonded_pool": 0, + "inflation_last_time": 0, + "inflation": {"num": 7, "denom": 100} + } +}` + return json.RawMessage(jsonStr) +} + // XXX reference the common declaration of this function func subspace(prefix []byte) (start, end []byte) { end = make([]byte, len(prefix)) diff --git a/x/stake/types.go b/x/stake/types.go index 1154f7962..240f3fe2a 100644 --- a/x/stake/types.go +++ b/x/stake/types.go @@ -7,6 +7,14 @@ import ( crypto "github.com/tendermint/go-crypto" ) +// GenesisState - all staking state that must be provided at genesis +type GenesisState struct { + Pool Pool `json:"pool"` + Params Params `json:"params"` +} + +//_________________________________________________________________________ + // Params defines the high level settings for staking type Params struct { InflationRateChange sdk.Rat `json:"inflation_rate_change"` // maximum annual change in inflation rate @@ -31,13 +39,7 @@ type Pool struct { Inflation sdk.Rat `json:"inflation"` // current annual inflation rate } -// GenesisState - all staking state that must be provided at genesis -type GenesisState struct { - Pool Pool `json:"pool"` - Params Params `json:"params"` -} - -//_______________________________________________________________________________________________________ +//_________________________________________________________________________ // CandidateStatus - status of a validator-candidate type CandidateStatus byte @@ -65,6 +67,9 @@ type Candidate struct { Description Description `json:"description"` // Description terms for the candidate } +// Candidates - list of Candidates +type Candidates []Candidate + // NewCandidate - initialize a new candidate func NewCandidate(address sdk.Address, pubKey crypto.PubKey, description Description) Candidate { return Candidate{ @@ -151,11 +156,6 @@ func (v Validator) abciValidatorZero(cdc *wire.Codec) abci.Validator { //_________________________________________________________________________ -// Candidates - list of Candidates -type Candidates []Candidate - -//_________________________________________________________________________ - // DelegatorBond represents the bond with tokens held by an account. It is // owned by one delegator, and is associated with the voting power of one // pubKey.