|
Packit Service |
8eee21 |
#!/bin/bash
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# libseccomp regression test automation script
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Copyright IBM Corp. 2012
|
|
Packit Service |
8eee21 |
# Author: Corey Bryant <coreyb@linux.vnet.ibm.com>
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# This library is free software; you can redistribute it and/or modify it
|
|
Packit Service |
8eee21 |
# under the terms of version 2.1 of the GNU Lesser General Public License as
|
|
Packit Service |
8eee21 |
# published by the Free Software Foundation.
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# This library is distributed in the hope that it will be useful, but WITHOUT
|
|
Packit Service |
8eee21 |
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
Packit Service |
8eee21 |
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
|
Packit Service |
8eee21 |
# for more details.
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# You should have received a copy of the GNU Lesser General Public License
|
|
Packit Service |
8eee21 |
# along with this library; if not, see <http://www.gnu.org/licenses>.
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
GLBL_ARCH_LE_SUPPORT=" \
|
|
Packit Service |
8eee21 |
x86 x86_64 x32 \
|
|
Packit Service |
8eee21 |
arm aarch64 \
|
|
Packit Service |
8eee21 |
mipsel mipsel64 mipsel64n32 \
|
|
Packit Service |
8eee21 |
ppc64le"
|
|
Packit Service |
8eee21 |
GLBL_ARCH_BE_SUPPORT=" \
|
|
Packit Service |
8eee21 |
mips mips64 mips64n32 \
|
|
Packit Service |
8eee21 |
parisc parisc64 \
|
|
Packit Service |
8eee21 |
ppc ppc64 \
|
|
Packit Service |
8eee21 |
s390 s390x"
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
GLBL_ARCH_32B_SUPPORT=" \
|
|
Packit Service |
8eee21 |
x86 x32 \
|
|
Packit Service |
8eee21 |
arm \
|
|
Packit Service |
8eee21 |
mips mipsel mips64n32 mipsel64n32 \
|
|
Packit Service |
8eee21 |
parisc \
|
|
Packit Service |
8eee21 |
ppc \
|
|
Packit Service |
8eee21 |
s390"
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
GLBL_ARCH_64B_SUPPORT=" \
|
|
Packit Service |
8eee21 |
x86_64 \
|
|
Packit Service |
8eee21 |
aarch64 \
|
|
Packit Service |
8eee21 |
mips64 \
|
|
Packit Service |
8eee21 |
parisc64 \
|
|
Packit Service |
8eee21 |
ppc64 \
|
|
Packit Service |
8eee21 |
s390x"
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
GLBL_SYS_ARCH="../tools/scmp_arch_detect"
|
|
Packit Service |
8eee21 |
GLBL_SYS_RESOLVER="../tools/scmp_sys_resolver"
|
|
Packit Service |
8eee21 |
GLBL_SYS_SIM="../tools/scmp_bpf_sim"
|
|
Packit Service |
8eee21 |
GLBL_SYS_API="../tools/scmp_api_level"
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
####
|
|
Packit Service |
8eee21 |
# functions
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Dependency check
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Arguments:
|
|
Packit Service |
8eee21 |
# 1 Dependency to check for
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
function check_deps() {
|
|
Packit Service |
8eee21 |
[[ -z "$1" ]] && return
|
|
Packit Service |
8eee21 |
which "$1" >& /dev/null
|
|
Packit Service |
8eee21 |
return $?
|
|
Packit Service |
8eee21 |
}
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Dependency verification
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Arguments:
|
|
Packit Service |
8eee21 |
# 1 Dependency to check for
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
function verify_deps() {
|
|
Packit Service |
8eee21 |
[[ -z "$1" ]] && return
|
|
Packit Service |
8eee21 |
if ! check_deps "$1"; then
|
|
Packit Service |
8eee21 |
echo "error: install \"$1\" and include it in your \$PATH"
|
|
Packit Service |
8eee21 |
exit 1
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
}
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Print out script usage details
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
function usage() {
|
|
Packit Service |
8eee21 |
cat << EOF
|
|
Packit Service |
8eee21 |
usage: regression [-h] [-v] [-m MODE] [-a] [-b BATCH_NAME] [-l <LOG>]
|
|
Packit Service |
8eee21 |
[-s SINGLE_TEST] [-t <TEMP_DIR>] [-T <TEST_TYPE>]
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
libseccomp regression test automation script
|
|
Packit Service |
8eee21 |
optional arguments:
|
|
Packit Service |
8eee21 |
-h show this help message and exit
|
|
Packit Service |
8eee21 |
-m MODE specified the test mode [c (default), python]
|
|
Packit Service |
8eee21 |
can also be set via LIBSECCOMP_TSTCFG_MODE_LIST env variable
|
|
Packit Service |
8eee21 |
-a specifies all tests are to be run
|
|
Packit Service |
8eee21 |
-b BATCH_NAME specifies batch of tests to be run
|
|
Packit Service |
8eee21 |
-l [LOG] specifies log file to write test results to
|
|
Packit Service |
8eee21 |
-s SINGLE_TEST specifies individual test number to be run
|
|
Packit Service |
8eee21 |
-t [TEMP_DIR] specifies directory to create temporary files in
|
|
Packit Service |
8eee21 |
-T [TEST_TYPE] only run tests matching the specified type
|
|
Packit Service |
8eee21 |
can also be set via LIBSECCOMP_TSTCFG_TYPE env variable
|
|
Packit Service |
8eee21 |
-v specifies that verbose output be provided
|
|
Packit Service |
8eee21 |
EOF
|
|
Packit Service |
8eee21 |
}
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Generate a string representing the test number
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Arguments:
|
|
Packit Service |
8eee21 |
# 1 string containing the batch name
|
|
Packit Service |
8eee21 |
# 2 value of the test number from the input test data file
|
|
Packit Service |
8eee21 |
# 3 value of the subtest number that corresponds to argument 1
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# The actual test number from the input test data file is 1 for the first
|
|
Packit Service |
8eee21 |
# test found in the file, 2 for the second, etc.
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# The subtest number is useful for batches that generate multiple tests based
|
|
Packit Service |
8eee21 |
# on a single line of input from the test data file. The subtest number
|
|
Packit Service |
8eee21 |
# should be set to zero if the corresponding test data is actual test data
|
|
Packit Service |
8eee21 |
# that was read from the input file, and should be set to a value greater than
|
|
Packit Service |
8eee21 |
# zero if the corresponding test data is generated.
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
function generate_test_num() {
|
|
Packit Service |
8eee21 |
local testnumstr=$(printf '%s%%%%%03d-%05d' "$1" $2 $3)
|
|
Packit Service |
8eee21 |
echo "$testnumstr"
|
|
Packit Service |
8eee21 |
}
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Print the test data to the log file
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Arguments:
|
|
Packit Service |
8eee21 |
# 1 string containing generated test number
|
|
Packit Service |
8eee21 |
# 2 string containing line of test data
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
function print_data() {
|
|
Packit Service |
8eee21 |
if [[ -n $verbose ]]; then
|
|
Packit Service |
8eee21 |
printf "Test %s data: %s\n" "$1" "$2" >&$logfd
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
}
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Print the test result to the log file
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Arguments:
|
|
Packit Service |
8eee21 |
# 1 string containing generated test number
|
|
Packit Service |
8eee21 |
# 2 string containing the test result (INFO, SUCCESS, ERROR, or FAILURE)
|
|
Packit Service |
8eee21 |
# 3 string containing addition details
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
function print_result() {
|
|
Packit Service |
8eee21 |
if [[ $2 == "INFO" && -z $verbose ]]; then
|
|
Packit Service |
8eee21 |
return
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
if [[ $3 == "" ]]; then
|
|
Packit Service |
8eee21 |
printf "Test %s result: %s\n" "$1" "$2" >&$logfd
|
|
Packit Service |
8eee21 |
else
|
|
Packit Service |
8eee21 |
printf "Test %s result: %s %s\n" "$1" "$2" "$3" >&$logfd
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
}
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Print the valgrind header to the log file
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Arguments:
|
|
Packit Service |
8eee21 |
# 1 string containing generated test number
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
function print_valgrind() {
|
|
Packit Service |
8eee21 |
if [[ -n $verbose ]]; then
|
|
Packit Service |
8eee21 |
printf "Test %s valgrind output\n" "$1" >&$logfd
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
}
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Get the low or high range value from a range specification
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Arguments:
|
|
Packit Service |
8eee21 |
# 1 value specifying range value to retrieve: low (1) or high (2)
|
|
Packit Service |
8eee21 |
# 2 string containing dash-separated range or a single value
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
function get_range() {
|
|
Packit Service |
8eee21 |
if [[ $2 =~ ^[0-9a-fA-Fx]+-[0-9a-fA-Fx]+$ ]]; then
|
|
Packit Service |
8eee21 |
# if there's a dash, get the low or high range value
|
|
Packit Service |
8eee21 |
range_val=$(echo "$2" | cut -d'-' -f "$1")
|
|
Packit Service |
8eee21 |
else
|
|
Packit Service |
8eee21 |
# otherwise there should just be a single value
|
|
Packit Service |
8eee21 |
range_val="$2"
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
echo "$range_val"
|
|
Packit Service |
8eee21 |
}
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Get the number sequence for a given range with increments of 1, i.e.
|
|
Packit Service |
8eee21 |
# implement a specialized seq(1).
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# We use our own implementation based on miniseq in favour to the standard seq
|
|
Packit Service |
8eee21 |
# tool as, at least, seq of coreutils v8.23 and v8.24 has problems on 32 bit
|
|
Packit Service |
8eee21 |
# ARM for large numbers (see the mailing thread at
|
|
Packit Service |
8eee21 |
# https://groups.google.com/forum/#!topic/libseccomp/VtrClkXxLGA).
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Arguments:
|
|
Packit Service |
8eee21 |
# 1 starting value
|
|
Packit Service |
8eee21 |
# 2 last value
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
function get_seq() {
|
|
Packit Service |
8eee21 |
# NOTE: this whole thing is a bit hacky, but we need to search around
|
|
Packit Service |
8eee21 |
# for miniseq to fix 'make distcheck', someday we should fix this
|
|
Packit Service |
8eee21 |
if [[ -x ./miniseq ]]; then
|
|
Packit Service |
8eee21 |
./miniseq "$1" "$2"
|
|
Packit Service |
8eee21 |
elif [[ -x $basedir/miniseq ]]; then
|
|
Packit Service |
8eee21 |
$basedir/miniseq "$1" "$2"
|
|
Packit Service |
8eee21 |
else
|
|
Packit Service |
8eee21 |
# we're often run from a subshell, so we can't simply exit
|
|
Packit Service |
8eee21 |
echo "error: unable to find miniseq" >&2
|
|
Packit Service |
8eee21 |
kill $pid
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
}
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Run the specified test command (with valgrind if requested)
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Arguments:
|
|
Packit Service |
8eee21 |
# 1 string containing generated test number
|
|
Packit Service |
8eee21 |
# 2 string containing command name
|
|
Packit Service |
8eee21 |
# 3 string containing command options
|
|
Packit Service |
8eee21 |
# 4 number for the stdout fd
|
|
Packit Service |
8eee21 |
# 5 number for the stderr fd
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
function run_test_command() {
|
|
Packit Service |
8eee21 |
local cmd
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
if [[ $mode == "python" ]]; then
|
|
Packit Service |
8eee21 |
cmd="PYTHONPATH=$PYTHONPATH"
|
|
Packit Service |
8eee21 |
cmd="$cmd:$(cd $(pwd)/../src/python/build/lib.*; pwd)"
|
|
Packit Service |
8eee21 |
# check and adjust if we are doing a VPATH build
|
|
Packit Service |
8eee21 |
if [[ -e "./$2.py" ]]; then
|
|
Packit Service |
8eee21 |
cmd="$cmd /usr/bin/env python $2.py $3"
|
|
Packit Service |
8eee21 |
else
|
|
Packit Service |
8eee21 |
cmd="$cmd /usr/bin/env python ${srcdir}/$2.py $3"
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
else
|
|
Packit Service |
8eee21 |
cmd="$2 $3"
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# setup the stdout/stderr redirects
|
|
Packit Service |
8eee21 |
local stdout=$4
|
|
Packit Service |
8eee21 |
local stderr=$5
|
|
Packit Service |
8eee21 |
[[ -z $stdout ]] && stdout=$logfd
|
|
Packit Service |
8eee21 |
[[ -z $stderr ]] && stderr=$logfd
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# run the command
|
|
Packit Service |
8eee21 |
eval "$cmd" 1>&$stdout 2>&$stderr
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# return the command's return code
|
|
Packit Service |
8eee21 |
return $?
|
|
Packit Service |
8eee21 |
}
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Generate pseudo-random string of alphanumeric characters
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# The generated string will be no larger than the corresponding
|
|
Packit Service |
8eee21 |
# architecture's register size.
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
function generate_random_data() {
|
|
Packit Service |
8eee21 |
local rcount
|
|
Packit Service |
8eee21 |
local rdata
|
|
Packit Service |
8eee21 |
if [[ $arch == "x86_64" ]]; then
|
|
Packit Service |
8eee21 |
rcount=$[ ($RANDOM % 16) + 1 ]
|
|
Packit Service |
8eee21 |
else
|
|
Packit Service |
8eee21 |
rcount=$[ ($RANDOM % 8) + 1 ]
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
rdata=$(echo $(
|
|
Packit Service |
8eee21 |
echo "$rdata"
|
|
Packit Service |
8eee21 |
}
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Run the specified "bpf-sim-fuzz" test
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Tests that belong to the "bpf-sim-fuzz" test type generate a BPF filter and
|
|
Packit Service |
8eee21 |
# then run a simulated system call test with pseudo-random fuzz data for the
|
|
Packit Service |
8eee21 |
# syscall and argument values. Tests that belong to this test type provide the
|
|
Packit Service |
8eee21 |
# following data on a single line in the input batch file:
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Testname - The executable test name (e.g. 01-allow, 02-basic, etc.)
|
|
Packit Service |
8eee21 |
# StressCount - The number of fuzz tests to run against the filter
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# The following test data is output to the logfile for each generated test:
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Testname - The executable test name (e.g. 01-allow, 02-basic, etc.)
|
|
Packit Service |
8eee21 |
# Syscall - The fuzzed syscall value to be simulated against the filter
|
|
Packit Service |
8eee21 |
# Arg0-5 - The fuzzed syscall arg values to be simulated against the filter
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Arguments:
|
|
Packit Service |
8eee21 |
# 1 string containing the batch name
|
|
Packit Service |
8eee21 |
# 2 value of test number from batch file
|
|
Packit Service |
8eee21 |
# 3 string containing line of test data from batch file
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
function run_test_bpf_sim_fuzz() {
|
|
Packit Service |
8eee21 |
local rc
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# begin splitting the test data from the line into individual variables
|
|
Packit Service |
8eee21 |
local line=($3)
|
|
Packit Service |
8eee21 |
local testname=${line[0]}
|
|
Packit Service |
8eee21 |
local stress_count=${line[1]}
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# check for stress count configuration via environment variables
|
|
Packit Service |
8eee21 |
[[ -n $LIBSECCOMP_TSTCFG_STRESSCNT ]] && \
|
|
Packit Service |
8eee21 |
stress_count=$LIBSECCOMP_TSTCFG_STRESSCNT
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
for i in $(get_seq 1 $stress_count); do
|
|
Packit Service |
8eee21 |
local sys=$(generate_random_data)
|
|
Packit Service |
8eee21 |
local -a arg=($(generate_random_data) $(generate_random_data) \
|
|
Packit Service |
8eee21 |
$(generate_random_data) $(generate_random_data) \
|
|
Packit Service |
8eee21 |
$(generate_random_data) $(generate_random_data))
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# get the generated sub-test num string
|
|
Packit Service |
8eee21 |
local testnumstr=$(generate_test_num "$1" $2 $i)
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# set up log file test data line for this individual test,
|
|
Packit Service |
8eee21 |
# spacing is added to align the output in the correct columns
|
|
Packit Service |
8eee21 |
local -a COL_WIDTH=(26 17 17 17 17 17 17)
|
|
Packit Service |
8eee21 |
local testdata=$(printf "%-${COL_WIDTH[0]}s" $testname)
|
|
Packit Service |
8eee21 |
testdata+=$(printf "%-${COL_WIDTH[1]}s" $sys)
|
|
Packit Service |
8eee21 |
testdata+=$(printf "%-${COL_WIDTH[2]}s" ${arg[0]})
|
|
Packit Service |
8eee21 |
testdata+=$(printf "%-${COL_WIDTH[3]}s" ${arg[1]})
|
|
Packit Service |
8eee21 |
testdata+=$(printf "%-${COL_WIDTH[4]}s" ${arg[2]})
|
|
Packit Service |
8eee21 |
testdata+=$(printf "%-${COL_WIDTH[5]}s" ${arg[3]})
|
|
Packit Service |
8eee21 |
testdata+=$(printf "%-${COL_WIDTH[6]}s" ${arg[4]})
|
|
Packit Service |
8eee21 |
testdata+=$(printf "%s" ${arg[5]})
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# print out the generated test data to the log file
|
|
Packit Service |
8eee21 |
print_data "$testnumstr" "$testdata"
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# set up the syscall argument values to be passed to bpf_sim
|
|
Packit Service |
8eee21 |
for i in {0..5}; do
|
|
Packit Service |
8eee21 |
arg[$i]=" -$i ${arg[$i]} "
|
|
Packit Service |
8eee21 |
done
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# run the test command and put the BPF filter in a temp file
|
|
Packit Service |
8eee21 |
exec 4>$tmpfile
|
|
Packit Service |
8eee21 |
run_test_command "$testnumstr" "./$testname" "-b" 4 ""
|
|
Packit Service |
8eee21 |
rc=$?
|
|
Packit Service |
8eee21 |
exec 4>&-
|
|
Packit Service |
8eee21 |
if [[ $rc -ne 0 ]]; then
|
|
Packit Service |
8eee21 |
print_result $testnumstr "ERROR" "$testname rc=$rc"
|
|
Packit Service |
8eee21 |
stats_error=$(($stats_error+1))
|
|
Packit Service |
8eee21 |
return
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# simulate the fuzzed syscall data against the BPF filter, we
|
|
Packit Service |
8eee21 |
# don't verify the resulting action since we're just testing for
|
|
Packit Service |
8eee21 |
# stability
|
|
Packit Service |
8eee21 |
allow=$($GLBL_SYS_SIM -f $tmpfile -s $sys \
|
|
Packit Service |
8eee21 |
${arg[0]} ${arg[1]} ${arg[2]} ${arg[3]} ${arg[4]} \
|
|
Packit Service |
8eee21 |
${arg[5]})
|
|
Packit Service |
8eee21 |
rc=$?
|
|
Packit Service |
8eee21 |
if [[ $rc -ne 0 ]]; then
|
|
Packit Service |
8eee21 |
print_result $testnumstr "ERROR" "bpf_sim rc=$rc"
|
|
Packit Service |
8eee21 |
stats_error=$(($stats_error+1))
|
|
Packit Service |
8eee21 |
else
|
|
Packit Service |
8eee21 |
print_result $testnumstr "SUCCESS" ""
|
|
Packit Service |
8eee21 |
stats_success=$(($stats_success+1))
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
stats_all=$(($stats_all+1))
|
|
Packit Service |
8eee21 |
done
|
|
Packit Service |
8eee21 |
}
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Run the specified "bpf-sim" test
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Tests that belong to the "bpf-sim" test type generate a BPF filter and then
|
|
Packit Service |
8eee21 |
# run a simulated system call test to validate the filter. Tests that belong to
|
|
Packit Service |
8eee21 |
# this test type provide the following data on a single line in the input batch
|
|
Packit Service |
8eee21 |
# file:
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Testname - The executable test name (e.g. 01-allow, 02-basic, etc.)
|
|
Packit Service |
8eee21 |
# Arch - The architecture that the test should be run on (all, x86, x86_64)
|
|
Packit Service |
8eee21 |
# Syscall - The syscall to simulate against the generated filter
|
|
Packit Service |
8eee21 |
# Arg0-5 - The syscall arguments to simulate against the generated filter
|
|
Packit Service |
8eee21 |
# Result - The expected simulation result (ALLOW, KILL, etc.)
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# If a range of syscall or argument values are specified (e.g. 1-9), a test is
|
|
Packit Service |
8eee21 |
# generated for every combination of range values. Otherwise, the individual
|
|
Packit Service |
8eee21 |
# test is run.
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Arguments:
|
|
Packit Service |
8eee21 |
# 1 string containing the batch name
|
|
Packit Service |
8eee21 |
# 2 value of test number from batch file
|
|
Packit Service |
8eee21 |
# 3 string containing line of test data from batch file
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
function run_test_bpf_sim() {
|
|
Packit Service |
8eee21 |
local rc
|
|
Packit Service |
8eee21 |
local LOW=1
|
|
Packit Service |
8eee21 |
local HIGH=2
|
|
Packit Service |
8eee21 |
local -a arg_empty=(false false false false false false)
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# begin splitting the test data from the line into individual variables
|
|
Packit Service |
8eee21 |
local line=($3)
|
|
Packit Service |
8eee21 |
local testname=${line[0]}
|
|
Packit Service |
8eee21 |
local testarch=${line[1]}
|
|
Packit Service |
8eee21 |
local low_syscall #line[2]
|
|
Packit Service |
8eee21 |
local high_syscall #line[2]
|
|
Packit Service |
8eee21 |
local -a low_arg #line[3-8]
|
|
Packit Service |
8eee21 |
local -a high_arg #line[3-8]
|
|
Packit Service |
8eee21 |
local result=${line[9]}
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# expand the architecture list
|
|
Packit Service |
8eee21 |
local simarch_tmp
|
|
Packit Service |
8eee21 |
local simarch_avoid
|
|
Packit Service |
8eee21 |
simarch_tmp=""
|
|
Packit Service |
8eee21 |
simarch_avoid=""
|
|
Packit Service |
8eee21 |
for arch_i in $(echo $testarch | sed -e 's/,/ /g'); do
|
|
Packit Service |
8eee21 |
case $arch_i in
|
|
Packit Service |
8eee21 |
all)
|
|
Packit Service |
8eee21 |
# add the native arch
|
|
Packit Service |
8eee21 |
simarch_tmp+=" $arch"
|
|
Packit Service |
8eee21 |
;;
|
|
Packit Service |
8eee21 |
all_le)
|
|
Packit Service |
8eee21 |
# add the native arch only if it is little endian
|
|
Packit Service |
8eee21 |
if echo "$GLBL_ARCH_LE_SUPPORT" | grep -qw "$arch"; then
|
|
Packit Service |
8eee21 |
simarch_tmp+=" $arch"
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
;;
|
|
Packit Service |
8eee21 |
+all_le)
|
|
Packit Service |
8eee21 |
# add all of the little endian architectures
|
|
Packit Service |
8eee21 |
simarch_tmp+=" $GLBL_ARCH_LE_SUPPORT"
|
|
Packit Service |
8eee21 |
;;
|
|
Packit Service |
8eee21 |
all_be)
|
|
Packit Service |
8eee21 |
# add the native arch only if it is big endian
|
|
Packit Service |
8eee21 |
if echo "$GLBL_ARCH_BE_SUPPORT" | grep -qw "$arch"; then
|
|
Packit Service |
8eee21 |
simarch_tmp+=" $arch"
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
;;
|
|
Packit Service |
8eee21 |
+all_be)
|
|
Packit Service |
8eee21 |
# add all of the big endian architectures
|
|
Packit Service |
8eee21 |
simarch_tmp+=" $GLBL_ARCH_BE_SUPPORT"
|
|
Packit Service |
8eee21 |
;;
|
|
Packit Service |
8eee21 |
all_32)
|
|
Packit Service |
8eee21 |
# add the native arch only if it is 32-bit
|
|
Packit Service |
8eee21 |
if echo "$GLBL_ARCH_32B_SUPPORT" | grep -qw "$arch"; then
|
|
Packit Service |
8eee21 |
simarch_tmp+=" $arch"
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
;;
|
|
Packit Service |
8eee21 |
+all_32)
|
|
Packit Service |
8eee21 |
# add all of the 32-bit architectures
|
|
Packit Service |
8eee21 |
simarch_tmp+=" $GLBL_ARCH_32B_SUPPORT"
|
|
Packit Service |
8eee21 |
;;
|
|
Packit Service |
8eee21 |
all_64)
|
|
Packit Service |
8eee21 |
# add the native arch only if it is 64-bit
|
|
Packit Service |
8eee21 |
if echo "$GLBL_ARCH_64B_SUPPORT" | grep -qw "$arch"; then
|
|
Packit Service |
8eee21 |
simarch_tmp+=" $arch"
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
;;
|
|
Packit Service |
8eee21 |
+all_64)
|
|
Packit Service |
8eee21 |
# add all of the 64-bit architectures
|
|
Packit Service |
8eee21 |
simarch_tmp+=" $GLBL_ARCH_64B_SUPPORT"
|
|
Packit Service |
8eee21 |
;;
|
|
Packit Service |
8eee21 |
+*)
|
|
Packit Service |
8eee21 |
# add the architecture specified
|
|
Packit Service |
8eee21 |
simarch_tmp+=" ${arch_i:1}"
|
|
Packit Service |
8eee21 |
;;
|
|
Packit Service |
8eee21 |
-*)
|
|
Packit Service |
8eee21 |
# remove the architecture specified
|
|
Packit Service |
8eee21 |
simarch_avoid+=" ${arch_i:1}"
|
|
Packit Service |
8eee21 |
;;
|
|
Packit Service |
8eee21 |
*)
|
|
Packit Service |
8eee21 |
# add the architecture specified if it is native
|
|
Packit Service |
8eee21 |
if [[ "$arch_i" == "$arch" ]]; then
|
|
Packit Service |
8eee21 |
simarch_tmp+=" $arch_i"
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
;;
|
|
Packit Service |
8eee21 |
esac
|
|
Packit Service |
8eee21 |
done
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# make sure we remove any undesired architectures
|
|
Packit Service |
8eee21 |
local simarch_list
|
|
Packit Service |
8eee21 |
simarch_list=""
|
|
Packit Service |
8eee21 |
for arch_i in $simarch_tmp; do
|
|
Packit Service |
8eee21 |
if echo "$simarch_avoid" | grep -q -v -w "$arch_i"; then
|
|
Packit Service |
8eee21 |
simarch_list+=" $arch_i"
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
done
|
|
Packit Service |
8eee21 |
simarch_list=$(echo $simarch_list | sed -e 's/ / /g;s/^ //;')
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# do we have any architectures remaining in the list?
|
|
Packit Service |
8eee21 |
if [[ $simarch_list == "" ]]; then
|
|
Packit Service |
8eee21 |
print_result $(generate_test_num "$1" $2 1) "SKIPPED" \
|
|
Packit Service |
8eee21 |
"(architecture difference)"
|
|
Packit Service |
8eee21 |
stats_skipped=$(($stats_skipped+1))
|
|
Packit Service |
8eee21 |
return
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# get low and high range arg values
|
|
Packit Service |
8eee21 |
line_i=3
|
|
Packit Service |
8eee21 |
for arg_i in {0..5}; do
|
|
Packit Service |
8eee21 |
low_arg[$arg_i]=$(get_range $LOW "${line[$line_i]}")
|
|
Packit Service |
8eee21 |
high_arg[$arg_i]=$(get_range $HIGH "${line[$line_i]}")
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# fix up empty arg values so the nested loops work
|
|
Packit Service |
8eee21 |
if [[ ${low_arg[$arg_i]} == "N" ]]; then
|
|
Packit Service |
8eee21 |
arg_empty[$arg_i]=true
|
|
Packit Service |
8eee21 |
low_arg[$arg_i]=0
|
|
Packit Service |
8eee21 |
high_arg[$arg_i]=0
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
line_i=$(($line_i+1))
|
|
Packit Service |
8eee21 |
done
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# loop through the selected architectures
|
|
Packit Service |
8eee21 |
for simarch in $simarch_list; do
|
|
Packit Service |
8eee21 |
# print architecture header if necessary
|
|
Packit Service |
8eee21 |
if [[ $simarch != $simarch_list ]]; then
|
|
Packit Service |
8eee21 |
echo " test arch: $simarch" >&$logfd
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# reset the subtest number
|
|
Packit Service |
8eee21 |
local subtestnum=1
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# get low and high syscall values and convert them to numbers
|
|
Packit Service |
8eee21 |
low_syscall=$(get_range $LOW "${line[2]}")
|
|
Packit Service |
8eee21 |
if [[ ! $low_syscall =~ ^\-?[0-9]+$ ]]; then
|
|
Packit Service |
8eee21 |
low_syscall=$($GLBL_SYS_RESOLVER -a $simarch -t \
|
|
Packit Service |
8eee21 |
$low_syscall)
|
|
Packit Service |
8eee21 |
if [[ $? -ne 0 ]]; then
|
|
Packit Service |
8eee21 |
print_result $(generate_test_num "$1" $2 1) \
|
|
Packit Service |
8eee21 |
"ERROR" "sys_resolver rc=$?"
|
|
Packit Service |
8eee21 |
stats_error=$(($stats_error+1))
|
|
Packit Service |
8eee21 |
return
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
high_syscall=$(get_range $HIGH "${line[2]}")
|
|
Packit Service |
8eee21 |
if [[ ! $high_syscall =~ ^\-?[0-9]+$ ]]; then
|
|
Packit Service |
8eee21 |
high_syscall=$($GLBL_SYS_RESOLVER -a $simarch -t \
|
|
Packit Service |
8eee21 |
$high_syscall)
|
|
Packit Service |
8eee21 |
if [[ $? -ne 0 ]]; then
|
|
Packit Service |
8eee21 |
print_result $(generate_test_num "$1" $2 1) \
|
|
Packit Service |
8eee21 |
"ERROR" "sys_resolver rc=$?"
|
|
Packit Service |
8eee21 |
stats_error=$(($stats_error+1))
|
|
Packit Service |
8eee21 |
return
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# if ranges exist, the following will loop through all syscall
|
|
Packit Service |
8eee21 |
# and arg ranges and generate/run every combination of requested
|
|
Packit Service |
8eee21 |
# tests; if no ranges were specifed, then the single test is
|
|
Packit Service |
8eee21 |
# run
|
|
Packit Service |
8eee21 |
for sys in $(get_seq $low_syscall $high_syscall); do
|
|
Packit Service |
8eee21 |
for arg0 in $(get_seq ${low_arg[0]} ${high_arg[0]}); do
|
|
Packit Service |
8eee21 |
for arg1 in $(get_seq ${low_arg[1]} ${high_arg[1]}); do
|
|
Packit Service |
8eee21 |
for arg2 in $(get_seq ${low_arg[2]} ${high_arg[2]}); do
|
|
Packit Service |
8eee21 |
for arg3 in $(get_seq ${low_arg[3]} ${high_arg[3]}); do
|
|
Packit Service |
8eee21 |
for arg4 in $(get_seq ${low_arg[4]} ${high_arg[4]}); do
|
|
Packit Service |
8eee21 |
for arg5 in $(get_seq ${low_arg[5]} ${high_arg[5]}); do
|
|
Packit Service |
8eee21 |
local -a arg=($arg0 $arg1 $arg2 $arg3 $arg4 $arg5)
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# Get the generated sub-test num string
|
|
Packit Service |
8eee21 |
local testnumstr=$(generate_test_num "$1" $2 \
|
|
Packit Service |
8eee21 |
$subtestnum)
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# format any empty args to print to log file
|
|
Packit Service |
8eee21 |
for i in {0..5}; do
|
|
Packit Service |
8eee21 |
if ${arg_empty[$i]}; then
|
|
Packit Service |
8eee21 |
arg[$i]="N"
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
done
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# set up log file test data line for this
|
|
Packit Service |
8eee21 |
# individual test, spacing is added to align
|
|
Packit Service |
8eee21 |
# the output in the correct columns
|
|
Packit Service |
8eee21 |
local -a COL_WIDTH=(26 08 14 11 17 21 09 06 06)
|
|
Packit Service |
8eee21 |
local testdata=$(printf "%-${COL_WIDTH[0]}s" $testname)
|
|
Packit Service |
8eee21 |
testdata+=$(printf "%-${COL_WIDTH[1]}s" $simarch)
|
|
Packit Service |
8eee21 |
testdata+=$(printf "%-${COL_WIDTH[2]}s" $sys)
|
|
Packit Service |
8eee21 |
testdata+=$(printf "%-${COL_WIDTH[3]}s" ${arg[0]})
|
|
Packit Service |
8eee21 |
testdata+=$(printf "%-${COL_WIDTH[4]}s" ${arg[1]})
|
|
Packit Service |
8eee21 |
testdata+=$(printf "%-${COL_WIDTH[5]}s" ${arg[2]})
|
|
Packit Service |
8eee21 |
testdata+=$(printf "%-${COL_WIDTH[6]}s" ${arg[3]})
|
|
Packit Service |
8eee21 |
testdata+=$(printf "%-${COL_WIDTH[7]}s" ${arg[4]})
|
|
Packit Service |
8eee21 |
testdata+=$(printf "%-${COL_WIDTH[8]}s" ${arg[5]})
|
|
Packit Service |
8eee21 |
testdata+=$(printf "%-${COL_WIDTH[9]}s" $result)
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# print out the test data to the log file
|
|
Packit Service |
8eee21 |
print_data "$testnumstr" "$testdata"
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# set up the syscall arguments to be passed to bpf_sim
|
|
Packit Service |
8eee21 |
for i in {0..5}; do
|
|
Packit Service |
8eee21 |
if ${arg_empty[$i]}; then
|
|
Packit Service |
8eee21 |
arg[$i]=""
|
|
Packit Service |
8eee21 |
else
|
|
Packit Service |
8eee21 |
arg[$i]=" -$i ${arg[$i]} "
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
done
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# run the test command and put the BPF in a temp file
|
|
Packit Service |
8eee21 |
exec 4>$tmpfile
|
|
Packit Service |
8eee21 |
run_test_command "$testnumstr" "./$testname" "-b" 4 ""
|
|
Packit Service |
8eee21 |
rc=$?
|
|
Packit Service |
8eee21 |
exec 4>&-
|
|
Packit Service |
8eee21 |
if [[ $rc -ne 0 ]]; then
|
|
Packit Service |
8eee21 |
print_result $testnumstr \
|
|
Packit Service |
8eee21 |
"ERROR" "$testname rc=$rc"
|
|
Packit Service |
8eee21 |
stats_error=$(($stats_error+1))
|
|
Packit Service |
8eee21 |
return
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# simulate the specifed syscall against the BPF filter
|
|
Packit Service |
8eee21 |
# and verify the results
|
|
Packit Service |
8eee21 |
action=$($GLBL_SYS_SIM -a $simarch -f $tmpfile \
|
|
Packit Service |
8eee21 |
-s $sys ${arg[0]} ${arg[1]} ${arg[2]} \
|
|
Packit Service |
8eee21 |
${arg[3]} ${arg[4]} ${arg[5]})
|
|
Packit Service |
8eee21 |
rc=$?
|
|
Packit Service |
8eee21 |
if [[ $rc -ne 0 ]]; then
|
|
Packit Service |
8eee21 |
print_result $testnumstr \
|
|
Packit Service |
8eee21 |
"ERROR" "bpf_sim rc=$rc"
|
|
Packit Service |
8eee21 |
stats_error=$(($stats_error+1))
|
|
Packit Service |
8eee21 |
elif [[ "$action" != "$result" ]]; then
|
|
Packit Service |
8eee21 |
print_result $testnumstr "FAILURE" \
|
|
Packit Service |
8eee21 |
"bpf_sim resulted in $action"
|
|
Packit Service |
8eee21 |
stats_failure=$(($stats_failure+1))
|
|
Packit Service |
8eee21 |
else
|
|
Packit Service |
8eee21 |
print_result $testnumstr "SUCCESS" ""
|
|
Packit Service |
8eee21 |
stats_success=$(($stats_success+1))
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
stats_all=$(($stats_all+1))
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
subtestnum=$(($subtestnum+1))
|
|
Packit Service |
8eee21 |
done # syscall
|
|
Packit Service |
8eee21 |
done # arg0
|
|
Packit Service |
8eee21 |
done # arg1
|
|
Packit Service |
8eee21 |
done # arg2
|
|
Packit Service |
8eee21 |
done # arg3
|
|
Packit Service |
8eee21 |
done # arg4
|
|
Packit Service |
8eee21 |
done # arg5
|
|
Packit Service |
8eee21 |
done # architecture
|
|
Packit Service |
8eee21 |
}
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Run the specified "basic" test
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Tests that belong to the "basic" test type will simply have the command
|
|
Packit Service |
8eee21 |
# specified in the input batch file. The command must return zero for success
|
|
Packit Service |
8eee21 |
# and non-zero for failure.
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Arguments:
|
|
Packit Service |
8eee21 |
# 1 value of test number from batch file
|
|
Packit Service |
8eee21 |
# 2 string containing line of test data from batch file
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
function run_test_basic() {
|
|
Packit Service |
8eee21 |
local rc
|
|
Packit Service |
8eee21 |
local cmd
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# if the test is a script, only run it in native/c mode
|
|
Packit Service |
8eee21 |
if [[ $mode != "c" && "$2" == *.sh ]]; then
|
|
Packit Service |
8eee21 |
print_result "$1" "SKIPPED" "(only valid in native/c mode)"
|
|
Packit Service |
8eee21 |
stats_skipped=$(($stats_skipped+1))
|
|
Packit Service |
8eee21 |
return
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# print out the input test data to the log file
|
|
Packit Service |
8eee21 |
print_data "$1" "$2"
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# check and adjust if we are doing a VPATH build
|
|
Packit Service |
8eee21 |
if [[ -x "./$2" ]]; then
|
|
Packit Service |
8eee21 |
cmd="./$2"
|
|
Packit Service |
8eee21 |
else
|
|
Packit Service |
8eee21 |
cmd="${srcdir}/$2"
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# run the command
|
|
Packit Service |
8eee21 |
run_test_command "$1" "$cmd" "" "" ""
|
|
Packit Service |
8eee21 |
rc=$?
|
|
Packit Service |
8eee21 |
if [[ $rc -ne 0 ]]; then
|
|
Packit Service |
8eee21 |
print_result $1 "FAILURE" "$2 rc=$rc"
|
|
Packit Service |
8eee21 |
stats_failure=$(($stats_failure+1))
|
|
Packit Service |
8eee21 |
else
|
|
Packit Service |
8eee21 |
print_result $1 "SUCCESS" ""
|
|
Packit Service |
8eee21 |
stats_success=$(($stats_success+1))
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
stats_all=$(($stats_all+1))
|
|
Packit Service |
8eee21 |
}
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Run the specified "bpf-valgrind" test
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Tests that belong to the "bpf-valgrind" test type generate a BPF filter
|
|
Packit Service |
8eee21 |
# while running under valgrind to detect any memory errors.
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Arguments:
|
|
Packit Service |
8eee21 |
# 1 value of test number from batch file
|
|
Packit Service |
8eee21 |
# 2 string containing line of test data from batch file
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
function run_test_bpf_valgrind() {
|
|
Packit Service |
8eee21 |
local rc
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# we only support the native/c test mode here
|
|
Packit Service |
8eee21 |
if [[ $mode != "c" ]]; then
|
|
Packit Service |
8eee21 |
print_result "$1" "SKIPPED" "(only valid in native/c mode)"
|
|
Packit Service |
8eee21 |
stats_skipped=$(($stats_skipped+1))
|
|
Packit Service |
8eee21 |
return
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# print out the input test data to the log file
|
|
Packit Service |
8eee21 |
print_data "$1" "$2"
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# build the command
|
|
Packit Service |
8eee21 |
testvalgrind="valgrind \
|
|
Packit Service |
8eee21 |
--tool=memcheck \
|
|
Packit Service |
8eee21 |
--error-exitcode=1 \
|
|
Packit Service |
8eee21 |
--leak-check=full \
|
|
Packit Service |
8eee21 |
--read-var-info=yes \
|
|
Packit Service |
8eee21 |
--track-origins=yes \
|
|
Packit Service |
8eee21 |
--suppressions=$basedir/valgrind_test.supp"
|
|
Packit Service |
8eee21 |
if [[ -n $logfile ]]; then
|
|
Packit Service |
8eee21 |
testvalgrind+=" --log-fd=$logfd"
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
if [[ -z $verbose ]]; then
|
|
Packit Service |
8eee21 |
testvalgrind+=" --quiet --log-fd=4"
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# run the command
|
|
Packit Service |
8eee21 |
exec 4>/dev/null
|
|
Packit Service |
8eee21 |
print_valgrind "$1"
|
|
Packit Service |
8eee21 |
run_test_command "$1" "$testvalgrind --" "./$2 -b" 4 2
|
|
Packit Service |
8eee21 |
rc=$?
|
|
Packit Service |
8eee21 |
exec 4>&-
|
|
Packit Service |
8eee21 |
if [[ $rc -ne 0 ]]; then
|
|
Packit Service |
8eee21 |
print_result $1 "FAILURE" "$2 rc=$rc"
|
|
Packit Service |
8eee21 |
stats_failure=$(($stats_failure+1))
|
|
Packit Service |
8eee21 |
else
|
|
Packit Service |
8eee21 |
print_result $1 "SUCCESS" ""
|
|
Packit Service |
8eee21 |
stats_success=$(($stats_success+1))
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
stats_all=$(($stats_all+1))
|
|
Packit Service |
8eee21 |
}
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Run the specified "live" test
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Tests that belong to the "live" test type will attempt to run a live test
|
|
Packit Service |
8eee21 |
# of the libseccomp library on the host system; for obvious reasons the host
|
|
Packit Service |
8eee21 |
# system must support seccomp mode 2 for this to work correctly.
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Arguments:
|
|
Packit Service |
8eee21 |
# 1 value of test number from batch file
|
|
Packit Service |
8eee21 |
# 2 string containing line of test data from batch file
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
function run_test_live() {
|
|
Packit Service |
8eee21 |
local rc
|
|
Packit Service |
8eee21 |
local api
|
|
Packit Service |
8eee21 |
local line=($2)
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# parse the test line
|
|
Packit Service |
8eee21 |
line_cmd=${line[0]}
|
|
Packit Service |
8eee21 |
line_api=${line[1]}
|
|
Packit Service |
8eee21 |
line_act=${line[2]}
|
|
Packit Service |
8eee21 |
line_test="$line_cmd $line_api $line_act"
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# check the api level
|
|
Packit Service |
8eee21 |
api=$($GLBL_SYS_API)
|
|
Packit Service |
8eee21 |
if [[ $api -lt $line_api ]]; then
|
|
Packit Service |
8eee21 |
# runtime api level is too low
|
|
Packit Service |
8eee21 |
print_result "$1" "SKIPPED" "(api level)"
|
|
Packit Service |
8eee21 |
stats_skipped=$(($stats_skipped+1))
|
|
Packit Service |
8eee21 |
return
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# print out the input test data to the log file
|
|
Packit Service |
8eee21 |
print_data "$1" "$2"
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# run the command
|
|
Packit Service |
8eee21 |
exec 4>/dev/null
|
|
Packit Service |
8eee21 |
run_test_command "$1" "./$line_cmd" "$line_act" "" 4
|
|
Packit Service |
8eee21 |
rc=$?
|
|
Packit Service |
8eee21 |
exec 4>&-
|
|
Packit Service |
8eee21 |
stats_all=$(($stats_all+1))
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# setup the arch specific return values
|
|
Packit Service |
8eee21 |
case "$arch" in
|
|
Packit Service |
8eee21 |
x86|x86_64|x32|arm|aarch64|parisc|parisc64|ppc|ppc64|ppc64le|ppc|s390|s390x)
|
|
Packit Service |
8eee21 |
rc_kill_process=159
|
|
Packit Service |
8eee21 |
rc_kill=159
|
|
Packit Service |
8eee21 |
rc_allow=160
|
|
Packit Service |
8eee21 |
rc_trap=161
|
|
Packit Service |
8eee21 |
rc_trace=162
|
|
Packit Service |
8eee21 |
rc_errno=163
|
|
Packit Service |
8eee21 |
rc_log=164
|
|
Packit Service |
8eee21 |
;;
|
|
Packit Service |
8eee21 |
mips|mipsel|mips64|mips64n32|mipsel64|mipsel64n32)
|
|
Packit Service |
8eee21 |
rc_kill_process=140
|
|
Packit Service |
8eee21 |
rc_kill=140
|
|
Packit Service |
8eee21 |
rc_allow=160
|
|
Packit Service |
8eee21 |
rc_trap=161
|
|
Packit Service |
8eee21 |
rc_trace=162
|
|
Packit Service |
8eee21 |
rc_errno=163
|
|
Packit Service |
8eee21 |
rc_log=164
|
|
Packit Service |
8eee21 |
;;
|
|
Packit Service |
8eee21 |
*)
|
|
Packit Service |
8eee21 |
print_result $testnumstr "ERROR" "arch $arch not supported"
|
|
Packit Service |
8eee21 |
stats_error=$(($stats_error+1))
|
|
Packit Service |
8eee21 |
return
|
|
Packit Service |
8eee21 |
;;
|
|
Packit Service |
8eee21 |
esac
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# verify the results
|
|
Packit Service |
8eee21 |
if [[ $line_act == "KILL_PROCESS" && $rc -eq $rc_kill_process ]]; then
|
|
Packit Service |
8eee21 |
print_result $1 "SUCCESS" ""
|
|
Packit Service |
8eee21 |
stats_success=$(($stats_success+1))
|
|
Packit Service |
8eee21 |
elif [[ $line_act == "KILL" && $rc -eq $rc_kill ]]; then
|
|
Packit Service |
8eee21 |
print_result $1 "SUCCESS" ""
|
|
Packit Service |
8eee21 |
stats_success=$(($stats_success+1))
|
|
Packit Service |
8eee21 |
elif [[ $line_act == "ALLOW" && $rc -eq $rc_allow ]]; then
|
|
Packit Service |
8eee21 |
print_result $1 "SUCCESS" ""
|
|
Packit Service |
8eee21 |
stats_success=$(($stats_success+1))
|
|
Packit Service |
8eee21 |
elif [[ $line_act == "TRAP" && $rc -eq $rc_trap ]]; then
|
|
Packit Service |
8eee21 |
print_result $1 "SUCCESS" ""
|
|
Packit Service |
8eee21 |
stats_success=$(($stats_success+1))
|
|
Packit Service |
8eee21 |
elif [[ $line_act == "TRACE" ]]; then
|
|
Packit Service |
8eee21 |
print_result $1 "ERROR" "unsupported action \"$line_act\""
|
|
Packit Service |
8eee21 |
stats_error=$(($stats_error+1))
|
|
Packit Service |
8eee21 |
elif [[ $line_act == "ERRNO" && $rc -eq $rc_errno ]]; then
|
|
Packit Service |
8eee21 |
print_result $1 "SUCCESS" ""
|
|
Packit Service |
8eee21 |
stats_success=$(($stats_success+1))
|
|
Packit Service |
8eee21 |
elif [[ $line_act == "LOG" && $rc -eq $rc_log ]]; then
|
|
Packit Service |
8eee21 |
print_result $1 "SUCCESS" ""
|
|
Packit Service |
8eee21 |
stats_success=$(($stats_success+1))
|
|
Packit Service |
8eee21 |
else
|
|
Packit Service |
8eee21 |
print_result $1 "FAILURE" "$line_test rc=$rc"
|
|
Packit Service |
8eee21 |
stats_failure=$(($stats_failure+1))
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
}
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Run a single test from the specified batch
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Arguments:
|
|
Packit Service |
8eee21 |
# 1 string containing the batch name
|
|
Packit Service |
8eee21 |
# 2 value of test number from batch file
|
|
Packit Service |
8eee21 |
# 3 string containing line of test data from batch file
|
|
Packit Service |
8eee21 |
# 4 string containing test type that this test belongs to
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
function run_test() {
|
|
Packit Service |
8eee21 |
# generate the test number string for the line of batch test data
|
|
Packit Service |
8eee21 |
local testnumstr=$(generate_test_num "$1" $2 1)
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# ensure we only run tests which match the specified type
|
|
Packit Service |
8eee21 |
[[ -n $type && "$4" != "$type" ]] && return
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# execute the function corresponding to the test type
|
|
Packit Service |
8eee21 |
if [[ "$4" == "basic" ]]; then
|
|
Packit Service |
8eee21 |
run_test_basic "$testnumstr" "$3"
|
|
Packit Service |
8eee21 |
elif [[ "$4" == "bpf-sim" ]]; then
|
|
Packit Service |
8eee21 |
run_test_bpf_sim "$1" $2 "$3"
|
|
Packit Service |
8eee21 |
elif [[ "$4" == "bpf-sim-fuzz" ]]; then
|
|
Packit Service |
8eee21 |
run_test_bpf_sim_fuzz "$1" $2 "$3"
|
|
Packit Service |
8eee21 |
elif [[ "$4" == "bpf-valgrind" ]]; then
|
|
Packit Service |
8eee21 |
# only run this test if valgrind is installed
|
|
Packit Service |
8eee21 |
if check_deps valgrind; then
|
|
Packit Service |
8eee21 |
run_test_bpf_valgrind "$testnumstr" "$3"
|
|
Packit Service |
8eee21 |
else
|
|
Packit Service |
8eee21 |
print_result $testnumstr "SKIPPED" \
|
|
Packit Service |
8eee21 |
"(valgrind not installed)"
|
|
Packit Service |
8eee21 |
stats_skipped=$(($stats_skipped+1))
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
elif [[ "$4" == "live" ]]; then
|
|
Packit Service |
8eee21 |
# only run this test if explicitly requested
|
|
Packit Service |
8eee21 |
if [[ -n $type ]]; then
|
|
Packit Service |
8eee21 |
run_test_live "$testnumstr" "$3"
|
|
Packit Service |
8eee21 |
else
|
|
Packit Service |
8eee21 |
print_result $testnumstr "SKIPPED" \
|
|
Packit Service |
8eee21 |
"(must specify live tests)"
|
|
Packit Service |
8eee21 |
stats_skipped=$(($stats_skipped+1))
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
else
|
|
Packit Service |
8eee21 |
print_result $testnumstr "ERROR" "test type $4 not supported"
|
|
Packit Service |
8eee21 |
stats_error=$(($stats_error+1))
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
}
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
# Run the requested tests
|
|
Packit Service |
8eee21 |
#
|
|
Packit Service |
8eee21 |
function run_tests() {
|
|
Packit Service |
8eee21 |
# loop through all test files
|
|
Packit Service |
8eee21 |
for file in $basedir/*.tests; do
|
|
Packit Service |
8eee21 |
local testnum=1
|
|
Packit Service |
8eee21 |
local batch_requested=false
|
|
Packit Service |
8eee21 |
local batch_name=""
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# extract the batch name from the file name
|
|
Packit Service |
8eee21 |
batch_name=$(basename $file .tests)
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# check if this batch was requested
|
|
Packit Service |
8eee21 |
if [[ ${batch_list[@]} ]]; then
|
|
Packit Service |
8eee21 |
for b in ${batch_list[@]}; do
|
|
Packit Service |
8eee21 |
if [[ $b == $batch_name ]]; then
|
|
Packit Service |
8eee21 |
batch_requested=true
|
|
Packit Service |
8eee21 |
break
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
done
|
|
Packit Service |
8eee21 |
if ! $batch_requested; then
|
|
Packit Service |
8eee21 |
continue
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# print a test batch header
|
|
Packit Service |
8eee21 |
echo " batch name: $batch_name" >&$logfd
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# loop through each line and run the requested tests
|
|
Packit Service |
8eee21 |
while read line; do
|
|
Packit Service |
8eee21 |
# strip whitespace, comments, and blank lines
|
|
Packit Service |
8eee21 |
line=$(echo "$line" | \
|
|
Packit Service |
8eee21 |
sed -e 's/^[\t ]*//;s/[\t ]*$//;' | \
|
|
Packit Service |
8eee21 |
sed -e '/^[#].*$/d;/^$/d')
|
|
Packit Service |
8eee21 |
if [[ -z $line ]]; then
|
|
Packit Service |
8eee21 |
continue
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
if [[ $line =~ ^"test type": ]]; then
|
|
Packit Service |
8eee21 |
test_type=$(echo "$line" | \
|
|
Packit Service |
8eee21 |
sed -e 's/^test type: //;')
|
|
Packit Service |
8eee21 |
# print a test mode and type header
|
|
Packit Service |
8eee21 |
echo " test mode: $mode" >&$logfd
|
|
Packit Service |
8eee21 |
echo " test type: $test_type" >&$logfd
|
|
Packit Service |
8eee21 |
continue
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
if [[ ${single_list[@]} ]]; then
|
|
Packit Service |
8eee21 |
for i in ${single_list[@]}; do
|
|
Packit Service |
8eee21 |
if [ $i -eq $testnum ]; then
|
|
Packit Service |
8eee21 |
# we're running a single test
|
|
Packit Service |
8eee21 |
run_test "$batch_name" \
|
|
Packit Service |
8eee21 |
$testnum "$line" \
|
|
Packit Service |
8eee21 |
"$test_type"
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
done
|
|
Packit Service |
8eee21 |
else
|
|
Packit Service |
8eee21 |
# we're running a test from a batch
|
|
Packit Service |
8eee21 |
run_test "$batch_name" \
|
|
Packit Service |
8eee21 |
$testnum "$line" "$test_type"
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
testnum=$(($testnum+1))
|
|
Packit Service |
8eee21 |
done < "$file"
|
|
Packit Service |
8eee21 |
done
|
|
Packit Service |
8eee21 |
}
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
####
|
|
Packit Service |
8eee21 |
# main
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# verify general script dependencies
|
|
Packit Service |
8eee21 |
verify_deps head
|
|
Packit Service |
8eee21 |
verify_deps sed
|
|
Packit Service |
8eee21 |
verify_deps awk
|
|
Packit Service |
8eee21 |
verify_deps tr
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# global variables
|
|
Packit Service |
8eee21 |
declare -a batch_list
|
|
Packit Service |
8eee21 |
declare -a single_list
|
|
Packit Service |
8eee21 |
arch=
|
|
Packit Service |
8eee21 |
batch_count=0
|
|
Packit Service |
8eee21 |
logfile=
|
|
Packit Service |
8eee21 |
logfd=
|
|
Packit Service |
8eee21 |
mode_list=""
|
|
Packit Service |
8eee21 |
runall=
|
|
Packit Service |
8eee21 |
singlecount=0
|
|
Packit Service |
8eee21 |
tmpfile=""
|
|
Packit Service |
8eee21 |
tmpdir=""
|
|
Packit Service |
8eee21 |
type=
|
|
Packit Service |
8eee21 |
verbose=
|
|
Packit Service |
8eee21 |
stats_all=0
|
|
Packit Service |
8eee21 |
stats_skipped=0
|
|
Packit Service |
8eee21 |
stats_success=0
|
|
Packit Service |
8eee21 |
stats_failure=0
|
|
Packit Service |
8eee21 |
stats_error=0
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# set the test root directory
|
|
Packit Service |
8eee21 |
basedir=$(dirname $0)
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# set the test harness pid
|
|
Packit Service |
8eee21 |
pid=$$
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# parse the command line
|
|
Packit Service |
8eee21 |
while getopts "ab:gl:m:s:t:T:vh" opt; do
|
|
Packit Service |
8eee21 |
case $opt in
|
|
Packit Service |
8eee21 |
a)
|
|
Packit Service |
8eee21 |
runall=1
|
|
Packit Service |
8eee21 |
;;
|
|
Packit Service |
8eee21 |
b)
|
|
Packit Service |
8eee21 |
batch_list[batch_count]="$OPTARG"
|
|
Packit Service |
8eee21 |
batch_count=$(($batch_count+1))
|
|
Packit Service |
8eee21 |
;;
|
|
Packit Service |
8eee21 |
l)
|
|
Packit Service |
8eee21 |
logfile="$OPTARG"
|
|
Packit Service |
8eee21 |
;;
|
|
Packit Service |
8eee21 |
m)
|
|
Packit Service |
8eee21 |
case $OPTARG in
|
|
Packit Service |
8eee21 |
c)
|
|
Packit Service |
8eee21 |
mode_list="$mode_list c"
|
|
Packit Service |
8eee21 |
;;
|
|
Packit Service |
8eee21 |
python)
|
|
Packit Service |
8eee21 |
verify_deps python
|
|
Packit Service |
8eee21 |
mode_list="$mode_list python"
|
|
Packit Service |
8eee21 |
;;
|
|
Packit Service |
8eee21 |
*)
|
|
Packit Service |
8eee21 |
usage
|
|
Packit Service |
8eee21 |
exit 1
|
|
Packit Service |
8eee21 |
esac
|
|
Packit Service |
8eee21 |
;;
|
|
Packit Service |
8eee21 |
s)
|
|
Packit Service |
8eee21 |
single_list[single_count]=$OPTARG
|
|
Packit Service |
8eee21 |
single_count=$(($single_count+1))
|
|
Packit Service |
8eee21 |
;;
|
|
Packit Service |
8eee21 |
t)
|
|
Packit Service |
8eee21 |
tmpdir="$OPTARG"
|
|
Packit Service |
8eee21 |
;;
|
|
Packit Service |
8eee21 |
T)
|
|
Packit Service |
8eee21 |
type="$OPTARG"
|
|
Packit Service |
8eee21 |
;;
|
|
Packit Service |
8eee21 |
v)
|
|
Packit Service |
8eee21 |
verbose=1
|
|
Packit Service |
8eee21 |
;;
|
|
Packit Service |
8eee21 |
h|*)
|
|
Packit Service |
8eee21 |
usage
|
|
Packit Service |
8eee21 |
exit 1
|
|
Packit Service |
8eee21 |
;;
|
|
Packit Service |
8eee21 |
esac
|
|
Packit Service |
8eee21 |
done
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# use mode list from environment if provided
|
|
Packit Service |
8eee21 |
[[ -z $mode_list && -n $LIBSECCOMP_TSTCFG_MODE_LIST ]] && mode_list=$LIBSECCOMP_TSTCFG_MODE_LIST
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# determine the mode test automatically
|
|
Packit Service |
8eee21 |
if [[ -z $mode_list ]]; then
|
|
Packit Service |
8eee21 |
# always perform the native c tests
|
|
Packit Service |
8eee21 |
mode_list="c"
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# query the build configuration
|
|
Packit Service |
8eee21 |
if [[ -r "../configure.h" ]]; then
|
|
Packit Service |
8eee21 |
# python tests
|
|
Packit Service |
8eee21 |
[[ "$(grep "ENABLE_PYTHON" ../configure.h | \
|
|
Packit Service |
8eee21 |
awk '{ print $3 }')" = "1" ]] && \
|
|
Packit Service |
8eee21 |
mode_list="$mode_list python"
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# default to all tests if batch or single tests not requested
|
|
Packit Service |
8eee21 |
if [[ -z $batch_list ]] && [[ -z $single_list ]]; then
|
|
Packit Service |
8eee21 |
runall=1
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# drop any requested batch and single tests if all tests were requested
|
|
Packit Service |
8eee21 |
if [[ -n $runall ]]; then
|
|
Packit Service |
8eee21 |
batch_list=()
|
|
Packit Service |
8eee21 |
single_list=()
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# check for configuration via environment variables
|
|
Packit Service |
8eee21 |
[[ -z $type && -n $LIBSECCOMP_TSTCFG_TYPE ]] && type=$LIBSECCOMP_TSTCFG_TYPE
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# open log file for append (default to stdout)
|
|
Packit Service |
8eee21 |
if [[ -n $logfile ]]; then
|
|
Packit Service |
8eee21 |
logfd=3
|
|
Packit Service |
8eee21 |
exec 3>>"$logfile"
|
|
Packit Service |
8eee21 |
else
|
|
Packit Service |
8eee21 |
logfd=1
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# open temporary file
|
|
Packit Service |
8eee21 |
if [[ -n $tmpdir ]]; then
|
|
Packit Service |
8eee21 |
tmpfile=$(mktemp -t regression_XXXXXX --tmpdir=$tmpdir)
|
|
Packit Service |
8eee21 |
else
|
|
Packit Service |
8eee21 |
tmpfile=$(mktemp -t regression_XXXXXX)
|
|
Packit Service |
8eee21 |
fi
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# determine the current system's architecture
|
|
Packit Service |
8eee21 |
arch=$($GLBL_SYS_ARCH)
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# display the test output and run the requested tests
|
|
Packit Service |
8eee21 |
echo "=============== $(date) ===============" >&$logfd
|
|
Packit Service |
8eee21 |
echo "Regression Test Report (\"regression $*\")" >&$logfd
|
|
Packit Service |
8eee21 |
for mode in $mode_list; do
|
|
Packit Service |
8eee21 |
run_tests
|
|
Packit Service |
8eee21 |
done
|
|
Packit Service |
8eee21 |
echo "Regression Test Summary" >&$logfd
|
|
Packit Service |
8eee21 |
echo " tests run: $stats_all" >&$logfd
|
|
Packit Service |
8eee21 |
echo " tests skipped: $stats_skipped" >&$logfd
|
|
Packit Service |
8eee21 |
echo " tests passed: $stats_success" >&$logfd
|
|
Packit Service |
8eee21 |
echo " tests failed: $stats_failure" >&$logfd
|
|
Packit Service |
8eee21 |
echo " tests errored: $stats_error" >&$logfd
|
|
Packit Service |
8eee21 |
echo "============================================================" >&$logfd
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
# cleanup and exit
|
|
Packit Service |
8eee21 |
rm -f $tmpfile
|
|
Packit Service |
8eee21 |
rc=0
|
|
Packit Service |
8eee21 |
[[ $stats_failure -gt 0 ]] && rc=$(($rc + 2))
|
|
Packit Service |
8eee21 |
[[ $stats_error -gt 0 ]] && rc=$(($rc + 4))
|
|
Packit Service |
8eee21 |
|
|
Packit Service |
8eee21 |
exit $rc
|