#!/usr/bin/ksh
#
# Name: fvt-client-3
#
# Purpose:
#    Handles CMVC commands that are issued from a client 
#    for objects such as defects, tracks, files, levels, etc.
#
# Notes:
#
# 1) This script should be run after the fvt-common-1 script.
#
# 2) This script can be run from either the CMVC family user id
#    or a CMVC client user id, because only client CMVC commands
#    are used.
#
# 3) To invoke this shell script and redirect standard output and
#    standard error to a file (such as fvt-client-3.out) do the
#    following (the -s flag is "silent mode" to avoid prompts to the
#    user):
#
#    ./fvt-client-3  -s  2>&1  | tee fvt-client-3.out
#
# Return codes:                                                   
#  0 = All commands were successful                               
#  1 = At least one command failed, see the output file and search
#      for the keyword "ERROR".                                   
#
######################################################################.#########

# ----------------------------
# Subroutine to print the usage
# ----------------------------

usage()
{
 print "USAGE: fvt-client-3 [-h] [-s]"
 print "WHERE: -h = help       -s = silent (no prompts)"
 print "PREREQUISITES:"
 print " - The CMVC family to be used should be only for FVT purposes."
 print " - "mkdb -d" should have been used to create this CMVC family "
 print " - The workstation login of the CMVC family must have"
 print "   client access to the family as well as superuser privilege."
 print " - The CMVC_FAMILY environment variable must be set. "
 print " - The CMVC_HOME environment variable must be set. (such as /usr/lpp/cmvc )"
 print " - The directory, fvt, must exist relative to the CMVC family "
 print "   account's home directory (such as /home/cmfvt/fvt)"
 print " - Run fvt-client-3 from the fvt directory."
 print "fvt-client-3: exiting now with rc=1."
 exit 1
}

# ----------------------------------
# Subroutine to terminate abnormally
# ----------------------------------

terminate()
{
 print "The populate action for the CMVC family was not successful."
 print "Recreating the family may be necessary before running fvt-client-3 again,"
 print "that is, you must use 'rmdb', 'rmfamily', 'mkfamily' and 'mkdb -d',"
 print "then issue: fvt-common-1 and optionally, fvt-server-2. "
 print "fvt-client-3 terminated, exiting now with rc=1."
 dateTest=`date`
 print "End of testing at: $dateTest"
 print ""
 exit 1
}

# ---------------------------------------------------------------------------
# CMVC commands are called in a subroutine so that return code can be
# checked for possible errors.
# ---------------------------------------------------------------------------


AcceptDefect()
{
 Defect -accept $1 -answer $2 -become $3 -verbose
 if [ $? -ne 0 ]
 then
  print "ERROR found in Defect -accept $1"
  let "errorCounter = errorCounter + 1"
 fi
}

AssignDefect()
{
 Defect -assign $1 -owner $2 -become $3 -verbose
 if [ $? -ne 0 ]
 then
  print "ERROR found in Defect -assign $1"
  let "errorCounter = errorCounter + 1"
 fi
}

MarkDefectApprovalRecord()
{
 Approval -$1 -defect $2 -release $3 -approver $4 -become $5 -verbose
 if [ $? -ne 0 ]
 then
  print "ERROR found in Approval -$1 -defect $2"
  let "errorCounter = errorCounter + 1"
 fi
}

MarkDefectFixRecord()
{
 Fix -$1 -defect $2 -release $3 -component $4 -become $5 -verbose
 if [ $? -ne 0 ]
 then
  print "ERROR found in Fix -$1 -defect $2"
  let "errorCounter = errorCounter + 1"
 fi
}

MarkDefectTestRecord()
{
 Test -$1 -defect $2 -release $3 -environment $4 -tester $5 -become $6 -verbose
 if [ $? -ne 0 ]
 then
  print "ERROR found in Test -$1 -defect $2"
  let "errorCounter = errorCounter + 1"
 fi
}

MarkDefectVerifyRecord()
{
 Verify -$1 -defect $2 -tester $3 -become $4 -verbose
 if [ $? -ne 0 ]
 then
  print "ERROR found in Verify -$1 -defect $2"
  let "errorCounter = errorCounter + 1"
 fi
}

