| #!/bin/bash |
| ################################################################################ |
| ## ## |
| ## This program is free software; you can redistribute it and#or modify ## |
| ## it under the terms of the GNU General Public License as published by ## |
| ## the Free Software Foundation; either version 2 of the License, or ## |
| ## (at your option) any later version. ## |
| ## ## |
| ## 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, write to the Free Software ## |
| ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## |
| ## ## |
| ################################################################################ |
| |
| # |
| # File: runmcetest |
| # |
| # Description: This program is the core executer for MCE Test Suite. |
| # |
| # Author: Chen Gong <[email protected]> |
| # |
| |
| #set -x |
| |
| TMP_DIR="" |
| SUM_DIR="" |
| LOG_DIR="" |
| TOOL_DIR="" |
| CASELIST="" |
| SUM_FILE="" |
| LOG_FILE="" |
| TOTAL_COUNT=0 |
| PASS_SIGN="PASS" |
| FAIL_SIGN="FAIL" |
| RUNALL_TIMES="" |
| |
| EXE_MSG="The testcases must to be compiled and installed in order \ |
| to execute them." |
| NOFILE_MSG="Some file or directory doesn't exist or assigned, \ |
| please check and run again." |
| NOCASE_MSG="The case list file is not valid, please check \ |
| and run again." |
| ROUND_MSG="The running time is not a valid value, please make |
| use of a nonnegtive integer and run again." |
| EXIT_MSG="Delete all files under temporary directory" |
| |
| # Function: cleanup |
| # |
| # Description: Remove all temporary files created by this program. Cleanup |
| # always called on program exit. |
| |
| cleanup() |
| { |
| if ! [ "X${TMP_DIR}" == "X" ] |
| then |
| answer="" |
| # if this script is called by mcemenu, skip query part |
| pid=`echo $$` |
| ppid=`pgrep mcemenu` |
| for id in $ppid; do |
| pgrep -P $id | grep $pid |
| if [ $? -eq 0 ]; then |
| answer="YES" |
| break; |
| fi |
| done |
| if [ -z $answer ]; then |
| read -p "$EXIT_MSG \"${TMP_DIR}\"? [Yes/No]:" answer |
| answer=`echo $answer | tr 'a-z' 'A-Z'` |
| fi |
| if [ "${answer}" == "Y" -o "${answer}" == "YES" \ |
| -o "${answer}" == "" ] |
| then |
| rm -rf $TMP_DIR/* |
| fi |
| fi |
| } |
| |
| # Function: run_test |
| # |
| # Description: Execute actual tests and print messages by test cases. |
| run_test() |
| { |
| local IFSBACK=$IFS |
| |
| # some test cases maybe meet issues when using WHILE-LOOP |
| # because of input redirection, instead of using FOR-LOOP |
| IFS=$'\n' |
| for caseid in `cat $1` |
| do |
| if [ ${caseid:0:1} != "#" ] |
| then |
| case_name=`echo $caseid | cut -d' ' -f1` |
| case_script=`echo $caseid | cut -d' ' -f2` |
| case_output=$TMP_DIR/rastest.caseoutput.$$ |
| |
| cat <<-EOF | tee -a $LOG_FILE |
| <<<<<<<<<<<<<<<<<<< TEST BEGIN >>>>>>>>>>>>>>>>>>> |
| Case ID: $case_name" |
| -------------------------------------------------------- |
| EOF |
| |
| # because pipe is used here, it is impossible to count |
| # PASS/FAIL internally |
| if ./$case_script |
| then |
| printf "%-36s%-10s\n" $case_name $PASS_SIGN >> $SUM_FILE |
| else |
| printf "%-36s%-10s\n" $case_name $FAIL_SIGN >> $SUM_FILE |
| fi | tee -a $LOG_FILE |
| TOTAL_COUNT=`expr $TOTAL_COUNT + 1` |
| |
| cat <<-EOF | tee -a $LOG_FILE |
| -------------------------------------------------------- |
| <<<<<<<<<<<<<<<<<<<< TEST END >>>>>>>>>>>>>>>>>>>> |
| |
| EOF |
| fi |
| done |
| IFS=$IFSBACK |
| |
| sleep 2 |
| } |
| |
| |
| # Function: execute_test |
| # |
| # Description: This function provides a menu of testcases that can be |
| # selected for execution. |
| # The function checks to see if the file $TOOL_DIR/page-types |
| # was created, this file is created when the whole test suite |
| # is compiled and installed, if it is not found |
| # an info message window will notify the user that it needs to |
| # be compiled before tests can be executed. |
| # This function creates the testcase list based on the users |
| # choice of scenario groups and execute these tests. |
| execute_test() |
| { |
| local DATE_START="" |
| local DATE_END="" |
| |
| if ! [ -f $TOOL_DIR/page-types ] |
| then |
| echo $EXE_MSG |
| return |
| fi |
| |
| DATE_START=`date +%Y-%m-%d.%H.%M.%S` |
| SUM_FILE=$SUM_DIR/$DATE_START.log |
| LOG_FILE=$LOG_DIR/$DATE_START.output |
| TOTAL_COUNT=0 |
| |
| cat > $SUM_FILE <<-EOF |
| Test Start Time: $DATE_START |
| ---------------------------------------------- |
| testcase result |
| ------------------- ---------- |
| EOF |
| |
| if [ $RUNALL_TIMES -eq 0 ]; then |
| while : |
| do |
| run_test $CASELIST |
| done |
| else |
| inc=0 |
| while [ $inc -lt $RUNALL_TIMES ] |
| do |
| inc=`expr $inc + 1` |
| run_test $CASELIST |
| done |
| fi |
| |
| DATE_END=`date +%Y-%m-%d.%H.%M.%S` |
| cat >> $SUM_FILE <<-EOF |
| ---------------------------------------------- |
| Test End Time: $DATE_END |
| Total Tests: $TOTAL_COUNT |
| Total Passes: `grep -c $PASS_SIGN $SUM_FILE` |
| Total Failures: `grep -c $FAIL_SIGN $SUM_FILE` |
| Kernel Version: `uname -r` |
| Machine Architecture: `uname -m` |
| EOF |
| } |
| |
| usage() |
| { |
| cat <<-EOF |
| |
| usage: ${0##*/} [ -t TMPDIR ] [ -s SUMFILE ] [ -o OUTDIR ] |
| [ -b TOOLDIR ] [ -l CASEFILE ] [ -r RUNTIMES ] |
| |
| -t TMPDIR Directory where temporary files will be created. Don't use important directory. |
| -s SUMDIR Directory where summary files will be created. |
| -o OUTDIR Directory where raw test outputs will be created. |
| -b TOOLDIR Directory where tool utilities will be placed. |
| -l CASEFILE File where test case list will be used in the test. |
| -r RUNTIMES Assign the whole test rounds. 0 means infinite loop. |
| -h Help. Prints all available options. |
| |
| example: ${0##*/} -t ./work/ -s ./summary -o ./results -b ./bin -l ./work/caselist -r 1 |
| |
| |
| EOF |
| |
| exit 0 |
| } |
| |
| main() |
| { |
| if [ "$UID" -ne 0 ]; then |
| echo "Sorry, Must be root to run MCE Test Suite. Exiting..." |
| exit 1; |
| fi |
| |
| [ $# -eq 0 ] && usage |
| |
| for cmd in mcelog mce-inject; do |
| which $cmd &> /dev/null |
| [ $? -ne 0 ] && |
| { |
| echo "Sorry, Please install $cmd first. Exiting..." |
| exit 1 |
| } |
| done |
| |
| while getopts t:s:o:b:l:r:h arg; do |
| case $arg in |
| t) TMP_DIR=$OPTARG ;; |
| s) SUM_DIR=$OPTARG ;; |
| o) LOG_DIR=$OPTARG ;; |
| b) TOOL_DIR=$OPTARG ;; |
| l) CASELIST=$OPTARG ;; |
| r) RUNALL_TIMES=$OPTARG ;; |
| h|\?) usage;; |
| esac |
| done |
| |
| if ! [ -d "$TMP_DIR" -a -d "$SUM_DIR" -a -d "$LOG_DIR" \ |
| -a -d "$TOOL_DIR" -a -e "$CASELIST" ] |
| then |
| echo $NOFILE_MSG |
| exit 2 |
| fi |
| |
| size=`wc -m $CASELIST | awk '{print $1}'` |
| if [ $size -eq 0 ] |
| then |
| echo $NOCASE_MSG |
| exit 3 |
| fi |
| |
| #when RUNALL_TIMES is NULL/string/negtive integer, exit... |
| test=`echo $RUNALL_TIMES | sed -n "/^[0-9]\+$/p"` |
| [ X"$test" = X ] && |
| { |
| echo $ROUND_MSG |
| exit 4 |
| } |
| |
| #get absoluate path for env setting, some test cases requirement |
| pushd ./ > /dev/null |
| cd $TMP_DIR |
| TMP_DIR=`pwd` |
| cd - > /dev/null |
| cd $LOG_DIR |
| LOG_DIR=`pwd` |
| cd - > /dev/null |
| cd $TOOL_DIR > /dev/null |
| TOOL_DIR=`pwd` |
| popd > /dev/null |
| |
| export TMP_DIR |
| export LOG_DIR |
| export TOOL_DIR |
| |
| execute_test |
| } |
| |
| # call cleanup function on program exit. |
| trap "cleanup" 0 |
| main "$@" |
| |