#!/bin/ksh -p

#
# Copyright 2005-2006 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
# CA 95054 USA or visit www.sun.com if you need additional information or
# have any questions.
#

#
#   @test       PrivateTransportTest.sh
#   @bug        6225664 6220618
#   @summary    Test for when private transport library outside jdk
#   @author     Kelly O'Hair
#
#   @run compile -g HelloWorld.java
#   @run shell PrivateTransportTest.sh
#

# Beginning of subroutines:
status=1

#Call this from anywhere to fail the test with an error message
# usage: fail "reason why the test failed"
fail() 
 { echo "The test failed :-("
   echo "$*" 1>&2
   echo "exit status was $status"
   exit $status
 } #end of fail()

#Call this from anywhere to pass the test with a message
# usage: pass "reason why the test passed if applicable"
pass() 
 { echo "The test passed!!!"
   echo "$*" 1>&2
   exit 0
 } #end of pass()

# end of subroutines

# The beginning of the script proper

TARGETCLASS="HelloWorld"
if [ -z "${TESTJAVA}" ] ; then
   # TESTJAVA is not set, so the test is running stand-alone.
   # TESTJAVA holds the path to the root directory of the build of the JDK
   # to be tested.  That is, any java files run explicitly in this shell
   # should use TESTJAVA in the path to the java interpreter.
   # So, we'll set this to the JDK spec'd on the command line.  If none
   # is given on the command line, tell the user that and use a default.
   # THIS IS THE JDK BEING TESTED.
   if [ -n "$1" ] ; then
          TESTJAVA=$1
      else
	  TESTJAVA=$JAVA_HOME
   fi
   TESTSRC=.
   TESTCLASSES=.
   #Deal with .class files:
   ${TESTJAVA}/bin/javac -d ${TESTCLASSES} \
            -classpath "${TESTCLASSES}" -g \
            ${TARGETCLASS}.java
fi
#
echo "JDK under test is: $TESTJAVA"

# Get flags being sent to debuggee
DEBUGGEEFLAGS=
if [ -r $TESTCLASSES/@debuggeeVMOptions ] ; then
   DEBUGGEEFLAGS=`cat $TESTCLASSES/@debuggeeVMOptions`
elif [ -r $TESTCLASSES/../@debuggeeVMOptions ] ; then
   DEBUGGEEFLAGS=`cat $TESTCLASSES/../@debuggeeVMOptions`
fi

# Figure out what the libarch path is
os=`uname -s`

jreloc=${TESTJAVA}/jre
if [ ! -d ${jreloc} ] ; then
    jreloc=${TESTJAVA}
fi

libdir=${TESTCLASSES}

case `uname -s` in 
  SunOS)
    libarch=`uname -p`
    d64=`echo "${DEBUGGEEFLAGS}" | fgrep -- -d64`
    case `uname -p` in
      sparc)
	if [ "${d64}" != "" ] ; then
	    libarch=sparcv9
	fi
        ;;
      i386)
        if [ "${d64}" != "" ] ; then
	    libarch=amd64
	fi
        ;;
      *)
        echo "FAILURE:  Unknown uname -p: " `uname -p`
        exit 1
        ;;
    esac
    libloc=${jreloc}/lib/${libarch}
    ;;
  Linux)
    xx=`find ${jreloc}/lib -name libdt_socket.so`
    libloc=`dirname ${xx}`
    ;;
  Windows*)
    libloc=${jreloc}/bin
    sep=';'
    ;;
  CYGWIN*)
    libloc=${jreloc}/bin
    sep=':'

    # This is going onto PATH and cygwin needs the form
    # /cygdrive/j/x..... for that.
    libdir=`cygpath -u "$TESTCLASSES"`
    ;;
  *)
    echo "FAILURE:  Unknown uname -s: " `uname -s`
    exit 1
    ;;
esac

# Create private transport library
echo "Setup private transport library by copying an existing one and renaming"
private_transport=private_dt_socket
if [ -f ${libloc}/dt_socket.dll ] ; then
    fullpath=${libdir}/${private_transport}.dll
    rm -f ${fullpath}
    echo cp ${libloc}/dt_socket.dll ${fullpath}
    cp ${libloc}/dt_socket.dll ${fullpath}
    # make sure we can find libraries in current directory
    PATH="${PATH}${sep}${libdir}"
    export PATH
    echo PATH=${PATH}
elif [ -f ${libloc}/libdt_socket.so ] ; then
    fullpath=${libdir}/lib${private_transport}.so
    rm -f ${fullpath}
    echo cp ${libloc}/libdt_socket.so ${fullpath}
    cp ${libloc}/libdt_socket.so ${fullpath}
    # make sure we can find libraries in current directory
    if [ "${LD_LIBRARY_PATH}" = "" ] ; then
        LD_LIBRARY_PATH=${libdir}
    else
        LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${libdir}
    fi
    export LD_LIBRARY_PATH
    echo LD_LIBRARY_PATH=${LD_LIBRARY_PATH}
else 
    echo "cannot find dt_socket in ${libloc} for ${private_transport}"
    fail "cannot find dt_socket in ${libloc} for ${private_transport}"
fi

#
CP="-classpath \"${TESTCLASSES}\""
#
DEBUGGEEFLAGS="$DEBUGGEEFLAGS -agentlib:jdwp=transport=${private_transport},server=y,suspend=n"
               
echo ${TESTJAVA}/bin/java ${DEBUGGEEFLAGS} ${CP} ${TARGETCLASS}
eval ${TESTJAVA}/bin/java ${DEBUGGEEFLAGS} ${CP} ${TARGETCLASS}
status=$?
echo "test status for ${DEBUGGERFLAGS} was: $status"
if [ $status -ne 0 ] ; then 
    fail "unspecified test failure"
    exit 1
fi

pass "found private transport library"
exit 0

