#!/bin/sh

# Copyright (c) 2012, 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 JAWT.sh
# @bug 7190587
# @summary Tests Java AWT native interface library
# @author kshefov
# @run shell JAWT.sh

# NB: To run on Windows with MKS and Visual Studio compiler
# add the following options to jtreg: -e INCLUDE="%INCLUDE%;." -e LIB="%LIB%;."

if [ "${TESTSRC}" = "" ]
then TESTSRC=.
fi

if [ "${TESTJAVA}" = "" ]
then
  PARENT=`dirname \`which java\``
  TESTJAVA=`dirname ${PARENT}`
  echo "TESTJAVA not set, selecting " ${TESTJAVA}
  echo "If this is incorrect, try setting the variable manually."
fi

# set platform-dependent variables
OS=`uname -s`
case "$OS" in
  Linux )
    NULL=/dev/null
    PS=":"
    FS="/"
    ${TESTJAVA}${FS}bin${FS}java -version 2>&1 | grep '64-Bit' > $NULL
    if [ $? -eq '0' ]
    then
        ARCH="amd64"
    else
        ARCH="i386"
    fi
    SYST="linux"
    MAKEFILE="Makefile.unix"
    CC="gcc"
	MAKE="make"
	LD_LIBRARY_PATH="."
    ;;
  SunOS )
    NULL=/dev/null
    PS=":"
    FS="/"
    if [ `uname -p | grep -c 'sparc'` -gt '0' ]
    then
        ARCH="sparc"
    else
        ARCH="i386"
    fi
    SYST="solaris"
    MAKEFILE="Makefile.unix"
    CC="gcc"
	MAKE="make"
	LD_LIBRARY_PATH="."
    ;;
  Windows* )
    NULL=null
    PS=";"
    FS="\\"
    MAKEFILE="Makefile.win"
    CC="cl"
	MAKE="nmake"
	${TESTJAVA}${FS}bin${FS}java -d64 -version 2>&1 | grep '64-Bit' > $NULL
    if [ "$?" -eq '0' ]
    then
        ARCH="amd64"
    else
        ARCH="i386"
    fi
	SYST="windows"
    ;;
  CYGWIN* )
    NULL=/dev/null
    PS=":"
    FS="/"
    MAKEFILE="Makefile.cygwin"
    CC="gcc"
	${TESTJAVA}${FS}bin${FS}java -d64 -version 2>&1 | grep '64-Bit' > $NULL
    if [ "$?" -eq '0' ]
    then
        ARCH="amd64"
    else
        ARCH="i386"
    fi
	SYST="cygwin"	
	MAKE="make"
    ;;
  Darwin )
    echo "Test passed. This test is not for MacOS."
    exit 0;
    ;;
  * )
    echo "Unrecognized system!"
    exit 1;
    ;;
esac

# Skip unsupported platforms
case `uname -m` in
    arm* | ppc* )
      echo "Test passed. Not supported on current architecture."
      exit 0
      ;;
esac

echo "OS-ARCH is" ${SYST}-${ARCH}
${TESTJAVA}${FS}jre${FS}bin${FS}java -fullversion 2>&1

which ${MAKE} >${NULL} 2>&1
if [ "$?" -ne '0' ]
then
    echo "No make found. Test passed."
    exit 0
fi

which ${CC} >${NULL} 2>&1
if [ "$?" -ne '0' ]
then
    echo "No C compiler found. Test passed."
    exit 0
fi
case "$OS" in
    SunOS )
      ${CC} -v >${NULL} 2>&1
      if [ "$?" -ne '0' ]
      then
          echo "No C compiler found. Test passed."
          exit 0
      fi
esac

cp ${TESTSRC}${FS}${MAKEFILE} .

JAVA=${TESTJAVA}${FS}jre${FS}bin${FS}java
JAVAC=${TESTJAVA}${FS}bin${FS}javac
JAVAH=${TESTJAVA}${FS}bin${FS}javah

export CC SYST ARCH LD_LIBRARY_PATH

${JAVAC} -d . ${TESTSRC}${FS}MyCanvas.java
${JAVAH} -jni -classpath . -d . MyCanvas
${MAKE} -f ${MAKEFILE}
${JAVA} -classpath . MyCanvas

exit $?

