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