MineField.sh revision 0
0N/A#!/bin/sh
0N/A
0N/A#
0N/A# Copyright 2003 Sun Microsystems, Inc. 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#
0N/A# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
0N/A# CA 95054 USA or visit www.sun.com if you need additional information or
0N/A# have any questions.
0N/A#
0N/A
0N/A#
0N/A# @test
0N/A# @bug 4758537 4809833
0N/A# @summary Test that javac and java find files in similar ways
0N/A# @author Martin Buchholz
0N/A#
0N/A# @run shell/timeout=600 MineField.sh
0N/A
0N/A# To run this test manually, simply do ./MineField.sh
0N/A
0N/A#----------------------------------------------------------------
0N/A# The search order for classes used by both java and javac is:
0N/A#
0N/A# -Xbootclasspath/p:<path>
0N/A# -endorseddirs <dirs> or -Djava.endorsed.dirs=<dirs> (search for jar/zip only)
0N/A# -bootclasspath <path> or -Xbootclasspath:<path>
0N/A# -Xbootclasspath/a:<path>
0N/A# -extdirs <dirs> or -Djava.ext.dirs=<dirs> (search for jar/zip only)
0N/A# -classpath <path>, -cp <path>, env CLASSPATH=<path>
0N/A#
0N/A# Peculiarities of the class file search:
0N/A# - Empty elements of the (user) classpath default to ".",
0N/A# while empty elements of other paths are ignored.
0N/A# - Only for the user classpath is an empty string value equivalent to "."
0N/A# - Specifying a bootclasspath on the command line obliterates any
0N/A# previous -Xbootclasspath/p: or -Xbootclasspath/a: command line flags.
0N/A#----------------------------------------------------------------
0N/A
0N/A. ${TESTSRC-.}/Util.sh
0N/A
0N/Aset -u
0N/A
0N/ABCP=`DefaultBootClassPath`
0N/A
0N/A#----------------------------------------------------------------
0N/A# Prepare the "Minefield"
0N/A#----------------------------------------------------------------
0N/ACleanup() {
0N/A Sys rm -rf GooSrc GooJar GooZip GooClass
0N/A Sys rm -rf BadSrc BadJar BadZip BadClass
0N/A Sys rm -rf OneDir *.class Main.java MANIFEST.MF
0N/A}
0N/A
0N/ACleanup
0N/ASys mkdir GooSrc GooJar GooZip GooClass
0N/ASys mkdir BadSrc BadJar BadZip BadClass
0N/A
0N/Aecho 'public class Lib {public static void f(){}}' > Lib.java
0N/ASys "$javac" ${TESTTOOLVMOPTS} Lib.java
0N/ASys "$jar" cf GooJar/Lib.jar Lib.class
0N/ASys "$jar" cf GooZip/Lib.zip Lib.class
0N/ASys mv Lib.class GooClass/.
0N/ASys mv Lib.java GooSrc/.
0N/ACheckFiles GooZip/Lib.zip GooJar/Lib.jar GooSrc/Lib.java
0N/A
0N/Aecho 'public class Lib {/* Bad */}' > Lib.java
0N/ASys "$javac" ${TESTTOOLVMOPTS} Lib.java
0N/ASys "$jar" cf BadJar/Lib.jar Lib.class
0N/ASys "$jar" cf BadZip/Lib.zip Lib.class
0N/ASys mv Lib.class BadClass/.
0N/ASys mv Lib.java BadSrc/.
0N/ACheckFiles BadZip/Lib.zip BadJar/Lib.jar BadSrc/Lib.java
0N/A
0N/Aecho 'public class Main {public static void main(String[] a) {Lib.f();}}' > Main.java
0N/A
0N/A#----------------------------------------------------------------
0N/A# Verify that javac class search order is the same as java's
0N/A#----------------------------------------------------------------
0N/AFailure "$javac" ${TESTTOOLVMOPTS} \
0N/A -Xbootclasspath/p:"BadClass" \
0N/A -J-Djava.endorsed.dirs="GooJar" \
0N/A Main.java
0N/ASuccess "$javac" ${TESTTOOLVMOPTS} \
0N/A -Xbootclasspath/p:"GooClass${PS}BadJar/Lib.jar" \
0N/A -J-Djava.endorsed.dirs="BadJar${PS}GooZip" \
0N/A Main.java
0N/AFailure "$java" ${TESTVMOPTS} \
0N/A -Xbootclasspath/p:"BadClass" \
0N/A -Djava.endorsed.dirs="GooJar" \
0N/A Main
0N/ASuccess "$java" ${TESTVMOPTS} \
0N/A -Xbootclasspath/p:"GooClass${PS}BadJar/Lib.jar" \
0N/A -Djava.endorsed.dirs="BadJar${PS}GooZip" \
0N/A Main
0N/A
0N/A#----------------------------------------------------------------
0N/AFailure "$javac" ${TESTTOOLVMOPTS} \
0N/A -Xbootclasspath/p:"GooClass" \
0N/A -bootclasspath "$BCP${PS}BadZip/Lib.zip" \
0N/A Main.java
0N/ASuccess "$javac" ${TESTTOOLVMOPTS} \
0N/A -Xbootclasspath/p:"BadClass${PS}GooClass" \
0N/A -bootclasspath "$BCP${PS}GooZip/Lib.zip${PS}BadClass" \
0N/A Main.java
0N/ASuccess "$javac" ${TESTTOOLVMOPTS} \
0N/A -Xbootclasspath/p:"BadJar/Lib.jar" \
0N/A -Xbootclasspath:"$BCP${PS}GooClass" \
0N/A Main.java
0N/AFailure "$java" ${TESTVMOPTS} \
0N/A -Xbootclasspath/p:"GooClass" \
0N/A -Xbootclasspath:"$BCP${PS}BadZip/Lib.zip" \
0N/A Main
0N/ASuccess "$java" ${TESTVMOPTS} \
0N/A -Xbootclasspath/p:"BadClass${PS}GooClass" \
0N/A -Xbootclasspath:"$BCP${PS}GooZip/Lib.zip${PS}BadClass" \
0N/A Main
0N/A
0N/A#----------------------------------------------------------------
0N/AFailure "$javac" ${TESTTOOLVMOPTS} \
0N/A -bootclasspath "$BCP${PS}GooZip/Lib.zip" \
0N/A -Xbootclasspath/p:"BadClass" \
0N/A Main.java
0N/ASuccess "$javac" ${TESTTOOLVMOPTS} \
0N/A -bootclasspath "$BCP${PS}BadZip/Lib.zip" \
0N/A -Xbootclasspath/p:"GooClass${PS}BadJar/Lib.jar" \
0N/A Main.java
0N/AFailure "$java" ${TESTVMOPTS} \
0N/A -Xbootclasspath:"$BCP${PS}GooClass" \
0N/A -Xbootclasspath/p:"BadClass" \
0N/A Main
0N/ASuccess "$java" ${TESTVMOPTS} \
0N/A -Xbootclasspath:"$BCP${PS}BadClass" \
0N/A -Xbootclasspath/p:"GooClass${PS}BadJar/Lib.jar" \
0N/A Main
0N/A
0N/A#----------------------------------------------------------------
0N/AFailure "$javac" ${TESTTOOLVMOPTS} \
0N/A -Xbootclasspath/p:"BadClass" \
0N/A -Xbootclasspath/a:"GooClass" \
0N/A Main.java
0N/ASuccess "$javac" ${TESTTOOLVMOPTS} \
0N/A -Xbootclasspath/p:"GooClass${PS}BadClass" \
0N/A -Xbootclasspath/a:"BadClass" \
0N/A Main.java
0N/AFailure "$java" ${TESTVMOPTS} \
0N/A -Xbootclasspath/p:"BadClass" \
0N/A -Xbootclasspath/a:"GooClass" \
0N/A Main
0N/ASuccess "$java" ${TESTVMOPTS} \
0N/A -Xbootclasspath/p:"GooClass${PS}BadClass" \
0N/A -Xbootclasspath/a:"BadClass" \
0N/A Main
0N/A
0N/A#----------------------------------------------------------------
0N/AFailure "$javac" ${TESTTOOLVMOPTS} \
0N/A -Xbootclasspath/p:"GooClass" \
0N/A -J-Djava.endorsed.dirs="BadZip" \
0N/A -bootclasspath "GooClass${PS}$BCP" \
0N/A Main.java
0N/ASuccess "$javac" ${TESTTOOLVMOPTS} \
0N/A -Xbootclasspath/p:"BadClass" \
0N/A -J-Djava.endorsed.dirs="BadClass${PS}GooZip${PS}BadJar" \
0N/A -bootclasspath "BadClass${PS}$BCP" \
0N/A Main.java
0N/AFailure "$java" ${TESTVMOPTS} \
0N/A -Xbootclasspath/p:"GooClass" \
0N/A -Djava.endorsed.dirs="BadZip" \
0N/A -Xbootclasspath:"GooClass${PS}$BCP" \
0N/A Main
0N/ASuccess "$java" ${TESTVMOPTS} \
0N/A -Xbootclasspath/p:"BadClass" \
0N/A -Djava.endorsed.dirs="BadClass${PS}GooZip${PS}BadJar" \
0N/A -Xbootclasspath:"BadClass${PS}$BCP" \
0N/A Main
0N/A
0N/A#----------------------------------------------------------------
0N/AFailure "$javac" ${TESTTOOLVMOPTS} \
0N/A -Xbootclasspath/p:"GooClass" \
0N/A -Xbootclasspath:"BadClass${PS}$BCP" \
0N/A -Xbootclasspath/a:"GooClass" \
0N/A Main.java
0N/ASuccess "$javac" ${TESTTOOLVMOPTS} \
0N/A -Xbootclasspath/p:"BadClass" \
0N/A -Xbootclasspath:"GooClass${PS}BadClass${PS}$BCP" \
0N/A -Xbootclasspath/a:"BadClass" \
0N/A Main.java
0N/AFailure "$java" ${TESTVMOPTS} \
0N/A -Xbootclasspath/p:"GooClass" \
0N/A -Xbootclasspath:"BadClass${PS}$BCP" \
0N/A -Xbootclasspath/a:"GooClass" \
0N/A Main
0N/ASuccess "$java" ${TESTVMOPTS} \
0N/A -Xbootclasspath/p:"BadClass" \
0N/A -Xbootclasspath:"GooClass${PS}BadClass${PS}$BCP" \
0N/A -Xbootclasspath/a:"BadClass" \
0N/A Main
0N/A
0N/A#----------------------------------------------------------------
0N/AFailure "$javac" ${TESTTOOLVMOPTS} \
0N/A -J-Djava.endorsed.dirs="BadZip" \
0N/A -Xbootclasspath:"GooClass${PS}$BCP" \
0N/A Main.java
0N/ASuccess "$javac" ${TESTTOOLVMOPTS} \
0N/A -endorseddirs "BadClass${PS}GooZip${PS}BadJar" \
0N/A -Xbootclasspath:"BadClass${PS}$BCP" \
0N/A Main.java
0N/ASuccess "$javac" ${TESTTOOLVMOPTS} \
0N/A -Djava.endorsed.dirs="BadClass${PS}GooZip${PS}BadJar" \
0N/A -Xbootclasspath:"BadClass${PS}$BCP" \
0N/A Main.java
0N/ASuccess "$javac" ${TESTTOOLVMOPTS} \
0N/A -J-Djava.endorsed.dirs="BadClass${PS}GooZip${PS}BadJar" \
0N/A -Xbootclasspath:"BadClass${PS}$BCP" \
0N/A Main.java
0N/AFailure "$java" ${TESTVMOPTS} \
0N/A -Djava.endorsed.dirs="BadZip" \
0N/A -Xbootclasspath:"GooClass${PS}$BCP" \
0N/A Main
0N/ASuccess "$java" ${TESTVMOPTS} \
0N/A -Djava.endorsed.dirs="BadClass${PS}GooZip${PS}BadJar" \
0N/A -Xbootclasspath:"BadClass${PS}$BCP" \
0N/A Main
0N/A
0N/A#----------------------------------------------------------------
0N/AFailure "$javac" ${TESTTOOLVMOPTS} \
0N/A -Xbootclasspath/a:"BadClass" \
0N/A -extdirs "GooZip" \
0N/A Main.java
0N/ASuccess "$javac" ${TESTTOOLVMOPTS} \
0N/A -Xbootclasspath/a:"GooClass${PS}BadClass" \
0N/A -extdirs "BadZip" \
0N/A Main.java
0N/AFailure "$java" ${TESTVMOPTS} \
0N/A -Xbootclasspath/a:"BadClass" \
0N/A -Djava.ext.dirs="GooZip" \
0N/A Main
0N/ASuccess "$java" ${TESTVMOPTS} \
0N/A -Xbootclasspath/a:"GooClass${PS}BadClass" \
0N/A -Djava.ext.dirs="BadZip" \
0N/A Main
0N/A
0N/A#----------------------------------------------------------------
0N/AFailure "$javac" ${TESTTOOLVMOPTS} \
0N/A -bootclasspath "$BCP${PS}BadJar/Lib.jar" \
0N/A -J-Djava.ext.dir="GooJar" \
0N/A Main.java
0N/ASuccess "$javac" ${TESTTOOLVMOPTS} \
0N/A -bootclasspath "$BCP${PS}GooJar/Lib.jar${PS}BadClass" \
0N/A -J-Djava.ext.dir="BadJar" \
0N/A Main.java
0N/AFailure "$java" ${TESTVMOPTS} \
0N/A -Xbootclasspath:"$BCP${PS}BadJar/Lib.jar" \
0N/A -Djava.ext.dirs="GooJar" \
0N/A Main
0N/ASuccess "$java" ${TESTVMOPTS} \
0N/A -Xbootclasspath:"$BCP${PS}GooJar/Lib.jar${PS}BadClass" \
0N/A -Djava.ext.dirs="BadJar" \
0N/A Main
0N/A
0N/A#----------------------------------------------------------------
0N/AFailure "$javac" ${TESTTOOLVMOPTS} \
0N/A -extdirs "GooClass${PS}BadZip" \
0N/A -cp "GooZip/Lib.zip" \
0N/A Main.java
0N/ASuccess "$javac" ${TESTTOOLVMOPTS} \
0N/A -extdirs "BadClass${PS}GooZip${PS}BadJar" \
0N/A -cp "BadZip/Lib.zip" \
0N/A Main.java
0N/ASuccess "$javac" ${TESTTOOLVMOPTS} \
0N/A -Djava.ext.dirs="GooZip${PS}BadJar" \
0N/A -classpath "BadZip/Lib.zip" \
0N/A Main.java
0N/ASuccess "$javac" ${TESTTOOLVMOPTS} \
0N/A -J-Djava.ext.dirs="GooZip${PS}BadJar" \
0N/A -classpath "BadZip/Lib.zip" \
0N/A Main.java
0N/AFailure "$java" ${TESTVMOPTS} \
0N/A -Djava.ext.dirs="GooClass${PS}BadZip" \
0N/A -cp "GooZip/Lib.zip${PS}." \
0N/A Main
0N/ASuccess "$java" ${TESTVMOPTS} \
0N/A -Djava.ext.dirs="GooZip${PS}BadJar" \
0N/A -cp "BadZip/Lib.zip${PS}." \
0N/A Main
0N/A
0N/A#----------------------------------------------------------------
0N/AFailure "$javac" ${TESTTOOLVMOPTS} -classpath "BadClass${PS}GooClass" Main.java
0N/ASuccess "$javac" ${TESTTOOLVMOPTS} -classpath "GooClass${PS}BadClass" Main.java
0N/AFailure "$java" ${TESTVMOPTS} -classpath "BadClass${PS}GooClass${PS}." Main
0N/ASuccess "$java" ${TESTVMOPTS} -classpath "GooClass${PS}BadClass${PS}." Main
0N/A
0N/AFailure "$javac" ${TESTTOOLVMOPTS} -cp "BadJar/Lib.jar${PS}GooZip/Lib.zip" Main.java
0N/ASuccess "$javac" ${TESTTOOLVMOPTS} -cp "GooJar/Lib.jar${PS}BadZip/Lib.zip" Main.java
0N/AFailure "$java" ${TESTVMOPTS} -cp "BadJar/Lib.jar${PS}${PS}GooZip/Lib.zip" Main
0N/ASuccess "$java" ${TESTVMOPTS} -cp "GooJar/Lib.jar${PS}${PS}BadZip/Lib.zip" Main
0N/A
0N/AFailure env CLASSPATH="BadZip/Lib.zip${PS}GooJar/Lib.jar" "$javac" ${TESTTOOLVMOPTS} Main.java
0N/ASuccess env CLASSPATH="GooZip/Lib.zip${PS}BadJar/Lib.jar" "$javac" ${TESTTOOLVMOPTS} Main.java
0N/AFailure env CLASSPATH="${PS}BadZip/Lib.zip${PS}GooJar/Lib.jar" "$java" ${TESTVMOPTS} Main
0N/ASuccess env CLASSPATH="${PS}GooZip/Lib.zip${PS}BadJar/Lib.jar" "$java" ${TESTVMOPTS} Main
0N/A
0N/A#----------------------------------------------------------------
0N/A# Check behavior of empty paths and empty path elements
0N/A#----------------------------------------------------------------
0N/AIn() { cd "$1"; shift; "$@"; cd ..; }
0N/A
0N/AIn GooClass Failure "$javac" ${TESTTOOLVMOPTS} -cp ".." ../Main.java
0N/AIn GooClass Failure "$java" ${TESTVMOPTS} -cp ".." Main
0N/A
0N/A# Unspecified classpath defaults to "."
0N/ASys mkdir OneDir; Sys cp -p Main.java GooClass/Lib.class OneDir/.
0N/AIn OneDir Success "$javac" ${TESTTOOLVMOPTS} Main.java
0N/AIn OneDir Success "$java" ${TESTVMOPTS} Main
0N/A
0N/A# Empty classpath elements mean "."
0N/AIn GooClass Success "$javac" ${TESTTOOLVMOPTS} -cp "${PS}.." ../Main.java
0N/AIn GooClass Success "$java" ${TESTVMOPTS} -cp "${PS}.." Main
0N/A
0N/AIn GooClass Success "$javac" ${TESTTOOLVMOPTS} -cp "..${PS}" ../Main.java
0N/AIn GooClass Success "$java" ${TESTVMOPTS} -cp "..${PS}" Main
0N/A
0N/AIn GooClass Success "$javac" ${TESTTOOLVMOPTS} -cp "..${PS}${PS}/xyzzy" ../Main.java
0N/AIn GooClass Success "$java" ${TESTVMOPTS} -cp "..${PS}${PS}/xyzzy" Main
0N/A
0N/A# All other empty path elements are ignored.
0N/AIn GooJar Failure "$javac" ${TESTTOOLVMOPTS} -extdirs "" -cp ".." ../Main.java
0N/AIn GooJar Failure "$java" ${TESTVMOPTS} -Djava.ext.dirs="" -cp ".." Main
0N/A
0N/AIn GooJar Failure "$javac" ${TESTTOOLVMOPTS} -extdirs "${PS}" -cp ".." ../Main.java
0N/AIn GooJar Failure "$javac" ${TESTTOOLVMOPTS} -Djava.ext.dirs="${PS}" -cp ".." ../Main.java
0N/AIn GooJar Failure "$java" ${TESTVMOPTS} -Djava.ext.dirs="${PS}" -cp ".." Main
0N/A
0N/AIn GooJar Success "$javac" ${TESTTOOLVMOPTS} -extdirs "." -cp ".." ../Main.java
0N/AIn GooJar Success "$javac" ${TESTTOOLVMOPTS} -Djava.ext.dirs="." -cp ".." ../Main.java
0N/AIn GooJar Success "$java" ${TESTVMOPTS} -Djava.ext.dirs="." -cp ".." Main
0N/A
0N/AIn GooJar Failure "$javac" ${TESTTOOLVMOPTS} -J-Djava.endorsed.dirs="" -cp ".." ../Main.java
0N/AIn GooJar Failure "$javac" ${TESTTOOLVMOPTS} -Djava.endorsed.dirs="" -cp ".." ../Main.java
0N/AIn GooJar Failure "$java" ${TESTVMOPTS} -Djava.endorsed.dirs="" -cp ".." Main
0N/A
0N/AIn GooJar Failure "$javac" ${TESTTOOLVMOPTS} -J-Djava.endorsed.dirs="${PS}" -cp ".." ../Main.java
0N/AIn GooJar Failure "$javac" ${TESTTOOLVMOPTS} -endorseddirs "${PS}" -cp ".." ../Main.java
0N/AIn GooJar Failure "$java" ${TESTVMOPTS} -Djava.endorsed.dirs="${PS}" -cp ".." Main
0N/A
0N/AIn GooJar Success "$javac" ${TESTTOOLVMOPTS} -J-Djava.endorsed.dirs="." -cp ".." ../Main.java
0N/AIn GooJar Success "$javac" ${TESTTOOLVMOPTS} -Djava.endorsed.dirs="." -cp ".." ../Main.java
0N/AIn GooJar Success "$java" ${TESTVMOPTS} -Djava.endorsed.dirs="." -cp ".." Main
0N/A
0N/AIn GooClass Failure "$javac" ${TESTTOOLVMOPTS} -Xbootclasspath/p: -cp ".." ../Main.java
0N/AIn GooClass Failure "$java" ${TESTVMOPTS} -Xbootclasspath/p: -cp ".." Main
0N/A
0N/AIn GooClass Success "$javac" ${TESTTOOLVMOPTS} -Xbootclasspath/p:. -cp ".." ../Main.java
0N/AIn GooClass Success "$java" ${TESTVMOPTS} -Xbootclasspath/p:. -cp ".." Main
0N/A
0N/AIn GooClass Failure "$javac" ${TESTTOOLVMOPTS} -Xbootclasspath:"$BCP" -cp ".." ../Main.java
0N/AIn GooClass Failure "$java" ${TESTVMOPTS} -Xbootclasspath:"$BCP" -cp ".." Main
0N/A
0N/AIn GooClass Success "$javac" ${TESTTOOLVMOPTS} -Xbootclasspath:"$BCP${PS}." -cp ".." ../Main.java
0N/AIn GooClass Success "$java" ${TESTVMOPTS} -Xbootclasspath:"$BCP${PS}." -cp ".." Main
0N/A
0N/AIn GooClass Failure "$javac" ${TESTTOOLVMOPTS} -Xbootclasspath/a: -cp ".." ../Main.java
0N/AIn GooClass Failure "$java" ${TESTVMOPTS} -Xbootclasspath/a: -cp ".." Main
0N/A
0N/AIn GooClass Success "$javac" ${TESTTOOLVMOPTS} -Xbootclasspath/a:. -cp ".." ../Main.java
0N/AIn GooClass Success "$java" ${TESTVMOPTS} -Xbootclasspath/a:. -cp ".." Main
0N/A
0N/ACleanup
0N/A
0N/ABottom Line