################################################################################
##                                                                            ##
## Copyright (c) International Business Machines  Corp., 2001                 ##
##                                                                            ##
## 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:        runltp
#
# Description: This program is a Graphical User Interface (GUI) 
#              Control Centre for LTP. The Control Centre provides 
#              functionality to Compile, Execute and View Results of
#              LTP test cases.
#              
# Author:      Manoj Iyer - manjo@mail.utexas.edu
#
# Thanks:      Jim Choate - For suggesting the use of dialog command.
#
# History:     March 26 2003 - Created.
#
#	       March 28 2003 - Removed gauges and put make commands in foreground.
#	                     Robbie Williamson - robbiew@us.ibm.com
#
#	       March 31 2003 - Made scenario menu creation dynamic and code 
#                              to pull the test descriptions from the scenario files.
#                            Robbie Williamson - robbiew@us.ibm.com
#
#	       April 17 2003 - Added menu selection to list contents of selected
#			       scenario file.
#			     Robbie Williamson - robbiew@us.ibm.com
#
#	       April 23 2003 - Added PID to results filename.
#			     - Added code to allow users to redirect output and
#                              specify test execution duration.
#			     Robbie Williamson - robbiew@us.ibm.com
#
#	       April 30, 2003 - Recoded results display to allow selection
#				of results file.
#			      - Created variable to hold results filename
#		 	      - Added time to results filename.
#! /bin/bash

# Function:    cleanup
#
# Description: Remove all temporary files created by this program. Cleanup 
#              always called on program exit.
#
# Input:       NONE
#
# Output:      NONE
cleanup()
{
    rm -f /tmp/runltp.*
}


# 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.
#
# Input:       $1 - Title the needs to be displayed on the window. 
#                   eg: ERROR: Compiling LTP
#              $2 - Message text.
#
# Output:      Information message window.
display_info_msg()
{
    dialog --backtitle "Linux Test Project Control Centre" \
           --title " $1 " \
           --msgbox " $2 " 10 70 
    return $?
}


# Function:    compile_ltp
#
# Description: Checks for commands that are pre-reqs for compiling and 
#              installing LTP. It displays a confirmation window inorder to 
#              confirm the choice made by the user.
#
# Calls:       do_make_clean()
#              do_make()
#              do_make_install()
#
# Input:       NONE
#
# Output:      Confirmation window.
compile_ltp()
{
    dialog --backtitle "Linux Test Project Control Centre" \
           --title "Compiling LTP testsuite"\
           --yesno "This will compile all the test cases in\
                    LTP test suite and place the executables\
                    in testcases/bin directory. Do\
                    you wish to continue ??" 7 70 || RC=$?
    case $RC in
        0) \
            for cmd in cc make lex ;
            do \
                which $cmd &>/tmp/runltp.err.$$ ;
                if [ $? -ne 0 ] ;
                    then \
                        display_info_msg "Compiling LTP testsuite" \
                                 "ERROR: command $cmd not found, $cmd is\
                                  required to compile LTP test cases. Please\
                                  install $cmd or export PATH correctly before\
                                  running this program" ;
                    return ;
                fi ;
            done ;
            make clean;
	    if [ $? -ne 0 ];then
              echo "ERROR in \'make clean\' - exiting."
	      exit
	    fi 
            make ;
	    if [ $? -ne 0 ];then
              echo "ERROR in \'make all\' - exiting."
	      exit
	    fi 
            make install ;
	    if [ $? -ne 0 ];then
              echo "ERROR in \'make install\' - exiting."
	      exit
	    fi 
            return ;;

        1)  return ;;

        255) return ;;
    esac
}


