| # | |
| # Copyright (c) 2008, 2024, 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 | |
| # @summary JLI JAR manifest processing should ignore leading and trailing white space. | |
| # @author Daniel D. Daugherty | |
| # | |
| # @key intermittent | |
| # @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} ${TESTJAVAOPTS} -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 |