#!/bin/sh -x

# Copyright (c) 2011, 2013, 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.

# @test
# @bug 7169888
# @compile -XDignore.symbol.file JdpUnitTest.java JdpClient.java JdpDoSomething.java
# @run shell JdpTest.sh --jtreg --no-compile
# @summary No word Failed expected in the test output

_verbose=no
_jtreg=no
_compile=yes

# temporary disable jcmd related tests
# _testsuite="01,02,03,04,05"
_testsuite="01"

_pwd=`pwd`

_testclasses=".classes"
_testsrc="${_pwd}"
_lockFileName="JdpDoSomething.lck"

_logname=".classes/output.txt"
_last_pid=""

_ip="224.0.23.178"
_port="7095"
_jmxport="4545"

_do_compile(){
    # If the test run without JTReg, we have to compile it by our self
    # Under JTReg see @compile statement above
    # sun.* packages is not included to symbol file lib/ct.sym so we have
    # to ignore it

    if [ ! -d ${_testclasses} ]
    then
       mkdir -p ${_testclasses}
    fi

    rm -f ${_testclasses}/*.class

    # Compile testcase
    ${COMPILEJAVA}/bin/javac -XDignore.symbol.file -d ${_testclasses} \
                                             JdpUnitTest.java \
                                             JdpDoSomething.java \
                                             JdpClient.java


    if [ ! -f ${_testclasses}/JdpDoSomething.class -o ! -f ${_testclasses}/JdpClient.class -o ! -f ${_testclasses}/JdpUnitTest.class ]
    then
      echo "ERROR: Can't compile"
      exit 255
    fi
}


_app_start(){

  testappname=$1
  shift

  ${TESTJAVA}/bin/java -server $* -cp ${_testclasses} ${testappname}  >> ${_logname} 2>&1 &
 _last_pid=$!

# wait until VM is actually starts.
# please note, if vm doesn't start for some reason
# jtreg kills the test by timeout. Don't file a bug.
  cnt=1
  while true
  do
    npid=`_get_pid`
    if [ "${npid}" != "" ]
    then
      break
    fi
    if [ "${cnt}" = "10" ]
    then
      echo "ERROR: Test app not started. Please check machine resources before filing a bug."
      if [ "${_jtreg}" = "yes" ]
      then
          exit 255
      fi
      break
    fi
    cnt=`expr $cnt + 1`
    sleep 1
  done
}

_get_pid(){
    ${TESTJAVA}/bin/jps | sed -n "/Jdp/s/ .*//p"
}

_app_stop(){
   rm ${_lockFileName}

# wait until VM is actually shuts down
  while true
  do
    npid=`_get_pid`
    if [ "${npid}" = "" ]
    then
      break
    fi
    sleep 1
  done
}

_testme(){
  ${TESTJAVA}/bin/java \
  -cp ${_testclasses} \
  $* \
    -Dcom.sun.management.jdp.port=${_port} \
    -Dcom.sun.management.jdp.address=${_ip} \
  JdpClient
}


_jcmd(){
    ${TESTJAVA}/bin/jcmd JdpDoSomething $* > /dev/null 2>/dev/null
}


_echo(){
    echo "$*"
    echo "$*" >> ${_logname}
}

# ============= TESTS ======================================

test_01(){

    _echo "**** Test one ****"

    _app_start JdpUnitTest \
        -Dcom.sun.management.jdp.port=${_port} \
        -Dcom.sun.management.jdp.address=${_ip} \
        -Dcom.sun.management.jdp.name=testme \
        -Djava.rmi.server.hostname=localhost \
        -Dcom.sun.management.jdp.pause=5

    res=`_testme`

    case "${res}" in
     OK*)
        _echo "Passed"
     ;;
     *)
        _echo "Failed!"
     ;;
    esac

    _app_stop
}

