1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296
|
#!/bin/sh
#
# Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
#
# @test
# @summary Test classpath wildcards for javac and java -classpath option.
# @bug 6268383 8172309
# @run shell/timeout=600 wcMineField.sh
# To run this test manually, simply do ./wcMineField.sh
#----------------------------------------------------------------
. ${TESTSRC-.}/Util.sh
set -u
#----------------------------------------------------------------
# Note that, on Windows only, the launcher also includes another
# kind of command-line wildcard expansion, via setargv.obj
# http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccelng/htm/progs_11.asp
# Therefore, on Windows, -classpath "foo/*" is treated differently
# from -classpath ".${PS}foo/*"
#----------------------------------------------------------------
#----------------------------------------------------------------
# Prepare the "Minefield"
#----------------------------------------------------------------
Cleanup() {
Sys rm -rf GooSrc GooJar GooZip GooClass
Sys rm -rf SpeSrc SpeJar SpeZip SpeClass
Sys rm -rf BadSrc BadJar BadZip BadClass
Sys rm -rf JarNClass StarJar MixJar StarDir
Sys rm -rf OneDir *.class Main*.java MANIFEST.MF
}
Cleanup
Sys mkdir GooSrc GooJar GooZip GooClass GooJar/SubDir
Sys mkdir BadSrc BadJar BadZip BadClass
Sys mkdir SpeSrc SpeJar SpeZip SpeClass
Sys mkdir JarNClass StarJar MixJar
echo 'public class Lib {public static void f(){}}' > Lib.java
echo 'public class Lib2 {public static void g(){}}' > Lib2.java
echo 'public class Lib3 {public static void h(){}}' > Lib3.java
Sys "$javac" ${TESTTOOLVMOPTS} Lib.java Lib2.java Lib3.java
Sys cp Lib.class JarNClass/.
Sys "$jar" cf GooJar/Lib.jar Lib.class
Sys "$jar" cf GooJar/SubDir/Lib2.jar Lib2.class
Sys "$jar" cf JarNClass/Lib.jar Lib.class
Sys "$jar" cf GooZip/Lib.zip Lib.class
Sys mv Lib.class GooClass/.
Sys mv Lib2.class GooClass/.
Sys mv Lib3.class GooClass/.
Sys mv Lib.java GooSrc/.
Sys mv Lib2.java GooSrc/.
Sys mv Lib3.java GooSrc
CheckFiles GooZip/Lib.zip GooJar/Lib.jar GooSrc/Lib.java
CheckFiles GooSrc/Lib2.java GooSrc/Lib3.java GooJar/SubDir/Lib2.jar
echo 'public class Spe1 {public static void f(){}}' > Spe1.java
echo 'public class Spe2 {public static void f(){}}' > Spe2.java
echo 'public class Spe3 {public static void f(){}}' > Spe3.java
echo 'public class Spe4 {public static void f(){}}' > Spe4.java
Sys "$javac" ${TESTTOOLVMOPTS} Spe1.java
Sys "$javac" ${TESTTOOLVMOPTS} Spe2.java
Sys "$javac" ${TESTTOOLVMOPTS} Spe3.java
Sys "$javac" ${TESTTOOLVMOPTS} Spe4.java
UnixOnly Sys "$jar" cf "SpeJar/Spe:Colon.jar" Spe1.class
UnixOnly Sys "$jar" cf "SpeJar/Spe*wc.jar" Spe4.class
UnixOnly CheckFiles "SpeJar/Spe*wc.jar"
UnixOnly Sys "$jar" cf "StarJar/*jar.jar" Spe2.class
UnixOnly Sys "$jar" cf "StarJar/jar*.jar" Spe3.class
UnixOnly Sys "$jar" cf "StarJar/*jar*.jar" Spe4.class
UnixOnly CheckFiles "StarJar/*jar.jar" "StarJar/jar*.jar" "StarJar/*jar*.jar"
Sys "$jar" cf "SpeJar/Spe,Comma.jar" Spe2.class
Sys "$jar" cf "SpeJar/Spe;Semi.jar" Spe3.class
Sys "$jar" cf "MixJar/mix.jAr" Spe1.class
Sys "$jar" cf "MixJar/mix2.JAR" Spe2.class
Sys "$jar" cf "MixJar/mix3.zip" Spe3.class
Sys "$jar" cf "MixJar/.hiddenjar.jar" Spe4.class
Sys mv Spe*.class SpeClass/.
Sys mv Spe*.java SpeSrc/.
CheckFiles "SpeJar/Spe,Comma.jar" "SpeJar/Spe;Semi.jar" "SpeSrc/Spe2.java" "SpeSrc/Spe3.java" "SpeSrc/Spe4.java"
CheckFiles "MixJar/mix.jAr" "MixJar/mix2.JAR" "MixJar/mix3.zip" "MixJar/.hiddenjar.jar"
echo 'public class Main {public static void main(String[] a) {Lib.f();}}' > Main.java
echo 'public class Main1 {public static void main(String[] a) {Lib2.g();}}' > Main1.java
echo 'public class Main1b {public static void main(String[] a) {Spe1.f();}}' > Main1b.java
echo 'public class Main2 {public static void main(String[] a) {Spe2.f();}}' > Main2.java
echo 'public class Main3 {public static void main(String[] a) {Spe3.f();}}' > Main3.java
echo 'public class Main4 {public static void main(String[] a) {Spe4.f();}}' > Main4.java
echo 'public class Main5 {public static void main(String[] a) {Spe2.f(); Lib.f();}}' > Main5.java
echo 'public class Main6 {public static void main(String[] a) {Lib3.h();}}' > Main6.java
#----------------------------------------------------------------
# Verify expected behaviour with directory named "*"
#----------------------------------------------------------------
starDir() {
printf "Running tests with directory named \"*\"\n"
Sys rm -rf ./StarDir
Sys mkdir -p StarDir/"*"
Sys cp "GooClass/Lib2.class" "StarDir/*/Lib2.class"
Sys "$jar" cf "StarDir/Lib3.jar" -C GooClass "Lib3.class"
Sys "$jar" cf "StarDir/*/Lib.jar" -C GooClass "Lib.class"
CheckFiles "StarDir/*/Lib.jar" "StarDir/*/Lib2.class" "StarDir/Lib3.jar"
Sys cp Main6.java ./StarDir/.
Sys cp Main.java ./StarDir/"*"/.
Sys cp Main1.java ./StarDir/"*"/.
CPWC_DIR=`pwd`
Sys cd StarDir
Failure "$javac" ${TESTTOOLVMOPTS} -classpath "*" Main6.java
Failure "$javac" ${TESTTOOLVMOPTS} -classpath "./*" Main6.java
Sys rm -f Main6.*
Sys cd "*"
Success "$javac" ${TESTTOOLVMOPTS} -classpath "*" Main.java
Success "$java" ${TESTVMOPTS} -classpath .${PS}"*" Main
Success "$javac" ${TESTTOOLVMOPTS} Main1.java
Success "$java" ${TESTVMOPTS} -classpath "." Main1
Sys cd $CPWC_DIR
Failure "$javac" ${TESTTOOLVMOPTS} -classpath "StarDir/*" Main6.java
Success "$javac" ${TESTTOOLVMOPTS} -classpath StarDir/\* Main1.java
Success "$java" ${TESTVMOPTS} -classpath StarDir/\*:. Main1
Success "$javac" ${TESTTOOLVMOPTS} -classpath "StarDir/*" Main1.java
Success "$java" ${TESTVMOPTS} -classpath ".${PS}StarDir/*" Main1
Failure "$javac" ${TESTTOOLVMOPTS} -classpath StarDir/"\*/*" Main.java
Success "$javac" ${TESTTOOLVMOPTS} -classpath StarDir/"*/*" Main.java
Success "$java" ${TESTVMOPTS} -classpath .${PS}StarDir/"*/*" Main
Failure "$java" ${TESTVMOPTS} -classpath .${PS}StarDir/"\*/*" Main
Success "$javac" ${TESTTOOLVMOPTS} -classpath "StarDir/Lib3.jar" Main6.java
Success "$java" ${TESTVMOPTS} -classpath ".${PS}StarDir/Lib3.jar" Main6
Success "$javac" ${TESTTOOLVMOPTS} -classpath StarDir/"*"/Lib.jar Main.java
Success "$java" ${TESTVMOPTS} -classpath .${PS}StarDir/"*"/Lib.jar Main
}
UnixOnly starDir
#----------------------------------------------------------------
# Verify the basic jar file works
#----------------------------------------------------------------
#baseline test to verify it works.
Success "$javac" ${TESTTOOLVMOPTS} -cp "GooJar/Lib.jar" Main.java
Success "$javac" ${TESTTOOLVMOPTS} -classpath "GooJar/Lib.jar" Main.java
Success "$java" ${TESTVMOPTS} -classpath "GooJar/Lib.jar${PS}." Main
Success "$java" ${TESTVMOPTS} -cp "GooJar/Lib.jar${PS}." Main
#basic test of one jar to be loaded
UnixOnly Success "$javac" ${TESTTOOLVMOPTS} -classpath "GooJar/*" Main.java
Success "$javac" ${TESTTOOLVMOPTS} -classpath "GooJar/*${PS}." Main.java
Success "$java" ${TESTVMOPTS} -classpath "GooJar/*${PS}." Main
#in a subdir. First * should not load jars in subdirectories unless specified
Failure "$javac" ${TESTTOOLVMOPTS} -classpath "GooJar/*" Main1.java
Failure "$javac" ${TESTTOOLVMOPTS} -classpath "GooJar/*${PS}." Main1.java
Success "$javac" ${TESTTOOLVMOPTS} -cp "GooJar/SubDir/*" Main1.java
Success "$javac" ${TESTTOOLVMOPTS} -classpath "GooJar/SubDir/*" Main1.java
Success "$javac" ${TESTTOOLVMOPTS} --class-path "GooJar/SubDir/*" Main1.java
Success "$javac" ${TESTTOOLVMOPTS} --class-path="GooJar/SubDir/*" Main1.java
#Same with launcher. Should not load jar in subdirectories unless specified
Failure "$java" ${TESTVMOPTS} -classpath "GooJar/*${PS}." Main1
Success "$java" ${TESTVMOPTS} -classpath "GooJar/SubDir/*${PS}." Main1
Success "$java" ${TESTVMOPTS} -cp "GooJar/SubDir/*${PS}." Main1
Success env CLASSPATH="GooJar/SubDir/*" "$javac" ${TESTTOOLVMOPTS} Main1.java
Success env CLASSPATH="GooJar/SubDir/*${PS}." "$java" ${TESTVMOPTS} Main1
#----------------------------------------------------------------
# Verify the jar files in 2 directories
#----------------------------------------------------------------
Success "$javac" ${TESTTOOLVMOPTS} -classpath "GooJar/Lib.jar${PS}SpeJar/Spe,Comma.jar" Main5.java
Success "$java" ${TESTVMOPTS} -classpath "GooJar/Lib.jar${PS}SpeJar/Spe,Comma.jar${PS}." Main5
Success "$javac" ${TESTTOOLVMOPTS} -classpath "GooJar/*${PS}SpeJar/*" Main5.java
Success "$java" ${TESTVMOPTS} -classpath "GooJar/*${PS}SpeJar/*${PS}." Main5
#----------------------------------------------------------------
# Verify jar file and class file in same directory.
#----------------------------------------------------------------
Success "$javac" ${TESTTOOLVMOPTS} -classpath "JarNClass/*${PS}" Main.java
Success "$java" ${TESTVMOPTS} -classpath "JarNClass/*${PS}." Main
#----------------------------------------------------------------
# Verify these odd jar files work explicitly on classpath, kind of
# a baseline. Last one is also a test with * in a jar name.
#----------------------------------------------------------------
Failure "$javac" ${TESTTOOLVMOPTS} -classpath "SpeJar/Spe:Colon.jar" Main1.java
Success "$javac" ${TESTTOOLVMOPTS} -classpath "SpeJar/Spe,Comma.jar" Main2.java
Success "$java" ${TESTVMOPTS} -classpath "SpeJar/Spe,Comma.jar${PS}." Main2
UnixOnly Success "$javac" ${TESTTOOLVMOPTS} -classpath "SpeJar/Spe;Semi.jar" Main3.java
UnixOnly Success "$java" ${TESTVMOPTS} -classpath "SpeJar/Spe;Semi.jar${PS}." Main3
UnixOnly Success "$javac" ${TESTTOOLVMOPTS} -classpath "SpeJar/Spe*wc.jar" Main4.java
UnixOnly Success "$java" ${TESTVMOPTS} -classpath "SpeJar/Spe*wc.jar${PS}." Main4
#----------------------------------------------------------------
# Verify these odd jar files work with classpath wildcard.
#----------------------------------------------------------------
speJar() {
printf "Running tests with jar file names containing special characters\n"
# Failure "$javac" ${TESTTOOLVMOPTS} -classpath "SpeJar/*" Main1.java
# Success "$java" ${TESTVMOPTS} -classpath "SpeJar/*" Main1
Success "$javac" ${TESTTOOLVMOPTS} -classpath "SpeJar/*" Main2.java
Success "$java" ${TESTVMOPTS} -classpath "SpeJar/*${PS}." Main2
Success "$javac" ${TESTTOOLVMOPTS} -classpath "SpeJar/*" Main3.java
Success "$java" ${TESTVMOPTS} -classpath "SpeJar/*${PS}." Main3
Success "$javac" ${TESTTOOLVMOPTS} -classpath "SpeJar/*" Main4.java
Success "$java" ${TESTVMOPTS} -classpath "SpeJar/*${PS}." Main4
}
UnixOnly speJar
#----------------------------------------------------------------
# Verify these jar files with asterisk in jar file name
#----------------------------------------------------------------
starJar() {
printf "Running tests with jar file names containing \"*\"\n"
Success "$javac" ${TESTTOOLVMOPTS} -classpath "StarJar/*jar.jar" Main2.java
Success "$java" ${TESTVMOPTS} -classpath "StarJar/*jar.jar${PS}." Main2
Success "$javac" ${TESTTOOLVMOPTS} -classpath "StarJar/jar*.jar" Main3.java
Success "$java" ${TESTVMOPTS} -classpath "StarJar/jar*.jar${PS}." Main3
Success "$javac" ${TESTTOOLVMOPTS} -classpath "StarJar/*jar*.jar" Main4.java
Success "$java" ${TESTVMOPTS} -classpath "StarJar/*jar*.jar${PS}." Main4
Success "$javac" ${TESTTOOLVMOPTS} -classpath "StarJar/*" Main2.java
Success "$java" ${TESTVMOPTS} -classpath "StarJar/*${PS}." Main2
Success "$javac" ${TESTTOOLVMOPTS} -classpath "StarJar/*" Main3.java
Success "$java" ${TESTVMOPTS} -classpath "StarJar/*${PS}." Main3
Success "$javac" ${TESTTOOLVMOPTS} -classpath "StarJar/*" Main4.java
Success "$java" ${TESTVMOPTS} -classpath "StarJar/*${PS}." Main4
}
UnixOnly starJar
#----------------------------------------------------------------
# Verify these jar files with varying extensions
#----------------------------------------------------------------
# Mixed case extensions should not be loaded.
Failure "$javac" ${TESTTOOLVMOPTS} -classpath "MixJar/*" Main1b.java
Success "$javac" ${TESTTOOLVMOPTS} -classpath "MixJar/mix.jAr" Main1b.java
Failure "$javac" ${TESTTOOLVMOPTS} -classpath "MixJar/*" Main1b
#upper case, .JAR, extension should be loaded
UnixOnly Success "$javac" ${TESTTOOLVMOPTS} -classpath "MixJar/*" Main2.java
Success "$javac" ${TESTTOOLVMOPTS} -classpath ".${PS}MixJar/*" Main2.java
Success "$java" ${TESTVMOPTS} -classpath "MixJar/*${PS}." Main2
# zip extensions should not be loaded
Failure "$javac" ${TESTTOOLVMOPTS} -classpath "MixJar/*" Main3.java
Success "$javac" ${TESTTOOLVMOPTS} -classpath "MixJar/mix3.zip" Main3.java
Failure "$java" ${TESTVMOPTS} -classpath "MixJar/*${PS}." Main3
# unix "hidden" file
UnixOnly Success "$javac" ${TESTTOOLVMOPTS} -classpath "MixJar/*" Main4.java
UnixOnly Success "$java" ${TESTVMOPTS} -classpath "MixJar/*${PS}." Main4
Cleanup
Bottom Line
#----------------------------------------------------------------
|