diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c00d6f6aa..14865c91d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -194,3 +194,26 @@ jobs: - uses: actions/checkout@v2 - name: test-unit-amino run: make test-unit-amino + liveness-test: + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v2 + - uses: technote-space/get-diff-action@v1 + id: git_diff + with: + SUFFIX_FILTER: | + .go + .mod + .sum + - name: build image + run: | + make build-docker-local-simapp + - name: start localnet + run: | + make clean build-sim-linux localnet-start + if: "env.GIT_DIFF != ''" + - name: test liveness + run: | + ./contrib/localnet_liveness.sh 100 5 50 localhost + if: "env.GIT_DIFF != ''" \ No newline at end of file diff --git a/contrib/localnet_liveness.sh b/contrib/localnet_liveness.sh new file mode 100644 index 000000000..1dac38fa7 --- /dev/null +++ b/contrib/localnet_liveness.sh @@ -0,0 +1,55 @@ +#!/bin/bash + +CNT=0 +ITER=$1 +SLEEP=$2 +NUMBLOCKS=$3 +NODEADDR=$4 + +if [ -z "$1" ]; then + echo "Need to input number of iterations to run..." + exit 1 +fi + +if [ -z "$2" ]; then + echo "Need to input number of seconds to sleep between iterations" + exit 1 +fi + +if [ -z "$3" ]; then + echo "Need to input block height to declare completion..." + exit 1 +fi + +if [ -z "$4" ]; then + echo "Need to input node address to poll..." + exit 1 +fi + +docker_containers=( $(docker ps -q -f name=simdnode --format='{{.Names}}') ) + +while [ ${CNT} -lt $ITER ]; do + curr_block=$(curl -s $NODEADDR:26657/status | jq -r '.result.sync_info.latest_block_height') + + if [ ! -z ${curr_block} ] ; then + echo "Number of Blocks: ${curr_block}" + fi + + if [ ! -z ${curr_block} ] && [ ${curr_block} -gt ${NUMBLOCKS} ]; then + echo "Number of blocks reached. Success!" + exit 0 + fi + + # Emulate network chaos: + # + # Every 10 blocks, pick a random container and restart it. + if ! ((${CNT} % 10)); then + rand_container=${docker_containers["$[RANDOM % ${#docker_containers[@]}]"]}; + echo "Restarting random docker container ${rand_container}" + docker restart ${rand_container} &>/dev/null & + fi + let CNT=CNT+1 + sleep $SLEEP +done +echo "Timeout reached. Failure!" +exit 1