ksc/tests/sanity/test-ksc-elf.sh
2023-06-29 10:09:20 +02:00

176 lines
4.6 KiB
Bash

#!/usr/bin/env bash
#
# ksc gating
#
# verify that ksc launcher is marked executable
#
SYMBOL_CHECKS=()
SYMBOL_CHECKS+=(symbol_check_1)
DESCRIPTION_symbol_check_1=(
"Verify that all symbols in whitelisted and nonwhitelisted sections"
"of the just produced ksc-report.txt are marked as undefined by nm,"
"discounting symbols defined within the set of modules used."
)
function symbol_check_1() {
test -z "$(comm -13 <(ksc_report_symbols_all) \
<(ko_get_group_undefined))"
return $?
}
SYMBOL_CHECKS+=(symbol_check_2)
DESCRIPTION_symbol_check_2=(
"Verify that all symbols in whitelisted and nonwhitelisted sections"
"of the just produced ksc-report.txt come from Module.symvers only."
)
function symbol_check_2() {
test -z "$(comm -23 <(ksc_report_symbols_all) \
<(get_module_symvers_symbols))"
return $?
}
#
SYMBOL_CHECKS+=(symbol_check_3)
DESCRIPTION_symbol_check_3=(
"Verify that all whitelisted symbols are present on kabi whitelist."
)
function symbol_check_3() {
test -z "$(comm -13 <(kabi_whitelists_symbols) \
<(ksc_report_symbols_whitelisted))"
return $?
}
function find_ko()
{
if test -z $1
then
# TODO ERRROR
return 1
fi
local count=$1
local matches=()
if test $count -gt 0
then
matches+=($(
find "$MOD_PATH" -type f -iname "*.ko.*" \
| head -n $count \
| xargs -I MATCH bash -c '
case $(echo MATCH | grep -Eo "[^.]+$") in
xz) unxz MATCH;;
bz2) bzip2 -d MATCH;;
gz) gunzip MATCH;;
*) echo MATCH; exit 0;;
esac;
echo MATCH | sed "s/\.[^.]*$//g";'
))
fi
# make sure some matches were found
if test ${#matches[@]} -eq 0
then
# TODO ERROR
return 1
fi
# and that they are in fact readable
for match in ${matches[@]}
do
if test -z $match -o ! -r $match
then
# TODO ERRROR
return 1
fi
done
echo ${matches[@]}
return 0
}
function common_ksc_elf_ko()
{
local test_name="$1"
local stdout_log="$2"
local stderr_log="$3"
local count="$4"
shift 4
local ko=($(find_ko $count))
eval DESCRIPTION_$test_name+=\(\"\"\)
eval DESCRIPTION_$test_name+=\(\"Test used the following modules:\"\)
for mod in ${ko[@]}
do
mod_rel="$(realpath --relative-to="$MOD_PATH" $ko)"
eval DESCRIPTION_$test_name+=\(\"\${mod_rel/\#/ - }\"\)
done
rm -f ~/ksc-result.txt
"$KSC_BIN" ${ko[@]/#/-k } >> $stdout_log 2>> $stderr_log
if test $? -gt 0
then
echo
echo "ERROR: $KSC_BIN returned w/ non-zero return code when" \
"presented w/ valid kernel module."
echo "STDOUT {"
cat $stdout_log
echo "}"
echo "STDERR {"
cat $stderr_log
echo "}"
return 1
fi
if test ! -s ~/ksc-result.txt
then
echo
echo "ERROR: ~/ksc-result.txt was not created or is empty."
echo "STDOUT {"
cat $stdout_log
echo "}"
echo "STDERR {"
cat $stderr_log
echo "}"
return 1
fi
return 0
}
TESTS+=(test_ksc_elf_ko_single ${SYMBOL_CHECKS[@]})
DESCRIPTION_test_ksc_elf_ko_single=(
"Verify that ksc processes valid ELF kernel module. This amounts to"
"checking that ~/ksc-result.txt is created and that ksc terminates"
"w/ non-zero error code."
)
function test_ksc_elf_ko_single()
{
common_ksc_elf_ko test_ksc_elf_ko_single $@ 1
return $?
}
TESTS+=(test_ksc_elf_ko_mul)
DESCRIPTION_test_ksc_elf_ko_mul=(
"Verify that ksc processes multiple valid ELF kernel modules. This"
"amounts to checking that ~/ksc-result.txt is created and that ksc"
"terminates w/ non-zero error code."
)
function test_ksc_elf_ko_mul()
{
common_ksc_elf_ko test_ksc_elf_ko_mul $@ 2
return $?
}