0N/A#!/bin/sh
0N/A
0N/A#
3909N/A# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
0N/A# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A#
0N/A# This code is free software; you can redistribute it and/or modify it
0N/A# under the terms of the GNU General Public License version 2 only, as
0N/A# published by the Free Software Foundation.
0N/A#
0N/A# This code is distributed in the hope that it will be useful, but WITHOUT
0N/A# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A# version 2 for more details (a copy is included in the LICENSE file that
0N/A# accompanied this code).
0N/A#
0N/A# You should have received a copy of the GNU General Public License version
0N/A# 2 along with this work; if not, write to the Free Software Foundation,
0N/A# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A#
2362N/A# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A# or visit www.oracle.com if you need additional information or have any
2362N/A# questions.
0N/A#
0N/A
0N/A
0N/A# @test
0N/A# @bug 4527279
0N/A# @summary Unit test for ProcessAttachingConnector
0N/A#
0N/A# @build ProcessAttachDebugger ProcessAttachDebuggee ShutdownDebuggee
0N/A# @run shell ProcessAttachTest.sh
0N/A
0N/Aif [ "${TESTJAVA}" = "" ]
0N/Athen
0N/A echo "TESTJAVA not set. Test cannot execute. Failed."
0N/A exit 1
0N/Afi
0N/A
0N/Aif [ "${TESTSRC}" = "" ]
0N/Athen
0N/A echo "TESTSRC not set. Test cannot execute. Failed."
0N/A exit 1
0N/Afi
0N/A
0N/Aif [ "${TESTCLASSES}" = "" ]
0N/Athen
0N/A echo "TESTCLASSES not set. Test cannot execute. Failed."
0N/A exit 1
0N/Afi
0N/A
0N/AJAVA="${TESTJAVA}/bin/java"
0N/A
0N/AOS=`uname -s`
0N/A
0N/Acase "$OS" in
2073N/A Windows*)
0N/A PS=";"
0N/A OS="Windows"
0N/A ;;
2073N/A CYGWIN*)
2073N/A PS=";"
2073N/A OS="CYGWIN"
2073N/A ;;
0N/A * )
0N/A PS=":"
0N/A ;;
0N/Aesac
0N/A
0N/AstartDebuggee()
0N/A{
0N/A OUTPUTFILE=${TESTCLASSES}/Debuggee.out
0N/A ${JAVA} "$@" > ${OUTPUTFILE} &
2073N/A startpid="$!"
2073N/A pid="${startpid}"
0N/A
2073N/A # CYGWIN startpid is not the native windows PID we want, get the WINPID
2073N/A if [ "${OS}" = "CYGWIN" ]; then
2073N/A sleep 2
2073N/A ps -l -p ${startpid}
2073N/A pid=`ps -l -p ${startpid} | tail -1 | awk '{print $4;}'`
2073N/A fi
2073N/A
0N/A # MKS creates an intermediate shell to launch ${JAVA} so
2073N/A # ${startpid} is not the actual pid. We have put in a small sleep
0N/A # to give the intermediate shell process time to launch the
0N/A # "java" process.
0N/A if [ "$OS" = "Windows" ]; then
0N/A sleep 2
2073N/A pid=`ps -o pid,ppid,comm|grep ${startpid}|grep "java"|cut -c1-6`
0N/A fi
0N/A
0N/A echo "Waiting for Debuggee to initialize..."
0N/A attempts=0
0N/A while true; do
0N/A sleep 1
0N/A out=`tail -1 ${OUTPUTFILE}`
0N/A if [ ! -z "$out" ]; then
0N/A break
0N/A fi
0N/A attempts=`expr $attempts + 1`
0N/A echo "Waiting $attempts second(s) ..."
0N/A done
0N/A
2073N/A echo "Debuggee is process $pid (startpid=${startpid})"
0N/A}
0N/A
0N/AstopDebuggee()
0N/A{
0N/A $JAVA -classpath "${TESTCLASSES}" ShutdownDebuggee $1
0N/A if [ $? != 0 ] ; then
0N/A echo "Error: ShutdownDebuggee failed"
0N/A failures=`expr $failures + 1`
2073N/A kill -9 ${startpid}
0N/A fi
0N/A}
0N/A
0N/Afailures=0
0N/A
0N/A#########################################################
0N/Aecho "Test 1: Debuggee start with suspend=n"
0N/A
0N/APORTFILE="${TESTCLASSES}"/shutdown1.port
0N/A
0N/ADEBUGGEEFLAGS=
0N/Aif [ -r $TESTCLASSES/@debuggeeVMOptions ] ; then
0N/A DEBUGGEEFLAGS=`cat $TESTCLASSES/@debuggeeVMOptions`
0N/Aelif [ -r $TESTCLASSES/../@debuggeeVMOptions ] ; then
0N/A DEBUGGEEFLAGS=`cat $TESTCLASSES/../@debuggeeVMOptions`
0N/Afi
0N/A
0N/AstartDebuggee \
0N/A $DEBUGGEEFLAGS \
0N/A -agentlib:jdwp=transport=dt_socket,server=y,suspend=n \
0N/A -classpath "${TESTCLASSES}" ProcessAttachDebuggee "${PORTFILE}"
0N/A
2073N/A$JAVA -classpath "${TESTCLASSES}${PS}${TESTJAVA}/lib/tools.jar" \
0N/A ProcessAttachDebugger $pid 2>&1
0N/Aif [ $? != 0 ]; then failures=`expr $failures + 1`; fi
0N/A
0N/A# Note that when the debugger disconnects, the debuggee picks another
0N/A# port and outputs another 'Listening for transport ... ' msg.
0N/A
0N/AstopDebuggee "${PORTFILE}"
0N/A
0N/A#########################################################
0N/Aecho "\nTest 2: Debuggee start with suspend=y"
0N/A
0N/APORTFILE="${TESTCLASSES}"/shutdown2.port
0N/AstartDebuggee \
0N/A $DEBUGGEEFLAGS \
0N/A -agentlib:jdwp=transport=dt_socket,server=y,suspend=y \
0N/A -classpath "${TESTCLASSES}" ProcessAttachDebuggee "${PORTFILE}"
0N/A
2073N/A$JAVA -classpath "${TESTCLASSES}${PS}${TESTJAVA}/lib/tools.jar" \
0N/A ProcessAttachDebugger $pid 2>&1
0N/A
0N/A# The debuggee is suspended and doesn't run until the debugger
0N/A# disconnects. We have to give it time to write the port number
0N/A# to ${PORTFILE}
0N/Asleep 10
0N/A
0N/Aif [ $? != 0 ]; then failures=`expr $failures + 1`; fi
0N/AstopDebuggee "${PORTFILE}"
0N/A
0N/A###
0N/Aif [ $failures = 0 ];
0N/A then echo "All tests passed.";
0N/A else echo "$failures test(s) failed:"; cat ${OUTPUTFILE};
0N/Afi
0N/Aexit $failures