#
# Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code 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
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#

#!/bin/ksh
#
# Script to build and launch the RMI reliability suite.
# This script is used to run the reliability test for a 
# certain number of hours.  This script is NOT used when 
# running the juicer and benchmark tests as part of the 
# jtreg regression suite.

JAVA_HOME=$1
WORK_DIR=$2
RES_DIR=$3
SHELLTOUSE=$4
SUITE_DIR=$5
NHOURS=$6
shift 6
VMOPTS=$*

###You need not export these variables if your reliability run is from this shell itself######
###If you are launching another shell then you need to export these variables.#######

if [ "${WORK_DIR}" = "" ] ; then
	WORK_DIR=`pwd`
fi
if [ "${RES_DIR}" = "" ] ; then
	RES_DIR=`pwd`/results
fi
if [ "${SHELLTOUSE}" = "" ] ; then
	SHELLTOUSE=ksh
fi
if [ "${JAVA_HOME}" = "" ] ; then
	WHENCEJAVA=`whence java`
	JAVABIN=`dirname ${WHENCEJAVA}`
	JAVA_HOME=`dirname ${JAVABIN}`
fi
if [ "${SUITE_DIR}" = "" ] ; then
	SUITE_DIR=`pwd`
fi
if [ "${VMOPTS}" = "" ] ; then
	VMOPTS=-server -showversion
fi
if [ "${NHOURS}" = "" ] ; then
	NHOURS=1
fi

export JAVA_HOME
export WORK_DIR
export RES_DIR
export SHELLTOUSE
export SUITE_DIR
export NHOURS
export VMOPTS

echo "######### launch_reliability script ##########"
echo "JAVA_HOME : $JAVA_HOME "
echo "WORK_DIR : $WORK_DIR "
echo "RES_DIR : $RES_DIR "
echo "SHELLTOUSE : $SHELLTOUSE "
echo "SUITE_DIR : $SUITE_DIR "
echo "NHOURS : $NHOURS "
echo "VMOPTS : $VMOPTS "


# set platform-dependent variables
if [ `uname` = "SunOS" ] ; then
        PATH_SEP=":"

elif [ `uname` = "Linux" ] ; then
        PATH_SEP=":"
else
        PATH_SEP=";"
fi

export PATH_SEP
mainpid=$$

mkdir -p ${RES_DIR}

rm -rf ${WORK_DIR}/rmibench_scratch
rm -rf ${WORK_DIR}/serialbench_scratch
rm -rf ${WORK_DIR}/juicer_scratch
mkdir -p ${WORK_DIR}/rmibench_scratch
mkdir -p ${WORK_DIR}/serialbench_scratch
mkdir -p ${WORK_DIR}/juicer_scratch

echo ""
echo "     Starting RMI bench test "
$SHELLTOUSE ${SUITE_DIR}/scripts/run_rmibench.ksh ${WORK_DIR}/rmibench_scratch $RES_DIR $JAVA_HOME $SUITE_DIR $NHOURS $VMOPTS &
pid1=$!

sleep 30
echo ""
echo "     Starting Serialization bench test "
$SHELLTOUSE ${SUITE_DIR}/scripts/run_serialbench.ksh ${WORK_DIR}/serialbench_scratch $RES_DIR $JAVA_HOME $SUITE_DIR $NHOURS $VMOPTS &
pid2=$!

sleep 30
echo ""
echo "     Starting RMI juicer test "
$SHELLTOUSE ${SUITE_DIR}/scripts/run_juicer.ksh ${WORK_DIR}/juicer_scratch $RES_DIR $JAVA_HOME $SUITE_DIR $NHOURS $VMOPTS &
pid3=$!

sleep 30
echo ""
echo "     Waiting for jobs to complete"

wait $pid1 $pid2 $pid3

echo ""
echo "     Done RMI reliability testing "

rm -rf ${WORK_DIR}/rmibench_scratch
rm -rf ${WORK_DIR}/serialbench_scratch
rm -rf ${WORK_DIR}/juicer_scratch

kill -9 $mainpid 

