1#!/bin/sh 2 3# 4# Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. 5# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 6# 7# This code is free software; you can redistribute it and/or modify it 8# under the terms of the GNU General Public License version 2 only, as 9# published by the Free Software Foundation. 10# 11# This code is distributed in the hope that it will be useful, but WITHOUT 12# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14# version 2 for more details (a copy is included in the LICENSE file that 15# accompanied this code). 16# 17# You should have received a copy of the GNU General Public License version 18# 2 along with this work; if not, write to the Free Software Foundation, 19# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20# 21# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22# or visit www.oracle.com if you need additional information or have any 23# questions. 24# 25 26# 27# @test 28# @bug 4758537 4809833 8149599 29# @summary Test that javac and java find files in similar ways 30# @author Martin Buchholz 31# 32# @run shell/timeout=600 MineField.sh 33 34# To run this test manually, simply do ./MineField.sh 35 36#---------------------------------------------------------------- 37# The search order for classes used by both java and javac is: 38# 39# -Xbootclasspath/p:<path> 40# -endorseddirs <dirs> or -Djava.endorsed.dirs=<dirs> (search for jar/zip only) 41# -bootclasspath <path> or -Xbootclasspath:<path> 42# -Xbootclasspath/a:<path> 43# -extdirs <dirs> or -Djava.ext.dirs=<dirs> (search for jar/zip only) 44# -classpath <path>, -cp <path>, env CLASSPATH=<path> 45# 46# Peculiarities of the class file search: 47# - Empty elements of the (user) classpath default to ".", 48# while empty elements of other paths are ignored. 49# - Only for the user classpath is an empty string value equivalent to "." 50# - Specifying a bootclasspath on the command line obliterates any 51# previous -Xbootclasspath/p: or -Xbootclasspath/a: command line flags. 52# 53# JDK 9 update: 54# java: The java launcher does not support any of the following: 55# * -Xbootclasspath/p: -Xbootclasspath: 56# * -endorseddirs -Djava.endorsed.dirs 57# * -extdirs -Djava.ext.dirs 58# All test cases exercising these features have been removed. 59# javac: The following features are only supported when compiling 60# for older releases: 61# * -Xbootclasspath/p: -Xbootclasspath: -bootclasspath -Xbootclasspath/a: 62# * -endorseddirs -Djava.endorsed.dirs 63# * -extdirs -Djava.ext.dirs 64# All test cases exercising these features have been modified to 65# use -source 8 -target 8. In addition, javac test cases involving 66# use of the runtime properties java.endorsed.dirs and java.extdirs 67# (by means of -J-Dname=value) have been removed. 68# Although the primary purpose of the test cases in this file is to 69# compare javac and java behavior, some tests remain for javac for 70# which there is no java equivalent. However, the cases remain as useful 71# test cases for javac handling of the paths involved. 72 73#---------------------------------------------------------------- 74 75. ${TESTSRC-.}/Util.sh 76 77set -u 78 79#---------------------------------------------------------------- 80# Prepare the "Minefield" 81#---------------------------------------------------------------- 82Cleanup() { 83 Sys rm -rf GooSrc GooJar GooZip GooClass 84 Sys rm -rf BadSrc BadJar BadZip BadClass 85 Sys rm -rf OneDir *.class Main.java MANIFEST.MF 86 Sys rm -f java-lang.jar 87} 88 89Cleanup 90Sys mkdir GooSrc GooJar GooZip GooClass 91Sys mkdir BadSrc BadJar BadZip BadClass 92 93echo 'public class Lib {public static void f(){}}' > Lib.java 94Sys "$javac" ${TESTTOOLVMOPTS} Lib.java 95Sys "$jar" cf GooJar/Lib.jar Lib.class 96Sys "$jar" cf GooZip/Lib.zip Lib.class 97Sys mv Lib.class GooClass/. 98Sys mv Lib.java GooSrc/. 99CheckFiles GooZip/Lib.zip GooJar/Lib.jar GooSrc/Lib.java 100 101echo 'public class Lib {/* Bad */}' > Lib.java 102Sys "$javac" ${TESTTOOLVMOPTS} Lib.java 103Sys "$jar" cf BadJar/Lib.jar Lib.class 104Sys "$jar" cf BadZip/Lib.zip Lib.class 105Sys mv Lib.class BadClass/. 106Sys mv Lib.java BadSrc/. 107CheckFiles BadZip/Lib.zip BadJar/Lib.jar BadSrc/Lib.java 108 109echo 'public class Main {public static void main(String[] a) {Lib.f();}}' > Main.java 110 111# Create a jar file that is good enough to put on the javac boot class path (i.e. contains java.lang.**) 112if [ -r ${TESTJAVA}/lib/modules ]; then 113 Sys "$jimage" extract --dir modules ${TESTJAVA}/lib/modules 114 Sys "$jar" cf java-lang.jar -C modules/java.base java/lang 115 Sys rm -rf modules 116elif [ -d ${TESTJAVA}/modules ]; then 117 Sys "$jar" cf java-lang.jar -C ${TESTJAVA}/modules/java.base java/lang 118else 119 echo 'cannot create java-lang.jar' ; exit 1 120fi 121 122#---------------------------------------------------------------- 123# Verify that javac class search order is the same as java's 124#---------------------------------------------------------------- 125Failure "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} \ 126 -Xbootclasspath/p:"GooClass" \ 127 -bootclasspath "java-lang.jar${PS}BadZip/Lib.zip" \ 128 Main.java 129Success "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} \ 130 -Xbootclasspath/p:"BadClass${PS}GooClass" \ 131 -bootclasspath "java-lang.jar${PS}GooZip/Lib.zip${PS}BadClass" \ 132 Main.java 133Success "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} \ 134 -Xbootclasspath/p:"BadJar/Lib.jar" \ 135 -Xbootclasspath:"java-lang.jar${PS}GooClass" \ 136 Main.java 137 138#---------------------------------------------------------------- 139Failure "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} \ 140 -bootclasspath "java-lang.jar${PS}GooZip/Lib.zip" \ 141 -Xbootclasspath/p:"BadClass" \ 142 Main.java 143Success "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} \ 144 -bootclasspath "java-lang.jar${PS}BadZip/Lib.zip" \ 145 -Xbootclasspath/p:"GooClass${PS}BadJar/Lib.jar" \ 146 Main.java 147 148#---------------------------------------------------------------- 149Failure "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} \ 150 -Xbootclasspath/p:"BadClass" \ 151 -Xbootclasspath/a:"GooClass" \ 152 Main.java 153Success "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} \ 154 -Xbootclasspath/p:"GooClass${PS}BadClass" \ 155 -Xbootclasspath/a:"BadClass" \ 156 Main.java 157Success "$java" ${TESTVMOPTS} \ 158 -Xbootclasspath/a:"GooClass" \ 159 Main 160 161#---------------------------------------------------------------- 162Failure "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} \ 163 -Xbootclasspath/p:"GooClass" \ 164 -Xbootclasspath:"BadClass${PS}java-lang.jar" \ 165 -Xbootclasspath/a:"GooClass" \ 166 Main.java 167Success "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} \ 168 -Xbootclasspath/p:"BadClass" \ 169 -Xbootclasspath:"GooClass${PS}BadClass${PS}java-lang.jar" \ 170 -Xbootclasspath/a:"BadClass" \ 171 Main.java 172 173#---------------------------------------------------------------- 174Success "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} \ 175 -endorseddirs "BadClass${PS}GooZip${PS}BadJar" \ 176 -Xbootclasspath:"BadClass${PS}java-lang.jar" \ 177 Main.java 178Success "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} \ 179 -Djava.endorsed.dirs="BadClass${PS}GooZip${PS}BadJar" \ 180 -Xbootclasspath:"BadClass${PS}java-lang.jar" \ 181 Main.java 182 183#---------------------------------------------------------------- 184Failure "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} \ 185 -Xbootclasspath/a:"BadClass" \ 186 -extdirs "GooZip" \ 187 Main.java 188Success "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} \ 189 -Xbootclasspath/a:"GooClass${PS}BadClass" \ 190 -extdirs "BadZip" \ 191 Main.java 192 193#---------------------------------------------------------------- 194Failure "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} \ 195 -extdirs "GooClass${PS}BadZip" \ 196 -cp "GooZip/Lib.zip" \ 197 Main.java 198Success "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} \ 199 -extdirs "BadClass${PS}GooZip${PS}BadJar" \ 200 -cp "BadZip/Lib.zip" \ 201 Main.java 202Success "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} \ 203 -Djava.ext.dirs="GooZip${PS}BadJar" \ 204 -classpath "BadZip/Lib.zip" \ 205 Main.java 206 207#---------------------------------------------------------------- 208Failure "$javac" ${TESTTOOLVMOPTS} -classpath "BadClass${PS}GooClass" Main.java 209Success "$javac" ${TESTTOOLVMOPTS} -classpath "GooClass${PS}BadClass" Main.java 210Failure "$java" ${TESTVMOPTS} -classpath "BadClass${PS}GooClass${PS}." Main 211Success "$java" ${TESTVMOPTS} -classpath "GooClass${PS}BadClass${PS}." Main 212 213Failure "$javac" ${TESTTOOLVMOPTS} -cp "BadJar/Lib.jar${PS}GooZip/Lib.zip" Main.java 214Success "$javac" ${TESTTOOLVMOPTS} -cp "GooJar/Lib.jar${PS}BadZip/Lib.zip" Main.java 215Failure "$java" ${TESTVMOPTS} -cp "BadJar/Lib.jar${PS}${PS}GooZip/Lib.zip" Main 216Success "$java" ${TESTVMOPTS} -cp "GooJar/Lib.jar${PS}${PS}BadZip/Lib.zip" Main 217 218Failure env CLASSPATH="BadZip/Lib.zip${PS}GooJar/Lib.jar" "$javac" ${TESTTOOLVMOPTS} Main.java 219Success env CLASSPATH="GooZip/Lib.zip${PS}BadJar/Lib.jar" "$javac" ${TESTTOOLVMOPTS} Main.java 220Failure env CLASSPATH="${PS}BadZip/Lib.zip${PS}GooJar/Lib.jar" "$java" ${TESTVMOPTS} Main 221Success env CLASSPATH="${PS}GooZip/Lib.zip${PS}BadJar/Lib.jar" "$java" ${TESTVMOPTS} Main 222 223#---------------------------------------------------------------- 224# Check behavior of empty paths and empty path elements 225#---------------------------------------------------------------- 226In() { cd "$1"; shift; "$@"; cd ..; } 227 228In GooClass Failure "$javac" ${TESTTOOLVMOPTS} -cp ".." ../Main.java 229In GooClass Failure "$java" ${TESTVMOPTS} -cp ".." Main 230 231# Unspecified classpath defaults to "." 232Sys mkdir OneDir; Sys cp Main.java GooClass/Lib.class OneDir/. 233In OneDir Success "$javac" ${TESTTOOLVMOPTS} Main.java 234In OneDir Success "$java" ${TESTVMOPTS} Main 235 236# Empty classpath elements mean "." 237In GooClass Success "$javac" ${TESTTOOLVMOPTS} -cp "${PS}.." ../Main.java 238In GooClass Success "$java" ${TESTVMOPTS} -cp "${PS}.." Main 239 240In GooClass Success "$javac" ${TESTTOOLVMOPTS} -cp "..${PS}" ../Main.java 241In GooClass Success "$java" ${TESTVMOPTS} -cp "..${PS}" Main 242 243In GooClass Success "$javac" ${TESTTOOLVMOPTS} -cp "..${PS}${PS}/xyzzy" ../Main.java 244In GooClass Success "$java" ${TESTVMOPTS} -cp "..${PS}${PS}/xyzzy" Main 245 246# All other empty path elements are ignored. 247In GooJar Failure "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} -extdirs "" -cp ".." ../Main.java 248 249In GooJar Failure "$javac" -source 8 -targt 8 ${TESTTOOLVMOPTS} -extdirs "${PS}" -cp ".." ../Main.java 250In GooJar Failure "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} -Djava.ext.dirs="${PS}" -cp ".." ../Main.java 251 252In GooJar Success "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} -extdirs "." -cp ".." ../Main.java 253In GooJar Success "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} -Djava.ext.dirs="." -cp ".." ../Main.java 254 255In GooJar Failure "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} -Djava.endorsed.dirs="" -cp ".." ../Main.java 256 257In GooJar Failure "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} -endorseddirs "${PS}" -cp ".." ../Main.java 258 259In GooJar Success "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} -Djava.endorsed.dirs="." -cp ".." ../Main.java 260 261In GooClass Failure "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} -Xbootclasspath/p: -cp ".." ../Main.java 262 263In GooClass Success "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} -Xbootclasspath/p:. -cp ".." ../Main.java 264 265In GooClass Failure "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} -Xbootclasspath:"../java-lang.jar" -cp ".." ../Main.java 266 267In GooClass Success "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} -Xbootclasspath:"../java-lang.jar${PS}." -cp ".." ../Main.java 268 269In GooClass Failure "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} -Xbootclasspath/a: -cp ".." ../Main.java 270In GooClass Failure "$java" ${TESTVMOPTS} -Xbootclasspath/a: -cp ".." Main 271 272In GooClass Success "$javac" -source 8 -target 8 ${TESTTOOLVMOPTS} -Xbootclasspath/a:. -cp ".." ../Main.java 273In GooClass Success "$java" ${TESTVMOPTS} -Xbootclasspath/a:. -cp ".." Main 274 275Cleanup 276 277Bottom Line 278