duke@1: #!/bin/sh duke@1: duke@1: # ohair@554: # Copyright (c) 2004, 2009, Oracle and/or its affiliates. All rights reserved. duke@1: # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. duke@1: # duke@1: # This code is free software; you can redistribute it and/or modify it duke@1: # under the terms of the GNU General Public License version 2 only, as duke@1: # published by the Free Software Foundation. duke@1: # duke@1: # This code is distributed in the hope that it will be useful, but WITHOUT duke@1: # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or duke@1: # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License duke@1: # version 2 for more details (a copy is included in the LICENSE file that duke@1: # accompanied this code). duke@1: # duke@1: # You should have received a copy of the GNU General Public License version duke@1: # 2 along with this work; if not, write to the Free Software Foundation, duke@1: # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. duke@1: # ohair@554: # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ohair@554: # or visit www.oracle.com if you need additional information or have any ohair@554: # questions. duke@1: # duke@1: duke@1: # @test duke@1: # @bug 5033855 4990902 5023880 5043516 5048534 5048535 5041279 5048539 5067261 5068145 5023881 4996963 5095716 6191667 6433634 duke@1: # @run shell ../verifyVariables.sh duke@1: # @build ErrorAPF duke@1: # @build WarnAPF duke@1: # @build StaticApf duke@1: # @build ClassDeclApf duke@1: # @build ClassDeclApf2 duke@1: # @build Rounds duke@1: # @build Round1Apf Round2Apf Round3Apf Round4Apf duke@1: # @build WrappedStaticApf duke@1: # @run shell compile.sh duke@1: # @summary Test simple usages of apt, including delegating to javac duke@1: # @author Joseph D. Darcy duke@1: duke@1: # If the file *does* exist, exit with an error duke@1: TestNoFile() { duke@1: if [ -f ${1} ]; then duke@1: printf "%s\n" "File ${1} found." duke@1: exit 1 duke@1: fi duke@1: } duke@1: duke@1: # If the file does not exist, exit with an error duke@1: TestFile() { duke@1: if [ ! -f ${1} ]; then duke@1: printf "%s\n" "File ${1} not found." duke@1: exit 1 duke@1: fi duke@1: } duke@1: duke@1: duke@1: OS=`uname -s`; duke@1: case "${OS}" in jjg@387: Windows* ) jjg@387: SEP=";" jjg@387: ;; jjg@387: jjg@387: CYGWIN* ) jjg@387: DIFFOPTS="--strip-trailing-cr" duke@1: SEP=";" duke@1: ;; duke@1: duke@1: * ) duke@1: SEP=":" duke@1: ;; duke@1: esac duke@1: duke@1: darcy@331: APT="${TESTJAVA}/bin/apt ${TESTTOOLVMOPTS} -XDsuppress-tool-api-removal-message " duke@1: JAVA="${TESTJAVA}/bin/java ${TESTVMOPTS} " duke@1: JAVAC="${TESTJAVA}/bin/javac ${TESTTOOLVMOPTS} " duke@1: duke@1: unset CLASSPATH duke@1: duke@1: duke@1: # --------------------------------------------------------------- duke@1: echo "Verify that source 1.6 is not supported duke@1: rm -f HelloWorld.class duke@1: duke@1: printf "%s\n" "-source 1.6" > options0 duke@1: printf "%s\n" "${TESTSRC}/HelloWorld.java" >> options0 duke@1: ${APT} @options0 duke@1: duke@1: RESULT=$? duke@1: case "$RESULT" in duke@1: 0 ) duke@1: echo "FAILED: accepted source 1.6" duke@1: exit 1 duke@1: ;; duke@1: esac duke@1: duke@1: TestNoFile "HelloWorld.class" duke@1: duke@1: # --------------------------------------------------------------- duke@1: duke@1: echo "Verify that target 1.6 is not supported duke@1: rm -f HelloWorld.class duke@1: duke@1: printf "%s\n" "-target 1.6" > options00 duke@1: printf "%s\n" "${TESTSRC}/HelloWorld.java" >> options00 duke@1: ${APT} @options00 duke@1: duke@1: RESULT=$? duke@1: case "$RESULT" in duke@1: 0 ) duke@1: echo "FAILED: accepted target 1.6" duke@1: exit 1 duke@1: ;; duke@1: esac duke@1: duke@1: TestNoFile "HelloWorld.class" duke@1: duke@1: # --------------------------------------------------------------- duke@1: duke@1: echo "Testing javac pass-through with -A in options file" duke@1: rm -f HelloWorld.class duke@1: duke@1: printf "%s\n" "-A" > options1 duke@1: printf "%s\n" "-d ." >> options1 duke@1: printf "%s\n" "${TESTSRC}/HelloWorld.java" >> options1 duke@1: ${APT} @options1 duke@1: duke@1: RESULT=$? duke@1: case "$RESULT" in duke@1: 0 ) duke@1: ;; duke@1: duke@1: * ) duke@1: echo "FAILED: javac with -A in options file did not compile" duke@1: exit 1 duke@1: esac duke@1: TestFile "HelloWorld.class" duke@1: duke@1: duke@1: # --------------------------------------------------------------- duke@1: duke@1: echo "Verifying reporting an error will prevent compilation" duke@1: rm -f HelloWorld.class duke@1: if [ ! -f HelloWorld.java ]; then duke@1: cp ${TESTSRC}/HelloWorld.java . duke@1: fi duke@1: duke@1: duke@1: printf "%s\n" "-factory ErrorAPF" > options2 duke@1: printf "%s\n" "-d ." >> options2 duke@1: printf "%s\n" "-cp ${TESTCLASSES}" >> options2 duke@1: printf "%s\n" "HelloWorld.java" >> options2 duke@1: ${APT} @options2 2> output duke@1: duke@1: TestNoFile "HelloWorld.class" duke@1: jjg@387: diff ${DIFFOPTS} output ${TESTSRC}/golden.txt duke@1: duke@1: RESULT=$? duke@1: case "$RESULT" in duke@1: 0 ) duke@1: ;; duke@1: duke@1: * ) duke@1: echo "FAILED: did not record expected error messages" duke@1: exit 1 duke@1: esac duke@1: duke@1: duke@1: duke@1: # --------------------------------------------------------------- duke@1: duke@1: echo "Verifying reporting a warning *won't* prevent compilation" duke@1: duke@1: rm -f HelloAnnotation.class duke@1: if [ ! -f HelloAnnotation.java ]; then duke@1: cp ${TESTSRC}/HelloAnnotation.java . duke@1: fi duke@1: duke@1: duke@1: printf "%s\n" "-factory WarnAPF" > options3 duke@1: printf "%s\n" "-d ." >> options3 duke@1: printf "%s\n" "-cp ${TESTCLASSES}" >> options3 duke@1: printf "%s\n" "HelloAnnotation.java" >> options3 duke@1: ${APT} @options3 2> output duke@1: jjg@387: diff ${DIFFOPTS} output ${TESTSRC}/goldenWarn.txt duke@1: duke@1: RESULT=$? duke@1: case "$RESULT" in duke@1: 0 ) duke@1: ;; duke@1: duke@1: * ) duke@1: echo "FAILED: did not record expected warning messages" duke@1: exit 1 duke@1: esac duke@1: duke@1: TestFile "HelloAnnotation.class" duke@1: duke@1: # --------------------------------------------------------------- duke@1: duke@1: echo "Verifying static state is available across apt rounds; -factory, -cp" duke@1: duke@1: mkdir -p ./src duke@1: mkdir -p ./class duke@1: duke@1: rm -Rf ./src/* duke@1: rm -Rf ./class/* duke@1: duke@1: printf "%s\n" "-factory StaticApf" > options4 duke@1: printf "%s\n" "-s ./src" >> options4 duke@1: printf "%s\n" "-d ./class" >> options4 duke@1: printf "%s\n" "-cp ${TESTCLASSES}" >> options4 duke@1: # printf "%s\n" "-XPrintAptRounds" >> options4 duke@1: ${APT} @options4 duke@1: duke@1: TestFile "./class/AndAhTwo.class" duke@1: duke@1: # --------------------------------------------------------------- duke@1: duke@1: echo "Verifying static state is available across apt rounds; -factory, -factorypath" duke@1: duke@1: rm -Rf ./src/* duke@1: rm -Rf ./class/* duke@1: duke@1: printf "%s\n" "-factory StaticApf" > options5 duke@1: printf "%s\n" "-s ./src" >> options5 duke@1: printf "%s\n" "-d ./class" >> options5 duke@1: printf "%s\n" "-factorypath ${TESTCLASSES}" >> options5 duke@1: # printf "%s\n" "-XPrintAptRounds" >> options5 duke@1: ${APT} @options5 duke@1: duke@1: TestFile "./class/AndAhTwo.class" duke@1: duke@1: # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= duke@1: duke@1: # Create jar file for StaticApf duke@1: JAR="${TESTJAVA}/bin/jar " duke@1: mkdir -p META-INF/services duke@1: cp ${TESTSRC}/servicesStaticApf META-INF/services/com.sun.mirror.apt.AnnotationProcessorFactory duke@1: cp ${TESTCLASSES}/StaticApf*.class . duke@1: ${JAR} cf0 staticApf.jar StaticApf*.class META-INF duke@1: duke@1: # --------------------------------------------------------------- duke@1: duke@1: echo "Verifying static state is available across apt rounds; -cp" duke@1: duke@1: rm -Rf ./src/* duke@1: rm -Rf ./class/* duke@1: duke@1: printf "%s\n" "-cp staticApf.jar" > options6 duke@1: printf "%s\n" "-s ./src" >> options6 duke@1: printf "%s\n" "-d ./class" >> options6 duke@1: printf "%s\n" "-XPrintAptRounds" >> options6 duke@1: ${APT} @options6 duke@1: duke@1: TestFile "./class/AndAhTwo.class" duke@1: duke@1: # --------------------------------------------------------------- duke@1: duke@1: echo "Verifying static state is available across apt rounds; -factorypath" duke@1: duke@1: rm -Rf ./src/* duke@1: rm -Rf ./class/* duke@1: duke@1: printf "%s\n" "-factorypath staticApf.jar" > options7 duke@1: printf "%s\n" "-s ./src" >> options7 duke@1: printf "%s\n" "-d ./class" >> options7 duke@1: printf "%s\n" "-XPrintAptRounds" >> options7 duke@1: ${APT} @options7 duke@1: duke@1: TestFile "./class/AndAhTwo.class" duke@1: duke@1: # --------------------------------------------------------------- duke@1: duke@1: echo "Verifying -XclassesAsDecls handles class files properly" duke@1: duke@1: rm -Rf ./src/* duke@1: rm -Rf ./class/* duke@1: duke@1: mkdir -p ./tmp/classes duke@1: duke@1: ${JAVAC} -d ./tmp/classes ${TESTSRC}/src/Round1Class.java ${TESTSRC}/src/AhOneClass.java ${TESTSRC}/src/AndAhTwoClass.java duke@1: duke@1: RESULT=$? duke@1: case "$RESULT" in duke@1: 0 ) duke@1: ;; duke@1: duke@1: * ) duke@1: echo "FAILED: javac failed to succesfully compile." duke@1: exit 1 duke@1: esac duke@1: duke@1: printf "%s\n" "-factorypath ${TESTCLASSES}" > options7a duke@1: printf "%s\n" "-factory ClassDeclApf" >> options7a duke@1: printf "%s\n" "-s ./src" >> options7a duke@1: printf "%s\n" "-d ./class" >> options7a duke@1: printf "%s\n" "-XPrintAptRounds" >> options7a duke@1: printf "%s\n" "-XclassesAsDecls" >> options7a duke@1: ${APT} @options7a duke@1: duke@1: TestFile "./class/AndAhTwoClass.class" duke@1: duke@1: # --------------------------------------------------------------- duke@1: duke@1: echo "Verifying -XclassesAsDecls works with command-line arguments" duke@1: duke@1: rm -Rf ./src/* duke@1: rm -Rf ./class/* duke@1: rm -Rf ./tmp/classes duke@1: duke@1: mkdir -p ./tmp/classes duke@1: duke@1: ${JAVAC} -d ./tmp/classes ${TESTSRC}/src/Round1Class.java ${TESTSRC}/src/AndAhTwoClass.java duke@1: duke@1: RESULT=$? duke@1: case "$RESULT" in duke@1: 0 ) duke@1: ;; duke@1: duke@1: * ) duke@1: echo "FAILED: javac failed to succesfully compile." duke@1: exit 1 duke@1: esac duke@1: duke@1: printf "%s\n" "-factorypath ${TESTCLASSES}" > options7b duke@1: printf "%s\n" "-factory ClassDeclApf2" >> options7b duke@1: printf "%s\n" "-XPrintAptRounds" >> options7b duke@1: printf "%s\n" "-XclassesAsDecls" >> options7b duke@1: printf "%s\n" "-cp ${TESTCLASSES}" >> options7b duke@1: printf "%s\n" "ErrorAPF" >> options7b duke@1: printf "%s\n" "WarnAPF" >> options7b duke@1: printf "%s\n" "-s ./src" >> options7b duke@1: printf "%s\n" "-d ./class" >> options7b duke@1: printf "%s\n" "ClassDeclApf" >> options7b duke@1: ${APT} @options7b duke@1: duke@1: RESULT=$? duke@1: case "$RESULT" in duke@1: 0 ) duke@1: ;; duke@1: duke@1: * ) duke@1: echo "FAILED: apt exited with an error code." duke@1: exit 1 duke@1: esac duke@1: duke@1: TestFile "./class/AndAhTwoClass.class" duke@1: TestFile "./class/AhOne.class" duke@1: duke@1: # --------------------------------------------------------------- duke@1: duke@1: echo "Verifying -XclassesAsDecls works with all source files" duke@1: duke@1: rm -Rf ./src/* duke@1: rm -Rf ./class/* duke@1: rm -Rf ./tmp/classes duke@1: duke@1: mkdir -p ./tmp/classes duke@1: duke@1: ${JAVAC} -d ./tmp/classes ${TESTSRC}/src/Round1Class.java ${TESTSRC}/src/AndAhTwoClass.java duke@1: duke@1: RESULT=$? duke@1: case "$RESULT" in duke@1: 0 ) duke@1: ;; duke@1: duke@1: * ) duke@1: echo "FAILED: javac failed to succesfully compile." duke@1: exit 1 duke@1: esac duke@1: duke@1: printf "%s\n" "-factorypath ${TESTCLASSES}" > options7c duke@1: printf "%s\n" "-factory ClassDeclApf2" >> options7c duke@1: printf "%s\n" "-s ./src" >> options7c duke@1: printf "%s\n" "-d ./class" >> options7c duke@1: printf "%s\n" "-sourcepath ${TESTSRC}" >> options7c duke@1: printf "%s\n" "${TESTSRC}/HelloAnnotation.java" >> options7c duke@1: printf "%s\n" "${TESTSRC}/HelloWorld.java" >> options7c duke@1: printf "%s\n" "${TESTSRC}/Dummy1.java" >> options7c duke@1: printf "%s\n" "-XPrintAptRounds" >> options7c duke@1: printf "%s\n" "-XclassesAsDecls" >> options7c duke@1: printf "%s\n" "-cp ${TESTCLASSES}" >> options7c duke@1: ${APT} @options7c duke@1: duke@1: RESULT=$? duke@1: case "$RESULT" in duke@1: 0 ) duke@1: ;; duke@1: duke@1: * ) duke@1: echo "FAILED: apt exited with an error code." duke@1: exit 1 duke@1: esac duke@1: duke@1: TestFile "./class/AndAhTwoClass.class" duke@1: TestFile "./class/AhOne.class" duke@1: TestFile "./class/HelloWorld.class" duke@1: duke@1: # --------------------------------------------------------------- duke@1: duke@1: echo "Verifying -XclassesAsDecls works with mixed class and source files" duke@1: duke@1: rm -Rf ./src/* duke@1: rm -Rf ./class/* duke@1: rm -Rf ./tmp/classes duke@1: duke@1: mkdir -p ./tmp/classes duke@1: duke@1: ${JAVAC} -d ./tmp/classes ${TESTSRC}/src/Round1Class.java ${TESTSRC}/src/AndAhTwoClass.java duke@1: duke@1: RESULT=$? duke@1: case "$RESULT" in duke@1: 0 ) duke@1: ;; duke@1: duke@1: * ) duke@1: echo "FAILED: javac failed to succesfully compile." duke@1: exit 1 duke@1: esac duke@1: duke@1: printf "%s\n" "-factorypath ${TESTCLASSES}" > options7d duke@1: printf "%s\n" "-factory ClassDeclApf2" >> options7d duke@1: printf "%s\n" "-s ./src" >> options7d duke@1: printf "%s\n" "-XclassesAsDecls" >> options7d duke@1: printf "%s\n" "ClassDeclApf" >> options7d duke@1: printf "%s\n" "-d ./class" >> options7d duke@1: printf "%s\n" "ErrorAPF" >> options7d duke@1: printf "%s\n" "-XPrintAptRounds" >> options7d duke@1: printf "%s\n" "${TESTSRC}/HelloWorld.java" >> options7d duke@1: printf "%s\n" "-cp ${TESTCLASSES}" >> options7d duke@1: ${APT} @options7d duke@1: duke@1: RESULT=$? duke@1: case "$RESULT" in duke@1: 0 ) duke@1: ;; duke@1: duke@1: * ) duke@1: echo "FAILED: apt exited with an error code." duke@1: exit 1 duke@1: esac duke@1: duke@1: TestFile "./class/AndAhTwoClass.class" duke@1: TestFile "./class/AhOne.class" duke@1: TestFile "./class/HelloWorld.class" duke@1: duke@1: # --------------------------------------------------------------- duke@1: duke@1: echo "Testing productive factories are called on subsequent rounds" duke@1: duke@1: rm -Rf ./src/* duke@1: rm -Rf ./class/* duke@1: duke@1: rm -Rf META-INF/services/* duke@1: cp ${TESTSRC}/servicesRound1 META-INF/services/com.sun.mirror.apt.AnnotationProcessorFactory duke@1: cp ${TESTCLASSES}/Round1Apf*.class . duke@1: ${JAR} cf0 round1Apf.jar Round1Apf*.class META-INF duke@1: duke@1: rm -Rf META-INF/services/* duke@1: cp ${TESTSRC}/servicesRound2 META-INF/services/com.sun.mirror.apt.AnnotationProcessorFactory duke@1: cp ${TESTCLASSES}/Round2Apf*.class . duke@1: ${JAR} cf0 round2Apf.jar Round2Apf*.class META-INF duke@1: duke@1: rm -Rf META-INF/services/* duke@1: cp ${TESTSRC}/servicesRound3 META-INF/services/com.sun.mirror.apt.AnnotationProcessorFactory duke@1: cp ${TESTCLASSES}/Round3Apf*.class . duke@1: ${JAR} cf0 round3Apf.jar Round3Apf*.class META-INF duke@1: duke@1: rm -Rf META-INF/services/* duke@1: cp ${TESTSRC}/servicesRound4 META-INF/services/com.sun.mirror.apt.AnnotationProcessorFactory duke@1: cp ${TESTCLASSES}/Round4Apf*.class . duke@1: ${JAR} cf0 round4Apf.jar Round4Apf*.class META-INF duke@1: duke@1: cp ${TESTCLASSES}/Round?.class . duke@1: ${JAR} cf0 rounds.jar Round?.class duke@1: jjg@148: # cleanup file to prevent accidental discovery in current directory jjg@148: rm -Rf META-INF/services/* jjg@148: duke@1: printf "%s\n" "-factorypath round1Apf.jar${SEP}round2Apf.jar${SEP}round3Apf.jar${SEP}round4Apf.jar" > options8 duke@1: printf "%s\n" "-classpath rounds.jar" >> options8 duke@1: printf "%s\n" "-s ./src" >> options8 duke@1: printf "%s\n" "-d ./class" >> options8 duke@1: #printf "%s\n" "-XPrintFactoryInfo" >> options8 duke@1: #printf "%s\n" "-XPrintAptRounds" >> options8 duke@1: printf "%s\n" "${TESTSRC}/Dummy1.java" >> options8 duke@1: ${APT} @options8 > multiRoundOutput 2> multiRoundError duke@1: jjg@387: diff ${DIFFOPTS} multiRoundOutput ${TESTSRC}/goldenFactory.txt duke@1: duke@1: RESULT=$? duke@1: case "$RESULT" in duke@1: 0 ) duke@1: ;; duke@1: duke@1: * ) duke@1: echo "FAILED: unexpected factory state" duke@1: exit 1 duke@1: esac duke@1: duke@1: TestFile "./class/Dummy5.class" duke@1: duke@1: # --------------------------------------------------------------- duke@1: duke@1: echo "Verifying static state with programmatic apt entry; no factory options" duke@1: rm -Rf ./src/* duke@1: rm -Rf ./class/* duke@1: ${JAVA} -cp ${TESTJAVA}/lib/tools.jar${SEP}${TESTCLASSES} WrappedStaticApf -s ./src -d ./class -XPrintAptRounds duke@1: TestFile "./class/AndAhTwo.class" duke@1: duke@1: echo "Verifying static state with programmatic apt entry; -factory" duke@1: rm -Rf ./src/* duke@1: rm -Rf ./class/* duke@1: ${JAVA} -cp ${TESTJAVA}/lib/tools.jar${SEP}${TESTCLASSES} WrappedStaticApf -factory ErrorAPF -s ./src -d ./class -XPrintAptRounds duke@1: TestFile "./class/AndAhTwo.class" duke@1: duke@1: echo "Verifying static state with programmatic apt entry; -factorypath" duke@1: rm -Rf ./src/* duke@1: rm -Rf ./class/* duke@1: ${JAVA} -cp ${TESTJAVA}/lib/tools.jar${SEP}${TESTCLASSES} WrappedStaticApf -factorypath round1Apf.jar -s ./src -d ./class -XPrintAptRounds duke@1: TestFile "./class/AndAhTwo.class" duke@1: duke@1: echo "Verifying static state with programmatic apt entry; -factory and -factorypath" duke@1: rm -Rf ./src/* duke@1: rm -Rf ./class/* duke@1: ${JAVA} -cp ${TESTJAVA}/lib/tools.jar${SEP}${TESTCLASSES} WrappedStaticApf -factorypath round1Apf.jar -factory Round1Apf -s ./src -d ./class -XPrintAptRounds duke@1: TestFile "./class/AndAhTwo.class" duke@1: duke@1: exit 0