Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor supply keeper tests to use simapp #4877

Merged
merged 15 commits into from
Aug 14, 2019
Merged
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ longer panics if the store to load contains substores that we didn't explicitly
* (modules) [\#4762](https://github.com/cosmos/cosmos-sdk/issues/4762) Deprecate remove and add permissions in ModuleAccount.
* (modules) [\#4760](https://github.com/cosmos/cosmos-sdk/issues/4760) update `x/auth` to match module spec.
* (modules) [\#4814](https://github.com/cosmos/cosmos-sdk/issues/4814) Add security contact to Validator description.
* (modules) [\#4875](https://github.com/cosmos/cosmos-sdk/issues/4875) refactor integration tests to use SimApp and separate test package
* (sdk) [\#4566](https://github.com/cosmos/cosmos-sdk/issues/4566) Export simulation's parameters and app state to JSON in order to reproduce bugs and invariants.
* (sdk) [\#4640](https://github.com/cosmos/cosmos-sdk/issues/4640) improve import/export simulation errors by extending `DiffKVStores` to return an array of `KVPairs` that are then compared to check for inconsistencies.
* (sdk) [\#4717](https://github.com/cosmos/cosmos-sdk/issues/4717) refactor `x/slashing` to match the new module spec
Expand Down
33 changes: 33 additions & 0 deletions simapp/helpers.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package simapp

import (
abci "github.com/tendermint/tendermint/abci/types"
"github.com/tendermint/tendermint/libs/log"
dbm "github.com/tendermint/tm-db"

"github.com/cosmos/cosmos-sdk/codec"
)

// Setup initializes a new SimApp. A Nop logger is set in SimApp.
func Setup(isCheckTx bool) *SimApp {
db := dbm.NewMemDB()
app := NewSimApp(log.NewNopLogger(), db, nil, true, 0)
if !isCheckTx {
// init chain must be called to stop deliverState from being nil
genesisState := NewDefaultGenesisState()
stateBytes, err := codec.MarshalJSONIndent(app.cdc, genesisState)
if err != nil {
panic(err)
}

// Initialize the chain
app.InitChain(
abci.RequestInitChain{
Validators: []abci.ValidatorUpdate{},
AppStateBytes: stateBytes,
},
)
}

return app
}
47 changes: 27 additions & 20 deletions x/supply/internal/keeper/bank_test.go
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
package keeper
package keeper_test

import (
"testing"

"github.com/stretchr/testify/require"

sdk "github.com/cosmos/cosmos-sdk/types"
keep "github.com/cosmos/cosmos-sdk/x/supply/internal/keeper"
"github.com/cosmos/cosmos-sdk/x/supply/internal/types"
)

const initialPower = int64(100)

// create module accounts for testing
var (
holderAcc = types.NewEmptyModuleAccount(holder)
burnerAcc = types.NewEmptyModuleAccount(types.Burner, types.Burner)
Expand All @@ -22,23 +24,25 @@ var (
initCoins = sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, initTokens))
)

func getCoinsByName(ctx sdk.Context, k Keeper, moduleName string) sdk.Coins {
moduleAddress := k.GetModuleAddress(moduleName)
macc := k.ak.GetAccount(ctx, moduleAddress)
func getCoinsByName(ctx sdk.Context, sk keep.Keeper, ak types.AccountKeeper, moduleName string) sdk.Coins {
moduleAddress := sk.GetModuleAddress(moduleName)
macc := ak.GetAccount(ctx, moduleAddress)
if macc == nil {
return sdk.Coins(nil)
}
return macc.GetCoins()
}

func TestSendCoins(t *testing.T) {
nAccs := int64(4)
ctx, ak, keeper := createTestInput(t, false, initialPower, nAccs)
app, ctx := createTestApp(false)
keeper := app.SupplyKeeper
ak := app.AccountKeeper

baseAcc := ak.NewAccountWithAddress(ctx, types.NewModuleAddress("baseAcc"))

err := holderAcc.SetCoins(initCoins)
require.NoError(t, err)
keeper.SetSupply(ctx, types.NewSupply(initCoins))

keeper.SetModuleAccount(ctx, holderAcc)
keeper.SetModuleAccount(ctx, burnerAcc)
Expand All @@ -59,24 +63,25 @@ func TestSendCoins(t *testing.T) {

err = keeper.SendCoinsFromModuleToModule(ctx, holderAcc.GetName(), types.Burner, initCoins)
require.NoError(t, err)
require.Equal(t, sdk.Coins(nil), getCoinsByName(ctx, keeper, holderAcc.GetName()))
require.Equal(t, initCoins, getCoinsByName(ctx, keeper, types.Burner))
require.Equal(t, sdk.Coins(nil), getCoinsByName(ctx, keeper, ak, holderAcc.GetName()))
require.Equal(t, initCoins, getCoinsByName(ctx, keeper, ak, types.Burner))

err = keeper.SendCoinsFromModuleToAccount(ctx, types.Burner, baseAcc.GetAddress(), initCoins)
require.NoError(t, err)
require.Equal(t, sdk.Coins(nil), getCoinsByName(ctx, keeper, types.Burner))
require.Equal(t, sdk.Coins(nil), getCoinsByName(ctx, keeper, ak, types.Burner))

require.Equal(t, initCoins, keeper.ak.GetAccount(ctx, baseAcc.GetAddress()).GetCoins())
require.Equal(t, initCoins, ak.GetAccount(ctx, baseAcc.GetAddress()).GetCoins())

err = keeper.SendCoinsFromAccountToModule(ctx, baseAcc.GetAddress(), types.Burner, initCoins)
require.NoError(t, err)
require.Equal(t, sdk.Coins(nil), keeper.ak.GetAccount(ctx, baseAcc.GetAddress()).GetCoins())
require.Equal(t, initCoins, getCoinsByName(ctx, keeper, types.Burner))
require.Equal(t, sdk.Coins(nil), ak.GetAccount(ctx, baseAcc.GetAddress()).GetCoins())
require.Equal(t, initCoins, getCoinsByName(ctx, keeper, ak, types.Burner))
}

func TestMintCoins(t *testing.T) {
nAccs := int64(4)
ctx, _, keeper := createTestInput(t, false, initialPower, nAccs)
app, ctx := createTestApp(false)
keeper := app.SupplyKeeper
ak := app.AccountKeeper

keeper.SetModuleAccount(ctx, burnerAcc)
keeper.SetModuleAccount(ctx, minterAcc)
Expand All @@ -93,25 +98,27 @@ func TestMintCoins(t *testing.T) {

err := keeper.MintCoins(ctx, types.Minter, initCoins)
require.NoError(t, err)
require.Equal(t, initCoins, getCoinsByName(ctx, keeper, types.Minter))
require.Equal(t, initCoins, getCoinsByName(ctx, keeper, ak, types.Minter))
require.Equal(t, initialSupply.GetTotal().Add(initCoins), keeper.GetSupply(ctx).GetTotal())

// test same functionality on module account with multiple permissions
initialSupply = keeper.GetSupply(ctx)

err = keeper.MintCoins(ctx, multiPermAcc.GetName(), initCoins)
require.NoError(t, err)
require.Equal(t, initCoins, getCoinsByName(ctx, keeper, multiPermAcc.GetName()))
require.Equal(t, initCoins, getCoinsByName(ctx, keeper, ak, multiPermAcc.GetName()))
require.Equal(t, initialSupply.GetTotal().Add(initCoins), keeper.GetSupply(ctx).GetTotal())

require.Panics(t, func() { keeper.MintCoins(ctx, types.Burner, initCoins) })
}

func TestBurnCoins(t *testing.T) {
nAccs := int64(4)
ctx, _, keeper := createTestInput(t, false, initialPower, nAccs)
app, ctx := createTestApp(false)
keeper := app.SupplyKeeper
ak := app.AccountKeeper

require.NoError(t, burnerAcc.SetCoins(initCoins))
keeper.SetSupply(ctx, types.NewSupply(initCoins))
keeper.SetModuleAccount(ctx, burnerAcc)

initialSupply := keeper.GetSupply(ctx)
Expand All @@ -125,7 +132,7 @@ func TestBurnCoins(t *testing.T) {

err := keeper.BurnCoins(ctx, types.Burner, initCoins)
require.NoError(t, err)
require.Equal(t, sdk.Coins(nil), getCoinsByName(ctx, keeper, types.Burner))
require.Equal(t, sdk.Coins(nil), getCoinsByName(ctx, keeper, ak, types.Burner))
require.Equal(t, initialSupply.GetTotal().Sub(initCoins), keeper.GetSupply(ctx).GetTotal())

// test same functionality on module account with multiple permissions
Expand All @@ -138,6 +145,6 @@ func TestBurnCoins(t *testing.T) {

err = keeper.BurnCoins(ctx, multiPermAcc.GetName(), initCoins)
require.NoError(t, err)
require.Equal(t, sdk.Coins(nil), getCoinsByName(ctx, keeper, multiPermAcc.GetName()))
require.Equal(t, sdk.Coins(nil), getCoinsByName(ctx, keeper, ak, multiPermAcc.GetName()))
require.Equal(t, initialSupply.GetTotal().Sub(initCoins), keeper.GetSupply(ctx).GetTotal())
}
111 changes: 0 additions & 111 deletions x/supply/internal/keeper/common_test.go

This file was deleted.

35 changes: 35 additions & 0 deletions x/supply/internal/keeper/integration_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package keeper_test

import (
abci "github.com/tendermint/tendermint/abci/types"

"github.com/cosmos/cosmos-sdk/simapp"
sdk "github.com/cosmos/cosmos-sdk/types"
keep "github.com/cosmos/cosmos-sdk/x/supply/internal/keeper"
"github.com/cosmos/cosmos-sdk/x/supply/internal/types"
)

var (
multiPerm = "multiple permissions account"
randomPerm = "random permission"
holder = "holder"
)

// nolint: deadcode unused
func createTestApp(isCheckTx bool) (*simapp.SimApp, sdk.Context) {
app := simapp.Setup(isCheckTx)

// add module accounts to supply keeper
maccPerms := simapp.GetMaccPerms()
maccPerms[holder] = nil
maccPerms[types.Burner] = []string{types.Burner}
maccPerms[types.Minter] = []string{types.Minter}
maccPerms[multiPerm] = []string{types.Burner, types.Minter, types.Staking}
maccPerms[randomPerm] = []string{"random"}

ctx := app.BaseApp.NewContext(isCheckTx, abci.Header{})
app.SupplyKeeper = keep.NewKeeper(app.Codec(), app.GetKey(types.StoreKey), app.AccountKeeper, app.BankKeeper, maccPerms)
app.SupplyKeeper.SetSupply(ctx, types.NewSupply(sdk.NewCoins()))

return app, ctx
}
22 changes: 10 additions & 12 deletions x/supply/internal/keeper/keeper_test.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package keeper
package keeper_test

import (
"testing"
Expand All @@ -12,29 +12,27 @@ import (
func TestSupply(t *testing.T) {
initialPower := int64(100)
initTokens := sdk.TokensFromConsensusPower(initialPower)
nAccs := int64(4)

ctx, _, keeper := createTestInput(t, false, initialPower, nAccs)
app, ctx := createTestApp(false)
totalSupply := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, initTokens))
app.SupplyKeeper.SetSupply(ctx, types.NewSupply(totalSupply))

total := keeper.GetSupply(ctx).GetTotal()
expectedTotal := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, initTokens.MulRaw(nAccs)))
total := app.SupplyKeeper.GetSupply(ctx).GetTotal()

require.Equal(t, expectedTotal, total)
require.Equal(t, totalSupply, total)
}

func TestValidatePermissions(t *testing.T) {
nAccs := int64(0)
initialPower := int64(100)
_, _, keeper := createTestInput(t, false, initialPower, nAccs)
app, _ := createTestApp(false)

err := keeper.ValidatePermissions(multiPermAcc)
err := app.SupplyKeeper.ValidatePermissions(multiPermAcc)
require.NoError(t, err)

err = keeper.ValidatePermissions(randomPermAcc)
err = app.SupplyKeeper.ValidatePermissions(randomPermAcc)
require.NoError(t, err)

// unregistered permissions
otherAcc := types.NewEmptyModuleAccount("other", "other")
err = keeper.ValidatePermissions(otherAcc)
err = app.SupplyKeeper.ValidatePermissions(otherAcc)
require.Error(t, err)
}
Loading