generated from dymensionxyz/rollapp
-
Notifications
You must be signed in to change notification settings - Fork 21
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Faulty Tolly
committed
Nov 29, 2024
1 parent
8ed1efc
commit efbfcc3
Showing
10 changed files
with
337 additions
and
66 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,239 @@ | ||
package apptesting | ||
|
||
import ( | ||
"fmt" | ||
"time" | ||
|
||
"github.com/cosmos/cosmos-sdk/baseapp" | ||
"github.com/cosmos/cosmos-sdk/client" | ||
"github.com/cosmos/cosmos-sdk/store/rootmulti" | ||
sdk "github.com/cosmos/cosmos-sdk/types" | ||
"github.com/cosmos/cosmos-sdk/types/tx/signing" | ||
authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" | ||
"github.com/cosmos/cosmos-sdk/x/bank/testutil" | ||
distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" | ||
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" | ||
"github.com/stretchr/testify/suite" | ||
abci "github.com/tendermint/tendermint/abci/types" | ||
"github.com/tendermint/tendermint/crypto/ed25519" | ||
"github.com/tendermint/tendermint/libs/log" | ||
tmtypes "github.com/tendermint/tendermint/proto/tendermint/types" | ||
dbm "github.com/tendermint/tm-db" | ||
|
||
minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" | ||
"github.com/dymensionxyz/rollapp-wasm/app" | ||
) | ||
|
||
type KeeperTestHelper struct { | ||
suite.Suite | ||
|
||
App *app.App | ||
Ctx sdk.Context | ||
QueryHelper *baseapp.QueryServiceTestHelper | ||
TestAccs []sdk.AccAddress | ||
} | ||
|
||
// Setup sets up basic environment for suite (App, Ctx, and test accounts) | ||
func (s *KeeperTestHelper) Setup() { | ||
s.App = app.Setup(false) | ||
s.Ctx = s.App.BaseApp.NewContext(false, tmtypes.Header{Height: 1, ChainID: "osmosis-1", Time: time.Now().UTC()}) | ||
s.QueryHelper = &baseapp.QueryServiceTestHelper{ | ||
GRPCQueryRouter: s.App.GRPCQueryRouter(), | ||
Ctx: s.Ctx, | ||
} | ||
s.TestAccs = CreateRandomAccounts(3) | ||
} | ||
|
||
func (s *KeeperTestHelper) SetupTestForInitGenesis() { | ||
// Setting to True, leads to init genesis not running | ||
s.App = app.Setup(true) | ||
s.Ctx = s.App.BaseApp.NewContext(true, tmtypes.Header{}) | ||
} | ||
|
||
// CreateTestContext creates a test context. | ||
func (s *KeeperTestHelper) CreateTestContext() sdk.Context { | ||
ctx, _ := s.CreateTestContextWithMultiStore() | ||
return ctx | ||
} | ||
|
||
// CreateTestContextWithMultiStore creates a test context and returns it together with multi store. | ||
func (s *KeeperTestHelper) CreateTestContextWithMultiStore() (sdk.Context, sdk.CommitMultiStore) { | ||
db := dbm.NewMemDB() | ||
logger := log.NewNopLogger() | ||
|
||
ms := rootmulti.NewStore(db, logger) | ||
|
||
return sdk.NewContext(ms, tmtypes.Header{}, false, logger), ms | ||
} | ||
|
||
// CreateTestContext creates a test context. | ||
func (s *KeeperTestHelper) Commit() { | ||
oldHeight := s.Ctx.BlockHeight() | ||
oldHeader := s.Ctx.BlockHeader() | ||
s.App.Commit() | ||
newHeader := tmtypes.Header{Height: oldHeight + 1, ChainID: oldHeader.ChainID, Time: oldHeader.Time.Add(time.Second)} | ||
s.App.BeginBlock(abci.RequestBeginBlock{Header: newHeader}) | ||
s.Ctx = s.App.NewContext(false, newHeader) | ||
} | ||
|
||
// FundAcc funds target address with specified amount. | ||
func (s *KeeperTestHelper) FundAcc(acc sdk.AccAddress, amounts sdk.Coins) { | ||
err := testutil.FundAccount(s.App.BankKeeper, s.Ctx, acc, amounts) | ||
s.Require().NoError(err) | ||
} | ||
|
||
// FundModuleAcc funds target modules with specified amount. | ||
func (s *KeeperTestHelper) FundModuleAcc(moduleName string, amounts sdk.Coins) { | ||
err := testutil.FundModuleAccount(s.App.BankKeeper, s.Ctx, moduleName, amounts) | ||
s.Require().NoError(err) | ||
} | ||
|
||
func (s *KeeperTestHelper) MintCoins(coins sdk.Coins) { | ||
err := s.App.BankKeeper.MintCoins(s.Ctx, minttypes.ModuleName, coins) | ||
s.Require().NoError(err) | ||
} | ||
|
||
// SetupValidator sets up a validator and returns the ValAddress. | ||
func (s *KeeperTestHelper) SetupValidator(bondStatus stakingtypes.BondStatus) sdk.ValAddress { | ||
/* | ||
valPub := secp256k1.GenPrivKey().PubKey() | ||
valAddr := sdk.ValAddress(valPub.Address()) | ||
bondDenom := s.App.StakingKeeper.GetParams(s.Ctx).BondDenom | ||
selfBond := sdk.NewCoins(sdk.Coin{Amount: sdk.NewInt(100), Denom: bondDenom}) | ||
s.FundAcc(sdk.AccAddress(valAddr), selfBond) | ||
stakingHandler := staking.NewHandler(s.App.StakingKeeper) | ||
stakingCoin := sdk.NewCoin(sdk.DefaultBondDenom, selfBond[0].Amount) | ||
ZeroCommission := stakingtypes.NewCommissionRates(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()) | ||
msg, err := stakingtypes.NewMsgCreateValidator(valAddr, valPub, stakingCoin, stakingtypes.Description{}, ZeroCommission, sdk.OneInt()) | ||
s.Require().NoError(err) | ||
res, err := stakingHandler(s.Ctx, msg) | ||
s.Require().NoError(err) | ||
s.Require().NotNil(res) | ||
val, found := s.App.StakingKeeper.GetValidator(s.Ctx, valAddr) | ||
s.Require().True(found) | ||
val = val.UpdateStatus(bondStatus) | ||
s.App.StakingKeeper.SetValidator(s.Ctx, val) | ||
return valAddr | ||
*/ | ||
|
||
return sdk.ValAddress("cookies") | ||
} | ||
|
||
// BeginNewBlock starts a new block. | ||
func (s *KeeperTestHelper) BeginNewBlock() { | ||
var valAddr []byte | ||
|
||
validators := s.App.StakingKeeper.GetAllValidators(s.Ctx) | ||
if len(validators) >= 1 { | ||
valAddrFancy, err := validators[0].GetConsAddr() | ||
s.Require().NoError(err) | ||
valAddr = valAddrFancy.Bytes() | ||
} else { | ||
valAddrFancy := s.SetupValidator(stakingtypes.Bonded) | ||
validator, _ := s.App.StakingKeeper.GetValidator(s.Ctx, valAddrFancy) | ||
valAddr2, _ := validator.GetConsAddr() | ||
valAddr = valAddr2.Bytes() | ||
} | ||
|
||
s.BeginNewBlockWithProposer(valAddr) | ||
} | ||
|
||
// BeginNewBlockWithProposer begins a new block with a proposer. | ||
func (s *KeeperTestHelper) BeginNewBlockWithProposer(proposer sdk.ValAddress) { | ||
validator, found := s.App.StakingKeeper.GetValidator(s.Ctx, proposer) | ||
s.Assert().True(found) | ||
|
||
valConsAddr, err := validator.GetConsAddr() | ||
s.Require().NoError(err) | ||
|
||
valAddr := valConsAddr.Bytes() | ||
|
||
newBlockTime := s.Ctx.BlockTime().Add(5 * time.Second) | ||
|
||
header := tmtypes.Header{Height: s.Ctx.BlockHeight() + 1, Time: newBlockTime} | ||
newCtx := s.Ctx.WithBlockTime(newBlockTime).WithBlockHeight(s.Ctx.BlockHeight() + 1) | ||
s.Ctx = newCtx | ||
lastCommitInfo := abci.LastCommitInfo{ | ||
Votes: []abci.VoteInfo{{ | ||
Validator: abci.Validator{Address: valAddr, Power: 1000}, | ||
SignedLastBlock: true, | ||
}}, | ||
} | ||
reqBeginBlock := abci.RequestBeginBlock{Header: header, LastCommitInfo: lastCommitInfo} | ||
|
||
fmt.Println("beginning block ", s.Ctx.BlockHeight()) | ||
s.App.BeginBlocker(s.Ctx, reqBeginBlock) | ||
} | ||
|
||
// EndBlock ends the block. | ||
func (s *KeeperTestHelper) EndBlock() { | ||
reqEndBlock := abci.RequestEndBlock{Height: s.Ctx.BlockHeight()} | ||
s.App.EndBlocker(s.Ctx, reqEndBlock) | ||
} | ||
|
||
// AllocateRewardsToValidator allocates reward tokens to a distribution module then allocates rewards to the validator address. | ||
func (s *KeeperTestHelper) AllocateRewardsToValidator(valAddr sdk.ValAddress, rewardAmt sdk.Int) { | ||
validator, found := s.App.StakingKeeper.GetValidator(s.Ctx, valAddr) | ||
s.Require().True(found) | ||
|
||
// allocate reward tokens to distribution module | ||
coins := sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, rewardAmt)} | ||
err := testutil.FundModuleAccount(s.App.BankKeeper, s.Ctx, distrtypes.ModuleName, coins) | ||
s.Require().NoError(err) | ||
|
||
// allocate rewards to validator | ||
s.Ctx = s.Ctx.WithBlockHeight(s.Ctx.BlockHeight() + 1) | ||
decTokens := sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDec(20000)}} | ||
s.App.DistrKeeper.AllocateTokensToValidator(s.Ctx, validator, decTokens) | ||
} | ||
|
||
// BuildTx builds a transaction. | ||
func (s *KeeperTestHelper) BuildTx( | ||
txBuilder client.TxBuilder, | ||
msgs []sdk.Msg, | ||
sigV2 signing.SignatureV2, | ||
memo string, txFee sdk.Coins, | ||
gasLimit uint64, | ||
) authsigning.Tx { | ||
err := txBuilder.SetMsgs(msgs[0]) | ||
s.Require().NoError(err) | ||
|
||
err = txBuilder.SetSignatures(sigV2) | ||
s.Require().NoError(err) | ||
|
||
txBuilder.SetMemo(memo) | ||
txBuilder.SetFeeAmount(txFee) | ||
txBuilder.SetGasLimit(gasLimit) | ||
|
||
return txBuilder.GetTx() | ||
} | ||
|
||
// CreateRandomAccounts is a function return a list of randomly generated AccAddresses | ||
func CreateRandomAccounts(numAccts int) []sdk.AccAddress { | ||
testAddrs := make([]sdk.AccAddress, numAccts) | ||
for i := 0; i < numAccts; i++ { | ||
pk := ed25519.GenPrivKey().PubKey() | ||
testAddrs[i] = sdk.AccAddress(pk.Address()) | ||
} | ||
|
||
return testAddrs | ||
} | ||
|
||
// AssertEventEmitted asserts that ctx's event manager has emitted the given number of events | ||
// of the given type. | ||
func (s *KeeperTestHelper) AssertEventEmitted(ctx sdk.Context, eventTypeExpected string, numEventsExpected int) { | ||
allEvents := ctx.EventManager().Events() | ||
// filter out other events | ||
actualEvents := make([]sdk.Event, 0) | ||
for _, event := range allEvents { | ||
if event.Type == eventTypeExpected { | ||
actualEvents = append(actualEvents, event) | ||
} | ||
} | ||
s.Equal(numEventsExpected, len(actualEvents)) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.