diff --git a/app/app.go b/app/app.go index c867d330dd5..69ccfe8eb06 100644 --- a/app/app.go +++ b/app/app.go @@ -6,8 +6,8 @@ import ( abci "github.com/tendermint/tendermint/abci/types" cmn "github.com/tendermint/tendermint/libs/common" - dbm "github.com/tendermint/tendermint/libs/db" "github.com/tendermint/tendermint/libs/log" + dbm "github.com/tendermint/tm-db" bam "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/codec" @@ -19,7 +19,6 @@ import ( "github.com/cosmos/cosmos-sdk/x/bank" "github.com/cosmos/cosmos-sdk/x/crisis" distr "github.com/cosmos/cosmos-sdk/x/distribution" - distrclient "github.com/cosmos/cosmos-sdk/x/distribution/client" "github.com/cosmos/cosmos-sdk/x/genaccounts" "github.com/cosmos/cosmos-sdk/x/genutil" "github.com/cosmos/cosmos-sdk/x/gov" @@ -40,23 +39,9 @@ var ( // default home directories for gaiad DefaultNodeHome = os.ExpandEnv("$HOME/.gaiad") - // The ModuleBasicManager is in charge of setting up basic, + // The module BasicManager is in charge of setting up basic, // non-dependant module elements, such as codec registration // and genesis verification. - ModuleBasics module.BasicManager - - // module account permissions - maccPerms = map[string][]string{ - auth.FeeCollectorName: nil, - distr.ModuleName: nil, - mint.ModuleName: {supply.Minter}, - staking.BondedPoolName: {supply.Burner, supply.Staking}, - staking.NotBondedPoolName: {supply.Burner, supply.Staking}, - gov.ModuleName: {supply.Burner}, - } -) - -func init() { ModuleBasics = module.NewBasicManager( genaccounts.AppModuleBasic{}, genutil.AppModuleBasic{}, @@ -65,20 +50,33 @@ func init() { staking.AppModuleBasic{}, mint.AppModuleBasic{}, distr.AppModuleBasic{}, - gov.NewAppModuleBasic(paramsclient.ProposalHandler, distrclient.ProposalHandler), + gov.NewAppModuleBasic(paramsclient.ProposalHandler, distr.ProposalHandler), params.AppModuleBasic{}, crisis.AppModuleBasic{}, slashing.AppModuleBasic{}, supply.AppModuleBasic{}, ) -} + + // module account permissions + maccPerms = map[string][]string{ + auth.FeeCollectorName: nil, + distr.ModuleName: nil, + mint.ModuleName: {supply.Minter}, + staking.BondedPoolName: {supply.Burner, supply.Staking}, + staking.NotBondedPoolName: {supply.Burner, supply.Staking}, + gov.ModuleName: {supply.Burner}, + } +) // custom tx codec func MakeCodec() *codec.Codec { var cdc = codec.New() + ModuleBasics.RegisterCodec(cdc) sdk.RegisterCodec(cdc) codec.RegisterCrypto(cdc) + codec.RegisterEvidences(cdc) + return cdc } @@ -90,18 +88,8 @@ type GaiaApp struct { invCheckPeriod uint // keys to access the substores - keyMain *sdk.KVStoreKey - keyAccount *sdk.KVStoreKey - keySupply *sdk.KVStoreKey - keyStaking *sdk.KVStoreKey - tkeyStaking *sdk.TransientStoreKey - keySlashing *sdk.KVStoreKey - keyMint *sdk.KVStoreKey - keyDistr *sdk.KVStoreKey - tkeyDistr *sdk.TransientStoreKey - keyGov *sdk.KVStoreKey - keyParams *sdk.KVStoreKey - tkeyParams *sdk.TransientStoreKey + keys map[string]*sdk.KVStoreKey + tkeys map[string]*sdk.TransientStoreKey // keepers accountKeeper auth.AccountKeeper @@ -129,26 +117,23 @@ func NewGaiaApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest b bApp.SetCommitMultiStoreTracer(traceStore) bApp.SetAppVersion(version.Version) - var app = &GaiaApp{ + keys := sdk.NewKVStoreKeys( + bam.MainStoreKey, auth.StoreKey, staking.StoreKey, + supply.StoreKey, mint.StoreKey, distr.StoreKey, slashing.StoreKey, + gov.StoreKey, params.StoreKey, + ) + tkeys := sdk.NewTransientStoreKeys(staking.TStoreKey, params.TStoreKey) + + app := &GaiaApp{ BaseApp: bApp, cdc: cdc, invCheckPeriod: invCheckPeriod, - keyMain: sdk.NewKVStoreKey(bam.MainStoreKey), - keyAccount: sdk.NewKVStoreKey(auth.StoreKey), - keySupply: sdk.NewKVStoreKey(supply.StoreKey), - keyStaking: sdk.NewKVStoreKey(staking.StoreKey), - tkeyStaking: sdk.NewTransientStoreKey(staking.TStoreKey), - keyMint: sdk.NewKVStoreKey(mint.StoreKey), - keyDistr: sdk.NewKVStoreKey(distr.StoreKey), - tkeyDistr: sdk.NewTransientStoreKey(distr.TStoreKey), - keySlashing: sdk.NewKVStoreKey(slashing.StoreKey), - keyGov: sdk.NewKVStoreKey(gov.StoreKey), - keyParams: sdk.NewKVStoreKey(params.StoreKey), - tkeyParams: sdk.NewTransientStoreKey(params.TStoreKey), + keys: keys, + tkeys: tkeys, } // init params keeper and subspaces - app.paramsKeeper = params.NewKeeper(app.cdc, app.keyParams, app.tkeyParams, params.DefaultCodespace) + app.paramsKeeper = params.NewKeeper(app.cdc, keys[params.StoreKey], tkeys[params.TStoreKey], params.DefaultCodespace) authSubspace := app.paramsKeeper.Subspace(auth.DefaultParamspace) bankSubspace := app.paramsKeeper.Subspace(bank.DefaultParamspace) stakingSubspace := app.paramsKeeper.Subspace(staking.DefaultParamspace) @@ -159,16 +144,19 @@ func NewGaiaApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest b crisisSubspace := app.paramsKeeper.Subspace(crisis.DefaultParamspace) // add keepers - app.accountKeeper = auth.NewAccountKeeper(app.cdc, app.keyAccount, authSubspace, auth.ProtoBaseAccount) - app.bankKeeper = bank.NewBaseKeeper(app.accountKeeper, bankSubspace, bank.DefaultCodespace) - app.supplyKeeper = supply.NewKeeper(app.cdc, app.keySupply, app.accountKeeper, app.bankKeeper, supply.DefaultCodespace, maccPerms) - stakingKeeper := staking.NewKeeper(app.cdc, app.keyStaking, app.tkeyStaking, - app.supplyKeeper, stakingSubspace, staking.DefaultCodespace) - app.mintKeeper = mint.NewKeeper(app.cdc, app.keyMint, mintSubspace, &stakingKeeper, app.supplyKeeper, auth.FeeCollectorName) - app.distrKeeper = distr.NewKeeper(app.cdc, app.keyDistr, distrSubspace, &stakingKeeper, - app.supplyKeeper, distr.DefaultCodespace, auth.FeeCollectorName) - app.slashingKeeper = slashing.NewKeeper(app.cdc, app.keySlashing, &stakingKeeper, - slashingSubspace, slashing.DefaultCodespace) + app.accountKeeper = auth.NewAccountKeeper(app.cdc, keys[auth.StoreKey], authSubspace, auth.ProtoBaseAccount) + app.bankKeeper = bank.NewBaseKeeper(app.accountKeeper, bankSubspace, bank.DefaultCodespace, app.ModuleAccountAddrs()) + app.supplyKeeper = supply.NewKeeper(app.cdc, keys[supply.StoreKey], app.accountKeeper, app.bankKeeper, maccPerms) + stakingKeeper := staking.NewKeeper( + app.cdc, keys[staking.StoreKey], tkeys[staking.TStoreKey], + app.supplyKeeper, stakingSubspace, staking.DefaultCodespace, + ) + app.mintKeeper = mint.NewKeeper(app.cdc, keys[mint.StoreKey], mintSubspace, &stakingKeeper, app.supplyKeeper, auth.FeeCollectorName) + app.distrKeeper = distr.NewKeeper(app.cdc, keys[distr.StoreKey], distrSubspace, &stakingKeeper, + app.supplyKeeper, distr.DefaultCodespace, auth.FeeCollectorName, app.ModuleAccountAddrs()) + app.slashingKeeper = slashing.NewKeeper( + app.cdc, keys[slashing.StoreKey], &stakingKeeper, slashingSubspace, slashing.DefaultCodespace, + ) app.crisisKeeper = crisis.NewKeeper(crisisSubspace, invCheckPeriod, app.supplyKeeper, auth.FeeCollectorName) // register the proposal types @@ -176,13 +164,16 @@ func NewGaiaApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest b govRouter.AddRoute(gov.RouterKey, gov.ProposalHandler). AddRoute(params.RouterKey, params.NewParamChangeProposalHandler(app.paramsKeeper)). AddRoute(distr.RouterKey, distr.NewCommunityPoolSpendProposalHandler(app.distrKeeper)) - app.govKeeper = gov.NewKeeper(app.cdc, app.keyGov, app.paramsKeeper, govSubspace, - app.supplyKeeper, &stakingKeeper, gov.DefaultCodespace, govRouter) + app.govKeeper = gov.NewKeeper( + app.cdc, keys[gov.StoreKey], app.paramsKeeper, govSubspace, + app.supplyKeeper, &stakingKeeper, gov.DefaultCodespace, govRouter, + ) // register the staking hooks // NOTE: stakingKeeper above is passed by reference, so that it will contain these hooks app.stakingKeeper = *stakingKeeper.SetHooks( - staking.NewMultiStakingHooks(app.distrKeeper.Hooks(), app.slashingKeeper.Hooks())) + staking.NewMultiStakingHooks(app.distrKeeper.Hooks(), app.slashingKeeper.Hooks()), + ) app.mm = module.NewManager( genaccounts.NewAppModule(app.accountKeeper), @@ -215,9 +206,8 @@ func NewGaiaApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest b app.mm.RegisterRoutes(app.Router(), app.QueryRouter()) // initialize stores - app.MountStores(app.keyMain, app.keyAccount, app.keySupply, app.keyStaking, - app.keyMint, app.keyDistr, app.keySlashing, app.keyGov, app.keyParams, - app.tkeyParams, app.tkeyStaking, app.tkeyDistr) + app.MountKVStores(keys) + app.MountTransientStores(tkeys) // initialize BaseApp app.SetInitChainer(app.InitChainer) @@ -226,11 +216,12 @@ func NewGaiaApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest b app.SetEndBlocker(app.EndBlocker) if loadLatest { - err := app.LoadLatestVersion(app.keyMain) + err := app.LoadLatestVersion(app.keys[bam.MainStoreKey]) if err != nil { cmn.Exit(err.Error()) } } + return app } @@ -248,12 +239,13 @@ func (app *GaiaApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.R func (app *GaiaApp) InitChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { var genesisState simapp.GenesisState app.cdc.MustUnmarshalJSON(req.AppStateBytes, &genesisState) + return app.mm.InitGenesis(ctx, genesisState) } // load a particular height func (app *GaiaApp) LoadHeight(height int64) error { - return app.LoadVersion(height, app.keyMain) + return app.LoadVersion(height, app.keys[bam.MainStoreKey]) } // ModuleAccountAddrs returns all the app's module account addresses. diff --git a/app/app_test.go b/app/app_test.go index 3b73774725e..93b536db944 100644 --- a/app/app_test.go +++ b/app/app_test.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/libs/db" + "github.com/tendermint/tm-db" "github.com/tendermint/tendermint/libs/log" "github.com/cosmos/cosmos-sdk/codec" diff --git a/app/export.go b/app/export.go index 5b2bf4836bd..9d312bce626 100644 --- a/app/export.go +++ b/app/export.go @@ -16,7 +16,6 @@ import ( // export the state of gaia for a genesis file func (app *GaiaApp) ExportAppStateAndValidators(forZeroHeight bool, jailWhiteList []string, ) (appState json.RawMessage, validators []tmtypes.GenesisValidator, err error) { - // as if they could withdraw from the start of the next block ctx := app.NewContext(true, abci.Header{Height: app.LastBlockHeight()}) @@ -125,7 +124,7 @@ func (app *GaiaApp) prepForZeroHeightGenesis(ctx sdk.Context, jailWhiteList []st // Iterate through validators by power descending, reset bond heights, and // update bond intra-tx counters. - store := ctx.KVStore(app.keyStaking) + store := ctx.KVStore(app.keys[staking.StoreKey]) iter := sdk.KVStoreReversePrefixIterator(store, staking.ValidatorsKey) counter := int16(0) diff --git a/app/sim_test.go b/app/sim_test.go index 0e067bfefd2..f7aa9161e14 100644 --- a/app/sim_test.go +++ b/app/sim_test.go @@ -14,70 +14,75 @@ import ( "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" - dbm "github.com/tendermint/tendermint/libs/db" "github.com/tendermint/tendermint/libs/log" + dbm "github.com/tendermint/tm-db" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth" authsim "github.com/cosmos/cosmos-sdk/x/auth/simulation" "github.com/cosmos/cosmos-sdk/x/bank" + distr "github.com/cosmos/cosmos-sdk/x/distribution" distrsim "github.com/cosmos/cosmos-sdk/x/distribution/simulation" + "github.com/cosmos/cosmos-sdk/x/gov" govsim "github.com/cosmos/cosmos-sdk/x/gov/simulation" + "github.com/cosmos/cosmos-sdk/x/mint" + "github.com/cosmos/cosmos-sdk/x/params" paramsim "github.com/cosmos/cosmos-sdk/x/params/simulation" "github.com/cosmos/cosmos-sdk/x/simulation" + "github.com/cosmos/cosmos-sdk/x/slashing" slashingsim "github.com/cosmos/cosmos-sdk/x/slashing/simulation" "github.com/cosmos/cosmos-sdk/x/staking" stakingsim "github.com/cosmos/cosmos-sdk/x/staking/simulation" -) - -var ( - genesisFile string - paramsFile string - seed int64 - numBlocks int - blockSize int - enabled bool - verbose bool - lean bool - commit bool - period int - onOperation bool // TODO Remove in favor of binary search for invariant violation - allInvariants bool + "github.com/cosmos/cosmos-sdk/x/supply" ) func init() { - flag.StringVar(&genesisFile, "SimulationGenesis", "", "custom simulation genesis file; cannot be used with params file") - flag.StringVar(¶msFile, "SimulationParams", "", "custom simulation params file which overrides any random params; cannot be used with genesis") - flag.Int64Var(&seed, "SimulationSeed", 42, "simulation random seed") - flag.IntVar(&numBlocks, "SimulationNumBlocks", 500, "number of blocks") - flag.IntVar(&blockSize, "SimulationBlockSize", 200, "operations per block") - flag.BoolVar(&enabled, "SimulationEnabled", false, "enable the simulation") - flag.BoolVar(&verbose, "SimulationVerbose", false, "verbose log output") - flag.BoolVar(&lean, "SimulationLean", false, "lean simulation log output") - flag.BoolVar(&commit, "SimulationCommit", false, "have the simulation commit") - flag.IntVar(&period, "SimulationPeriod", 1, "run slow invariants only once every period assertions") + flag.StringVar(&genesisFile, "Genesis", "", "custom simulation genesis file; cannot be used with params file") + flag.StringVar(¶msFile, "Params", "", "custom simulation params file which overrides any random params; cannot be used with genesis") + flag.StringVar(&exportParamsPath, "ExportParamsPath", "", "custom file path to save the exported params JSON") + flag.IntVar(&exportParamsHeight, "ExportParamsHeight", 0, "height to which export the randomly generated params") + flag.StringVar(&exportStatePath, "ExportStatePath", "", "custom file path to save the exported app state JSON") + flag.Int64Var(&seed, "Seed", 42, "simulation random seed") + flag.IntVar(&numBlocks, "NumBlocks", 500, "number of blocks") + flag.IntVar(&blockSize, "BlockSize", 200, "operations per block") + flag.BoolVar(&enabled, "Enabled", false, "enable the simulation") + flag.BoolVar(&verbose, "Verbose", false, "verbose log output") + flag.BoolVar(&lean, "Lean", false, "lean simulation log output") + flag.BoolVar(&commit, "Commit", false, "have the simulation commit") + flag.IntVar(&period, "Period", 1, "run slow invariants only once every period assertions") flag.BoolVar(&onOperation, "SimulateEveryOperation", false, "run slow invariants every operation") flag.BoolVar(&allInvariants, "PrintAllInvariants", false, "print all invariants if a broken invariant is found") + flag.Int64Var(&genesisTime, "GenesisTime", 0, "override genesis UNIX time instead of using a random UNIX time") } // helper function for populating input for SimulateFromSeed func getSimulateFromSeedInput(tb testing.TB, w io.Writer, app *GaiaApp) ( testing.TB, io.Writer, *baseapp.BaseApp, simulation.AppStateFn, int64, - simulation.WeightedOperations, sdk.Invariants, int, int, bool, bool, bool, bool, map[string]bool, -) { + simulation.WeightedOperations, sdk.Invariants, int, int, int, + bool, bool, bool, bool, bool, map[string]bool) { + + exportParams := exportParamsPath != "" return tb, w, app.BaseApp, appStateFn, seed, - testAndRunTxs(app), invariants(app), numBlocks, blockSize, commit, - lean, onOperation, allInvariants, app.ModuleAccountAddrs() + testAndRunTxs(app), invariants(app), + numBlocks, exportParamsHeight, blockSize, + exportParams, commit, lean, onOperation, allInvariants, app.ModuleAccountAddrs() } func appStateFn( - r *rand.Rand, accs []simulation.Account, genesisTimestamp time.Time, -) (appState json.RawMessage, simAccs []simulation.Account, chainID string) { + r *rand.Rand, accs []simulation.Account, +) (appState json.RawMessage, simAccs []simulation.Account, chainID string, genesisTimestamp time.Time) { cdc := MakeCodec() + if genesisTime == 0 { + genesisTimestamp = simulation.RandTimestamp(r) + } else { + genesisTimestamp = time.Unix(genesisTime, 0) + } + switch { case paramsFile != "" && genesisFile != "": panic("cannot provide both a genesis file and a params file") @@ -100,7 +105,7 @@ func appStateFn( appState, simAccs, chainID = appStateRandomizedFn(r, accs, genesisTimestamp, appParams) } - return appState, simAccs, chainID + return appState, simAccs, chainID, genesisTimestamp } // TODO refactor out random initialization code to the modules @@ -361,7 +366,7 @@ func fauxMerkleModeOpt(bapp *baseapp.BaseApp) { } // Profile with: -// /usr/local/go/bin/go test -benchmem -run=^$ github.com/cosmos/cosmos-sdk/GaiaApp -bench ^BenchmarkFullAppSimulation$ -SimulationCommit=true -cpuprofile cpu.out +// /usr/local/go/bin/go test -benchmem -run=^$ github.com/cosmos/cosmos-sdk/GaiaApp -bench ^BenchmarkFullAppSimulation$ -Commit=true -cpuprofile cpu.out func BenchmarkFullAppSimulation(b *testing.B) { logger := log.NewNopLogger() @@ -375,14 +380,46 @@ func BenchmarkFullAppSimulation(b *testing.B) { app := NewGaiaApp(logger, db, nil, true, 0) // Run randomized simulation - // TODO parameterize numbers, save for a later PR - _, err := simulation.SimulateFromSeed(getSimulateFromSeedInput(b, os.Stdout, app)) - if err != nil { - fmt.Println(err) - b.Fail() + // TODO: parameterize numbers, save for a later PR + _, params, simErr := simulation.SimulateFromSeed(getSimulateFromSeedInput(b, os.Stdout, app)) + + // export state and params before the simulation error is checked + if exportStatePath != "" { + fmt.Println("Exporting app state...") + appState, _, err := app.ExportAppStateAndValidators(false, nil) + if err != nil { + fmt.Println(err) + b.Fail() + } + err = ioutil.WriteFile(exportStatePath, []byte(appState), 0644) + if err != nil { + fmt.Println(err) + b.Fail() + } } + + if exportParamsPath != "" { + fmt.Println("Exporting simulation params...") + paramsBz, err := json.MarshalIndent(params, "", " ") + if err != nil { + fmt.Println(err) + b.Fail() + } + + err = ioutil.WriteFile(exportParamsPath, paramsBz, 0644) + if err != nil { + fmt.Println(err) + b.Fail() + } + } + + if simErr != nil { + fmt.Println(simErr) + b.FailNow() + } + if commit { - fmt.Println("GoLevelDB Stats") + fmt.Println("\nGoLevelDB Stats") fmt.Println(db.Stats()["leveldb.stats"]) fmt.Println("GoLevelDB cached block size", db.Stats()["leveldb.cachedblock"]) } @@ -414,16 +451,37 @@ func TestFullAppSimulation(t *testing.T) { require.Equal(t, "GaiaApp", app.Name()) // Run randomized simulation - _, err := simulation.SimulateFromSeed(getSimulateFromSeedInput(t, os.Stdout, app)) + _, params, simErr := simulation.SimulateFromSeed(getSimulateFromSeedInput(t, os.Stdout, app)) + + // export state and params before the simulation error is checked + if exportStatePath != "" { + fmt.Println("Exporting app state...") + appState, _, err := app.ExportAppStateAndValidators(false, nil) + require.NoError(t, err) + + err = ioutil.WriteFile(exportStatePath, []byte(appState), 0644) + require.NoError(t, err) + } + + if exportParamsPath != "" { + fmt.Println("Exporting simulation params...") + fmt.Println(params) + paramsBz, err := json.MarshalIndent(params, "", " ") + require.NoError(t, err) + + err = ioutil.WriteFile(exportParamsPath, paramsBz, 0644) + require.NoError(t, err) + } + + require.NoError(t, simErr) + if commit { // for memdb: // fmt.Println("Database Size", db.Stats()["database.size"]) - fmt.Println("GoLevelDB Stats") + fmt.Println("\nGoLevelDB Stats") fmt.Println(db.Stats()["leveldb.stats"]) fmt.Println("GoLevelDB cached block size", db.Stats()["leveldb.cachedblock"]) } - - require.Nil(t, err) } func TestAppImportExport(t *testing.T) { @@ -448,20 +506,40 @@ func TestAppImportExport(t *testing.T) { }() app := NewGaiaApp(logger, db, nil, true, 0, fauxMerkleModeOpt) - require.Equal(t, "GaiaApp", app.Name()) + require.Equal(t, "SimApp", app.Name()) // Run randomized simulation - _, err := simulation.SimulateFromSeed(getSimulateFromSeedInput(t, os.Stdout, app)) + _, simParams, simErr := simulation.SimulateFromSeed(getSimulateFromSeedInput(t, os.Stdout, app)) + + // export state and simParams before the simulation error is checked + if exportStatePath != "" { + fmt.Println("Exporting app state...") + appState, _, err := app.ExportAppStateAndValidators(false, nil) + require.NoError(t, err) + + err = ioutil.WriteFile(exportStatePath, []byte(appState), 0644) + require.NoError(t, err) + } + + if exportParamsPath != "" { + fmt.Println("Exporting simulation params...") + simParamsBz, err := json.MarshalIndent(simParams, "", " ") + require.NoError(t, err) + + err = ioutil.WriteFile(exportParamsPath, simParamsBz, 0644) + require.NoError(t, err) + } + + require.NoError(t, simErr) if commit { // for memdb: // fmt.Println("Database Size", db.Stats()["database.size"]) - fmt.Println("GoLevelDB Stats") + fmt.Println("\nGoLevelDB Stats") fmt.Println(db.Stats()["leveldb.stats"]) fmt.Println("GoLevelDB cached block size", db.Stats()["leveldb.cachedblock"]) } - require.Nil(t, err) fmt.Printf("Exporting genesis...\n") appState, _, err := app.ExportAppStateAndValidators(false, []string{}) @@ -477,7 +555,7 @@ func TestAppImportExport(t *testing.T) { }() newApp := NewGaiaApp(log.NewNopLogger(), newDB, nil, true, 0, fauxMerkleModeOpt) - require.Equal(t, "GaiaApp", newApp.Name()) + require.Equal(t, "SimApp", newApp.Name()) var genesisState simapp.GenesisState err = app.cdc.UnmarshalJSON(appState, &genesisState) @@ -498,16 +576,18 @@ func TestAppImportExport(t *testing.T) { } storeKeysPrefixes := []StoreKeysPrefixes{ - {app.keyMain, newApp.keyMain, [][]byte{}}, - {app.keyAccount, newApp.keyAccount, [][]byte{}}, - {app.keyStaking, newApp.keyStaking, [][]byte{staking.UnbondingQueueKey, - staking.RedelegationQueueKey, staking.ValidatorQueueKey}}, // ordering may change but it doesn't matter - {app.keySlashing, newApp.keySlashing, [][]byte{}}, - {app.keyMint, newApp.keyMint, [][]byte{}}, - {app.keyDistr, newApp.keyDistr, [][]byte{}}, - {app.keySupply, newApp.keySupply, [][]byte{}}, - {app.keyParams, newApp.keyParams, [][]byte{}}, - {app.keyGov, newApp.keyGov, [][]byte{}}, + {app.keys[baseapp.MainStoreKey], newApp.keys[baseapp.MainStoreKey], [][]byte{}}, + {app.keys[auth.StoreKey], newApp.keys[auth.StoreKey], [][]byte{}}, + {app.keys[staking.StoreKey], newApp.keys[staking.StoreKey], + [][]byte{ + staking.UnbondingQueueKey, staking.RedelegationQueueKey, staking.ValidatorQueueKey, + }}, // ordering may change but it doesn't matter + {app.keys[slashing.StoreKey], newApp.keys[slashing.StoreKey], [][]byte{}}, + {app.keys[mint.StoreKey], newApp.keys[mint.StoreKey], [][]byte{}}, + {app.keys[distr.StoreKey], newApp.keys[distr.StoreKey], [][]byte{}}, + {app.keys[supply.StoreKey], newApp.keys[supply.StoreKey], [][]byte{}}, + {app.keys[params.StoreKey], newApp.keys[params.StoreKey], [][]byte{}}, + {app.keys[gov.StoreKey], newApp.keys[gov.StoreKey], [][]byte{}}, } for _, storeKeysPrefix := range storeKeysPrefixes { @@ -547,18 +627,37 @@ func TestAppSimulationAfterImport(t *testing.T) { require.Equal(t, "GaiaApp", app.Name()) // Run randomized simulation - stopEarly, err := simulation.SimulateFromSeed(getSimulateFromSeedInput(t, os.Stdout, app)) + stopEarly, params, simErr := simulation.SimulateFromSeed(getSimulateFromSeedInput(t, os.Stdout, app)) + + // export state and params before the simulation error is checked + if exportStatePath != "" { + fmt.Println("Exporting app state...") + appState, _, err := app.ExportAppStateAndValidators(false, nil) + require.NoError(t, err) + + err = ioutil.WriteFile(exportStatePath, []byte(appState), 0644) + require.NoError(t, err) + } + + if exportParamsPath != "" { + fmt.Println("Exporting simulation params...") + paramsBz, err := json.MarshalIndent(params, "", " ") + require.NoError(t, err) + + err = ioutil.WriteFile(exportParamsPath, paramsBz, 0644) + require.NoError(t, err) + } + + require.NoError(t, simErr) if commit { // for memdb: // fmt.Println("Database Size", db.Stats()["database.size"]) - fmt.Println("GoLevelDB Stats") + fmt.Println("\nGoLevelDB Stats") fmt.Println(db.Stats()["leveldb.stats"]) fmt.Println("GoLevelDB cached block size", db.Stats()["leveldb.cachedblock"]) } - require.Nil(t, err) - if stopEarly { // we can't export or import a zero-validator genesis fmt.Printf("We can't export or import a zero-validator genesis, exiting test...\n") @@ -589,7 +688,7 @@ func TestAppSimulationAfterImport(t *testing.T) { }) // Run randomized simulation on imported app - _, err = simulation.SimulateFromSeed(getSimulateFromSeedInput(t, os.Stdout, newApp)) + _, _, err = simulation.SimulateFromSeed(getSimulateFromSeedInput(t, os.Stdout, newApp)) require.Nil(t, err) } @@ -611,24 +710,16 @@ func TestAppStateDeterminism(t *testing.T) { db := dbm.NewMemDB() app := NewGaiaApp(logger, db, nil, true, 0) - // run randomized simulation + // Run randomized simulation simulation.SimulateFromSeed( t, os.Stdout, app.BaseApp, appStateFn, seed, - testAndRunTxs(app), - []sdk.Invariant{}, - 50, - 100, - true, - false, - false, - false, - app.ModuleAccountAddrs(), + testAndRunTxs(app), []sdk.Invariant{}, + 50, 100, 0, + false, true, false, false, false, app.ModuleAccountAddrs(), ) - appHash := app.LastCommitID().Hash appHashList[j] = appHash } - for k := 1; k < numTimesToRunPerSeed; k++ { require.Equal(t, appHashList[0], appHashList[k], "appHash list: %v", appHashList) } @@ -646,15 +737,47 @@ func BenchmarkInvariants(b *testing.B) { }() app := NewGaiaApp(logger, db, nil, true, 0) + exportParams := exportParamsPath != "" // 2. Run parameterized simulation (w/o invariants) - _, err := simulation.SimulateFromSeed( + _, params, simErr := simulation.SimulateFromSeed( b, ioutil.Discard, app.BaseApp, appStateFn, seed, testAndRunTxs(app), - []sdk.Invariant{}, numBlocks, blockSize, commit, lean, onOperation, false, - app.ModuleAccountAddrs(), + []sdk.Invariant{}, numBlocks, exportParamsHeight, blockSize, + exportParams, commit, lean, onOperation, false, app.ModuleAccountAddrs(), ) - if err != nil { - fmt.Println(err) + + // export state and params before the simulation error is checked + if exportStatePath != "" { + fmt.Println("Exporting app state...") + appState, _, err := app.ExportAppStateAndValidators(false, nil) + if err != nil { + fmt.Println(err) + b.Fail() + } + err = ioutil.WriteFile(exportStatePath, []byte(appState), 0644) + if err != nil { + fmt.Println(err) + b.Fail() + } + } + + if exportParamsPath != "" { + fmt.Println("Exporting simulation params...") + paramsBz, err := json.MarshalIndent(params, "", " ") + if err != nil { + fmt.Println(err) + b.Fail() + } + + err = ioutil.WriteFile(exportParamsPath, paramsBz, 0644) + if err != nil { + fmt.Println(err) + b.Fail() + } + } + + if simErr != nil { + fmt.Println(simErr) b.FailNow() } diff --git a/app/utils.go b/app/utils.go index da1450cb6ef..b3e7d2fca60 100644 --- a/app/utils.go +++ b/app/utils.go @@ -4,23 +4,43 @@ package app import ( "io" - dbm "github.com/tendermint/tendermint/libs/db" "github.com/tendermint/tendermint/libs/log" + dbm "github.com/tendermint/tm-db" - bam "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/baseapp" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/staking" ) +var ( + genesisFile string + paramsFile string + exportParamsPath string + exportParamsHeight int + exportStatePath string + seed int64 + initialBlockHeight int + numBlocks int + blockSize int + enabled bool + verbose bool + lean bool + commit bool + period int + onOperation bool // TODO Remove in favor of binary search for invariant violation + allInvariants bool + genesisTime int64 +) + // DONTCOVER // NewGaiaAppUNSAFE is used for debugging purposes only. // // NOTE: to not use this function with non-test code func NewGaiaAppUNSAFE(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, - invCheckPeriod uint, baseAppOptions ...func(*bam.BaseApp), + invCheckPeriod uint, baseAppOptions ...func(*baseapp.BaseApp), ) (gapp *GaiaApp, keyMain, keyStaking *sdk.KVStoreKey, stakingKeeper staking.Keeper) { gapp = NewGaiaApp(logger, db, traceStore, loadLatest, invCheckPeriod, baseAppOptions...) - return gapp, gapp.keyMain, gapp.keyStaking, gapp.stakingKeeper + return gapp, gapp.keys[baseapp.MainStoreKey], gapp.keys[staking.StoreKey], gapp.stakingKeeper } diff --git a/cli_test/cli_test.go b/cli_test/cli_test.go index a31ad3fe61d..7269e5a7063 100644 --- a/cli_test/cli_test.go +++ b/cli_test/cli_test.go @@ -778,9 +778,6 @@ func TestGaiaCLIQueryTxPagination(t *testing.T) { txsPage2 := f.QueryTxs(2, 15, fmt.Sprintf("message.sender:%s", fooAddr)) require.Len(t, txsPage2.Txs, 15) require.NotEqual(t, txsPage1.Txs, txsPage2.Txs) - txsPage3 := f.QueryTxs(3, 15, fmt.Sprintf("message.sender:%s", fooAddr)) - require.Len(t, txsPage3.Txs, 15) - require.Equal(t, txsPage2.Txs, txsPage3.Txs) // perPage = 16, 2 pages txsPage1 = f.QueryTxs(1, 16, fmt.Sprintf("message.sender:%s", fooAddr)) diff --git a/cli_test/test_helpers.go b/cli_test/test_helpers.go index 966928d746f..c7ae1680a8f 100644 --- a/cli_test/test_helpers.go +++ b/cli_test/test_helpers.go @@ -157,6 +157,7 @@ func InitFixtures(t *testing.T) (f *Fixtures) { f.CLIConfig("chain-id", f.ChainID) f.CLIConfig("broadcast-mode", "block") + f.CLIConfig("trust-node", "true") // start an account with tokens f.AddGenesisAccount(f.KeyAddress(keyFoo), startCoins) diff --git a/cmd/gaiad/main.go b/cmd/gaiad/main.go index 0978f8171e6..4564b23afba 100644 --- a/cmd/gaiad/main.go +++ b/cmd/gaiad/main.go @@ -9,9 +9,9 @@ import ( abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/libs/cli" - dbm "github.com/tendermint/tendermint/libs/db" "github.com/tendermint/tendermint/libs/log" tmtypes "github.com/tendermint/tendermint/types" + dbm "github.com/tendermint/tm-db" "github.com/cosmos/gaia/app" diff --git a/cmd/gaiad/replay.go b/cmd/gaiad/replay.go index 3e015329185..934f7340b79 100644 --- a/cmd/gaiad/replay.go +++ b/cmd/gaiad/replay.go @@ -11,10 +11,10 @@ import ( "github.com/spf13/cobra" abci "github.com/tendermint/tendermint/abci/types" - bcm "github.com/tendermint/tendermint/blockchain" cmn "github.com/tendermint/tendermint/libs/common" "github.com/tendermint/tendermint/proxy" tmsm "github.com/tendermint/tendermint/state" + tmstore "github.com/tendermint/tendermint/store" tm "github.com/tendermint/tendermint/types" "github.com/cosmos/gaia/app" @@ -154,7 +154,7 @@ func replayTxs(rootDir string) error { // Create block store fmt.Fprintln(os.Stderr, "Creating block store") - blockStore := bcm.NewBlockStore(bcDB) + blockStore := tmstore.NewBlockStore(bcDB) tz := []time.Duration{0, 0, 0} for i := int(state.LastBlockHeight) + 1; ; i++ { diff --git a/cmd/gaiad/testnet.go b/cmd/gaiad/testnet.go index eb4abc2b242..ca55c66135d 100644 --- a/cmd/gaiad/testnet.go +++ b/cmd/gaiad/testnet.go @@ -28,6 +28,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/genaccounts" "github.com/cosmos/cosmos-sdk/x/genutil" + genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" "github.com/cosmos/cosmos-sdk/x/staking" ) @@ -42,7 +43,8 @@ var ( // get cmd to initialize all files for tendermint testnet and application func testnetCmd(ctx *server.Context, cdc *codec.Codec, - mbm module.BasicManager, genAccIterator genutil.GenesisAccountsIterator) *cobra.Command { + mbm module.BasicManager, genAccIterator genutiltypes.GenesisAccountsIterator, +) *cobra.Command { cmd := &cobra.Command{ Use: "testnet", @@ -96,7 +98,7 @@ const nodeDirPerm = 0755 // Initialize the testnet func InitTestnet(cmd *cobra.Command, config *tmconfig.Config, cdc *codec.Codec, - mbm module.BasicManager, genAccIterator genutil.GenesisAccountsIterator, + mbm module.BasicManager, genAccIterator genutiltypes.GenesisAccountsIterator, outputDir, chainID, minGasPrices, nodeDirPrefix, nodeDaemonHome, nodeCLIHome, startingIPAddress string, numValidators int) error { @@ -287,7 +289,7 @@ func collectGenFiles( cdc *codec.Codec, config *tmconfig.Config, chainID string, monikers, nodeIDs []string, valPubKeys []crypto.PubKey, numValidators int, outputDir, nodeDirPrefix, nodeDaemonHome string, - genAccIterator genutil.GenesisAccountsIterator) error { + genAccIterator genutiltypes.GenesisAccountsIterator) error { var appState json.RawMessage genTime := tmtime.Now() diff --git a/go.mod b/go.mod index 6973036114e..98c3f40e8a2 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.12 require ( github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c // indirect - github.com/cosmos/cosmos-sdk v0.36.0-rc1 + github.com/cosmos/cosmos-sdk v0.36.0-rc3 github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d // indirect github.com/go-kit/kit v0.9.0 // indirect github.com/golang/mock v1.3.1 // indirect @@ -27,12 +27,12 @@ require ( github.com/spf13/viper v1.4.0 github.com/stretchr/testify v1.3.0 github.com/tendermint/go-amino v0.15.0 - github.com/tendermint/tendermint v0.32.1 + github.com/tendermint/tendermint v0.32.2 + github.com/tendermint/tm-db v0.1.1 golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 // indirect - golang.org/x/net v0.0.0-20190628185345-da137c7871d7 // indirect - golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb // indirect + golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 // indirect + golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa // indirect golang.org/x/text v0.3.2 // indirect google.golang.org/appengine v1.4.0 // indirect google.golang.org/genproto v0.0.0-20190701230453-710ae3a149df // indirect - google.golang.org/grpc v1.22.0 // indirect ) diff --git a/go.sum b/go.sum index 3d1301c5392..63716fef29f 100644 --- a/go.sum +++ b/go.sum @@ -37,8 +37,8 @@ github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8Nz github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cosmos/cosmos-sdk v0.36.0-rc1 h1:hgSXNeVwNYxD0+O9DxRrxJcir9Z7Q5zreLV6G7GrjYA= -github.com/cosmos/cosmos-sdk v0.36.0-rc1/go.mod h1:UV765S3m9sxCg8rYaBr4XgeHZl2UP6y++Coz9mLlYFc= +github.com/cosmos/cosmos-sdk v0.36.0-rc3 h1:n+Pkq8hKjVeaoVMllVDfunIj3Gi1vprphEQ0M+wFrAw= +github.com/cosmos/cosmos-sdk v0.36.0-rc3/go.mod h1:3b/k/Zd+YDuttSmEJdNkxga1H5EIiDUhSYeErAHQN7A= github.com/cosmos/go-bip39 v0.0.0-20180618194314-52158e4697b8/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d h1:49RLWk1j44Xu4fjHb6JFYmeUnDORVwHNkDxaQ0ctCVU= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= @@ -85,7 +85,8 @@ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -110,7 +111,6 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jmhodges/levigo v0.0.0-20161115193449-c42d9e0ca023/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= @@ -128,6 +128,8 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg= +github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -190,7 +192,7 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.0.3 h1:CTwfnzjQ+8dS6MhHHu4YswVAD99sL2wjPqP+VkURmKE= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rakyll/statik v0.1.4/go.mod h1:OEi9wJV/fMUAGx1eNjq75DKDsJVuEv1U0oYdX6GX8Zs= +github.com/rakyll/statik v0.1.5/go.mod h1:OEi9wJV/fMUAGx1eNjq75DKDsJVuEv1U0oYdX6GX8Zs= github.com/rakyll/statik v0.1.6 h1:uICcfUXpgqtw2VopbIncslhAmE5hwc4g20TEyEENBNs= github.com/rakyll/statik v0.1.6/go.mod h1:OEi9wJV/fMUAGx1eNjq75DKDsJVuEv1U0oYdX6GX8Zs= github.com/rcrowley/go-metrics v0.0.0-20180503174638-e2704e165165/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= @@ -228,7 +230,6 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/syndtr/goleveldb v0.0.0-20181105012736-f9080354173f/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0= github.com/syndtr/goleveldb v1.0.1-0.20190318030020-c3a204f8e965 h1:1oFLiOyVl+W7bnBzGhf7BbIv9loSFQcieWWYIjLqcAw= github.com/syndtr/goleveldb v1.0.1-0.20190318030020-c3a204f8e965/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA= github.com/tendermint/btcd v0.1.1 h1:0VcxPfflS2zZ3RiOAHkBiFUcPvbtRj5O7zHmcJWHV7s= @@ -238,11 +239,14 @@ github.com/tendermint/crypto v0.0.0-20180820045704-3764759f34a5/go.mod h1:z4YtwM github.com/tendermint/go-amino v0.14.1/go.mod h1:i/UKE5Uocn+argJJBb12qTZsCDBcAYMbR92AaJVmKso= github.com/tendermint/go-amino v0.15.0 h1:TC4e66P59W7ML9+bxio17CPKnxW3nKIRAYskntMAoRk= github.com/tendermint/go-amino v0.15.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= -github.com/tendermint/iavl v0.12.3-0.20190712145259-c834d3192b52 h1:l3qTzz8KkhZZSeLTJGqh0+iONjGM/tS5vvbunXjAmnA= -github.com/tendermint/iavl v0.12.3-0.20190712145259-c834d3192b52/go.mod h1:A9IoWRVTibyXXlfZztHy52RloI85QOrIcsE9dyQh+DY= -github.com/tendermint/tendermint v0.31.7/go.mod h1:ymcPyWblXCplCPQjbOYbrF1fWnpslATMVqiGgWbZrlc= +github.com/tendermint/iavl v0.12.4 h1:hd1woxUGISKkfUWBA4mmmTwOua6PQZTJM/F0FDrmMV8= +github.com/tendermint/iavl v0.12.4/go.mod h1:8LHakzt8/0G3/I8FUU0ReNx98S/EP6eyPJkAUvEXT/o= github.com/tendermint/tendermint v0.32.1 h1:J8ddXMbCmG6GZjdCl/N1wgdXDU9uO91J2Y5CA9xYfGo= github.com/tendermint/tendermint v0.32.1/go.mod h1:jmPDAKuNkev9793/ivn/fTBnfpA9mGBww8MPRNPNxnU= +github.com/tendermint/tendermint v0.32.2 h1:FvZWdksfDg/65vKKr5Lgo57keARFnmhrUEXHwyrV1QY= +github.com/tendermint/tendermint v0.32.2/go.mod h1:NwMyx58S8VJ7tEpFKqRVlVWKO9N9zjTHu+Dx96VsnOE= +github.com/tendermint/tm-db v0.1.1 h1:G3Xezy3sOk9+ekhjZ/kjArYIs1SmwV+1OUgNkj7RgV0= +github.com/tendermint/tm-db v0.1.1/go.mod h1:0cPKWu2Mou3IlxecH+MEUSYc1Ch537alLe6CpFrKzgw= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= @@ -258,10 +262,10 @@ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181126093934-9eb0be3963ea/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -281,6 +285,8 @@ golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7 h1:rTIdg5QFRR7XCaK4LCjBiPbx8j4DQRpdYMnGn/bJUEU= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 h1:Ao/3l156eZf2AW5wK8a7/smtodRU+gha3+BeqJ69lRk= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -296,8 +302,8 @@ golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb h1:fgwFCsaw9buMuxNd6+DQfAuSFqbNiQZpcgJQAgJsK6k= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa h1:KIDDMLT1O0Nr7TSxp8xM5tJcdn8tgyAONntO829og1M= +golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= diff --git a/lcd_test/helpers.go b/lcd_test/helpers.go index e685cafd3a5..e23574e8084 100644 --- a/lcd_test/helpers.go +++ b/lcd_test/helpers.go @@ -10,12 +10,14 @@ import ( "sort" "strings" + "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/lcd" "github.com/cosmos/cosmos-sdk/codec" crkeys "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/server" "github.com/cosmos/cosmos-sdk/simapp" + "github.com/cosmos/cosmos-sdk/store" "github.com/cosmos/cosmos-sdk/tests" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" @@ -37,7 +39,6 @@ import ( "github.com/tendermint/tendermint/crypto/ed25519" "github.com/tendermint/tendermint/crypto/secp256k1" "github.com/tendermint/tendermint/libs/cli" - dbm "github.com/tendermint/tendermint/libs/db" "github.com/tendermint/tendermint/libs/log" nm "github.com/tendermint/tendermint/node" "github.com/tendermint/tendermint/p2p" @@ -46,6 +47,7 @@ import ( ctypes "github.com/tendermint/tendermint/rpc/core/types" tmrpc "github.com/tendermint/tendermint/rpc/lib/server" tmtypes "github.com/tendermint/tendermint/types" + dbm "github.com/tendermint/tm-db" gapp "github.com/cosmos/gaia/app" ) @@ -70,7 +72,7 @@ func InitializeLCD(nValidators int, initAddrs []sdk.AccAddress, minting bool, po logger = log.NewFilter(logger, log.AllowError()) db := dbm.NewMemDB() - app := gapp.NewGaiaApp(logger, db, nil, true, 0) + app := gapp.NewGaiaApp(logger, db, nil, true, 0, baseapp.SetPruning(store.PruneNothing)) cdc = gapp.MakeCodec() genDoc, valConsPubKeys, valOperAddrs, privVal, err := defaultGenesis(config, nValidators, initAddrs, minting) @@ -227,7 +229,8 @@ func defaultGenesis(config *tmcfg.Config, nValidators int, initAddrs []sdk.AccAd supplyDataBz := genesisState[supply.ModuleName] var supplyData supply.GenesisState cdc.MustUnmarshalJSON(supplyDataBz, &supplyData) - supplyData.Supply.Total = sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, totalSupply)) + + supplyData.Supply = sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, totalSupply)) supplyDataBz = cdc.MustMarshalJSON(supplyData) genesisState[supply.ModuleName] = supplyDataBz diff --git a/lcd_test/helpers_test.go b/lcd_test/helpers_test.go index 54a854aae02..05044f297b1 100644 --- a/lcd_test/helpers_test.go +++ b/lcd_test/helpers_test.go @@ -33,8 +33,6 @@ import ( "github.com/spf13/viper" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/p2p" - ctypes "github.com/tendermint/tendermint/rpc/core/types" ) @@ -65,15 +63,15 @@ func Request(t *testing.T, port, method, path string, payload []byte) (*http.Res // ICS 0 - Tendermint // ---------------------------------------------------------------------- // GET /node_info The properties of the connected node -func getNodeInfo(t *testing.T, port string) p2p.DefaultNodeInfo { +func getNodeInfo(t *testing.T, port string) rpc.NodeInfoResponse { res, body := Request(t, port, "GET", "/node_info", nil) require.Equal(t, http.StatusOK, res.StatusCode, body) - var nodeInfo p2p.DefaultNodeInfo + var nodeInfo rpc.NodeInfoResponse err := cdc.UnmarshalJSON([]byte(body), &nodeInfo) - require.Nil(t, err, "Couldn't parse node info") + require.Nil(t, err, "failed parse node info") - require.NotEqual(t, p2p.DefaultNodeInfo{}, nodeInfo, "res: %v", res) + require.NotEqual(t, rpc.NodeInfoResponse{}, nodeInfo, "res: %v", res) return nodeInfo } @@ -81,11 +79,12 @@ func getNodeInfo(t *testing.T, port string) p2p.DefaultNodeInfo { func getSyncStatus(t *testing.T, port string, syncing bool) { res, body := Request(t, port, "GET", "/syncing", nil) require.Equal(t, http.StatusOK, res.StatusCode, body) - if syncing { - require.Equal(t, "true", body) - return - } - require.Equal(t, "false", body) + + var syncResp rpc.SyncingResponse + err := cdc.UnmarshalJSON([]byte(body), &syncResp) + require.Nil(t, err, "failed parse syncing info") + + require.Equal(t, syncResp.Syncing, syncing) } // GET /blocks/latest Get the latest block @@ -113,6 +112,13 @@ func getBlock(t *testing.T, port string, height int, expectFail bool) ctypes.Res return resultBlock } +func extractResultFromResponse(t *testing.T, body []byte) []byte { + var resp rest.ResponseWithHeight + require.NoError(t, cdc.UnmarshalJSON([]byte(body), &resp)) + + return resp.Result +} + // GET /validatorsets/{height} Get a validator set a certain height // GET /validatorsets/latest Get the latest validator set func getValidatorSets(t *testing.T, port string, height int, expectFail bool) rpc.ResultValidatorsOutput { @@ -122,8 +128,8 @@ func getValidatorSets(t *testing.T, port string, height int, expectFail bool) rp } else { url = "/validatorsets/latest" } - var resultVals rpc.ResultValidatorsOutput + var resultVals rpc.ResultValidatorsOutput res, body := Request(t, port, "GET", url, nil) if expectFail { @@ -133,8 +139,8 @@ func getValidatorSets(t *testing.T, port string, height int, expectFail bool) rp require.Equal(t, http.StatusOK, res.StatusCode, body) - err := cdc.UnmarshalJSON([]byte(body), &resultVals) - require.Nil(t, err, "Couldn't parse validatorset") + err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &resultVals) + require.Nil(t, err, "Couldn't parse validator set") require.NotEqual(t, rpc.ResultValidatorsOutput{}, resultVals) return resultVals @@ -254,21 +260,11 @@ func updateKey(t *testing.T, port, name, oldPassword, newPassword string, fail b require.Equal(t, http.StatusOK, res.StatusCode, body) } -// DELETE /keys/{name} Remove an account -func deleteKey(t *testing.T, port, name, password string) { - dk := clientkeys.NewDeleteKeyReq(password) - req, err := cdc.MarshalJSON(dk) - require.NoError(t, err) - keyEndpoint := fmt.Sprintf("/keys/%s", name) - res, body := Request(t, port, "DELETE", keyEndpoint, req) - require.Equal(t, http.StatusOK, res.StatusCode, body) -} - // GET /auth/accounts/{address} Get the account information on blockchain func getAccount(t *testing.T, port string, addr sdk.AccAddress) (acc auth.Account) { res, body := Request(t, port, "GET", fmt.Sprintf("/auth/accounts/%s", addr.String()), nil) require.Equal(t, http.StatusOK, res.StatusCode, body) - require.Nil(t, cdc.UnmarshalJSON([]byte(body), &acc)) + require.Nil(t, cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &acc)) return acc } @@ -547,7 +543,7 @@ func getDelegatorDelegations(t *testing.T, port string, delegatorAddr sdk.AccAdd var dels staking.DelegationResponses - err := cdc.UnmarshalJSON([]byte(body), &dels) + err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &dels) require.Nil(t, err) return dels @@ -560,7 +556,7 @@ func getDelegatorUnbondingDelegations(t *testing.T, port string, delegatorAddr s var ubds []staking.UnbondingDelegation - err := cdc.UnmarshalJSON([]byte(body), &ubds) + err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &ubds) require.Nil(t, err) return ubds @@ -585,7 +581,7 @@ func getRedelegations(t *testing.T, port string, delegatorAddr sdk.AccAddress, s require.Equal(t, http.StatusOK, res.StatusCode, body) var redels staking.RedelegationResponses - err := cdc.UnmarshalJSON([]byte(body), &redels) + err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &redels) require.Nil(t, err) return redels @@ -598,7 +594,7 @@ func getDelegatorValidators(t *testing.T, port string, delegatorAddr sdk.AccAddr var bondedValidators []staking.Validator - err := cdc.UnmarshalJSON([]byte(body), &bondedValidators) + err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &bondedValidators) require.Nil(t, err) return bondedValidators @@ -610,7 +606,7 @@ func getDelegatorValidator(t *testing.T, port string, delegatorAddr sdk.AccAddre require.Equal(t, http.StatusOK, res.StatusCode, body) var bondedValidator staking.Validator - err := cdc.UnmarshalJSON([]byte(body), &bondedValidator) + err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &bondedValidator) require.Nil(t, err) return bondedValidator @@ -642,7 +638,7 @@ func getDelegation(t *testing.T, port string, delegatorAddr sdk.AccAddress, vali require.Equal(t, http.StatusOK, res.StatusCode, body) var bond staking.DelegationResponse - err := cdc.UnmarshalJSON([]byte(body), &bond) + err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &bond) require.Nil(t, err) return bond @@ -659,7 +655,7 @@ func getUnbondingDelegation(t *testing.T, port string, delegatorAddr sdk.AccAddr require.Equal(t, http.StatusOK, res.StatusCode, body) var unbond staking.UnbondingDelegation - err := cdc.UnmarshalJSON([]byte(body), &unbond) + err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &unbond) require.Nil(t, err) return unbond @@ -671,7 +667,7 @@ func getValidators(t *testing.T, port string) []staking.Validator { require.Equal(t, http.StatusOK, res.StatusCode, body) var validators []staking.Validator - err := cdc.UnmarshalJSON([]byte(body), &validators) + err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &validators) require.Nil(t, err) return validators @@ -683,7 +679,7 @@ func getValidator(t *testing.T, port string, validatorAddr sdk.ValAddress) staki require.Equal(t, http.StatusOK, res.StatusCode, body) var validator staking.Validator - err := cdc.UnmarshalJSON([]byte(body), &validator) + err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &validator) require.Nil(t, err) return validator @@ -695,7 +691,7 @@ func getValidatorDelegations(t *testing.T, port string, validatorAddr sdk.ValAdd require.Equal(t, http.StatusOK, res.StatusCode, body) var delegations []staking.Delegation - err := cdc.UnmarshalJSON([]byte(body), &delegations) + err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &delegations) require.Nil(t, err) return delegations @@ -707,34 +703,12 @@ func getValidatorUnbondingDelegations(t *testing.T, port string, validatorAddr s require.Equal(t, http.StatusOK, res.StatusCode, body) var ubds []staking.UnbondingDelegation - err := cdc.UnmarshalJSON([]byte(body), &ubds) + err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &ubds) require.Nil(t, err) return ubds } -// GET /staking/pool Get the current state of the staking pool -func getStakingPool(t *testing.T, port string) staking.Pool { - res, body := Request(t, port, "GET", "/staking/pool", nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - require.NotNil(t, body) - var pool staking.Pool - err := cdc.UnmarshalJSON([]byte(body), &pool) - require.Nil(t, err) - return pool -} - -// GET /staking/parameters Get the current staking parameter values -func getStakingParams(t *testing.T, port string) staking.Params { - res, body := Request(t, port, "GET", "/staking/parameters", nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var params staking.Params - err := cdc.UnmarshalJSON([]byte(body), ¶ms) - require.Nil(t, err) - return params -} - // ---------------------------------------------------------------------- // ICS 22 - Gov // ---------------------------------------------------------------------- @@ -860,7 +834,7 @@ func getProposalsAll(t *testing.T, port string) []gov.Proposal { require.Equal(t, http.StatusOK, res.StatusCode, body) var proposals []gov.Proposal - err := cdc.UnmarshalJSON([]byte(body), &proposals) + err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &proposals) require.Nil(t, err) return proposals } @@ -871,7 +845,7 @@ func getProposalsFilterDepositor(t *testing.T, port string, depositorAddr sdk.Ac require.Equal(t, http.StatusOK, res.StatusCode, body) var proposals []gov.Proposal - err := cdc.UnmarshalJSON([]byte(body), &proposals) + err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &proposals) require.Nil(t, err) return proposals } @@ -882,7 +856,7 @@ func getProposalsFilterVoter(t *testing.T, port string, voterAddr sdk.AccAddress require.Equal(t, http.StatusOK, res.StatusCode, body) var proposals []gov.Proposal - err := cdc.UnmarshalJSON([]byte(body), &proposals) + err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &proposals) require.Nil(t, err) return proposals } @@ -893,7 +867,7 @@ func getProposalsFilterVoterDepositor(t *testing.T, port string, voterAddr, depo require.Equal(t, http.StatusOK, res.StatusCode, body) var proposals []gov.Proposal - err := cdc.UnmarshalJSON([]byte(body), &proposals) + err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &proposals) require.Nil(t, err) return proposals } @@ -904,7 +878,7 @@ func getProposalsFilterStatus(t *testing.T, port string, status gov.ProposalStat require.Equal(t, http.StatusOK, res.StatusCode, body) var proposals []gov.Proposal - err := cdc.UnmarshalJSON([]byte(body), &proposals) + err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &proposals) require.Nil(t, err) return proposals } @@ -949,7 +923,7 @@ func getDeposits(t *testing.T, port string, proposalID uint64) []gov.Deposit { res, body := Request(t, port, "GET", fmt.Sprintf("/gov/proposals/%d/deposits", proposalID), nil) require.Equal(t, http.StatusOK, res.StatusCode, body) var deposits []gov.Deposit - err := cdc.UnmarshalJSON([]byte(body), &deposits) + err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &deposits) require.Nil(t, err) return deposits } @@ -958,9 +932,11 @@ func getDeposits(t *testing.T, port string, proposalID uint64) []gov.Deposit { func getTally(t *testing.T, port string, proposalID uint64) gov.TallyResult { res, body := Request(t, port, "GET", fmt.Sprintf("/gov/proposals/%d/tally", proposalID), nil) require.Equal(t, http.StatusOK, res.StatusCode, body) + var tally gov.TallyResult - err := cdc.UnmarshalJSON([]byte(body), &tally) + err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &tally) require.Nil(t, err) + return tally } @@ -1005,7 +981,7 @@ func getVotes(t *testing.T, port string, proposalID uint64) []gov.Vote { res, body := Request(t, port, "GET", fmt.Sprintf("/gov/proposals/%d/votes", proposalID), nil) require.Equal(t, http.StatusOK, res.StatusCode, body) var votes []gov.Vote - err := cdc.UnmarshalJSON([]byte(body), &votes) + err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &votes) require.Nil(t, err) return votes } @@ -1014,9 +990,11 @@ func getVotes(t *testing.T, port string, proposalID uint64) []gov.Vote { func getProposal(t *testing.T, port string, proposalID uint64) gov.Proposal { res, body := Request(t, port, "GET", fmt.Sprintf("/gov/proposals/%d", proposalID), nil) require.Equal(t, http.StatusOK, res.StatusCode, body) + var proposal gov.Proposal - err := cdc.UnmarshalJSON([]byte(body), &proposal) + err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &proposal) require.Nil(t, err) + return proposal } @@ -1024,9 +1002,11 @@ func getProposal(t *testing.T, port string, proposalID uint64) gov.Proposal { func getDeposit(t *testing.T, port string, proposalID uint64, depositorAddr sdk.AccAddress) gov.Deposit { res, body := Request(t, port, "GET", fmt.Sprintf("/gov/proposals/%d/deposits/%s", proposalID, depositorAddr), nil) require.Equal(t, http.StatusOK, res.StatusCode, body) + var deposit gov.Deposit - err := cdc.UnmarshalJSON([]byte(body), &deposit) + err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &deposit) require.Nil(t, err) + return deposit } @@ -1034,9 +1014,11 @@ func getDeposit(t *testing.T, port string, proposalID uint64, depositorAddr sdk. func getVote(t *testing.T, port string, proposalID uint64, voterAddr sdk.AccAddress) gov.Vote { res, body := Request(t, port, "GET", fmt.Sprintf("/gov/proposals/%d/votes/%s", proposalID, voterAddr), nil) require.Equal(t, http.StatusOK, res.StatusCode, body) + var vote gov.Vote - err := cdc.UnmarshalJSON([]byte(body), &vote) + err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &vote) require.Nil(t, err) + return vote } @@ -1046,7 +1028,7 @@ func getProposer(t *testing.T, port string, proposalID uint64) gcutils.Proposer require.Equal(t, http.StatusOK, res.StatusCode, body) var proposer gcutils.Proposer - err := cdc.UnmarshalJSON([]byte(body), &proposer) + err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &proposer) require.Nil(t, err) return proposer @@ -1058,8 +1040,9 @@ func getDepositParam(t *testing.T, port string) gov.DepositParams { require.Equal(t, http.StatusOK, res.StatusCode, body) var depositParams gov.DepositParams - err := cdc.UnmarshalJSON([]byte(body), &depositParams) + err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &depositParams) require.Nil(t, err) + return depositParams } @@ -1094,7 +1077,7 @@ func getSigningInfo(t *testing.T, port string, validatorPubKey string) slashing. require.Equal(t, http.StatusOK, res.StatusCode, body) var signingInfo slashing.ValidatorSigningInfo - err := cdc.UnmarshalJSON([]byte(body), &signingInfo) + err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &signingInfo) require.Nil(t, err) return signingInfo @@ -1109,7 +1092,7 @@ func getSigningInfoList(t *testing.T, port string) []slashing.ValidatorSigningIn require.Equal(t, http.StatusOK, res.StatusCode, body) var signingInfo []slashing.ValidatorSigningInfo - err := cdc.UnmarshalJSON([]byte(body), &signingInfo) + err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &signingInfo) require.Nil(t, err) return signingInfo diff --git a/lcd_test/lcd_test.go b/lcd_test/lcd_test.go index 5411250bb9f..bd76de050a5 100644 --- a/lcd_test/lcd_test.go +++ b/lcd_test/lcd_test.go @@ -7,7 +7,6 @@ import ( "fmt" "net/http" "os" - "regexp" "strings" "testing" "time" @@ -45,35 +44,6 @@ func init() { version.Version = os.Getenv("VERSION") } -func TestVersion(t *testing.T) { - // skip the test if the VERSION environment variable has not been set - if version.Version == "" { - t.SkipNow() - } - - cleanup, _, _, port, err := InitializeLCD(1, []sdk.AccAddress{}, true) - require.NoError(t, err) - defer cleanup() - - // node info - res, body := Request(t, port, "GET", "/version", nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - reg, err := regexp.Compile(`\d+\.\d+\.\d+.*`) - require.Nil(t, err) - match := reg.MatchString(body) - require.True(t, match, body, body) - - // node info - res, body = Request(t, port, "GET", "/node_version", nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - reg, err = regexp.Compile(`\d+\.\d+\.\d+.*`) - require.Nil(t, err) - match = reg.MatchString(body) - require.True(t, match, body) -} - func TestNodeStatus(t *testing.T) { cleanup, _, _, port, err := InitializeLCD(1, []sdk.AccAddress{}, true) require.NoError(t, err) @@ -452,7 +422,7 @@ func TestBonding(t *testing.T) { acc = getAccount(t, port, addr) coins := acc.GetCoins() expectedBalance := initialBalance[0].Sub(fees[0]) - require.Equal(t, expectedBalance.Amount.Sub(delTokens), coins.AmountOf(sdk.DefaultBondDenom)) + require.Equal(t, expectedBalance.Amount.Sub(delTokens).String(), coins.AmountOf(sdk.DefaultBondDenom).String()) expectedBalance = coins[0] // query delegation @@ -1036,12 +1006,12 @@ func TestDistributionFlow(t *testing.T) { var rewards sdk.DecCoins res, body := Request(t, port, "GET", fmt.Sprintf("/distribution/validators/%s/outstanding_rewards", valAddr), nil) require.Equal(t, http.StatusOK, res.StatusCode, body) - require.NoError(t, cdc.UnmarshalJSON([]byte(body), &rewards)) + require.NoError(t, cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &rewards)) var valDistInfo distrrest.ValidatorDistInfo res, body = Request(t, port, "GET", "/distribution/validators/"+valAddr.String(), nil) require.Equal(t, http.StatusOK, res.StatusCode, body) - require.NoError(t, cdc.UnmarshalJSON([]byte(body), &valDistInfo)) + require.NoError(t, cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &valDistInfo)) require.Equal(t, valDistInfo.OperatorAddress.String(), sdk.AccAddress(valAddr).String()) // Delegate some coins @@ -1058,40 +1028,40 @@ func TestDistributionFlow(t *testing.T) { // Query outstanding rewards changed res, body = Request(t, port, "GET", fmt.Sprintf("/distribution/validators/%s/outstanding_rewards", valAddr), nil) require.Equal(t, http.StatusOK, res.StatusCode, body) - require.NoError(t, cdc.UnmarshalJSON([]byte(body), &rewards)) + require.NoError(t, cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &rewards)) // Query validator distribution info res, body = Request(t, port, "GET", "/distribution/validators/"+valAddr.String(), nil) require.Equal(t, http.StatusOK, res.StatusCode, body) - require.NoError(t, cdc.UnmarshalJSON([]byte(body), &valDistInfo)) + require.NoError(t, cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &valDistInfo)) // Query validator's rewards res, body = Request(t, port, "GET", fmt.Sprintf("/distribution/validators/%s/rewards", valAddr), nil) require.Equal(t, http.StatusOK, res.StatusCode, body) - require.NoError(t, cdc.UnmarshalJSON([]byte(body), &rewards)) + require.NoError(t, cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &rewards)) // Query self-delegation res, body = Request(t, port, "GET", fmt.Sprintf("/distribution/delegators/%s/rewards/%s", operAddr, valAddr), nil) require.Equal(t, http.StatusOK, res.StatusCode, body) - require.NoError(t, cdc.UnmarshalJSON([]byte(body), &rewards)) + require.NoError(t, cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &rewards)) // Query delegation res, body = Request(t, port, "GET", fmt.Sprintf("/distribution/delegators/%s/rewards/%s", addr, valAddr), nil) require.Equal(t, http.StatusOK, res.StatusCode, body) - require.NoError(t, cdc.UnmarshalJSON([]byte(body), &rewards)) + require.NoError(t, cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &rewards)) // Query delegator's rewards total var delRewards disttypes.QueryDelegatorTotalRewardsResponse res, body = Request(t, port, "GET", fmt.Sprintf("/distribution/delegators/%s/rewards", operAddr), nil) require.Equal(t, http.StatusOK, res.StatusCode, body) - require.NoError(t, json.Unmarshal([]byte(body), &delRewards)) + require.NoError(t, json.Unmarshal(extractResultFromResponse(t, []byte(body)), &delRewards)) // Query delegator's withdrawal address var withdrawAddr string res, body = Request(t, port, "GET", fmt.Sprintf("/distribution/delegators/%s/withdraw_address", operAddr), nil) require.Equal(t, http.StatusOK, res.StatusCode, body) - require.NoError(t, cdc.UnmarshalJSON([]byte(body), &withdrawAddr)) + require.NoError(t, cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &withdrawAddr)) require.Equal(t, operAddr.String(), withdrawAddr) // Withdraw delegator's rewards @@ -1112,19 +1082,19 @@ func TestMintingQueries(t *testing.T) { require.Equal(t, http.StatusOK, res.StatusCode, body) var params mint.Params - require.NoError(t, cdc.UnmarshalJSON([]byte(body), ¶ms)) + require.NoError(t, cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), ¶ms)) res, body = Request(t, port, "GET", "/minting/inflation", nil) require.Equal(t, http.StatusOK, res.StatusCode, body) var inflation sdk.Dec - require.NoError(t, cdc.UnmarshalJSON([]byte(body), &inflation)) + require.NoError(t, cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &inflation)) res, body = Request(t, port, "GET", "/minting/annual-provisions", nil) require.Equal(t, http.StatusOK, res.StatusCode, body) var annualProvisions sdk.Dec - require.NoError(t, cdc.UnmarshalJSON([]byte(body), &annualProvisions)) + require.NoError(t, cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &annualProvisions)) } func TestAccountBalanceQuery(t *testing.T) { diff --git a/sims.mk b/sims.mk index 4a8d7f96535..4bed15cc849 100644 --- a/sims.mk +++ b/sims.mk @@ -7,53 +7,53 @@ SIMAPP = github.com/cosmos/gaia/app sim-gaia-nondeterminism: @echo "Running nondeterminism test..." - @go test -mod=readonly $(SIMAPP) -run TestAppStateDeterminism -SimulationEnabled=true -v -timeout 10m + @go test -mod=readonly $(SIMAPP) -run TestAppStateDeterminism -Enabled=true -v -timeout 10m sim-gaia-custom-genesis-fast: @echo "Running custom genesis simulation..." @echo "By default, ${HOME}/.gaiad/config/genesis.json will be used." - @go test -mod=readonly github.com/cosmos/gaia/app -run TestFullGaiaSimulation -SimulationGenesis=${HOME}/.gaiad/config/genesis.json \ - -SimulationEnabled=true -SimulationNumBlocks=100 -SimulationBlockSize=200 -SimulationCommit=true -SimulationSeed=99 -SimulationPeriod=5 -v -timeout 24h + @go test -mod=readonly $(SIMAPP) -run TestFullGaiaSimulation -Genesis=${HOME}/.gaiad/config/genesis.json \ + -Enabled=true -NumBlocks=100 -BlockSize=200 -Commit=true -Seed=99 -Period=5 -v -timeout 24h sim-gaia-fast: @echo "Running quick Gaia simulation. This may take several minutes..." - @go test -mod=readonly github.com/cosmos/gaia/app -run TestFullGaiaSimulation -SimulationEnabled=true -SimulationNumBlocks=100 -SimulationBlockSize=200 -SimulationCommit=true -SimulationSeed=99 -SimulationPeriod=5 -v -timeout 24h + @go test -mod=readonly $(SIMAPP) -run TestFullGaiaSimulation -Enabled=true -NumBlocks=100 -BlockSize=200 -Commit=true -Seed=99 -Period=5 -v -timeout 24h sim-gaia-import-export: runsim @echo "Running Gaia import/export simulation. This may take several minutes..." - $(GOPATH)/bin/runsim 25 5 TestGaiaImportExport + $(GOPATH)/bin/runsim $(SIMAPP) 25 5 TestGaiaImportExport sim-gaia-simulation-after-import: runsim @echo "Running Gaia simulation-after-import. This may take several minutes..." - $(GOPATH)/bin/runsim 25 5 TestGaiaSimulationAfterImport + $(GOPATH)/bin/runsim $(SIMAPP) 25 5 TestGaiaSimulationAfterImport sim-gaia-custom-genesis-multi-seed: runsim @echo "Running multi-seed custom genesis simulation..." @echo "By default, ${HOME}/.gaiad/config/genesis.json will be used." - $(GOPATH)/bin/runsim -g ${HOME}/.gaiad/config/genesis.json 400 5 TestFullGaiaSimulation + $(GOPATH)/bin/runsim $(SIMAPP) -g ${HOME}/.gaiad/config/genesis.json 400 5 TestFullGaiaSimulation sim-gaia-multi-seed: runsim @echo "Running multi-seed Gaia simulation. This may take awhile!" - $(GOPATH)/bin/runsim 400 5 TestFullGaiaSimulation + $(GOPATH)/bin/runsim $(SIMAPP) 400 5 TestFullGaiaSimulation sim-benchmark-invariants: @echo "Running simulation invariant benchmarks..." - @go test -mod=readonly github.com/cosmos/gaia/app -benchmem -bench=BenchmarkInvariants -run=^$ \ - -SimulationEnabled=true -SimulationNumBlocks=1000 -SimulationBlockSize=200 \ - -SimulationCommit=true -SimulationSeed=57 -v -timeout 24h + @go test -mod=readonly $(SIMAPP) -benchmem -bench=BenchmarkInvariants -run=^$ \ + -Enabled=true -NumBlocks=1000 -BlockSize=200 \ + -Commit=true -Seed=57 -v -timeout 24h SIM_NUM_BLOCKS ?= 500 SIM_BLOCK_SIZE ?= 200 SIM_COMMIT ?= true sim-gaia-benchmark: @echo "Running Gaia benchmark for numBlocks=$(SIM_NUM_BLOCKS), blockSize=$(SIM_BLOCK_SIZE). This may take awhile!" - @go test -mod=readonly -benchmem -run=^$$ github.com/cosmos/gaia/app -bench ^BenchmarkFullGaiaSimulation$$ \ - -SimulationEnabled=true -SimulationNumBlocks=$(SIM_NUM_BLOCKS) -SimulationBlockSize=$(SIM_BLOCK_SIZE) -SimulationCommit=$(SIM_COMMIT) -timeout 24h + @go test -mod=readonly -benchmem -run=^$$ $(SIMAPP) -bench ^BenchmarkFullGaiaSimulation$$ \ + -Enabled=true -NumBlocks=$(SIM_NUM_BLOCKS) -BlockSize=$(SIM_BLOCK_SIZE) -Commit=$(SIM_COMMIT) -timeout 24h sim-gaia-profile: @echo "Running Gaia benchmark for numBlocks=$(SIM_NUM_BLOCKS), blockSize=$(SIM_BLOCK_SIZE). This may take awhile!" - @go test -mod=readonly -benchmem -run=^$$ github.com/cosmos/gaia/app -bench ^BenchmarkFullGaiaSimulation$$ \ - -SimulationEnabled=true -SimulationNumBlocks=$(SIM_NUM_BLOCKS) -SimulationBlockSize=$(SIM_BLOCK_SIZE) -SimulationCommit=$(SIM_COMMIT) -timeout 24h -cpuprofile cpu.out -memprofile mem.out + @go test -mod=readonly -benchmem -run=^$$ $(SIMAPP) -bench ^BenchmarkFullGaiaSimulation$$ \ + -Enabled=true -NumBlocks=$(SIM_NUM_BLOCKS) -BlockSize=$(SIM_BLOCK_SIZE) -Commit=$(SIM_COMMIT) -timeout 24h -cpuprofile cpu.out -memprofile mem.out .PHONY: runsim sim-gaia-nondeterminism sim-gaia-custom-genesis-fast sim-gaia-fast sim-gaia-import-export \