package app_test import ( "os" "testing" "time" "cosmos-test/app" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" simulationtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/cosmos/cosmos-sdk/x/simulation" "github.com/ignite/cli/ignite/pkg/cosmoscmd" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmtypes "github.com/tendermint/tendermint/types" ) func init() { simapp.GetSimulatorFlags() } type SimApp interface { cosmoscmd.App GetBaseApp() *baseapp.BaseApp AppCodec() codec.Codec SimulationManager() *module.SimulationManager ModuleAccountAddrs() map[string]bool Name() string LegacyAmino() *codec.LegacyAmino BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock InitChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain } var defaultConsensusParams = &abci.ConsensusParams{ Block: &abci.BlockParams{ MaxBytes: 200000, MaxGas: 2000000, }, Evidence: &tmproto.EvidenceParams{ MaxAgeNumBlocks: 302400, MaxAgeDuration: 504 * time.Hour, // 3 weeks is the max duration MaxBytes: 10000, }, Validator: &tmproto.ValidatorParams{ PubKeyTypes: []string{ tmtypes.ABCIPubKeyTypeEd25519, }, }, } // BenchmarkSimulation run the chain simulation // Running using starport command: // `starport chain simulate -v --numBlocks 200 --blockSize 50` // Running as go benchmark test: // `go test -benchmem -run=^$ -bench ^BenchmarkSimulation ./app -NumBlocks=200 -BlockSize 50 -Commit=true -Verbose=true -Enabled=true` func BenchmarkSimulation(b *testing.B) { simapp.FlagEnabledValue = true simapp.FlagCommitValue = true config, db, dir, logger, _, err := simapp.SetupSimulation("goleveldb-app-sim", "Simulation") require.NoError(b, err, "simulation setup failed") b.Cleanup(func() { db.Close() err = os.RemoveAll(dir) require.NoError(b, err) }) encoding := cosmoscmd.MakeEncodingConfig(app.ModuleBasics) app := app.New( logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, 0, encoding, simapp.EmptyAppOptions{}, ) simApp, ok := app.(SimApp) require.True(b, ok, "can't use simapp") // Run randomized simulations _, simParams, simErr := simulation.SimulateFromSeed( b, os.Stdout, simApp.GetBaseApp(), simapp.AppStateFn(simApp.AppCodec(), simApp.SimulationManager()), simulationtypes.RandomAccounts, simapp.SimulationOperations(simApp, simApp.AppCodec(), config), simApp.ModuleAccountAddrs(), config, simApp.AppCodec(), ) // export state and simParams before the simulation error is checked err = simapp.CheckExportSimulation(simApp, config, simParams) require.NoError(b, err) require.NoError(b, simErr) if config.Commit { simapp.PrintStats(db) } }