diff --git a/tests/cases/eth2eth/Makefile b/tests/cases/eth2eth/Makefile index 046e2ca..016b1a7 100644 --- a/tests/cases/eth2eth/Makefile +++ b/tests/cases/eth2eth/Makefile @@ -10,6 +10,7 @@ network: .PHONY: test test: $(MAKE) test-single + $(MAKE) test-single-ordered $(MAKE) test-multi .PHONY: test-multi @@ -27,6 +28,15 @@ test-single: ./scripts/handshake ./scripts/test-channel-upgrade single ./scripts/test-tx + ./scripts/test-timeout + +.PHONY: test-single-ordered +test-single-ordered: + ./scripts/fixture single + ./scripts/init-rly path-ordered.json + ./scripts/handshake + ./scripts/test-tx + ./scripts/test-timeout .PHONY: network-down network-down: diff --git a/tests/cases/eth2eth/configs/path-ordered.json b/tests/cases/eth2eth/configs/path-ordered.json new file mode 100644 index 0000000..4314723 --- /dev/null +++ b/tests/cases/eth2eth/configs/path-ordered.json @@ -0,0 +1,23 @@ +{ + "src": { + "chain-id": "ibc0", + "client-id": "", + "connection-id": "", + "channel-id": "", + "port-id": "mockapp", + "order": "ordered", + "version": "mockapp-1" + }, + "dst": { + "chain-id": "ibc1", + "client-id": "", + "connection-id": "", + "channel-id": "", + "port-id": "mockapp", + "order": "ordered", + "version": "mockapp-1" + }, + "strategy": { + "type": "naive" + } +} diff --git a/tests/cases/eth2eth/scripts/init-rly b/tests/cases/eth2eth/scripts/init-rly index 3baca0d..d92dc7f 100755 --- a/tests/cases/eth2eth/scripts/init-rly +++ b/tests/cases/eth2eth/scripts/init-rly @@ -3,6 +3,7 @@ set -eu SCRIPT_DIR=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd) +PATH_JSON=${1:-path.json} source ${SCRIPT_DIR}/util/relayer-util rm -rf ${RELAYER_CONF} &> /dev/null @@ -13,4 +14,5 @@ ${RLY} config init ${RLY} chains add-dir ${CONF_DIR}/chains/ # add a path between chain0 and chain1 -$RLY paths add $CHAINID_ONE $CHAINID_TWO $PATH_NAME --file=${CONF_DIR}/path.json +$RLY paths add $CHAINID_ONE $CHAINID_TWO $PATH_NAME --file=${CONF_DIR}/${PATH_JSON} + diff --git a/tests/cases/eth2eth/scripts/test-timeout b/tests/cases/eth2eth/scripts/test-timeout new file mode 100755 index 0000000..dfe4235 --- /dev/null +++ b/tests/cases/eth2eth/scripts/test-timeout @@ -0,0 +1,51 @@ +#!/bin/bash + +set -eux + +SCRIPT_DIR=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd) +FIXTURES_DIR=${SCRIPT_DIR}/../fixtures + +source ${SCRIPT_DIR}/util/relayer-util + +ADDRESSES_DIR_A="${FIXTURES_DIR}/ethereum/ibc0/addresses" +ADDRESSES_DIR_B="${FIXTURES_DIR}/ethereum/ibc1/addresses" +MOCKAPP_A=`cat ${ADDRESSES_DIR_A}/AppV1` +MOCKAPP_B=`cat ${ADDRESSES_DIR_B}/AppV1` + +CONFIG_JSON=${RELAYER_CONF}/config/config.json + +MNEMONIC_A=$(jq -r '.chains[] | select(.chain.chain_id == "ibc0").chain.signer.mnemonic' ${CONFIG_JSON}) +MNEMONIC_B=$(jq -r '.chains[] | select(.chain.chain_id == "ibc1").chain.signer.mnemonic' ${CONFIG_JSON}) + +RPC_ADDRESS_A=$(jq -r '.chains[] | select(.chain.chain_id == "ibc0").chain.rpc_addr' ${CONFIG_JSON}) +RPC_ADDRESS_B=$(jq -r '.chains[] | select(.chain.chain_id == "ibc1").chain.rpc_addr' ${CONFIG_JSON}) + +PORT_A=$(jq -r '.paths.ibc01.src."port-id"' ${CONFIG_JSON}) +PORT_B=$(jq -r '.paths.ibc01.dst."port-id"' ${CONFIG_JSON}) +CHANNEL_A=$(jq -r '.paths.ibc01.src."channel-id"' ${CONFIG_JSON}) +CHANNEL_B=$(jq -r '.paths.ibc01.dst."channel-id"' ${CONFIG_JSON}) + +# send a packet from ibc0 to ibc1 +echo "!!! ibc0 alice -> ibc1 bob !!!" +ALICE_INDEX=1 +cast send \ + --rpc-url $RPC_ADDRESS_A \ + --mnemonic "$MNEMONIC_A" \ + --mnemonic-index ${ALICE_INDEX} \ + $MOCKAPP_A \ + 'sendPacket(bytes,string,string,(uint64,uint64),uint64)' \ + $(cast from-utf8 'mock packet data') \ + $PORT_A \ + $CHANNEL_A \ + '(0,100000)' \ + $(date -d 1sec +%s%N) + +sleep 5 +TMPFILE=$0.log +waitRelay "sendPacket" "unrelayed-packets" "src" +${RLY} tx relay ${PATH_NAME} 2>&1 | tee $TMPFILE +if grep -i 'Error' $TMPFILE; then exit 1; fi +grep -e 'core\.(\*RelayMsgs)\.Send' $TMPFILE | grep ProofUnreceived + + + diff --git a/tests/cases/tm2eth/Makefile b/tests/cases/tm2eth/Makefile index 0fa0935..fc91ab9 100644 --- a/tests/cases/tm2eth/Makefile +++ b/tests/cases/tm2eth/Makefile @@ -15,6 +15,7 @@ test: ./scripts/test-channel-upgrade ./scripts/test-mockapp-packet-relay ./scripts/test-ics20-packet-relay + ./scripts/test-mockapp-packet-timeout .PHONY: network-down network-down: diff --git a/tests/cases/tm2eth/scripts/test-mockapp-packet-timeout b/tests/cases/tm2eth/scripts/test-mockapp-packet-timeout new file mode 100755 index 0000000..abe384f --- /dev/null +++ b/tests/cases/tm2eth/scripts/test-mockapp-packet-timeout @@ -0,0 +1,51 @@ +#!/bin/bash + +set -eux + +TMPFILE=$0.log +SCRIPT_DIR=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd) +FIXTURES_DIR=${SCRIPT_DIR}/../fixtures + +RELAYER_CONF="$HOME/.yui-relayer" +RLY_BINARY=${SCRIPT_DIR}/../../../../build/yrly +RLY="${RLY_BINARY} --debug" + +PATH_NAME=mockapp-path + +ADDRESSES_DIR_B="${FIXTURES_DIR}/ethereum/ibc1/addresses" +MOCKAPP_CONTRACT_B=`cat ${ADDRESSES_DIR_B}/AppV1` + +MNEMONIC_B=$($RLY config show | jq -r '.chains[] | select(.chain.chain_id == "ibc1").chain.signer.mnemonic') +RPC_ADDRESS_B=$($RLY config show | jq -r '.chains[] | select(.chain.chain_id == "ibc1").chain.rpc_addr') +PORT_B=$($RLY paths list --json | jq -r --arg path $PATH_NAME '.[$path].dst."port-id"') +CHANNEL_B=$($RLY paths list --json | jq -r --arg path $PATH_NAME '.[$path].dst."channel-id"') + +TX_INTERVAL=10 + +echo "!!! ibc0 -> ibc1 !!!" +TM_ADDRESS=$(${RLY} tendermint keys show ibc0 testkey) +docker exec tendermint-chain0-mock sh -c "simd --home /root/data/ibc0 tx --keyring-backend=test --from ${TM_ADDRESS} --chain-id ibc0 mockapp send --packet-timeout-height 0-1 mockapp ${CHANNEL_B} 'mock packet data' --yes" +sleep ${TX_INTERVAL} +${RLY} tx relay $PATH_NAME 2>&1 | tee $TMPFILE +sleep ${TX_INTERVAL} +if grep -i 'Error' $TMPFILE; then exit 1; fi +grep -e 'core\.(\*RelayMsgs)\.Send' $TMPFILE | grep ProofUnreceived + +echo "!!! ibc1 -> ibc0 !!!" +BOB_INDEX=2 +cast send \ + --rpc-url $RPC_ADDRESS_B \ + --mnemonic "$MNEMONIC_B" \ + --mnemonic-index ${BOB_INDEX} \ + $MOCKAPP_CONTRACT_B \ + 'sendPacket(bytes,string,string,(uint64,uint64),uint64)' \ + $(cast from-utf8 'mock packet data') \ + $PORT_B \ + $CHANNEL_B \ + '(0,100000)' \ + $(date -d 1sec +%s%N) +sleep ${TX_INTERVAL} +${RLY} tx relay $PATH_NAME 2>&1 | tee $TMPFILE +sleep ${TX_INTERVAL} +if grep -i 'Error' $TMPFILE; then exit 1; fi +grep -e 'core\.(\*RelayMsgs)\.Send' $TMPFILE | grep ProofUnreceived diff --git a/tests/cases/tm2tm/Makefile b/tests/cases/tm2tm/Makefile index ed0dd01..80d6d56 100644 --- a/tests/cases/tm2tm/Makefile +++ b/tests/cases/tm2tm/Makefile @@ -7,12 +7,22 @@ network: up -d \ tendermint-chain0 tendermint-chain1 -.PHONY: test +.PHONY: test test-unorderd test-ordered test: + $(MAKE) test-unordered test-ordered + +test-unordered: ./scripts/fixture ./scripts/init-rly ./scripts/handshake ./scripts/test-tx + ./scripts/test-timeout transfer + +test-ordered: + ./scripts/fixture + ./scripts/init-rly + ./scripts/handshake path-ordered.json + ./scripts/test-timeout mockapp .PHONY: network-down network-down: diff --git a/tests/cases/tm2tm/configs/path-ordered.json b/tests/cases/tm2tm/configs/path-ordered.json new file mode 100644 index 0000000..4314723 --- /dev/null +++ b/tests/cases/tm2tm/configs/path-ordered.json @@ -0,0 +1,23 @@ +{ + "src": { + "chain-id": "ibc0", + "client-id": "", + "connection-id": "", + "channel-id": "", + "port-id": "mockapp", + "order": "ordered", + "version": "mockapp-1" + }, + "dst": { + "chain-id": "ibc1", + "client-id": "", + "connection-id": "", + "channel-id": "", + "port-id": "mockapp", + "order": "ordered", + "version": "mockapp-1" + }, + "strategy": { + "type": "naive" + } +} diff --git a/tests/cases/tm2tm/scripts/handshake b/tests/cases/tm2tm/scripts/handshake index 4f2a7d3..a6cc5bb 100755 --- a/tests/cases/tm2tm/scripts/handshake +++ b/tests/cases/tm2tm/scripts/handshake @@ -5,6 +5,7 @@ set -eux source $(cd $(dirname "$0"); pwd)/../../../scripts/util SCRIPT_DIR=$(cd $(dirname $0); pwd) +PATH_JSON=${1:-path.json} RLY_BINARY=${SCRIPT_DIR}/../../../../build/yrly RLY="${RLY_BINARY} --debug" @@ -25,7 +26,7 @@ retry 5 $RLY tendermint light init $CHAINID_TWO -f # $RLY q bal $CHAINID_TWO # add a path between chain0 and chain1 -$RLY paths add $CHAINID_ONE $CHAINID_TWO $PATH_NAME --file=./configs/path.json +$RLY paths add $CHAINID_ONE $CHAINID_TWO $PATH_NAME --file=./configs/${PATH_JSON} retry 5 $RLY tx clients $PATH_NAME $RLY query client $PATH_NAME $CHAINID_ONE 2>/dev/null | jq -Rs 'fromjson' diff --git a/tests/cases/tm2tm/scripts/test-timeout b/tests/cases/tm2tm/scripts/test-timeout new file mode 100755 index 0000000..9a8c184 --- /dev/null +++ b/tests/cases/tm2tm/scripts/test-timeout @@ -0,0 +1,40 @@ +#!/bin/bash + +set -eux + +SCRIPT_DIR=$(cd $(dirname $0); pwd) +APP=$1 +RLY_BINARY=${SCRIPT_DIR}/../../../../build/yrly +RLY="${RLY_BINARY} --debug" + +# XXX set proper value +TX_INTERVAL=3 + +TM_ADDRESS0=$(${RLY} tendermint keys show ibc0 testkey) +TM_ADDRESS1=$(${RLY} tendermint keys show ibc1 testkey) + +echo "!!! ibc0 -> ibc1 !!!" + +echo "Before ibc0 balance: $(${RLY} query balance ibc0 ${TM_ADDRESS0})" +echo "Before ibc1 balance: $(${RLY} query balance ibc1 ${TM_ADDRESS1})" + +PATH_NAME=ibc01 +if [[ $APP = "transfer" ]]; then + ${RLY} tx transfer --timeout-height-offset 1 ibc01 ibc0 ibc1 100samoleans ${TM_ADDRESS1} +else + CHANNEL_NAME=$(${RLY} query channel ${PATH_NAME} ibc0 | jq -r '.counterparty.channelId') + docker exec tendermint-chain0 sh -c "simd --home /root/data/ibc0 tx --keyring-backend=test --from ${TM_ADDRESS0} --chain-id ibc0 mockapp send --packet-timeout-height 0-1 mockapp ${CHANNEL_NAME} 'mock packet data' --yes" +fi +sleep ${TX_INTERVAL} + +TMPFILE=$0.log +${RLY} tx relay ibc01 2>&1 | tee $TMPFILE +sleep ${TX_INTERVAL} + +if grep -i 'Error' $TMPFILE; then exit 1; fi +grep -e 'core\.(\*RelayMsgs)\.Send' $TMPFILE | grep ProofUnreceived + +echo "After ibc0 balance: $(${RLY} query balance ibc0 ${TM_ADDRESS0})" +echo "After ibc1 balance: $(${RLY} query balance ibc1 ${TM_ADDRESS1})" + + diff --git a/tests/chains/ethereum/contracts/contracts/App.sol b/tests/chains/ethereum/contracts/contracts/App.sol index a5157cf..10f3bb4 100644 --- a/tests/chains/ethereum/contracts/contracts/App.sol +++ b/tests/chains/ethereum/contracts/contracts/App.sol @@ -10,6 +10,7 @@ contract AppV1 is IBCContractUpgradableUUPSMockApp { function __AppV1_init(string memory initialVersion) public initializer { __IBCContractUpgradableUUPSMockApp_init(initialVersion); + allowCloseChannel(true); } } diff --git a/tests/chains/tendermint/go.mod b/tests/chains/tendermint/go.mod index 6ca0aa7..ea2e4f2 100644 --- a/tests/chains/tendermint/go.mod +++ b/tests/chains/tendermint/go.mod @@ -22,7 +22,7 @@ require ( github.com/cosmos/ibc-go/modules/capability v1.0.0 github.com/cosmos/ibc-go/v8 v8.2.1 github.com/datachainlab/ibc-mock-app v0.1.1 - github.com/datachainlab/ibc-mock-client v0.4.2 + github.com/datachainlab/ibc-mock-client v0.4.3 github.com/spf13/cast v1.6.0 github.com/spf13/cobra v1.8.0 github.com/spf13/viper v1.18.2 diff --git a/tests/chains/tendermint/go.sum b/tests/chains/tendermint/go.sum index 413cf43..a2aac89 100644 --- a/tests/chains/tendermint/go.sum +++ b/tests/chains/tendermint/go.sum @@ -385,8 +385,8 @@ github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuA github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= github.com/datachainlab/ibc-mock-app v0.1.1 h1:ylaFuuC7iQP4QH0Tvlt2ibQCBYvXP22S3KvUOXmMRlk= github.com/datachainlab/ibc-mock-app v0.1.1/go.mod h1:mxOiHsKNduLy9FAa5MsAv7qun9WkWww4DmYuLlLqVG8= -github.com/datachainlab/ibc-mock-client v0.4.2 h1:0BbQFwLUUbKknCsUO6m80VogRbJop5kA0u9/3Hma9n0= -github.com/datachainlab/ibc-mock-client v0.4.2/go.mod h1:Fn37FzeevLp5gmla4TSoDY56Jm2tBcqz+p0lIyRCOsg= +github.com/datachainlab/ibc-mock-client v0.4.3 h1:vFl8P4lx0aAgvnZIMfmwhDcj8atps1aP+sthzKdVNo8= +github.com/datachainlab/ibc-mock-client v0.4.3/go.mod h1:Fn37FzeevLp5gmla4TSoDY56Jm2tBcqz+p0lIyRCOsg= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=