217 lines
6.6 KiB
Bash
217 lines
6.6 KiB
Bash
# Copyright 2015 Koichi Murase <myoga.murase@gmail.com>. All rights reserved.
|
|
# This script is a part of blesh (https://github.com/akinomyoga/ble.sh)
|
|
# provided under the BSD-3-Clause license. Do not edit this file because this
|
|
# is not the original source code: Various pre-processing has been applied.
|
|
# Also, the code comments and blank lines are stripped off in the installation
|
|
# process. Please find the corresponding source file(s) in the repository
|
|
# "akinomyoga/ble.sh".
|
|
#
|
|
# Source: /lib/core-test.sh
|
|
function ble/test/getdir {
|
|
dir=$_ble_base_run/$$.test
|
|
[[ -d $dir ]] || ble/bin/mkdir -p "$dir"
|
|
}
|
|
_ble_test_dir=
|
|
function ble/test/chdir {
|
|
local dir
|
|
ble/test/getdir
|
|
ble/util/getpid
|
|
_ble_test_dir=$dir/$BASHPID.d
|
|
[[ -d $_ble_test_dir ]] ||
|
|
ble/bin/mkdir -p "$_ble_test_dir"
|
|
cd -L "$_ble_test_dir"
|
|
}
|
|
function ble/test/rmdir {
|
|
[[ -d $_ble_test_dir ]] &&
|
|
ble/bin/rm -rf "$_ble_test_dir"
|
|
return 0
|
|
}
|
|
_ble_test_logfile_fd=
|
|
function ble/test/log {
|
|
if [[ $_ble_test_logfile_fd ]]; then
|
|
ble/util/print "$1" >&"$_ble_test_logfile_fd"
|
|
fi
|
|
ble/util/print "$1"
|
|
}
|
|
function ble/test/log#open {
|
|
local file=$1
|
|
if ble/fd#alloc _ble_test_logfile_fd '>>$file'; then
|
|
local h10=----------
|
|
[[ -s $file ]] &&
|
|
ble/util/print "$h10$h10$h10$h10$h10$h10$h10" >&"$_ble_test_logfile_fd"
|
|
ble/util/print "[$(date +'%F %T %Z')] test: start logging" >&"$_ble_test_logfile_fd"
|
|
fi
|
|
}
|
|
function ble/test/log#close {
|
|
if [[ $_ble_test_logfile_fd ]]; then
|
|
ble/util/print "[$(date +'%F %T %Z')] test: end logging" >&"$_ble_test_logfile_fd"
|
|
ble/fd#close _ble_test_logfile_fd
|
|
_ble_test_logfile_fd=
|
|
fi
|
|
}
|
|
if ble/bin#freeze-utility-path colored; then
|
|
function ble/test/diff.impl {
|
|
ble/bin/colored diff -u "$@"
|
|
}
|
|
else
|
|
function ble/test/diff.impl {
|
|
diff -u "$@"
|
|
}
|
|
fi
|
|
function ble/test/diff {
|
|
local dir
|
|
ble/test/getdir
|
|
ble/util/getpid
|
|
local f1=$BASHPID.$1.expect
|
|
local f2=$BASHPID.$1.result
|
|
(
|
|
ble/util/joblist/__suppress__
|
|
cd "$dir"
|
|
ble/util/print "$2" >| "$f1"
|
|
ble/util/print "$3" >| "$f2"
|
|
ble/util/assign ret 'ble/test/diff.impl "$f1" "$f2"'
|
|
ble/test/log "$ret"
|
|
>| "$f1" >| "$f2"
|
|
)
|
|
}
|
|
_ble_test_section_failure_count=0
|
|
_ble_test_section_fd=
|
|
_ble_test_section_file=
|
|
_ble_test_section_title=section
|
|
_ble_test_section_count=0
|
|
function ble/test/start-section {
|
|
[[ $_ble_test_section_fd ]] && ble/test/end-section
|
|
_ble_test_section_title=$1
|
|
_ble_test_section_count=$2
|
|
local dir
|
|
ble/test/getdir
|
|
ble/util/getpid
|
|
_ble_test_section_file=$dir/$BASHPID
|
|
ble/fd#alloc _ble_test_section_fd '> "$_ble_test_section_file"'
|
|
}
|
|
function ble/test/end-section {
|
|
[[ $_ble_test_section_fd ]] || return 1
|
|
ble/fd#close _ble_test_section_fd
|
|
_ble_test_section_fd=
|
|
local ntest npass count=$_ble_test_section_count
|
|
local ntest nfail npass
|
|
builtin eval -- $(
|
|
ble/bin/awk '
|
|
BEGIN{test=0;fail=0;pass=0;}
|
|
/^test /{test++}
|
|
/^fail /{fail++}
|
|
/^pass /{pass++}
|
|
END{print "ntest="test" nfail="fail" npass="pass;}
|
|
' "$_ble_test_section_file")
|
|
local sgr=$'\e[32m' sgr0=$'\e[m'
|
|
((npass==ntest)) || sgr=$'\e[31m'
|
|
local ncrash=$((ntest-nfail-npass))
|
|
local nskip=$((count-ntest))
|
|
if ((ntest)); then
|
|
local percentage=$((npass*1000/ntest)) # Note: 切り捨て
|
|
ble/util/sprintf percentage '%6s' "$((percentage/10)).$((percentage%10))%" # "XXX.X%"
|
|
else
|
|
local percentage=---.-%
|
|
fi
|
|
ble/test/log "$sgr$percentage$sgr0 [section] $_ble_test_section_title: $sgr$npass/$ntest$sgr0 ($nfail fail, $ncrash crash, $nskip skip)"
|
|
if ((npass==ntest)); then
|
|
return 0
|
|
else
|
|
((_ble_test_section_failure_count++))
|
|
return 1
|
|
fi
|
|
}
|
|
function ble/test/section#incr {
|
|
local title=$1
|
|
[[ $_ble_test_section_fd ]] || return 1
|
|
ble/util/print "test $title" >&"$_ble_test_section_fd"
|
|
}
|
|
function ble/test/section#report {
|
|
local ext=$? title=$1
|
|
[[ $_ble_test_section_fd ]] || return 1
|
|
local code=fail; ((ext==0)) && code=pass
|
|
ble/util/print "$code $title" >&"$_ble_test_section_fd"
|
|
}
|
|
function ble/test/.read-arguments {
|
|
local xstdout xstderr xexit xret
|
|
local qstdout qstderr qexit qret
|
|
local -a buff=()
|
|
while (($#)); do
|
|
local arg=$1; shift
|
|
case $arg in
|
|
('#'*)
|
|
local ret; ble/string#trim "${arg#'#'}"
|
|
_ble_test_title=$ret ;;
|
|
(stdout[:=]*)
|
|
[[ $qstdout ]] && xstdout=$xstdout$'\n'
|
|
qstdout=1
|
|
xstdout=$xstdout${arg#*[:=]} ;;
|
|
(stderr[:=]*)
|
|
[[ $qstderr ]] && xstderr=$xstderr$'\n'
|
|
qstderr=1
|
|
xstderr=$xstderr${arg#*[:=]} ;;
|
|
(ret[:=]*)
|
|
qret=1
|
|
xret=${arg#*[:=]} ;;
|
|
(exit[:=]*)
|
|
qexit=1
|
|
xexit=${arg#*[:=]} ;;
|
|
(code[:=]*)
|
|
((${#buff[@]})) && ble/array#push buff $'\n'
|
|
ble/array#push buff "${arg#*[:=]}" ;;
|
|
(--depth=*)
|
|
_ble_test_caller_depth=${arg#*=} ;;
|
|
(--display-code=*)
|
|
_ble_test_display_code=${arg#*=} ;;
|
|
(*)
|
|
((${#buff[@]})) && ble/array#push buff ' '
|
|
ble/array#push buff "$arg" ;;
|
|
esac
|
|
done
|
|
[[ $qstdout ]] && _ble_test_item_expect[0]=$xstdout
|
|
[[ $qstderr ]] && _ble_test_item_expect[1]=$xstderr
|
|
[[ $qexit ]] && _ble_test_item_expect[2]=$xexit
|
|
[[ $qret ]] && _ble_test_item_expect[3]=$xret
|
|
((${#_ble_test_item_expect[@]})) || _ble_test_item_expect[2]=0
|
|
IFS= builtin eval '_ble_test_code="${buff[*]}"'
|
|
}
|
|
_ble_test_item_name=(stdout stderr exit ret)
|
|
function ble/test {
|
|
local _ble_test_code
|
|
local _ble_test_title
|
|
local _ble_test_caller_depth=0
|
|
local _ble_test_display_code=
|
|
local -a _ble_test_item_expect=()
|
|
ble/test/.read-arguments "$@"
|
|
local caller_lineno=${BASH_LINENO[_ble_test_caller_depth+0]}
|
|
local caller_source=${BASH_SOURCE[_ble_test_caller_depth+1]}
|
|
_ble_test_title="$caller_source:$caller_lineno${_ble_test_title+ ($_ble_test_title)}"
|
|
ble/test/section#incr "$_ble_test_title"
|
|
ble/util/assign stderr '
|
|
ble/util/assign stdout "$_ble_test_code" 2>&1'; exit=$?
|
|
local -a item_result=()
|
|
item_result[0]=$stdout
|
|
item_result[1]=$stderr
|
|
item_result[2]=$exit
|
|
item_result[3]=$ret
|
|
local i flag_error=
|
|
for i in "${!_ble_test_item_expect[@]}"; do
|
|
[[ ${item_result[i]} == "${_ble_test_item_expect[i]}" ]] && continue
|
|
if [[ ! $flag_error ]]; then
|
|
flag_error=1
|
|
ble/test/log $'\e[1m'"$_ble_test_title"$'\e[m: \e[91m'"${_ble_test_display_code:-$_ble_test_code}"$'\e[m'
|
|
fi
|
|
ble/test/diff "${_ble_test_item_name[i]}" "${_ble_test_item_expect[i]}" "${item_result[i]}"
|
|
done
|
|
if [[ $flag_error ]]; then
|
|
if [[ ! ${_ble_test_item_expect[1]+set} && $stderr ]]; then
|
|
ble/test/log "<STDERR>"
|
|
ble/test/log "$stderr"
|
|
ble/test/log "</STDERR>"
|
|
fi
|
|
ble/test/log
|
|
fi
|
|
[[ ! $flag_error ]]
|
|
ble/test/section#report "$_ble_test_title"
|
|
return 0
|
|
}
|