selftest: Add basic test framework
Now, by execute `make test-run` in tests/, kexec-tools sanity tests
will be performed using VMs. There are currently 3 test cases, for local
kdump, nfs kdump and ssh kdump.
For each test VM, the selftest framework will create a snapshot layer,
do setup as required by the test case, this ensure each test runs in a
clean VM.
This framework will install a custom systemd service that starts when
system have finished booting, and the service will do basic routine
(fetch and set boot counter, etc..), then call the test case which is
installed in /kexec-kdump-test/test.sh in VM.
Each VM will have two serial consoles, one for ordinary console usage,
one for the test communication and log. The test script will watch the
second test console to know the test status.
The test cases are located in tests/scripts/testcases, documents about
the test cases structure will be provided in following commits.
Signed-off-by: Kairui Song <kasong@redhat.com>
Acked-by: Dave Young <dyoung@redhat.com>
2020-07-31 07:34:40 +00:00
|
|
|
#!/usr/bin/env sh
|
|
|
|
[ -z "$BASEDIR" ] && BASEDIR=$(realpath $(dirname "$0"))
|
|
|
|
[ -z "$TESTDIR" ] && TESTDIR=$(realpath $BASEDIR/../)
|
|
|
|
[ -z "$TEST_BASE_IMAGE" ] && TEST_BASE_IMAGE=$TESTDIR/output/test-base-image
|
|
|
|
|
|
|
|
[[ ! -e $TEST_BASE_IMAGE ]] && echo "Test base image not found." && exit 1
|
|
|
|
|
|
|
|
DEFAULT_QEMU_CMD="-nodefaults \
|
|
|
|
-nographic \
|
|
|
|
-smp 2 \
|
|
|
|
-m 768M \
|
|
|
|
-monitor none"
|
|
|
|
|
|
|
|
_YELLOW='\033[1;33m'
|
|
|
|
_GREEN='\033[0;32m'
|
|
|
|
_RED='\033[0;31m'
|
|
|
|
_NC='\033[0m' # No Color
|
|
|
|
|
|
|
|
get_test_path() {
|
|
|
|
local script=$1
|
|
|
|
local testname=$(basename $(dirname $script))
|
|
|
|
local output=$TESTDIR/output/$testname
|
|
|
|
|
|
|
|
echo $output
|
|
|
|
}
|
|
|
|
|
|
|
|
get_test_entry_name() {
|
|
|
|
echo $(basename ${1%.*})
|
|
|
|
}
|
|
|
|
|
|
|
|
get_test_image() {
|
|
|
|
local script=$1
|
|
|
|
local testout=$(get_test_path $script)
|
|
|
|
local entry=$(get_test_entry_name $script)
|
|
|
|
|
|
|
|
echo $testout/$entry.img
|
|
|
|
}
|
|
|
|
|
|
|
|
get_test_qemu_cmd_file() {
|
|
|
|
local script=$1
|
|
|
|
local testout=$(get_test_path $script)
|
|
|
|
local entry=$(get_test_entry_name $script)
|
|
|
|
|
|
|
|
echo $testout/$entry.qemu_cmd
|
|
|
|
}
|
|
|
|
|
|
|
|
get_test_qemu_cmd() {
|
|
|
|
cat $(get_test_qemu_cmd_file $1)
|
|
|
|
}
|
|
|
|
|
|
|
|
get_test_output_file() {
|
|
|
|
local script=$1
|
|
|
|
local testout=$(get_test_path $script)
|
|
|
|
local entry=$(get_test_entry_name $script)
|
|
|
|
|
|
|
|
echo $testout/$entry.output
|
|
|
|
}
|
|
|
|
|
|
|
|
get_test_console_file() {
|
|
|
|
local script=$1
|
|
|
|
local testout=$(get_test_path $script)
|
|
|
|
local entry=$(get_test_entry_name $script)
|
|
|
|
|
|
|
|
echo $testout/$entry.console
|
|
|
|
}
|
|
|
|
|
|
|
|
get_test_output() {
|
|
|
|
local output=$(get_test_output_file $1)
|
|
|
|
if [ -e "$output" ]; then
|
|
|
|
cat $(get_test_output_file $1)
|
|
|
|
else
|
|
|
|
echo "<No Output>"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
build_test_image() {
|
|
|
|
local script=$1
|
|
|
|
local test_image=$(get_test_image $script)
|
|
|
|
mkdir -p $(dirname $test_image)
|
|
|
|
|
|
|
|
$BASEDIR/build-image.sh \
|
|
|
|
$TEST_BASE_IMAGE \
|
|
|
|
$test_image \
|
|
|
|
$BASEDIR/build-scripts/test-image.sh \
|
|
|
|
$script
|
|
|
|
}
|
|
|
|
|
|
|
|
run_test_sync() {
|
|
|
|
local qemu_cmd=$(get_test_qemu_cmd $1)
|
|
|
|
|
|
|
|
if [ -n "$qemu_cmd" ]; then
|
2021-03-24 03:10:36 +00:00
|
|
|
timeout --foreground 10m $BASEDIR/run-qemu $(get_test_qemu_cmd $1)
|
selftest: Add basic test framework
Now, by execute `make test-run` in tests/, kexec-tools sanity tests
will be performed using VMs. There are currently 3 test cases, for local
kdump, nfs kdump and ssh kdump.
For each test VM, the selftest framework will create a snapshot layer,
do setup as required by the test case, this ensure each test runs in a
clean VM.
This framework will install a custom systemd service that starts when
system have finished booting, and the service will do basic routine
(fetch and set boot counter, etc..), then call the test case which is
installed in /kexec-kdump-test/test.sh in VM.
Each VM will have two serial consoles, one for ordinary console usage,
one for the test communication and log. The test script will watch the
second test console to know the test status.
The test cases are located in tests/scripts/testcases, documents about
the test cases structure will be provided in following commits.
Signed-off-by: Kairui Song <kasong@redhat.com>
Acked-by: Dave Young <dyoung@redhat.com>
2020-07-31 07:34:40 +00:00
|
|
|
else
|
|
|
|
echo "error: test qemu command line is not configured" > /dev/stderr
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
_check_test_result() {
|
|
|
|
grep "TEST PASSED" $1 2>/dev/null
|
|
|
|
[ $? -eq 0 ] && return 0
|
|
|
|
|
|
|
|
grep "TEST FAILED" $1 2>/dev/null
|
|
|
|
[ $? -eq 0 ] && return 1
|
|
|
|
|
|
|
|
grep "TEST ABORTED" $1 2>/dev/null
|
|
|
|
[ $? -eq 0 ] && return 2
|
|
|
|
|
|
|
|
return 255
|
|
|
|
}
|
|
|
|
|
|
|
|
# Print test result and return below value:
|
|
|
|
# 0: Test passed
|
|
|
|
# 1: Test failed
|
|
|
|
# 2: Test aborted, test scripts errored out
|
|
|
|
# 3: Test exited unexpectely, VM got killed early, or time out
|
|
|
|
gather_test_result() {
|
|
|
|
local ret=255
|
|
|
|
local res=""
|
|
|
|
|
|
|
|
for i in $@; do
|
|
|
|
res=$(_check_test_result $i)
|
|
|
|
ret=$?
|
|
|
|
|
|
|
|
if [ $ret -ne 255 ]; then
|
|
|
|
echo $res
|
|
|
|
return $ret
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
|
|
echo "${_RED}TEST RESULT NOT FOUND!${_NC}"
|
|
|
|
return 3
|
|
|
|
}
|
|
|
|
|
|
|
|
# Wait and watch for test result
|
|
|
|
watch_test_outputs() {
|
|
|
|
local ret=255
|
|
|
|
local res=""
|
|
|
|
# If VMs are still running, check for test result, if
|
|
|
|
# test finished, kill remaining VMs
|
|
|
|
while true; do
|
|
|
|
if [ -n "$(jobs -r)" ]; then
|
|
|
|
# VMs still running
|
|
|
|
for i in $@; do
|
|
|
|
res=$(_check_test_result $i)
|
|
|
|
ret=$?
|
|
|
|
|
|
|
|
if [ $ret -ne 255 ]; then
|
|
|
|
# Test finished, kill VMs
|
|
|
|
kill $(jobs -p)
|
|
|
|
break 2
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
else
|
|
|
|
# VMs exited
|
|
|
|
ret=255
|
|
|
|
|
|
|
|
for i in $@; do
|
|
|
|
res=$(_check_test_result $i)
|
|
|
|
ret=$?
|
|
|
|
|
|
|
|
if [ $ret -ne 255 ]; then
|
|
|
|
break 2
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
|
|
if [ $ret -eq 255 ]; then
|
|
|
|
ret=3
|
|
|
|
break
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
sleep 1
|
|
|
|
done
|
|
|
|
|
|
|
|
return $ret
|
|
|
|
}
|