powerline/tests/test_shells/test.sh

492 lines
14 KiB
Bash
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/sh
. tests/shlib/common.sh
enter_suite shell final
if test $# -eq 0 ; then
FAST=1
fi
ONLY_SHELL="$1"
ONLY_TEST_TYPE="$2"
ONLY_TEST_CLIENT="$3"
export PYTHON
if test "$ONLY_SHELL" = "--help" ; then
cat << EOF
Usage:
$0 [[[ONLY_SHELL | ""] (ONLY_TEST_TYPE | "")] (ONLY_TEST_CLIENT | "")]
ONLY_SHELL: execute only tests for given shell
ONLY_TEST_TYPE: execute only "daemon" or "nodaemon" tests
ONLY_TEST_CLIENT: use only given test client (one of C, python, render, shell)
EOF
exit 0
fi
check_screen_log() {
TEST_TYPE="$1"
TEST_CLIENT="$2"
SH="$3"
if test -e "$ROOT/tests/test_shells/outputs/${SH}.${TEST_TYPE}.ok" ; then
diff -a -u "$ROOT/tests/test_shells/outputs/${SH}.${TEST_TYPE}.ok" \
"$TEST_ROOT/${SH}.${TEST_TYPE}.${TEST_CLIENT}.log"
return $?
elif test -e "$ROOT/tests/test_shells/outputs/${SH}.ok" ; then
diff -a -u "$ROOT/tests/test_shells/outputs/${SH}.ok" \
"$TEST_ROOT/${SH}.${TEST_TYPE}.${TEST_CLIENT}.log"
return $?
else
cat "$TEST_ROOT/${SH}.${TEST_TYPE}.${TEST_CLIENT}.log"
return 1
fi
}
# HACK: get newline for use in strings given that "\n" and $'' do not work.
NL="$(printf '\nE')"
NL="${NL%E}"
print_full_output() {
TEST_TYPE="$1"
TEST_CLIENT="$2"
SH="$3"
echo "Full output:"
echo '============================================================'
cat "$TEST_ROOT/${SH}.${TEST_TYPE}.${TEST_CLIENT}.full.log"
echo
echo '____________________________________________________________'
if test "$POWERLINE_TEST_NO_CAT_V" != "1" ; then
echo "Full output (cat -v):"
echo '============================================================'
cat -v "$TEST_ROOT/${SH}.${TEST_TYPE}.${TEST_CLIENT}.full.log"
echo
echo '____________________________________________________________'
fi
}
do_run_test() {
TEST_TYPE="$1"
shift
TEST_CLIENT="$1"
shift
SH="$1"
local wait_for_echo_arg=
if ( \
test "${SH}" = "dash" \
|| ( \
test "${SH}" = "pdb" \
&& ( \
( \
test "$PYTHON_VERSION_MAJOR" -eq 3 \
&& test "$PYTHON_VERSION_MINOR" -eq 2 \
&& test "$PYTHON_IMPLEMENTATION" = "CPython" \
) \
|| test "$PYTHON_IMPLEMENTATION" = "PyPy" \
) \
) \
|| ( \
test "${SH}" = "ipython" \
&& test "$("${PYTHON}" -mIPython --version | head -n1 | cut -d. -f1)" -ge 5 \
) \
) ; then
wait_for_echo_arg="--wait-for-echo"
fi
"${PYTHON}" tests/test_shells/run_script.py \
$wait_for_echo_arg --type=${TEST_TYPE} --client=${TEST_CLIENT} --shell=${SH} \
"$@"
if ! check_screen_log ${TEST_TYPE} ${TEST_CLIENT} ${SH} ; then
echo '____________________________________________________________'
if test "$POWERLINE_TEST_NO_CAT_V" != "1" ; then
# Repeat the diff to make it better viewable in travis output
echo "Diff (cat -v):"
echo '============================================================'
check_screen_log ${TEST_TYPE} ${TEST_CLIENT} ${SH} | cat -v
echo '____________________________________________________________'
fi
echo -n "Failed ${SH}. "
print_full_output ${TEST_TYPE} ${TEST_CLIENT} ${SH}
case "${SH}" in
*ksh)
"$TEST_ROOT/path/${SH}" -c 'echo ${KSH_VERSION}'
;;
dash)
# ?
;;
busybox)
busybox --help
;;
*)
"$TEST_ROOT/path/${SH}" --version
;;
esac
if which dpkg >/dev/null ; then
dpkg -s ${SH}
fi
return 1
fi
return 0
}
run_test() {
TEST_TYPE="$1"
TEST_CLIENT="$2"
SH="$3"
local attempts=3
if test -n "$ONLY_SHELL$ONLY_TEST_TYPE$ONLY_TEST_CLIENT" ; then
attempts=1
fi
while test $attempts -gt 0 ; do
rm -f "$TEST_ROOT/${SH}.${TEST_TYPE}.${TEST_CLIENT}.log"
rm -f "$TEST_ROOT/${SH}.${TEST_TYPE}.${TEST_CLIENT}.full.log"
do_run_test "$@" && return 0
attempts=$(( attempts - 1 ))
done
return 1
}
make_test_root
git init "$TEST_ROOT/3rd"
git --git-dir="$TEST_ROOT/3rd/.git" checkout -b BRANCH
export DIR1=""
export DIR2=""
mkdir "$TEST_ROOT/3rd/$DIR1"
mkdir "$TEST_ROOT/3rd/$DIR2"
mkdir "$TEST_ROOT"/3rd/'\[\]'
mkdir "$TEST_ROOT"/3rd/'%%'
mkdir "$TEST_ROOT"/3rd/'#[bold]'
mkdir "$TEST_ROOT"/3rd/'(echo)'
mkdir "$TEST_ROOT"/3rd/'$(echo)'
mkdir "$TEST_ROOT"/3rd/'`echo`'
mkdir "$TEST_ROOT"/3rd/'«Unicode!»'
mkdir "$TEST_ROOT/fish_home"
mkdir "$TEST_ROOT/fish_home/fish"
mkdir "$TEST_ROOT/fish_home/fish/generated_completions"
cp -r "$ROOT/tests/test_shells/ipython_home" "$TEST_ROOT"
mkdir "$TEST_ROOT/path"
ln -s "$(which "${PYTHON}")" "$TEST_ROOT/path/python"
ln -s "$(which env)" "$TEST_ROOT/path"
ln -s "$(which git)" "$TEST_ROOT/path"
ln -s "$(which sleep)" "$TEST_ROOT/path"
ln -s "$(which cat)" "$TEST_ROOT/path"
ln -s "$(which false)" "$TEST_ROOT/path"
ln -s "$(which true)" "$TEST_ROOT/path"
ln -s "$(which kill)" "$TEST_ROOT/path"
ln -s "$(which echo)" "$TEST_ROOT/path"
ln -s "$(which which)" "$TEST_ROOT/path"
ln -s "$(which dirname)" "$TEST_ROOT/path"
ln -s "$(which wc)" "$TEST_ROOT/path"
ln -s "$(which stty)" "$TEST_ROOT/path"
ln -s "$(which cut)" "$TEST_ROOT/path"
ln -s "$(which bc)" "$TEST_ROOT/path"
ln -s "$(which expr)" "$TEST_ROOT/path"
ln -s "$(which mktemp)" "$TEST_ROOT/path"
ln -s "$(which grep)" "$TEST_ROOT/path"
ln -s "$(which sed)" "$TEST_ROOT/path"
ln -s "$(which rm)" "$TEST_ROOT/path"
ln -s "$(which tr)" "$TEST_ROOT/path"
ln -s "$(which uname)" "$TEST_ROOT/path"
ln -s "$(which test)" "$TEST_ROOT/path"
ln -s "$(which pwd)" "$TEST_ROOT/path"
ln -s "$(which hostname)" "$TEST_ROOT/path"
ln -s "$ROOT/tests/test_shells/bgscript.sh" "$TEST_ROOT/path"
ln -s "$ROOT/tests/test_shells/waitpid.sh" "$TEST_ROOT/path"
if which socat ; then
ln -s "$(which socat)" "$TEST_ROOT/path"
fi
for pexe in powerline powerline-config powerline-render powerline.sh powerline.py ; do
if test -e "$ROOT/scripts/$pexe" ; then
ln -s "$ROOT/scripts/$pexe" "$TEST_ROOT/path"
elif test -e client/$pexe ; then
ln -s "$ROOT/client/$pexe" "$TEST_ROOT/path"
elif which $pexe ; then
ln -s "$(which $pexe)" "$TEST_ROOT/path"
else
echo "Executable $pexe was not found"
exit 1
fi
done
ln -s python "$TEST_ROOT/path/pdb"
PDB_PYTHON=pdb
ln -s python "$TEST_ROOT/path/ipython"
IPYTHON_PYTHON=ipython
if test -z "$POWERLINE_RC_EXE" ; then
if which rc-status >/dev/null ; then
# On Gentoo `rc` executable is from OpenRC. Thus app-shells/rc instals
# `rcsh` executable.
POWERLINE_RC_EXE=rcsh
else
POWERLINE_RC_EXE=rc
fi
fi
if which "$POWERLINE_RC_EXE" >/dev/null ; then
ln -s "$(which $POWERLINE_RC_EXE)" "$TEST_ROOT/path/rc"
fi
exes="bash zsh busybox tcsh mksh"
if test "$TRAVIS" != "true" ; then
# For some reason fish does not work on travis
exes="$exes fish"
fi
# dash has some problems with job control
#exes="$exes dash"
for exe in $exes ; do
if which $exe >/dev/null ; then
if test "$exe" = "fish" ; then
fish_version="$(fish --version 2>&1)"
fish_version="${fish_version##* }"
fish_version_major="${fish_version%%.*}"
if test "$fish_version_major" != "$fish_version" ; then
# No dot is in development version compiled by bot-ci
fish_version_minor="${fish_version#*.}"
fish_version_patch="${fish_version_minor#*.}"
fish_version_dev="${fish_version_patch#*-}"
if test "$fish_version_dev" = "$fish_version_patch" ; then
fish_version_dev=""
fi
fish_version_minor="${fish_version_minor%%.*}"
fish_version_patch="${fish_version_patch%%-*}"
if test $fish_version_major -lt 2 || ( \
test $fish_version_major -eq 2 && (\
test $fish_version_minor -lt 1 || (\
test $fish_version_minor -eq 1 &&
test $fish_version_patch -lt 2 && \
test -z "$fish_version_dev"
) \
) \
) ; then
continue
fi
fi
fi
ln -s "$(which $exe)" "$TEST_ROOT/path"
fi
done
mkdir "$TEST_ROOT/home"
export HOME="$TEST_ROOT/home"
unset ENV
export ADDRESS="powerline-ipc-test-$$"
export PYTHON
echo "Powerline address: $ADDRESS"
check_test_client() {
local executable="$1"
local client_type="$2"
local actual_mime_type="$(
file --mime-type --brief --dereference "$TEST_ROOT/path/$executable" \
| cut -d/ -f1
)"
local expected_mime_type
case "$client_type" in
C) expected_mime_type="application/x-executable" ;;
python) expected_mime_type="text/x-python" ;;
render) expected_mime_type="text/x-python" ;;
shell) expected_mime_type="text/x-shellscript" ;;
esac
expected_mime_type="${expected_mime_type%/*}"
if test "$expected_mime_type" != "$actual_mime_type" ; then
fail "MIME-$executable" "M" "Expected $executable to have MIME type $expected_mime_type, but got $actual_mime_type"
fi
}
if ( \
test -z "${ONLY_SHELL}" \
|| test "${ONLY_SHELL%sh}" != "${ONLY_SHELL}" \
|| test "${ONLY_SHELL}" = "busybox" \
|| test "${ONLY_SHELL}" = "rc" \
) ; then
scripts/powerline-config shell command
for TEST_TYPE in "daemon" "nodaemon" ; do
if test -n "$ONLY_TEST_TYPE" && test "$ONLY_TEST_TYPE" != "$TEST_TYPE"
then
continue
fi
if test "$FAST" = 1 ; then
if test $TEST_TYPE = daemon ; then
VARIANTS=3
else
VARIANTS=4
fi
EXETEST="$(( ${RANDOM:-`date +%N | sed s/^0*//`} % $VARIANTS ))"
echo "Execute tests: $EXETEST"
fi
if test $TEST_TYPE = daemon ; then
sh -c '
echo $$ > "$TEST_ROOT/daemon_pid"
exec "$PYTHON" ./scripts/powerline-daemon -s"$ADDRESS" -f >"$TEST_ROOT/daemon_log" 2>&1
' &
fi
echo "> Testing $TEST_TYPE"
I=-1
for POWERLINE_COMMAND in \
powerline \
powerline-render \
powerline.py \
powerline.sh
do
case "$POWERLINE_COMMAND" in
powerline) TEST_CLIENT=C ;;
powerline-render) TEST_CLIENT=render ;;
powerline.py) TEST_CLIENT=python ;;
powerline.sh) TEST_CLIENT=shell ;;
esac
check_test_client "$POWERLINE_COMMAND" $TEST_CLIENT
if test "$TEST_CLIENT" = render && test "$TEST_TYPE" = daemon ; then
continue
fi
I="$(( I + 1 ))"
if test "$TEST_CLIENT" = "C" && ! test -x "$ROOT/scripts/powerline"
then
if which powerline >/dev/null ; then
POWERLINE_COMMAND=powerline
else
continue
fi
fi
if ( \
test "$TEST_CLIENT" = "shell" \
&& ! test -x "$TEST_ROOT/path/socat" \
) ; then
continue
fi
if ( \
test -n "$ONLY_TEST_CLIENT" \
&& test "$TEST_CLIENT" != "$ONLY_TEST_CLIENT" \
) ; then
continue
fi
export POWERLINE_COMMAND_ARGS="--socket $ADDRESS"
export POWERLINE_COMMAND="$POWERLINE_COMMAND"
echo ">> powerline command is ${POWERLINE_COMMAND:-empty}"
J=-1
for TEST_COMMAND in \
"bash --norc --noprofile -i" \
"zsh -f -i" \
"fish -i" \
"tcsh -f -i" \
"busybox ash -i" \
"mksh -i" \
"dash -i" \
"rc -i -p"
do
J="$(( J + 1 ))"
if test "$FAST" = 1 ; then
if test $(( (I + J) % $VARIANTS )) -ne $EXETEST ; then
continue
fi
fi
SH="${TEST_COMMAND%% *}"
if test -n "$ONLY_SHELL" && test "$ONLY_SHELL" != "$SH" ; then
continue
fi
if ! test -x "$TEST_ROOT/path/$SH" ; then
continue
fi
echo ">>> $(readlink "$TEST_ROOT/path/$SH")"
if ! run_test $TEST_TYPE $TEST_CLIENT $TEST_COMMAND ; then
fail "$SH-$TEST_TYPE-$TEST_CLIENT:test" F \
"Failed checking $TEST_COMMAND"
fi
done
done
if test $TEST_TYPE = daemon ; then
"$PYTHON" ./scripts/powerline-daemon -s"$ADDRESS" -k
wait $(cat "$TEST_ROOT/daemon_pid")
if ! test -z "$(cat "$TEST_ROOT/daemon_log")" ; then
echo '____________________________________________________________'
echo "Daemon log:"
echo '============================================================'
cat "$TEST_ROOT/daemon_log"
fail "$SH-$TEST_TYPE-$TEST_CLIENT:log" E \
"Non-empty daemon log for ${TEST_COMMAND}"
fi
fi
done
fi
if "$PYTHON" scripts/powerline-daemon -s"$ADDRESS" \
> "$TEST_ROOT/daemon_log_2" 2>&1
then
sleep 1
"$PYTHON" scripts/powerline-daemon -s"$ADDRESS" -k
else
fail "daemon:run" F "Daemon exited with status $?"
fi
if ! test -z "$(cat "$TEST_ROOT/daemon_log_2")" ; then
echo '____________________________________________________________'
echo "Daemon log (2nd):"
echo '============================================================'
cat "$TEST_ROOT/daemon_log_2"
fail "daemon:log" E "Daemon run with non-empty log"
fi
if ( test -z "${ONLY_SHELL}" || test "${ONLY_SHELL}" = "zsh" ) \
&& ( test -z "${ONLY_TEST_TYPE}" || test "${ONLY_TEST_TYPE}" = "zpython" ) \
&& "$TEST_ROOT/path/zsh" "$ROOT/tests/test_shells/zsh_test_script.zsh"
then
echo "> zpython"
if ! run_test zpython zpython zsh -f -i ; then
fail "zsh-zpython:test" F "Failed checking zsh -f -i"
fi
fi
if test -z "${ONLY_SHELL}" || test "${ONLY_SHELL}" = "pdb" ; then
if test "$PYTHON_IMPLEMENTATION" != "PyPy" ; then
if test -z "${ONLY_TEST_TYPE}" || test "${ONLY_TEST_TYPE}" = "subclass"
then
echo "> pdb subclass"
if ! run_test subclass python $PDB_PYTHON \
"$ROOT/tests/test_shells/pdb-main.py"
then
fail --allow-failure "pdb-subclass:test" F \
"Failed checking $PDB_PYTHON $ROOT/tests/test_shells/pdb-main.py"
fi
fi
if test -z "${ONLY_TEST_TYPE}" || test "${ONLY_TEST_TYPE}" = "module" ; then
echo "> pdb module"
MODULE="powerline.bindings.pdb"
if test "$PYTHON_MM" = "2.6" ; then
MODULE="powerline.bindings.pdb.__main__"
fi
if ! run_test module python "$PDB_PYTHON" -m"$MODULE" \
"$ROOT/tests/test_shells/pdb-script.py"
then
fail --allow-failure "pdb-module:test" F \
"Failed checking $PDB_PYTHON -m$MODULE $ROOT/tests/test_shells/pdb-script"
fi
fi
fi
fi
if test -z "${ONLY_SHELL}" || test "${ONLY_SHELL}" = "ipython" ; then
if "${PYTHON}" -c "try: import IPython${NL}except ImportError: raise SystemExit(1)" ; then
# Define some overrides which should be ignored by IPython.
export POWERLINE_CONFIG_OVERRIDES='common.term_escape_style=fbterm'
export POWERLINE_THEME_OVERRIDES='in.segments.left=[]'
echo "> ipython"
if ! run_test ipython ipython ${IPYTHON_PYTHON} -mIPython ; then
# Do not allow ipython tests to spoil the build
fail --allow-failure "ipython:test" F "Failed checking ${IPYTHON_PYTHON} -mIPython"
fi
unset POWERLINE_THEME_OVERRIDES
unset POWERLINE_CONFIG_OVERRIDES
fi
fi
exit_suite