CreateDefectTrack()
{
 Track -create -defect $1 -release $2 -target $3 -become $4 -verbose
 if [ $? -ne 0 ]
 then
  print "ERROR found in Track -create -defect $1"
  let "errorCounter = errorCounter + 1"
 fi
}

CreateLevel()
{
 Level -create $1 -release $2 -type $3 -become $4 -verbose
 if [ $? -ne 0 ]
 then
  print "ERROR found in Level -create $1 -release $2"
  let "errorCounter = errorCounter + 1"
 fi
}

CreateDefectLevelMember()
{
 LevelMember -create -level $1 -release $2 -defect $3 -become $4 -verbose
 if [ $? -ne 0 ]
 then
  print "ERROR found in LevelMember -create -level $1 -release $2 -defect $3"
  let "errorCounter = errorCounter + 1"
 fi
}

CommitLevel()
{
 Level -commit $1 -release $2 -become $3 -verbose
 if [ $? -ne 0 ]
 then
  print "ERROR found in Level -commit $1 -release $2"
  let "errorCounter = errorCounter + 1"
 fi
}

CompleteLevel()
{
 Level -complete $1 -release $2 -become $3 -verbose
 if [ $? -ne 0 ]
 then
  print "ERROR found in Level -complete $1 -release $2"
  let "errorCounter = errorCounter + 1"
 fi
}


################################################################################

# --------------------------------------------
# Main routine for this script 
# --------------------------------------------

CALLER=`basename $0`                    # The Caller name
SILENT="no"                             # User wants prompts
let "errorCounter = 0"

# ----------------------------------
# Handle keyword parameters (flags).
# ----------------------------------

set -- `getopt hs $* 2>/dev/null`       # -h = help & -s = silent

if [ $? != 0 ]
then
 print "Unknown flag(s)"
 usage
fi

while [ "$1" != -- ]                    # While $1 is not the termination char
 do
  case "$1" in
   -h) usage "HELP";            shift;; # Help requested
   -s) SILENT="yes";            shift;; # Prompt is not needed
  esac
 done

shift                                   # Shift pass --

# ------------------------------------------------
# The following CMVC environment variables must be set
# ------------------------------------------------

[ -z "$CMVC_FAMILY" ] && { print "The environment variable CMVC_FAMILY is not set."; usage; }
[ -z "$CMVC_HOME" ] && { print "The environment variable CMVC_HOME is not set."; usage; }
[ -z "$DEMO_CLIENT_LOGIN" ] && { print "The environment variable DEMO_CLIENT_LOGIN is not set."; usage; }
[ -z "$DEMO_CLIENT_HOSTNAME" ] && { print "The environment variable DEMO_CLIENT_HOSTNAME is not set."; usage; }

#---------------------------------------
# What is the system login?
#---------------------------------------

THISUSERID=$LOGNAME

#---------------------------------------
# Setup the CMVC user ID
#---------------------------------------

CMVC_BECOME=$THISUSERID
export CMVC_BECOME

# ---------------------------------------------------
# Make sure that this user can access the CMVC family
# ---------------------------------------------------

Report -testServer > /dev/null
if [ $? -ne 0 ]
then
 print "Cannot access the CMVC family $CMVC_FAMILY"
 usage
fi

# --------------------------------------------------
# Everything seems to be OK, prompt for comfirmation
# --------------------------------------------------

if [ "$SILENT" = "yes" ]
then
 RESPONSE="y"
else
 print "This script will perform FVT client actions on the "
 print "CMVC family: $CMVC_FAMILY"
 print "Do you wish to proceed [y or n]? "
 read RESPONSE                         # Wait for response
 [ -z "$RESPONSE" ] && RESPONSE="n"
fi

case "$RESPONSE" in
 [yY]|[yY][eE]|[yY][eE][sS])
 ;;
 *)
  print "$CALLER terminated with rc=1."
  exit 1
 ;;
esac

# --------------------------------------------------
print "Subject: CMVC 2.3.1, FVT testing, Client, Part 3"
dateTest=`date`
print "Begin testing at: $dateTest"
print ""
print "Family: $CMVC_FAMILY"
print "Testcase: fvt-client-3"
print ""
# --------------------------------------------------