test_02(){

    _echo "**** Test two ****"

    _app_start JdpDoSomething \
        -Dcom.sun.management.jdp.port=${_port} \
        -Dcom.sun.management.jdp.address=${_ip} \
        -Dcom.sun.management.jdp.pause=5 \
        -Dcom.sun.management.jdp.name=testme \
        -Djava.rmi.server.hostname=localhost \
        -Dcom.sun.management.jmxremote.port=${_jmxport} \
        -Dcom.sun.management.jmxremote.authenticate=false \
        -Dcom.sun.management.jmxremote.ssl=false

    res=`_testme`

    case "${res}" in
     OK*)
        _echo "Passed"
     ;;
     *)
        _echo "Failed!"
     ;;
    esac

    _app_stop
}

test_03(){

    _echo "**** Test three ****"

    _app_start JdpDoSomething

    _jcmd  ManagementAgent.start\
                jdp.port=${_port} \
                jdp.address=${_ip} \
                jdp.pause=5 \
                jdp.name=jcmdtest \
                jmxremote.port=${_jmxport} \
                jmxremote.authenticate=false \
                jmxremote.ssl=false

    res=`_testme`

    case "${res}" in
     OK*)
        _echo "Passed"
     ;;
     *)
        _echo "Failed!"
     ;;
    esac

    _app_stop
}

test_04(){

    _echo "**** Test four ****"

    _app_start JdpDoSomething \
        -Dcom.sun.management.jmxremote.autodiscovery=true \
        -Dcom.sun.management.jdp.name=testme \
        -Djava.rmi.server.hostname=localhost \
        -Dcom.sun.management.jmxremote.port=${_jmxport} \
        -Dcom.sun.management.jmxremote.authenticate=false \
        -Dcom.sun.management.jmxremote.ssl=false

    res=`_testme`

    case "${res}" in
     OK*)
        _echo "Passed"
     ;;
     *)
        _echo "Failed!"
     ;;
    esac

    _app_stop
}

test_05(){

    _echo "**** Test five ****"

    _app_start JdpDoSomething

    _jcmd  ManagementAgent.start\
                jmxremote.autodiscovery=true \
                jmxremote.port=${_jmxport} \
                jmxremote.authenticate=false \
                jmxremote.ssl=false


    res=`_testme`

    case "${res}" in
     OK*)
        _echo "Passed"
     ;;
     *)
        _echo "Failed!"
     ;;
    esac

    _app_stop
}


# ============= MAIN =======================================

if [ "x${TESTJAVA}" = "x" ]
then
  echo "TESTJAVA env have to be set"
  exit
fi

# COMPILEJAVA variable is set when we test jre
if [ "x${COMPILEJAVA}" = "x" ]
then
   COMPILEJAVA="${TESTJAVA}"
fi


#------------------------------------------------------------------------------
# reading parameters

for parm in "$@"
do
  case $parm in
      --verbose)      _verbose=yes  ;;
      --jtreg)        _jtreg=yes    ;;
      --no-compile)   _compile=no   ;;
      --testsuite=*)  _testsuite=`_echo $parm | sed "s,^--.*=\(.*\),\1,"`  ;;
      *)
        echo "Undefined parameter $parm. Try --help for help"
        exit
      ;;
  esac
done

if [ "${_compile}" = "yes" ]
then
  _do_compile
fi

if [ "${_jtreg}" = "yes" ]
then
  _testclasses=${TESTCLASSES}
  _testsrc=${TESTSRC}
  _logname="output.txt"
fi

# Make sure _tesclasses is absolute path
tt=`echo ${_testclasses} | sed -e 's,/,,'`
if [ "${tt}" = "${_testclasses}" ]
then
  _testclasses="${_pwd}/${_testclasses}"
fi

_policyname="${_testclasses}/policy"

rm -f ${_logname}
rm -f ${_policyname}

if [ -f ${_testsrc}/policy.tpl ]
then

cat ${_testsrc}/policy.tpl | \
     sed -e "s,@_TESTCLASSES@,${_testclasses},g" -e "s,@TESTJAVA@,${TESTJAVA},g" \
 > ${_policyname}

fi

# Local mode tests
for i in `echo ${_testsuite} | sed -e "s/,/ /g"`
do
  test_${i}
done
