MineField.sh revision 2721:f7ce2cfa4cdb
1#!/bin/sh
2
3#
4# Copyright (c) 2003, 2014, 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
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
54. ${TESTSRC-.}/Util.sh
55
56set -u
57
58# BCP=`DefaultBootClassPath`
59
60#----------------------------------------------------------------
61# Prepare the "Minefield"
62#----------------------------------------------------------------
63Cleanup() {
64    Sys rm -rf GooSrc GooJar GooZip GooClass
65    Sys rm -rf BadSrc BadJar BadZip BadClass
66    Sys rm -rf OneDir *.class Main.java MANIFEST.MF
67}
68
69Cleanup
70Sys mkdir  GooSrc GooJar GooZip GooClass
71Sys mkdir  BadSrc BadJar BadZip BadClass
72
73echo 'public class Lib {public static void f(){}}' > Lib.java
74Sys "$javac" ${TESTTOOLVMOPTS} Lib.java
75Sys "$jar" cf GooJar/Lib.jar Lib.class
76Sys "$jar" cf GooZip/Lib.zip Lib.class
77Sys mv Lib.class GooClass/.
78Sys mv Lib.java GooSrc/.
79CheckFiles GooZip/Lib.zip GooJar/Lib.jar GooSrc/Lib.java
80
81echo 'public class Lib {/* Bad */}' > Lib.java
82Sys "$javac" ${TESTTOOLVMOPTS} Lib.java
83Sys "$jar" cf BadJar/Lib.jar Lib.class
84Sys "$jar" cf BadZip/Lib.zip Lib.class
85Sys mv Lib.class BadClass/.
86Sys mv Lib.java BadSrc/.
87CheckFiles BadZip/Lib.zip BadJar/Lib.jar BadSrc/Lib.java
88
89echo 'public class Main {public static void main(String[] a) {Lib.f();}}' > Main.java
90
91#----------------------------------------------------------------
92# Verify that javac class search order is the same as java's
93#----------------------------------------------------------------
94# Failure "$javac" ${TESTTOOLVMOPTS} \
95#     -Xbootclasspath/p:"BadClass" \
96#     -J-Djava.endorsed.dirs="GooJar" \
97#     Main.java
98# Success "$javac" ${TESTTOOLVMOPTS} \
99#     -Xbootclasspath/p:"GooClass${PS}BadJar/Lib.jar" \
100#     -J-Djava.endorsed.dirs="BadJar${PS}GooZip" \
101#     Main.java
102# Failure "$java" ${TESTVMOPTS} \
103#     -Xbootclasspath/p:"BadClass" \
104#     -Djava.endorsed.dirs="GooJar" \
105#     Main
106# Success "$java" ${TESTVMOPTS} \
107#     -Xbootclasspath/p:"GooClass${PS}BadJar/Lib.jar" \
108#     -Djava.endorsed.dirs="BadJar${PS}GooZip" \
109#     Main
110
111#----------------------------------------------------------------
112# Failure "$javac" ${TESTTOOLVMOPTS} \
113#     -Xbootclasspath/p:"GooClass" \
114#     -bootclasspath "$BCP${PS}BadZip/Lib.zip" \
115#     Main.java
116# Success "$javac" ${TESTTOOLVMOPTS} \
117#     -Xbootclasspath/p:"BadClass${PS}GooClass" \
118#     -bootclasspath "$BCP${PS}GooZip/Lib.zip${PS}BadClass" \
119#     Main.java
120# Success "$javac" ${TESTTOOLVMOPTS} \
121#     -Xbootclasspath/p:"BadJar/Lib.jar" \
122#     -Xbootclasspath:"$BCP${PS}GooClass" \
123#     Main.java
124# Failure "$java" ${TESTVMOPTS} \
125#     -Xbootclasspath/p:"GooClass" \
126#     -Xbootclasspath:"$BCP${PS}BadZip/Lib.zip" \
127#     Main
128# Success "$java" ${TESTVMOPTS} \
129#     -Xbootclasspath/p:"BadClass${PS}GooClass" \
130#     -Xbootclasspath:"$BCP${PS}GooZip/Lib.zip${PS}BadClass" \
131#     Main
132
133#----------------------------------------------------------------
134# Failure "$javac" ${TESTTOOLVMOPTS} \
135#     -bootclasspath "$BCP${PS}GooZip/Lib.zip" \
136#     -Xbootclasspath/p:"BadClass" \
137#     Main.java
138# Success "$javac" ${TESTTOOLVMOPTS} \
139#     -bootclasspath "$BCP${PS}BadZip/Lib.zip" \
140#     -Xbootclasspath/p:"GooClass${PS}BadJar/Lib.jar" \
141#     Main.java
142# Failure "$java" ${TESTVMOPTS} \
143#     -Xbootclasspath:"$BCP${PS}GooClass" \
144#     -Xbootclasspath/p:"BadClass" \
145#     Main
146# Success "$java" ${TESTVMOPTS} \
147#     -Xbootclasspath:"$BCP${PS}BadClass" \
148#     -Xbootclasspath/p:"GooClass${PS}BadJar/Lib.jar" \
149#     Main
150
151#----------------------------------------------------------------
152Failure "$javac" ${TESTTOOLVMOPTS} \
153    -Xbootclasspath/p:"BadClass" \
154    -Xbootclasspath/a:"GooClass" \
155    Main.java
156Success "$javac" ${TESTTOOLVMOPTS} \
157    -Xbootclasspath/p:"GooClass${PS}BadClass" \
158    -Xbootclasspath/a:"BadClass" \
159    Main.java
160Failure "$java" ${TESTVMOPTS} \
161    -Xbootclasspath/p:"BadClass" \
162    -Xbootclasspath/a:"GooClass" \
163    Main
164Success "$java" ${TESTVMOPTS} \
165    -Xbootclasspath/p:"GooClass${PS}BadClass" \
166    -Xbootclasspath/a:"BadClass" \
167    Main
168
169#----------------------------------------------------------------
170# Failure "$javac" ${TESTTOOLVMOPTS} \
171#     -Xbootclasspath/p:"GooClass" \
172#     -J-Djava.endorsed.dirs="BadZip" \
173#     -bootclasspath "GooClass${PS}$BCP" \
174#     Main.java
175# Success "$javac" ${TESTTOOLVMOPTS} \
176#     -Xbootclasspath/p:"BadClass" \
177#     -J-Djava.endorsed.dirs="BadClass${PS}GooZip${PS}BadJar" \
178#     -bootclasspath "BadClass${PS}$BCP" \
179#     Main.java
180# Failure "$java" ${TESTVMOPTS} \
181#     -Xbootclasspath/p:"GooClass" \
182#     -Djava.endorsed.dirs="BadZip" \
183#     -Xbootclasspath:"GooClass${PS}$BCP" \
184#     Main
185# Success "$java" ${TESTVMOPTS} \
186#     -Xbootclasspath/p:"BadClass" \
187#     -Djava.endorsed.dirs="BadClass${PS}GooZip${PS}BadJar" \
188#     -Xbootclasspath:"BadClass${PS}$BCP" \
189#     Main
190
191#----------------------------------------------------------------
192# Failure "$javac" ${TESTTOOLVMOPTS} \
193#     -Xbootclasspath/p:"GooClass" \
194#     -Xbootclasspath:"BadClass${PS}$BCP" \
195#     -Xbootclasspath/a:"GooClass" \
196#     Main.java
197# Success "$javac" ${TESTTOOLVMOPTS} \
198#     -Xbootclasspath/p:"BadClass" \
199#     -Xbootclasspath:"GooClass${PS}BadClass${PS}$BCP" \
200#     -Xbootclasspath/a:"BadClass" \
201#     Main.java
202# Failure "$java" ${TESTVMOPTS} \
203#     -Xbootclasspath/p:"GooClass" \
204#     -Xbootclasspath:"BadClass${PS}$BCP" \
205#     -Xbootclasspath/a:"GooClass" \
206#     Main
207# Success "$java" ${TESTVMOPTS} \
208#     -Xbootclasspath/p:"BadClass" \
209#     -Xbootclasspath:"GooClass${PS}BadClass${PS}$BCP" \
210#     -Xbootclasspath/a:"BadClass" \
211#     Main
212
213#----------------------------------------------------------------
214# Failure "$javac" ${TESTTOOLVMOPTS} \
215#     -J-Djava.endorsed.dirs="BadZip" \
216#     -Xbootclasspath:"GooClass${PS}$BCP" \
217#     Main.java
218# Success "$javac" ${TESTTOOLVMOPTS} \
219#     -endorseddirs "BadClass${PS}GooZip${PS}BadJar" \
220#     -Xbootclasspath:"BadClass${PS}$BCP" \
221#     Main.java
222# Success "$javac" ${TESTTOOLVMOPTS} \
223#     -Djava.endorsed.dirs="BadClass${PS}GooZip${PS}BadJar" \
224#     -Xbootclasspath:"BadClass${PS}$BCP" \
225#     Main.java
226# Success "$javac" ${TESTTOOLVMOPTS} \
227#     -J-Djava.endorsed.dirs="BadClass${PS}GooZip${PS}BadJar" \
228#     -Xbootclasspath:"BadClass${PS}$BCP" \
229#     Main.java
230# Failure "$java" ${TESTVMOPTS} \
231#     -Djava.endorsed.dirs="BadZip" \
232#     -Xbootclasspath:"GooClass${PS}$BCP" \
233#     Main
234# Success "$java" ${TESTVMOPTS} \
235#     -Djava.endorsed.dirs="BadClass${PS}GooZip${PS}BadJar" \
236#     -Xbootclasspath:"BadClass${PS}$BCP" \
237#     Main
238
239#----------------------------------------------------------------
240Failure "$javac" ${TESTTOOLVMOPTS} \
241    -Xbootclasspath/a:"BadClass" \
242    -extdirs "GooZip" \
243    Main.java
244Success "$javac" ${TESTTOOLVMOPTS} \
245    -Xbootclasspath/a:"GooClass${PS}BadClass" \
246    -extdirs "BadZip" \
247    Main.java
248# Failure "$java" ${TESTVMOPTS} \
249#     -Xbootclasspath/a:"BadClass" \
250#     -Djava.ext.dirs="GooZip" \
251#     Main
252# Success "$java" ${TESTVMOPTS} \
253#     -Xbootclasspath/a:"GooClass${PS}BadClass" \
254#     -Djava.ext.dirs="BadZip" \
255#     Main
256
257#----------------------------------------------------------------
258# Failure "$javac" ${TESTTOOLVMOPTS} \
259#     -bootclasspath "$BCP${PS}BadJar/Lib.jar" \
260#     -J-Djava.ext.dir="GooJar" \
261#     Main.java
262# Success "$javac" ${TESTTOOLVMOPTS} \
263#     -bootclasspath "$BCP${PS}GooJar/Lib.jar${PS}BadClass" \
264#     -J-Djava.ext.dir="BadJar" \
265#     Main.java
266# Failure "$java" ${TESTVMOPTS} \
267#     -Xbootclasspath:"$BCP${PS}BadJar/Lib.jar" \
268#     -Djava.ext.dirs="GooJar" \
269#     Main
270# Success "$java" ${TESTVMOPTS} \
271#     -Xbootclasspath:"$BCP${PS}GooJar/Lib.jar${PS}BadClass" \
272#     -Djava.ext.dirs="BadJar" \
273#     Main
274
275#----------------------------------------------------------------
276Failure "$javac" ${TESTTOOLVMOPTS} \
277    -extdirs "GooClass${PS}BadZip" \
278    -cp "GooZip/Lib.zip" \
279    Main.java
280Success "$javac" ${TESTTOOLVMOPTS} \
281    -extdirs "BadClass${PS}GooZip${PS}BadJar" \
282    -cp "BadZip/Lib.zip" \
283    Main.java
284Success "$javac" ${TESTTOOLVMOPTS} \
285    -Djava.ext.dirs="GooZip${PS}BadJar" \
286    -classpath "BadZip/Lib.zip" \
287    Main.java
288# Success "$javac" ${TESTTOOLVMOPTS} \
289#     -J-Djava.ext.dirs="GooZip${PS}BadJar" \
290#     -classpath "BadZip/Lib.zip" \
291#     Main.java
292# Failure "$java" ${TESTVMOPTS} \
293#     -Djava.ext.dirs="GooClass${PS}BadZip" \
294#     -cp "GooZip/Lib.zip${PS}." \
295#     Main
296# Success "$java" ${TESTVMOPTS} \
297#     -Djava.ext.dirs="GooZip${PS}BadJar" \
298#     -cp "BadZip/Lib.zip${PS}." \
299#     Main
300
301#----------------------------------------------------------------
302Failure "$javac" ${TESTTOOLVMOPTS} -classpath "BadClass${PS}GooClass" Main.java
303Success "$javac" ${TESTTOOLVMOPTS} -classpath "GooClass${PS}BadClass" Main.java
304Failure "$java" ${TESTVMOPTS}  -classpath "BadClass${PS}GooClass${PS}." Main
305Success "$java" ${TESTVMOPTS}  -classpath "GooClass${PS}BadClass${PS}." Main
306
307Failure "$javac" ${TESTTOOLVMOPTS} -cp "BadJar/Lib.jar${PS}GooZip/Lib.zip" Main.java
308Success "$javac" ${TESTTOOLVMOPTS} -cp "GooJar/Lib.jar${PS}BadZip/Lib.zip" Main.java
309Failure "$java" ${TESTVMOPTS}  -cp "BadJar/Lib.jar${PS}${PS}GooZip/Lib.zip" Main
310Success "$java" ${TESTVMOPTS}  -cp "GooJar/Lib.jar${PS}${PS}BadZip/Lib.zip" Main
311
312Failure env CLASSPATH="BadZip/Lib.zip${PS}GooJar/Lib.jar" "$javac" ${TESTTOOLVMOPTS} Main.java
313Success env CLASSPATH="GooZip/Lib.zip${PS}BadJar/Lib.jar" "$javac" ${TESTTOOLVMOPTS} Main.java
314Failure env CLASSPATH="${PS}BadZip/Lib.zip${PS}GooJar/Lib.jar" "$java" ${TESTVMOPTS} Main
315Success env CLASSPATH="${PS}GooZip/Lib.zip${PS}BadJar/Lib.jar" "$java" ${TESTVMOPTS} Main
316
317#----------------------------------------------------------------
318# Check behavior of empty paths and empty path elements
319#----------------------------------------------------------------
320In() { cd "$1"; shift; "$@"; cd ..; }
321
322In GooClass Failure "$javac" ${TESTTOOLVMOPTS} -cp ".." ../Main.java
323In GooClass Failure "$java" ${TESTVMOPTS}  -cp ".." Main
324
325# Unspecified classpath defaults to "."
326Sys mkdir OneDir; Sys cp -p Main.java GooClass/Lib.class OneDir/.
327In OneDir Success "$javac" ${TESTTOOLVMOPTS} Main.java
328In OneDir Success "$java" ${TESTVMOPTS}  Main
329
330# Empty classpath elements mean "."
331In GooClass Success "$javac" ${TESTTOOLVMOPTS} -cp "${PS}.." ../Main.java
332In GooClass Success "$java" ${TESTVMOPTS}  -cp "${PS}.." Main
333
334In GooClass Success "$javac" ${TESTTOOLVMOPTS} -cp "..${PS}" ../Main.java
335In GooClass Success "$java" ${TESTVMOPTS}  -cp "..${PS}" Main
336
337In GooClass Success "$javac" ${TESTTOOLVMOPTS} -cp "..${PS}${PS}/xyzzy" ../Main.java
338In GooClass Success "$java" ${TESTVMOPTS}  -cp "..${PS}${PS}/xyzzy" Main
339
340# All other empty path elements are ignored.
341In GooJar Failure "$javac" ${TESTTOOLVMOPTS} -extdirs "" -cp ".." ../Main.java
342# In GooJar Failure "$java" ${TESTVMOPTS} -Djava.ext.dirs="" -cp ".." Main
343
344In GooJar Failure "$javac" ${TESTTOOLVMOPTS} -extdirs        "${PS}" -cp ".." ../Main.java
345In GooJar Failure "$javac" ${TESTTOOLVMOPTS} -Djava.ext.dirs="${PS}" -cp ".." ../Main.java
346# In GooJar Failure "$java" ${TESTVMOPTS}  -Djava.ext.dirs="${PS}" -cp ".." Main
347
348In GooJar Success "$javac" ${TESTTOOLVMOPTS} -extdirs        "." -cp ".." ../Main.java
349In GooJar Success "$javac" ${TESTTOOLVMOPTS} -Djava.ext.dirs="." -cp ".." ../Main.java
350# In GooJar Success "$java" ${TESTVMOPTS}  -Djava.ext.dirs="." -cp ".." Main
351
352# In GooJar Failure "$javac" ${TESTTOOLVMOPTS} -J-Djava.endorsed.dirs="" -cp ".." ../Main.java
353In GooJar Failure "$javac" ${TESTTOOLVMOPTS}   -Djava.endorsed.dirs="" -cp ".." ../Main.java
354# In GooJar Failure "$java" ${TESTVMOPTS}    -Djava.endorsed.dirs="" -cp ".." Main
355
356# In GooJar Failure "$javac" ${TESTTOOLVMOPTS} -J-Djava.endorsed.dirs="${PS}" -cp ".." ../Main.java
357In GooJar Failure "$javac" ${TESTTOOLVMOPTS}   -endorseddirs        "${PS}" -cp ".." ../Main.java
358# In GooJar Failure "$java" ${TESTVMOPTS}    -Djava.endorsed.dirs="${PS}" -cp ".." Main
359
360# In GooJar Success "$javac" ${TESTTOOLVMOPTS} -J-Djava.endorsed.dirs="." -cp ".." ../Main.java
361In GooJar Success "$javac" ${TESTTOOLVMOPTS}   -Djava.endorsed.dirs="." -cp ".." ../Main.java
362# In GooJar Success "$java" ${TESTVMOPTS}    -Djava.endorsed.dirs="." -cp ".." Main
363
364In GooClass Failure "$javac" ${TESTTOOLVMOPTS} -Xbootclasspath/p: -cp ".." ../Main.java
365In GooClass Failure "$java" ${TESTVMOPTS}  -Xbootclasspath/p: -cp ".." Main
366
367In GooClass Success "$javac" ${TESTTOOLVMOPTS} -Xbootclasspath/p:. -cp ".." ../Main.java
368In GooClass Success "$java" ${TESTVMOPTS}  -Xbootclasspath/p:. -cp ".." Main
369
370# In GooClass Failure "$javac" ${TESTTOOLVMOPTS} -Xbootclasspath:"$BCP" -cp ".." ../Main.java
371# In GooClass Failure "$java" ${TESTVMOPTS}  -Xbootclasspath:"$BCP" -cp ".." Main
372
373# In GooClass Success "$javac" ${TESTTOOLVMOPTS} -Xbootclasspath:"$BCP${PS}." -cp ".." ../Main.java
374# In GooClass Success "$java" ${TESTVMOPTS}  -Xbootclasspath:"$BCP${PS}." -cp ".." Main
375
376In GooClass Failure "$javac" ${TESTTOOLVMOPTS} -Xbootclasspath/a: -cp ".." ../Main.java
377In GooClass Failure "$java" ${TESTVMOPTS}  -Xbootclasspath/a: -cp ".." Main
378
379In GooClass Success "$javac" ${TESTTOOLVMOPTS} -Xbootclasspath/a:. -cp ".." ../Main.java
380In GooClass Success "$java" ${TESTVMOPTS}  -Xbootclasspath/a:. -cp ".." Main
381
382Cleanup
383
384Bottom Line
385