# Function:    disp_ltpres
#
# Description: The results generated after the ltp execution located under
#              ltp-mmddyy/results/ directory in a text (ASCII) file called 
#              results.todaysdate. This function displays this file in a
#              window. If the results file does not exit it displays an 
#              info message window notifing the user that LTP test cases
#              need to be executed inorder to view results.
#
# Input:       ltp-mmddyy/results/results.todaysdate.time
#
# Output:      Window displaying results of testcases that were executed.
disp_ltpres()
{
    RC=0

    RESULTS_LIST=$(for i in `ls -1 -A -I "CVS" results`;do echo -n "$i [more...] "; done)
    if ! [ -z $RESULTS_LIST ] ;then
      while [ $RC -ne "1" ] 
      do
        dialog --clear
        dialog --backtitle "Linux Test Project Control Centre" \
               --title "LTP Test Results" \
               --menu "Move using[UP] [DOWN], Select using [ENTER]" 15 70 8 \
                      $RESULTS_LIST \
                      2>/tmp/runltp.results.$$ || RC=$?
        results_item=$(cat /tmp/runltp.results.$$)
        if ! [ -z $results_item ];then
          dialog --clear
          dialog --backtitle "Linux Test Project Control Centre" \
                 --title "LTP Test Results" \
                 --textbox results/$results_item 17 70
        
          dialog --backtitle "Linux Test Project Control Centre" \
                 --title "LTP Test Results." \
                 --yesno "Would you like to share these results with the LTP \
                          community by posting it to the LTP results mailing list?" \
                          7 70 || RESPONSE=$?
          case $RESPONSE in 
              0) \
                  mail ltp-results@lists.sourceforge.net < \
                          ./results/$results_item ;
                  ;;
    
              1)  ;;
     
              255)  ;;
          esac
        fi
      done
    else
      dialog --clear
      dialog --backtitle "Linux Test Project Control Centre" \
             --title "LTP Test Results" \
             --msgbox "ERROR: No files to view in /results directory." 5 53 
    fi
    return
}


# Function:    flags_prompt
#
# Description: Prompt for and record user options for run duration and 
#	       test output direction
#
# Input:       none
#
# Output:      none 
flags_prompt()
{
    dialog --backtitle "Linux Test Project Control Centre"\
           --title "Output Direction" --clear\
	   --yesno "Would you like test output recorded to a file, instead of STDOUT?" 7 80
    RC=$?
    if [ $RC -eq "0" ]
    then
	dialog --backtitle "Linux Test Project Control Centre"\
               --title "Output Direction" --clear\
               --inputbox " Please enter the full path and \
                            name of the file where you wish \
                            to redirect output to" 17 80 \
                          2>/tmp/runltp.outdir.$$ ;
        flags_outfile=$(cat /tmp/runltp.outdir.$$ | awk '{print $1}') 
        ./ver_linux > $flags_outfile 2>&1
	RUNALL_FLAGS=" -o $flags_outfile"
    fi
    
    dialog --backtitle "Linux Test Project Control Centre"\
           --title "Test Duration" --clear\
	   --yesno "Would you like to specify test duration? \
                    Default is the length of one loop." 7 80
    RC=$?
    if [ $RC -eq "0" ]
    then
	dialog --backtitle "Linux Test Project Control Centre"\
	       --title "Test Duration - Interval Selection" --clear\
               --menu "Move using[UP] [DOWN], Select using [ENTER]" 15 70 4 \
                       s    "Seconds" \
                       m    "Minutes" \
                       h    "Hours" \
                       d    "Days" \
                  2>/tmp/runltp.interval.$$ ;
	flags_interval=$(cat /tmp/runltp.interval.$$ | awk '{print $1}') 
	case $flags_interval in
                s)	INTERVAL="seconds" ;;      
                m)      INTERVAL="minutes" ;;      
                h)      INTERVAL="hours"   ;;      
                d)      INTERVAL="days"    ;;      
        esac 

	echo $INTERVAL
	WINDOW_MSG="Please enter the number of $INTERVAL to run"
	dialog --backtitle "Linux Test Project Control Centre"\
               --title "Test Duration - Length Specification" --clear\
               --inputbox "$WINDOW_MSG" 7 80 \
		          2>/tmp/runltp.length.$$ ;
	flags_length=$(cat /tmp/runltp.length.$$ | awk '{print $1}')
        flags_duration="$flags_length$flags_interval"	
	RUNALL_FLAGS=" $RUNALL_FLAGS -t $flags_duration"
    fi
}

