#!/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 a Graphical User Interface (GUI) 
#              Control Centre for MCE Test Suite. The Control Centre provides 
#              functionality to Compile, Execute and View Results of
#              MCE Test Cases.
#              
# Author:      Gong Chen <gong.chen@linux.intel.com>
# 
# These codes are heavily reused from ltpmenu.
# Thanks very much for Manoj Iyer <manjo@mail.utexas.edu>
#

# Global variables.
TOOL_DIR=./bin
TMP_DIR=./work
LOG_DIR=./results
SUM_DIR=./summary
SCENARIO_DIR=./groups

SUM_FILE=""
LOG_FILE=""
TOTAL_COUNT=0
PASS_COUNT=0
FAIL_COUNT=0
RUNALL_TIMES=1

#Dialog Resource definition
BACKTITLE="Linux MCE Test Suite Control Center"

#main menu window resources
TITLE_MAIN="Main Menu"
MENU_MAIN="Move using[UP] [DOWN], Select using [ENTER]"
ABOUT_MAIN="About MCE Test Suite"
COMPILE_MAIN="Compile Whole Test Suite"
DETAIL_MAIN="Details of Scenario Files"
EXECUTE_MAIN="Execute Selected Test Cases"
RESULTS_MAIN="Display a Summary of Test Results"
GOODBYE_TITLE="Good Bye!"
GOODBYE_MSG="Thank you for using Linux MCE Test Suite"

#about window resources
ABOUT_TITLE="About MCE Test Suite"
ABOUT_MSG="The MCE Test Suite can be used to to compile, \
install and execute all kinds of Linux MCE Tests. "

#compile window resources
COMPILE_TITLE="Compiling LTP testsuite"
COMPILE_YESNO="This will compile all the test cases in \
MCE Test Suite and place the executables \
in corresponding directory. Do \
you wish to continue ??" 
COMPILE_TILE="Compiling MCE Test Suite"
COMPILE_MSG="ERROR: command \$cmd not found, \$cmd is \
required to compile MCE Test Suite. Please \
install \$cmd or export PATH correctly before \
running this program"
COMPLIE_ERROR_1="ERROR in \'make clean\' - exiting."
COMPLIE_ERROR_2="ERROR in \'make all\' - exiting."
COMPLIE_ERROR_3="ERROR in \'make install\' - exiting."

#result window resources
RESULT_TITLE="MCE Test Results"
RESULT_MENU="Move using[UP] [DOWN], Select using [ENTER]\n\n
To get more detail information during the test procedure \
please check directory $LOG_DIR.\n"
NOFILE_MSG="ERROR: No files to view in $SUM_DIR directory."

#scenario/group window resources
SCE_TITILE="MCE Test Scenario Files"
CHECKLIST_MAIN="Move using[UP] [DOWN], Select using [SPACE]"

#execute window resources
EXE_TITILE="Executing MCE testcases"
EXE_MSG1="The testcases must to be compiled in order \
to execute them. Returning to main menu. \
Please select the Compile option." 
EXE_MSG2="At least one test case should be choosed. \
Please return to *Scenario* menu to select \
at least one test case." 

#flag prompt window resources
PROMPT_TITLE="Test Duration - Times Specification"
PROMPT_MSG1="Would you like to specify test duration? \
Default is the length of one loop."
PROMPT_MSG2="Please enter the duration numbers to run. \
0 menas infinite loop."