# -------------------------------------------------------
print ""
print "Querying for the configurable fields for Defects and Features"
# -------------------------------------------------------
Defect -configInfo
Feature -configInfo

# -------------------------------------------------------
print ""
print "Opening Defects 1020 for text files"
# -------------------------------------------------------

Defect -open -name 1020 -component CodeA -release track-level-1.1 \
   -remarks "Text file for ProjectA on HPUX"  \
   -prefix d -severity 1 \
   -symptom build_failed -phaseFound development -become jill
if [ $? -ne 0 ]
then
 print "ERROR found in Defect -open 1020"
 let "errorCounter = errorCounter + 1"
fi

AcceptDefect 1020 comply_with jill

CreateDefectTrack 1020 track-level-1.1 02 jill
CreateDefectTrack 1020 track-level-1.2 02 jill

export CMVC_BECOME=dale

# -------------------------------------------------------
print ""
print "Versioning text files for defect 1020."
# -------------------------------------------------------

print ""
print "File softtar.mk was already checked out in fvt-common-1."
print "Adding a new line to softtar.mk"
echo "this is a new line" >> softtar.mk

File -checkin softtar.mk -release track-level-1.2  \
     -relative $HOME/fvt -defect 1020 \
     -remarks "fixed up the paths" -force -verbose -become ted
if [ $? -ne 0 ]
then
 print "ERROR found in File -checkin softtar.mk"
 let "errorCounter = errorCounter + 1"
fi

File -checkout softtar.c -release track-level-1.1  \
     -relative $HOME/fvt -verbose
if [ $? -ne 0 ]
then
 print "ERROR found in File -checkout softtar.c"
 let "errorCounter = errorCounter + 1"
fi

File -checkin softtar.c -release track-level-1.1  \
     -relative $HOME/fvt -defect 1020 \
     -remarks "fixed up the paths" -force -verbose
if [ $? -ne 0 ]
then
 print "ERROR found in File -checkin softtar.c"
 let "errorCounter = errorCounter + 1"
fi

# --------------------------------------------------
print ""
print "Processing level 02 for release track-level-1.1"
# --------------------------------------------------
MarkDefectFixRecord complete 1020 track-level-1.1 CodeA dale

CreateLevel 02 track-level-1.1 development ted
CreateDefectLevelMember 02 track-level-1.1 1020 ted
CommitLevel   02 track-level-1.1 ted
CompleteLevel 02 track-level-1.1 ted

MarkDefectVerifyRecord accept 1020 jill jill

# -------------------------------------------------------
print ""
print "Creating component CodeC and release track-level-3 and level 1"
# -------------------------------------------------------

Component -create CodeC -parent root -owner jill -description "Component with all subprocesses" -process preship  -verbose -become $LOGNAME
if [ $? -ne 0 ]
then
  print "ERROR found in Component -create CodeC"
  let "errorCounter = errorCounter + 1"
fi

Access -create -component CodeC -login jill -authority componentlead \
   -become $LOGNAME -verbose
if [ $? -ne 0 ]
then
  print "ERROR found in Access -login jill as componentlead"
  let "errorCounter = errorCounter + 1"
fi

Access -create -component CodeC -login jill -authority projectlead    \
   -become $LOGNAME -verbose
if [ $? -ne 0 ]
then
  print "ERROR found in Access -login jill as projectlead"
  let "errorCounter = errorCounter + 1"
fi

export CMVC_BECOME=jill

Release  -create track-level-3 -component CodeC -process track_level \
         -description "Release with track-level" -verbose
if [ $? -ne 0 ]
then
  print "ERROR found in Release -create track-level-3"
  let "errorCounter = errorCounter + 1"
fi

Level -create 1 -release track-level-3 -type other -verbose
if [ $? -ne 0 ]
then
  print "ERROR found in Level -create 1 for release track-level-3"
  let "errorCounter = errorCounter + 1"
fi
# -------------------------------------------------------
print ""
print "Opening defect 1021, handle DSR and accept it" 
# -------------------------------------------------------

Defect -open  -name 1021 -component CodeC  -remarks "Defect 1021"  -prefix c \
       -severity 1 -symptom build_failed -phaseFound beta_test -verbose
