1#!/bin/ksh -p
2# Copyright (c) 2005, 2017, 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:
52status=1
53
54#Call this from anywhere to fail the test with an error message
55# usage: fail "reason why the test failed"
56fail()
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"
66pass()
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
74clean()
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
88OS=`uname -s`
89case "$OS" in
90   SunOS | Linux | Darwin )
91      FILESEP="/"
92      PATHSEP=":"
93      TMP=`cd /tmp; pwd -P`
94      ;;
95
96   Windows* )
97      FILESEP="\\"
98      PATHSEP=";"
99      TMP=`cd "${SystemRoot}/Temp"; echo ${PWD}`
100      ;;
101
102   CYGWIN* )
103      FILESEP="/"
104      PATHSEP=";"
105      TMP="/tmp"
106      ;;
107
108   # catch all other OSs
109   * )
110      echo "Unrecognized system!  $OS"
111      fail "Unrecognized system!  $OS"
112      ;;
113esac
114
115# Want this test to run standalone as well as in the harness, so do the
116#  following to copy the test's directory into the harness's scratch directory
117#  and set all appropriate variables:
118
119if [ -z "${TESTJAVA}" ] ; then
120   # TESTJAVA is not set, so the test is running stand-alone.
121   # TESTJAVA holds the path to the root directory of the build of the JDK
122   # to be tested.  That is, any java files run explicitly in this shell
123   # should use TESTJAVA in the path to the java interpreter.
124   # So, we'll set this to the JDK spec'd on the command line.  If none
125   # is given on the command line, tell the user that and use a cheesy
126   # default.
127   # THIS IS THE JDK BEING TESTED.
128   if [ -n "$1" ] ;
129      then TESTJAVA=$1
130      else fail "no JDK specified on command line!"
131   fi
132   TESTSRC=.
133   TESTCLASSES=.
134   STANDALONE=1;
135fi
136echo "JDK under test is: $TESTJAVA"
137
138#Deal with .class files:
139if [ -n "${STANDALONE}" ] ;
140   then
141   #if standalone, remind user to cd to dir. containing test before running it
142   echo "Just a reminder: cd to the dir containing this test when running it"
143   # then compile all .java files (if there are any) into .class files
144   if [ -a *.java ] ;
145      then echo "Reminder, this test should be in its own directory with all"
146      echo "supporting files it needs in the directory with it."
147      ${COMPILEJAVA}/bin/javac ./*.java ;
148   fi
149   # else in harness so copy all the class files from where jtreg put them
150   # over to the scratch directory this test is running in.
151   else cp ${TESTCLASSES}/*.class . ;
152fi
153
154#if in test harness, then copy the entire directory that the test is in over
155# to the scratch directory.  This catches any support files needed by the test.
156if [ -z "${STANDALONE}" ] ;
157   then cp ${TESTSRC}/*.java .
158fi
159
160#Just before executing anything, make sure it has executable permission!
161chmod 777 ./*
162
163###############  YOUR TEST CODE HERE!!!!!!!  #############
164
165#All files required for the test should be in the same directory with
166# this file.  If converting a standalone test to run with the harness,
167# as long as all files are in the same directory and it returns 0 for
168# pass, you should be able to cut and paste it into here and it will
169# run with the test harness.
170
171# This is an example of running something -- test
172# The stuff below catches the exit status of test then passes or fails
173# this shell test as appropriate ( 0 status is considered a pass here )
174
175echo
176echo ------ PREPARE TEST PLUGIN ---------
177
178# note that we can not use some subdirectory of the
179# scratch dir as the plugin dst dir because the test
180# app have file read permission for all subdirs of the
181# scratch dir
182
183PLUGINDST_DIR=$(mktemp -d ${TMP}/iio_test.XXXXXXXX)
184echo "Created PLUGINDST_DIR as ${PLUGINDST_DIR}"
185
186TEST_PLUGIN=dummy.jar
187
188# remove old service declaration
189if [ -d META-INF ] ; then
190    rm -rf META-INF
191fi
192
193# generate the service declaration
194if [ ! -d META_INF ] ; then
195     mkdir META-INF
196     mkdir META-INF/services
197fi
198
199# add wrong record to the service configuration
200echo "BadReaderPluginSpi" >  META-INF/services/javax.imageio.spi.ImageReaderSpi
201
202echo "DummyReaderPluginSpi" >> META-INF/services/javax.imageio.spi.ImageReaderSpi
203
204
205${TESTJAVA}/bin/jar -cvf ${TEST_PLUGIN} DummyReaderPluginSpi*.class META-INF/services/javax.imageio.spi.ImageReaderSpi
206
207echo ----- TEST PLUGIN IS READY --------
208echo
209echo ----- INSTALL PLUGIN --------
210echo "Install test plugin to ${PLUGINDST_DIR}"
211if [ -f ${PLUGINDST_DIR}/${TEST_PLUGIN} ] ; then
212    echo "Remove old plugin..."
213    rm -f ${PLUGINDST_DIR}/${TEST_PLUGIN}
214fi
215mv -f ${TEST_PLUGIN} ${PLUGINDST_DIR}
216if [ -f ${PLUGINDST_DIR}/${TEST_PLUGIN} ] ; then
217    echo Test plugin is installed.
218else
219    fail "Unable to install test plugin to $PLUGINDST_DIR"
220fi
221echo ----- PLUGIN IS INSTALLED ------
222echo
223echo ----- CLEAN PLUGIN TEMPORARY FILES -----
224rm -rf DummyReaderPluginSpi*.class META-INF
225echo ----- CLEANING IS COMPLETE -------
226echo
227
228
229case "$OS" in
230   CYGWIN* )
231      TEST_CODEBASE=$(cygpath -m ${PWD})
232      TEST_PLUGIN_JAR=$(cygpath -m ${PLUGINDST_DIR}${FILESEP}${TEST_PLUGIN})
233      ;;
234
235   # catch all other OSs
236   * )
237      TEST_CODEBASE=${PWD}
238      TEST_PLUGIN_JAR=${PLUGINDST_DIR}${FILESEP}${TEST_PLUGIN}
239      ;;
240esac
241
242
243# Update policy file to grant read permission
244echo "grant codeBase \"file:${TEST_CODEBASE}\" {" > classpath.policy
245echo " permission java.io.FilePermission \"${TEST_PLUGIN_JAR}\", \"read\";" >> classpath.policy
246echo " permission java.util.PropertyPermission \"test.5076692.property\", \"read\";" >> classpath.policy
247echo "};" >> classpath.policy
248echo "grant codeBase \"file:${TEST_PLUGIN_JAR}\" {" >> classpath.policy
249echo " permission java.util.PropertyPermission \"test.5076692.property\", \"read\";" >> classpath.policy
250echo "};" >> classpath.policy
251
252echo ---------------------
253echo --- Applet policy ---
254echo ---------------------
255cat classpath.policy
256echo ---------------------
257echo
258
259echo -------------------------------
260echo ---  Applet Classpath Test  ---
261echo -------------------------------
262#
263# please note that we need to use "==" in setup of the java.security.policy
264# property in order to overwrite policies defined in the user policy file
265# For more details see:
266#  http://java.sun.com/j2se/1.5.0/docs/guide/security/PolicyFiles.html)
267#
268
269${TESTJAVA}/bin/java ${TESTVMOPTS} -cp ".${PATHSEP}${TEST_PLUGIN_JAR}" \
270    -Djava.security.policy==classpath.policy \
271    -Djava.security.manager IIOPluginTest
272
273status=$?
274
275if [ $status -eq "0" ] ; then
276    pass ""
277else
278    fail "Test failed due to test plugin was not found."
279fi
280
281