#!/bin/bash # # @echo off # # The test suite command dispatcher # # Available commands: # # 0 - Make and install AML tests # 1 - Run specified set of tests in all enabled modes # 2 - Compare two multi-results of two runs of tests # 3 - Print out the names of all the available test cases # 4 - Calculate the current state of all bugs and report the summary # tables # 5 - Prepare bdemo summary files of one multi-results directory for all # modes # 6 - Concatenate bdemo summary files of two multi-results # # Notations: # # ASL - iASL compiler # acpiexec - AcpiExec utility # acpibin - AcpiBin utility # ASLTSDIR - pathname of root directory of aslts test suite # # External definitions required for particular command: # # 0 - ASLTSDIR, ASL # 1 - ASLTSDIR, acpiexec, acpibin # 2 - ASLTSDIR # 3 - none # 4 - ASLTSDIR # 5 - ASLTSDIR # 6 - ASLTSDIR # # Other: # Make sure that "." (current directory) is in your default search path. # If necessary, convert all scripts in the aslts/bin directory to unix # line endings: # d2u aslts/bin/* # # Concepts: # # run - execution of the specified set of tests # for one particular enabled mode # # multi-run - execution of the specified set of tests # for all the enabled modes # # multi-result (directory) - directory in RESULTS one containing # all results of one multi-run # # root directory of results - aslts/tmp/RESULTS # root directory of aslts - aslts # # REMEMBER (To-Be-Done items) # # 1. Don't forget to add testing of aml/nopt mode. # 2. Do make-install till the first error automatically # 3. Not implemented yet though announced in Usage: # - "Do 1 [n32 [n64 [s32 [s64]]]] [<test_case_name> [<test_case_name> [...]]]" # - "Make-install all the test cases of the specified test collections" # - ... # 4. Add checking of presence of "Large reference count" message in logs # STR_BDEMOSSUM="prepare bdemo summary files of one multi-results directory for all modes" STR_CONCBDEMOS="concatenate bdemo summary files of two multi-results" STR_BDEMOSTABS="calculate the current state of all bugs and report the summary tables" usage() { echo "Usage:" echo " print out usage:" echo " Do" echo " make and install AML tests:" echo " Do $ASLCOMPILE [ASLTS|aslts]" echo " Do $ASLCOMPILE <test_case_name> [<test_case_name> [...]]" echo " Do $ASLCOMPILE [ALL|all] [functional[complex[exceptions[bdemo[service[mt[Identity2MS]]]]]]]" echo " run specified set of tests in all enabled modes:" echo " Do $RUNTESTS" echo " Do $RUNTESTS [n32 [n64 [o32 [o64]]]] [<test_case_name> [<test_case_name> [...]]]" echo " compare two multi-results of two runs of tests:" echo " Do $DIFFRESULTS" echo " Do $DIFFRESULTS <multi-result directory>" echo " Do $DIFFRESULTS <new multi-result directory> <old multi-result directory>" echo " print out names of all the available test cases:" echo " Do $PRINTTESTCASES" echo " $STR_BDEMOSTABS:" echo " Do $BDEMOSTABS <new multi-result directory> <old multi-result directory> <ALLBUGS Description File>" echo " <kernel bugzilla Bug List file> <local bugzilla Bug List file>" echo " $STR_BDEMOSSUM:" echo " Do $BDEMOSSUM <multi-result directory>" echo " $STR_CONCBDEMOS:" echo " Do $CONCBDEMOS <new multi-result directory> <old multi-result directory>" } # Report message msg() { prog_name=`basename "$0"` echo "$prog_name: $1" } # Report error message msgE() { prog_name=`basename "$0"` echo "$prog_name[ERROR]: $1" } # Exit the program # agr1 - 0 success, non-zero - fail do_exit() { if [ $1 -eq 0 ]; then if [ "$2" != "" ]; then msg "$2" fi exit 0 else msgE "$2" exit 1 fi } # Abort program when arg1 is not a directory # arg1 - path name of directory check_dir() { if [ ! -d "$1" ]; then do_exit 1 "Not a directory: $1" fi } # Return the string-description of compare command # arg1 - opcode of compare command cmp_cmd_string() { local msg case $1 in 1) msg="Compare the last multi-result against the previous one:";; 2) msg="Compare the last multi-result against the specified one:";; 3) msg="Compare the first(new) specified multi-result against the second(old):";; *) msg="?" esac echo "$msg" } # Compare the last multi-result against the previous one # arg1 - root directory of results do_cmp1() { local x previous last DIR0 DIR1 x=`get_two_last_dirs "$1"` last=`echo "$x" | awk -F: '{ print $2}'` previous=`echo "$x" | awk -F: '{ print $3}'` if [ -n "$previous" -a -n "$last" ]; then DIR0="$1/$previous" DIR1="$1/$last" echo " root directory of results : $1" echo " the last multi-result : $last" echo " against previous one : $previous" echo "" asltsdiffres "$DIR0" "$DIR1" elif [ -n "$last" ]; then echo "There is the only component of root directory of results: $last" echo "root directory of results: $1" else echo "No one component in the root directory of results: $1" fi } # Compare the last multi-result against the specified one # arg1 - root directory of results # arg2 - second multi-result directory do_cmp2() { local x last DIR0 DIR1 x=`get_two_last_dirs "$1"` last=`echo "$x" | awk -F: '{ print $2}'` if [ -n "$last" ]; then DIR0="$2" DIR1="$1/$last" echo " root directory of results : $1" echo " the last multi-result : $DIR1" echo " against the specified one : $DIR0" echo "" asltsdiffres "$DIR0" "$DIR1" else echo "No one component in the root directory of results: $1" fi } # Compare the first specified multi-result against the second one # arg1 - first multi-result directory # arg2 - second multi-result directory do_cmp3() { local DIR0 DIR1 DIR0="$2" DIR1="$1" echo " First (new) specified multi-result : $DIR1" echo " Second (old) specified multi-result : $DIR0" asltsdiffres "$DIR0" "$DIR1" } # Compare two multi-results # arg1 - the number of parameters passed to Do utility # arg2 - first multi-result directory # arg3 - second multi-result directory # arg4 - root directory of results do_cmp() { cmp_cmd_string $1 if [ $1 == 1 ]; then do_cmp1 "$4" elif [ $1 == 2 ]; then do_cmp2 "$4" "$3" elif [ $1 == 3 ]; then do_cmp3 "$2" "$3" else do_exit 1 "Invalid usage" fi } # Summary files of bdemos do_bdemo_sums() { dir="$2" echo "$STR_BDEMOSSUM:" echo " the multi-result : $dir" bdemossum "$dir" } # Concatenate summary files of bdemos concatenate_bdemo_sums() { local DIR0 DIR1 DIR0="$2" DIR1="$3" echo "$STR_CONCBDEMOS:" echo " the first multi-result : $DIR0" echo " the second multi-result : $DIR1" bdemosconc "$DIR0" "$DIR1" } # Summary table of bdemos do_bdemo_table() { local DIR0 DIR1 DIR0="$2" DIR1="$3" ALLBUGS="$4" KBSUM="$5" LBSUM="$6" echo "$STR_BDEMOSTABS:" echo " the first multi-result : $DIR0" echo " the second multi-result : $DIR1" echo " ALLBUGS Description File : $ALLBUGS" echo " kernel bugzilla Bug List file : $KBSUM" echo " local bugzilla Bug List file : $LBSUM" echo " BUG_STATE_DIR : $BUG_STATE_DIR" bdemostabs "$DIR0" "$DIR1" "$ALLBUGS" "$KBSUM" "$LBSUM" "$BUG_STATE_DIR" } make_target() { local dir restore_dir mode options aslversion restore_dir=$PWD target=$1 dir="$2" mode=$3 aslversion=`get_iasl_version` cd "$dir" echo "Running make $target from $dir" options="ASLTS_VER=$aslversion" if [ ! -z $mode ]; then options="$options ASLTS_MODE=$mode" fi make $target $options > /dev/null res=$? cd "$restore_dir" return $res } binary_compare() { mode=$1 aslversion=`get_iasl_version` disasm_compile_dir="$ASLTSDIR/tmp/aml/$aslversion/$mode" normal_compile_dir="$ASLTSDIR/tmp/aml/$aslversion/nopt/64" echo "Performing binary comparison of AML files within" echo " $normal_compile_dir" echo " $disasm_compile_dir" if [ ! -d $disasm_compile_dir ]; then echo " $dism_compile_dir does not exist. Aborting binary compare" return; fi if [ ! -d $normal_compile_dir ]; then echo " $normal_compile_dir does not exist. Aborting binary compare" return; fi for f in $disasm_compile_dir/* do filename=`basename $f` if [ ! -f "$normal_compile_dir/$filename" ]; then echo " binary compare $mode the following file does not exist: $normal_compile_dir/$filename" else $acpibin -a "$f" "$normal_compile_dir/$filename" > /dev/null if [ $? -ne 0 ]; then echo " [[ Error: $mode Binary compare for $filename failed ]]" else echo " $mode Binary compare for $filename passed" fi fi done } make_install() { local res=0 nres=0 execonly=$2 if [ $ENABLENORM32 != 0 ]; then echo "Make n32" make_target install "$1" "n32" nres=$? if [ $nres -ne 0 ]; then res=$nres fi fi if [ $ENABLENORM64 != 0 ]; then echo "Make n64" make_target install "$1" "n64" nres=$? if [ $nres -ne 0 ]; then res=$nres fi fi if [ $ENABLEOPT32 != 0 ]; then echo "Make s32" make_target install "$1" "o32" nres=$? if [ $nres -ne 0 ]; then res=$nres fi fi if [ $ENABLEOPT64 != 0 ]; then echo "Make s64" make_target install "$1" "o64" nres=$? if [ $nres -ne 0 ]; then res=$nres fi fi if [ "x$execonly" = "xno" ]; then # for binary compare, we need to compare with normal 64 bit aml # files build n64 mode normal 64 bit aml files build n64 mode # if this test run does not include it. if [ $ENABLENORM64 -eq 0 ]; then echo "Make n64" make_target install "$1" "n64" nres=$? if [ $nres -ne 0 ]; then res=$nres fi fi echo "Make ASL convert" make_target install "$1" "aslconvert" find . -type f -name *.dsl -delete nres=$? binary_compare "aslconvert" nres=$(($nres+ $?)) if [ $nres -ne 0 ]; then res=$(($res + $nres)) fi echo "Make ASL plus" make_target install "$1" "aslplus" nres=$? binary_compare "aslplus" nres=$(($nres+ $?)) if [ $nres -ne 0 ]; then res=$nres fi echo "Make ASL minus" make_target install "$1" "aslminus" nres=$? binary_compare "aslminus" nres=$(($nres+ $?)) if [ $nres -ne 0 ]; then res=$(($res + $nres)) fi fi return $res } # Make-install all the provided test cases # (make install from aslts directory) # arg1 - root directory of aslts make_install_1() { make_install "$1" "$2" if [ $? -ne 0 ]; then do_exit 1 "make install error" fi } # Check parameters to be the names of test # cases and run make install for each of them # if specified. # arg1 - root directory of aslts # arg2 - all the lexem here must be the names of test cases # arg3 - either to actually run make install do_test_cases_make_install() { local errors=0 dir restore_dir execonly restore_dir=$PWD execonly=$4 for filename in $2 do get_collection_opcode "$filename" ret=$? if [ $ret -eq $COLLS_NUM ]; then do_exit 1 "Not the name of any test case: $filename" fi dir="`get_test_case_dir "$1" $ret $filename`" check_dir "$dir" if [ $3 != 0 ]; then make_install "$dir" "$execonly" if [ $? -ne 0 ]; then errors=1 fi fi done cd "$restore_dir" } # Make-install a list of specified test cases # arg1 - root directory of aslts # arg2 - all the lexem here must be the names of test cases make_install_2() { # Check only all parameters are correct # (abort when something is wrong) do_test_cases_make_install "$1" "$2" 0 # Run actual work do_test_cases_make_install "$1" "$2" 1 "$3" } # Check parameters to be the names of test # collections and run make install for each # of them, if specified. # arg1 - root directory of aslts # arg2 - all the lexem here must be the names of test collections # arg3 - either to actually run make install do_collections_make_install() { local errors=0 dir restore_dir execonly restore_dir=$PWD execonly=$4 for filename in $2 do is_collection_name "$filename" if [ $? -ne 0 ]; then do_exit 1 "Not the name of any test collection: $filename" fi dir="`get_collections_root_dir "$1"`/$filename" check_dir "$dir" if [ $3 != 0 ]; then make_install "$dir" "$execonly" if [ $? -ne 0 ]; then errors=1 fi fi done cd "$restore_dir" return $errors } # Make-install all the test cases of the specified test collections # arg1 - root directory of aslts # arg2 - all the lexem here must be the names of test collections make_install_3() { # Check only all parameters are correct # (abort when something is wrong) do_collections_make_install "$1" "$2" 0 # Run actual work do_collections_make_install "$1" "$2" 1 "$3" } # Make-install the test case(s). # # Parameters: # # 1. Make-install all the provided test cases: # # aslts # # 2. Make-install a list of specified test cases: # # test_case_name [test_case_name...] # # 3. Make-install all the test cases of the specified test collections: # # [ALL|all] [functional[complex[exceptions[bdemo[service[mt[Identity2MS]]]]]]] # # arg1 - root directory of aslts # arg2 - number of parameters passed to Do utility # arg3 - all parameters passed to Do utility run_asl_compiler() { local list="$2" execonly=$3 local action=100 # It's better to split this function into a special 'asltscomp' # script. For now, still uses it as an inline function. RESET_SETTINGS INIT_ALL_AVAILABLE_CASES INIT_ALL_AVAILABLE_MODES INIT_SET_OF_TEST_CASES INIT_SET_OF_TEST_MODES INIT_LOG_RESULTS INIT_MEM_STAT if [ $list == ASLTS -o $list == aslts ]; then action=1 elif [ $list == ALL -o $list == all ]; then list=`echo "$3" | cut -c 7-` action=3 else action=2 fi echo "list of testcases: $list" if [ $action == 1 ]; then echo "Make-install all the provided test cases" make_install_1 "$1" "$execonly" elif [ $action == 2 ]; then echo "Make-install a list of specified test cases: $list" make_install_2 "$1" "$list" "$execonly" elif [ $action == 3 ]; then echo "Make-install all the test cases of the specified test collections: $list" make_install_3 "$1" "$list" "$execonly" else do_exit 1 "Bad parameters 2" fi } get_iasl_version() { local x version if [ ! -f $ASL ]; then do_exit 1 "Bad iASL 1: <$ASL> does not exist" else x=`$ASL -version | grep "Compiler/Disassembler version"` if [ x"$x" == x ]; then version=00000000 do_exit 1 "Bad iASL 2: bad signon <$ASL>" else version=`echo "$x" | awk -F" " '{print $5}'` if [ x"$version" == x ]; then do_exit 1 "Bad iASL 3: could not get version <$ASL>" else echo "$version" fi fi fi } get_aslts_bin_line() { echo "$1" | awk -F: '{ for (i=1; i<=NF; i++) { print $i}}' |\ while [ 1 ] do read line if [ $? -ne 0 ]; then break fi if [[ "$line" == *aslts/bin ]]; then echo "$line" fi done } # ############################## MAIN ############################### # Init variables of utility # Available commands CMD=$1 NPARAM=$# ASLCOMPILE=0 RUNTESTS=1 DIFFRESULTS=2 PRINTTESTCASES=3 BDEMOSTABS=4 BDEMOSSUM=5 CONCBDEMOS=6 EXECONLY=$3 # Set defaults RESULTDIR= # ################################################################## # # ATTENTION: don't use yet here any common stuff till the next remark # # ################################################################## # # Only report USAGE if [ $NPARAM == 0 ]; then usage do_exit 0 "" fi # Determine the working directory and take precautions (last name should be aslts) if [ ! -d "$ASLTSDIR" ]; then do_exit 1 "Undefined ASLTSDIR variable! Set it to pathname of root directory of aslts test suite." fi x=`basename "$ASLTSDIR"` if [ "$x" != aslts ]; then do_exit 1 "The last name in ASLTSDIR should be 'aslts', but it is $x!" fi check_dir "$ASLTSDIR" # Set up the additional environment x=`echo $PATH | grep "aslts/bin"` if [ "$x" == "" ]; then PATH=$PATH:$ASLTSDIR/bin fi x=`echo $PATH | grep "aslts/bin"` if [ "$x" == "" ]; then do_exit 1 "Failed to set up aslts/bin to PATH!" fi # The simple below doesn't work on Cygwin: # BUG_STATE_DIR=$ASLTSDIR/bin/bugstate # Basing on grep will not work in abnormal case # when there are several "aslts/bin" in PATH, so # detailed calculation of line with "aslts/bin": x=`get_aslts_bin_line "$PATH"` if [ x"$x" == x ]; then do_exit 1 "No aslts/bin in PATH!" fi BUG_STATE_DIR="$x/bugstate" PATH=$PATH:$BUG_STATE_DIR # Add the common use stuff . common . settings # ###################################################### # # ATTENTION: can use the common stuff starting from here # # ###################################################### # # Init available tests RESET_SETTINGS INIT_ALL_AVAILABLE_CASES INIT_ALL_AVAILABLE_MODES # Only report available test cases if [ $CMD == $PRINTTESTCASES ]; then echo_available_test_cases do_exit 0 "" fi # Command execution if [ $CMD == $ASLCOMPILE ]; then # Check access to iASL compiler if [ ! -f "$ASL" ]; then do_exit 1 "Undefined ASL variable! Set it to pathname of ASL compiler." fi shift 1 ENABLED_TMODES= while : do check_mode_id $1 if [ $? -eq 1 ]; then break fi ENABLED_TMODES="$1 $ENABLED_TMODES" shift 1 done export ENABLED_TMODES #NPARAM counts the number of enabled test cases NPARAM=0 ENABLED_TCASES= while : do get_collection_opcode $1 if [ $? -eq $COLLS_NUM ]; then break fi ENABLED_TCASES="$1 $ENABLED_TCASES" shift 1 NPARAM=$(($NPARAM + 1)) done export ENABLED_TCASES if [ "x$ENABLED_TCASES" == "x" ]; then x=aslts NPARAM=$(($NPARAM + 1)) else x="$ENABLED_TCASES" fi if [ $NPARAM -le 0 ]; then usage do_exit 1 "Bad parameters 0" elif [ $x == ASLTS -o $x == aslts ]; then if [ $NPARAM != 1 ]; then usage do_exit 1 "Bad parameters 1" fi elif [ $x == ALL -o $x == all ]; then if [ $NPARAM -le 0 ]; then usage do_exit 1 "Bad parameters 2" fi fi EXECONLY=$1 run_asl_compiler "$ASLTSDIR" "$x" "$EXECONLY" elif [ $CMD == $RUNTESTS ]; then # Check access to AcpiExec utility if [ ! -f "$acpiexec" ]; then do_exit 1 "Undefined acpiexec variable! Set it to pathname of AcpiExec utility." fi # Check access to AcpiBin utility if [ ! -f "$acpibin" ]; then do_exit 1 "Undefined acpibin variable! Set it to pathname of AcpiBin utility." fi shift 1 ASLTSRUN_PARAMS= ENABLED_TMODES= while : do check_mode_id $1 if [ $? -eq 1 ]; then break fi ENABLED_TMODES="$1 $ENABLED_TMODES" shift 1 done export ENABLED_TMODES export ENABLED_TCASES="$@" asltsrun elif [ $CMD == $DIFFRESULTS ]; then RESULTDIR="$ASLTSDIR/tmp/RESULTS" check_dir "$RESULTDIR" if [ $NPARAM == 1 ]; then do_cmp $NPARAM 0 0 "$RESULTDIR" elif [ $NPARAM == 2 ]; then do_cmp $NPARAM 0 "$2" "$RESULTDIR" elif [ $NPARAM == 3 ]; then do_cmp $NPARAM "$2" "$3" "$RESULTDIR" else bad_param_number $CMD $NPARAM "not more than 3" fi elif [ $CMD == $BDEMOSSUM ]; then if [ $NPARAM == 2 ]; then do_bdemo_sums "$NPARAM" "$2" else bad_param_number $CMD $NPARAM "2" fi elif [ $CMD == $CONCBDEMOS ]; then if [ $NPARAM == 3 ]; then concatenate_bdemo_sums $NPARAM "$2" "$3" else bad_param_number $CMD $NPARAM "3" fi elif [ $CMD == $BDEMOSTABS ]; then if [ $NPARAM == 6 ]; then do_bdemo_table $NPARAM "$2" "$3" "$4" "$5" "$6" else bad_param_number $CMD $NPARAM "6" fi else do_exit 1 "Bad parameters 3" fi