if [ $? -ne 0 ]
then
  print "ERROR found in Defect -open -name 1021"
  let "errorCounter = errorCounter + 1"
fi

Defect  -design 1021  -remarks "Designing" -verbose
if [ $? -ne 0 ]
then
  print "ERROR found in Defect -design 1021"
  let "errorCounter = errorCounter + 1"
fi

Defect  -size 1021  -remarks "Sizing" -verbose
if [ $? -ne 0 ]
then
  print "ERROR found in Defect -size 1021"
  let "errorCounter = errorCounter + 1"
fi

Size -create  -feature 1021 -component CodeC -release track-level-3 -verbose
if [ $? -ne 0 ]
then
  print "ERROR found in Size -create 1021"
  let "errorCounter = errorCounter + 1"
fi

Size -accept -feature 1021 -component CodeC -release track-level-3 \
     -sizing "10 person months" -verbose
if [ $? -ne 0 ]
then
  print "ERROR found in Size -accept 1021"
  let "errorCounter = errorCounter + 1"
fi

Defect  -review 1021  -remarks  "Reviewing" -verbose
if [ $? -ne 0 ]
then
  print "ERROR found in Defect -review 1021"
  let "errorCounter = errorCounter + 1"
fi

Report -view config -raw -where "type = 'answerAccept'"  | sort +0 -1
if [ $? -ne 0 ]
then
  print "ERROR found in Report -view config for type='answerAccept'"
  let "errorCounter = errorCounter + 1"
fi

Defect  -accept 1021  -answer comply_with -verbose
if [ $? -ne 0 ]
then
  print "ERROR found in Defect -accept 1021"
  let "errorCounter = errorCounter + 1"
fi

# -------------------------------------------------------
print ""
print "Opening defect 1022, handle DSR and accept it" 
# -------------------------------------------------------

Defect -open  -name 1022 -component CodeC  -remarks "Defect 1022"  -prefix d \
       -severity 2 -symptom core_dump -phaseFound building -verbose
if [ $? -ne 0 ]
then
  print "ERROR found in Defect -open -name 1022"
  let "errorCounter = errorCounter + 1"
fi

Defect  -design 1022  -remarks "Designing" -verbose
if [ $? -ne 0 ]
then
  print "ERROR found in Defect -design 1022"
  let "errorCounter = errorCounter + 1"
fi

Defect  -size 1022  -remarks "Sizing" -verbose
if [ $? -ne 0 ]
then
  print "ERROR found in Defect -size 1022"
  let "errorCounter = errorCounter + 1"
fi

Defect  -review 1022  -remarks  "Reviewing" -verbose
if [ $? -ne 0 ]
then
  print "ERROR found in Defect -review 1022"
  let "errorCounter = errorCounter + 1"
fi

Defect  -accept 1022  -answer comply_with -verbose
if [ $? -ne 0 ]
then
  print "ERROR found in Defect -accept 1022"
  let "errorCounter = errorCounter + 1"
fi

# -------------------------------------------------------
print ""
print "Creating track 1022, then a Coreq." 
# -------------------------------------------------------

Report -raw -view  TrackView  \
       -where "defectName in ('1021','1022') order by defectName, releaseName, state"
if [ $? -ne 0 ]
then
  print "ERROR found in Report -view TrackView for 1021,1022'"
  let "errorCounter = errorCounter + 1"
fi

Track  -create -defect 1022  -release track-level-3 -verbose
if [ $? -ne 0 ]
then
  print "ERROR found in Track -create 1022"
  let "errorCounter = errorCounter + 1"
fi

Report -raw -view  TrackView  \
       -where "defectName in ('1021','1022') order by defectName, releaseName, state"
if [ $? -ne 0 ]
then
  print "ERROR found in Report -view TrackView for 1021,1022"
  let "errorCounter = errorCounter + 1"
fi

Coreq -create  -defect 1021 1022 -release track-level-3
if [ $? -ne 0 ]
then
  print "ERROR found in Coreq -create 1021,1022"
  let "errorCounter = errorCounter + 1"
fi

# -------------------------------------------------------
print ""
print "Handling tracks 1021 1022, coreq checking and integrate them " 
# -------------------------------------------------------

