Upgrade to Stargate commits

This commit is contained in:
Alex Peters
2020-08-12 17:43:28 +02:00
parent ff37dc68f2
commit bcb00d6017
88 changed files with 16224 additions and 7775 deletions

View File

@@ -7,26 +7,26 @@ import (
"os"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
wasmTypes "github.com/CosmWasm/go-cosmwasm/types"
"github.com/CosmWasm/wasmd/x/wasm/internal/keeper"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/module"
"github.com/cosmos/cosmos-sdk/x/auth"
authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper"
bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper"
"github.com/dvsekhvalnov/jose2go/base64url"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
abci "github.com/tendermint/tendermint/abci/types"
"github.com/tendermint/tendermint/crypto"
"github.com/tendermint/tendermint/crypto/ed25519"
"github.com/tendermint/tendermint/libs/kv"
"github.com/CosmWasm/wasmd/x/wasm/internal/keeper"
)
type testData struct {
module module.AppModule
ctx sdk.Context
acctKeeper auth.AccountKeeper
acctKeeper authkeeper.AccountKeeper
keeper Keeper
bankKeeper bankkeeper.Keeper
}
// returns a cleanup function, which must be defered on
@@ -35,12 +35,13 @@ func setupTest(t *testing.T) (testData, func()) {
require.NoError(t, err)
ctx, keepers := CreateTestInput(t, false, tempDir, "staking", nil, nil)
acctKeeper, keeper := keepers.AccountKeeper, keepers.WasmKeeper
acctKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.WasmKeeper, keepers.BankKeeper
data := testData{
module: NewAppModule(keeper),
ctx: ctx,
acctKeeper: acctKeeper,
keeper: keeper,
bankKeeper: bankKeeper,
}
cleanup := func() { os.RemoveAll(tempDir) }
return data, cleanup
@@ -74,32 +75,32 @@ func TestHandleCreate(t *testing.T) {
isValid bool
}{
"empty": {
msg: MsgStoreCode{},
msg: &MsgStoreCode{},
isValid: false,
},
"invalid wasm": {
msg: MsgStoreCode{
msg: &MsgStoreCode{
Sender: addr1,
WASMByteCode: []byte("foobar"),
},
isValid: false,
},
"valid wasm": {
msg: MsgStoreCode{
msg: &MsgStoreCode{
Sender: addr1,
WASMByteCode: testContract,
},
isValid: true,
},
"other valid wasm": {
msg: MsgStoreCode{
msg: &MsgStoreCode{
Sender: addr1,
WASMByteCode: maskContract,
},
isValid: true,
},
"old wasm (0.7)": {
msg: MsgStoreCode{
msg: &MsgStoreCode{
Sender: addr1,
WASMByteCode: oldContract,
},
@@ -113,8 +114,8 @@ func TestHandleCreate(t *testing.T) {
data, cleanup := setupTest(t)
defer cleanup()
h := data.module.NewHandler()
q := data.module.NewQuerierHandler()
h := data.module.Route().Handler()
q := data.module.LegacyQuerierHandler(nil)
res, err := h(data.ctx, tc.msg)
if !tc.isValid {
@@ -145,12 +146,12 @@ func TestHandleInstantiate(t *testing.T) {
defer cleanup()
deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000))
creator := createFakeFundedAccount(data.ctx, data.acctKeeper, deposit)
creator := createFakeFundedAccount(t, data.ctx, data.acctKeeper, data.bankKeeper, deposit)
h := data.module.NewHandler()
q := data.module.NewQuerierHandler()
h := data.module.Route().Handler()
q := data.module.LegacyQuerierHandler(nil)
msg := MsgStoreCode{
msg := &MsgStoreCode{
Sender: creator,
WASMByteCode: testContract,
}
@@ -175,7 +176,7 @@ func TestHandleInstantiate(t *testing.T) {
InitMsg: initMsgBz,
InitFunds: nil,
}
res, err = h(data.ctx, initCmd)
res, err = h(data.ctx, &initCmd)
require.NoError(t, err)
contractAddr := sdk.AccAddress(res.Data)
require.Equal(t, "cosmos18vd8fpwxzck93qlwghaj6arh4p7c5n89uzcee5", contractAddr.String())
@@ -204,13 +205,13 @@ func TestHandleExecute(t *testing.T) {
deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000))
topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000))
creator := createFakeFundedAccount(data.ctx, data.acctKeeper, deposit.Add(deposit...))
fred := createFakeFundedAccount(data.ctx, data.acctKeeper, topUp)
creator := createFakeFundedAccount(t, data.ctx, data.acctKeeper, data.bankKeeper, deposit.Add(deposit...))
fred := createFakeFundedAccount(t, data.ctx, data.acctKeeper, data.bankKeeper, topUp)
h := data.module.NewHandler()
q := data.module.NewQuerierHandler()
h := data.module.Route().Handler()
q := data.module.LegacyQuerierHandler(nil)
msg := MsgStoreCode{
msg := &MsgStoreCode{
Sender: creator,
WASMByteCode: testContract,
}
@@ -232,7 +233,7 @@ func TestHandleExecute(t *testing.T) {
InitMsg: initMsgBz,
InitFunds: deposit,
}
res, err = h(data.ctx, initCmd)
res, err = h(data.ctx, &initCmd)
require.NoError(t, err)
contractAddr := sdk.AccAddress(res.Data)
require.Equal(t, "cosmos18vd8fpwxzck93qlwghaj6arh4p7c5n89uzcee5", contractAddr.String())
@@ -252,12 +253,12 @@ func TestHandleExecute(t *testing.T) {
creatorAcct := data.acctKeeper.GetAccount(data.ctx, creator)
require.NotNil(t, creatorAcct)
// we started at 2*deposit, should have spent one above
assert.Equal(t, deposit, creatorAcct.GetCoins())
assert.Equal(t, deposit, data.bankKeeper.GetAllBalances(data.ctx, creatorAcct.GetAddress()))
// ensure contract has updated balance
contractAcct := data.acctKeeper.GetAccount(data.ctx, contractAddr)
require.NotNil(t, contractAcct)
assert.Equal(t, deposit, contractAcct.GetCoins())
assert.Equal(t, deposit, data.bankKeeper.GetAllBalances(data.ctx, contractAcct.GetAddress()))
execCmd := MsgExecuteContract{
Sender: fred,
@@ -265,11 +266,13 @@ func TestHandleExecute(t *testing.T) {
Msg: []byte(`{"release":{}}`),
SentFunds: topUp,
}
res, err = h(data.ctx, execCmd)
res, err = h(data.ctx, &execCmd)
require.NoError(t, err)
// this should be standard x/wasm init event, plus 2 bank send event, plus a special event from the contract
require.Equal(t, 4, len(res.Events), prettyEvents(res.Events))
assert.Equal(t, "transfer", res.Events[0].Type)
require.Equal(t, "transfer", res.Events[0].Type)
require.Len(t, res.Events[0].Attributes, 3)
assertAttribute(t, "recipient", contractAddr.String(), res.Events[0].Attributes[0])
assertAttribute(t, "sender", fred.String(), res.Events[0].Attributes[1])
assertAttribute(t, "amount", "5000denom", res.Events[0].Attributes[2])
@@ -289,13 +292,13 @@ func TestHandleExecute(t *testing.T) {
// ensure bob now exists and got both payments released
bobAcct = data.acctKeeper.GetAccount(data.ctx, bob)
require.NotNil(t, bobAcct)
balance := bobAcct.GetCoins()
balance := data.bankKeeper.GetAllBalances(data.ctx, bobAcct.GetAddress())
assert.Equal(t, deposit.Add(topUp...), balance)
// ensure contract has updated balance
contractAcct = data.acctKeeper.GetAccount(data.ctx, contractAddr)
require.NotNil(t, contractAcct)
assert.Equal(t, sdk.Coins(nil), contractAcct.GetCoins())
assert.Equal(t, sdk.Coins(nil), data.bankKeeper.GetAllBalances(data.ctx, contractAcct.GetAddress()))
// ensure all contract state is as after init
assertCodeList(t, q, data.ctx, 1)
@@ -316,12 +319,12 @@ func TestHandleExecuteEscrow(t *testing.T) {
deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000))
topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000))
creator := createFakeFundedAccount(data.ctx, data.acctKeeper, deposit.Add(deposit...))
fred := createFakeFundedAccount(data.ctx, data.acctKeeper, topUp)
creator := createFakeFundedAccount(t, data.ctx, data.acctKeeper, data.bankKeeper, deposit.Add(deposit...))
fred := createFakeFundedAccount(t, data.ctx, data.acctKeeper, data.bankKeeper, topUp)
h := data.module.NewHandler()
h := data.module.Route().Handler()
msg := MsgStoreCode{
msg := &MsgStoreCode{
Sender: creator,
WASMByteCode: testContract,
}
@@ -343,7 +346,7 @@ func TestHandleExecuteEscrow(t *testing.T) {
InitMsg: initMsgBz,
InitFunds: deposit,
}
res, err = h(data.ctx, initCmd)
res, err = h(data.ctx, &initCmd)
require.NoError(t, err)
contractAddr := sdk.AccAddress(res.Data)
require.Equal(t, "cosmos18vd8fpwxzck93qlwghaj6arh4p7c5n89uzcee5", contractAddr.String())
@@ -360,19 +363,19 @@ func TestHandleExecuteEscrow(t *testing.T) {
Msg: handleMsgBz,
SentFunds: topUp,
}
res, err = h(data.ctx, execCmd)
res, err = h(data.ctx, &execCmd)
require.NoError(t, err)
// ensure bob now exists and got both payments released
bobAcct := data.acctKeeper.GetAccount(data.ctx, bob)
require.NotNil(t, bobAcct)
balance := bobAcct.GetCoins()
balance := data.bankKeeper.GetAllBalances(data.ctx, bobAcct.GetAddress())
assert.Equal(t, deposit.Add(topUp...), balance)
// ensure contract has updated balance
contractAcct := data.acctKeeper.GetAccount(data.ctx, contractAddr)
require.NotNil(t, contractAcct)
assert.Equal(t, sdk.Coins(nil), contractAcct.GetCoins())
assert.Equal(t, sdk.Coins(nil), data.bankKeeper.GetAllBalances(data.ctx, contractAcct.GetAddress()))
}
type prettyEvent struct {
@@ -380,7 +383,7 @@ type prettyEvent struct {
Attr []sdk.Attribute
}
func prettyEvents(evts sdk.Events) string {
func prettyEvents(evts []abci.Event) string {
res := make([]prettyEvent, len(evts))
for i, e := range evts {
res[i] = prettyEvent{
@@ -395,7 +398,7 @@ func prettyEvents(evts sdk.Events) string {
return string(bz)
}
func prettyAttrs(attrs []kv.Pair) []sdk.Attribute {
func prettyAttrs(attrs []abci.EventAttribute) []sdk.Attribute {
pretty := make([]sdk.Attribute, len(attrs))
for i, a := range attrs {
pretty[i] = prettyAttr(a)
@@ -403,11 +406,12 @@ func prettyAttrs(attrs []kv.Pair) []sdk.Attribute {
return pretty
}
func prettyAttr(attr kv.Pair) sdk.Attribute {
func prettyAttr(attr abci.EventAttribute) sdk.Attribute {
return sdk.NewAttribute(string(attr.Key), string(attr.Value))
}
func assertAttribute(t *testing.T, key string, value string, attr kv.Pair) {
func assertAttribute(t *testing.T, key string, value string, attr abci.EventAttribute) {
t.Helper()
assert.Equal(t, key, string(attr.Key), prettyAttr(attr))
assert.Equal(t, value, string(attr.Value), prettyAttr(attr))
}
@@ -433,17 +437,19 @@ func assertCodeBytes(t *testing.T, q sdk.Querier, ctx sdk.Context, codeID uint64
bz, sdkerr := q(ctx, path, abci.RequestQuery{})
require.NoError(t, sdkerr)
if len(bz) == 0 {
require.Equal(t, len(expectedBytes), 0)
if len(expectedBytes) == 0 {
require.Equal(t, len(bz), 0, "%q", string(bz))
return
}
var res GetCodeResponse
var res map[string]interface{}
err := json.Unmarshal(bz, &res)
require.NoError(t, err)
assert.Equal(t, expectedBytes, res.Data)
assert.Equal(t, codeID, res.ID)
require.Contains(t, res, "data")
b, err := base64url.Decode(res["data"].(string))
require.NoError(t, err)
assert.Equal(t, expectedBytes, b)
assert.EqualValues(t, codeID, res["id"])
}
func assertContractList(t *testing.T, q sdk.Querier, ctx sdk.Context, codeID uint64, addrs []string) {
@@ -468,6 +474,7 @@ func assertContractList(t *testing.T, q sdk.Querier, ctx sdk.Context, codeID uin
}
func assertContractState(t *testing.T, q sdk.Querier, ctx sdk.Context, addr sdk.AccAddress, expected state) {
t.Helper()
path := []string{QueryGetContractState, addr.String(), keeper.QueryMethodContractStateAll}
bz, sdkerr := q(ctx, path, abci.RequestQuery{})
require.NoError(t, sdkerr)
@@ -484,6 +491,7 @@ func assertContractState(t *testing.T, q sdk.Querier, ctx sdk.Context, addr sdk.
}
func assertContractInfo(t *testing.T, q sdk.Querier, ctx sdk.Context, addr sdk.AccAddress, codeID uint64, creator sdk.AccAddress) {
t.Helper()
path := []string{QueryGetContract, addr.String()}
bz, sdkerr := q(ctx, path, abci.RequestQuery{})
require.NoError(t, sdkerr)
@@ -496,11 +504,11 @@ func assertContractInfo(t *testing.T, q sdk.Querier, ctx sdk.Context, addr sdk.A
assert.Equal(t, creator, res.Creator)
}
func createFakeFundedAccount(ctx sdk.Context, am auth.AccountKeeper, coins sdk.Coins) sdk.AccAddress {
func createFakeFundedAccount(t *testing.T, ctx sdk.Context, am authkeeper.AccountKeeper, bankKeeper bankkeeper.Keeper, coins sdk.Coins) sdk.AccAddress {
t.Helper()
_, _, addr := keyPubAddr()
baseAcct := auth.NewBaseAccountWithAddress(addr)
_ = baseAcct.SetCoins(coins)
am.SetAccount(ctx, &baseAcct)
acc := am.NewAccountWithAddress(ctx, addr)
am.SetAccount(ctx, acc)
require.NoError(t, bankKeeper.SetBalances(ctx, addr, coins))
return addr
}