Skip to content

Commit

Permalink
Test IBC handshake
Browse files Browse the repository at this point in the history
  • Loading branch information
ethanfrey committed Jan 18, 2021
1 parent 5e9d3b5 commit 08b1d6b
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 0 deletions.
17 changes: 17 additions & 0 deletions api/mocks.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,23 @@ func MockInfoBin(t *testing.T, sender types.HumanAddress) []byte {
return bin
}

func MockIBCChannel(channelID string, ordering types.IBCOrder, ibcVersion string) types.IBCChannel {
return types.IBCChannel{
Endpoint: types.IBCEndpoint{
PortID: "my_port",
ChannelID: channelID,
},
CounterpartyEndpoint: types.IBCEndpoint{
PortID: "their_port",
ChannelID: "channel-7",
},
Order: ordering,
Version: ibcVersion,
CounterpartyVersion: ibcVersion,
ConnectionID: "connection-3",
}
}

/*** Mock GasMeter ****/
// This code is borrowed from Cosmos-SDK store/types/gas.go

Expand Down
74 changes: 74 additions & 0 deletions ibc_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package cosmwasm

import (
"encoding/json"
"github.com/CosmWasm/wasmvm/api"
"github.com/CosmWasm/wasmvm/types"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"io/ioutil"
"testing"
Expand All @@ -21,3 +25,73 @@ func TestIBC(t *testing.T) {
require.NoError(t, err)
require.Equal(t, WasmCode(wasm), code)
}

type IBCInitMsg struct {
ReflectCodeID uint64 `json:"reflect_code_id"`
}

func toBytes(t *testing.T, v interface{}) []byte {
bz, err := json.Marshal(v)
require.NoError(t, err)
return bz
}

func TestIBCHandshake(t *testing.T) {
// code id of the reflect contract
const REFLECT_ID uint64 = 101
// address of first reflect contract instance that we created
const REFLECT_ADDR = "reflect-acct-1"
// channel id for handshake
const CHANNEL_ID = "channel-432"

vm := withVM(t)
id := createTestContract(t, vm, IBC_TEST_CONTRACT)
gasMeter1 := api.NewMockGasMeter(TESTING_GAS_LIMIT)
// instantiate it with this store
store := api.NewLookup(gasMeter1)
goapi := api.NewMockAPI()
balance := types.Coins{}
querier := api.DefaultQuerier(api.MOCK_CONTRACT_ADDR, balance)

// init
env := api.MockEnv()
info := api.MockInfo("creator", nil)
msg := IBCInitMsg{
ReflectCodeID: REFLECT_ID,
}
ires, _, err := vm.Instantiate(id, env, info, toBytes(t, msg), store, *goapi, querier, gasMeter1, TESTING_GAS_LIMIT)
require.NoError(t, err)
require.Equal(t, 0, len(ires.Messages))

// channel open
gasMeter2 := api.NewMockGasMeter(TESTING_GAS_LIMIT)
store.SetGasMeter(gasMeter2)
env = api.MockEnv()
// fails on bad version
channel := api.MockIBCChannel(CHANNEL_ID, types.Ordered, "random-garbage")
_, err = vm.IBCChannelOpen(id, env, channel, store, *goapi, querier, gasMeter2, TESTING_GAS_LIMIT)
require.Error(t, err)
// passes on good version
channel = api.MockIBCChannel(CHANNEL_ID, types.Ordered, "ibc-reflect")
channel.CounterpartyVersion = ""
_, err = vm.IBCChannelOpen(id, env, channel, store, *goapi, querier, gasMeter2, TESTING_GAS_LIMIT)
require.NoError(t, err)

// channel connect
gasMeter3 := api.NewMockGasMeter(TESTING_GAS_LIMIT)
store.SetGasMeter(gasMeter3)
env = api.MockEnv()
// completes and dispatches message to create reflect contract
channel = api.MockIBCChannel(CHANNEL_ID, types.Ordered, "ibc-reflect")
res, _, err := vm.IBCChannelConnect(id, env, channel, store, *goapi, querier, gasMeter2, TESTING_GAS_LIMIT)
require.NoError(t, err)
require.Equal(t, 1, len(res.Messages))

// make sure it read the balance properly and we got 250 atoms
dispatch := res.Messages[0]
require.NotNil(t, dispatch.Wasm, "%#v", dispatch)
require.NotNil(t, dispatch.Wasm.Instantiate, "%#v", dispatch)
init := dispatch.Wasm.Instantiate
assert.Equal(t, REFLECT_ID, init.CodeID)
assert.Empty(t, init.Send)
}

0 comments on commit 08b1d6b

Please sign in to comment.