clowwindy
10 years ago
3 changed files with 190 additions and 2 deletions
@ -0,0 +1,148 @@ |
|||||
|
#!/bin/bash |
||||
|
# assert.sh 1.0 - bash unit testing framework |
||||
|
# Copyright (C) 2009, 2010, 2011, 2012 Robert Lehmann |
||||
|
# |
||||
|
# http://github.com/lehmannro/assert.sh |
||||
|
# |
||||
|
# This program is free software: you can redistribute it and/or modify |
||||
|
# it under the terms of the GNU Lesser General Public License as published |
||||
|
# by the Free Software Foundation, either version 3 of the License, or |
||||
|
# (at your option) any later version. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU Lesser General Public License for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU Lesser General Public License |
||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||
|
|
||||
|
export DISCOVERONLY=${DISCOVERONLY:-} |
||||
|
export DEBUG=${DEBUG:-} |
||||
|
export STOP=${STOP:-} |
||||
|
export INVARIANT=${INVARIANT:-} |
||||
|
export CONTINUE=${CONTINUE:-} |
||||
|
|
||||
|
args="$(getopt -n "$0" -l \ |
||||
|
verbose,help,stop,discover,invariant,continue vhxdic $*)" \ |
||||
|
|| exit -1 |
||||
|
for arg in $args; do |
||||
|
case "$arg" in |
||||
|
-h) |
||||
|
echo "$0 [-vxidc]" \ |
||||
|
"[--verbose] [--stop] [--invariant] [--discover] [--continue]" |
||||
|
echo "`sed 's/./ /g' <<< "$0"` [-h] [--help]" |
||||
|
exit 0;; |
||||
|
--help) |
||||
|
cat <<EOF |
||||
|
Usage: $0 [options] |
||||
|
Language-agnostic unit tests for subprocesses. |
||||
|
|
||||
|
Options: |
||||
|
-v, --verbose generate output for every individual test case |
||||
|
-x, --stop stop running tests after the first failure |
||||
|
-i, --invariant do not measure timings to remain invariant between runs |
||||
|
-d, --discover collect test suites only, do not run any tests |
||||
|
-c, --continue do not modify exit code to test suite status |
||||
|
-h show brief usage information and exit |
||||
|
--help show this help message and exit |
||||
|
EOF |
||||
|
exit 0;; |
||||
|
-v|--verbose) |
||||
|
DEBUG=1;; |
||||
|
-x|--stop) |
||||
|
STOP=1;; |
||||
|
-i|--invariant) |
||||
|
INVARIANT=1;; |
||||
|
-d|--discover) |
||||
|
DISCOVERONLY=1;; |
||||
|
-c|--continue) |
||||
|
CONTINUE=1;; |
||||
|
esac |
||||
|
done |
||||
|
|
||||
|
printf -v _indent "\n\t" # local format helper |
||||
|
|
||||
|
_assert_reset() { |
||||
|
tests_ran=0 |
||||
|
tests_failed=0 |
||||
|
tests_errors=() |
||||
|
tests_starttime="$(date +%s.%N)" # seconds_since_epoch.nanoseconds |
||||
|
} |
||||
|
|
||||
|
assert_end() { |
||||
|
# assert_end [suite ..] |
||||
|
tests_endtime="$(date +%s.%N)" |
||||
|
tests="$tests_ran ${*:+$* }tests" |
||||
|
[[ -n "$DISCOVERONLY" ]] && echo "collected $tests." && _assert_reset && return |
||||
|
[[ -n "$DEBUG" ]] && echo |
||||
|
[[ -z "$INVARIANT" ]] && report_time=" in $(bc \ |
||||
|
<<< "${tests_endtime%.N} - ${tests_starttime%.N}" \ |
||||
|
| sed -e 's/\.\([0-9]\{0,3\}\)[0-9]*/.\1/' -e 's/^\./0./')s" \ |
||||
|
|| report_time= |
||||
|
|
||||
|
if [[ "$tests_failed" -eq 0 ]]; then |
||||
|
echo "all $tests passed$report_time." |
||||
|
else |
||||
|
for error in "${tests_errors[@]}"; do echo "$error"; done |
||||
|
echo "$tests_failed of $tests failed$report_time." |
||||
|
fi |
||||
|
tests_failed_previous=$tests_failed |
||||
|
[[ $tests_failed -gt 0 ]] && tests_suite_status=1 |
||||
|
_assert_reset |
||||
|
return $tests_failed_previous |
||||
|
} |
||||
|
|
||||
|
assert() { |
||||
|
# assert <command> <expected stdout> [stdin] |
||||
|
(( tests_ran++ )) || : |
||||
|
[[ -n "$DISCOVERONLY" ]] && return || true |
||||
|
# printf required for formatting |
||||
|
printf -v expected "x${2:-}" # x required to overwrite older results |
||||
|
result="$(eval 2>/dev/null $1 <<< ${3:-})" || true |
||||
|
# Note: $expected is already decorated |
||||
|
if [[ "x$result" == "$expected" ]]; then |
||||
|
[[ -n "$DEBUG" ]] && echo -n . || true |
||||
|
return |
||||
|
fi |
||||
|
result="$(sed -e :a -e '$!N;s/\n/\\n/;ta' <<< "$result")" |
||||
|
[[ -z "$result" ]] && result="nothing" || result="\"$result\"" |
||||
|
[[ -z "$2" ]] && expected="nothing" || expected="\"$2\"" |
||||
|
_assert_fail "expected $expected${_indent}got $result" "$1" "$3" |
||||
|
} |
||||
|
|
||||
|
assert_raises() { |
||||
|
# assert_raises <command> <expected code> [stdin] |
||||
|
(( tests_ran++ )) || : |
||||
|
[[ -n "$DISCOVERONLY" ]] && return || true |
||||
|
status=0 |
||||
|
(eval $1 <<< ${3:-}) > /dev/null 2>&1 || status=$? |
||||
|
expected=${2:-0} |
||||
|
if [[ "$status" -eq "$expected" ]]; then |
||||
|
[[ -n "$DEBUG" ]] && echo -n . || true |
||||
|
return |
||||
|
fi |
||||
|
_assert_fail "program terminated with code $status instead of $expected" "$1" "$3" |
||||
|
} |
||||
|
|
||||
|
_assert_fail() { |
||||
|
# _assert_fail <failure> <command> <stdin> |
||||
|
[[ -n "$DEBUG" ]] && echo -n X |
||||
|
report="test #$tests_ran \"$2${3:+ <<< $3}\" failed:${_indent}$1" |
||||
|
if [[ -n "$STOP" ]]; then |
||||
|
[[ -n "$DEBUG" ]] && echo |
||||
|
echo "$report" |
||||
|
exit 1 |
||||
|
fi |
||||
|
tests_errors[$tests_failed]="$report" |
||||
|
(( tests_failed++ )) || : |
||||
|
} |
||||
|
|
||||
|
_assert_reset |
||||
|
: ${tests_suite_status:=0} # remember if any of the tests failed so far |
||||
|
_assert_cleanup() { |
||||
|
local status=$? |
||||
|
# modify exit code if it's not already non-zero |
||||
|
[[ $status -eq 0 && -z $CONTINUE ]] && exit $tests_suite_status |
||||
|
} |
||||
|
trap _assert_cleanup EXIT |
@ -0,0 +1,40 @@ |
|||||
|
#!/bin/bash |
||||
|
|
||||
|
. tests/assert.sh |
||||
|
|
||||
|
PYTHON="coverage run -a -p" |
||||
|
LOCAL="$PYTHON shadowsocks/local.py" |
||||
|
SERVER="$PYTHON shadowsocks/server.py" |
||||
|
|
||||
|
assert "$LOCAL 2>&1 | grep ERROR" "ERROR: config not specified" |
||||
|
assert "$LOCAL 2>&1 | grep usage | cut -d: -f1" "usage" |
||||
|
|
||||
|
assert "$SERVER 2>&1 | grep ERROR" "ERROR: config not specified" |
||||
|
assert "$SERVER 2>&1 | grep usage | cut -d: -f1" "usage" |
||||
|
|
||||
|
assert "$LOCAL 2>&1 -m rc4-md5 -k testrc4 -s 127.0.0.1 -p 8388 -d start | grep WARNING | awk -F\"WARNING\" '{print \$2}'" " warning: server set to listen on 127.0.0.1:8388, are you sure?" |
||||
|
$LOCAL 2>&1 -m rc4-md5 -k testrc4 -s 127.0.0.1 -p 8388 -d stop |
||||
|
|
||||
|
assert "$LOCAL 2>&1 -m rc4-md5 -k testrc4 -s 0.0.0.0 -p 8388 -t10 -d start | grep WARNING | awk -F\"WARNING\" '{print \$2}'" " warning: your timeout 10 seems too short" |
||||
|
$LOCAL 2>&1 -m rc4-md5 -k testrc4 -s 127.0.0.1 -p 8388 -d stop |
||||
|
|
||||
|
assert "$LOCAL 2>&1 -m rc4-md5 -k testrc4 -s 0.0.0.0 -p 8388 -t1000 -d start | grep WARNING | awk -F\"WARNING\" '{print \$2}'" " warning: your timeout 1000 seems too long" |
||||
|
$LOCAL 2>&1 -m rc4-md5 -k testrc4 -s 127.0.0.1 -p 8388 -d stop |
||||
|
|
||||
|
assert "$LOCAL 2>&1 -m rc4 -k testrc4 -s 0.0.0.0 -p 8388 -d start | grep WARNING | awk -F\"WARNING\" '{print \$2}'" " warning: RC4 is not safe; please use a safer cipher, like AES-256-CFB" |
||||
|
$LOCAL 2>&1 -m rc4-md5 -k testrc4 -s 127.0.0.1 -p 8388 -d stop |
||||
|
|
||||
|
assert "$LOCAL 2>&1 -m rc4-md5 -k mypassword -s 0.0.0.0 -p 8388 -d start | grep ERROR | awk -F\"ERROR\" '{print \$2}'" " DON'T USE DEFAULT PASSWORD! Please change it in your config.json!" |
||||
|
$LOCAL 2>&1 -m rc4-md5 -k testrc4 -s 127.0.0.1 -p 8388 -d stop |
||||
|
|
||||
|
assert "$LOCAL 2>&1 -m rc4-md5 -p 8388 -k testrc4 -d start | grep ERROR | awk -F\"ERROR\" '{print \$2}'" ": server addr not specified" |
||||
|
$LOCAL 2>&1 -m rc4-md5 -k testrc4 -s 127.0.0.1 -p 8388 -d stop |
||||
|
|
||||
|
assert "$LOCAL 2>&1 -m rc4-md5 -p 8388 -s 0.0.0.0 -d start | grep ERROR | awk -F\"ERROR\" '{print \$2}'" ": password not specified" |
||||
|
$LOCAL 2>&1 -m rc4-md5 -k testrc4 -s 127.0.0.1 -p 8388 -d stop |
||||
|
|
||||
|
assert "$SERVER 2>&1 -m rc4-md5 -p 8388 -s 0.0.0.0 -d start | grep ERROR | awk -F\"ERROR\" '{print \$2}'" ": password or port_password not specified" |
||||
|
$SERVER 2>&1 -m rc4-md5 -k testrc4 -s 127.0.0.1 -p 8388 -d stop |
||||
|
|
||||
|
|
||||
|
assert_end command |
Loading…
Reference in new issue