# Function:    exectest_screenout
# 
# Description: Execute tests by calling runalltests.sh, display test status 
#              in a window.
#
# Input:       none
# 
# Output:      messages printed by testcases.
exectest_screenout()
{
    RC=0    # setting return code to 0, to loop in while

    RESULTS_FILE=$(date +%Y-%m-%d.%H.%M.%S).$$

    # execute runalltests.sh with user defined command file.
    ./runalltests.sh -q -p $RUNALL_FLAGS -l results.$RESULTS_FILE \
	-f /tmp/runltp.test.list.$$  
    
    sleep 2

    return
}


# Function:    execute_ltp
#
# Description: This function provides a menu of testcases that can be
#              selected for execution. If networking tests are selected,
#              they require a remote machine and remote machines root
#              users password. The user will be prompted to enter this 
#              information in a text box.
#              The function checks to see if the ltp-mmddyy/testcases/bin
#              directory was created, this directory is created when the 
#              testcases are compiled and installed, if it is not found
#              an info message window will notify the user that LTP needs to
#              be compiled before tests can be executed.
#              This function creates the senatrio file based on the users
#              choice of testcases and uses the runalltests.sh script to 
#              execute these tests.
#              The messages printed by the testcases are displayed on this 
#              terminal.
#
# Input:       Users selection of testcases; scenario file.
#              
# Output:      Test selection window, Message window, 
#              information message window
execute_ltp()
{
    RC=0
    host_name=" "
    rhost_passwd=" "
    run_net_test=" "    

    if ! [ -d ./testcases/bin ] 
    then 
	display_info_msg "Executing LTP testcases" \
	    "The testcases must to be compiled inorder\
       to execute them. Returning to main menu. \
       Please select the Compile option." 
	return
    fi 

    LIST=$(for i in `ls -1 -A -I "CVS" runtest`; do echo -n "$i "; j=$(head -n1 runtest/$i | cut -d: -f2|sed s/" "/_/g); echo -n "$j off "; done) 
    dialog --backtitle "Linux Test Project Control Centre"\
           --title "Execute LTP" --clear\
           --checklist "Select [SPACEBAR] tests to run" 20 80 5 \
    	    $LIST \
            2>/tmp/runltp.choice.$$ || RC=$?
    size=`wc -m /tmp/runltp.choice.$$|awk '{print $1}'` 
    if [ $size -eq 0 ];then
      tst_choice=$(echo "NULL")
    else
      tst_choice=$(cat /tmp/runltp.choice.$$)
    fi
    if [[ $tst_choice == NULL ]];then
      RC=1
    fi
    case $RC in 
        0)    \
            for i in $tst_choice ;
            do \
                cat ./runtest/$(echo $i | sed -e 's/"//g') \
                   >> /tmp/runltp.test.list.$$ ;
                if [[ $(echo $i | sed -e 's/"//g') == "tcp_cmds" || \
		      $(echo $i | sed -e 's/"//g') == "tcp_cmds_noexpect" || \
                      $(echo $i | sed -e 's/"//g') == "multicast" || \
                      $(echo $i | sed -e 's/"//g') == "ipv6" || \
                      $(echo $i | sed -e 's/"//g') == "ipv6_noexpect" || \
                      $(echo $i | sed -e 's/"//g') == "nfs" || \
                      $(echo $i | sed -e 's/"//g') == "multicast" ]] ;
                then \
                    run_net_test="Y" ;
                fi ;
                                       
            done ;
            if ! [ -z $run_net_test ] ;
            then \
                dialog --backtitle "Linux Test Project Control Centre"\
                       --title "Execute LTP test cases" \
                       --clear \
                       --inputbox "You have chosen to execute testcases \
                                  that require a Remote Machine. \
                                  Please enter the fully qualified host \
                                  name" 17 80 $(hostname --long) \
                                  2>/tmp/runltp.out.$$ ;
                host_name=$(cat /tmp/runltp.out.$$ | awk '{print $1}') ;
                unset $RHOST ;
                RHOST=$host_name ;
                export RHOST;
                
                dialog --backtitle "Linux Test Project Control Centre"\
                       --title "Execute LTP test cases" \
                       --clear \
                       --inputbox " Please enter the root password \
                                     of this remote machine" 17 80 \
                        2>/tmp/runltp.out.$$ ;
                rhost_passwd=$(cat /tmp/runltp.out.$$ | awk '{print $1}') ;

                PASSWD=$rhost_passwd ;
                export PASSWD;
            fi ;

            if ! [ -d ./testcases/bin ] ;
            then \
                display_info_msg "Executing LTP testcases" \
                    "The testcases must to be compiled inorder\
                     to execute them. Returning to main menu. \
                     Please select the Compile option." ;
                return ;
            fi ;
        
            dialog --clear ;

	    flags_prompt ;
	
            exectest_screenout ;

            return ;;
        1)    \
            # echo "Cancel pressed" ;
            return ;;
        255)    \
            # echo "ESC pressed" ;
            return ;;
    esac
}


