Blame tests/regression

Packit 51d0f7
#!/bin/bash
Packit 51d0f7
Packit 51d0f7
#
Packit 51d0f7
# NetLabel Tools regression test automation script
Packit 51d0f7
#
Packit 51d0f7
Packit 51d0f7
#
Packit 51d0f7
# This program is free software: you can redistribute it and/or modify
Packit 51d0f7
# it under the terms of version 2 of the GNU General Public License as
Packit 51d0f7
# published by the Free Software Foundation.
Packit 51d0f7
#
Packit 51d0f7
# This program is distributed in the hope that it will be useful,
Packit 51d0f7
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 51d0f7
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 51d0f7
# GNU General Public License for more details.
Packit 51d0f7
#
Packit 51d0f7
# You should have received a copy of the GNU General Public License
Packit 51d0f7
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit 51d0f7
#
Packit 51d0f7
Packit 51d0f7
export GLBL_NETLABELCTL="../netlabelctl/netlabelctl"
Packit 51d0f7
Packit 51d0f7
####
Packit 51d0f7
# functions
Packit 51d0f7
Packit 51d0f7
#
Packit 51d0f7
# Dependency check
Packit 51d0f7
#
Packit 51d0f7
# Arguments:
Packit 51d0f7
#     1    Dependency to check for
Packit 51d0f7
#
Packit 51d0f7
function check_deps() {
Packit 51d0f7
	[[ -z "$1" ]] && return
Packit 51d0f7
	which "$1" >& /dev/null
Packit 51d0f7
	return $?
Packit 51d0f7
}
Packit 51d0f7
Packit 51d0f7
#
Packit 51d0f7
# Dependency verification
Packit 51d0f7
#
Packit 51d0f7
# Arguments:
Packit 51d0f7
#     1    Dependency to check for
Packit 51d0f7
#
Packit 51d0f7
function verify_deps() {
Packit 51d0f7
	[[ -z "$1" ]] && return
Packit 51d0f7
	if ! check_deps "$1"; then
Packit 51d0f7
		echo "error: install \"$1\" and include it in your \$PATH"
Packit 51d0f7
		exit 1
Packit 51d0f7
	fi
Packit 51d0f7
}
Packit 51d0f7
Packit 51d0f7
#
Packit 51d0f7
# Print a test header to the log file
Packit 51d0f7
#
Packit 51d0f7
# Arguments:
Packit 51d0f7
#     1    string containing test name
Packit 51d0f7
#     2    string containing additional text
Packit 51d0f7
#
Packit 51d0f7
function print_test() {
Packit 51d0f7
	printf "Test %s %s\n" "$1" "$2" >&$logfd
Packit 51d0f7
}
Packit 51d0f7
Packit 51d0f7
#
Packit 51d0f7
# Print the test result to the log file
Packit 51d0f7
#
Packit 51d0f7
# Arguments:
Packit 51d0f7
#     1    string containing test name
Packit 51d0f7
#     2    string containing the test result (INFO, SUCCESS, ERROR, or FAILURE)
Packit 51d0f7
#     3    string containing addition details
Packit 51d0f7
#
Packit 51d0f7
function print_result() {
Packit 51d0f7
	# stats update
Packit 51d0f7
	stats_all=$(($stats_all+1))
Packit 51d0f7
	case $2 in
Packit 51d0f7
	INFO)
Packit 51d0f7
		stats_skipped=$(($stats_skipped+1))
Packit 51d0f7
		;;
Packit 51d0f7
	SUCCESS)
Packit 51d0f7
		stats_success=$(($stats_success+1))
Packit 51d0f7
		;;
Packit 51d0f7
	FAILURE)
Packit 51d0f7
		stats_failure=$(($stats_failure+1))
Packit 51d0f7
		;;
Packit 51d0f7
	ERROR|*)
Packit 51d0f7
		stats_error=$(($stats_error+1))
Packit 51d0f7
		;;
Packit 51d0f7
	esac
Packit 51d0f7
Packit 51d0f7
	# skip certain results
Packit 51d0f7
	if [[ $2 == "INFO" && -z $verbose ]]; then
Packit 51d0f7
		return
Packit 51d0f7
	fi
Packit 51d0f7
Packit 51d0f7
	# output
Packit 51d0f7
	if [[ $3 == "" ]]; then
Packit 51d0f7
		printf "Test %-30s result: %s\n" "$1" "$2" >&$logfd
Packit 51d0f7
	else
Packit 51d0f7
		printf "Test %-30s result: %s %s\n" "$1" "$2" "$3" >&$logfd
Packit 51d0f7
	fi