Track -long -view -defect 1021 -release track-level-3
if [ $? -ne 0 ]
then
  print "ERROR found in Track -long 1021"
  let "errorCounter = errorCounter + 1"
fi

Track -long -view -defect 1022 -release track-level-3
if [ $? -ne 0 ]
then
  print "ERROR found in Track -long 1022"
  let "errorCounter = errorCounter + 1"
fi

Fix -complete -defect 1021 -release track-level-3 -component CodeC
if [ $? -ne 0 ]
then
  print "ERROR found in Fix -complete 1021"
  let "errorCounter = errorCounter + 1"
fi

Track -check  -defect 1021  -release track-level-3 -verbose
if [ $? -ne 0 ]
then
  print "ERROR found in Track -check 1021"
  let "errorCounter = errorCounter + 1"
fi

Track -integrate  -defect 1022  -release track-level-3 -verbose
if [ $? -ne 0 ]
then
  print "ERROR found in Track -integrate 1022"
  let "errorCounter = errorCounter + 1"
fi

# -------------------------------------------------------
print ""
print "Handling Level 1 for release track-level-3"
# -------------------------------------------------------

LevelMember -create  -level 1  -release track-level-3 -defect 1021 1022 \
            -verbose
if [ $? -ne 0 ]
then
  print "ERROR found in LevelMember -create for 1021 and 1022"
  let "errorCounter = errorCounter + 1"
fi

Level -check 1  -release track-level-3 -verbose
if [ $? -ne 0 ]
then
  print "ERROR found in Level -check 1"
  let "errorCounter = errorCounter + 1"
fi

Level -commit 1  -release track-level-3 -verbose
if [ $? -ne 0 ]
then
  print "ERROR found in Level -commit 1"
  let "errorCounter = errorCounter + 1"
fi

Level -complete 1  -release track-level-3 -verbose
if [ $? -ne 0 ]
then
  print "ERROR found in Level -complete 1"
  let "errorCounter = errorCounter + 1"
fi

# -------------------------------------------------------
print ""
print "Reporting on the objects about completion of Level 1"
# -------------------------------------------------------

Report -raw -view  LevelView  -where "releaseName in ('track-level-3') order by releaseName, name"

Report -raw -view  TrackView  -where "defectName in ('1021','1022') order by defectName, releaseName, state"

Report -raw -view  DefectView  -where "compName in ('CodeC') order by name, compName, state"

Report -raw -view  VerifyView  -where "defectName in ('1021','1022') order by defectName, userLogin, state"

# -------------------------------------------------------
print ""
print "Verifying the records for 1021 and 1022, report again on Verify and Defects"
# -------------------------------------------------------

Verify -accept -defect 1021 -tester jill -verbose
if [ $? -ne 0 ]
then
  print "ERROR found in Verify -accept 1021"
  let "errorCounter = errorCounter + 1"
fi

Verify -reject -defect 1022 -tester jill -verbose
if [ $? -ne 0 ]
then
  print "ERROR found in Verify -reject 1022"
  let "errorCounter = errorCounter + 1"
fi

Report -raw -view  VerifyView  -where "defectName in ('1021','1022') order by defectName, userLogin, state"
Report -raw -view  DefectView  -where "compName in ('CodeC') order by name, compName, state"


# --------------------------------------------------
print ""
print "============================================================================="
print ""
# --------------------------------------------------

# --------------------------------------------------
print ""
print "Performing a report on all defects, ordered by date"
# --------------------------------------------------
Report -view DefectView -where "name like '%' order by addDate" -raw
if [ $? -ne 0 ]
then
 print "ERROR found in Report -view DefectView"
 let "errorCounter = errorCounter + 1"
fi

# --------------
# Exit
# --------------
if [ $errorCounter -ne 0 ]
then
 print ""
 print "*** $errorCounter ERRORS found during the execution of this test case. ***"
 terminate
else
 print ""
 print "*** Yeah! No errors were found during the execution of this test case. Yeah! ***"
fi

print ""
print "fvt-client-3 complete."
dateTest=`date`
print "End of testing at: $dateTest"
print ""

exit 0

# end of file
