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