# Function:    cleanup
#
# Description: Remove all temporary files created by this program. Cleanup 
#              always called on program exit.
cleanup()
{
    rm -rf $TMP_DIR/*
}


# Function:    display_info_msg 
#
# Description: Displays informational messages window. This window may
#              may be used to display information like errors, instructions
#              etc to the user. The window is dismissed when the user hits
#              the [ENTER] key.
display_info_msg()
{
	dialog --backtitle "$BACKTITLE" \
		--title " $1 " \
		--msgbox " $2 " 10 70 
	return $?
}


# Function:    compile_rastest
#
# Description: Checks for commands that are pre-reqs for compiling and 
#              installing MCE Test Suite. It displays a confirmation window
#              in order to confirm the choice made by the user.
compile_rastest()
{
	dialog --backtitle "$BACKTITLE" \
	--title "$COMPILE_TITLE" \
	--yesno "$COMPILE_YESNO" 7 70 || RC=$?
	case $RC in
		0) for cmd in cc make; do
			which $cmd &> /dev/null
			if [ $? -ne 0 ]; then
				msg=`eval echo $COMPILE_MSG`
				display_info_msg "$COMPILE_TILE" "$msg"
				return
			fi
		done
		make clean
		if [ $? -ne 0 ]; then
			echo $COMPLIE_ERROR_1
			exit
		fi 
		make
		if [ $? -ne 0 ]; then
			echo $COMPLIE_ERROR_2
			exit
		fi 
		make install
		if [ $? -ne 0 ]; then
			echo $COMPLIE_ERROR_3
			exit
		fi 
		return ;;

		1|255)  return ;;
	esac
}


# Function:    disp_result
#
# Description: The summary generated after the execution located under
#              $SUM_DIR/ directory in a text (ASCII) file called 
#              todaysdate.time.log. This function displays this file in a
#              window. If the results file does not exist it displays an 
#              info message window notifing the user that MCE test cases
#              need to be executed in order to view results.
disp_result()
{
	RC=0
	local RESULTS_LIST=$(for i in `ls -1 -A -I ".git*" -B $SUM_DIR`;\
			do echo -n "$i [more...] "; done)
	if ! [ -z "$RESULTS_LIST" ]; then
		while [ $RC -ne "1" ]
		do
			dialog --clear
			dialog --backtitle "$BACKTITLE" \
			--title "$RESULT_TITLE" \
			--menu "$RESULT_MENU" 15 70 8 \
			$RESULTS_LIST \
			2>$TMP_DIR/rastest.results.$$ || RC=$?
			results_item=$(cat $TMP_DIR/rastest.results.$$)
			if ! [ -z $results_item ];then
				dialog --clear
				dialog --backtitle "$BACKTITLE" \
				--title "$RESULT_TITLE" \
				--textbox $SUM_DIR/$results_item 17 70
			fi
		done
	else
		dialog --clear
		dialog --backtitle "$BACKTITLE" \
		--title "$RESULT_TITLE" \
		--msgbox "$NOFILE_MSG" 5 53 
	fi
}


# Function:    flags_prompt
#
# Description: Prompt for and record user options for run duration
flags_prompt()
{
	local RC=0

	RUNALL_TIMES=1

	dialog --clear
	dialog --backtitle "$BACKTITLE" \
	--title "$PROMPT_TITLE" --clear\
	--yesno "$PROMPT_MSG1" 7 80
	RC=$?
	if [ $RC -eq "0" ]
	then
		dialog --backtitle "$BACKTITLE" \
		--title "$PROMPT_TITLE" --clear\
		--inputbox "$PROMPT_MSG2" 7 80 \
		2>$TMP_DIR/rastest.length.$$ ;
		RUNALL_TIMES=$(cat $TMP_DIR/rastest.length.$$ | awk '{print $1}')
	fi
}

# 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 RC=0
	local DATE_START=""
	local DATE_END=""
	local size=0
	local TST_CHOICE=$TMP_DIR/rastest.choice.$$
	local CASELIST=$TMP_DIR/rastest.caselist.$$

	if ! [ -f $TOOL_DIR/page-types ]
	then
		display_info_msg "$EXE_TITILE" \
		"$EXE_MSG1"
		return
	fi

	touch $TST_CHOICE
	cat $SCENARIO_DIR/* > $TST_CHOICE
	awk '{if ($3 == "on") {print $1" "$2}}' $TST_CHOICE > $CASELIST

	size=`wc -m $CASELIST | awk '{print $1}'`
	if [ $size -eq 0 ];then
		RC=1
	fi

	case $RC in 
		0)
		flags_prompt
		dialog --clear

		./runmcetest -t $TMP_DIR -s $SUM_DIR -o $LOG_DIR -b $TOOL_DIR\
			-l $CASELIST -r $RUNALL_TIMES

		return ;;
		1|255)
		display_info_msg "$EXE_TITILE" \
				"$EXE_MSG2"
		return ;;
	esac
}


# Function:    about_rastest
#
# Description: This function displays a window containing a brief message
#              describing this programs functionality.
about_rastest()
{
    display_info_msg "$ABOUT_TITLE" "$ABOUT_MSG"
}


# Function:    ras_scenarios
#
# Description: This function displays a list of scenario files located 
#              in scenario directory.  Users can list the contents of
#              each file and do some adjustment
#
ras_scenarios()
{
	RC=0
	local RETVAL=0
	local TMPMODE=""
	local TMPSEL=$TMP_DIR/rastest.groupcases.$$
	local SCENARIOS=$(for i in `ls -1 -A -I ".git*" -B $SCENARIO_DIR`;
				do echo -n "$i [more...] "; done; )

	while [ $RC -ne "1" ] 
	do
		dialog --clear
		dialog --cancel-label QUIT --backtitle "$BACKTITLE" \
		--title "$SCE_TITILE" \
		--menu "$MENU_MAIN" 15 70 8 \
		$SCENARIOS \
		2>$TMP_DIR/rastest.scenario.$$ || RC=$?
		scenario=$(cat $TMP_DIR/rastest.scenario.$$)
		if ! [ -z $scenario ];then
			#ignore comment line in group file
			scenario_item=`grep -v "^#" $SCENARIO_DIR/$scenario`
			dialog --clear
			dialog --separate-output --backtitle "$BACKTITLE" \
			--title "$SCE_TITILE" \
			--checklist "$CHECKLIST_MAIN" 20 60 14 \
				$scenario_item 2> $TMPSEL

			RETVAL=$?
			if [ $RETVAL -eq 0 ]; then
				# convert original mode to another style
				# e.g.
				# item1
				# item2
				# item3
				# =========== convert ===========
				# item1\|item2\|item3
				TMPMODE=$(cat $TMPSEL | while read line
					do
						# Some dialog output has double quote even if
						# --separate-output is used. If so, rip them
						if [ ${line:0:1} = \" -a ${line: -1} = \" ]; then
							line=${line:1:${#line}-2}
						fi
						echo -n \\\|$line
					done)
				#remove the first prefix "\|"
				TMPMODE=${TMPMODE:2}
				sed -i -e "s/\(^[^#].*\)on$/\1off/g" $SCENARIO_DIR/$scenario
				if [ X${TMPMODE} != X ]; then
				sed -i -e "s/\(\(${TMPMODE}\).*\)off/\1on/g" \
					$SCENARIO_DIR/$scenario
				fi
			fi
		fi

	done
}


                 
# Function:    main
#
# Description: Displays the main menu to the MCE Test Suite. The menu
#              provides options to Compile, Execute, and View test execution
#              results.

# test for dialog program exist
if [ ! -x /usr/bin/dialog ]; then
       echo "Sorry, MCE Test Suite GUI not available, can't find dialog. Exiting...";
       exit 1;
fi

# call cleanup function on program exit.
trap "cleanup" 0

# wait in a loop until user hits [Cancel] button on the main menu.
while :
do
	RC=0
	dialog --clear
	dialog --cancel-label QUIT --backtitle "$BACKTITLE" \
	--title "$TITLE_MAIN" \
	--menu "$MENU_MAIN" 15 70 5 \
		About		"$ABOUT_MAIN" \
		Compile		"$COMPILE_MAIN" \
		Scenario	"$DETAIL_MAIN" \
		Execute		"$EXECUTE_MAIN" \
		Results		"$RESULTS_MAIN" \
	2>$TMP_DIR/rastest.mainmenu.$$ || RC=$?

	case $RC in 
		0) mmenu_item=`cat $TMP_DIR/rastest.mainmenu.$$`
			case $mmenu_item in
				About)		about_rastest;;
				Compile)	compile_rastest;;
				Scenario)	ras_scenarios;;
				Execute)	execute_test;;
				Results)	disp_result;;
			esac ;;

		1|255) display_info_msg "$GOODBYE_TITLE" "$GOODBYE_MSG"
		exit ;;
	esac
done
