diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 0000000000..14e3487dd3 --- /dev/null +++ b/tests/README.md @@ -0,0 +1,15 @@ +## Binary init checker + + +### WIP +A simple tool to ensure that all binaries init with the correct format, using the assert.sh library + +Simply run `./build_and_run.sh $GIT_BRANCH` + +This will run through all the binaries anc check the fields that we expect to be initialised when passing the parameters into nyms core binaries + +## TODO + - Introduce all binaries + - Sort paths and locations + - Tidy up + - Run in CI \ No newline at end of file diff --git a/tests/assert.sh b/tests/assert.sh new file mode 100755 index 0000000000..ffd2b9551b --- /dev/null +++ b/tests/assert.sh @@ -0,0 +1,186 @@ +#!/bin/bash +# assert.sh 1.1 - bash unit testing framework +# Copyright (C) 2009-2015 Robert Lehmann +# +# http://github.com/lehmannro/assert.sh +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +export DISCOVERONLY=${DISCOVERONLY:-} +export DEBUG=${DEBUG:-} +export STOP=${STOP:-} +export INVARIANT=${INVARIANT:-} +export CONTINUE=${CONTINUE:-} + +args="$(getopt -n "$0" -l \ + verbose,help,stop,discover,invariant,continue vhxdic $*)" \ +|| exit -1 +for arg in $args; do + case "$arg" in + -h) + echo "$0 [-vxidc]" \ + "[--verbose] [--stop] [--invariant] [--discover] [--continue]" + echo "`sed 's/./ /g' <<< "$0"` [-h] [--help]" + exit 0;; + --help) + cat < [stdin] + (( tests_ran++ )) || : + [[ -z "$DISCOVERONLY" ]] || return + expected=$(echo -ne "${2:-}") + result="$(eval 2>/dev/null $1 <<< ${3:-})" || true + if [[ "$result" == "$expected" ]]; then + [[ -z "$DEBUG" ]] || echo -n . + return + fi + result="$(sed -e :a -e '$!N;s/\n/\\n/;ta' <<< "$result")" + [[ -z "$result" ]] && result="nothing" || result="\"$result\"" + [[ -z "$2" ]] && expected="nothing" || expected="\"$2\"" + _assert_fail "expected $expected${_indent}got $result" "$1" "$3" +} + +assert_raises() { + # assert_raises [stdin] + (( tests_ran++ )) || : + [[ -z "$DISCOVERONLY" ]] || return + status=0 + (eval $1 <<< ${3:-}) > /dev/null 2>&1 || status=$? + expected=${2:-0} + if [[ "$status" -eq "$expected" ]]; then + [[ -z "$DEBUG" ]] || echo -n . + return + fi + _assert_fail "program terminated with code $status instead of $expected" "$1" "$3" +} + +_assert_fail() { + # _assert_fail + [[ -n "$DEBUG" ]] && echo -n X + report="test #$tests_ran \"$2${3:+ <<< $3}\" failed:${_indent}$1" + if [[ -n "$STOP" ]]; then + [[ -n "$DEBUG" ]] && echo + echo "$report" + exit 1 + fi + tests_errors[$tests_failed]="$report" + (( tests_failed++ )) || : +} + +skip_if() { + # skip_if + (eval $@) > /dev/null 2>&1 && status=0 || status=$? + [[ "$status" -eq 0 ]] || return + skip +} + +skip() { + # skip (no arguments) + shopt -q extdebug && tests_extdebug=0 || tests_extdebug=1 + shopt -q -o errexit && tests_errexit=0 || tests_errexit=1 + # enable extdebug so returning 1 in a DEBUG trap handler skips next command + shopt -s extdebug + # disable errexit (set -e) so we can safely return 1 without causing exit + set +o errexit + tests_trapped=0 + trap _skip DEBUG +} +_skip() { + if [[ $tests_trapped -eq 0 ]]; then + # DEBUG trap for command we want to skip. Do not remove the handler + # yet because *after* the command we need to reset extdebug/errexit (in + # another DEBUG trap.) + tests_trapped=1 + [[ -z "$DEBUG" ]] || echo -n s + return 1 + else + trap - DEBUG + [[ $tests_extdebug -eq 0 ]] || shopt -u extdebug + [[ $tests_errexit -eq 1 ]] || set -o errexit + return 0 + fi +} + + +_assert_reset +: ${tests_suite_status:=0} # remember if any of the tests failed so far +_assert_cleanup() { + local status=$? + # modify exit code if it's not already non-zero + [[ $status -eq 0 && -z $CONTINUE ]] && exit $tests_suite_status +} +trap _assert_cleanup EXIT diff --git a/tests/build_and_run.sh b/tests/build_and_run.sh new file mode 100755 index 0000000000..f6ff95f3cd --- /dev/null +++ b/tests/build_and_run.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +PWD="../" +GIT_BRANCH=$1 +VERSION_NUMBER=$2 + +# lets make sure the branch is up to date +# --------------------------------------- +git checkout develop +git fetch origin +git checkout $GIT_BRANCH +git pull origin $GIT_BRANCH +# --------------------------------------- + +echo "working directory ${PWD}" + +#build all binaries... +#expect the cargo tool chain to be installed on the machine +cargo build --release --all + +#here there should be the applicable binaries to test inits + +./nym-mixnode-binary-check.sh "$VERSION_NUMBER" + +sleep 2 + +echo "running gateway binary check" +#./nym-gateway-binary-check.sh "$VERSION_NUMBER" \ No newline at end of file diff --git a/tests/nym-gateway-binary-check.sh b/tests/nym-gateway-binary-check.sh new file mode 100755 index 0000000000..7489553617 --- /dev/null +++ b/tests/nym-gateway-binary-check.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +set -e + +. assert.sh -v -x + +PWD="../" +RELEASE_DIRECTORY="target/release" +VERSION_NUMBER=$1 +WALLET_ADDRESS_CONST=n1435n84se65tn7yv536am0sfvng4yyrwj7thhxr +MOCK_HOST="1.2.3.4" +OUTPUT=$(for i in {1..8}; do echo -n $(( $RANDOM % 10 )); done) +ID="test-${OUTPUT}" + +echo "the version number is ${VERSION_NUMBER}" + +cd ${PWD}${RELEASE_DIRECTORY} + +if [ -f nym-gateway ]; then + echo "running init tests" + # we wont use config env files for now + # unless we want to use a specific environment + OUTPUT=$(./nym-gateway --output json init --id ${ID} --host ${MOCK_HOST} --wallet-address ${WALLET_ADDRESS_CONST}) > /dev/null 2>&1 + + # get jq values for things we can assert against + VALUE=$(echo ${OUTPUT} | jq .wallet_address) + VALUE=${VALUE#\"} + VALUE=${VALUE%\"} + + # do asserts here based upon the output on init + + assert $(cat ${VALUE}) $(echo ${WALLET_ADDRESS_CONST}) + assert_end nym-gateway-tests +else + echo "exting test no binary found" +fi + + diff --git a/tests/nym-mixnode-binary-check.sh b/tests/nym-mixnode-binary-check.sh new file mode 100755 index 0000000000..1e62b21318 --- /dev/null +++ b/tests/nym-mixnode-binary-check.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +. assert.sh -v -x + +PWD="../" +RELEASE_DIRECTORY="target/release" +VERSION_NUMBER=$1 +WALLET_ADDRESS_CONST=n1435n84se65tn7yv536am0sfvng4yyrwj7thhxr +MOCK_HOST="1.2.3.4" +OUTPUT=$(for i in {1..8}; do echo -n $(( $RANDOM % 10 )); done) +ID="test-${OUTPUT}" + +echo "the version number is ${VERSION_NUMBER}" + +cd $PWD/$RELEASE_DIRECTORY + +if [ -f nym-mixnode ]; then + echo "running init tests" + # we wont use config env files for now + OUTPUT=$(./nym-mixnode --output json init --id ${ID} --host ${MOCK_HOST} --wallet-address ${WALLET_ADDRESS_CONST}) > /dev/null 2>&1 + + # get jq values for things we can assert against + # tidy this bit up - okay for first push + VALUE=$(echo ${OUTPUT} | jq .wallet_address) + VALUE=${VALUE#\"} + VALUE=${VALUE%\"} + + # do asserts here based upon the output on init + + assert $(cat ${VALUE}) $(echo ${WALLET_ADDRESS_CONST}) + assert_end nym-mixnode-tests +else + echo "exting test no binary found" +fi diff --git a/tests/socks5-binary-check.sh b/tests/socks5-binary-check.sh new file mode 100755 index 0000000000..74c27dbf69 --- /dev/null +++ b/tests/socks5-binary-check.sh @@ -0,0 +1,2 @@ +#!/bin/bash +# TODO \ No newline at end of file