package gov import ( "bytes" "log" "sort" "testing" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/crypto" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/bank" "github.com/cosmos/cosmos-sdk/x/mock" "github.com/cosmos/cosmos-sdk/x/stake" ) // initialize the mock application for this module func getMockApp(t *testing.T, numGenAccs int) (*mock.App, Keeper, stake.Keeper, []sdk.AccAddress, []crypto.PubKey, []crypto.PrivKey) { mapp := mock.NewApp() stake.RegisterWire(mapp.Cdc) RegisterWire(mapp.Cdc) keyStake := sdk.NewKVStoreKey("stake") keyGov := sdk.NewKVStoreKey("gov") ck := bank.NewKeeper(mapp.AccountMapper) sk := stake.NewKeeper(mapp.Cdc, keyStake, ck, mapp.RegisterCodespace(stake.DefaultCodespace)) keeper := NewKeeper(mapp.Cdc, keyGov, ck, sk, DefaultCodespace) mapp.Router().AddRoute("gov", NewHandler(keeper)) require.NoError(t, mapp.CompleteSetup([]*sdk.KVStoreKey{keyStake, keyGov})) mapp.SetEndBlocker(getEndBlocker(keeper)) mapp.SetInitChainer(getInitChainer(mapp, keeper, sk)) genAccs, addrs, pubKeys, privKeys := mock.CreateGenAccounts(numGenAccs, sdk.Coins{sdk.NewCoin("steak", 42)}) mock.SetGenesis(mapp, genAccs) return mapp, keeper, sk, addrs, pubKeys, privKeys } // gov and stake endblocker func getEndBlocker(keeper Keeper) sdk.EndBlocker { return func(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { tags, _ := EndBlocker(ctx, keeper) return abci.ResponseEndBlock{ Tags: tags, } } } // gov and stake initchainer func getInitChainer(mapp *mock.App, keeper Keeper, stakeKeeper stake.Keeper) sdk.InitChainer { return func(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { mapp.InitChainer(ctx, req) stakeGenesis := stake.DefaultGenesisState() stakeGenesis.Pool.LooseTokens = sdk.NewRat(100000) err := stake.InitGenesis(ctx, stakeKeeper, stakeGenesis) if err != nil { panic(err) } InitGenesis(ctx, keeper, DefaultGenesisState()) return abci.ResponseInitChain{} } } // Sorts Addresses func SortAddresses(addrs []sdk.AccAddress) { var byteAddrs [][]byte for _, addr := range addrs { byteAddrs = append(byteAddrs, addr.Bytes()) } SortByteArrays(byteAddrs) for i, byteAddr := range byteAddrs { addrs[i] = byteAddr } } // implement `Interface` in sort package. type sortByteArrays [][]byte func (b sortByteArrays) Len() int { return len(b) } func (b sortByteArrays) Less(i, j int) bool { // bytes package already implements Comparable for []byte. switch bytes.Compare(b[i], b[j]) { case -1: return true case 0, 1: return false default: log.Panic("not fail-able with `bytes.Comparable` bounded [-1, 1].") return false } } func (b sortByteArrays) Swap(i, j int) { b[j], b[i] = b[i], b[j] } // Public func SortByteArrays(src [][]byte) [][]byte { sorted := sortByteArrays(src) sort.Sort(sorted) return sorted }