1 #!/bin/ksh -p
   2 # Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
   3 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4 #
   5 # This code is free software; you can redistribute it and/or modify it
   6 # under the terms of the GNU General Public License version 2 only, as
   7 # published by the Free Software Foundation.
   8 #
   9 # This code is distributed in the hope that it will be useful, but WITHOUT
  10 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11 # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12 # version 2 for more details (a copy is included in the LICENSE file that
  13 # accompanied this code).
  14 #
  15 # You should have received a copy of the GNU General Public License version
  16 # 2 along with this work; if not, write to the Free Software Foundation,
  17 # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18 #
  19 # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20 # or visit www.oracle.com if you need additional information or have any
  21 # questions.
  22 #
  23 #   @test
  24 #
  25 #   @bug        6342404 7078379 8167503 8183351
  26 #
  27 #   @summary    Test verifies that incorrectly configured ImageIO plugin spi
  28 #               does not affect registration of other ImageIO plugin in the
  29 #               applet context.
  30 #
  31 #
  32 #   @compile    IIOPluginTest.java
  33 #   @compile    DummyReaderPluginSpi.java
  34 #   @run shell  BadPluginConfigurationTest.sh
  35 
  36 # There are several resources which need to be present before many
  37 #  shell scripts can run.  Following are examples of how to check for
  38 #  many common ones.
  39 #
  40 # Note that the shell used is the Korn Shell, KSH
  41 #
  42 # Also note, it is recommended that make files NOT be used.  Rather,
  43 #  put the individual commands directly into this file.  That way,
  44 #  it is possible to use command line arguments and other shell tech-
  45 #  niques to find the compiler, etc on different systems.  For example,
  46 #  a different path could be used depending on whether this were a
  47 #  Solaris or Win32 machine, which is more difficult (if even possible)
  48 #  in a make file.
  49 
  50 
  51 # Beginning of subroutines:
  52 status=1
  53 
  54 #Call this from anywhere to fail the test with an error message
  55 # usage: fail "reason why the test failed"
  56 fail()
  57  { echo "The test failed :-("
  58    echo "$*" 1>&2
  59    echo "exit status was $status"
  60    clean
  61    exit $status
  62  } #end of fail()
  63 
  64 #Call this from anywhere to pass the test with a message
  65 # usage: pass "reason why the test passed if applicable"
  66 pass()
  67  { echo "The test passed!!!"
  68    echo "$*" 1>&2
  69    clean
  70    exit 0
  71  } #end of pass()
  72 
  73 #Clean up the test_ext directory (PLUGINDST_DIR) before leaving
  74 clean()
  75  {
  76  echo "Removing PLUGINDST_DIR ${PLUGINDST_DIR}"
  77  if [ -n "${PLUGINDST_DIR}" -a -d "${PLUGINDST_DIR}" ] ; then
  78  rm -rf "${PLUGINDST_DIR}"
  79  fi
  80  }
  81 
  82 # end of subroutines
  83 
  84 
  85 # The beginning of the script proper
  86 
  87 # Checking for proper OS
  88 OS=`uname -s`
  89 MKTEMP="mktemp"
  90 case "$OS" in
  91    AIX )
  92       FILESEP="/"
  93       PATHSEP=":"
  94       TMP=`cd /tmp; pwd -P`
  95 
  96       type ${MKTEMP} > /dev/null 2>&1
  97 
  98       if ! [ $? -ne 0 ] ; then 
  99         MKTEMP="/opt/freeware/bin/mktemp"
 100       fi
 101       if ! [ -e ${MKTEMP} ] ; then 
 102         pass "Test skipped because no mktemp found on this machine"
 103       fi
 104       ;;
 105 
 106    Darwin | Linux )
 107       FILESEP="/"
 108       PATHSEP=":"
 109       TMP=`cd /tmp; pwd -P`
 110       ;;
 111 
 112    Windows* )
 113       FILESEP="\\"
 114       PATHSEP=";"
 115       TMP=`cd "${SystemRoot}/Temp"; echo ${PWD}`
 116       ;;
 117 
 118    CYGWIN* )
 119       FILESEP="/"
 120       PATHSEP=";"
 121       TMP="/tmp"
 122       ;;
 123 
 124    # catch all other OSs
 125    * )
 126       echo "Unrecognized system!  $OS"
 127       fail "Unrecognized system!  $OS"
 128       ;;
 129 esac
 130 
 131 # Want this test to run standalone as well as in the harness, so do the
 132 #  following to copy the test's directory into the harness's scratch directory
 133 #  and set all appropriate variables:
 134 
 135 if [ -z "${TESTJAVA}" ] ; then
 136    # TESTJAVA is not set, so the test is running stand-alone.
 137    # TESTJAVA holds the path to the root directory of the build of the JDK
 138    # to be tested.  That is, any java files run explicitly in this shell
 139    # should use TESTJAVA in the path to the java interpreter.
 140    # So, we'll set this to the JDK spec'd on the command line.  If none
 141    # is given on the command line, tell the user that and use a cheesy
 142    # default.
 143    # THIS IS THE JDK BEING TESTED.
 144    if [ -n "$1" ] ;
 145       then TESTJAVA=$1
 146       else fail "no JDK specified on command line!"
 147    fi
 148    TESTSRC=.
 149    TESTCLASSES=.
 150    STANDALONE=1;
 151 fi
 152 echo "JDK under test is: $TESTJAVA"
 153 
 154 #Deal with .class files:
 155 if [ -n "${STANDALONE}" ] ;
 156    then
 157    #if standalone, remind user to cd to dir. containing test before running it
 158    echo "Just a reminder: cd to the dir containing this test when running it"
 159    # then compile all .java files (if there are any) into .class files
 160    if [ -a *.java ] ;
 161       then echo "Reminder, this test should be in its own directory with all"
 162       echo "supporting files it needs in the directory with it."
 163       ${COMPILEJAVA}/bin/javac ./*.java ;
 164    fi
 165    # else in harness so copy all the class files from where jtreg put them
 166    # over to the scratch directory this test is running in.
 167    else cp ${TESTCLASSES}/*.class . ;
 168 fi
 169 
 170 #if in test harness, then copy the entire directory that the test is in over
 171 # to the scratch directory.  This catches any support files needed by the test.
 172 if [ -z "${STANDALONE}" ] ;
 173    then cp ${TESTSRC}/*.java .
 174 fi
 175 
 176 #Just before executing anything, make sure it has executable permission!
 177 chmod 777 ./*
 178 
 179 ###############  YOUR TEST CODE HERE!!!!!!!  #############
 180 
 181 #All files required for the test should be in the same directory with
 182 # this file.  If converting a standalone test to run with the harness,
 183 # as long as all files are in the same directory and it returns 0 for
 184 # pass, you should be able to cut and paste it into here and it will
 185 # run with the test harness.
 186 
 187 # This is an example of running something -- test
 188 # The stuff below catches the exit status of test then passes or fails
 189 # this shell test as appropriate ( 0 status is considered a pass here )
 190 
 191 echo
 192 echo ------ PREPARE TEST PLUGIN ---------
 193 
 194 # note that we can not use some subdirectory of the
 195 # scratch dir as the plugin dst dir because the test
 196 # app have file read permission for all subdirs of the
 197 # scratch dir
 198 
 199 PLUGINDST_DIR=$(${MKTEMP} -d ${TMP}/iio_test.XXXXXXXX)
 200 echo "Created PLUGINDST_DIR as ${PLUGINDST_DIR}"
 201 
 202 TEST_PLUGIN=dummy.jar
 203 
 204 # remove old service declaration
 205 if [ -d META-INF ] ; then
 206     rm -rf META-INF
 207 fi
 208 
 209 # generate the service declaration
 210 if [ ! -d META_INF ] ; then
 211      mkdir META-INF
 212      mkdir META-INF/services
 213 fi
 214 
 215 # add wrong record to the service configuration
 216 echo "BadReaderPluginSpi" >  META-INF/services/javax.imageio.spi.ImageReaderSpi
 217 
 218 echo "DummyReaderPluginSpi" >> META-INF/services/javax.imageio.spi.ImageReaderSpi
 219 
 220 
 221 ${TESTJAVA}/bin/jar -cvf ${TEST_PLUGIN} DummyReaderPluginSpi*.class META-INF/services/javax.imageio.spi.ImageReaderSpi
 222 
 223 echo ----- TEST PLUGIN IS READY --------
 224 echo
 225 echo ----- INSTALL PLUGIN --------
 226 echo "Install test plugin to ${PLUGINDST_DIR}"
 227 if [ -f ${PLUGINDST_DIR}/${TEST_PLUGIN} ] ; then
 228     echo "Remove old plugin..."
 229     rm -f ${PLUGINDST_DIR}/${TEST_PLUGIN}
 230 fi
 231 mv -f ${TEST_PLUGIN} ${PLUGINDST_DIR}
 232 if [ -f ${PLUGINDST_DIR}/${TEST_PLUGIN} ] ; then
 233     echo Test plugin is installed.
 234 else
 235     fail "Unable to install test plugin to $PLUGINDST_DIR"
 236 fi
 237 echo ----- PLUGIN IS INSTALLED ------
 238 echo
 239 echo ----- CLEAN PLUGIN TEMPORARY FILES -----
 240 rm -rf DummyReaderPluginSpi*.class META-INF
 241 echo ----- CLEANING IS COMPLETE -------
 242 echo
 243 
 244 
 245 case "$OS" in
 246    CYGWIN* )
 247       TEST_CODEBASE=$(cygpath -m ${PWD})
 248       TEST_PLUGIN_JAR=$(cygpath -m ${PLUGINDST_DIR}${FILESEP}${TEST_PLUGIN})
 249       ;;
 250 
 251    # catch all other OSs
 252    * )
 253       TEST_CODEBASE=${PWD}
 254       TEST_PLUGIN_JAR=${PLUGINDST_DIR}${FILESEP}${TEST_PLUGIN}
 255       ;;
 256 esac
 257 
 258 
 259 # Update policy file to grant read permission
 260 echo "grant codeBase \"file:${TEST_CODEBASE}\" {" > classpath.policy
 261 echo " permission java.io.FilePermission \"${TEST_PLUGIN_JAR}\", \"read\";" >> classpath.policy
 262 echo " permission java.util.PropertyPermission \"test.5076692.property\", \"read\";" >> classpath.policy
 263 echo "};" >> classpath.policy
 264 echo "grant codeBase \"file:${TEST_PLUGIN_JAR}\" {" >> classpath.policy
 265 echo " permission java.util.PropertyPermission \"test.5076692.property\", \"read\";" >> classpath.policy
 266 echo "};" >> classpath.policy
 267 
 268 echo ---------------------
 269 echo --- Applet policy ---
 270 echo ---------------------
 271 cat classpath.policy
 272 echo ---------------------
 273 echo
 274 
 275 echo -------------------------------
 276 echo ---  Applet Classpath Test  ---
 277 echo -------------------------------
 278 #
 279 # please note that we need to use "==" in setup of the java.security.policy
 280 # property in order to overwrite policies defined in the user policy file
 281 # For more details see:
 282 #  http://java.sun.com/j2se/1.5.0/docs/guide/security/PolicyFiles.html)
 283 #
 284 
 285 ${TESTJAVA}/bin/java ${TESTVMOPTS} -cp ".${PATHSEP}${TEST_PLUGIN_JAR}" \
 286     -Djava.security.policy==classpath.policy \
 287     -Djava.security.manager IIOPluginTest
 288 
 289 status=$?
 290 
 291 if [ $status -eq "0" ] ; then
 292     pass ""
 293 else
 294     fail "Test failed due to test plugin was not found."
 295 fi
 296