blob: 6d598a69e0f667f3d28da988699073a96c7b8e21 [file] [log] [blame]
#!/bin/sh
# Linux kernel self test
# shellcheck disable=SC1091
. ../../lib/sh-test-lib
OUTPUT="$(pwd)/output"
RESULT_FILE="${OUTPUT}/result.txt"
LOGFILE="${OUTPUT}/kselftest.txt"
KSELFTEST_PATH="/opt/kselftests/mainline/"
SCRIPT="$(readlink -f "${0}")"
SCRIPTPATH="$(dirname "${SCRIPT}")"
# List of known unsupported test cases to be skipped
SKIPFILE=""
# List of test cases to be skipped in yaml/skipgen format
SKIPFILE_YAML=""
BOARD=""
BRANCH=""
ENVIRONMENT=""
SKIPLIST=""
TESTPROG_URL=""
TST_CMDFILES=""
TST_CASENAME=""
SHARD_NUMBER=1
SHARD_INDEX=1
# Architecture-specific tarball name defaults.
if [ "$(uname -m)" = "aarch64" ]; then
TESTPROG="kselftest_aarch64.tar.gz"
else
TESTPROG="kselftest_armhf.tar.gz"
fi
usage() {
echo "Usage: $0 [-i sharding bucket to run ]
[-n number of shard buckets to create ]
[-c bpf cpufreq net timers]
[-T cpu-hotplug:cpu-on-off-test.sh]
[-t kselftest_aarch64.tar.gz | kselftest_armhf.tar.gz]
[-s True|False]
[-u url]
[-p path]
[-L List of skip test cases]
[-S kselftest-skipfile]
[-b board]
[-g branch]
[-e environment]
[-E ENV_NAME=ENV_VAL]" 1>&2
exit 1
}
while getopts "i:n:c:T:t:s:u:p:L:S:b:g:e:E:h" opt; do
case "${opt}" in
i) SHARD_INDEX="${OPTARG}" ;;
n) SHARD_NUMBER="${OPTARG}" ;;
c) TST_CMDFILES="${OPTARG}" ;;
T) TST_CASENAME="${OPTARG}" ;;
t) TESTPROG="${OPTARG}" ;;
s) SKIP_INSTALL="${OPTARG}" ;;
# Download kselftest tarball from given URL
u) TESTPROG_URL="${OPTARG}" ;;
# List of known unsupported test cases to be skipped
L) SKIPLIST="${OPTARG}" ;;
p) KSELFTEST_PATH="${OPTARG}" ;;
S)
#OPT=$(echo "${OPTARG}" | grep "http")
#if [ -z "${OPT}" ] ; then
## kselftest skipfile
# SKIPFILE="${SCRIPTPATH}/${OPTARG}"
#else
## Download kselftest skipfile from speficied URL
# wget "${OPTARG}" -O "skipfile"
# SKIPFILE="skipfile"
# SKIPFILE="${SCRIPTPATH}/${SKIPFILE}"
#fi
if [ -z "${OPTARG##*http*}" ]; then
if [ -z "${OPTARG##*yaml*}" ]; then
# Skipfile is of type yaml
SKIPFILE_TMP="http-skipfile.yaml"
SKIPFILE_YAML="${SCRIPTPATH}/${SKIPFILE_TMP}"
else
# Skipfile is normal skipfile
SKIPFILE_TMP="http-skipfile"
SKIPFILE="${SCRIPTPATH}/${SKIPFILE_TMP}"
fi
# Download LTP skipfile from specified URL
if ! wget "${OPTARG}" -O "${SKIPFILE_TMP}"; then
error_msg "Failed to fetch ${OPTARG}"
exit 1
fi
elif [ "${OPTARG##*.}" = "yaml" ]; then
# yaml skipfile; use skipgen to generate a skipfile
SKIPFILE_YAML="${SCRIPTPATH}/${OPTARG}"
else
# Regular LTP skipfile
SKIPFILE="${SCRIPTPATH}/${OPTARG}"
fi
;;
b)
export BOARD="${OPTARG}"
;;
g)
export BRANCH="${OPTARG}"
;;
e)
export ENVIRONMENT="${OPTARG}"
;;
E)
if [ -n "${OPTARG}" ]; then
set -x
eval "export ${OPTARG}"
set +x
fi
;;
h|*) usage ;;
esac
done
# If no explicit URL given, use the default URL for the kselftest tarball.
if [ -z "${TESTPROG_URL}" ]; then
TESTPROG_URL=http://testdata.validation.linaro.org/tests/kselftest/"${TESTPROG}"
fi
if [ -n "${SKIPFILE_YAML}" ]; then
export SKIPFILE_PATH="${SCRIPTPATH}/generated_skipfile"
generate_skipfile
if [ ! -f "${SKIPFILE_PATH}" ]; then
error_msg "Skipfile ${SKIPFILE} does not exist";
exit 1
fi
SKIPFILE="${SKIPFILE_PATH}"
fi
parse_output() {
./parse-output.py < "${LOGFILE}" | tee -a "${RESULT_FILE}"
}
install() {
dist_name
# shellcheck disable=SC2154
case "${dist}" in
debian|ubuntu) install_deps "sed perl wget xz-utils iproute2 python3-tap" "${SKIP_INSTALL}" ;;
centos|fedora) install_deps "sed perl wget xz iproute" "${SKIP_INSTALL}" ;;
unknown) warn_msg "Unsupported distro: package install skipped" ;;
esac
}
! check_root && error_msg "You need to be root to run this script."
saved_pwd=$(pwd)
create_out_dir "${OUTPUT}"
install
if [ -d "${KSELFTEST_PATH}" ]; then
echo "kselftests found on rootfs"
# shellcheck disable=SC2164
cd "${KSELFTEST_PATH}" || exit
else
# Fetch whatever we have been aimed at, assuming only that it can
# be handled by "tar". Do not assume anything about the compression.
wget "${TESTPROG_URL}" -O "${TESTPROG}"
tar -xaf "${TESTPROG}"
# shellcheck disable=SC3044
if [ ! -e "run_kselftest.sh" ]; then cd "kselftest" || exit; fi
fi
skips=$(mktemp -p . -t skip-XXXXXX)
if [ -n "${SKIPLIST}" ]; then
# shellcheck disable=SC2086
for skip_regex in ${SKIPLIST}; do
echo "${skip_regex}" >> "$skips"
done
fi
# Ignore SKIPFILE when SKIPLIST provided
if [ -f "${SKIPFILE}" ] && [ -z "${SKIPLIST}" ]; then
while read -r skip_regex; do
case "${skip_regex}" in \#*) continue ;; esac
echo "${skip_regex}" >> "$skips"
done < "${SKIPFILE}"
fi
cp kselftest-list.txt kselftest-list.txt.orig
echo "skiplist:"
echo "========================================"
while read -r skip_regex; do
echo "$skip_regex"
# Remove matching tests from list of tests to run and report it as skipped
perl -i -ne 'if (s|^('"${skip_regex}"')$|\1 skip|) { print STDERR; } else { print; }' kselftest-list.txt 2>>"${RESULT_FILE}"
done < "${skips}"
echo "========================================"
rm -f "${skips}"
if [ -n "${TST_CASENAME}" ]; then
./run_kselftest.sh -t "${TST_CASENAME}" 2>&1 | tee -a "${LOGFILE}"
elif [ -n "${TST_CMDFILES}" ]; then
cp kselftest-list.txt kselftest-list.txt.original
# shellcheck disable=SC2086
for test in ${TST_CMDFILES}; do
cp kselftest-list.txt.original kselftest-list.txt
grep "^${test}:" kselftest-list.txt | tee kselftest-list.tmp
split --verbose --numeric-suffixes=1 -n l/"${SHARD_INDEX}"/"${SHARD_NUMBER}" kselftest-list.tmp > shardfile
echo "============== Tests to run ==============="
cat shardfile
echo "===========End Tests to run ==============="
if [ -s shardfile ]; then
report_pass "shardfile-${test}"
else
report_fail "shardfile-${test}"
continue
fi
cp shardfile kselftest-list.txt
./run_kselftest.sh -c ${test} 2>&1 | tee -a "${LOGFILE}"
done
cp kselftest-list.txt.original kselftest-list.txt
else
./run_kselftest.sh 2>&1 | tee "${LOGFILE}"
fi
# shellcheck disable=SC2164
cd "$saved_pwd" || exit
parse_output