# Function:    about_ltpcc
#
# Description: This function displays a window containing a brief message
#              describing this programs functionality, and credits the author.
# 
# Input:       NONE 
#
# Output:      Message window, description of LTP Control Center.
about_ltpcc()
{
    display_info_msg "About LTP Control Centre" \
                     "The LTP Control Centre can be used to\
                     to compile, install and execute\
                     The Linux Test Project test suite. Written by\
                     Manoj Iyer <manjo@mail.utexas.edu>"
    return
}


# Function:    ltp_scenarios
#
# Description: This function displays a list of scenario files located 
#              in /runtest.  Users can list the contents of each file.
#
# Input:       Files from /runtest
#
# Output:      1) Menu selection containing each file as an option to list.
#              2) Contents of selected scenario.
ltp_scenarios()
{

RC=0
SCENARIOS=$(for i in `ls -1 -A -I "CVS" runtest`;do echo -n "$i [more...] "; done)

while [ $RC -ne "1" ] 
do
  dialog --clear
  dialog --backtitle "Linux Test Project Control Centre" \
         --title "LTP Scenario Files" \
         --menu "Move using[UP] [DOWN], Select using [ENTER]" 15 70 8 \
                $SCENARIOS \
                2>/tmp/runltp.scenario.$$ || RC=$?
  scenario_item=$(cat /tmp/runltp.scenario.$$)
  if ! [ -z $scenario_item ];then
    dialog --clear
    dialog --backtitle "Linux Test Project Control Centre" \
           --title "LTP Scenario Files" \
           --textbox runtest/$scenario_item 17 70
  fi
done	        
}


                 
# Function:    main
#
# Description: Displays the main menu to the LTP Control Centre. The menu
#              provides options to Compile, Execute, and View test execution
#              results.
#
# Calls:       about_ltpcc()      
#              compile_ltp()
#              execute_ltp()
#              disp_ltpres()
#
# Input:       NONE
#
# Output:      Menu selection of actions to perform.

# Global variables.
RC=0              # return code from commands and local functions
mmenu_item=" "
RHOST=" "
PASSWD=" "
RUNALL_FLAGS=" "
RESULTS_FILE=" "

# 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 --backtitle "Linux Test Project Control Centre" \
           --title "Main Menu" \
           --menu "Move using[UP] [DOWN], Select using [ENTER]" 15 70 5 \
                  About        "About LTP Control Centre" \
                  Compile      "Compile LTP testsuite" \
		  Details      "Details of scenario files" \
                  Execute      "Execute LTP testsuite" \
                  Results      "Display a summary of test results" \
                  2>/tmp/runltp.mainmenu.$$ || RC=$?

    case $RC in 
        0) mmenu_item=`cat /tmp/runltp.mainmenu.$$` ;
           # echo "return code = $RC" ;
           # echo "MENU ITEM = $mmenu_item" ;
           case $mmenu_item in
                About)        about_ltpcc    ;;
                Compile)      compile_ltp    ;;
		Details)      ltp_scenarios  ;;
                Execute)      execute_ltp    ;;
                Results)      disp_ltpres    ;;
           esac ;;

        1) display_info_msg "Good Bye!" \
                            "Thank you for using Linux Test Project test suite.\
                             Please visit our project website \
                             http://ltp.sourceforge.net \
                             for latest news on The Linux Test Project. "
           exit ;;

        255) display_info_msg "Good Bye!" \
                            "Thank you for using Linux Test Project test suite.\
                             Please visit our project website\
                             http://ltp.sourceforge.net for latest news\
                             on The Linux Test Project. "
            exit;;
    esac
done
