# # Copyright (c) 2008, 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 # @bug 6274276 # @key intermittent # @summary JLI JAR manifest processing should ignore leading and trailing white space. # @author Daniel D. Daugherty # # @run build ManifestTestApp ExampleForBootClassPath # @run shell/timeout=900 ManifestTest.sh # make_a_JAR() { # version_line and premain_line are required version_line="Manifest-Version: 1.0" premain_line="Premain-Class: ${AGENT}" boot_cp_line="" expect_boot_cp_line="ExampleForBootClassPath was not loaded." can_redef_line="" expect_redef_line="isRedefineClassesSupported()=false" can_retrans_line="" expect_retrans_line="isRetransformClassesSupported()=false" can_set_nmp_line="" expect_set_nmp_line="isNativeMethodPrefixSupported()=false" # some tests create directories with spaces in their name, # explicitly delete these. to_be_deleted="" while [ $# != 0 ] ; do case "$1" in defaults) # just use the defaults for the test ;; boot_cp_line1) boot_cp_line="Boot-Class-Path: no_white_space" expect_boot_cp_line="ExampleForBootClassPath was loaded." mkdir -p no_white_space cp -p $OUT_OF_THE_WAY/ExampleForBootClassPath.class no_white_space ;; boot_cp_line2) boot_cp_line="Boot-Class-Path: has_leading_blank" expect_boot_cp_line="ExampleForBootClassPath was loaded." to_be_deleted=" has_leading_blank" mkdir -p has_leading_blank " has_leading_blank" # the good class is in the directory without the blank cp -p $OUT_OF_THE_WAY/ExampleForBootClassPath.class \ has_leading_blank # the bad class is in the directory with the blank cp -p $OUT_OF_THE_WAY/ExampleForBootClassPath.class.bad \ " has_leading_blank/ExampleForBootClassPath.class" ;; boot_cp_line3) boot_cp_line="Boot-Class-Path: has_trailing_blank " expect_boot_cp_line="ExampleForBootClassPath was loaded." to_be_deleted="has_trailing_blank " mkdir -p has_trailing_blank "has_trailing_blank " # the good class is in the directory without the blank cp -p $OUT_OF_THE_WAY/ExampleForBootClassPath.class \ has_trailing_blank # the bad class is in the directory with the blank cp -p $OUT_OF_THE_WAY/ExampleForBootClassPath.class.bad \ "has_trailing_blank /ExampleForBootClassPath.class" ;; boot_cp_line4) boot_cp_line="Boot-Class-Path: has_leading_and_trailing_blank " expect_boot_cp_line="ExampleForBootClassPath was loaded." to_be_deleted=" has_leading_and_trailing_blank " mkdir -p has_leading_and_trailing_blank \ " has_leading_and_trailing_blank " # the good class is in the directory without the blanks cp -p $OUT_OF_THE_WAY/ExampleForBootClassPath.class \ has_leading_and_trailing_blank # the bad class is in the directory with the blanks cp -p $OUT_OF_THE_WAY/ExampleForBootClassPath.class.bad \ " has_leading_and_trailing_blank /ExampleForBootClassPath.class" ;; boot_cp_line5) boot_cp_line="Boot-Class-Path: has_embedded blank" expect_boot_cp_line="ExampleForBootClassPath was loaded." to_be_deleted="has_embedded blank" mkdir -p has_embedded "has_embedded blank" # the good class is in the first blank separated word cp -p $OUT_OF_THE_WAY/ExampleForBootClassPath.class has_embedded # the bad class is in the directory with the blank cp -p $OUT_OF_THE_WAY/ExampleForBootClassPath.class.bad \ "has_embedded blank/ExampleForBootClassPath.class" ;; can_redef_line1) can_redef_line="Can-Redefine-Classes: true" expect_redef_line="isRedefineClassesSupported()=true" ;; can_redef_line2) can_redef_line="Can-Redefine-Classes: true" expect_redef_line="isRedefineClassesSupported()=true" ;; can_redef_line3) can_redef_line="Can-Redefine-Classes: true " expect_redef_line="isRedefineClassesSupported()=true" ;; can_redef_line4) can_redef_line="Can-Redefine-Classes: true " expect_redef_line="isRedefineClassesSupported()=true" ;; can_redef_line5) can_redef_line="Can-Redefine-Classes: false" ;; can_redef_line6) can_redef_line="Can-Redefine-Classes: false" ;; can_redef_line7) can_redef_line="Can-Redefine-Classes: false " ;; can_redef_line8) can_redef_line="Can-Redefine-Classes: false " ;; can_redef_line9) # this line makes the jar command unhappy and that's # not what we're testing so skip this case can_redef_line="Can-Redefine-Classes:" ;; can_redef_line10) can_redef_line="Can-Redefine-Classes: " ;; can_redef_line11) can_redef_line="Can-Redefine-Classes: " ;; can_retrans_line1) can_retrans_line="Can-Retransform-Classes: true" expect_retrans_line="isRetransformClassesSupported()=true" ;; can_retrans_line2) can_retrans_line="Can-Retransform-Classes: true" expect_retrans_line="isRetransformClassesSupported()=true" ;; can_retrans_line3) can_retrans_line="Can-Retransform-Classes: true " expect_retrans_line="isRetransformClassesSupported()=true" ;; can_retrans_line4) can_retrans_line="Can-Retransform-Classes: true " expect_retrans_line="isRetransformClassesSupported()=true" ;; can_retrans_line5) can_retrans_line="Can-Retransform-Classes: false" ;; can_retrans_line6) can_retrans_line="Can-Retransform-Classes: false" ;; can_retrans_line7) can_retrans_line="Can-Retransform-Classes: false " ;; can_retrans_line8) can_retrans_line="Can-Retransform-Classes: false " ;; can_retrans_line9) # this line makes the jar command unhappy and that's # not what we're testing so skip this case can_retrans_line="Can-Retransform-Classes:" ;; can_retrans_line10) can_retrans_line="Can-Retransform-Classes: " ;; can_retrans_line11) can_retrans_line="Can-Retransform-Classes: " ;; can_set_nmp_line1) can_set_nmp_line="Can-Set-Native-Method-Prefix: true" expect_set_nmp_line="isNativeMethodPrefixSupported()=true" ;; can_set_nmp_line2) can_set_nmp_line="Can-Set-Native-Method-Prefix: true" expect_set_nmp_line="isNativeMethodPrefixSupported()=true" ;; can_set_nmp_line3) can_set_nmp_line="Can-Set-Native-Method-Prefix: true " expect_set_nmp_line="isNativeMethodPrefixSupported()=true" ;; can_set_nmp_line4) can_set_nmp_line="Can-Set-Native-Method-Prefix: true " expect_set_nmp_line="isNativeMethodPrefixSupported()=true" ;; can_set_nmp_line5) can_set_nmp_line="Can-Set-Native-Method-Prefix: false" ;; can_set_nmp_line6) can_set_nmp_line="Can-Set-Native-Method-Prefix: false" ;; can_set_nmp_line7) can_set_nmp_line="Can-Set-Native-Method-Prefix: false " ;; can_set_nmp_line8) can_set_nmp_line="Can-Set-Native-Method-Prefix: false " ;; can_set_nmp_line9) # this line makes the jar command unhappy and that's # not what we're testing so skip this case can_set_nmp_line="Can-Set-Native-Method-Prefix:" ;; can_set_nmp_line10) can_set_nmp_line="Can-Set-Native-Method-Prefix: " ;; can_set_nmp_line11) can_set_nmp_line="Can-Set-Native-Method-Prefix: " ;; premain_line1) premain_line="Premain-Class: ${AGENT}" ;; premain_line2) premain_line="Premain-Class: ${AGENT} " ;; premain_line3) premain_line="Premain-Class: ${AGENT} " ;; version_line1) version_line="Manifest-Version: 1.0" ;; version_line2) version_line="Manifest-Version: 1.0 " ;; version_line3) version_line="Manifest-Version: 1.0 " ;; *) echo "ERROR: invalid test token" exit 1 esac shift done echo "${version_line}" > ${AGENT}.mf echo "${premain_line}" >> ${AGENT}.mf if [ -n "$boot_cp_line" ]; then echo "${boot_cp_line}" >> ${AGENT}.mf fi if [ -n "$can_redef_line" ]; then echo "${can_redef_line}" >> ${AGENT}.mf fi if [ -n "$can_retrans_line" ]; then echo "${can_retrans_line}" >> ${AGENT}.mf fi if [ -n "$can_set_nmp_line" ]; then echo "${can_set_nmp_line}" >> ${AGENT}.mf fi rm -f ${AGENT}.jar ${JAR} ${TESTTOOLVMOPTS} cvfm ${AGENT}.jar ${AGENT}.mf ${AGENT}.class echo "$expect_boot_cp_line" > expect_boot_cp_line echo "$expect_redef_line" > expect_redef_line echo "$expect_retrans_line" > expect_retrans_line echo "$expect_set_nmp_line" > expect_set_nmp_line } if [ "${TESTJAVA}" = "" ] then echo "TESTJAVA not set. Test cannot execute. Failed." exit 1 fi if [ "${COMPILEJAVA}" = "" ] then COMPILEJAVA="${TESTJAVA}" fi echo "COMPILEJAVA=${COMPILEJAVA}" if [ "${TESTSRC}" = "" ] then echo "TESTSRC not set. Test cannot execute. Failed." exit 1 fi if [ "${TESTCLASSES}" = "" ] then echo "TESTCLASSES not set. Test cannot execute. Failed." exit 1 fi JAR="${COMPILEJAVA}/bin/jar" JAVAC="${COMPILEJAVA}"/bin/javac JAVA="${TESTJAVA}"/bin/java # Now that ManifestTestApp.class is built, we move # ExampleForBootClassPath.class so that it cannot be found # by default OUT_OF_THE_WAY=out_of_the_way mkdir $OUT_OF_THE_WAY mv "${TESTCLASSES}/ExampleForBootClassPath.class" $OUT_OF_THE_WAY # create a bad version of ExampleForBootClassPath.class # so we can tell when the wrong version is run sed 's/return 15/return 42/' "${TESTSRC}"/ExampleForBootClassPath.java \ > ExampleForBootClassPath.java "$JAVAC" ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} ExampleForBootClassPath.java mv ExampleForBootClassPath.class \ $OUT_OF_THE_WAY/ExampleForBootClassPath.class.bad mv ExampleForBootClassPath.java \ $OUT_OF_THE_WAY/ExampleForBootClassPath.java.bad AGENT=ManifestTestAgent # We compile the agent in the working directory instead of with # a build task because we construct a different agent JAR file # for each test case. ${JAVAC} ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} -d . ${TESTSRC}/${AGENT}.java FAIL_MARKER=fail_marker rm -f $FAIL_MARKER while read token; do echo echo "===== begin test case: $token =====" make_a_JAR "$token" "${JAVA}" ${TESTVMOPTS} -javaagent:${AGENT}.jar \ -classpath "${TESTCLASSES}" ManifestTestApp > output.log 2>&1 result=$? cat output.log if [ "$result" = 0 ]; then echo "PASS: ManifestTestApp exited with status of 0." else echo "FAIL: ManifestTestApp exited with status of $result" touch $FAIL_MARKER fi MESG="Hello from ${AGENT}!" grep -s "$MESG" output.log > /dev/null result=$? if [ "$result" = 0 ]; then echo "PASS: found '$MESG' in the test output" else echo "FAIL: did NOT find '$MESG' in the test output" touch $FAIL_MARKER fi MESG=`cat expect_boot_cp_line | tr -d '\n\r'` grep -s "$MESG" output.log > /dev/null result=$? if [ "$result" = 0 ]; then echo "PASS: found '$MESG' in the test output" else echo "FAIL: did NOT find '$MESG' in the test output" touch $FAIL_MARKER fi MESG=`cat expect_redef_line | tr -d '\n\r'` grep -s "$MESG" output.log > /dev/null result=$? if [ "$result" = 0 ]; then echo "PASS: found '$MESG' in the test output" else echo "FAIL: did NOT find '$MESG' in the test output" touch $FAIL_MARKER fi MESG=`cat expect_retrans_line | tr -d '\n\r'` grep -s "$MESG" output.log > /dev/null result=$? if [ "$result" = 0 ]; then echo "PASS: found '$MESG' in the test output" else echo "FAIL: did NOT find '$MESG' in the test output" touch $FAIL_MARKER fi MESG=`cat expect_set_nmp_line | tr -d '\n\r'` grep -s "$MESG" output.log > /dev/null result=$? if [ "$result" = 0 ]; then echo "PASS: found '$MESG' in the test output" else echo "FAIL: did NOT find '$MESG' in the test output" touch $FAIL_MARKER fi #clean up any problematic directories if [ -n "$to_be_deleted" ]; then echo "Test removing [$to_be_deleted]" rm -rf "$to_be_deleted" fi echo "===== end test case: $token =====" echo done << EOF defaults version_line1 version_line2 version_line3 premain_line1 premain_line2 premain_line3 boot_cp_line1 boot_cp_line2 boot_cp_line3 boot_cp_line4 boot_cp_line5 can_redef_line1 can_redef_line2 can_redef_line3 can_redef_line4 can_redef_line5 can_redef_line6 can_redef_line7 can_redef_line8 can_redef_line10 can_redef_line11 can_retrans_line1 can_retrans_line2 can_retrans_line3 can_retrans_line4 can_retrans_line5 can_retrans_line6 can_retrans_line7 can_retrans_line8 can_retrans_line10 can_retrans_line11 can_set_nmp_line1 can_set_nmp_line2 can_set_nmp_line3 can_set_nmp_line4 can_set_nmp_line5 can_set_nmp_line6 can_set_nmp_line7 can_set_nmp_line8 can_set_nmp_line10 can_set_nmp_line11 EOF if [ -f $FAIL_MARKER ]; then exit 1 else exit 0 fi