Packit 51d0f7
}
Packit 51d0f7
Packit 51d0f7
#
Packit 51d0f7
# Print out script usage details
Packit 51d0f7
#
Packit 51d0f7
function usage() {
Packit 51d0f7
cat << EOF
Packit 51d0f7
usage: regression [-h] [-v] [-l <LOG>] [-s <SINGLE_TEST>]
Packit 51d0f7
Packit 51d0f7
NetLabel regression test automation script
Packit 51d0f7
optional arguments:
Packit 51d0f7
  -h             show this help message and exit
Packit 51d0f7
  -l LOG         specifies log file to write test results to
Packit 51d0f7
  -s SINGLE_TEST specifies individual test number to be run
Packit 51d0f7
  -v             specifies that verbose output be provided
Packit 51d0f7
EOF
Packit 51d0f7
}
Packit 51d0f7
Packit 51d0f7
#
Packit 51d0f7
# Run the pre-test sanity checks
Packit 51d0f7
#
Packit 51d0f7
#
Packit 51d0f7
function run_sanity() {
Packit 51d0f7
	local rc=0
Packit 51d0f7
Packit 51d0f7
	echo " stage: sanity checks" >&$logfd
Packit 51d0f7
Packit 51d0f7
	# netlabelctl check
Packit 51d0f7
	if [[ ! -x $GLBL_NETLABELCTL ]]; then
Packit 51d0f7
		rc=1
Packit 51d0f7
		print_result "00-sanity-build_check" "ERROR"
Packit 51d0f7
	else
Packit 51d0f7
		print_result "00-sanity-build_check" "SUCCESS"
Packit 51d0f7
	fi
Packit 51d0f7
Packit 51d0f7
	# must be root
Packit 51d0f7
	if [[ $(id -u) -ne 0 ]]; then
Packit 51d0f7
		rc=1
Packit 51d0f7
		print_result "00-sanity-root_check" "ERROR" "(id == $(id -u))"
Packit 51d0f7
	else
Packit 51d0f7
		print_result "00-sanity-root_check" "SUCCESS"
Packit 51d0f7
	fi
Packit 51d0f7
Packit 51d0f7
	# basic kernel support
Packit 51d0f7
	if ! $GLBL_NETLABELCTL mgmt version >& /dev/null; then
Packit 51d0f7
		rc=1
Packit 51d0f7
		print_result "00-sanity-kernel_check" "ERROR"
Packit 51d0f7
	else
Packit 51d0f7
		print_result "00-sanity-kernel_check" "SUCCESS"
Packit 51d0f7
	fi
Packit 51d0f7
Packit 51d0f7
	return $rc
Packit 51d0f7
}
Packit 51d0f7
Packit 51d0f7
#
Packit 51d0f7
# Run an individual test
Packit 51d0f7
#
Packit 51d0f7
# Arguments:
Packit 51d0f7
#     1    string containing test name
Packit 51d0f7
#
Packit 51d0f7
function run_test() {
Packit 51d0f7
	local rc
Packit 51d0f7
	local name="$(basename ${1//.tests/})"
Packit 51d0f7
Packit 51d0f7
	# sanity check
Packit 51d0f7
	if [[ ! -x $1 ]]; then
Packit 51d0f7
		print_result "$name" "ERROR"
Packit 51d0f7
		return 1;
Packit 51d0f7
	fi
Packit 51d0f7
Packit 51d0f7
	# run the test
Packit 51d0f7
	if [[ -z $verbose ]]; then
Packit 51d0f7
		($1) >& /dev/null
Packit 51d0f7
	else
Packit 51d0f7
		print_test "$name" "running ..."
Packit 51d0f7
		($1) >&$logfd
Packit 51d0f7
	fi
Packit 51d0f7
	rc=$?
Packit 51d0f7
Packit 51d0f7
	# report on the results
Packit 51d0f7
	if [[ $rc -eq 0 ]]; then
Packit 51d0f7
		print_result "$name" "SUCCESS"
Packit 51d0f7
	else
Packit 51d0f7
		rc=1
Packit 51d0f7
		print_result "$name" "FAILURE"
Packit 51d0f7
	fi
Packit 51d0f7
Packit 51d0f7
	return $rc
Packit 51d0f7
}
Packit 51d0f7
Packit 51d0f7
#
Packit 51d0f7
# Run the requested tests
Packit 51d0f7
#
Packit 51d0f7
function run_tests() {
Packit 51d0f7
	local rc=0
Packit 51d0f7
Packit 51d0f7
	echo " stage: individual tests" >&$logfd
Packit 51d0f7
Packit 51d0f7
	if [[ single_count -eq 0 ]]; then
Packit 51d0f7
		# loop through all the test files
Packit 51d0f7
		for test in $basedir/*.tests; do
Packit 51d0f7
			run_test $test
Packit 51d0f7
		done
Packit 51d0f7
	else
Packit 51d0f7
		# only run what was requested
Packit 51d0f7
		for test in $basedir/$single_list; do
Packit 51d0f7
			[[ ! -f $test ]] && test=$test.tests
Packit 51d0f7
			run_test $test
Packit 51d0f7
		done
Packit 51d0f7
	fi
Packit 51d0f7
Packit 51d0f7
	return $rc
Packit 51d0f7
}
Packit 51d0f7
Packit 51d0f7
####
Packit 51d0f7
# main
Packit 51d0f7
Packit 51d0f7
verify_deps id
Packit 51d0f7
Packit 51d0f7
# global variables
Packit 51d0f7
single_list=""
Packit 51d0f7
singlecount=0
Packit 51d0f7
logfile=
Packit 51d0f7
logfd=
Packit 51d0f7
tmpfile=""
Packit 51d0f7
verbose=
Packit 51d0f7
stats_all=0
Packit 51d0f7
stats_skipped=0
Packit 51d0f7
stats_success=0
Packit 51d0f7
stats_failure=0
Packit 51d0f7
stats_error=0
Packit 51d0f7
Packit 51d0f7
# set the test root directory
Packit 51d0f7
basedir=$(dirname $0)
Packit 51d0f7
Packit 51d0f7
# parse the command line
Packit 51d0f7
while getopts "l:s:vh" opt; do
Packit 51d0f7
	case $opt in
Packit 51d0f7
	l)
Packit 51d0f7
		logfile="$OPTARG"
Packit 51d0f7
		;;
Packit 51d0f7
	s)
Packit 51d0f7
		single_list+="$OPTARG "
Packit 51d0f7
		single_count=$(($single_count+1))
Packit 51d0f7
		;;
Packit 51d0f7
	v)
Packit 51d0f7
		verbose=1
Packit 51d0f7
		;;
Packit 51d0f7
	h|*)
Packit 51d0f7
		usage
Packit 51d0f7
		exit 1
Packit 51d0f7
		;;
Packit 51d0f7
	esac
Packit 51d0f7
done
Packit 51d0f7
Packit 51d0f7
# open log file for append (default to stdout)
Packit 51d0f7
if [[ -n $logfile ]]; then
Packit 51d0f7
	logfd=3
Packit 51d0f7
	exec 3>>"$logfile"
Packit 51d0f7
else
Packit 51d0f7
	logfd=1
Packit 51d0f7
fi
Packit 51d0f7
Packit 51d0f7
# open temporary file
Packit 51d0f7
tmpfile=$(mktemp -t regression_XXXXXX)
Packit 51d0f7
Packit 51d0f7
# display the test output and run the requested tests
Packit 51d0f7
echo "=============== $(date) ===============" >&$logfd
Packit 51d0f7
echo "Regression Test Report (\"regression $*\")" >&$logfd
Packit 51d0f7
sane=0
Packit 51d0f7
if run_sanity; then
Packit 51d0f7
	# the system should be okay to run the full testsuite
Packit 51d0f7
	sane=1
Packit 51d0f7
	run_tests
Packit 51d0f7
else
Packit 51d0f7
	# something went wrong in the sanity checks, return a 0 error code
Packit 51d0f7
	# so things like "make check" work, but display as normal
Packit 51d0f7
	sane=0
Packit 51d0f7
fi
Packit 51d0f7
echo "Regression Test Summary" >&$logfd
Packit 51d0f7
echo " tests run: $stats_all" >&$logfd
Packit 51d0f7
echo " tests skipped: $stats_skipped" >&$logfd
Packit 51d0f7
echo " tests passed: $stats_success" >&$logfd
Packit 51d0f7
echo " tests failed: $stats_failure" >&$logfd
Packit 51d0f7
echo " tests errored: $stats_error" >&$logfd
Packit 51d0f7
echo "============================================================" >&$logfd
Packit 51d0f7
Packit 51d0f7
# cleanup and exit
Packit 51d0f7
rm -f $tmpfile
Packit 51d0f7
rc=0
Packit 51d0f7
[[ $stats_failure -gt 0 ]] && rc=$(($rc + 2))
Packit 51d0f7
[[ $stats_error -gt 0 ]] && rc=$(($rc + 4))
Packit 51d0f7
Packit 51d0f7
if [[ $sane -eq 1 ]]; then
Packit 51d0f7
	exit $rc
Packit 51d0f7
else
Packit 51d0f7
	exit 0
Packit 51d0f7
fi