87 lines
2.7 KiB
Go
87 lines
2.7 KiB
Go
package simulation
|
|
|
|
import (
|
|
"math/rand"
|
|
"time"
|
|
|
|
"github.com/cosmos/cosmos-sdk/baseapp"
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
abci "github.com/tendermint/tendermint/abci/types"
|
|
"github.com/tendermint/tendermint/crypto"
|
|
)
|
|
|
|
type (
|
|
// Operation runs a state machine transition,
|
|
// and ensures the transition happened as expected.
|
|
// The operation could be running and testing a fuzzed transaction,
|
|
// or doing the same for a message.
|
|
//
|
|
// For ease of debugging,
|
|
// an operation returns a descriptive message "action",
|
|
// which details what this fuzzed state machine transition actually did.
|
|
//
|
|
// Operations can optionally provide a list of "FutureOperations" to run later
|
|
// These will be ran at the beginning of the corresponding block.
|
|
Operation func(r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context,
|
|
accounts []Account, event func(string),
|
|
) (action string, futureOperations []FutureOperation, err error)
|
|
|
|
// RandSetup performs the random setup the mock module needs.
|
|
RandSetup func(r *rand.Rand, accounts []Account)
|
|
|
|
// An Invariant is a function which tests a particular invariant.
|
|
// If the invariant has been broken, it should return an error
|
|
// containing a descriptive message about what happened.
|
|
// The simulator will then halt and print the logs.
|
|
Invariant func(app *baseapp.BaseApp) error
|
|
|
|
// Account contains a privkey, pubkey, address tuple
|
|
// eventually more useful data can be placed in here.
|
|
// (e.g. number of coins)
|
|
Account struct {
|
|
PrivKey crypto.PrivKey
|
|
PubKey crypto.PubKey
|
|
Address sdk.AccAddress
|
|
}
|
|
|
|
mockValidator struct {
|
|
val abci.ValidatorUpdate
|
|
livenessState int
|
|
}
|
|
|
|
// FutureOperation is an operation which will be ran at the
|
|
// beginning of the provided BlockHeight.
|
|
// If both a BlockHeight and BlockTime are specified, it will use the BlockHeight.
|
|
// In the (likely) event that multiple operations are queued at the same
|
|
// block height, they will execute in a FIFO pattern.
|
|
FutureOperation struct {
|
|
BlockHeight int
|
|
BlockTime time.Time
|
|
Op Operation
|
|
}
|
|
|
|
// WeightedOperation is an operation with associated weight.
|
|
// This is used to bias the selection operation within the simulator.
|
|
WeightedOperation struct {
|
|
Weight int
|
|
Op Operation
|
|
}
|
|
)
|
|
|
|
// PeriodicInvariant returns an Invariant function closure that asserts
|
|
// a given invariant if the mock application's last block modulo the given
|
|
// period is congruent to the given offset.
|
|
func PeriodicInvariant(invariant Invariant, period int, offset int) Invariant {
|
|
return func(app *baseapp.BaseApp) error {
|
|
if int(app.LastBlockHeight())%period == offset {
|
|
return invariant(app)
|
|
}
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// nolint
|
|
func (acc Account) Equals(acc2 Account) bool {
|
|
return acc.Address.Equals(acc2.Address)
|
|
}
|