Diagnostics.sh revision 3294:9adfb22ff08f
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 4884487 6295519 6236704 6429613
29# @summary Test for proper diagnostics during path manipulation operations
30# @author Martin Buchholz
31#
32# @run shell/timeout=180 Diagnostics.sh
33
34# To run this test manually, simply do ./Diagnostics.sh
35
36. ${TESTSRC-.}/Util.sh
37
38set -u
39
40# BCP=`DefaultBootClassPath`
41
42DiagnosticsInEnglishPlease
43
44No() { NO="no"; "$@"; NO=""; }  # No means NO!
45
46Warning() {
47    HorizontalRule
48    echo "$@"
49    output=`"$@" 2>&1`; rc="$?"
50    output2=`echo "$output" | grep -v "bootstrap class path not set in conjunction with -source"`
51    test -n "$output2" && echo "$output"
52    test $rc -eq 0 || Fail "Command \"$*\" failed with exitValue $rc";
53    case "$output2" in *warning:*) gotwarning="yes";; *) gotwarning="no";; esac
54
55    if test "$gotwarning" = "yes" -a "$NO" = "no"; then
56        Fail "Command \"$*\" printed an unexpected warning"
57    elif test "$gotwarning" = "no" -a "$NO" != "no"; then
58        Fail "Command \"$*\" did not generate the expected warning"
59    fi
60}
61
62Error() {
63    HorizontalRule
64    echo "$@"
65    output=`"$@" 2>&1`; rc="$?"
66    test -n "$output" && echo "$output"
67    case "$output" in *error:*) goterror="yes";; *) goterror="no";; esac
68
69    if test "$NO" = "no"; then
70        test "$rc" -ne 0 && \
71            Fail "Command \"$*\" failed with return code $rc"
72        test "$goterror" = "yes" && \
73            Fail "Command \"$*\" did not generate any error message"
74    else
75        test "$rc" -eq 0 && \
76            Fail "Command \"$*\" was supposed to Die with fatal error";
77        test "$goterror" = "no" && \
78            Fail "Command \"$*\" printed an unexpected error message"
79    fi
80}
81
82Cleanup() {
83    Sys rm -rf Main.java Main.class
84    Sys rm -rf classes classes.foo classes.jar classes.war classes.zip
85    Sys rm -rf MANIFEST.MF classesRef.jar classesRefRef.jar jars
86}
87
88Cleanup
89echo "public class Main{public static void main(String[]a){}}" > Main.java
90
91# We need to set -source 8 -target 8 for those cases where the option is
92# not legal in 9 and later. However, that triggers an additional warning
93# about not setting bootclasspath, which is filtered out in Warning.
94# The alternative would be to extract a minimal rt.jar from JDK and
95# specify that with -bootclasspath.
96SRCTRG8="-source 8 -target 8"
97
98#----------------------------------------------------------------
99# No warnings unless -Xlint:path is used
100#----------------------------------------------------------------
101No Warning "$javac" ${TESTTOOLVMOPTS} Main.java
102No Warning "$javac" ${TESTTOOLVMOPTS} -cp ".${PS}classes" Main.java
103
104#----------------------------------------------------------------
105# Warn for missing elts in user-specified paths
106#----------------------------------------------------------------
107Warning "$javac" ${TESTTOOLVMOPTS}           -Xlint:path -cp ".${PS}classes"         Main.java
108Warning "$javac" ${TESTTOOLVMOPTS} ${SRCTRG8} -Xlint:path "-Xbootclasspath/p:classes" Main.java
109Warning "$javac" ${TESTTOOLVMOPTS} ${SRCTRG8} -Xlint      "-Xbootclasspath/a:classes" Main.java
110
111Warning "$javac" ${TESTTOOLVMOPTS} ${SRCTRG8} -Xlint:path "-endorseddirs" "classes"   Main.java
112Warning "$javac" ${TESTTOOLVMOPTS} ${SRCTRG8} -Xlint      "-extdirs"      "classes"   Main.java
113#Warning "$javac" ${TESTTOOLVMOPTS} ${SRCTRG8} -Xlint:path "-Xbootclasspath:classes${PS}${BCP}" Main.java
114
115#----------------------------------------------------------------
116# No warning for missing elts in "system" paths
117#----------------------------------------------------------------
118# No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-J-Djava.endorsed.dirs=classes" Main.java
119# No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-J-Djava.ext.dirs=classes"      Main.java
120# No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-J-Xbootclasspath/p:classes"    Main.java
121# No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-J-Xbootclasspath/a:classes"    Main.java
122# No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-J-Xbootclasspath:classes${PS}${BCP}" Main.java
123
124#----------------------------------------------------------------
125# No warning if class path element exists
126#----------------------------------------------------------------
127Sys mkdir classes
128No Warning "$javac" ${TESTTOOLVMOPTS}           -Xlint:path -cp ".${PS}classes"         Main.java
129No Warning "$javac" ${TESTTOOLVMOPTS} ${SRCTRG8} -Xlint:path "-endorseddirs"   "classes" Main.java
130No Warning "$javac" ${TESTTOOLVMOPTS} ${SRCTRG8} -Xlint:path "-extdirs"        "classes" Main.java
131No Warning "$javac" ${TESTTOOLVMOPTS} ${SRCTRG8} -Xlint:path "-Xbootclasspath/p:classes" Main.java
132No Warning "$javac" ${TESTTOOLVMOPTS} ${SRCTRG8} -Xlint:path "-Xbootclasspath/a:classes" Main.java
133#No Warning "$javac" ${TESTTOOLVMOPTS} ${SRCTRG8} -Xlint:path "-Xbootclasspath:classes${PS}${BCP}" Main.java
134
135Sys "$jar" cf classes.jar Main.class
136Sys cp classes.jar classes.war
137Sys cp classes.war classes.zip
138No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path -cp ".${PS}classes.jar"     Main.java
139   Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path -cp ".${PS}classes.war"     Main.java
140No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path -cp ".${PS}classes.zip"     Main.java
141
142#----------------------------------------------------------------
143# Warn if -Xlint is used and if class path element refers to
144# regular file which doesn't look like a zip file, but is
145#----------------------------------------------------------------
146Sys cp classes.war classes.foo
147   Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path -cp ".${PS}classes.foo"     Main.java
148
149
150#----------------------------------------------------------------
151# No error if class path element refers to regular file which is
152# not a zip file
153#----------------------------------------------------------------
154No Error "$javac" ${TESTTOOLVMOPTS} -cp Main.java Main.java # Main.java is NOT a jar file
155No Error "$javac" ${TESTTOOLVMOPTS} Main.java
156
157#----------------------------------------------------------------
158# Warn if -Xlint is used and if class path element refers to
159# regular file which is not a zip file
160#----------------------------------------------------------------
161Warning "$javac" ${TESTTOOLVMOPTS} -Xlint -cp Main.java Main.java # Main.java is NOT a jar file
162
163#----------------------------------------------------------------
164# Test jar file class path reference recursion
165#----------------------------------------------------------------
166MkManifestWithClassPath classesRef.jar
167Sys "$jar" cmf MANIFEST.MF classesRefRef.jar Main.class
168
169#----------------------------------------------------------------
170# Non-existent recursive Class-Path reference gives warning
171#----------------------------------------------------------------
172No Warning "$javac" ${TESTTOOLVMOPTS}                        -classpath   classesRefRef.jar Main.java
173   Warning "$javac" ${TESTTOOLVMOPTS}            -Xlint      -classpath   classesRefRef.jar Main.java
174No Warning "$javac" ${TESTTOOLVMOPTS} ${SRCTRG8} -Xlint -Xbootclasspath/p:classesRefRef.jar Main.java
175
176BadJarFile classesRef.jar
177
178#----------------------------------------------------------------
179# Non-jar file recursive Class-Path reference gives error
180#----------------------------------------------------------------
181   Error "$javac" ${TESTTOOLVMOPTS}            -classpath        classesRefRef.jar Main.java
182No Error "$javac" ${TESTTOOLVMOPTS} ${SRCTRG8} -Xbootclasspath/a:classesRefRef.jar Main.java
183
184MkManifestWithClassPath classes
185Sys "$jar" cmf MANIFEST.MF classesRef.jar Main.class
186
187#----------------------------------------------------------------
188# Jar file recursive Class-Path reference is OK
189#----------------------------------------------------------------
190No Warning "$javac" ${TESTTOOLVMOPTS}            -Xlint      -classpath   classesRefRef.jar Main.java
191No Warning "$javac" ${TESTTOOLVMOPTS} ${SRCTRG8} -Xlint -Xbootclasspath/p:classesRefRef.jar Main.java
192
193#----------------------------------------------------------------
194# Class-Path attribute followed in extdirs or endorseddirs
195#----------------------------------------------------------------
196Sys mkdir jars
197Sys cp classesRefRef.jar jars/.
198   Warning "$javac" ${TESTTOOLVMOPTS} ${SRCTRG8} -Xlint -extdirs      jars Main.java
199   Warning "$javac" ${TESTTOOLVMOPTS} ${SRCTRG8} -Xlint -endorseddirs jars Main.java
200
201#----------------------------------------------------------------
202# Bad Jar file in extdirs and endorseddirs should not be ignored
203#----------------------------------------------------------------
204BadJarFile jars/classesRef.jar
205   Error "$javac" ${TESTTOOLVMOPTS} ${SRCTRG8} -Xlint -extdirs      jars Main.java
206   Error "$javac" ${TESTTOOLVMOPTS} ${SRCTRG8} -Xlint -endorseddirs jars Main.java
207
208Cleanup
209
210Bottom Line
211