wasmd/app/integration/integration_test.go

103 lines
2.8 KiB
Go

package integration
import (
"encoding/binary"
"fmt"
"testing"
"github.com/cosmwasm/wasmd/app"
"github.com/stretchr/testify/require"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/auth"
authExported "github.com/cosmos/cosmos-sdk/x/auth/exported"
"github.com/cosmos/cosmos-sdk/x/bank"
"github.com/tendermint/tendermint/crypto"
// "github.com/tendermint/tendermint/crypto/ed25519"
"github.com/tendermint/tendermint/crypto/secp256k1"
)
// CreateTestApp will create a new wasmd application and provide money to every address
// listed there
func CreateTestApp(t *testing.T, accounts []*auth.BaseAccount) *app.WasmApp {
fmt.Printf("%#v\n", accounts[1])
genAccounts := make([]authExported.GenesisAccount, len(accounts))
for i, acct := range accounts {
genAccounts[i] = acct
}
wasmd := SetupWithGenesisAccounts(genAccounts)
return wasmd
}
func TestSendWithApp(t *testing.T) {
// TODO: figure out how to get valid sigs
t.Skip("Disabled until I get valid sigs")
// TODO: how to change default coin?
coin := sdk.NewCoins(sdk.NewInt64Coin("stake", 123456))
accts, keys := genAccountsWithKey(t, coin, 2)
wasm := CreateTestApp(t, accts)
// TODO: check account balance first
msg := bank.MsgSend{
FromAddress: accts[0].Address,
ToAddress: accts[1].Address,
Amount: sdk.NewCoins(sdk.NewInt64Coin("stake", 20)),
}
_ = sign(t, wasm, msg, &keys[0], true)
}
func sign(t *testing.T, wasm *app.WasmApp, msg sdk.Msg, signer *signer, expectPass bool) *sdk.Result {
_, res, _ := SignAndDeliver(t, wasm, []sdk.Msg{msg}, []uint64{signer.acctNum}, []uint64{signer.seq}, expectPass, signer.priv)
if expectPass {
signer.seq++
}
return res
}
type signer struct {
priv crypto.PrivKey
seq uint64
acctNum uint64
}
func genAccountsWithKey(t *testing.T, coins sdk.Coins, n int) ([]*auth.BaseAccount, []signer) {
accts := make([]*auth.BaseAccount, n)
keys := make([]signer, n)
for i := range accts {
priv, pub, addr := maskKeyPubAddr()
baseAcct := auth.NewBaseAccountWithAddress(addr)
err := baseAcct.SetCoins(coins)
require.NoError(t, err)
baseAcct.SetPubKey(pub)
baseAcct.SetAccountNumber(uint64(i + 1))
baseAcct.SetSequence(1)
accts[i] = &baseAcct
keys[i] = signer{
priv: priv,
acctNum: baseAcct.GetAccountNumber(),
seq: baseAcct.GetSequence(),
}
}
return accts, keys
}
var maskKeyCounter uint64 = 0
// we need to make this deterministic (same every test run), as encoded address size and thus gas cost,
// depends on the actual bytes (due to ugly CanonicalAddress encoding)
func maskKeyPubAddr() (crypto.PrivKey, crypto.PubKey, sdk.AccAddress) {
maskKeyCounter++
seed := make([]byte, 8)
binary.BigEndian.PutUint64(seed, maskKeyCounter)
key := secp256k1.GenPrivKeySecp256k1(seed)
pub := key.PubKey()
addr := sdk.AccAddress(pub.Address())
return key, pub, addr
}