From 21cc189043803e65428009ae446691a64ab3081d Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 30 Aug 2017 20:22:17 +0200 Subject: [PATCH 1/9] moved counter to examples dir --- Makefile | 6 +++++- {docs/guide => examples}/counter/cmd/counter/main.go | 2 +- .../counter/cmd/countercli/commands/counter.go | 2 +- .../counter/cmd/countercli/commands/query.go | 2 +- {docs/guide => examples}/counter/cmd/countercli/main.go | 2 +- {docs/guide => examples}/counter/plugins/counter/counter.go | 0 .../counter/plugins/counter/counter_test.go | 0 7 files changed, 9 insertions(+), 5 deletions(-) rename {docs/guide => examples}/counter/cmd/counter/main.go (90%) rename {docs/guide => examples}/counter/cmd/countercli/commands/counter.go (94%) rename {docs/guide => examples}/counter/cmd/countercli/commands/query.go (91%) rename {docs/guide => examples}/counter/cmd/countercli/main.go (96%) rename {docs/guide => examples}/counter/plugins/counter/counter.go (100%) rename {docs/guide => examples}/counter/plugins/counter/counter_test.go (100%) diff --git a/Makefile b/Makefile index 6e01b4119..7666ae648 100644 --- a/Makefile +++ b/Makefile @@ -3,6 +3,8 @@ GOTOOLS = github.com/mitchellh/gox \ github.com/rigelrozanski/shelldown/cmd/shelldown TUTORIALS=$(shell find docs/guide -name "*md" -type f) +EXAMPLES := counter + LINKER_FLAGS:="-X github.com/cosmos/cosmos-sdk/client/commands.CommitHash=`git rev-parse --short HEAD`" all: get_vendor_deps install test @@ -12,7 +14,9 @@ build: install: @go install -ldflags $(LINKER_FLAGS) ./cmd/... - @go install -ldflags $(LINKER_FLAGS) ./docs/guide/counter/cmd/... + @for EX in $(EXAMPLES); do \ + go install -ldflags $(LINKER_FLAGS) ./examples/$$EX/cmd/...; \ + done dist: @bash publish/dist.sh diff --git a/docs/guide/counter/cmd/counter/main.go b/examples/counter/cmd/counter/main.go similarity index 90% rename from docs/guide/counter/cmd/counter/main.go rename to examples/counter/cmd/counter/main.go index 02a2d045d..9768ef276 100644 --- a/docs/guide/counter/cmd/counter/main.go +++ b/examples/counter/cmd/counter/main.go @@ -9,7 +9,7 @@ import ( client "github.com/cosmos/cosmos-sdk/client/commands" "github.com/cosmos/cosmos-sdk/cmd/basecoin/commands" - "github.com/cosmos/cosmos-sdk/docs/guide/counter/plugins/counter" + "github.com/cosmos/cosmos-sdk/examples/counter/plugins/counter" ) func main() { diff --git a/docs/guide/counter/cmd/countercli/commands/counter.go b/examples/counter/cmd/countercli/commands/counter.go similarity index 94% rename from docs/guide/counter/cmd/countercli/commands/counter.go rename to examples/counter/cmd/countercli/commands/counter.go index 01a2dafff..cb22cdb50 100644 --- a/docs/guide/counter/cmd/countercli/commands/counter.go +++ b/examples/counter/cmd/countercli/commands/counter.go @@ -6,7 +6,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk" txcmd "github.com/cosmos/cosmos-sdk/client/commands/txs" - "github.com/cosmos/cosmos-sdk/docs/guide/counter/plugins/counter" + "github.com/cosmos/cosmos-sdk/examples/counter/plugins/counter" "github.com/cosmos/cosmos-sdk/modules/coin" ) diff --git a/docs/guide/counter/cmd/countercli/commands/query.go b/examples/counter/cmd/countercli/commands/query.go similarity index 91% rename from docs/guide/counter/cmd/countercli/commands/query.go rename to examples/counter/cmd/countercli/commands/query.go index 6dcbe14b7..d55f6db48 100644 --- a/docs/guide/counter/cmd/countercli/commands/query.go +++ b/examples/counter/cmd/countercli/commands/query.go @@ -7,7 +7,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/commands" "github.com/cosmos/cosmos-sdk/client/commands/query" - "github.com/cosmos/cosmos-sdk/docs/guide/counter/plugins/counter" + "github.com/cosmos/cosmos-sdk/examples/counter/plugins/counter" "github.com/cosmos/cosmos-sdk/stack" ) diff --git a/docs/guide/counter/cmd/countercli/main.go b/examples/counter/cmd/countercli/main.go similarity index 96% rename from docs/guide/counter/cmd/countercli/main.go rename to examples/counter/cmd/countercli/main.go index f3a4821f9..adf76516c 100644 --- a/docs/guide/counter/cmd/countercli/main.go +++ b/examples/counter/cmd/countercli/main.go @@ -14,7 +14,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/commands/seeds" txcmd "github.com/cosmos/cosmos-sdk/client/commands/txs" - bcount "github.com/cosmos/cosmos-sdk/docs/guide/counter/cmd/countercli/commands" + bcount "github.com/cosmos/cosmos-sdk/examples/counter/cmd/countercli/commands" authcmd "github.com/cosmos/cosmos-sdk/modules/auth/commands" basecmd "github.com/cosmos/cosmos-sdk/modules/base/commands" coincmd "github.com/cosmos/cosmos-sdk/modules/coin/commands" diff --git a/docs/guide/counter/plugins/counter/counter.go b/examples/counter/plugins/counter/counter.go similarity index 100% rename from docs/guide/counter/plugins/counter/counter.go rename to examples/counter/plugins/counter/counter.go diff --git a/docs/guide/counter/plugins/counter/counter_test.go b/examples/counter/plugins/counter/counter_test.go similarity index 100% rename from docs/guide/counter/plugins/counter/counter_test.go rename to examples/counter/plugins/counter/counter_test.go From ce46642aa04ba444aceae6c41fd3b76ee1056034 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 30 Aug 2017 20:31:17 +0200 Subject: [PATCH 2/9] Move counter cli tests into example dir --- Makefile | 9 ++++++--- examples/counter/Makefile | 14 ++++++++++++++ {tests => examples/counter/tests}/cli/counter.sh | 8 ++++++-- 3 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 examples/counter/Makefile rename {tests => examples/counter/tests}/cli/counter.sh (96%) diff --git a/Makefile b/Makefile index 7666ae648..3d1174c75 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,7 @@ GOTOOLS = github.com/mitchellh/gox \ TUTORIALS=$(shell find docs/guide -name "*md" -type f) EXAMPLES := counter +EXAMPLE_DIRS := $(addprefix ./examples/,${EXAMPLES}) LINKER_FLAGS:="-X github.com/cosmos/cosmos-sdk/client/commands.CommitHash=`git rev-parse --short HEAD`" @@ -14,8 +15,8 @@ build: install: @go install -ldflags $(LINKER_FLAGS) ./cmd/... - @for EX in $(EXAMPLES); do \ - go install -ldflags $(LINKER_FLAGS) ./examples/$$EX/cmd/...; \ + @for EX in $(EXAMPLE_DIRS); do \ + cd $$EX && make install; \ done dist: @@ -40,10 +41,12 @@ test_cli: tests/cli/shunit2 ./tests/cli/basictx.sh ./tests/cli/eyes.sh ./tests/cli/roles.sh - ./tests/cli/counter.sh ./tests/cli/restart.sh ./tests/cli/rest.sh ./tests/cli/ibc.sh + @for EX in $(EXAMPLE_DIRS); do \ + cd $$EX && make test_cli; \ + done test_tutorial: docs/guide/shunit2 @shelldown ${TUTORIALS} diff --git a/examples/counter/Makefile b/examples/counter/Makefile new file mode 100644 index 000000000..9fd61be89 --- /dev/null +++ b/examples/counter/Makefile @@ -0,0 +1,14 @@ +LINKER_FLAGS:="-X github.com/cosmos/cosmos-sdk/client/commands.CommitHash=`git rev-parse --short HEAD`" + +install: + @go install -ldflags $(LINKER_FLAGS) ./cmd/... + +test: test_unit test_cli + +test_unit: + @go test `glide novendor` + +test_cli: + ./tests/cli/counter.sh + +.PHONY: install test test_unit test_cli diff --git a/tests/cli/counter.sh b/examples/counter/tests/cli/counter.sh similarity index 96% rename from tests/cli/counter.sh rename to examples/counter/tests/cli/counter.sh index f57827a96..ad9f994e5 100755 --- a/tests/cli/counter.sh +++ b/examples/counter/tests/cli/counter.sh @@ -112,5 +112,9 @@ test03AddCount() { # Load common then run these tests with shunit2! DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" #get this files directory -. $DIR/common.sh -. $DIR/shunit2 + +# TODO: how to handle this if we are not in the same directory +CLI_DIR=${DIR}/../../../../tests/cli + +. $CLI_DIR/common.sh +. $CLI_DIR/shunit2 From d22c08b12ac9348c084f7367c9bbf0a13739a465 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 30 Aug 2017 20:33:47 +0200 Subject: [PATCH 3/9] Store shunit2 in the repo, no dangerous wget each test --- .gitignore | 1 - Makefile | 13 +- docs/guide/shunit2 | 1067 ++++++++++++++++++++++++++++++++++++++++++++ tests/cli/shunit2 | 1067 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 2137 insertions(+), 11 deletions(-) create mode 100644 docs/guide/shunit2 create mode 100644 tests/cli/shunit2 diff --git a/.gitignore b/.gitignore index cdd5c2e47..711ed7c6e 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,5 @@ vendor .vagrant merkleeyes.db build -shunit2 docs/guide/*.sh keys/ diff --git a/Makefile b/Makefile index 3d1174c75..52f23619d 100644 --- a/Makefile +++ b/Makefile @@ -33,8 +33,9 @@ test_unit: @go test `glide novendor` #go run tests/tendermint/*.go -test_cli: tests/cli/shunit2 +test_cli: # sudo apt-get install jq + # wget "https://raw.githubusercontent.com/kward/shunit2/master/source/2.1/src/shunit2" ./tests/cli/keys.sh ./tests/cli/rpc.sh ./tests/cli/init.sh @@ -48,20 +49,12 @@ test_cli: tests/cli/shunit2 cd $$EX && make test_cli; \ done -test_tutorial: docs/guide/shunit2 +test_tutorial: @shelldown ${TUTORIALS} @for script in docs/guide/*.sh ; do \ bash $$script ; \ done -tests/cli/shunit2: - @wget "https://raw.githubusercontent.com/kward/shunit2/master/source/2.1/src/shunit2" \ - -q -O tests/cli/shunit2 - -docs/guide/shunit2: - @wget "https://raw.githubusercontent.com/kward/shunit2/master/source/2.1/src/shunit2" \ - -q -O docs/guide/shunit2 - get_vendor_deps: tools @glide install diff --git a/docs/guide/shunit2 b/docs/guide/shunit2 new file mode 100644 index 000000000..f347ca565 --- /dev/null +++ b/docs/guide/shunit2 @@ -0,0 +1,1067 @@ +#! /bin/sh +# $Id$ +# vim:et:ft=sh:sts=2:sw=2 +# +# Copyright 2008 Kate Ward. All Rights Reserved. +# Released under the LGPL (GNU Lesser General Public License) +# +# shUnit2 -- Unit testing framework for Unix shell scripts. +# http://code.google.com/p/shunit2/ +# +# Author: kate.ward@forestent.com (Kate Ward) +# +# shUnit2 is a xUnit based unit test framework for Bourne shell scripts. It is +# based on the popular JUnit unit testing framework for Java. + +# return if shunit already loaded +[ -n "${SHUNIT_VERSION:-}" ] && exit 0 +SHUNIT_VERSION='2.1.7pre' + +# return values that scripts can use +SHUNIT_TRUE=0 +SHUNIT_FALSE=1 +SHUNIT_ERROR=2 + +# logging functions +_shunit_warn() { echo "shunit2:WARN $@" >&2; } +_shunit_error() { echo "shunit2:ERROR $@" >&2; } +_shunit_fatal() { echo "shunit2:FATAL $@" >&2; exit ${SHUNIT_ERROR}; } + +# determine some reasonable command defaults +__SHUNIT_UNAME_S=`uname -s` +case "${__SHUNIT_UNAME_S}" in + BSD) __SHUNIT_EXPR_CMD='gexpr' ;; + *) __SHUNIT_EXPR_CMD='expr' ;; +esac + +# commands a user can override if needed +SHUNIT_EXPR_CMD=${SHUNIT_EXPR_CMD:-${__SHUNIT_EXPR_CMD}} + +# enable strict mode by default +SHUNIT_STRICT=${SHUNIT_STRICT:-${SHUNIT_TRUE}} + +# specific shell checks +if [ -n "${ZSH_VERSION:-}" ]; then + setopt |grep "^shwordsplit$" >/dev/null + if [ $? -ne ${SHUNIT_TRUE} ]; then + _shunit_fatal 'zsh shwordsplit option is required for proper operation' + fi + if [ -z "${SHUNIT_PARENT:-}" ]; then + _shunit_fatal "zsh does not pass \$0 through properly. please declare \ +\"SHUNIT_PARENT=\$0\" before calling shUnit2" + fi +fi + +# +# constants +# + +__SHUNIT_ASSERT_MSG_PREFIX='ASSERT:' +__SHUNIT_MODE_SOURCED='sourced' +__SHUNIT_MODE_STANDALONE='standalone' +__SHUNIT_PARENT=${SHUNIT_PARENT:-$0} + +# set the constants readonly +__shunit_constants=`set |grep '^__SHUNIT_' |cut -d= -f1` +echo "${__shunit_constants}" |grep '^Binary file' >/dev/null && \ + __shunit_constants=`set |grep -a '^__SHUNIT_' |cut -d= -f1` +for __shunit_const in ${__shunit_constants}; do + if [ -z "${ZSH_VERSION:-}" ]; then + readonly ${__shunit_const} + else + case ${ZSH_VERSION} in + [123].*) readonly ${__shunit_const} ;; + *) readonly -g ${__shunit_const} # declare readonly constants globally + esac + fi +done +unset __shunit_const __shunit_constants + +# +# internal variables +# + +# variables +__shunit_lineno='' # line number of executed test +__shunit_mode=${__SHUNIT_MODE_SOURCED} # operating mode +__shunit_reportGenerated=${SHUNIT_FALSE} # is report generated +__shunit_script='' # filename of unittest script (standalone mode) +__shunit_skip=${SHUNIT_FALSE} # is skipping enabled +__shunit_suite='' # suite of tests to execute + +# counts of tests +__shunit_testSuccess=${SHUNIT_TRUE} +__shunit_testsTotal=0 +__shunit_testsPassed=0 +__shunit_testsFailed=0 + +# counts of asserts +__shunit_assertsTotal=0 +__shunit_assertsPassed=0 +__shunit_assertsFailed=0 +__shunit_assertsSkipped=0 + +# macros +_SHUNIT_LINENO_='eval __shunit_lineno=""; if [ "${1:-}" = "--lineno" ]; then [ -n "$2" ] && __shunit_lineno="[$2] "; shift 2; fi' + +#----------------------------------------------------------------------------- +# private functions + +#----------------------------------------------------------------------------- +# assert functions +# + +# Assert that two values are equal to one another. +# +# Args: +# message: string: failure message [optional] +# expected: string: expected value +# actual: string: actual value +# Returns: +# integer: success (TRUE/FALSE/ERROR constant) +assertEquals() +{ + ${_SHUNIT_LINENO_} + if [ $# -lt 2 -o $# -gt 3 ]; then + _shunit_error "assertEquals() requires two or three arguments; $# given" + _shunit_error "1: ${1:+$1} 2: ${2:+$2} 3: ${3:+$3}${4:+ 4: $4}" + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + shunit_message_=${__shunit_lineno} + if [ $# -eq 3 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + shunit_expected_=$1 + shunit_actual_=$2 + + shunit_return=${SHUNIT_TRUE} + if [ "${shunit_expected_}" = "${shunit_actual_}" ]; then + _shunit_assertPass + else + failNotEquals "${shunit_message_}" "${shunit_expected_}" "${shunit_actual_}" + shunit_return=${SHUNIT_FALSE} + fi + + unset shunit_message_ shunit_expected_ shunit_actual_ + return ${shunit_return} +} +_ASSERT_EQUALS_='eval assertEquals --lineno "${LINENO:-}"' + +# Assert that two values are not equal to one another. +# +# Args: +# message: string: failure message [optional] +# expected: string: expected value +# actual: string: actual value +# Returns: +# integer: success (TRUE/FALSE/ERROR constant) +assertNotEquals() +{ + ${_SHUNIT_LINENO_} + if [ $# -lt 2 -o $# -gt 3 ]; then + _shunit_error "assertNotEquals() requires two or three arguments; $# given" + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + shunit_message_=${__shunit_lineno} + if [ $# -eq 3 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + shunit_expected_=$1 + shunit_actual_=$2 + + shunit_return=${SHUNIT_TRUE} + if [ "${shunit_expected_}" != "${shunit_actual_}" ]; then + _shunit_assertPass + else + failSame "${shunit_message_}" "$@" + shunit_return=${SHUNIT_FALSE} + fi + + unset shunit_message_ shunit_expected_ shunit_actual_ + return ${shunit_return} +} +_ASSERT_NOT_EQUALS_='eval assertNotEquals --lineno "${LINENO:-}"' + +# Assert that a value is null (i.e. an empty string) +# +# Args: +# message: string: failure message [optional] +# actual: string: actual value +# Returns: +# integer: success (TRUE/FALSE/ERROR constant) +assertNull() +{ + ${_SHUNIT_LINENO_} + if [ $# -lt 1 -o $# -gt 2 ]; then + _shunit_error "assertNull() requires one or two arguments; $# given" + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + shunit_message_=${__shunit_lineno} + if [ $# -eq 2 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + assertTrue "${shunit_message_}" "[ -z '$1' ]" + shunit_return=$? + + unset shunit_message_ + return ${shunit_return} +} +_ASSERT_NULL_='eval assertNull --lineno "${LINENO:-}"' + +# Assert that a value is not null (i.e. a non-empty string) +# +# Args: +# message: string: failure message [optional] +# actual: string: actual value +# Returns: +# integer: success (TRUE/FALSE/ERROR constant) +assertNotNull() +{ + ${_SHUNIT_LINENO_} + if [ $# -gt 2 ]; then # allowing 0 arguments as $1 might actually be null + _shunit_error "assertNotNull() requires one or two arguments; $# given" + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + shunit_message_=${__shunit_lineno} + if [ $# -eq 2 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + shunit_actual_=`_shunit_escapeCharactersInString "${1:-}"` + test -n "${shunit_actual_}" + assertTrue "${shunit_message_}" $? + shunit_return=$? + + unset shunit_actual_ shunit_message_ + return ${shunit_return} +} +_ASSERT_NOT_NULL_='eval assertNotNull --lineno "${LINENO:-}"' + +# Assert that two values are the same (i.e. equal to one another). +# +# Args: +# message: string: failure message [optional] +# expected: string: expected value +# actual: string: actual value +# Returns: +# integer: success (TRUE/FALSE/ERROR constant) +assertSame() +{ + ${_SHUNIT_LINENO_} + if [ $# -lt 2 -o $# -gt 3 ]; then + _shunit_error "assertSame() requires two or three arguments; $# given" + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + shunit_message_=${__shunit_lineno} + if [ $# -eq 3 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + assertEquals "${shunit_message_}" "$1" "$2" + shunit_return=$? + + unset shunit_message_ + return ${shunit_return} +} +_ASSERT_SAME_='eval assertSame --lineno "${LINENO:-}"' + +# Assert that two values are not the same (i.e. not equal to one another). +# +# Args: +# message: string: failure message [optional] +# expected: string: expected value +# actual: string: actual value +# Returns: +# integer: success (TRUE/FALSE/ERROR constant) +assertNotSame() +{ + ${_SHUNIT_LINENO_} + if [ $# -lt 2 -o $# -gt 3 ]; then + _shunit_error "assertNotSame() requires two or three arguments; $# given" + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + shunit_message_=${__shunit_lineno} + if [ $# -eq 3 ]; then + shunit_message_="${shunit_message_:-}$1" + shift + fi + assertNotEquals "${shunit_message_}" "$1" "$2" + shunit_return=$? + + unset shunit_message_ + return ${shunit_return} +} +_ASSERT_NOT_SAME_='eval assertNotSame --lineno "${LINENO:-}"' + +# Assert that a value or shell test condition is true. +# +# In shell, a value of 0 is true and a non-zero value is false. Any integer +# value passed can thereby be tested. +# +# Shell supports much more complicated tests though, and a means to support +# them was needed. As such, this function tests that conditions are true or +# false through evaluation rather than just looking for a true or false. +# +# The following test will succeed: +# assertTrue 0 +# assertTrue "[ 34 -gt 23 ]" +# The following test will fail with a message: +# assertTrue 123 +# assertTrue "test failed" "[ -r '/non/existent/file' ]" +# +# Args: +# message: string: failure message [optional] +# condition: string: integer value or shell conditional statement +# Returns: +# integer: success (TRUE/FALSE/ERROR constant) +assertTrue() +{ + ${_SHUNIT_LINENO_} + if [ $# -lt 1 -o $# -gt 2 ]; then + _shunit_error "assertTrue() takes one or two arguments; $# given" + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + shunit_message_=${__shunit_lineno} + if [ $# -eq 2 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + shunit_condition_=$1 + + # see if condition is an integer, i.e. a return value + shunit_match_=`expr "${shunit_condition_}" : '\([0-9]*\)'` + shunit_return=${SHUNIT_TRUE} + if [ -z "${shunit_condition_}" ]; then + # null condition + shunit_return=${SHUNIT_FALSE} + elif [ -n "${shunit_match_}" -a "${shunit_condition_}" = "${shunit_match_}" ] + then + # possible return value. treating 0 as true, and non-zero as false. + [ ${shunit_condition_} -ne 0 ] && shunit_return=${SHUNIT_FALSE} + else + # (hopefully) a condition + ( eval ${shunit_condition_} ) >/dev/null 2>&1 + [ $? -ne 0 ] && shunit_return=${SHUNIT_FALSE} + fi + + # record the test + if [ ${shunit_return} -eq ${SHUNIT_TRUE} ]; then + _shunit_assertPass + else + _shunit_assertFail "${shunit_message_}" + fi + + unset shunit_message_ shunit_condition_ shunit_match_ + return ${shunit_return} +} +_ASSERT_TRUE_='eval assertTrue --lineno "${LINENO:-}"' + +# Assert that a value or shell test condition is false. +# +# In shell, a value of 0 is true and a non-zero value is false. Any integer +# value passed can thereby be tested. +# +# Shell supports much more complicated tests though, and a means to support +# them was needed. As such, this function tests that conditions are true or +# false through evaluation rather than just looking for a true or false. +# +# The following test will succeed: +# assertFalse 1 +# assertFalse "[ 'apples' = 'oranges' ]" +# The following test will fail with a message: +# assertFalse 0 +# assertFalse "test failed" "[ 1 -eq 1 -a 2 -eq 2 ]" +# +# Args: +# message: string: failure message [optional] +# condition: string: integer value or shell conditional statement +# Returns: +# integer: success (TRUE/FALSE/ERROR constant) +assertFalse() +{ + ${_SHUNIT_LINENO_} + if [ $# -lt 1 -o $# -gt 2 ]; then + _shunit_error "assertFalse() quires one or two arguments; $# given" + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + shunit_message_=${__shunit_lineno} + if [ $# -eq 2 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + shunit_condition_=$1 + + # see if condition is an integer, i.e. a return value + shunit_match_=`expr "${shunit_condition_}" : '\([0-9]*\)'` + shunit_return=${SHUNIT_TRUE} + if [ -z "${shunit_condition_}" ]; then + # null condition + shunit_return=${SHUNIT_FALSE} + elif [ -n "${shunit_match_}" -a "${shunit_condition_}" = "${shunit_match_}" ] + then + # possible return value. treating 0 as true, and non-zero as false. + [ ${shunit_condition_} -eq 0 ] && shunit_return=${SHUNIT_FALSE} + else + # (hopefully) a condition + ( eval ${shunit_condition_} ) >/dev/null 2>&1 + [ $? -eq 0 ] && shunit_return=${SHUNIT_FALSE} + fi + + # record the test + if [ ${shunit_return} -eq ${SHUNIT_TRUE} ]; then + _shunit_assertPass + else + _shunit_assertFail "${shunit_message_}" + fi + + unset shunit_message_ shunit_condition_ shunit_match_ + return ${shunit_return} +} +_ASSERT_FALSE_='eval assertFalse --lineno "${LINENO:-}"' + +#----------------------------------------------------------------------------- +# failure functions +# + +# Records a test failure. +# +# Args: +# message: string: failure message [optional] +# Returns: +# integer: success (TRUE/FALSE/ERROR constant) +fail() +{ + ${_SHUNIT_LINENO_} + if [ $# -gt 1 ]; then + _shunit_error "fail() requires zero or one arguments; $# given" + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + shunit_message_=${__shunit_lineno} + if [ $# -eq 1 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + + _shunit_assertFail "${shunit_message_}" + + unset shunit_message_ + return ${SHUNIT_FALSE} +} +_FAIL_='eval fail --lineno "${LINENO:-}"' + +# Records a test failure, stating two values were not equal. +# +# Args: +# message: string: failure message [optional] +# expected: string: expected value +# actual: string: actual value +# Returns: +# integer: success (TRUE/FALSE/ERROR constant) +failNotEquals() +{ + ${_SHUNIT_LINENO_} + if [ $# -lt 2 -o $# -gt 3 ]; then + _shunit_error "failNotEquals() requires one or two arguments; $# given" + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + shunit_message_=${__shunit_lineno} + if [ $# -eq 3 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + shunit_expected_=$1 + shunit_actual_=$2 + + _shunit_assertFail "${shunit_message_:+${shunit_message_} }expected:<${shunit_expected_}> but was:<${shunit_actual_}>" + + unset shunit_message_ shunit_expected_ shunit_actual_ + return ${SHUNIT_FALSE} +} +_FAIL_NOT_EQUALS_='eval failNotEquals --lineno "${LINENO:-}"' + +# Records a test failure, stating two values should have been the same. +# +# Args: +# message: string: failure message [optional] +# expected: string: expected value +# actual: string: actual value +# Returns: +# integer: success (TRUE/FALSE/ERROR constant) +failSame() +{ + ${_SHUNIT_LINENO_} + if [ $# -lt 2 -o $# -gt 3 ]; then + _shunit_error "failSame() requires two or three arguments; $# given" + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + shunit_message_=${__shunit_lineno} + if [ $# -eq 3 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + + _shunit_assertFail "${shunit_message_:+${shunit_message_} }expected not same" + + unset shunit_message_ + return ${SHUNIT_FALSE} +} +_FAIL_SAME_='eval failSame --lineno "${LINENO:-}"' + +# Records a test failure, stating two values were not equal. +# +# This is functionally equivalent to calling failNotEquals(). +# +# Args: +# message: string: failure message [optional] +# expected: string: expected value +# actual: string: actual value +# Returns: +# integer: success (TRUE/FALSE/ERROR constant) +failNotSame() +{ + ${_SHUNIT_LINENO_} + if [ $# -lt 2 -o $# -gt 3 ]; then + _shunit_error "failNotEquals() requires one or two arguments; $# given" + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + shunit_message_=${__shunit_lineno} + if [ $# -eq 3 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + failNotEquals "${shunit_message_}" "$1" "$2" + shunit_return=$? + + unset shunit_message_ + return ${shunit_return} +} +_FAIL_NOT_SAME_='eval failNotSame --lineno "${LINENO:-}"' + +#----------------------------------------------------------------------------- +# skipping functions +# + +# Force remaining assert and fail functions to be "skipped". +# +# This function forces the remaining assert and fail functions to be "skipped", +# i.e. they will have no effect. Each function skipped will be recorded so that +# the total of asserts and fails will not be altered. +# +# Args: +# None +startSkipping() +{ + __shunit_skip=${SHUNIT_TRUE} +} + +# Resume the normal recording behavior of assert and fail calls. +# +# Args: +# None +endSkipping() +{ + __shunit_skip=${SHUNIT_FALSE} +} + +# Returns the state of assert and fail call skipping. +# +# Args: +# None +# Returns: +# boolean: (TRUE/FALSE constant) +isSkipping() +{ + return ${__shunit_skip} +} + +#----------------------------------------------------------------------------- +# suite functions +# + +# Stub. This function should contains all unit test calls to be made. +# +# DEPRECATED (as of 2.1.0) +# +# This function can be optionally overridden by the user in their test suite. +# +# If this function exists, it will be called when shunit2 is sourced. If it +# does not exist, shunit2 will search the parent script for all functions +# beginning with the word 'test', and they will be added dynamically to the +# test suite. +# +# This function should be overridden by the user in their unit test suite. +# Note: see _shunit_mktempFunc() for actual implementation +# +# Args: +# None +#suite() { :; } # DO NOT UNCOMMENT THIS FUNCTION + +# Adds a function name to the list of tests schedule for execution. +# +# This function should only be called from within the suite() function. +# +# Args: +# function: string: name of a function to add to current unit test suite +suite_addTest() +{ + shunit_func_=${1:-} + + __shunit_suite="${__shunit_suite:+${__shunit_suite} }${shunit_func_}" + __shunit_testsTotal=`expr ${__shunit_testsTotal} + 1` + + unset shunit_func_ +} + +# Stub. This function will be called once before any tests are run. +# +# Common one-time environment preparation tasks shared by all tests can be +# defined here. +# +# This function should be overridden by the user in their unit test suite. +# Note: see _shunit_mktempFunc() for actual implementation +# +# Args: +# None +#oneTimeSetUp() { :; } # DO NOT UNCOMMENT THIS FUNCTION + +# Stub. This function will be called once after all tests are finished. +# +# Common one-time environment cleanup tasks shared by all tests can be defined +# here. +# +# This function should be overridden by the user in their unit test suite. +# Note: see _shunit_mktempFunc() for actual implementation +# +# Args: +# None +#oneTimeTearDown() { :; } # DO NOT UNCOMMENT THIS FUNCTION + +# Stub. This function will be called before each test is run. +# +# Common environment preparation tasks shared by all tests can be defined here. +# +# This function should be overridden by the user in their unit test suite. +# Note: see _shunit_mktempFunc() for actual implementation +# +# Args: +# None +#setUp() { :; } + +# Note: see _shunit_mktempFunc() for actual implementation +# Stub. This function will be called after each test is run. +# +# Common environment cleanup tasks shared by all tests can be defined here. +# +# This function should be overridden by the user in their unit test suite. +# Note: see _shunit_mktempFunc() for actual implementation +# +# Args: +# None +#tearDown() { :; } # DO NOT UNCOMMENT THIS FUNCTION + +#------------------------------------------------------------------------------ +# internal shUnit2 functions +# + +# Create a temporary directory to store various run-time files in. +# +# This function is a cross-platform temporary directory creation tool. Not all +# OSes have the mktemp function, so one is included here. +# +# Args: +# None +# Outputs: +# string: the temporary directory that was created +_shunit_mktempDir() +{ + # try the standard mktemp function + ( exec mktemp -dqt shunit.XXXXXX 2>/dev/null ) && return + + # the standard mktemp didn't work. doing our own. + if [ -r '/dev/urandom' -a -x '/usr/bin/od' ]; then + _shunit_random_=`/usr/bin/od -vAn -N4 -tx4 "${_shunit_file_}" +#! /bin/sh +exit ${SHUNIT_TRUE} +EOF + chmod +x "${_shunit_file_}" + done + + unset _shunit_file_ +} + +# Final cleanup function to leave things as we found them. +# +# Besides removing the temporary directory, this function is in charge of the +# final exit code of the unit test. The exit code is based on how the script +# was ended (e.g. normal exit, or via Ctrl-C). +# +# Args: +# name: string: name of the trap called (specified when trap defined) +_shunit_cleanup() +{ + _shunit_name_=$1 + + case ${_shunit_name_} in + EXIT) _shunit_signal_=0 ;; + INT) _shunit_signal_=2 ;; + TERM) _shunit_signal_=15 ;; + *) + _shunit_warn "unrecognized trap value (${_shunit_name_})" + _shunit_signal_=0 + ;; + esac + + # do our work + rm -fr "${__shunit_tmpDir}" + + # exit for all non-EXIT signals + if [ ${_shunit_name_} != 'EXIT' ]; then + _shunit_warn "trapped and now handling the (${_shunit_name_}) signal" + # disable EXIT trap + trap 0 + # add 128 to signal and exit + exit `expr ${_shunit_signal_} + 128` + elif [ ${__shunit_reportGenerated} -eq ${SHUNIT_FALSE} ] ; then + _shunit_assertFail 'Unknown failure encountered running a test' + _shunit_generateReport + exit ${SHUNIT_ERROR} + fi + + unset _shunit_name_ _shunit_signal_ +} + +# The actual running of the tests happens here. +# +# Args: +# None +_shunit_execSuite() +{ + for _shunit_test_ in ${__shunit_suite}; do + __shunit_testSuccess=${SHUNIT_TRUE} + + # disable skipping + endSkipping + + # execute the per-test setup function + setUp + + # execute the test + echo "${_shunit_test_}" + eval ${_shunit_test_} + + # execute the per-test tear-down function + tearDown + + # update stats + if [ ${__shunit_testSuccess} -eq ${SHUNIT_TRUE} ]; then + __shunit_testsPassed=`expr ${__shunit_testsPassed} + 1` + else + __shunit_testsFailed=`expr ${__shunit_testsFailed} + 1` + fi + done + + unset _shunit_test_ +} + +# Generates the user friendly report with appropriate OK/FAILED message. +# +# Args: +# None +# Output: +# string: the report of successful and failed tests, as well as totals. +_shunit_generateReport() +{ + _shunit_ok_=${SHUNIT_TRUE} + + # if no exit code was provided one, determine an appropriate one + [ ${__shunit_testsFailed} -gt 0 \ + -o ${__shunit_testSuccess} -eq ${SHUNIT_FALSE} ] \ + && _shunit_ok_=${SHUNIT_FALSE} + + echo + if [ ${__shunit_testsTotal} -eq 1 ]; then + echo "Ran ${__shunit_testsTotal} test." + else + echo "Ran ${__shunit_testsTotal} tests." + fi + + _shunit_failures_='' + _shunit_skipped_='' + [ ${__shunit_assertsFailed} -gt 0 ] \ + && _shunit_failures_="failures=${__shunit_assertsFailed}" + [ ${__shunit_assertsSkipped} -gt 0 ] \ + && _shunit_skipped_="skipped=${__shunit_assertsSkipped}" + + if [ ${_shunit_ok_} -eq ${SHUNIT_TRUE} ]; then + _shunit_msg_='OK' + [ -n "${_shunit_skipped_}" ] \ + && _shunit_msg_="${_shunit_msg_} (${_shunit_skipped_})" + else + _shunit_msg_="FAILED (${_shunit_failures_}" + [ -n "${_shunit_skipped_}" ] \ + && _shunit_msg_="${_shunit_msg_},${_shunit_skipped_}" + _shunit_msg_="${_shunit_msg_})" + fi + + echo + echo ${_shunit_msg_} + __shunit_reportGenerated=${SHUNIT_TRUE} + + unset _shunit_failures_ _shunit_msg_ _shunit_ok_ _shunit_skipped_ +} + +# Test for whether a function should be skipped. +# +# Args: +# None +# Returns: +# boolean: whether the test should be skipped (TRUE/FALSE constant) +_shunit_shouldSkip() +{ + [ ${__shunit_skip} -eq ${SHUNIT_FALSE} ] && return ${SHUNIT_FALSE} + _shunit_assertSkip +} + +# Records a successful test. +# +# Args: +# None +_shunit_assertPass() +{ + __shunit_assertsPassed=`expr ${__shunit_assertsPassed} + 1` + __shunit_assertsTotal=`expr ${__shunit_assertsTotal} + 1` +} + +# Records a test failure. +# +# Args: +# message: string: failure message to provide user +_shunit_assertFail() +{ + _shunit_msg_=$1 + + __shunit_testSuccess=${SHUNIT_FALSE} + __shunit_assertsFailed=`expr ${__shunit_assertsFailed} + 1` + __shunit_assertsTotal=`expr ${__shunit_assertsTotal} + 1` + echo "${__SHUNIT_ASSERT_MSG_PREFIX}${_shunit_msg_}" + + unset _shunit_msg_ +} + +# Records a skipped test. +# +# Args: +# None +_shunit_assertSkip() +{ + __shunit_assertsSkipped=`expr ${__shunit_assertsSkipped} + 1` + __shunit_assertsTotal=`expr ${__shunit_assertsTotal} + 1` +} + +# Prepare a script filename for sourcing. +# +# Args: +# script: string: path to a script to source +# Returns: +# string: filename prefixed with ./ (if necessary) +_shunit_prepForSourcing() +{ + _shunit_script_=$1 + case "${_shunit_script_}" in + /*|./*) echo "${_shunit_script_}" ;; + *) echo "./${_shunit_script_}" ;; + esac + unset _shunit_script_ +} + +# Escape a character in a string. +# +# Args: +# c: string: unescaped character +# s: string: to escape character in +# Returns: +# string: with escaped character(s) +_shunit_escapeCharInStr() +{ + [ -n "$2" ] || return # no point in doing work on an empty string + + # Note: using shorter variable names to prevent conflicts with + # _shunit_escapeCharactersInString(). + _shunit_c_=$1 + _shunit_s_=$2 + + + # escape the character + echo ''${_shunit_s_}'' |sed 's/\'${_shunit_c_}'/\\\'${_shunit_c_}'/g' + + unset _shunit_c_ _shunit_s_ +} + +# Escape a character in a string. +# +# Args: +# str: string: to escape characters in +# Returns: +# string: with escaped character(s) +_shunit_escapeCharactersInString() +{ + [ -n "$1" ] || return # no point in doing work on an empty string + + _shunit_str_=$1 + + # Note: using longer variable names to prevent conflicts with + # _shunit_escapeCharInStr(). + for _shunit_char_ in '"' '$' "'" '`'; do + _shunit_str_=`_shunit_escapeCharInStr "${_shunit_char_}" "${_shunit_str_}"` + done + + echo "${_shunit_str_}" + unset _shunit_char_ _shunit_str_ +} + +# Extract list of functions to run tests against. +# +# Args: +# script: string: name of script to extract functions from +# Returns: +# string: of function names +_shunit_extractTestFunctions() +{ + _shunit_script_=$1 + + # extract the lines with test function names, strip of anything besides the + # function name, and output everything on a single line. + _shunit_regex_='^[ ]*(function )*test[A-Za-z0-9_]* *\(\)' + egrep "${_shunit_regex_}" "${_shunit_script_}" \ + |sed 's/^[^A-Za-z0-9_]*//;s/^function //;s/\([A-Za-z0-9_]*\).*/\1/g' \ + |xargs + + unset _shunit_regex_ _shunit_script_ +} + +#------------------------------------------------------------------------------ +# main +# + +# determine the operating mode +if [ $# -eq 0 ]; then + __shunit_script=${__SHUNIT_PARENT} + __shunit_mode=${__SHUNIT_MODE_SOURCED} +else + __shunit_script=$1 + [ -r "${__shunit_script}" ] || \ + _shunit_fatal "unable to read from ${__shunit_script}" + __shunit_mode=${__SHUNIT_MODE_STANDALONE} +fi + +# create a temporary storage location +__shunit_tmpDir=`_shunit_mktempDir` + +# provide a public temporary directory for unit test scripts +# TODO(kward): document this +SHUNIT_TMPDIR="${__shunit_tmpDir}/tmp" +mkdir "${SHUNIT_TMPDIR}" + +# setup traps to clean up after ourselves +trap '_shunit_cleanup EXIT' 0 +trap '_shunit_cleanup INT' 2 +trap '_shunit_cleanup TERM' 15 + +# create phantom functions to work around issues with Cygwin +_shunit_mktempFunc +PATH="${__shunit_tmpDir}:${PATH}" + +# make sure phantom functions are executable. this will bite if /tmp (or the +# current $TMPDIR) points to a path on a partition that was mounted with the +# 'noexec' option. the noexec command was created with _shunit_mktempFunc(). +noexec 2>/dev/null || _shunit_fatal \ + 'please declare TMPDIR with path on partition with exec permission' + +# we must manually source the tests in standalone mode +if [ "${__shunit_mode}" = "${__SHUNIT_MODE_STANDALONE}" ]; then + . "`_shunit_prepForSourcing \"${__shunit_script}\"`" +fi + +# execute the oneTimeSetUp function (if it exists) +oneTimeSetUp + +# execute the suite function defined in the parent test script +# deprecated as of 2.1.0 +suite + +# if no suite function was defined, dynamically build a list of functions +if [ -z "${__shunit_suite}" ]; then + shunit_funcs_=`_shunit_extractTestFunctions "${__shunit_script}"` + for shunit_func_ in ${shunit_funcs_}; do + suite_addTest ${shunit_func_} + done +fi +unset shunit_func_ shunit_funcs_ + +# execute the tests +_shunit_execSuite + +# execute the oneTimeTearDown function (if it exists) +oneTimeTearDown + +# generate the report +_shunit_generateReport + +# that's it folks +[ ${__shunit_testsFailed} -eq 0 ] +exit $? diff --git a/tests/cli/shunit2 b/tests/cli/shunit2 new file mode 100644 index 000000000..f347ca565 --- /dev/null +++ b/tests/cli/shunit2 @@ -0,0 +1,1067 @@ +#! /bin/sh +# $Id$ +# vim:et:ft=sh:sts=2:sw=2 +# +# Copyright 2008 Kate Ward. All Rights Reserved. +# Released under the LGPL (GNU Lesser General Public License) +# +# shUnit2 -- Unit testing framework for Unix shell scripts. +# http://code.google.com/p/shunit2/ +# +# Author: kate.ward@forestent.com (Kate Ward) +# +# shUnit2 is a xUnit based unit test framework for Bourne shell scripts. It is +# based on the popular JUnit unit testing framework for Java. + +# return if shunit already loaded +[ -n "${SHUNIT_VERSION:-}" ] && exit 0 +SHUNIT_VERSION='2.1.7pre' + +# return values that scripts can use +SHUNIT_TRUE=0 +SHUNIT_FALSE=1 +SHUNIT_ERROR=2 + +# logging functions +_shunit_warn() { echo "shunit2:WARN $@" >&2; } +_shunit_error() { echo "shunit2:ERROR $@" >&2; } +_shunit_fatal() { echo "shunit2:FATAL $@" >&2; exit ${SHUNIT_ERROR}; } + +# determine some reasonable command defaults +__SHUNIT_UNAME_S=`uname -s` +case "${__SHUNIT_UNAME_S}" in + BSD) __SHUNIT_EXPR_CMD='gexpr' ;; + *) __SHUNIT_EXPR_CMD='expr' ;; +esac + +# commands a user can override if needed +SHUNIT_EXPR_CMD=${SHUNIT_EXPR_CMD:-${__SHUNIT_EXPR_CMD}} + +# enable strict mode by default +SHUNIT_STRICT=${SHUNIT_STRICT:-${SHUNIT_TRUE}} + +# specific shell checks +if [ -n "${ZSH_VERSION:-}" ]; then + setopt |grep "^shwordsplit$" >/dev/null + if [ $? -ne ${SHUNIT_TRUE} ]; then + _shunit_fatal 'zsh shwordsplit option is required for proper operation' + fi + if [ -z "${SHUNIT_PARENT:-}" ]; then + _shunit_fatal "zsh does not pass \$0 through properly. please declare \ +\"SHUNIT_PARENT=\$0\" before calling shUnit2" + fi +fi + +# +# constants +# + +__SHUNIT_ASSERT_MSG_PREFIX='ASSERT:' +__SHUNIT_MODE_SOURCED='sourced' +__SHUNIT_MODE_STANDALONE='standalone' +__SHUNIT_PARENT=${SHUNIT_PARENT:-$0} + +# set the constants readonly +__shunit_constants=`set |grep '^__SHUNIT_' |cut -d= -f1` +echo "${__shunit_constants}" |grep '^Binary file' >/dev/null && \ + __shunit_constants=`set |grep -a '^__SHUNIT_' |cut -d= -f1` +for __shunit_const in ${__shunit_constants}; do + if [ -z "${ZSH_VERSION:-}" ]; then + readonly ${__shunit_const} + else + case ${ZSH_VERSION} in + [123].*) readonly ${__shunit_const} ;; + *) readonly -g ${__shunit_const} # declare readonly constants globally + esac + fi +done +unset __shunit_const __shunit_constants + +# +# internal variables +# + +# variables +__shunit_lineno='' # line number of executed test +__shunit_mode=${__SHUNIT_MODE_SOURCED} # operating mode +__shunit_reportGenerated=${SHUNIT_FALSE} # is report generated +__shunit_script='' # filename of unittest script (standalone mode) +__shunit_skip=${SHUNIT_FALSE} # is skipping enabled +__shunit_suite='' # suite of tests to execute + +# counts of tests +__shunit_testSuccess=${SHUNIT_TRUE} +__shunit_testsTotal=0 +__shunit_testsPassed=0 +__shunit_testsFailed=0 + +# counts of asserts +__shunit_assertsTotal=0 +__shunit_assertsPassed=0 +__shunit_assertsFailed=0 +__shunit_assertsSkipped=0 + +# macros +_SHUNIT_LINENO_='eval __shunit_lineno=""; if [ "${1:-}" = "--lineno" ]; then [ -n "$2" ] && __shunit_lineno="[$2] "; shift 2; fi' + +#----------------------------------------------------------------------------- +# private functions + +#----------------------------------------------------------------------------- +# assert functions +# + +# Assert that two values are equal to one another. +# +# Args: +# message: string: failure message [optional] +# expected: string: expected value +# actual: string: actual value +# Returns: +# integer: success (TRUE/FALSE/ERROR constant) +assertEquals() +{ + ${_SHUNIT_LINENO_} + if [ $# -lt 2 -o $# -gt 3 ]; then + _shunit_error "assertEquals() requires two or three arguments; $# given" + _shunit_error "1: ${1:+$1} 2: ${2:+$2} 3: ${3:+$3}${4:+ 4: $4}" + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + shunit_message_=${__shunit_lineno} + if [ $# -eq 3 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + shunit_expected_=$1 + shunit_actual_=$2 + + shunit_return=${SHUNIT_TRUE} + if [ "${shunit_expected_}" = "${shunit_actual_}" ]; then + _shunit_assertPass + else + failNotEquals "${shunit_message_}" "${shunit_expected_}" "${shunit_actual_}" + shunit_return=${SHUNIT_FALSE} + fi + + unset shunit_message_ shunit_expected_ shunit_actual_ + return ${shunit_return} +} +_ASSERT_EQUALS_='eval assertEquals --lineno "${LINENO:-}"' + +# Assert that two values are not equal to one another. +# +# Args: +# message: string: failure message [optional] +# expected: string: expected value +# actual: string: actual value +# Returns: +# integer: success (TRUE/FALSE/ERROR constant) +assertNotEquals() +{ + ${_SHUNIT_LINENO_} + if [ $# -lt 2 -o $# -gt 3 ]; then + _shunit_error "assertNotEquals() requires two or three arguments; $# given" + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + shunit_message_=${__shunit_lineno} + if [ $# -eq 3 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + shunit_expected_=$1 + shunit_actual_=$2 + + shunit_return=${SHUNIT_TRUE} + if [ "${shunit_expected_}" != "${shunit_actual_}" ]; then + _shunit_assertPass + else + failSame "${shunit_message_}" "$@" + shunit_return=${SHUNIT_FALSE} + fi + + unset shunit_message_ shunit_expected_ shunit_actual_ + return ${shunit_return} +} +_ASSERT_NOT_EQUALS_='eval assertNotEquals --lineno "${LINENO:-}"' + +# Assert that a value is null (i.e. an empty string) +# +# Args: +# message: string: failure message [optional] +# actual: string: actual value +# Returns: +# integer: success (TRUE/FALSE/ERROR constant) +assertNull() +{ + ${_SHUNIT_LINENO_} + if [ $# -lt 1 -o $# -gt 2 ]; then + _shunit_error "assertNull() requires one or two arguments; $# given" + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + shunit_message_=${__shunit_lineno} + if [ $# -eq 2 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + assertTrue "${shunit_message_}" "[ -z '$1' ]" + shunit_return=$? + + unset shunit_message_ + return ${shunit_return} +} +_ASSERT_NULL_='eval assertNull --lineno "${LINENO:-}"' + +# Assert that a value is not null (i.e. a non-empty string) +# +# Args: +# message: string: failure message [optional] +# actual: string: actual value +# Returns: +# integer: success (TRUE/FALSE/ERROR constant) +assertNotNull() +{ + ${_SHUNIT_LINENO_} + if [ $# -gt 2 ]; then # allowing 0 arguments as $1 might actually be null + _shunit_error "assertNotNull() requires one or two arguments; $# given" + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + shunit_message_=${__shunit_lineno} + if [ $# -eq 2 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + shunit_actual_=`_shunit_escapeCharactersInString "${1:-}"` + test -n "${shunit_actual_}" + assertTrue "${shunit_message_}" $? + shunit_return=$? + + unset shunit_actual_ shunit_message_ + return ${shunit_return} +} +_ASSERT_NOT_NULL_='eval assertNotNull --lineno "${LINENO:-}"' + +# Assert that two values are the same (i.e. equal to one another). +# +# Args: +# message: string: failure message [optional] +# expected: string: expected value +# actual: string: actual value +# Returns: +# integer: success (TRUE/FALSE/ERROR constant) +assertSame() +{ + ${_SHUNIT_LINENO_} + if [ $# -lt 2 -o $# -gt 3 ]; then + _shunit_error "assertSame() requires two or three arguments; $# given" + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + shunit_message_=${__shunit_lineno} + if [ $# -eq 3 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + assertEquals "${shunit_message_}" "$1" "$2" + shunit_return=$? + + unset shunit_message_ + return ${shunit_return} +} +_ASSERT_SAME_='eval assertSame --lineno "${LINENO:-}"' + +# Assert that two values are not the same (i.e. not equal to one another). +# +# Args: +# message: string: failure message [optional] +# expected: string: expected value +# actual: string: actual value +# Returns: +# integer: success (TRUE/FALSE/ERROR constant) +assertNotSame() +{ + ${_SHUNIT_LINENO_} + if [ $# -lt 2 -o $# -gt 3 ]; then + _shunit_error "assertNotSame() requires two or three arguments; $# given" + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + shunit_message_=${__shunit_lineno} + if [ $# -eq 3 ]; then + shunit_message_="${shunit_message_:-}$1" + shift + fi + assertNotEquals "${shunit_message_}" "$1" "$2" + shunit_return=$? + + unset shunit_message_ + return ${shunit_return} +} +_ASSERT_NOT_SAME_='eval assertNotSame --lineno "${LINENO:-}"' + +# Assert that a value or shell test condition is true. +# +# In shell, a value of 0 is true and a non-zero value is false. Any integer +# value passed can thereby be tested. +# +# Shell supports much more complicated tests though, and a means to support +# them was needed. As such, this function tests that conditions are true or +# false through evaluation rather than just looking for a true or false. +# +# The following test will succeed: +# assertTrue 0 +# assertTrue "[ 34 -gt 23 ]" +# The following test will fail with a message: +# assertTrue 123 +# assertTrue "test failed" "[ -r '/non/existent/file' ]" +# +# Args: +# message: string: failure message [optional] +# condition: string: integer value or shell conditional statement +# Returns: +# integer: success (TRUE/FALSE/ERROR constant) +assertTrue() +{ + ${_SHUNIT_LINENO_} + if [ $# -lt 1 -o $# -gt 2 ]; then + _shunit_error "assertTrue() takes one or two arguments; $# given" + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + shunit_message_=${__shunit_lineno} + if [ $# -eq 2 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + shunit_condition_=$1 + + # see if condition is an integer, i.e. a return value + shunit_match_=`expr "${shunit_condition_}" : '\([0-9]*\)'` + shunit_return=${SHUNIT_TRUE} + if [ -z "${shunit_condition_}" ]; then + # null condition + shunit_return=${SHUNIT_FALSE} + elif [ -n "${shunit_match_}" -a "${shunit_condition_}" = "${shunit_match_}" ] + then + # possible return value. treating 0 as true, and non-zero as false. + [ ${shunit_condition_} -ne 0 ] && shunit_return=${SHUNIT_FALSE} + else + # (hopefully) a condition + ( eval ${shunit_condition_} ) >/dev/null 2>&1 + [ $? -ne 0 ] && shunit_return=${SHUNIT_FALSE} + fi + + # record the test + if [ ${shunit_return} -eq ${SHUNIT_TRUE} ]; then + _shunit_assertPass + else + _shunit_assertFail "${shunit_message_}" + fi + + unset shunit_message_ shunit_condition_ shunit_match_ + return ${shunit_return} +} +_ASSERT_TRUE_='eval assertTrue --lineno "${LINENO:-}"' + +# Assert that a value or shell test condition is false. +# +# In shell, a value of 0 is true and a non-zero value is false. Any integer +# value passed can thereby be tested. +# +# Shell supports much more complicated tests though, and a means to support +# them was needed. As such, this function tests that conditions are true or +# false through evaluation rather than just looking for a true or false. +# +# The following test will succeed: +# assertFalse 1 +# assertFalse "[ 'apples' = 'oranges' ]" +# The following test will fail with a message: +# assertFalse 0 +# assertFalse "test failed" "[ 1 -eq 1 -a 2 -eq 2 ]" +# +# Args: +# message: string: failure message [optional] +# condition: string: integer value or shell conditional statement +# Returns: +# integer: success (TRUE/FALSE/ERROR constant) +assertFalse() +{ + ${_SHUNIT_LINENO_} + if [ $# -lt 1 -o $# -gt 2 ]; then + _shunit_error "assertFalse() quires one or two arguments; $# given" + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + shunit_message_=${__shunit_lineno} + if [ $# -eq 2 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + shunit_condition_=$1 + + # see if condition is an integer, i.e. a return value + shunit_match_=`expr "${shunit_condition_}" : '\([0-9]*\)'` + shunit_return=${SHUNIT_TRUE} + if [ -z "${shunit_condition_}" ]; then + # null condition + shunit_return=${SHUNIT_FALSE} + elif [ -n "${shunit_match_}" -a "${shunit_condition_}" = "${shunit_match_}" ] + then + # possible return value. treating 0 as true, and non-zero as false. + [ ${shunit_condition_} -eq 0 ] && shunit_return=${SHUNIT_FALSE} + else + # (hopefully) a condition + ( eval ${shunit_condition_} ) >/dev/null 2>&1 + [ $? -eq 0 ] && shunit_return=${SHUNIT_FALSE} + fi + + # record the test + if [ ${shunit_return} -eq ${SHUNIT_TRUE} ]; then + _shunit_assertPass + else + _shunit_assertFail "${shunit_message_}" + fi + + unset shunit_message_ shunit_condition_ shunit_match_ + return ${shunit_return} +} +_ASSERT_FALSE_='eval assertFalse --lineno "${LINENO:-}"' + +#----------------------------------------------------------------------------- +# failure functions +# + +# Records a test failure. +# +# Args: +# message: string: failure message [optional] +# Returns: +# integer: success (TRUE/FALSE/ERROR constant) +fail() +{ + ${_SHUNIT_LINENO_} + if [ $# -gt 1 ]; then + _shunit_error "fail() requires zero or one arguments; $# given" + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + shunit_message_=${__shunit_lineno} + if [ $# -eq 1 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + + _shunit_assertFail "${shunit_message_}" + + unset shunit_message_ + return ${SHUNIT_FALSE} +} +_FAIL_='eval fail --lineno "${LINENO:-}"' + +# Records a test failure, stating two values were not equal. +# +# Args: +# message: string: failure message [optional] +# expected: string: expected value +# actual: string: actual value +# Returns: +# integer: success (TRUE/FALSE/ERROR constant) +failNotEquals() +{ + ${_SHUNIT_LINENO_} + if [ $# -lt 2 -o $# -gt 3 ]; then + _shunit_error "failNotEquals() requires one or two arguments; $# given" + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + shunit_message_=${__shunit_lineno} + if [ $# -eq 3 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + shunit_expected_=$1 + shunit_actual_=$2 + + _shunit_assertFail "${shunit_message_:+${shunit_message_} }expected:<${shunit_expected_}> but was:<${shunit_actual_}>" + + unset shunit_message_ shunit_expected_ shunit_actual_ + return ${SHUNIT_FALSE} +} +_FAIL_NOT_EQUALS_='eval failNotEquals --lineno "${LINENO:-}"' + +# Records a test failure, stating two values should have been the same. +# +# Args: +# message: string: failure message [optional] +# expected: string: expected value +# actual: string: actual value +# Returns: +# integer: success (TRUE/FALSE/ERROR constant) +failSame() +{ + ${_SHUNIT_LINENO_} + if [ $# -lt 2 -o $# -gt 3 ]; then + _shunit_error "failSame() requires two or three arguments; $# given" + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + shunit_message_=${__shunit_lineno} + if [ $# -eq 3 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + + _shunit_assertFail "${shunit_message_:+${shunit_message_} }expected not same" + + unset shunit_message_ + return ${SHUNIT_FALSE} +} +_FAIL_SAME_='eval failSame --lineno "${LINENO:-}"' + +# Records a test failure, stating two values were not equal. +# +# This is functionally equivalent to calling failNotEquals(). +# +# Args: +# message: string: failure message [optional] +# expected: string: expected value +# actual: string: actual value +# Returns: +# integer: success (TRUE/FALSE/ERROR constant) +failNotSame() +{ + ${_SHUNIT_LINENO_} + if [ $# -lt 2 -o $# -gt 3 ]; then + _shunit_error "failNotEquals() requires one or two arguments; $# given" + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + shunit_message_=${__shunit_lineno} + if [ $# -eq 3 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + failNotEquals "${shunit_message_}" "$1" "$2" + shunit_return=$? + + unset shunit_message_ + return ${shunit_return} +} +_FAIL_NOT_SAME_='eval failNotSame --lineno "${LINENO:-}"' + +#----------------------------------------------------------------------------- +# skipping functions +# + +# Force remaining assert and fail functions to be "skipped". +# +# This function forces the remaining assert and fail functions to be "skipped", +# i.e. they will have no effect. Each function skipped will be recorded so that +# the total of asserts and fails will not be altered. +# +# Args: +# None +startSkipping() +{ + __shunit_skip=${SHUNIT_TRUE} +} + +# Resume the normal recording behavior of assert and fail calls. +# +# Args: +# None +endSkipping() +{ + __shunit_skip=${SHUNIT_FALSE} +} + +# Returns the state of assert and fail call skipping. +# +# Args: +# None +# Returns: +# boolean: (TRUE/FALSE constant) +isSkipping() +{ + return ${__shunit_skip} +} + +#----------------------------------------------------------------------------- +# suite functions +# + +# Stub. This function should contains all unit test calls to be made. +# +# DEPRECATED (as of 2.1.0) +# +# This function can be optionally overridden by the user in their test suite. +# +# If this function exists, it will be called when shunit2 is sourced. If it +# does not exist, shunit2 will search the parent script for all functions +# beginning with the word 'test', and they will be added dynamically to the +# test suite. +# +# This function should be overridden by the user in their unit test suite. +# Note: see _shunit_mktempFunc() for actual implementation +# +# Args: +# None +#suite() { :; } # DO NOT UNCOMMENT THIS FUNCTION + +# Adds a function name to the list of tests schedule for execution. +# +# This function should only be called from within the suite() function. +# +# Args: +# function: string: name of a function to add to current unit test suite +suite_addTest() +{ + shunit_func_=${1:-} + + __shunit_suite="${__shunit_suite:+${__shunit_suite} }${shunit_func_}" + __shunit_testsTotal=`expr ${__shunit_testsTotal} + 1` + + unset shunit_func_ +} + +# Stub. This function will be called once before any tests are run. +# +# Common one-time environment preparation tasks shared by all tests can be +# defined here. +# +# This function should be overridden by the user in their unit test suite. +# Note: see _shunit_mktempFunc() for actual implementation +# +# Args: +# None +#oneTimeSetUp() { :; } # DO NOT UNCOMMENT THIS FUNCTION + +# Stub. This function will be called once after all tests are finished. +# +# Common one-time environment cleanup tasks shared by all tests can be defined +# here. +# +# This function should be overridden by the user in their unit test suite. +# Note: see _shunit_mktempFunc() for actual implementation +# +# Args: +# None +#oneTimeTearDown() { :; } # DO NOT UNCOMMENT THIS FUNCTION + +# Stub. This function will be called before each test is run. +# +# Common environment preparation tasks shared by all tests can be defined here. +# +# This function should be overridden by the user in their unit test suite. +# Note: see _shunit_mktempFunc() for actual implementation +# +# Args: +# None +#setUp() { :; } + +# Note: see _shunit_mktempFunc() for actual implementation +# Stub. This function will be called after each test is run. +# +# Common environment cleanup tasks shared by all tests can be defined here. +# +# This function should be overridden by the user in their unit test suite. +# Note: see _shunit_mktempFunc() for actual implementation +# +# Args: +# None +#tearDown() { :; } # DO NOT UNCOMMENT THIS FUNCTION + +#------------------------------------------------------------------------------ +# internal shUnit2 functions +# + +# Create a temporary directory to store various run-time files in. +# +# This function is a cross-platform temporary directory creation tool. Not all +# OSes have the mktemp function, so one is included here. +# +# Args: +# None +# Outputs: +# string: the temporary directory that was created +_shunit_mktempDir() +{ + # try the standard mktemp function + ( exec mktemp -dqt shunit.XXXXXX 2>/dev/null ) && return + + # the standard mktemp didn't work. doing our own. + if [ -r '/dev/urandom' -a -x '/usr/bin/od' ]; then + _shunit_random_=`/usr/bin/od -vAn -N4 -tx4 "${_shunit_file_}" +#! /bin/sh +exit ${SHUNIT_TRUE} +EOF + chmod +x "${_shunit_file_}" + done + + unset _shunit_file_ +} + +# Final cleanup function to leave things as we found them. +# +# Besides removing the temporary directory, this function is in charge of the +# final exit code of the unit test. The exit code is based on how the script +# was ended (e.g. normal exit, or via Ctrl-C). +# +# Args: +# name: string: name of the trap called (specified when trap defined) +_shunit_cleanup() +{ + _shunit_name_=$1 + + case ${_shunit_name_} in + EXIT) _shunit_signal_=0 ;; + INT) _shunit_signal_=2 ;; + TERM) _shunit_signal_=15 ;; + *) + _shunit_warn "unrecognized trap value (${_shunit_name_})" + _shunit_signal_=0 + ;; + esac + + # do our work + rm -fr "${__shunit_tmpDir}" + + # exit for all non-EXIT signals + if [ ${_shunit_name_} != 'EXIT' ]; then + _shunit_warn "trapped and now handling the (${_shunit_name_}) signal" + # disable EXIT trap + trap 0 + # add 128 to signal and exit + exit `expr ${_shunit_signal_} + 128` + elif [ ${__shunit_reportGenerated} -eq ${SHUNIT_FALSE} ] ; then + _shunit_assertFail 'Unknown failure encountered running a test' + _shunit_generateReport + exit ${SHUNIT_ERROR} + fi + + unset _shunit_name_ _shunit_signal_ +} + +# The actual running of the tests happens here. +# +# Args: +# None +_shunit_execSuite() +{ + for _shunit_test_ in ${__shunit_suite}; do + __shunit_testSuccess=${SHUNIT_TRUE} + + # disable skipping + endSkipping + + # execute the per-test setup function + setUp + + # execute the test + echo "${_shunit_test_}" + eval ${_shunit_test_} + + # execute the per-test tear-down function + tearDown + + # update stats + if [ ${__shunit_testSuccess} -eq ${SHUNIT_TRUE} ]; then + __shunit_testsPassed=`expr ${__shunit_testsPassed} + 1` + else + __shunit_testsFailed=`expr ${__shunit_testsFailed} + 1` + fi + done + + unset _shunit_test_ +} + +# Generates the user friendly report with appropriate OK/FAILED message. +# +# Args: +# None +# Output: +# string: the report of successful and failed tests, as well as totals. +_shunit_generateReport() +{ + _shunit_ok_=${SHUNIT_TRUE} + + # if no exit code was provided one, determine an appropriate one + [ ${__shunit_testsFailed} -gt 0 \ + -o ${__shunit_testSuccess} -eq ${SHUNIT_FALSE} ] \ + && _shunit_ok_=${SHUNIT_FALSE} + + echo + if [ ${__shunit_testsTotal} -eq 1 ]; then + echo "Ran ${__shunit_testsTotal} test." + else + echo "Ran ${__shunit_testsTotal} tests." + fi + + _shunit_failures_='' + _shunit_skipped_='' + [ ${__shunit_assertsFailed} -gt 0 ] \ + && _shunit_failures_="failures=${__shunit_assertsFailed}" + [ ${__shunit_assertsSkipped} -gt 0 ] \ + && _shunit_skipped_="skipped=${__shunit_assertsSkipped}" + + if [ ${_shunit_ok_} -eq ${SHUNIT_TRUE} ]; then + _shunit_msg_='OK' + [ -n "${_shunit_skipped_}" ] \ + && _shunit_msg_="${_shunit_msg_} (${_shunit_skipped_})" + else + _shunit_msg_="FAILED (${_shunit_failures_}" + [ -n "${_shunit_skipped_}" ] \ + && _shunit_msg_="${_shunit_msg_},${_shunit_skipped_}" + _shunit_msg_="${_shunit_msg_})" + fi + + echo + echo ${_shunit_msg_} + __shunit_reportGenerated=${SHUNIT_TRUE} + + unset _shunit_failures_ _shunit_msg_ _shunit_ok_ _shunit_skipped_ +} + +# Test for whether a function should be skipped. +# +# Args: +# None +# Returns: +# boolean: whether the test should be skipped (TRUE/FALSE constant) +_shunit_shouldSkip() +{ + [ ${__shunit_skip} -eq ${SHUNIT_FALSE} ] && return ${SHUNIT_FALSE} + _shunit_assertSkip +} + +# Records a successful test. +# +# Args: +# None +_shunit_assertPass() +{ + __shunit_assertsPassed=`expr ${__shunit_assertsPassed} + 1` + __shunit_assertsTotal=`expr ${__shunit_assertsTotal} + 1` +} + +# Records a test failure. +# +# Args: +# message: string: failure message to provide user +_shunit_assertFail() +{ + _shunit_msg_=$1 + + __shunit_testSuccess=${SHUNIT_FALSE} + __shunit_assertsFailed=`expr ${__shunit_assertsFailed} + 1` + __shunit_assertsTotal=`expr ${__shunit_assertsTotal} + 1` + echo "${__SHUNIT_ASSERT_MSG_PREFIX}${_shunit_msg_}" + + unset _shunit_msg_ +} + +# Records a skipped test. +# +# Args: +# None +_shunit_assertSkip() +{ + __shunit_assertsSkipped=`expr ${__shunit_assertsSkipped} + 1` + __shunit_assertsTotal=`expr ${__shunit_assertsTotal} + 1` +} + +# Prepare a script filename for sourcing. +# +# Args: +# script: string: path to a script to source +# Returns: +# string: filename prefixed with ./ (if necessary) +_shunit_prepForSourcing() +{ + _shunit_script_=$1 + case "${_shunit_script_}" in + /*|./*) echo "${_shunit_script_}" ;; + *) echo "./${_shunit_script_}" ;; + esac + unset _shunit_script_ +} + +# Escape a character in a string. +# +# Args: +# c: string: unescaped character +# s: string: to escape character in +# Returns: +# string: with escaped character(s) +_shunit_escapeCharInStr() +{ + [ -n "$2" ] || return # no point in doing work on an empty string + + # Note: using shorter variable names to prevent conflicts with + # _shunit_escapeCharactersInString(). + _shunit_c_=$1 + _shunit_s_=$2 + + + # escape the character + echo ''${_shunit_s_}'' |sed 's/\'${_shunit_c_}'/\\\'${_shunit_c_}'/g' + + unset _shunit_c_ _shunit_s_ +} + +# Escape a character in a string. +# +# Args: +# str: string: to escape characters in +# Returns: +# string: with escaped character(s) +_shunit_escapeCharactersInString() +{ + [ -n "$1" ] || return # no point in doing work on an empty string + + _shunit_str_=$1 + + # Note: using longer variable names to prevent conflicts with + # _shunit_escapeCharInStr(). + for _shunit_char_ in '"' '$' "'" '`'; do + _shunit_str_=`_shunit_escapeCharInStr "${_shunit_char_}" "${_shunit_str_}"` + done + + echo "${_shunit_str_}" + unset _shunit_char_ _shunit_str_ +} + +# Extract list of functions to run tests against. +# +# Args: +# script: string: name of script to extract functions from +# Returns: +# string: of function names +_shunit_extractTestFunctions() +{ + _shunit_script_=$1 + + # extract the lines with test function names, strip of anything besides the + # function name, and output everything on a single line. + _shunit_regex_='^[ ]*(function )*test[A-Za-z0-9_]* *\(\)' + egrep "${_shunit_regex_}" "${_shunit_script_}" \ + |sed 's/^[^A-Za-z0-9_]*//;s/^function //;s/\([A-Za-z0-9_]*\).*/\1/g' \ + |xargs + + unset _shunit_regex_ _shunit_script_ +} + +#------------------------------------------------------------------------------ +# main +# + +# determine the operating mode +if [ $# -eq 0 ]; then + __shunit_script=${__SHUNIT_PARENT} + __shunit_mode=${__SHUNIT_MODE_SOURCED} +else + __shunit_script=$1 + [ -r "${__shunit_script}" ] || \ + _shunit_fatal "unable to read from ${__shunit_script}" + __shunit_mode=${__SHUNIT_MODE_STANDALONE} +fi + +# create a temporary storage location +__shunit_tmpDir=`_shunit_mktempDir` + +# provide a public temporary directory for unit test scripts +# TODO(kward): document this +SHUNIT_TMPDIR="${__shunit_tmpDir}/tmp" +mkdir "${SHUNIT_TMPDIR}" + +# setup traps to clean up after ourselves +trap '_shunit_cleanup EXIT' 0 +trap '_shunit_cleanup INT' 2 +trap '_shunit_cleanup TERM' 15 + +# create phantom functions to work around issues with Cygwin +_shunit_mktempFunc +PATH="${__shunit_tmpDir}:${PATH}" + +# make sure phantom functions are executable. this will bite if /tmp (or the +# current $TMPDIR) points to a path on a partition that was mounted with the +# 'noexec' option. the noexec command was created with _shunit_mktempFunc(). +noexec 2>/dev/null || _shunit_fatal \ + 'please declare TMPDIR with path on partition with exec permission' + +# we must manually source the tests in standalone mode +if [ "${__shunit_mode}" = "${__SHUNIT_MODE_STANDALONE}" ]; then + . "`_shunit_prepForSourcing \"${__shunit_script}\"`" +fi + +# execute the oneTimeSetUp function (if it exists) +oneTimeSetUp + +# execute the suite function defined in the parent test script +# deprecated as of 2.1.0 +suite + +# if no suite function was defined, dynamically build a list of functions +if [ -z "${__shunit_suite}" ]; then + shunit_funcs_=`_shunit_extractTestFunctions "${__shunit_script}"` + for shunit_func_ in ${shunit_funcs_}; do + suite_addTest ${shunit_func_} + done +fi +unset shunit_func_ shunit_funcs_ + +# execute the tests +_shunit_execSuite + +# execute the oneTimeTearDown function (if it exists) +oneTimeTearDown + +# generate the report +_shunit_generateReport + +# that's it folks +[ ${__shunit_testsFailed} -eq 0 ] +exit $? From 041396b53e8782f7e48e1a3ad7b647def2647995 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 30 Aug 2017 20:42:24 +0200 Subject: [PATCH 4/9] Moved eyes into example apps, cleaned up Makefile --- Makefile | 23 +++++++++++----------- examples/eyes/Makefile | 14 +++++++++++++ {cmd => examples/eyes/cmd}/eyes/init.go | 0 {cmd => examples/eyes/cmd}/eyes/main.go | 0 {cmd => examples/eyes/cmd}/eyescli/main.go | 0 {tests => examples/eyes/tests}/cli/eyes.sh | 6 ++++-- 6 files changed, 29 insertions(+), 14 deletions(-) create mode 100644 examples/eyes/Makefile rename {cmd => examples/eyes/cmd}/eyes/init.go (100%) rename {cmd => examples/eyes/cmd}/eyes/main.go (100%) rename {cmd => examples/eyes/cmd}/eyescli/main.go (100%) rename {tests => examples/eyes/tests}/cli/eyes.sh (96%) diff --git a/Makefile b/Makefile index 52f23619d..61ecd5187 100644 --- a/Makefile +++ b/Makefile @@ -3,8 +3,9 @@ GOTOOLS = github.com/mitchellh/gox \ github.com/rigelrozanski/shelldown/cmd/shelldown TUTORIALS=$(shell find docs/guide -name "*md" -type f) -EXAMPLES := counter -EXAMPLE_DIRS := $(addprefix ./examples/,${EXAMPLES}) +EXAMPLES := counter eyes +INSTALL_EXAMPLES := $(addprefix install_,${EXAMPLES}) +TEST_EXAMPLES := $(addprefix testex_,${EXAMPLES}) LINKER_FLAGS:="-X github.com/cosmos/cosmos-sdk/client/commands.CommitHash=`git rev-parse --short HEAD`" @@ -13,11 +14,14 @@ all: get_vendor_deps install test build: @go build ./cmd/... -install: +$(INSTALL_EXAMPLES): install_%: + cd ./examples/$* && make install + +$(TEST_EXAMPLES): testex_%: + cd ./examples/$* && make test_cli + +install: $(INSTALL_EXAMPLES) @go install -ldflags $(LINKER_FLAGS) ./cmd/... - @for EX in $(EXAMPLE_DIRS); do \ - cd $$EX && make install; \ - done dist: @bash publish/dist.sh @@ -31,23 +35,18 @@ test: test_unit test_cli test_unit: @go test `glide novendor` - #go run tests/tendermint/*.go -test_cli: +test_cli: $(TEST_EXAMPLES) # sudo apt-get install jq # wget "https://raw.githubusercontent.com/kward/shunit2/master/source/2.1/src/shunit2" ./tests/cli/keys.sh ./tests/cli/rpc.sh ./tests/cli/init.sh ./tests/cli/basictx.sh - ./tests/cli/eyes.sh ./tests/cli/roles.sh ./tests/cli/restart.sh ./tests/cli/rest.sh ./tests/cli/ibc.sh - @for EX in $(EXAMPLE_DIRS); do \ - cd $$EX && make test_cli; \ - done test_tutorial: @shelldown ${TUTORIALS} diff --git a/examples/eyes/Makefile b/examples/eyes/Makefile new file mode 100644 index 000000000..e543a4ccf --- /dev/null +++ b/examples/eyes/Makefile @@ -0,0 +1,14 @@ +LINKER_FLAGS:="-X github.com/cosmos/cosmos-sdk/client/commands.CommitHash=`git rev-parse --short HEAD`" + +install: + @go install -ldflags $(LINKER_FLAGS) ./cmd/... + +test: test_unit test_cli + +test_unit: + @go test `glide novendor` + +test_cli: + ./tests/cli/eyes.sh + +.PHONY: install test test_unit test_cli diff --git a/cmd/eyes/init.go b/examples/eyes/cmd/eyes/init.go similarity index 100% rename from cmd/eyes/init.go rename to examples/eyes/cmd/eyes/init.go diff --git a/cmd/eyes/main.go b/examples/eyes/cmd/eyes/main.go similarity index 100% rename from cmd/eyes/main.go rename to examples/eyes/cmd/eyes/main.go diff --git a/cmd/eyescli/main.go b/examples/eyes/cmd/eyescli/main.go similarity index 100% rename from cmd/eyescli/main.go rename to examples/eyes/cmd/eyescli/main.go diff --git a/tests/cli/eyes.sh b/examples/eyes/tests/cli/eyes.sh similarity index 96% rename from tests/cli/eyes.sh rename to examples/eyes/tests/cli/eyes.sh index 7a2f25655..7f8a427c7 100755 --- a/tests/cli/eyes.sh +++ b/examples/eyes/tests/cli/eyes.sh @@ -66,6 +66,8 @@ test00SetGetRemove() { # Load common then run these tests with shunit2! DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" #get this files directory -. $DIR/common.sh -. $DIR/shunit2 +CLI_DIR=${DIR}/../../../../tests/cli + +. $CLI_DIR/common.sh +. $CLI_DIR/shunit2 From b27449447423ff319116e4c8b1d119c175a163ee Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 30 Aug 2017 21:01:40 +0200 Subject: [PATCH 5/9] Fix timing issue in rest cli test --- tests/cli/rest.sh | 58 +++++++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/tests/cli/rest.sh b/tests/cli/rest.sh index 06ae7fc76..163f26ebb 100755 --- a/tests/cli/rest.sh +++ b/tests/cli/rest.sh @@ -17,6 +17,7 @@ oneTimeSetUp() { baseserver serve --port $BPORT >/dev/null & PID_PROXY=$! disown + sleep 0.1 # for startup } oneTimeTearDown() { @@ -29,7 +30,8 @@ oneTimeTearDown() { restAddr() { assertNotNull "line=${LINENO}, keyname required" "$1" ADDR=$(curl ${URL}/keys/${1} 2>/dev/null | jq .address | tr -d \") - assertNotEquals "line=${LINENO}, no key" "null" $ADDR + assertNotEquals "line=${LINENO}, null key" "null" "$ADDR" + assertNotEquals "line=${LINENO}, no key" "" "$ADDR" echo $ADDR } @@ -49,13 +51,39 @@ restNoAccount() { } test00GetAccount() { + RECV=$(restAddr $POOR) + SENDER=$(restAddr $RICH) + + restNoAccount $RECV + restAccount $SENDER "9007199254740992" +} + +test01SendTx() { SENDER=$(restAddr $RICH) RECV=$(restAddr $POOR) - restAccount $SENDER "9007199254740992" - restNoAccount $RECV + CMD="{\"from\": {\"app\": \"sigs\", \"addr\": \"$SENDER\"}, \"to\": {\"app\": \"sigs\", \"addr\": \"$RECV\"}, \"amount\": [{\"denom\": \"mycoin\", \"amount\": 992}], \"sequence\": 1}" + + UNSIGNED=$(curl -XPOST ${URL}/build/send -d "$CMD" 2>/dev/null) + if [ -n "$DEBUG" ]; then echo $UNSIGNED; echo; fi + + TOSIGN="{\"name\": \"$RICH\", \"password\": \"qwertyuiop\", \"tx\": $UNSIGNED}" + SIGNED=$(curl -XPOST ${URL}/sign -d "$TOSIGN" 2>/dev/null) + TX=$(curl -XPOST ${URL}/tx -d "$SIGNED" 2>/dev/null) + if [ -n "$DEBUG" ]; then echo $TX; echo; fi + + txSucceeded $? "$TX" "$RECV" + HASH=$(echo $TX | jq .hash | tr -d \") + TX_HEIGHT=$(echo $TX | jq .height) + + restAccount $SENDER "9007199254740000" + restAccount $RECV "992" + + # Make sure tx is indexed + checkSendTx $HASH $TX_HEIGHT $SENDER "992" } + # XXX Ex Usage: restCreateRole $PAYLOAD $EXPECTED # Desc: Tests that the first returned signer.addr matches the expected restCreateRole() { @@ -86,30 +114,6 @@ test04CreateRoleInvalid() { assertEquals "line=${LINENO}, should report validation failed" 0 $(echo $ERROR | grep "invalid hex" > /dev/null && echo 0 || echo 1) } -test01SendTx() { - SENDER=$(restAddr $RICH) - RECV=$(restAddr $POOR) - - CMD="{\"from\": {\"app\": \"sigs\", \"addr\": \"$SENDER\"}, \"to\": {\"app\": \"sigs\", \"addr\": \"$RECV\"}, \"amount\": [{\"denom\": \"mycoin\", \"amount\": 992}], \"sequence\": 1}" - - UNSIGNED=$(curl -XPOST ${URL}/build/send -d "$CMD" 2>/dev/null) - if [ -n "$DEBUG" ]; then echo $UNSIGNED; echo; fi - - TOSIGN="{\"name\": \"$RICH\", \"password\": \"qwertyuiop\", \"tx\": $UNSIGNED}" - SIGNED=$(curl -XPOST ${URL}/sign -d "$TOSIGN" 2>/dev/null) - TX=$(curl -XPOST ${URL}/tx -d "$SIGNED" 2>/dev/null) - if [ -n "$DEBUG" ]; then echo $TX; echo; fi - - txSucceeded $? "$TX" "$RECV" - HASH=$(echo $TX | jq .hash | tr -d \") - TX_HEIGHT=$(echo $TX | jq .height) - - restAccount $SENDER "9007199254740000" - restAccount $RECV "992" - - # Make sure tx is indexed - checkSendTx $HASH $TX_HEIGHT $SENDER "992" -} # test02SendTxWithFee() { # SENDER=$(getAddr $RICH) From 96f96ffc3d9485404b34c33d02b3a9a3577c83da Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Wed, 30 Aug 2017 21:09:54 +0200 Subject: [PATCH 6/9] Moved basecoin into examples --- Makefile | 10 +-------- examples/basecoin/Makefile | 21 +++++++++++++++++++ .../basecoin/cmd}/basecli/LIGHT_NODE.md | 0 .../basecoin/cmd}/basecli/README.md | 0 .../basecoin/cmd}/basecli/main.go | 0 .../basecoin/cmd}/basecoin/commands/ibc.go | 0 .../basecoin/cmd}/basecoin/commands/init.go | 0 .../basecoin/cmd}/basecoin/commands/key.go | 0 .../basecoin/cmd}/basecoin/commands/relay.go | 0 .../basecoin/cmd}/basecoin/commands/reset.go | 0 .../basecoin/cmd}/basecoin/commands/root.go | 0 .../basecoin/cmd}/basecoin/commands/start.go | 0 .../basecoin/cmd}/basecoin/main.go | 2 +- .../basecoin/cmd}/baseserver/README.md | 0 .../basecoin/cmd}/baseserver/main.go | 0 .../basecoin/tests}/cli/basictx.sh | 8 +++++-- {tests => examples/basecoin/tests}/cli/ibc.sh | 8 +++++-- .../basecoin/tests}/cli/init.sh | 6 +++++- .../basecoin/tests}/cli/keys.sh | 6 +++++- .../basecoin/tests}/cli/rest.sh | 8 +++++-- .../basecoin/tests}/cli/restart.sh | 8 +++++-- .../basecoin/tests}/cli/roles.sh | 8 +++++-- {tests => examples/basecoin/tests}/cli/rpc.sh | 5 ++++- examples/counter/cmd/counter/main.go | 2 +- examples/eyes/cmd/eyes/init.go | 2 +- examples/eyes/cmd/eyes/main.go | 2 +- 26 files changed, 70 insertions(+), 26 deletions(-) create mode 100644 examples/basecoin/Makefile rename {cmd => examples/basecoin/cmd}/basecli/LIGHT_NODE.md (100%) rename {cmd => examples/basecoin/cmd}/basecli/README.md (100%) rename {cmd => examples/basecoin/cmd}/basecli/main.go (100%) rename {cmd => examples/basecoin/cmd}/basecoin/commands/ibc.go (100%) rename {cmd => examples/basecoin/cmd}/basecoin/commands/init.go (100%) rename {cmd => examples/basecoin/cmd}/basecoin/commands/key.go (100%) rename {cmd => examples/basecoin/cmd}/basecoin/commands/relay.go (100%) rename {cmd => examples/basecoin/cmd}/basecoin/commands/reset.go (100%) rename {cmd => examples/basecoin/cmd}/basecoin/commands/root.go (100%) rename {cmd => examples/basecoin/cmd}/basecoin/commands/start.go (100%) rename {cmd => examples/basecoin/cmd}/basecoin/main.go (95%) rename {cmd => examples/basecoin/cmd}/baseserver/README.md (100%) rename {cmd => examples/basecoin/cmd}/baseserver/main.go (100%) rename {tests => examples/basecoin/tests}/cli/basictx.sh (96%) rename {tests => examples/basecoin/tests}/cli/ibc.sh (99%) rename {tests => examples/basecoin/tests}/cli/init.sh (96%) rename {tests => examples/basecoin/tests}/cli/keys.sh (85%) rename {tests => examples/basecoin/tests}/cli/rest.sh (97%) rename {tests => examples/basecoin/tests}/cli/restart.sh (94%) rename {tests => examples/basecoin/tests}/cli/roles.sh (95%) rename {tests => examples/basecoin/tests}/cli/rpc.sh (97%) diff --git a/Makefile b/Makefile index 61ecd5187..02cd94cc2 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ GOTOOLS = github.com/mitchellh/gox \ github.com/rigelrozanski/shelldown/cmd/shelldown TUTORIALS=$(shell find docs/guide -name "*md" -type f) -EXAMPLES := counter eyes +EXAMPLES := counter eyes basecoin INSTALL_EXAMPLES := $(addprefix install_,${EXAMPLES}) TEST_EXAMPLES := $(addprefix testex_,${EXAMPLES}) @@ -39,14 +39,6 @@ test_unit: test_cli: $(TEST_EXAMPLES) # sudo apt-get install jq # wget "https://raw.githubusercontent.com/kward/shunit2/master/source/2.1/src/shunit2" - ./tests/cli/keys.sh - ./tests/cli/rpc.sh - ./tests/cli/init.sh - ./tests/cli/basictx.sh - ./tests/cli/roles.sh - ./tests/cli/restart.sh - ./tests/cli/rest.sh - ./tests/cli/ibc.sh test_tutorial: @shelldown ${TUTORIALS} diff --git a/examples/basecoin/Makefile b/examples/basecoin/Makefile new file mode 100644 index 000000000..a2557acfe --- /dev/null +++ b/examples/basecoin/Makefile @@ -0,0 +1,21 @@ +LINKER_FLAGS:="-X github.com/cosmos/cosmos-sdk/client/commands.CommitHash=`git rev-parse --short HEAD`" + +install: + @go install -ldflags $(LINKER_FLAGS) ./cmd/... + +test: test_unit test_cli + +test_unit: + @go test `glide novendor` + +test_cli: + ./tests/cli/keys.sh + ./tests/cli/rpc.sh + ./tests/cli/init.sh + ./tests/cli/basictx.sh + ./tests/cli/roles.sh + ./tests/cli/restart.sh + ./tests/cli/rest.sh + ./tests/cli/ibc.sh + +.PHONY: install test test_unit test_cli diff --git a/cmd/basecli/LIGHT_NODE.md b/examples/basecoin/cmd/basecli/LIGHT_NODE.md similarity index 100% rename from cmd/basecli/LIGHT_NODE.md rename to examples/basecoin/cmd/basecli/LIGHT_NODE.md diff --git a/cmd/basecli/README.md b/examples/basecoin/cmd/basecli/README.md similarity index 100% rename from cmd/basecli/README.md rename to examples/basecoin/cmd/basecli/README.md diff --git a/cmd/basecli/main.go b/examples/basecoin/cmd/basecli/main.go similarity index 100% rename from cmd/basecli/main.go rename to examples/basecoin/cmd/basecli/main.go diff --git a/cmd/basecoin/commands/ibc.go b/examples/basecoin/cmd/basecoin/commands/ibc.go similarity index 100% rename from cmd/basecoin/commands/ibc.go rename to examples/basecoin/cmd/basecoin/commands/ibc.go diff --git a/cmd/basecoin/commands/init.go b/examples/basecoin/cmd/basecoin/commands/init.go similarity index 100% rename from cmd/basecoin/commands/init.go rename to examples/basecoin/cmd/basecoin/commands/init.go diff --git a/cmd/basecoin/commands/key.go b/examples/basecoin/cmd/basecoin/commands/key.go similarity index 100% rename from cmd/basecoin/commands/key.go rename to examples/basecoin/cmd/basecoin/commands/key.go diff --git a/cmd/basecoin/commands/relay.go b/examples/basecoin/cmd/basecoin/commands/relay.go similarity index 100% rename from cmd/basecoin/commands/relay.go rename to examples/basecoin/cmd/basecoin/commands/relay.go diff --git a/cmd/basecoin/commands/reset.go b/examples/basecoin/cmd/basecoin/commands/reset.go similarity index 100% rename from cmd/basecoin/commands/reset.go rename to examples/basecoin/cmd/basecoin/commands/reset.go diff --git a/cmd/basecoin/commands/root.go b/examples/basecoin/cmd/basecoin/commands/root.go similarity index 100% rename from cmd/basecoin/commands/root.go rename to examples/basecoin/cmd/basecoin/commands/root.go diff --git a/cmd/basecoin/commands/start.go b/examples/basecoin/cmd/basecoin/commands/start.go similarity index 100% rename from cmd/basecoin/commands/start.go rename to examples/basecoin/cmd/basecoin/commands/start.go diff --git a/cmd/basecoin/main.go b/examples/basecoin/cmd/basecoin/main.go similarity index 95% rename from cmd/basecoin/main.go rename to examples/basecoin/cmd/basecoin/main.go index c14eacca6..d41c8d34a 100644 --- a/cmd/basecoin/main.go +++ b/examples/basecoin/cmd/basecoin/main.go @@ -7,7 +7,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk" client "github.com/cosmos/cosmos-sdk/client/commands" - "github.com/cosmos/cosmos-sdk/cmd/basecoin/commands" + "github.com/cosmos/cosmos-sdk/examples/basecoin/cmd/basecoin/commands" "github.com/cosmos/cosmos-sdk/modules/auth" "github.com/cosmos/cosmos-sdk/modules/base" "github.com/cosmos/cosmos-sdk/modules/coin" diff --git a/cmd/baseserver/README.md b/examples/basecoin/cmd/baseserver/README.md similarity index 100% rename from cmd/baseserver/README.md rename to examples/basecoin/cmd/baseserver/README.md diff --git a/cmd/baseserver/main.go b/examples/basecoin/cmd/baseserver/main.go similarity index 100% rename from cmd/baseserver/main.go rename to examples/basecoin/cmd/baseserver/main.go diff --git a/tests/cli/basictx.sh b/examples/basecoin/tests/cli/basictx.sh similarity index 96% rename from tests/cli/basictx.sh rename to examples/basecoin/tests/cli/basictx.sh index 1831f76f7..ac9305c0f 100755 --- a/tests/cli/basictx.sh +++ b/examples/basecoin/tests/cli/basictx.sh @@ -116,5 +116,9 @@ test03CreditTx() { # Load common then run these tests with shunit2! DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" #get this files directory -. $DIR/common.sh -. $DIR/shunit2 + +# TODO: how to handle this if we are not in the same directory +CLI_DIR=${DIR}/../../../../tests/cli + +. $CLI_DIR/common.sh +. $CLI_DIR/shunit2 diff --git a/tests/cli/ibc.sh b/examples/basecoin/tests/cli/ibc.sh similarity index 99% rename from tests/cli/ibc.sh rename to examples/basecoin/tests/cli/ibc.sh index 849516cf2..7bf70f10d 100755 --- a/tests/cli/ibc.sh +++ b/examples/basecoin/tests/cli/ibc.sh @@ -353,5 +353,9 @@ assertNewHeight() { # Load common then run these tests with shunit2! DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" #get this files directory -. $DIR/common.sh -. $DIR/shunit2 + +# TODO: how to handle this if we are not in the same directory +CLI_DIR=${DIR}/../../../../tests/cli + +. $CLI_DIR/common.sh +. $CLI_DIR/shunit2 diff --git a/tests/cli/init.sh b/examples/basecoin/tests/cli/init.sh similarity index 96% rename from tests/cli/init.sh rename to examples/basecoin/tests/cli/init.sh index 9de8057c4..62d50fb8e 100755 --- a/tests/cli/init.sh +++ b/examples/basecoin/tests/cli/init.sh @@ -105,4 +105,8 @@ checkDir() { # load and run these tests with shunit2! DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" #get this files directory -. $DIR/shunit2 + +# TODO: how to handle this if we are not in the same directory +CLI_DIR=${DIR}/../../../../tests/cli + +. $CLI_DIR/shunit2 diff --git a/tests/cli/keys.sh b/examples/basecoin/tests/cli/keys.sh similarity index 85% rename from tests/cli/keys.sh rename to examples/basecoin/tests/cli/keys.sh index 89e1ee538..36cbcbb9b 100755 --- a/tests/cli/keys.sh +++ b/examples/basecoin/tests/cli/keys.sh @@ -26,4 +26,8 @@ testMakeKeys() { # load and run these tests with shunit2! DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" #get this files directory -. $DIR/shunit2 + +# TODO: how to handle this if we are not in the same directory +CLI_DIR=${DIR}/../../../../tests/cli + +. $CLI_DIR/shunit2 diff --git a/tests/cli/rest.sh b/examples/basecoin/tests/cli/rest.sh similarity index 97% rename from tests/cli/rest.sh rename to examples/basecoin/tests/cli/rest.sh index 163f26ebb..672fb32d1 100755 --- a/tests/cli/rest.sh +++ b/examples/basecoin/tests/cli/rest.sh @@ -151,5 +151,9 @@ test04CreateRoleInvalid() { # Load common then run these tests with shunit2! DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" #get this files directory -. $DIR/common.sh -. $DIR/shunit2 + +# TODO: how to handle this if we are not in the same directory +CLI_DIR=${DIR}/../../../../tests/cli + +. $CLI_DIR/common.sh +. $CLI_DIR/shunit2 diff --git a/tests/cli/restart.sh b/examples/basecoin/tests/cli/restart.sh similarity index 94% rename from tests/cli/restart.sh rename to examples/basecoin/tests/cli/restart.sh index c6c6a500b..37ccb35ce 100755 --- a/tests/cli/restart.sh +++ b/examples/basecoin/tests/cli/restart.sh @@ -78,6 +78,10 @@ test01OnRestart() { # Load common then run these tests with shunit2! DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" #get this files directory -. $DIR/common.sh -. $DIR/shunit2 + +# TODO: how to handle this if we are not in the same directory +CLI_DIR=${DIR}/../../../../tests/cli + +. $CLI_DIR/common.sh +. $CLI_DIR/shunit2 diff --git a/tests/cli/roles.sh b/examples/basecoin/tests/cli/roles.sh similarity index 95% rename from tests/cli/roles.sh rename to examples/basecoin/tests/cli/roles.sh index e29c3c47f..8a690d617 100755 --- a/tests/cli/roles.sh +++ b/examples/basecoin/tests/cli/roles.sh @@ -90,5 +90,9 @@ test03SendMultiFromRole() { # Load common then run these tests with shunit2! DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" #get this files directory -. $DIR/common.sh -. $DIR/shunit2 + +# TODO: how to handle this if we are not in the same directory +CLI_DIR=${DIR}/../../../../tests/cli + +. $CLI_DIR/common.sh +. $CLI_DIR/shunit2 diff --git a/tests/cli/rpc.sh b/examples/basecoin/tests/cli/rpc.sh similarity index 97% rename from tests/cli/rpc.sh rename to examples/basecoin/tests/cli/rpc.sh index c600ff8f6..9d611e4cc 100755 --- a/tests/cli/rpc.sh +++ b/examples/basecoin/tests/cli/rpc.sh @@ -127,4 +127,7 @@ test03Waiting() { # load and run these tests with shunit2! DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" #get this files directory -. $DIR/shunit2 + +# TODO: how to handle this if we are not in the same directory +CLI_DIR=${DIR}/../../../../tests/cli +. $CLI_DIR/shunit2 diff --git a/examples/counter/cmd/counter/main.go b/examples/counter/cmd/counter/main.go index 9768ef276..789067ad5 100644 --- a/examples/counter/cmd/counter/main.go +++ b/examples/counter/cmd/counter/main.go @@ -8,7 +8,7 @@ import ( "github.com/tendermint/tmlibs/cli" client "github.com/cosmos/cosmos-sdk/client/commands" - "github.com/cosmos/cosmos-sdk/cmd/basecoin/commands" + "github.com/cosmos/cosmos-sdk/examples/basecoin/cmd/basecoin/commands" "github.com/cosmos/cosmos-sdk/examples/counter/plugins/counter" ) diff --git a/examples/eyes/cmd/eyes/init.go b/examples/eyes/cmd/eyes/init.go index 87f05daf8..8c1cba1a2 100644 --- a/examples/eyes/cmd/eyes/init.go +++ b/examples/eyes/cmd/eyes/init.go @@ -8,7 +8,7 @@ import ( tcmd "github.com/tendermint/tendermint/cmd/tendermint/commands" - "github.com/cosmos/cosmos-sdk/cmd/basecoin/commands" + "github.com/cosmos/cosmos-sdk/examples/basecoin/cmd/basecoin/commands" ) // InitCmd - node initialization command diff --git a/examples/eyes/cmd/eyes/main.go b/examples/eyes/cmd/eyes/main.go index 8216eb658..959530688 100644 --- a/examples/eyes/cmd/eyes/main.go +++ b/examples/eyes/cmd/eyes/main.go @@ -7,7 +7,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk" client "github.com/cosmos/cosmos-sdk/client/commands" - "github.com/cosmos/cosmos-sdk/cmd/basecoin/commands" + "github.com/cosmos/cosmos-sdk/examples/basecoin/cmd/basecoin/commands" "github.com/cosmos/cosmos-sdk/modules/base" "github.com/cosmos/cosmos-sdk/modules/eyes" "github.com/cosmos/cosmos-sdk/stack" From 23a539ae6f40985ff7c4ac58c9a85e5d9d7fc35d Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Mon, 4 Sep 2017 16:22:27 +0200 Subject: [PATCH 7/9] Improve import of general tests/cli stuff as per rigel --- examples/basecoin/tests/cli/basictx.sh | 4 +--- examples/basecoin/tests/cli/ibc.sh | 4 +--- examples/basecoin/tests/cli/init.sh | 4 +--- examples/basecoin/tests/cli/keys.sh | 4 +--- examples/basecoin/tests/cli/rest.sh | 4 +--- examples/basecoin/tests/cli/restart.sh | 4 +--- examples/basecoin/tests/cli/roles.sh | 4 +--- examples/basecoin/tests/cli/rpc.sh | 3 +-- examples/counter/tests/cli/counter.sh | 4 +--- examples/eyes/tests/cli/eyes.sh | 2 +- 10 files changed, 10 insertions(+), 27 deletions(-) diff --git a/examples/basecoin/tests/cli/basictx.sh b/examples/basecoin/tests/cli/basictx.sh index ac9305c0f..2ae46fce1 100755 --- a/examples/basecoin/tests/cli/basictx.sh +++ b/examples/basecoin/tests/cli/basictx.sh @@ -116,9 +116,7 @@ test03CreditTx() { # Load common then run these tests with shunit2! DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" #get this files directory - -# TODO: how to handle this if we are not in the same directory -CLI_DIR=${DIR}/../../../../tests/cli +CLI_DIR=$GOPATH/src/github.com/cosmos/cosmos-sdk/tests/cli . $CLI_DIR/common.sh . $CLI_DIR/shunit2 diff --git a/examples/basecoin/tests/cli/ibc.sh b/examples/basecoin/tests/cli/ibc.sh index 7bf70f10d..45ab13b27 100755 --- a/examples/basecoin/tests/cli/ibc.sh +++ b/examples/basecoin/tests/cli/ibc.sh @@ -353,9 +353,7 @@ assertNewHeight() { # Load common then run these tests with shunit2! DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" #get this files directory - -# TODO: how to handle this if we are not in the same directory -CLI_DIR=${DIR}/../../../../tests/cli +CLI_DIR=$GOPATH/src/github.com/cosmos/cosmos-sdk/tests/cli . $CLI_DIR/common.sh . $CLI_DIR/shunit2 diff --git a/examples/basecoin/tests/cli/init.sh b/examples/basecoin/tests/cli/init.sh index 62d50fb8e..473583222 100755 --- a/examples/basecoin/tests/cli/init.sh +++ b/examples/basecoin/tests/cli/init.sh @@ -105,8 +105,6 @@ checkDir() { # load and run these tests with shunit2! DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" #get this files directory - -# TODO: how to handle this if we are not in the same directory -CLI_DIR=${DIR}/../../../../tests/cli +CLI_DIR=$GOPATH/src/github.com/cosmos/cosmos-sdk/tests/cli . $CLI_DIR/shunit2 diff --git a/examples/basecoin/tests/cli/keys.sh b/examples/basecoin/tests/cli/keys.sh index 36cbcbb9b..8b01aa186 100755 --- a/examples/basecoin/tests/cli/keys.sh +++ b/examples/basecoin/tests/cli/keys.sh @@ -26,8 +26,6 @@ testMakeKeys() { # load and run these tests with shunit2! DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" #get this files directory - -# TODO: how to handle this if we are not in the same directory -CLI_DIR=${DIR}/../../../../tests/cli +CLI_DIR=$GOPATH/src/github.com/cosmos/cosmos-sdk/tests/cli . $CLI_DIR/shunit2 diff --git a/examples/basecoin/tests/cli/rest.sh b/examples/basecoin/tests/cli/rest.sh index 672fb32d1..2d2c86de6 100755 --- a/examples/basecoin/tests/cli/rest.sh +++ b/examples/basecoin/tests/cli/rest.sh @@ -151,9 +151,7 @@ test04CreateRoleInvalid() { # Load common then run these tests with shunit2! DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" #get this files directory - -# TODO: how to handle this if we are not in the same directory -CLI_DIR=${DIR}/../../../../tests/cli +CLI_DIR=$GOPATH/src/github.com/cosmos/cosmos-sdk/tests/cli . $CLI_DIR/common.sh . $CLI_DIR/shunit2 diff --git a/examples/basecoin/tests/cli/restart.sh b/examples/basecoin/tests/cli/restart.sh index 37ccb35ce..c091b32e7 100755 --- a/examples/basecoin/tests/cli/restart.sh +++ b/examples/basecoin/tests/cli/restart.sh @@ -78,9 +78,7 @@ test01OnRestart() { # Load common then run these tests with shunit2! DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" #get this files directory - -# TODO: how to handle this if we are not in the same directory -CLI_DIR=${DIR}/../../../../tests/cli +CLI_DIR=$GOPATH/src/github.com/cosmos/cosmos-sdk/tests/cli . $CLI_DIR/common.sh . $CLI_DIR/shunit2 diff --git a/examples/basecoin/tests/cli/roles.sh b/examples/basecoin/tests/cli/roles.sh index 8a690d617..1dece90ec 100755 --- a/examples/basecoin/tests/cli/roles.sh +++ b/examples/basecoin/tests/cli/roles.sh @@ -90,9 +90,7 @@ test03SendMultiFromRole() { # Load common then run these tests with shunit2! DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" #get this files directory - -# TODO: how to handle this if we are not in the same directory -CLI_DIR=${DIR}/../../../../tests/cli +CLI_DIR=$GOPATH/src/github.com/cosmos/cosmos-sdk/tests/cli . $CLI_DIR/common.sh . $CLI_DIR/shunit2 diff --git a/examples/basecoin/tests/cli/rpc.sh b/examples/basecoin/tests/cli/rpc.sh index 9d611e4cc..bb2c8b429 100755 --- a/examples/basecoin/tests/cli/rpc.sh +++ b/examples/basecoin/tests/cli/rpc.sh @@ -127,7 +127,6 @@ test03Waiting() { # load and run these tests with shunit2! DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" #get this files directory +CLI_DIR=$GOPATH/src/github.com/cosmos/cosmos-sdk/tests/cli -# TODO: how to handle this if we are not in the same directory -CLI_DIR=${DIR}/../../../../tests/cli . $CLI_DIR/shunit2 diff --git a/examples/counter/tests/cli/counter.sh b/examples/counter/tests/cli/counter.sh index ad9f994e5..53eebbe12 100755 --- a/examples/counter/tests/cli/counter.sh +++ b/examples/counter/tests/cli/counter.sh @@ -112,9 +112,7 @@ test03AddCount() { # Load common then run these tests with shunit2! DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" #get this files directory - -# TODO: how to handle this if we are not in the same directory -CLI_DIR=${DIR}/../../../../tests/cli +CLI_DIR=$GOPATH/src/github.com/cosmos/cosmos-sdk/tests/cli . $CLI_DIR/common.sh . $CLI_DIR/shunit2 diff --git a/examples/eyes/tests/cli/eyes.sh b/examples/eyes/tests/cli/eyes.sh index 7f8a427c7..f1e52b0ac 100755 --- a/examples/eyes/tests/cli/eyes.sh +++ b/examples/eyes/tests/cli/eyes.sh @@ -66,7 +66,7 @@ test00SetGetRemove() { # Load common then run these tests with shunit2! DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" #get this files directory -CLI_DIR=${DIR}/../../../../tests/cli +CLI_DIR=$GOPATH/src/github.com/cosmos/cosmos-sdk/tests/cli . $CLI_DIR/common.sh . $CLI_DIR/shunit2 From ec6843928e6f086ff836d73be197932a45f40304 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Mon, 4 Sep 2017 16:25:41 +0200 Subject: [PATCH 8/9] Moved basecoin server commands out of examples dir to share them --- examples/basecoin/cmd/basecoin/commands/ibc.go | 8 -------- examples/basecoin/cmd/basecoin/main.go | 2 +- examples/counter/cmd/counter/main.go | 2 +- examples/eyes/cmd/eyes/init.go | 2 +- examples/eyes/cmd/eyes/main.go | 2 +- .../basecoin/cmd/basecoin => server}/commands/init.go | 0 .../basecoin/cmd/basecoin => server}/commands/key.go | 0 .../basecoin/cmd/basecoin => server}/commands/relay.go | 0 .../basecoin/cmd/basecoin => server}/commands/reset.go | 0 .../basecoin/cmd/basecoin => server}/commands/root.go | 0 .../basecoin/cmd/basecoin => server}/commands/start.go | 0 11 files changed, 4 insertions(+), 12 deletions(-) delete mode 100644 examples/basecoin/cmd/basecoin/commands/ibc.go rename {examples/basecoin/cmd/basecoin => server}/commands/init.go (100%) rename {examples/basecoin/cmd/basecoin => server}/commands/key.go (100%) rename {examples/basecoin/cmd/basecoin => server}/commands/relay.go (100%) rename {examples/basecoin/cmd/basecoin => server}/commands/reset.go (100%) rename {examples/basecoin/cmd/basecoin => server}/commands/root.go (100%) rename {examples/basecoin/cmd/basecoin => server}/commands/start.go (100%) diff --git a/examples/basecoin/cmd/basecoin/commands/ibc.go b/examples/basecoin/cmd/basecoin/commands/ibc.go deleted file mode 100644 index e551bbfd2..000000000 --- a/examples/basecoin/cmd/basecoin/commands/ibc.go +++ /dev/null @@ -1,8 +0,0 @@ -package commands - -// import "github.com/cosmos/cosmos-sdk/plugins/ibc" - -// // returns a new IBC plugin to be registered with Basecoin -// func NewIBCPlugin() *ibc.IBCPlugin { -// return ibc.New() -// } diff --git a/examples/basecoin/cmd/basecoin/main.go b/examples/basecoin/cmd/basecoin/main.go index d41c8d34a..73d153924 100644 --- a/examples/basecoin/cmd/basecoin/main.go +++ b/examples/basecoin/cmd/basecoin/main.go @@ -7,7 +7,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk" client "github.com/cosmos/cosmos-sdk/client/commands" - "github.com/cosmos/cosmos-sdk/examples/basecoin/cmd/basecoin/commands" + "github.com/cosmos/cosmos-sdk/server/commands" "github.com/cosmos/cosmos-sdk/modules/auth" "github.com/cosmos/cosmos-sdk/modules/base" "github.com/cosmos/cosmos-sdk/modules/coin" diff --git a/examples/counter/cmd/counter/main.go b/examples/counter/cmd/counter/main.go index 789067ad5..48b9f75f3 100644 --- a/examples/counter/cmd/counter/main.go +++ b/examples/counter/cmd/counter/main.go @@ -8,7 +8,7 @@ import ( "github.com/tendermint/tmlibs/cli" client "github.com/cosmos/cosmos-sdk/client/commands" - "github.com/cosmos/cosmos-sdk/examples/basecoin/cmd/basecoin/commands" + "github.com/cosmos/cosmos-sdk/server/commands" "github.com/cosmos/cosmos-sdk/examples/counter/plugins/counter" ) diff --git a/examples/eyes/cmd/eyes/init.go b/examples/eyes/cmd/eyes/init.go index 8c1cba1a2..8fba62997 100644 --- a/examples/eyes/cmd/eyes/init.go +++ b/examples/eyes/cmd/eyes/init.go @@ -8,7 +8,7 @@ import ( tcmd "github.com/tendermint/tendermint/cmd/tendermint/commands" - "github.com/cosmos/cosmos-sdk/examples/basecoin/cmd/basecoin/commands" + "github.com/cosmos/cosmos-sdk/server/commands" ) // InitCmd - node initialization command diff --git a/examples/eyes/cmd/eyes/main.go b/examples/eyes/cmd/eyes/main.go index 959530688..29655479a 100644 --- a/examples/eyes/cmd/eyes/main.go +++ b/examples/eyes/cmd/eyes/main.go @@ -7,7 +7,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk" client "github.com/cosmos/cosmos-sdk/client/commands" - "github.com/cosmos/cosmos-sdk/examples/basecoin/cmd/basecoin/commands" + "github.com/cosmos/cosmos-sdk/server/commands" "github.com/cosmos/cosmos-sdk/modules/base" "github.com/cosmos/cosmos-sdk/modules/eyes" "github.com/cosmos/cosmos-sdk/stack" diff --git a/examples/basecoin/cmd/basecoin/commands/init.go b/server/commands/init.go similarity index 100% rename from examples/basecoin/cmd/basecoin/commands/init.go rename to server/commands/init.go diff --git a/examples/basecoin/cmd/basecoin/commands/key.go b/server/commands/key.go similarity index 100% rename from examples/basecoin/cmd/basecoin/commands/key.go rename to server/commands/key.go diff --git a/examples/basecoin/cmd/basecoin/commands/relay.go b/server/commands/relay.go similarity index 100% rename from examples/basecoin/cmd/basecoin/commands/relay.go rename to server/commands/relay.go diff --git a/examples/basecoin/cmd/basecoin/commands/reset.go b/server/commands/reset.go similarity index 100% rename from examples/basecoin/cmd/basecoin/commands/reset.go rename to server/commands/reset.go diff --git a/examples/basecoin/cmd/basecoin/commands/root.go b/server/commands/root.go similarity index 100% rename from examples/basecoin/cmd/basecoin/commands/root.go rename to server/commands/root.go diff --git a/examples/basecoin/cmd/basecoin/commands/start.go b/server/commands/start.go similarity index 100% rename from examples/basecoin/cmd/basecoin/commands/start.go rename to server/commands/start.go From 2887d0d288fe51e0b0a6642c92f83a4690d316e6 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Mon, 4 Sep 2017 16:37:52 +0200 Subject: [PATCH 9/9] Cleaned up root command to be less basecoin-specific --- examples/basecoin/cmd/basecoin/main.go | 16 +++++++++---- examples/counter/cmd/counter/main.go | 13 +++++++---- examples/eyes/cmd/eyes/main.go | 19 +++++++++------ server/commands/init.go | 2 +- server/commands/root.go | 32 ++++++++++++-------------- server/commands/start.go | 8 +++---- 6 files changed, 51 insertions(+), 39 deletions(-) diff --git a/examples/basecoin/cmd/basecoin/main.go b/examples/basecoin/cmd/basecoin/main.go index 73d153924..2a96f76bd 100644 --- a/examples/basecoin/cmd/basecoin/main.go +++ b/examples/basecoin/cmd/basecoin/main.go @@ -3,11 +3,11 @@ package main import ( "os" + "github.com/spf13/cobra" "github.com/tendermint/tmlibs/cli" sdk "github.com/cosmos/cosmos-sdk" client "github.com/cosmos/cosmos-sdk/client/commands" - "github.com/cosmos/cosmos-sdk/server/commands" "github.com/cosmos/cosmos-sdk/modules/auth" "github.com/cosmos/cosmos-sdk/modules/base" "github.com/cosmos/cosmos-sdk/modules/coin" @@ -15,9 +15,16 @@ import ( "github.com/cosmos/cosmos-sdk/modules/ibc" "github.com/cosmos/cosmos-sdk/modules/nonce" "github.com/cosmos/cosmos-sdk/modules/roles" + "github.com/cosmos/cosmos-sdk/server/commands" "github.com/cosmos/cosmos-sdk/stack" ) +// RootCmd is the entry point for this binary +var RootCmd = &cobra.Command{ + Use: "basecoin", + Short: "A cryptocurrency framework in Golang based on Tendermint-Core", +} + // BuildApp constructs the stack we want to use for this app func BuildApp(feeDenom string) sdk.Handler { return stack.New( @@ -42,19 +49,18 @@ func BuildApp(feeDenom string) sdk.Handler { } func main() { - rt := commands.RootCmd - // require all fees in mycoin - change this in your app! commands.Handler = BuildApp("mycoin") - rt.AddCommand( + RootCmd.AddCommand( commands.InitCmd, commands.StartCmd, //commands.RelayCmd, commands.UnsafeResetAllCmd, client.VersionCmd, ) + commands.SetUpRoot(RootCmd) - cmd := cli.PrepareMainCmd(rt, "BC", os.ExpandEnv("$HOME/.basecoin")) + cmd := cli.PrepareMainCmd(RootCmd, "BC", os.ExpandEnv("$HOME/.basecoin")) cmd.Execute() } diff --git a/examples/counter/cmd/counter/main.go b/examples/counter/cmd/counter/main.go index 48b9f75f3..b747e3be0 100644 --- a/examples/counter/cmd/counter/main.go +++ b/examples/counter/cmd/counter/main.go @@ -8,15 +8,17 @@ import ( "github.com/tendermint/tmlibs/cli" client "github.com/cosmos/cosmos-sdk/client/commands" - "github.com/cosmos/cosmos-sdk/server/commands" "github.com/cosmos/cosmos-sdk/examples/counter/plugins/counter" + "github.com/cosmos/cosmos-sdk/server/commands" ) +// RootCmd is the entry point for this binary +var RootCmd = &cobra.Command{ + Use: "counter", + Short: "demo application for cosmos sdk", +} + func main() { - var RootCmd = &cobra.Command{ - Use: "counter", - Short: "demo plugin for basecoin", - } // TODO: register the counter here commands.Handler = counter.NewHandler("mycoin") @@ -27,6 +29,7 @@ func main() { commands.UnsafeResetAllCmd, client.VersionCmd, ) + commands.SetUpRoot(RootCmd) cmd := cli.PrepareMainCmd(RootCmd, "CT", os.ExpandEnv("$HOME/.counter")) cmd.Execute() diff --git a/examples/eyes/cmd/eyes/main.go b/examples/eyes/cmd/eyes/main.go index 29655479a..ed9b406ef 100644 --- a/examples/eyes/cmd/eyes/main.go +++ b/examples/eyes/cmd/eyes/main.go @@ -3,16 +3,24 @@ package main import ( "os" + "github.com/spf13/cobra" "github.com/tendermint/tmlibs/cli" sdk "github.com/cosmos/cosmos-sdk" client "github.com/cosmos/cosmos-sdk/client/commands" - "github.com/cosmos/cosmos-sdk/server/commands" "github.com/cosmos/cosmos-sdk/modules/base" "github.com/cosmos/cosmos-sdk/modules/eyes" + "github.com/cosmos/cosmos-sdk/server/commands" "github.com/cosmos/cosmos-sdk/stack" ) +// RootCmd is the entry point for this binary +var RootCmd = &cobra.Command{ + Use: "eyes", + Short: "key-value store", + Long: "A demo app to show key-value store with proofs over abci", +} + // BuildApp constructs the stack we want to use for this app func BuildApp() sdk.Handler { return stack.New( @@ -26,20 +34,17 @@ func BuildApp() sdk.Handler { } func main() { - rt := commands.RootCmd - rt.Short = "eyes" - rt.Long = "A demo app to show key-value store with proofs over abci" - commands.Handler = BuildApp() - rt.AddCommand( + RootCmd.AddCommand( // out own init command to not require argument InitCmd, commands.StartCmd, commands.UnsafeResetAllCmd, client.VersionCmd, ) + commands.SetUpRoot(RootCmd) - cmd := cli.PrepareMainCmd(rt, "EYE", os.ExpandEnv("$HOME/.eyes")) + cmd := cli.PrepareMainCmd(RootCmd, "EYE", os.ExpandEnv("$HOME/.eyes")) cmd.Execute() } diff --git a/server/commands/init.go b/server/commands/init.go index 85ca02886..bb8617d08 100644 --- a/server/commands/init.go +++ b/server/commands/init.go @@ -18,7 +18,7 @@ import ( // InitCmd - node initialization command var InitCmd = &cobra.Command{ Use: "init [address]", - Short: "Initialize a basecoin blockchain", + Short: "Initialize genesis files for a blockchain", RunE: initCmd, } diff --git a/server/commands/root.go b/server/commands/root.go index 5d76c83e5..7974d3532 100644 --- a/server/commands/root.go +++ b/server/commands/root.go @@ -21,23 +21,21 @@ var ( logger = log.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "main") ) -// RootCmd - main node command -var RootCmd = &cobra.Command{ - Use: "basecoin", - Short: "A cryptocurrency framework in Golang based on Tendermint-Core", - PersistentPreRunE: func(cmd *cobra.Command, args []string) (err error) { - level := viper.GetString(FlagLogLevel) - logger, err = tmflags.ParseLogLevel(level, logger, defaultLogLevel) - if err != nil { - return err - } - if viper.GetBool(cli.TraceFlag) { - logger = log.NewTracingLogger(logger) - } - return nil - }, +// preRunSetup should be set as PersistentPreRunE on the root command to +// properly handle the logging and the tracer +func preRunSetup(cmd *cobra.Command, args []string) (err error) { + level := viper.GetString(FlagLogLevel) + logger, err = tmflags.ParseLogLevel(level, logger, defaultLogLevel) + if err != nil { + return err + } + if viper.GetBool(cli.TraceFlag) { + logger = log.NewTracingLogger(logger) + } + return nil } -func init() { - RootCmd.PersistentFlags().String(FlagLogLevel, defaultLogLevel, "Log level") +func SetUpRoot(cmd *cobra.Command) { + cmd.PersistentPreRunE = preRunSetup + cmd.PersistentFlags().String(FlagLogLevel, defaultLogLevel, "Log level") } diff --git a/server/commands/start.go b/server/commands/start.go index 5a94a60c7..92f50fdbb 100644 --- a/server/commands/start.go +++ b/server/commands/start.go @@ -9,8 +9,8 @@ import ( "github.com/spf13/cobra" "github.com/spf13/viper" - "github.com/tendermint/abci/server" sdk "github.com/cosmos/cosmos-sdk" + "github.com/tendermint/abci/server" "github.com/tendermint/tmlibs/cli" cmn "github.com/tendermint/tmlibs/common" @@ -22,10 +22,10 @@ import ( "github.com/cosmos/cosmos-sdk/app" ) -// StartCmd - command to start running the basecoin node! +// StartCmd - command to start running the abci app (and tendermint)! var StartCmd = &cobra.Command{ Use: "start", - Short: "Start basecoin", + Short: "Start this full node", RunE: startCmd, } @@ -47,7 +47,7 @@ var ( func init() { flags := StartCmd.Flags() flags.String(FlagAddress, "tcp://0.0.0.0:46658", "Listen address") - flags.Bool(FlagWithoutTendermint, false, "Only run basecoin abci app, assume external tendermint process") + flags.Bool(FlagWithoutTendermint, false, "Only run abci app, assume external tendermint process") // add all standard 'tendermint node' flags tcmd.AddNodeFlags(StartCmd) }