aoqi@0: #!/bin/sh aoqi@0: aoqi@0: # aoqi@0: # Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. aoqi@0: # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. aoqi@0: # aoqi@0: # This code is free software; you can redistribute it and/or modify it aoqi@0: # under the terms of the GNU General Public License version 2 only, as aoqi@0: # published by the Free Software Foundation. aoqi@0: # aoqi@0: # This code is distributed in the hope that it will be useful, but WITHOUT aoqi@0: # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or aoqi@0: # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License aoqi@0: # version 2 for more details (a copy is included in the LICENSE file that aoqi@0: # accompanied this code). aoqi@0: # aoqi@0: # You should have received a copy of the GNU General Public License version aoqi@0: # 2 along with this work; if not, write to the Free Software Foundation, aoqi@0: # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. aoqi@0: # aoqi@0: # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA aoqi@0: # or visit www.oracle.com if you need additional information or have any aoqi@0: # questions. aoqi@0: # aoqi@0: aoqi@0: # aoqi@0: # @test aoqi@0: # @bug 4884487 6295519 6236704 6429613 aoqi@0: # @summary Test for proper diagnostics during path manipulation operations aoqi@0: # @author Martin Buchholz aoqi@0: # aoqi@0: # @run shell/timeout=180 Diagnostics.sh aoqi@0: aoqi@0: # To run this test manually, simply do ./Diagnostics.sh aoqi@0: aoqi@0: . ${TESTSRC-.}/Util.sh aoqi@0: aoqi@0: set -u aoqi@0: aoqi@0: BCP=`DefaultBootClassPath` aoqi@0: aoqi@0: DiagnosticsInEnglishPlease aoqi@0: aoqi@0: No() { NO="no"; "$@"; NO=""; } # No means NO! aoqi@0: aoqi@0: Warning() { aoqi@0: HorizontalRule aoqi@0: echo "$@" aoqi@0: output=`"$@" 2>&1`; rc="$?" aoqi@0: test -n "$output" && echo "$output" aoqi@0: test $rc -eq 0 || Fail "Command \"$*\" failed with exitValue $rc"; aoqi@0: case "$output" in *warning:*) gotwarning="yes";; *) gotwarning="no";; esac aoqi@0: aoqi@0: if test "$gotwarning" = "yes" -a "$NO" = "no"; then aoqi@0: Fail "Command \"$*\" printed an unexpected warning" aoqi@0: elif test "$gotwarning" = "no" -a "$NO" != "no"; then aoqi@0: Fail "Command \"$*\" did not generate the expected warning" aoqi@0: fi aoqi@0: } aoqi@0: aoqi@0: Error() { aoqi@0: HorizontalRule aoqi@0: echo "$@" aoqi@0: output=`"$@" 2>&1`; rc="$?" aoqi@0: test -n "$output" && echo "$output" aoqi@0: case "$output" in *error:*) goterror="yes";; *) goterror="no";; esac aoqi@0: aoqi@0: if test "$NO" = "no"; then aoqi@0: test "$rc" -ne 0 && \ aoqi@0: Fail "Command \"$*\" failed with return code $rc" aoqi@0: test "$goterror" = "yes" && \ aoqi@0: Fail "Command \"$*\" did not generate any error message" aoqi@0: else aoqi@0: test "$rc" -eq 0 && \ aoqi@0: Fail "Command \"$*\" was supposed to Die with fatal error"; aoqi@0: test "$goterror" = "no" && \ aoqi@0: Fail "Command \"$*\" printed an unexpected error message" aoqi@0: fi aoqi@0: } aoqi@0: aoqi@0: Cleanup() { aoqi@0: Sys rm -rf Main.java Main.class aoqi@0: Sys rm -rf classes classes.foo classes.jar classes.war classes.zip aoqi@0: Sys rm -rf MANIFEST.MF classesRef.jar classesRefRef.jar jars aoqi@0: } aoqi@0: aoqi@0: Cleanup aoqi@0: echo "public class Main{public static void main(String[]a){}}" > Main.java aoqi@0: aoqi@0: #---------------------------------------------------------------- aoqi@0: # No warnings unless -Xlint:path is used aoqi@0: #---------------------------------------------------------------- aoqi@0: No Warning "$javac" ${TESTTOOLVMOPTS} Main.java aoqi@0: No Warning "$javac" ${TESTTOOLVMOPTS} -cp ".${PS}classes" Main.java aoqi@0: aoqi@0: #---------------------------------------------------------------- aoqi@0: # Warn for missing elts in user-specified paths aoqi@0: #---------------------------------------------------------------- aoqi@0: Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path -cp ".${PS}classes" Main.java aoqi@0: Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-Xbootclasspath/p:classes" Main.java aoqi@0: Warning "$javac" ${TESTTOOLVMOPTS} -Xlint "-Xbootclasspath/a:classes" Main.java aoqi@0: Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-endorseddirs" "classes" Main.java aoqi@0: Warning "$javac" ${TESTTOOLVMOPTS} -Xlint "-extdirs" "classes" Main.java aoqi@0: Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-Xbootclasspath:classes${PS}${BCP}" Main.java aoqi@0: aoqi@0: #---------------------------------------------------------------- aoqi@0: # No warning for missing elts in "system" paths aoqi@0: #---------------------------------------------------------------- aoqi@0: No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-J-Djava.endorsed.dirs=classes" Main.java aoqi@0: No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-J-Djava.ext.dirs=classes" Main.java aoqi@0: No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-J-Xbootclasspath/p:classes" Main.java aoqi@0: No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-J-Xbootclasspath/a:classes" Main.java aoqi@0: No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-J-Xbootclasspath:classes${PS}${BCP}" Main.java aoqi@0: aoqi@0: #---------------------------------------------------------------- aoqi@0: # No warning if class path element exists aoqi@0: #---------------------------------------------------------------- aoqi@0: Sys mkdir classes aoqi@0: No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path -cp ".${PS}classes" Main.java aoqi@0: No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-endorseddirs" "classes" Main.java aoqi@0: No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-extdirs" "classes" Main.java aoqi@0: No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-Xbootclasspath/p:classes" Main.java aoqi@0: No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-Xbootclasspath/a:classes" Main.java aoqi@0: No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-Xbootclasspath:classes${PS}${BCP}" Main.java aoqi@0: aoqi@0: Sys "$jar" cf classes.jar Main.class aoqi@0: Sys cp classes.jar classes.war aoqi@0: Sys cp classes.war classes.zip aoqi@0: No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path -cp ".${PS}classes.jar" Main.java aoqi@0: Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path -cp ".${PS}classes.war" Main.java aoqi@0: No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path -cp ".${PS}classes.zip" Main.java aoqi@0: aoqi@0: #---------------------------------------------------------------- aoqi@0: # Warn if -Xlint is used and if class path element refers to aoqi@0: # regular file which doesn't look like a zip file, but is aoqi@0: #---------------------------------------------------------------- aoqi@0: Sys cp classes.war classes.foo aoqi@0: Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path -cp ".${PS}classes.foo" Main.java aoqi@0: aoqi@0: aoqi@0: #---------------------------------------------------------------- aoqi@0: # No error if class path element refers to regular file which is aoqi@0: # not a zip file aoqi@0: #---------------------------------------------------------------- aoqi@0: No Error "$javac" ${TESTTOOLVMOPTS} -cp Main.java Main.java # Main.java is NOT a jar file aoqi@0: No Error "$javac" ${TESTTOOLVMOPTS} Main.java aoqi@0: aoqi@0: #---------------------------------------------------------------- aoqi@0: # Warn if -Xlint is used and if class path element refers to aoqi@0: # regular file which is not a zip file aoqi@0: #---------------------------------------------------------------- aoqi@0: Warning "$javac" ${TESTTOOLVMOPTS} -Xlint -cp Main.java Main.java # Main.java is NOT a jar file aoqi@0: aoqi@0: #---------------------------------------------------------------- aoqi@0: # Test jar file class path reference recursion aoqi@0: #---------------------------------------------------------------- aoqi@0: MkManifestWithClassPath classesRef.jar aoqi@0: Sys "$jar" cmf MANIFEST.MF classesRefRef.jar Main.class aoqi@0: aoqi@0: #---------------------------------------------------------------- aoqi@0: # Non-existent recursive Class-Path reference gives warning aoqi@0: #---------------------------------------------------------------- aoqi@0: No Warning "$javac" ${TESTTOOLVMOPTS} -classpath classesRefRef.jar Main.java aoqi@0: Warning "$javac" ${TESTTOOLVMOPTS} -Xlint -classpath classesRefRef.jar Main.java aoqi@0: No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint -Xbootclasspath/p:classesRefRef.jar Main.java aoqi@0: aoqi@0: BadJarFile classesRef.jar aoqi@0: aoqi@0: #---------------------------------------------------------------- aoqi@0: # Non-jar file recursive Class-Path reference gives error aoqi@0: #---------------------------------------------------------------- aoqi@0: Error "$javac" ${TESTTOOLVMOPTS} -classpath classesRefRef.jar Main.java aoqi@0: No Error "$javac" ${TESTTOOLVMOPTS} -Xbootclasspath/a:classesRefRef.jar Main.java aoqi@0: aoqi@0: MkManifestWithClassPath classes aoqi@0: Sys "$jar" cmf MANIFEST.MF classesRef.jar Main.class aoqi@0: aoqi@0: #---------------------------------------------------------------- aoqi@0: # Jar file recursive Class-Path reference is OK aoqi@0: #---------------------------------------------------------------- aoqi@0: No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint -classpath classesRefRef.jar Main.java aoqi@0: No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint -Xbootclasspath/p:classesRefRef.jar Main.java aoqi@0: aoqi@0: #---------------------------------------------------------------- aoqi@0: # Class-Path attribute followed in extdirs or endorseddirs aoqi@0: #---------------------------------------------------------------- aoqi@0: Sys mkdir jars aoqi@0: Sys cp -p classesRefRef.jar jars/. aoqi@0: Warning "$javac" ${TESTTOOLVMOPTS} -Xlint -extdirs jars Main.java aoqi@0: Warning "$javac" ${TESTTOOLVMOPTS} -Xlint -endorseddirs jars Main.java aoqi@0: aoqi@0: #---------------------------------------------------------------- aoqi@0: # Bad Jar file in extdirs and endorseddirs should not be ignored aoqi@0: #---------------------------------------------------------------- aoqi@0: BadJarFile jars/classesRef.jar aoqi@0: Error "$javac" ${TESTTOOLVMOPTS} -Xlint -extdirs jars Main.java aoqi@0: Error "$javac" ${TESTTOOLVMOPTS} -Xlint -endorseddirs jars Main.java aoqi@0: aoqi@0: Cleanup aoqi@0: aoqi@0: Bottom Line