# HG changeset patch # User amurillo # Date 1400231592 25200 # Node ID 97e9abb0864b6976691781e095086cd96e16d887 # Parent 97932f6ad950ae5a73a9da5c96e6e58503ff646b# Parent dca843327b90ad64a872c34e2702db095bce5e9a Merge diff -r dca843327b90 -r 97e9abb0864b .hgtags --- a/.hgtags Thu May 15 11:35:26 2014 -0700 +++ b/.hgtags Fri May 16 02:13:12 2014 -0700 @@ -255,3 +255,4 @@ 8c0bdeecd7c0f9ce3f3762a51991f755cb3a972c jdk9-b10 0809c9a4d36e6291f1c4384604c4bbf29e975722 jdk9-b11 0d1f816217dce5e72187f167cc1816080cbeb453 jdk9-b12 +1a30593dcb9802faec3b6edb24d86ca088594e4e jdk9-b13 diff -r dca843327b90 -r 97e9abb0864b .hgtags-top-repo --- a/.hgtags-top-repo Thu May 15 11:35:26 2014 -0700 +++ b/.hgtags-top-repo Fri May 16 02:13:12 2014 -0700 @@ -255,3 +255,4 @@ fa13f2b926f8426876ec03e7903f3ee0ee150f2e jdk9-b10 ab55a18a95e1990a588929d5d29db3eb9985fea0 jdk9-b11 59f6350295f9681fe5956d8bc889bf341914c6cb jdk9-b12 +5800456add07e1a68170a229fb5e27376f8875e5 jdk9-b13 diff -r dca843327b90 -r 97e9abb0864b common/autoconf/boot-jdk.m4 --- a/common/autoconf/boot-jdk.m4 Thu May 15 11:35:26 2014 -0700 +++ b/common/autoconf/boot-jdk.m4 Fri May 16 02:13:12 2014 -0700 @@ -331,8 +331,8 @@ # Finally, set some other options... - # When compiling code to be executed by the Boot JDK, force jdk7 compatibility. - BOOT_JDK_SOURCETARGET="-source 7 -target 7" + # When compiling code to be executed by the Boot JDK, force jdk8 compatibility. + BOOT_JDK_SOURCETARGET="-source 8 -target 8" AC_SUBST(BOOT_JDK_SOURCETARGET) AC_SUBST(JAVAC_FLAGS) ]) diff -r dca843327b90 -r 97e9abb0864b common/autoconf/generated-configure.sh --- a/common/autoconf/generated-configure.sh Thu May 15 11:35:26 2014 -0700 +++ b/common/autoconf/generated-configure.sh Fri May 16 02:13:12 2014 -0700 @@ -4243,7 +4243,7 @@ #CUSTOM_AUTOCONF_INCLUDE # Do not change or remove the following line, it is needed for consistency checks: -DATE_WHEN_GENERATED=1398861894 +DATE_WHEN_GENERATED=1399969244 ############################################################################### # @@ -26004,8 +26004,8 @@ # Finally, set some other options... - # When compiling code to be executed by the Boot JDK, force jdk7 compatibility. - BOOT_JDK_SOURCETARGET="-source 7 -target 7" + # When compiling code to be executed by the Boot JDK, force jdk8 compatibility. + BOOT_JDK_SOURCETARGET="-source 8 -target 8" diff -r dca843327b90 -r 97e9abb0864b common/bin/hgforest.sh --- a/common/bin/hgforest.sh Thu May 15 11:35:26 2014 -0700 +++ b/common/bin/hgforest.sh Fri May 16 02:13:12 2014 -0700 @@ -1,5 +1,4 @@ #!/bin/sh - # # Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -23,25 +22,40 @@ # questions. # -# Shell script for a fast parallel forest command +# Shell script for a fast parallel forest/trees command -global_opts="" -status_output="/dev/stdout" -qflag="false" -vflag="false" -sflag="false" +usage() { + echo "usage: $0 [-h|--help] [-q|--quiet] [-v|--verbose] [-s|--sequential] [--] [commands...]" > ${status_output} + echo "Environment variables which modify behaviour:" + echo " HGFOREST_QUIET : (boolean) If 'true' then standard output is redirected to /dev/null" + echo " HGFOREST_VERBOSE : (boolean) If 'true' then Mercurial asked to produce verbose output" + echo " HGFOREST_SEQUENTIAL : (boolean) If 'true' then repos are processed sequentially. Disables concurrency" + echo " HGFOREST_GLOBALOPTS : (string, must begin with space) Additional Mercurial global options" + echo " HGFOREST_REDIRECT : (file path) Redirect standard output to specified file" + echo " HGFOREST_FIFOS : (boolean) Default behaviour for FIFO detection. Does not override FIFOs disabled" + echo " HGFOREST_CONCURRENCY: (positive integer) Number of repos to process concurrently" + echo " HGFOREST_DEBUG : (boolean) If 'true' then temp files are retained" + exit 1 +} + +global_opts="${HGFOREST_GLOBALOPTS:-}" +status_output="${HGFOREST_REDIRECT:-/dev/stdout}" +qflag="${HGFOREST_QUIET:-false}" +vflag="${HGFOREST_VERBOSE:-false}" +sflag="${HGFOREST_SEQUENTIAL:-false}" while [ $# -gt 0 ] do case $1 in + -h | --help ) + usage + ;; + -q | --quiet ) qflag="true" - global_opts="${global_opts} -q" - status_output="/dev/null" ;; -v | --verbose ) vflag="true" - global_opts="${global_opts} -v" ;; -s | --sequential ) @@ -63,39 +77,60 @@ shift done - -command="$1"; shift -command_args="$@" +# silence standard output? +if [ ${qflag} = "true" ] ; then + global_opts="${global_opts} -q" + status_output="/dev/null" +fi -usage() { - echo "usage: $0 [-q|--quiet] [-v|--verbose] [-s|--sequential] [--] [commands...]" > ${status_output} - exit 1 -} +# verbose output? +if [ ${vflag} = "true" ] ; then + global_opts="${global_opts} -v" +fi -if [ "x" = "x$command" ] ; then +# Make sure we have a command. +if [ $# -lt 1 -o -z "${1:-}" ] ; then echo "ERROR: No command to hg supplied!" usage fi -# Check if we can use fifos for monitoring sub-process completion. -on_windows=`uname -s | egrep -ic -e 'cygwin|msys'` -if [ ${on_windows} = "1" ]; then - # cygwin has (2014-04-18) broken (single writer only) FIFOs - # msys has (2014-04-18) no FIFOs. - have_fifos="false" -else - have_fifos="true" -fi +command="$1"; shift +command_args="${@:-}" # Clean out the temporary directory that stores the pid files. tmp=/tmp/forest.$$ rm -f -r ${tmp} mkdir -p ${tmp} + +if [ "${HGFOREST_DEBUG:-false}" = "true" ] ; then + echo "DEBUG: temp files are in: ${tmp}" +fi + +# Check if we can use fifos for monitoring sub-process completion. +echo "1" > ${tmp}/read +while_subshell=1 +while read line; do + while_subshell=0 + break; +done < ${tmp}/read +rm ${tmp}/read + +on_windows=`uname -s | egrep -ic -e 'cygwin|msys'` + +if [ ${while_subshell} = "1" -o ${on_windows} = "1" ]; then + # cygwin has (2014-04-18) broken (single writer only) FIFOs + # msys has (2014-04-18) no FIFOs. + # older shells create a sub-shell for redirect to while + have_fifos="false" +else + have_fifos="${HGFOREST_FIFOS:-true}" +fi + safe_interrupt () { if [ -d ${tmp} ]; then if [ "`ls ${tmp}/*.pid`" != "" ]; then - echo "Waiting for processes ( `cat ${tmp}/*.pid | tr '\n' ' '`) to terminate nicely!" > ${status_output} + echo "Waiting for processes ( `cat ${tmp}/.*.pid ${tmp}/*.pid 2> /dev/null | tr '\n' ' '`) to terminate nicely!" > ${status_output} sleep 1 # Pipe stderr to dev/null to silence kill, that complains when trying to kill # a subprocess that has already exited. @@ -110,10 +145,12 @@ nice_exit () { if [ -d ${tmp} ]; then - if [ "`ls ${tmp}`" != "" ]; then + if [ "`ls -A ${tmp} 2> /dev/null`" != "" ]; then wait fi - rm -f -r ${tmp} + if [ "${HGFOREST_DEBUG:-false}" != "true" ] ; then + rm -f -r ${tmp} + fi fi } @@ -128,17 +165,20 @@ repos="" repos_extra="" if [ "${command}" = "clone" -o "${command}" = "fclone" -o "${command}" = "tclone" ] ; then + # we must be a clone if [ ! -f .hg/hgrc ] ; then echo "ERROR: Need initial repository to use this script" > ${status_output} exit 1 fi + # the clone must know where it came from (have a default pull path). pull_default=`hg paths default` if [ "${pull_default}" = "" ] ; then echo "ERROR: Need initial clone with 'hg paths default' defined" > ${status_output} exit 1 fi + # determine which sub repos need to be cloned. for i in ${subrepos} ; do if [ ! -f ${i}/.hg/hgrc ] ; then repos="${repos} ${i}" @@ -147,12 +187,15 @@ pull_default_tail=`echo ${pull_default} | sed -e 's@^.*://[^/]*/\(.*\)@\1@'` - if [ "${command_args}" != "" ] ; then + if [ -n "${command_args}" ] ; then + # if there is an "extra sources" path then reparent "extra" repos to that path if [ "x${pull_default}" = "x${pull_default_tail}" ] ; then echo "ERROR: Need initial clone from non-local source" > ${status_output} exit 1 fi pull_extra="${command_args}/${pull_default_tail}" + + # determine which extra subrepos need to be cloned. for i in ${subrepos_extra} ; do if [ ! -f ${i}/.hg/hgrc ] ; then repos_extra="${repos_extra} ${i}" @@ -160,7 +203,7 @@ done else if [ "x${pull_default}" = "x${pull_default_tail}" ] ; then - # local source repo. Copy the extras ones that exist there. + # local source repo. Clone the "extra" subrepos that exist there. for i in ${subrepos_extra} ; do if [ -f ${pull_default}/${i}/.hg/hgrc -a ! -f ${i}/.hg/hgrc ] ; then # sub-repo there in source but not here @@ -169,13 +212,17 @@ done fi fi - at_a_time=2 + # Any repos to deal with? if [ "${repos}" = "" -a "${repos_extra}" = "" ] ; then echo "No repositories to process." > ${status_output} exit fi + + # Repos to process concurrently. Clone does better with low concurrency. + at_a_time="${HGFOREST_CONCURRENCY:-2}" else + # Process command for all of the present repos for i in . ${subrepos} ${subrepos_extra} ; do if [ -d ${i}/.hg ] ; then repos="${repos} ${i}" @@ -189,6 +236,7 @@ fi # any of the repos locked? + locked="" for i in ${repos} ; do if [ -h ${i}/.hg/store/lock -o -f ${i}/.hg/store/lock ] ; then locked="${i} ${locked}" @@ -198,34 +246,39 @@ echo "ERROR: These repositories are locked: ${locked}" > ${status_output} exit 1 fi - at_a_time=8 + + # Repos to process concurrently. + at_a_time="${HGFOREST_CONCURRENCY:-8}" fi # Echo out what repositories we do a command on. echo "# Repositories: ${repos} ${repos_extra}" > ${status_output} if [ "${command}" = "serve" ] ; then - # "serve" is run for all the repos. + # "serve" is run for all the repos as one command. ( ( + cwd=`pwd` + serving=`basename ${cwd}` ( echo "[web]" - echo "description = $(basename $(pwd))" + echo "description = ${serving}" echo "allow_push = *" echo "push_ssl = False" echo "[paths]" - for i in ${repos} ${repos_extra} ; do + for i in ${repos} ; do if [ "${i}" != "." ] ; then - echo "/$(basename $(pwd))/${i} = ${i}" + echo "/${serving}/${i} = ${i}" else - echo "/$(basename $(pwd)) = $(pwd)" + echo "/${serving} = ${cwd}" fi done ) > ${tmp}/serve.web-conf - echo "serving root repo $(basename $(pwd))" + echo "serving root repo ${serving}" > ${status_output} + echo "hg${global_opts} serve" > ${status_output} (PYTHONUNBUFFERED=true hg${global_opts} serve -A ${status_output} -E ${status_output} --pid-file ${tmp}/serve.pid --web-conf ${tmp}/serve.web-conf; echo "$?" > ${tmp}/serve.pid.rc ) 2>&1 & ) 2>&1 | sed -e "s@^@serve: @" > ${status_output} ) & @@ -234,81 +287,93 @@ # n is the number of subprocess started or which might still be running. n=0 - if [ $have_fifos = "true" ]; then + if [ ${have_fifos} = "true" ]; then # if we have fifos use them to detect command completion. mkfifo ${tmp}/fifo exec 3<>${tmp}/fifo - if [ "${sflag}" = "true" ] ; then - # force sequential - at_a_time=1 - fi fi + # iterate over all of the subrepos. for i in ${repos} ${repos_extra} ; do n=`expr ${n} '+' 1` repopidfile=`echo ${i} | sed -e 's@./@@' -e 's@/@_@g'` reponame=`echo ${i} | sed -e :a -e 's/^.\{1,20\}$/ &/;ta'` pull_base="${pull_default}" - for j in $repos_extra ; do - if [ "$i" = "$j" ] ; then - pull_base="${pull_extra}" + + # regular repo or "extra" repo? + for j in ${repos_extra} ; do + if [ "${i}" = "${j}" ] ; then + # it's an "extra" + pull_base="${pull_extra}" fi done + + # remove trailing slash pull_base="`echo ${pull_base} | sed -e 's@[/]*$@@'`" + + # execute the command on the subrepo ( ( if [ "${command}" = "clone" -o "${command}" = "fclone" -o "${command}" = "tclone" ] ; then - pull_newrepo="${pull_base}/${i}" - path="`dirname ${i}`" - if [ "${path}" != "." ] ; then + # some form of clone + clone_newrepo="${pull_base}/${i}" + parent_path="`dirname ${i}`" + if [ "${parent_path}" != "." ] ; then times=0 - while [ ! -d "${path}" ] ## nested repo, ensure containing dir exists - do + while [ ! -d "${parent_path}" ] ; do ## nested repo, ensure containing dir exists + if [ "${sflag}" = "true" ] ; then + # Missing parent is fatal during sequential operation. + echo "ERROR: Missing parent path: ${parent_path}" > ${status_output} + exit 1 + fi times=`expr ${times} '+' 1` if [ `expr ${times} '%' 10` -eq 0 ] ; then - echo "${path} still not created, waiting..." > ${status_output} + echo "${parent_path} still not created, waiting..." > ${status_output} fi sleep 5 done fi - echo "hg${global_opts} clone ${pull_newrepo} ${i}" > ${status_output} - (PYTHONUNBUFFERED=true hg${global_opts} clone ${pull_newrepo} ${i}; echo "$?" > ${tmp}/${repopidfile}.pid.rc ) 2>&1 & + # run the clone command. + echo "hg${global_opts} clone ${clone_newrepo} ${i}" > ${status_output} + (PYTHONUNBUFFERED=true hg${global_opts} clone ${clone_newrepo} ${i}; echo "$?" > ${tmp}/${repopidfile}.pid.rc ) 2>&1 & else + # run the command. echo "cd ${i} && hg${global_opts} ${command} ${command_args}" > ${status_output} cd ${i} && (PYTHONUNBUFFERED=true hg${global_opts} ${command} ${command_args}; echo "$?" > ${tmp}/${repopidfile}.pid.rc ) 2>&1 & fi echo $! > ${tmp}/${repopidfile}.pid ) 2>&1 | sed -e "s@^@${reponame}: @" > ${status_output} - if [ $have_fifos = "true" ]; then - echo "${reponame}" >&3 + # tell the fifo waiter that this subprocess is done. + if [ ${have_fifos} = "true" ]; then + echo "${i}" >&3 fi ) & - if [ $have_fifos = "true" ]; then - # check on count of running subprocesses and possibly wait for completion - if [ ${at_a_time} -lt ${n} ] ; then - # read will block until there are completed subprocesses - while read repo_done; do - n=`expr ${n} '-' 1` - if [ ${n} -lt ${at_a_time} ] ; then - # we should start more subprocesses - break; - fi - done <&3 - fi + if [ "${sflag}" = "true" ] ; then + # complete this task before starting another. + wait else - if [ "${sflag}" = "false" ] ; then + if [ "${have_fifos}" = "true" ]; then + # check on count of running subprocesses and possibly wait for completion + if [ ${n} -ge ${at_a_time} ] ; then + # read will block until there are completed subprocesses + while read repo_done; do + n=`expr ${n} '-' 1` + if [ ${n} -lt ${at_a_time} ] ; then + # we should start more subprocesses + break; + fi + done <&3 + fi + else # Compare completions to starts - completed="`(ls -1 ${tmp}/*.pid.rc 2> /dev/null | wc -l) || echo 0`" - while [ ${at_a_time} -lt `expr ${n} '-' ${completed}` ] ; do + completed="`(ls -a1 ${tmp}/*.pid.rc 2> /dev/null | wc -l) || echo 0`" + while [ `expr ${n} '-' ${completed}` -ge ${at_a_time} ] ; do # sleep a short time to give time for something to complete sleep 1 - completed="`(ls -1 ${tmp}/*.pid.rc 2> /dev/null | wc -l) || echo 0`" + completed="`(ls -a1 ${tmp}/*.pid.rc 2> /dev/null | wc -l) || echo 0`" done - else - # complete this task before starting another. - wait fi fi done @@ -320,11 +385,12 @@ # Terminate with exit 0 only if all subprocesses were successful ec=0 if [ -d ${tmp} ]; then - for rc in ${tmp}/*.pid.rc ; do + rcfiles="`(ls -a ${tmp}/*.pid.rc 2> /dev/null) || echo ''`" + for rc in ${rcfiles} ; do exit_code=`cat ${rc} | tr -d ' \n\r'` if [ "${exit_code}" != "0" ] ; then - repo="`echo ${rc} | sed -e s@^${tmp}@@ -e 's@/*\([^/]*\)\.pid\.rc$@\1@' -e 's@_@/@g'`" - echo "WARNING: ${repo} exited abnormally ($exit_code)" > ${status_output} + repo="`echo ${rc} | sed -e 's@^'${tmp}'@@' -e 's@/*\([^/]*\)\.pid\.rc$@\1@' -e 's@_@/@g'`" + echo "WARNING: ${repo} exited abnormally (${exit_code})" > ${status_output} ec=1 fi done diff -r dca843327b90 -r 97e9abb0864b corba/.hgtags --- a/corba/.hgtags Thu May 15 11:35:26 2014 -0700 +++ b/corba/.hgtags Fri May 16 02:13:12 2014 -0700 @@ -255,3 +255,4 @@ 3bd4039dfc632fd7fc8418a25a3dcc34d1cd4019 jdk9-b10 77ea0a2503582a28e4e66be7239a49a0d1dd313f jdk9-b11 e212cdcc8c11f0ba5acf6f5ddb596c4c545a93f9 jdk9-b12 +088eec4c36f4d7f250fcd19c4969bf698e3d2cdc jdk9-b13 diff -r dca843327b90 -r 97e9abb0864b corba/src/share/classes/com/sun/corba/se/spi/orb/ORB.java --- a/corba/src/share/classes/com/sun/corba/se/spi/orb/ORB.java Thu May 15 11:35:26 2014 -0700 +++ b/corba/src/share/classes/com/sun/corba/se/spi/orb/ORB.java Fri May 16 02:13:12 2014 -0700 @@ -25,8 +25,6 @@ package com.sun.corba.se.spi.orb; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.util.Map ; import java.util.HashMap ; import java.util.Properties ; @@ -44,16 +42,13 @@ import com.sun.corba.se.spi.protocol.RequestDispatcherRegistry ; import com.sun.corba.se.spi.protocol.ClientDelegateFactory ; import com.sun.corba.se.spi.protocol.CorbaServerRequestDispatcher ; -import com.sun.corba.se.spi.protocol.CorbaMessageMediator ; import com.sun.corba.se.spi.protocol.PIHandler ; import com.sun.corba.se.spi.resolver.LocalResolver ; import com.sun.corba.se.spi.resolver.Resolver ; import com.sun.corba.se.spi.transport.CorbaContactInfoListFactory ; -import com.sun.corba.se.spi.legacy.connection.LegacyServerSocketEndPointInfo; import com.sun.corba.se.spi.legacy.connection.LegacyServerSocketManager; import com.sun.corba.se.spi.monitoring.MonitoringConstants; import com.sun.corba.se.spi.monitoring.MonitoringManager; -import com.sun.corba.se.spi.monitoring.MonitoringManagerFactory; import com.sun.corba.se.spi.monitoring.MonitoringFactories; import com.sun.corba.se.spi.ior.IdentifiableFactoryFinder ; @@ -62,11 +57,6 @@ import com.sun.corba.se.spi.ior.ObjectKeyFactory ; import com.sun.corba.se.spi.ior.IOR ; -import com.sun.corba.se.spi.orbutil.closure.Closure ; - -import com.sun.corba.se.spi.orb.Operation ; -import com.sun.corba.se.spi.orb.ORBData ; -import com.sun.corba.se.spi.orb.ORBVersion ; import com.sun.corba.se.spi.orbutil.threadpool.ThreadPoolManager; import com.sun.corba.se.spi.oa.OAInvocationInfo ; @@ -99,8 +89,6 @@ import com.sun.corba.se.impl.presentation.rmi.PresentationManagerImpl ; -import sun.misc.JavaAWTAccess; - public abstract class ORB extends com.sun.corba.se.org.omg.CORBA.ORB implements Broker, TypeCodeFactory { @@ -146,9 +134,9 @@ // This map is needed for resolving recursive type code placeholders // based on the unique repository id. // XXX Should this be a WeakHashMap for GC? - private Map typeCodeMap ; + private Map typeCodeMap; - private TypeCodeImpl[] primitiveTypeCodeConstants ; + private TypeCodeImpl[] primitiveTypeCodeConstants; // ByteBufferPool - needed by both ORBImpl and ORBSingleton ByteBufferPool byteBufferPool; @@ -169,16 +157,18 @@ // wrapperMap maintains a table of LogWrapper instances used by // different classes to log exceptions. The key is a StringPair // representing LogDomain and ExceptionGroup. - private Map wrapperMap ; + private Map wrapperMap; static class Holder { static final PresentationManager defaultPresentationManager = setupPresentationManager(); } - private static final Map pmContexts = new HashMap<>(); + private static final Map pmContexts = + new ConcurrentHashMap<>(); - private static Map staticWrapperMap = new ConcurrentHashMap(); + private static Map staticWrapperMap = + new ConcurrentHashMap<>(); protected MonitoringManager monitoringManager; @@ -245,28 +235,12 @@ public static PresentationManager getPresentationManager() { SecurityManager sm = System.getSecurityManager(); - JavaAWTAccess javaAwtAccess = sun.misc.SharedSecrets.getJavaAWTAccess(); + sun.misc.JavaAWTAccess javaAwtAccess = sun.misc.SharedSecrets.getJavaAWTAccess(); if (sm != null && javaAwtAccess != null) { - Object appletContext; - try { - Class clazz = JavaAWTAccess.class; - Method method = clazz.getMethod("getAppletContext"); - appletContext = method.invoke(javaAwtAccess); - } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { - InternalError err = new InternalError(); - err.initCause(e); - throw err; - } - + final Object appletContext = javaAwtAccess.getAppletContext(); if (appletContext != null) { - synchronized (pmContexts) { - PresentationManager pm = pmContexts.get(appletContext); - if (pm == null) { - pm = setupPresentationManager(); - pmContexts.put(appletContext, pm); - } - return pm; - } + return pmContexts.computeIfAbsent(appletContext, + x -> setupPresentationManager()); } } @@ -290,13 +264,13 @@ { // Initialize logging first, since it is needed nearly // everywhere (for example, in TypeCodeImpl). - wrapperMap = new ConcurrentHashMap(); + wrapperMap = new ConcurrentHashMap<>(); wrapper = ORBUtilSystemException.get( this, CORBALogDomains.RPC_PRESENTATION ) ; omgWrapper = OMGSystemException.get( this, CORBALogDomains.RPC_PRESENTATION ) ; - typeCodeMap = new HashMap(); + typeCodeMap = new HashMap<>(); primitiveTypeCodeConstants = new TypeCodeImpl[] { new TypeCodeImpl(this, TCKind._tk_null), @@ -363,7 +337,7 @@ public synchronized TypeCodeImpl getTypeCode(String id) { checkShutdownState(); - return (TypeCodeImpl)typeCodeMap.get(id); + return typeCodeMap.get(id); } public MonitoringManager getMonitoringManager( ) { @@ -526,35 +500,23 @@ /** get the log wrapper class (its type is dependent on the exceptionGroup) for the * given log domain and exception group in this ORB instance. */ - public LogWrapperBase getLogWrapper( String logDomain, - String exceptionGroup, LogWrapperFactory factory ) + public LogWrapperBase getLogWrapper(String logDomain, + String exceptionGroup, LogWrapperFactory factory) { - StringPair key = new StringPair( logDomain, exceptionGroup ) ; - - LogWrapperBase logWrapper = (LogWrapperBase)wrapperMap.get( key ); - if (logWrapper == null) { - logWrapper = factory.create( getLogger( logDomain ) ); - wrapperMap.put( key, logWrapper ); - } - - return logWrapper; + return wrapperMap.computeIfAbsent( + new StringPair(logDomain, exceptionGroup), + x -> factory.create(getLogger(logDomain))); } /** get the log wrapper class (its type is dependent on the exceptionGroup) for the * given log domain and exception group in this ORB instance. */ - public static LogWrapperBase staticGetLogWrapper( String logDomain, - String exceptionGroup, LogWrapperFactory factory ) + public static LogWrapperBase staticGetLogWrapper(String logDomain, + String exceptionGroup, LogWrapperFactory factory) { - StringPair key = new StringPair( logDomain, exceptionGroup ) ; - - LogWrapperBase logWrapper = (LogWrapperBase)staticWrapperMap.get( key ); - if (logWrapper == null) { - logWrapper = factory.create( staticGetLogger( logDomain ) ); - staticWrapperMap.put( key, logWrapper ); - } - - return logWrapper; + return staticWrapperMap.computeIfAbsent( + new StringPair(logDomain, exceptionGroup), + x -> factory.create(staticGetLogger(logDomain))); } // get a reference to a ByteBufferPool, a pool of NIO ByteBuffers diff -r dca843327b90 -r 97e9abb0864b hotspot/.hgtags --- a/hotspot/.hgtags Thu May 15 11:35:26 2014 -0700 +++ b/hotspot/.hgtags Fri May 16 02:13:12 2014 -0700 @@ -415,3 +415,4 @@ ebc44d040cd149d2120d69fe183a3dae7840f4b4 jdk9-b10 783309c3a1a629a452673399dcfa83ef7eca94d8 jdk9-b11 1c383bb39e2849ca62cb763f4e182a29b421d60a jdk9-b12 +456ad9c99133803d4e1433124c85a6fd141b9ac9 jdk9-b13 diff -r dca843327b90 -r 97e9abb0864b jaxp/.hgtags --- a/jaxp/.hgtags Thu May 15 11:35:26 2014 -0700 +++ b/jaxp/.hgtags Fri May 16 02:13:12 2014 -0700 @@ -255,3 +255,4 @@ 4ce98701efe3b28f6ce3ab23385445731e968af7 jdk9-b10 6b4280dceb00642f54d5bc1c2cb7d34c99a04992 jdk9-b11 e88cecf5a21b760ff7d7761c2db6bb8c82bc9f0c jdk9-b12 +5eaf717f6e36037a6d3744ffeee0e4c88e64a0d2 jdk9-b13 diff -r dca843327b90 -r 97e9abb0864b jaxws/.hgtags --- a/jaxws/.hgtags Thu May 15 11:35:26 2014 -0700 +++ b/jaxws/.hgtags Fri May 16 02:13:12 2014 -0700 @@ -258,3 +258,4 @@ 9af43f4d215f6f19b1767f6ac66da931b8ee9535 jdk9-b10 1f953ba7db2b535e19f0354abfee6d67605e0684 jdk9-b11 779f8b21c75f83e3918dac8499e4d0ecb3a54ed7 jdk9-b12 +3d42204854c9f703e3ccdc8891248e73057713ab jdk9-b13 diff -r dca843327b90 -r 97e9abb0864b jdk/.hgtags --- a/jdk/.hgtags Thu May 15 11:35:26 2014 -0700 +++ b/jdk/.hgtags Fri May 16 02:13:12 2014 -0700 @@ -255,3 +255,4 @@ ab06ba2894313a47e4969ca37792ff119c49e711 jdk9-b10 47feccd164b7187a0147693a922ee47c6629643c jdk9-b11 83d9bc20973de232cae45b139fdff8a4549c130f jdk9-b12 +c7c8002d02721e02131d104549ebeb8b379fb8d2 jdk9-b13 diff -r dca843327b90 -r 97e9abb0864b jdk/make/CopyFiles.gmk --- a/jdk/make/CopyFiles.gmk Thu May 15 11:35:26 2014 -0700 +++ b/jdk/make/CopyFiles.gmk Fri May 16 02:13:12 2014 -0700 @@ -367,8 +367,24 @@ POLICY_SRC := $(JDK_TOPDIR)/src/share/lib/security/java.policy POLICY_DST := $(JDK_OUTPUTDIR)/lib/security/java.policy -$(POLICY_DST): $(POLICY_SRC) - $(call install-file) +POLICY_SRC_LIST := + +ifeq ($(OPENJDK_TARGET_OS), windows) + POLICY_SRC_LIST += $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS)/lib/security/java.policy +endif +ifndef OPENJDK + ifneq (, $(filter $(OPENJDK_TARGET_OS), windows solaris)) + POLICY_SRC_LIST += $(JDK_TOPDIR)/src/closed/$(OPENJDK_TARGET_OS)/lib/security/java.policy + endif +endif + +POLICY_SRC_LIST += $(POLICY_SRC) + +$(POLICY_DST): $(POLICY_SRC_LIST) + $(MKDIR) -p $(@D) + $(RM) $@ $@.tmp + $(foreach f,$(POLICY_SRC_LIST),$(CAT) $(f) >> $@.tmp;) + $(MV) $@.tmp $@ COPY_FILES += $(POLICY_DST) diff -r dca843327b90 -r 97e9abb0864b jdk/make/data/tzdata/VERSION --- a/jdk/make/data/tzdata/VERSION Thu May 15 11:35:26 2014 -0700 +++ b/jdk/make/data/tzdata/VERSION Fri May 16 02:13:12 2014 -0700 @@ -21,4 +21,4 @@ # or visit www.oracle.com if you need additional information or have any # questions. # -tzdata2014b +tzdata2014c diff -r dca843327b90 -r 97e9abb0864b jdk/make/data/tzdata/africa --- a/jdk/make/data/tzdata/africa Thu May 15 11:35:26 2014 -0700 +++ b/jdk/make/data/tzdata/africa Fri May 16 02:13:12 2014 -0700 @@ -358,11 +358,54 @@ # http://www.worldtimezone.com/dst_news/dst_news_egypt02.html # +# From Ahmad El-Dardiry (2014-05-07): +# Egypt is to change back to Daylight system on May 15 +# http://english.ahram.org.eg/NewsContent/1/64/100735/Egypt/Politics-/Egypts-government-to-reapply-daylight-saving-time-.aspx + +# From Gunther Vermier (2015-05-13): +# our Egypt office confirms that the change will be at 15 May "midnight" (24:00) + +# From Paul Eggert (2014-05-13): +# Sarah El Deeb and Lee Keath of AP report that the Egyptian government says +# the change is because of blackouts in Cairo, even though Ahram Online (cited +# above) says DST had no affect on electricity consumption. The AP story says +# DST will not be observed during Ramadan. There is no information about when +# DST will end. See: +# http://abcnews.go.com/International/wireStory/el-sissi-pushes-egyptians-line-23614833 +# +# For now, guess that later transitions will use 2010's rules, and that +# Egypt will agree with Morocco (see below) about the date Ramadan starts and +# ends, though (unlike Morocco) it will switch at 00:00 standard time. In +# Egypt the spring-forward transitions are removed for 2020-2022, when the +# guessed spring-forward date falls during the estimated Ramadan, and all +# transitions removed for 2023-2038, where the estimated Ramadan falls entirely +# outside the guessed daylight-saving time. Ramadan intrudes on the guessed +# DST starting in 2039, but that's beyond our somewhat-arbitrary cutoff. + Rule Egypt 2008 only - Aug lastThu 23:00s 0 - Rule Egypt 2009 only - Aug 20 23:00s 0 - Rule Egypt 2010 only - Aug 11 0:00 0 - Rule Egypt 2010 only - Sep 10 0:00 1:00 S Rule Egypt 2010 only - Sep lastThu 23:00s 0 - +Rule Egypt 2014 only - May 15 24:00 1:00 S +Rule Egypt 2014 only - Jun 29 0:00s 0 - +Rule Egypt 2014 only - Jul 29 0:00s 1:00 S +Rule Egypt 2014 max - Sep lastThu 23:00s 0 - +Rule Egypt 2015 2019 - Apr lastFri 0:00s 1:00 S +Rule Egypt 2015 only - Jun 18 0:00s 0 - +Rule Egypt 2015 only - Jul 18 0:00s 1:00 S +Rule Egypt 2016 only - Jun 7 0:00s 0 - +Rule Egypt 2016 only - Jul 7 0:00s 1:00 S +Rule Egypt 2017 only - May 27 0:00s 0 - +Rule Egypt 2017 only - Jun 26 0:00s 1:00 S +Rule Egypt 2018 only - May 16 0:00s 0 - +Rule Egypt 2018 only - Jun 15 0:00s 1:00 S +Rule Egypt 2019 only - May 6 0:00s 0 - +Rule Egypt 2019 only - Jun 5 0:00s 1:00 S +Rule Egypt 2020 only - May 24 0:00s 1:00 S +Rule Egypt 2021 only - May 13 0:00s 1:00 S +Rule Egypt 2022 only - May 3 0:00s 1:00 S +Rule Egypt 2023 max - Apr lastFri 0:00s 1:00 S # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Africa/Cairo 2:05:09 - LMT 1900 Oct diff -r dca843327b90 -r 97e9abb0864b jdk/make/data/tzdata/asia --- a/jdk/make/data/tzdata/asia Thu May 15 11:35:26 2014 -0700 +++ b/jdk/make/data/tzdata/asia Fri May 16 02:13:12 2014 -0700 @@ -1370,22 +1370,6 @@ # "Jordan will switch to winter time on Friday, October 27". # -# From Phil Pizzey (2009-04-02): -# ...I think I may have spotted an error in the timezone data for -# Jordan. -# The current (2009d) asia file shows Jordan going to daylight -# saving -# time on the last Thursday in March. -# -# Rule Jordan 2000 max - Mar lastThu 0:00s 1:00 S -# -# However timeanddate.com, which I usually find reliable, shows Jordan -# going to daylight saving time on the last Friday in March since 2002. -# Please see -# -# http://www.timeanddate.com/worldclock/timezone.html?n=11 -# - # From Steffen Thorsen (2009-04-02): # This single one might be good enough, (2009-03-24, Arabic): # diff -r dca843327b90 -r 97e9abb0864b jdk/make/data/tzdata/europe --- a/jdk/make/data/tzdata/europe Thu May 15 11:35:26 2014 -0700 +++ b/jdk/make/data/tzdata/europe Fri May 16 02:13:12 2014 -0700 @@ -2989,6 +2989,10 @@ # From Alexander Krivenyshev (2014-03-17): # time change at 2:00 (2am) on March 30, 2014 # http://vz.ru/news/2014/3/17/677464.html +# From Paul Eggert (2014-03-30): +# Simferopol and Sevastopol reportedly changed their central town clocks +# late the previous day, but this appears to have been ceremonial +# and the discrepancies are small enough to not worry about. 2:00 EU EE%sT 2014 Mar 30 2:00 4:00 - MSK diff -r dca843327b90 -r 97e9abb0864b jdk/make/gensrc/GensrcMisc.gmk --- a/jdk/make/gensrc/GensrcMisc.gmk Thu May 15 11:35:26 2014 -0700 +++ b/jdk/make/gensrc/GensrcMisc.gmk Fri May 16 02:13:12 2014 -0700 @@ -62,25 +62,6 @@ ########################################################################################## -ifeq ($(OPENJDK_TARGET_OS_API), posix) - UPSUFFIX := $(OPENJDK_TARGET_OS) - ifeq ($(OPENJDK_TARGET_OS), macosx) - UPSUFFIX := bsd - endif - # UNIXProcess.java is different for solaris and linux. We need to copy - # the correct UNIXProcess.java over to $(JDK_OUTPUTDIR)/gensrc/java/lang/. - - $(JDK_OUTPUTDIR)/gensrc/java/lang/UNIXProcess.java: \ - $(JDK_TOPDIR)/src/solaris/classes/java/lang/UNIXProcess.java.$(UPSUFFIX) - $(ECHO) $(LOG_INFO) Copying UNIXProcess.java.$(OPENJDK_TARGET_OS) to java/lang/UNIXProcess.java - $(call install-file) - $(CHMOD) u+rw $@ - - GENSRC_MISC += $(JDK_OUTPUTDIR)/gensrc/java/lang/UNIXProcess.java -endif - -########################################################################################## - GENSRC_MISC += $(JDK_OUTPUTDIR)/gensrc/sun/nio/ch/SocketOptionRegistry.java GENSRC_SOR_SRC := $(JDK_TOPDIR)/make/src/native/genconstants/ch diff -r dca843327b90 -r 97e9abb0864b jdk/make/profile-rtjar-includes.txt --- a/jdk/make/profile-rtjar-includes.txt Thu May 15 11:35:26 2014 -0700 +++ b/jdk/make/profile-rtjar-includes.txt Fri May 16 02:13:12 2014 -0700 @@ -100,9 +100,7 @@ PROFILE_2_RTJAR_EXCLUDE_TYPES := -PROFILE_2_INCLUDE_METAINF_SERVICES := \ - META-INF/services/sun.util.spi.XmlPropertiesProvider - +PROFILE_2_INCLUDE_METAINF_SERVICES := PROFILE_3_RTJAR_INCLUDE_PACKAGES := \ com/sun/jmx \ diff -r dca843327b90 -r 97e9abb0864b jdk/src/share/classes/com/sun/tools/attach/AttachOperationFailedException.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/tools/attach/AttachOperationFailedException.java Fri May 16 02:13:12 2014 -0700 @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2014, 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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. + */ + +package com.sun.tools.attach; + +import java.io.IOException; + +/** + * Exception type to signal that an attach operation failed in the target VM. + * + *

This exception can be thrown by the various operations of + * {@link com.sun.tools.attach.VirtualMachine} when the operation + * fails in the target VM. If there is a communication error, + * a regular IOException will be thrown. + * + * @since 1.9 + */ +@jdk.Exported +public class AttachOperationFailedException extends IOException { + + private static final long serialVersionUID = 2140308168167478043L; + + /** + * Constructs an AttachOperationFailedException with + * the specified detail message. + * + * @param s the detail message. + */ + public AttachOperationFailedException(String message) { + super(message); + } +} diff -r dca843327b90 -r 97e9abb0864b jdk/src/share/classes/com/sun/tools/attach/VirtualMachine.java --- a/jdk/src/share/classes/com/sun/tools/attach/VirtualMachine.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/src/share/classes/com/sun/tools/attach/VirtualMachine.java Fri May 16 02:13:12 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, 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 @@ -564,8 +564,15 @@ * * @return The system properties * + * @throws AttachOperationFailedException + * If the target virtual machine is unable to complete the + * attach operation. A more specific error message will be + * given by {@link AttachOperationFailedException#getMessage()}. + * * @throws IOException - * If an I/O error occurs + * If an I/O error occurs, a communication error for example, + * that cannot be identified as an error to indicate that the + * operation failed in the target VM. * * @see java.lang.System#getProperties * @see #loadAgentLibrary @@ -591,8 +598,15 @@ * * @return The agent properties * + * @throws AttachOperationFailedException + * If the target virtual machine is unable to complete the + * attach operation. A more specific error message will be + * given by {@link AttachOperationFailedException#getMessage()}. + * * @throws IOException - * If an I/O error occurs + * If an I/O error occurs, a communication error for example, + * that cannot be identified as an error to indicate that the + * operation failed in the target VM. */ public abstract Properties getAgentProperties() throws IOException; diff -r dca843327b90 -r 97e9abb0864b jdk/src/share/classes/java/lang/Character.java --- a/jdk/src/share/classes/java/lang/Character.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/src/share/classes/java/lang/Character.java Fri May 16 02:13:12 2014 -0700 @@ -4498,7 +4498,6 @@ * Character case is ignored for all of the valid script names. * The en_US locale's case mapping rules are used to provide * case-insensitive string comparisons for script name validation. - *

* * @param scriptName A {@code UnicodeScript} name. * @return The {@code UnicodeScript} constant identified @@ -5503,7 +5502,7 @@ * '\u00D0' '\u00D1' '\u00D2' '\u00D3' '\u00D4' '\u00D5' '\u00D6' '\u00D8' * '\u00D9' '\u00DA' '\u00DB' '\u00DC' '\u00DD' '\u00DE' * - *

Many other Unicode characters are uppercase too.

+ *

Many other Unicode characters are uppercase too. * * @param codePoint the character (Unicode code point) to be tested. * @return {@code true} if the character is uppercase; @@ -5581,7 +5580,7 @@ *

  • {@code LATIN CAPITAL LETTER N WITH SMALL LETTER J} *
  • {@code LATIN CAPITAL LETTER D WITH SMALL LETTER Z} * - *

    Many other Unicode characters are titlecase too.

    + *

    Many other Unicode characters are titlecase too. * * @param codePoint the character (Unicode code point) to be tested. * @return {@code true} if the character is titlecase; @@ -6777,7 +6776,6 @@ *

  • It is {@code '\u005Cu001E'}, U+001E RECORD SEPARATOR. *
  • It is {@code '\u005Cu001F'}, U+001F UNIT SEPARATOR. * - *

    * * @param codePoint the character (Unicode code point) to be tested. * @return {@code true} if the character is a Java whitespace @@ -7121,7 +7119,6 @@ /** * Converts the character (Unicode code point) argument to uppercase using * information from the UnicodeData file. - *

    * * @param codePoint the character (Unicode code point) to be converted. * @return either the uppercase equivalent of the character, if diff -r dca843327b90 -r 97e9abb0864b jdk/src/share/classes/java/lang/ConditionalSpecialCasing.java --- a/jdk/src/share/classes/java/lang/ConditionalSpecialCasing.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/src/share/classes/java/lang/ConditionalSpecialCasing.java Fri May 16 02:13:12 2014 -0700 @@ -62,6 +62,7 @@ //# Conditional mappings //# ================================================================================ new Entry(0x03A3, new char[]{0x03C2}, new char[]{0x03A3}, null, FINAL_CASED), // # GREEK CAPITAL LETTER SIGMA + new Entry(0x0130, new char[]{0x0069, 0x0307}, new char[]{0x0130}, null, 0), // # LATIN CAPITAL LETTER I WITH DOT ABOVE //# ================================================================================ //# Locale-sensitive mappings @@ -77,8 +78,8 @@ //# ================================================================================ //# Turkish and Azeri -// new Entry(0x0130, new char[]{0x0069}, new char[]{0x0130}, "tr", 0), // # LATIN CAPITAL LETTER I WITH DOT ABOVE -// new Entry(0x0130, new char[]{0x0069}, new char[]{0x0130}, "az", 0), // # LATIN CAPITAL LETTER I WITH DOT ABOVE + new Entry(0x0130, new char[]{0x0069}, new char[]{0x0130}, "tr", 0), // # LATIN CAPITAL LETTER I WITH DOT ABOVE + new Entry(0x0130, new char[]{0x0069}, new char[]{0x0130}, "az", 0), // # LATIN CAPITAL LETTER I WITH DOT ABOVE new Entry(0x0307, new char[]{}, new char[]{0x0307}, "tr", AFTER_I), // # COMBINING DOT ABOVE new Entry(0x0307, new char[]{}, new char[]{0x0307}, "az", AFTER_I), // # COMBINING DOT ABOVE new Entry(0x0049, new char[]{0x0131}, new char[]{0x0049}, "tr", NOT_BEFORE_DOT), // # LATIN CAPITAL LETTER I @@ -147,21 +148,25 @@ private static char[] lookUpTable(String src, int index, Locale locale, boolean bLowerCasing) { HashSet set = entryTable.get(new Integer(src.codePointAt(index))); + char[] ret = null; if (set != null) { Iterator iter = set.iterator(); String currentLang = locale.getLanguage(); while (iter.hasNext()) { Entry entry = iter.next(); - String conditionLang= entry.getLanguage(); + String conditionLang = entry.getLanguage(); if (((conditionLang == null) || (conditionLang.equals(currentLang))) && isConditionMet(src, index, locale, entry.getCondition())) { - return (bLowerCasing ? entry.getLowerCase() : entry.getUpperCase()); + ret = bLowerCasing ? entry.getLowerCase() : entry.getUpperCase(); + if (conditionLang != null) { + break; + } } } } - return null; + return ret; } private static boolean isConditionMet(String src, int index, Locale locale, int condition) { diff -r dca843327b90 -r 97e9abb0864b jdk/src/share/classes/java/lang/Math.java --- a/jdk/src/share/classes/java/lang/Math.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/src/share/classes/java/lang/Math.java Fri May 16 02:13:12 2014 -0700 @@ -1048,7 +1048,6 @@ * whereas {@code (-4 / 3) == -1}. *

  • * - *

    * * @param x the dividend * @param y the divisor diff -r dca843327b90 -r 97e9abb0864b jdk/src/share/classes/java/lang/Runtime.java --- a/jdk/src/share/classes/java/lang/Runtime.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/src/share/classes/java/lang/Runtime.java Fri May 16 02:13:12 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2014, 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 @@ -83,7 +83,7 @@ * blocks indefinitely. * *

    The {@link System#exit(int) System.exit} method is the - * conventional and convenient means of invoking this method.

    + * conventional and convenient means of invoking this method. * * @param status * Termination status. By convention, a nonzero status code @@ -180,7 +180,7 @@ * method goes awry by, for example, corrupting internal data structures or * attempting to access nonexistent memory. If the virtual machine aborts * then no guarantee can be made about whether or not any shutdown hooks - * will be run.

    + * will be run. * * @param hook * An initialized but unstarted {@link Thread} object @@ -248,7 +248,7 @@ * hooks to be started and does not run uninvoked finalizers if * finalization-on-exit has been enabled. If the shutdown sequence has * already been initiated then this method does not wait for any running - * shutdown hooks or finalizers to finish their work.

    + * shutdown hooks or finalizers to finish their work. * * @param status * Termination status. By convention, a nonzero status code diff -r dca843327b90 -r 97e9abb0864b jdk/src/share/classes/java/lang/SecurityManager.java --- a/jdk/src/share/classes/java/lang/SecurityManager.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/src/share/classes/java/lang/SecurityManager.java Fri May 16 02:13:12 2014 -0700 @@ -1242,7 +1242,6 @@ * super.checkPropertiesAccess * at the point the overridden method would normally throw an * exception. - *

    * * @exception SecurityException if the calling thread does not have * permission to access or modify the system properties. @@ -1320,7 +1319,6 @@ * super.checkPrintJobAccess * at the point the overridden method would normally throw an * exception. - *

    * * @exception SecurityException if the calling thread does not have * permission to initiate a print job request. @@ -1566,7 +1564,6 @@ * super.checkSetFactory * at the point the overridden method would normally throw an * exception. - *

    * * @exception SecurityException if the calling thread does not have * permission to specify a socket factory or a stream diff -r dca843327b90 -r 97e9abb0864b jdk/src/share/classes/java/lang/String.java --- a/jdk/src/share/classes/java/lang/String.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/src/share/classes/java/lang/String.java Fri May 16 02:13:12 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 2014, 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 @@ -2583,6 +2583,9 @@ if (cp == '\u03A3') { // GREEK CAPITAL LETTER SIGMA return toLowerCaseEx(result, i, locale, false); } + if (cp == '\u0130') { // LATIN CAPITAL LETTER I WITH DOT ABOVE + return toLowerCaseEx(result, i, locale, true); + } cp = Character.toLowerCase(cp); if (!Character.isBmpCodePoint(cp)) { return toLowerCaseEx(result, i, locale, false); @@ -2650,7 +2653,7 @@ * LATIN SMALL LETTER DOTLESS I character. * To obtain correct results for locale insensitive strings, use * {@code toLowerCase(Locale.ROOT)}. - *

    + * * @return the {@code String}, converted to lowercase. * @see java.lang.String#toLowerCase(Locale) */ @@ -2812,7 +2815,7 @@ * LATIN CAPITAL LETTER I WITH DOT ABOVE character. * To obtain correct results for locale insensitive strings, use * {@code toUpperCase(Locale.ROOT)}. - *

    + * * @return the {@code String}, converted to uppercase. * @see java.lang.String#toUpperCase(Locale) */ diff -r dca843327b90 -r 97e9abb0864b jdk/src/share/classes/java/lang/System.java --- a/jdk/src/share/classes/java/lang/System.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/src/share/classes/java/lang/System.java Fri May 16 02:13:12 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 2014, 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 @@ -133,7 +133,6 @@ *

    First, if there is a security manager, its checkPermission * method is called with a RuntimePermission("setIO") permission * to see if it's ok to reassign the "standard" input stream. - *

    * * @param in the new standard input stream. * @@ -762,7 +761,6 @@ * permission. This may result in a SecurityException being thrown. * If no exception is thrown, the specified property is set to the given * value. - *

    * * @param key the name of the system property. * @param value the value of the system property. @@ -801,7 +799,6 @@ * is called with a PropertyPermission(key, "write") * permission. This may result in a SecurityException being thrown. * If no exception is thrown, the specified property is removed. - *

    * * @param key the name of the system property to be removed. * @return the previous string value of the system property, diff -r dca843327b90 -r 97e9abb0864b jdk/src/share/classes/java/lang/instrument/package.html --- a/jdk/src/share/classes/java/lang/instrument/package.html Thu May 15 11:35:26 2014 -0700 +++ b/jdk/src/share/classes/java/lang/instrument/package.html Fri May 16 02:13:12 2014 -0700 @@ -1,5 +1,5 @@ " + - ""+ - "" + - "" + - "" + - ""; - - /** - * Version number for the format of exported properties files. - */ - private static final String EXTERNAL_XML_VERSION = "1.0"; - - @Override - public void load(Properties props, InputStream in) - throws IOException, InvalidPropertiesFormatException - { - Document doc = null; - try { - doc = getLoadingDoc(in); - } catch (SAXException saxe) { - throw new InvalidPropertiesFormatException(saxe); - } - Element propertiesElement = doc.getDocumentElement(); - String xmlVersion = propertiesElement.getAttribute("version"); - if (xmlVersion.compareTo(EXTERNAL_XML_VERSION) > 0) - throw new InvalidPropertiesFormatException( - "Exported Properties file format version " + xmlVersion + - " is not supported. This java installation can read" + - " versions " + EXTERNAL_XML_VERSION + " or older. You" + - " may need to install a newer version of JDK."); - importProperties(props, propertiesElement); - } - - static Document getLoadingDoc(InputStream in) - throws SAXException, IOException - { - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); - dbf.setIgnoringElementContentWhitespace(true); - dbf.setValidating(true); - dbf.setCoalescing(true); - dbf.setIgnoringComments(true); - try { - DocumentBuilder db = dbf.newDocumentBuilder(); - db.setEntityResolver(new Resolver()); - db.setErrorHandler(new EH()); - InputSource is = new InputSource(in); - return db.parse(is); - } catch (ParserConfigurationException x) { - throw new Error(x); - } - } - - static void importProperties(Properties props, Element propertiesElement) { - NodeList entries = propertiesElement.getChildNodes(); - int numEntries = entries.getLength(); - int start = numEntries > 0 && - entries.item(0).getNodeName().equals("comment") ? 1 : 0; - for (int i=start; i e : props.entrySet()) { - final Object k = e.getKey(); - final Object v = e.getValue(); - if (k instanceof String && v instanceof String) { - Element entry = (Element)properties.appendChild( - doc.createElement("entry")); - entry.setAttribute("key", (String)k); - entry.appendChild(doc.createTextNode((String)v)); - } - } - } - emitDocument(doc, os, encoding); - } - - static void emitDocument(Document doc, OutputStream os, String encoding) - throws IOException - { - TransformerFactory tf = TransformerFactory.newInstance(); - Transformer t = null; - try { - t = tf.newTransformer(); - t.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, PROPS_DTD_URI); - t.setOutputProperty(OutputKeys.INDENT, "yes"); - t.setOutputProperty(OutputKeys.METHOD, "xml"); - t.setOutputProperty(OutputKeys.ENCODING, encoding); - } catch (TransformerConfigurationException tce) { - assert(false); - } - DOMSource doms = new DOMSource(doc); - StreamResult sr = new StreamResult(os); - try { - t.transform(doms, sr); - } catch (TransformerException te) { - throw new IOException(te); - } - } - - private static class Resolver implements EntityResolver { - public InputSource resolveEntity(String pid, String sid) - throws SAXException - { - if (sid.equals(PROPS_DTD_URI)) { - InputSource is; - is = new InputSource(new StringReader(PROPS_DTD)); - is.setSystemId(PROPS_DTD_URI); - return is; - } - throw new SAXException("Invalid system identifier: " + sid); - } - } - - private static class EH implements ErrorHandler { - public void error(SAXParseException x) throws SAXException { - throw x; - } - public void fatalError(SAXParseException x) throws SAXException { - throw x; - } - public void warning(SAXParseException x) throws SAXException { - throw x; - } - } - -} diff -r dca843327b90 -r 97e9abb0864b jdk/src/share/lib/security/java.policy --- a/jdk/src/share/lib/security/java.policy Thu May 15 11:35:26 2014 -0700 +++ b/jdk/src/share/lib/security/java.policy Fri May 16 02:13:12 2014 -0700 @@ -1,7 +1,39 @@ +// permissions required by each component +grant codeBase "file:${java.home}/lib/ext/zipfs.jar" { + permission java.io.FilePermission "<>", "read,write,delete"; + permission java.lang.RuntimePermission "fileSystemProvider"; + permission java.util.PropertyPermission "*", "read"; +}; -// Standard extensions get all permissions by default +grant codeBase "file:${java.home}/lib/ext/cldrdata.jar" { + permission java.lang.RuntimePermission "accessClassInPackage.sun.text.*"; + permission java.lang.RuntimePermission "accessClassInPackage.sun.util.*"; + permission java.util.PropertyPermission "*", "read"; +}; + +grant codeBase "file:${java.home}/lib/ext/localedata.jar" { + permission java.lang.RuntimePermission "accessClassInPackage.sun.text.*"; + permission java.lang.RuntimePermission "accessClassInPackage.sun.util.*"; + permission java.util.PropertyPermission "*", "read"; +}; -grant codeBase "file:${{java.ext.dirs}}/*" { +grant codeBase "file:${java.home}/lib/ext/dnsns.jar" { + permission java.security.AllPermission; +}; + +grant codeBase "file:${java.home}/lib/ext/nashorn.jar" { + permission java.security.AllPermission; +}; + +grant codeBase "file:${java.home}/lib/ext/sunec.jar" { + permission java.security.AllPermission; +}; + +grant codeBase "file:${java.home}/lib/ext/sunjce_provider.jar" { + permission java.security.AllPermission; +}; + +grant codeBase "file:${java.home}/lib/ext/sunpkcs11.jar" { permission java.security.AllPermission; }; diff -r dca843327b90 -r 97e9abb0864b jdk/src/solaris/classes/java/lang/UNIXProcess.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/solaris/classes/java/lang/UNIXProcess.java Fri May 16 02:13:12 2014 -0700 @@ -0,0 +1,827 @@ +/* + * Copyright (c) 1995, 2014, 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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. + */ + +package java.lang; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.ByteArrayInputStream; +import java.io.FileDescriptor; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Arrays; +import java.util.EnumSet; +import java.util.Locale; +import java.util.Set; +import java.util.concurrent.Executors; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.TimeUnit; +import java.security.AccessController; +import static java.security.AccessController.doPrivileged; +import java.security.PrivilegedAction; +import java.security.PrivilegedActionException; +import java.security.PrivilegedExceptionAction; + +/** + * java.lang.Process subclass in the UNIX environment. + * + * @author Mario Wolczko and Ross Knippel. + * @author Konstantin Kladko (ported to Linux and Bsd) + * @author Martin Buchholz + * @author Volker Simonis (ported to AIX) + */ +final class UNIXProcess extends Process { + private static final sun.misc.JavaIOFileDescriptorAccess fdAccess + = sun.misc.SharedSecrets.getJavaIOFileDescriptorAccess(); + + private final int pid; + private int exitcode; + private boolean hasExited; + + private /* final */ OutputStream stdin; + private /* final */ InputStream stdout; + private /* final */ InputStream stderr; + + // only used on Solaris + private /* final */ DeferredCloseInputStream stdout_inner_stream; + + private static enum LaunchMechanism { + // order IS important! + FORK, + POSIX_SPAWN, + VFORK + } + + private static enum Platform { + + LINUX(LaunchMechanism.VFORK, LaunchMechanism.FORK), + + BSD(LaunchMechanism.POSIX_SPAWN, LaunchMechanism.FORK), + + SOLARIS(LaunchMechanism.POSIX_SPAWN, LaunchMechanism.FORK), + + AIX(LaunchMechanism.POSIX_SPAWN, LaunchMechanism.FORK); + + final LaunchMechanism defaultLaunchMechanism; + final Set validLaunchMechanisms; + + Platform(LaunchMechanism ... launchMechanisms) { + this.defaultLaunchMechanism = launchMechanisms[0]; + this.validLaunchMechanisms = + EnumSet.copyOf(Arrays.asList(launchMechanisms)); + } + + private String helperPath(String javahome, String osArch) { + switch (this) { + case SOLARIS: + if (osArch.equals("x86")) { osArch = "i386"; } + else if (osArch.equals("x86_64")) { osArch = "amd64"; } + // fall through... + case LINUX: + case AIX: + return javahome + "/lib/" + osArch + "/jspawnhelper"; + + case BSD: + return javahome + "/lib/jspawnhelper"; + + default: + throw new AssertionError("Unsupported platform: " + this); + } + } + + String helperPath() { + return AccessController.doPrivileged( + (PrivilegedAction) () -> + helperPath(System.getProperty("java.home"), + System.getProperty("os.arch")) + ); + } + + LaunchMechanism launchMechanism() { + return AccessController.doPrivileged( + (PrivilegedAction) () -> { + String s = System.getProperty( + "jdk.lang.Process.launchMechanism"); + LaunchMechanism lm; + if (s == null) { + lm = defaultLaunchMechanism; + s = lm.name().toLowerCase(Locale.ENGLISH); + } else { + try { + lm = LaunchMechanism.valueOf( + s.toUpperCase(Locale.ENGLISH)); + } catch (IllegalArgumentException e) { + lm = null; + } + } + if (lm == null || !validLaunchMechanisms.contains(lm)) { + throw new Error( + s + " is not a supported " + + "process launch mechanism on this platform." + ); + } + return lm; + } + ); + } + + static Platform get() { + String osName = AccessController.doPrivileged( + (PrivilegedAction) () -> System.getProperty("os.name") + ); + + if (osName.equals("Linux")) { return LINUX; } + if (osName.contains("OS X")) { return BSD; } + if (osName.equals("SunOS")) { return SOLARIS; } + if (osName.equals("AIX")) { return AIX; } + + throw new Error(osName + " is not a supported OS platform."); + } + } + + private static final Platform platform = Platform.get(); + private static final LaunchMechanism launchMechanism = platform.launchMechanism(); + private static final byte[] helperpath = toCString(platform.helperPath()); + + private static byte[] toCString(String s) { + if (s == null) + return null; + byte[] bytes = s.getBytes(); + byte[] result = new byte[bytes.length + 1]; + System.arraycopy(bytes, 0, + result, 0, + bytes.length); + result[result.length-1] = (byte)0; + return result; + } + + /* this is for the reaping thread */ + private native int waitForProcessExit(int pid); + + /** + * Creates a process. Depending on the {@code mode} flag, this is done by + * one of the following mechanisms: + *

    +     *   1 - fork(2) and exec(2)
    +     *   2 - posix_spawn(3P)
    +     *   3 - vfork(2) and exec(2)
    +     *
    +     *  (4 - clone(2) and exec(2) - obsolete and currently disabled in native code)
    +     * 
    + * @param fds an array of three file descriptors. + * Indexes 0, 1, and 2 correspond to standard input, + * standard output and standard error, respectively. On + * input, a value of -1 means to create a pipe to connect + * child and parent processes. On output, a value which + * is not -1 is the parent pipe fd corresponding to the + * pipe which has been created. An element of this array + * is -1 on input if and only if it is not -1 on + * output. + * @return the pid of the subprocess + */ + private native int forkAndExec(int mode, byte[] helperpath, + byte[] prog, + byte[] argBlock, int argc, + byte[] envBlock, int envc, + byte[] dir, + int[] fds, + boolean redirectErrorStream) + throws IOException; + + /** + * The thread pool of "process reaper" daemon threads. + */ + private static final Executor processReaperExecutor = + doPrivileged((PrivilegedAction) () -> { + + ThreadGroup tg = Thread.currentThread().getThreadGroup(); + while (tg.getParent() != null) tg = tg.getParent(); + ThreadGroup systemThreadGroup = tg; + + ThreadFactory threadFactory = grimReaper -> { + // Our thread stack requirement is quite modest. + Thread t = new Thread(systemThreadGroup, grimReaper, + "process reaper", 32768); + t.setDaemon(true); + // A small attempt (probably futile) to avoid priority inversion + t.setPriority(Thread.MAX_PRIORITY); + return t; + }; + + return Executors.newCachedThreadPool(threadFactory); + }); + + UNIXProcess(final byte[] prog, + final byte[] argBlock, final int argc, + final byte[] envBlock, final int envc, + final byte[] dir, + final int[] fds, + final boolean redirectErrorStream) + throws IOException { + + pid = forkAndExec(launchMechanism.ordinal() + 1, + helperpath, + prog, + argBlock, argc, + envBlock, envc, + dir, + fds, + redirectErrorStream); + + try { + doPrivileged((PrivilegedExceptionAction) () -> { + initStreams(fds); + return null; + }); + } catch (PrivilegedActionException ex) { + throw (IOException) ex.getException(); + } + } + + static FileDescriptor newFileDescriptor(int fd) { + FileDescriptor fileDescriptor = new FileDescriptor(); + fdAccess.set(fileDescriptor, fd); + return fileDescriptor; + } + + void initStreams(int[] fds) throws IOException { + switch (platform) { + case LINUX: + case BSD: + stdin = (fds[0] == -1) ? + ProcessBuilder.NullOutputStream.INSTANCE : + new ProcessPipeOutputStream(fds[0]); + + stdout = (fds[1] == -1) ? + ProcessBuilder.NullInputStream.INSTANCE : + new ProcessPipeInputStream(fds[1]); + + stderr = (fds[2] == -1) ? + ProcessBuilder.NullInputStream.INSTANCE : + new ProcessPipeInputStream(fds[2]); + + processReaperExecutor.execute(() -> { + int exitcode = waitForProcessExit(pid); + + synchronized (this) { + this.exitcode = exitcode; + this.hasExited = true; + this.notifyAll(); + } + + if (stdout instanceof ProcessPipeInputStream) + ((ProcessPipeInputStream) stdout).processExited(); + + if (stderr instanceof ProcessPipeInputStream) + ((ProcessPipeInputStream) stderr).processExited(); + + if (stdin instanceof ProcessPipeOutputStream) + ((ProcessPipeOutputStream) stdin).processExited(); + }); + break; + + case SOLARIS: + stdin = (fds[0] == -1) ? + ProcessBuilder.NullOutputStream.INSTANCE : + new BufferedOutputStream( + new FileOutputStream(newFileDescriptor(fds[0]))); + + stdout = (fds[1] == -1) ? + ProcessBuilder.NullInputStream.INSTANCE : + new BufferedInputStream( + stdout_inner_stream = + new DeferredCloseInputStream( + newFileDescriptor(fds[1]))); + + stderr = (fds[2] == -1) ? + ProcessBuilder.NullInputStream.INSTANCE : + new DeferredCloseInputStream(newFileDescriptor(fds[2])); + + /* + * For each subprocess forked a corresponding reaper task + * is submitted. That task is the only thread which waits + * for the subprocess to terminate and it doesn't hold any + * locks while doing so. This design allows waitFor() and + * exitStatus() to be safely executed in parallel (and they + * need no native code). + */ + processReaperExecutor.execute(() -> { + int exitcode = waitForProcessExit(pid); + + synchronized (this) { + this.exitcode = exitcode; + this.hasExited = true; + this.notifyAll(); + } + }); + break; + + case AIX: + stdin = (fds[0] == -1) ? + ProcessBuilder.NullOutputStream.INSTANCE : + new ProcessPipeOutputStream(fds[0]); + + stdout = (fds[1] == -1) ? + ProcessBuilder.NullInputStream.INSTANCE : + new DeferredCloseProcessPipeInputStream(fds[1]); + + stderr = (fds[2] == -1) ? + ProcessBuilder.NullInputStream.INSTANCE : + new DeferredCloseProcessPipeInputStream(fds[2]); + + processReaperExecutor.execute(() -> { + int exitcode = waitForProcessExit(pid); + + synchronized (this) { + this.exitcode = exitcode; + this.hasExited = true; + this.notifyAll(); + } + + if (stdout instanceof DeferredCloseProcessPipeInputStream) + ((DeferredCloseProcessPipeInputStream) stdout).processExited(); + + if (stderr instanceof DeferredCloseProcessPipeInputStream) + ((DeferredCloseProcessPipeInputStream) stderr).processExited(); + + if (stdin instanceof ProcessPipeOutputStream) + ((ProcessPipeOutputStream) stdin).processExited(); + }); + break; + + default: throw new AssertionError("Unsupported platform: " + platform); + } + } + + public OutputStream getOutputStream() { + return stdin; + } + + public InputStream getInputStream() { + return stdout; + } + + public InputStream getErrorStream() { + return stderr; + } + + public synchronized int waitFor() throws InterruptedException { + while (!hasExited) { + wait(); + } + return exitcode; + } + + @Override + public synchronized boolean waitFor(long timeout, TimeUnit unit) + throws InterruptedException + { + if (hasExited) return true; + if (timeout <= 0) return false; + + long timeoutAsNanos = unit.toNanos(timeout); + long startTime = System.nanoTime(); + long rem = timeoutAsNanos; + + while (!hasExited && (rem > 0)) { + wait(Math.max(TimeUnit.NANOSECONDS.toMillis(rem), 1)); + rem = timeoutAsNanos - (System.nanoTime() - startTime); + } + return hasExited; + } + + public synchronized int exitValue() { + if (!hasExited) { + throw new IllegalThreadStateException("process hasn't exited"); + } + return exitcode; + } + + private static native void destroyProcess(int pid, boolean force); + + private void destroy(boolean force) { + switch (platform) { + case LINUX: + case BSD: + case AIX: + // There is a risk that pid will be recycled, causing us to + // kill the wrong process! So we only terminate processes + // that appear to still be running. Even with this check, + // there is an unavoidable race condition here, but the window + // is very small, and OSes try hard to not recycle pids too + // soon, so this is quite safe. + synchronized (this) { + if (!hasExited) + destroyProcess(pid, force); + } + try { stdin.close(); } catch (IOException ignored) {} + try { stdout.close(); } catch (IOException ignored) {} + try { stderr.close(); } catch (IOException ignored) {} + break; + + case SOLARIS: + // There is a risk that pid will be recycled, causing us to + // kill the wrong process! So we only terminate processes + // that appear to still be running. Even with this check, + // there is an unavoidable race condition here, but the window + // is very small, and OSes try hard to not recycle pids too + // soon, so this is quite safe. + synchronized (this) { + if (!hasExited) + destroyProcess(pid, force); + try { + stdin.close(); + if (stdout_inner_stream != null) + stdout_inner_stream.closeDeferred(stdout); + if (stderr instanceof DeferredCloseInputStream) + ((DeferredCloseInputStream) stderr) + .closeDeferred(stderr); + } catch (IOException e) { + // ignore + } + } + break; + + default: throw new AssertionError("Unsupported platform: " + platform); + } + } + + public void destroy() { + destroy(false); + } + + @Override + public Process destroyForcibly() { + destroy(true); + return this; + } + + @Override + public synchronized boolean isAlive() { + return !hasExited; + } + + private static native void init(); + + static { + init(); + } + + /** + * A buffered input stream for a subprocess pipe file descriptor + * that allows the underlying file descriptor to be reclaimed when + * the process exits, via the processExited hook. + * + * This is tricky because we do not want the user-level InputStream to be + * closed until the user invokes close(), and we need to continue to be + * able to read any buffered data lingering in the OS pipe buffer. + */ + private static class ProcessPipeInputStream extends BufferedInputStream { + private final Object closeLock = new Object(); + + ProcessPipeInputStream(int fd) { + super(new FileInputStream(newFileDescriptor(fd))); + } + private static byte[] drainInputStream(InputStream in) + throws IOException { + int n = 0; + int j; + byte[] a = null; + while ((j = in.available()) > 0) { + a = (a == null) ? new byte[j] : Arrays.copyOf(a, n + j); + n += in.read(a, n, j); + } + return (a == null || n == a.length) ? a : Arrays.copyOf(a, n); + } + + /** Called by the process reaper thread when the process exits. */ + synchronized void processExited() { + synchronized (closeLock) { + try { + InputStream in = this.in; + // this stream is closed if and only if: in == null + if (in != null) { + byte[] stragglers = drainInputStream(in); + in.close(); + this.in = (stragglers == null) ? + ProcessBuilder.NullInputStream.INSTANCE : + new ByteArrayInputStream(stragglers); + } + } catch (IOException ignored) {} + } + } + + @Override + public void close() throws IOException { + // BufferedInputStream#close() is not synchronized unlike most other + // methods. Synchronizing helps avoid race with processExited(). + synchronized (closeLock) { + super.close(); + } + } + } + + /** + * A buffered output stream for a subprocess pipe file descriptor + * that allows the underlying file descriptor to be reclaimed when + * the process exits, via the processExited hook. + */ + private static class ProcessPipeOutputStream extends BufferedOutputStream { + ProcessPipeOutputStream(int fd) { + super(new FileOutputStream(newFileDescriptor(fd))); + } + + /** Called by the process reaper thread when the process exits. */ + synchronized void processExited() { + OutputStream out = this.out; + if (out != null) { + try { + out.close(); + } catch (IOException ignored) { + // We know of no reason to get an IOException, but if + // we do, there's nothing else to do but carry on. + } + this.out = ProcessBuilder.NullOutputStream.INSTANCE; + } + } + } + + // A FileInputStream that supports the deferment of the actual close + // operation until the last pending I/O operation on the stream has + // finished. This is required on Solaris because we must close the stdin + // and stdout streams in the destroy method in order to reclaim the + // underlying file descriptors. Doing so, however, causes any thread + // currently blocked in a read on one of those streams to receive an + // IOException("Bad file number"), which is incompatible with historical + // behavior. By deferring the close we allow any pending reads to see -1 + // (EOF) as they did before. + // + private static class DeferredCloseInputStream extends FileInputStream + { + DeferredCloseInputStream(FileDescriptor fd) { + super(fd); + } + + private Object lock = new Object(); // For the following fields + private boolean closePending = false; + private int useCount = 0; + private InputStream streamToClose; + + private void raise() { + synchronized (lock) { + useCount++; + } + } + + private void lower() throws IOException { + synchronized (lock) { + useCount--; + if (useCount == 0 && closePending) { + streamToClose.close(); + } + } + } + + // stc is the actual stream to be closed; it might be this object, or + // it might be an upstream object for which this object is downstream. + // + private void closeDeferred(InputStream stc) throws IOException { + synchronized (lock) { + if (useCount == 0) { + stc.close(); + } else { + closePending = true; + streamToClose = stc; + } + } + } + + public void close() throws IOException { + synchronized (lock) { + useCount = 0; + closePending = false; + } + super.close(); + } + + public int read() throws IOException { + raise(); + try { + return super.read(); + } finally { + lower(); + } + } + + public int read(byte[] b) throws IOException { + raise(); + try { + return super.read(b); + } finally { + lower(); + } + } + + public int read(byte[] b, int off, int len) throws IOException { + raise(); + try { + return super.read(b, off, len); + } finally { + lower(); + } + } + + public long skip(long n) throws IOException { + raise(); + try { + return super.skip(n); + } finally { + lower(); + } + } + + public int available() throws IOException { + raise(); + try { + return super.available(); + } finally { + lower(); + } + } + } + + /** + * A buffered input stream for a subprocess pipe file descriptor + * that allows the underlying file descriptor to be reclaimed when + * the process exits, via the processExited hook. + * + * This is tricky because we do not want the user-level InputStream to be + * closed until the user invokes close(), and we need to continue to be + * able to read any buffered data lingering in the OS pipe buffer. + * + * On AIX this is especially tricky, because the 'close()' system call + * will block if another thread is at the same time blocked in a file + * operation (e.g. 'read()') on the same file descriptor. We therefore + * combine 'ProcessPipeInputStream' approach used on Linux and Bsd + * with the DeferredCloseInputStream approach used on Solaris. This means + * that every potentially blocking operation on the file descriptor + * increments a counter before it is executed and decrements it once it + * finishes. The 'close()' operation will only be executed if there are + * no pending operations. Otherwise it is deferred after the last pending + * operation has finished. + * + */ + private static class DeferredCloseProcessPipeInputStream + extends BufferedInputStream { + + private final Object closeLock = new Object(); + private int useCount = 0; + private boolean closePending = false; + + DeferredCloseProcessPipeInputStream(int fd) { + super(new FileInputStream(newFileDescriptor(fd))); + } + + private InputStream drainInputStream(InputStream in) + throws IOException { + int n = 0; + int j; + byte[] a = null; + synchronized (closeLock) { + if (buf == null) // asynchronous close()? + return null; // discard + j = in.available(); + } + while (j > 0) { + a = (a == null) ? new byte[j] : Arrays.copyOf(a, n + j); + synchronized (closeLock) { + if (buf == null) // asynchronous close()? + return null; // discard + n += in.read(a, n, j); + j = in.available(); + } + } + return (a == null) ? + ProcessBuilder.NullInputStream.INSTANCE : + new ByteArrayInputStream(n == a.length ? a : Arrays.copyOf(a, n)); + } + + /** Called by the process reaper thread when the process exits. */ + synchronized void processExited() { + try { + InputStream in = this.in; + if (in != null) { + InputStream stragglers = drainInputStream(in); + in.close(); + this.in = stragglers; + } + } catch (IOException ignored) { } + } + + private void raise() { + synchronized (closeLock) { + useCount++; + } + } + + private void lower() throws IOException { + synchronized (closeLock) { + useCount--; + if (useCount == 0 && closePending) { + closePending = false; + super.close(); + } + } + } + + @Override + public int read() throws IOException { + raise(); + try { + return super.read(); + } finally { + lower(); + } + } + + @Override + public int read(byte[] b) throws IOException { + raise(); + try { + return super.read(b); + } finally { + lower(); + } + } + + @Override + public int read(byte[] b, int off, int len) throws IOException { + raise(); + try { + return super.read(b, off, len); + } finally { + lower(); + } + } + + @Override + public long skip(long n) throws IOException { + raise(); + try { + return super.skip(n); + } finally { + lower(); + } + } + + @Override + public int available() throws IOException { + raise(); + try { + return super.available(); + } finally { + lower(); + } + } + + @Override + public void close() throws IOException { + // BufferedInputStream#close() is not synchronized unlike most other + // methods. Synchronizing helps avoid racing with drainInputStream(). + synchronized (closeLock) { + if (useCount == 0) { + super.close(); + } + else { + closePending = true; + } + } + } + } +} diff -r dca843327b90 -r 97e9abb0864b jdk/src/solaris/classes/java/lang/UNIXProcess.java.aix --- a/jdk/src/solaris/classes/java/lang/UNIXProcess.java.aix Thu May 15 11:35:26 2014 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,504 +0,0 @@ -/* - * Copyright (c) 1995, 2013, 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. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * 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. - */ - -package java.lang; - -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.ByteArrayInputStream; -import java.io.FileDescriptor; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Arrays; -import java.util.concurrent.Executors; -import java.util.concurrent.Executor; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.TimeUnit; -import java.security.AccessController; -import static java.security.AccessController.doPrivileged; -import java.security.PrivilegedAction; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; - -/** - * java.lang.Process subclass in the UNIX environment. - * - * @author Mario Wolczko and Ross Knippel. - * @author Konstantin Kladko (ported to Linux) - * @author Martin Buchholz - * @author Volker Simonis (ported to AIX) - */ -final class UNIXProcess extends Process { - private static final sun.misc.JavaIOFileDescriptorAccess fdAccess - = sun.misc.SharedSecrets.getJavaIOFileDescriptorAccess(); - - private final int pid; - private int exitcode; - private boolean hasExited; - - private /* final */ OutputStream stdin; - private /* final */ InputStream stdout; - private /* final */ InputStream stderr; - - private static enum LaunchMechanism { - FORK(1), - POSIX_SPAWN(2); - - private int value; - LaunchMechanism(int x) {value = x;} - }; - - /* On AIX, the default is to spawn */ - private static final LaunchMechanism launchMechanism; - private static byte[] helperpath; - - private static byte[] toCString(String s) { - if (s == null) - return null; - byte[] bytes = s.getBytes(); - byte[] result = new byte[bytes.length + 1]; - System.arraycopy(bytes, 0, - result, 0, - bytes.length); - result[result.length-1] = (byte)0; - return result; - } - - static { - launchMechanism = AccessController.doPrivileged( - new PrivilegedAction() - { - public LaunchMechanism run() { - String javahome = System.getProperty("java.home"); - String osArch = System.getProperty("os.arch"); - - helperpath = toCString(javahome + "/lib/" + osArch + "/jspawnhelper"); - String s = System.getProperty( - "jdk.lang.Process.launchMechanism", "posix_spawn"); - - try { - return LaunchMechanism.valueOf(s.toUpperCase()); - } catch (IllegalArgumentException e) { - throw new Error(s + " is not a supported " + - "process launch mechanism on this platform."); - } - } - }); - } - - /* this is for the reaping thread */ - private native int waitForProcessExit(int pid); - - /** - * Create a process. Depending on the mode flag, this is done by - * one of the following mechanisms. - * - fork(2) and exec(2) - * - clone(2) and exec(2) - * - vfork(2) and exec(2) - * - * @param fds an array of three file descriptors. - * Indexes 0, 1, and 2 correspond to standard input, - * standard output and standard error, respectively. On - * input, a value of -1 means to create a pipe to connect - * child and parent processes. On output, a value which - * is not -1 is the parent pipe fd corresponding to the - * pipe which has been created. An element of this array - * is -1 on input if and only if it is not -1 on - * output. - * @return the pid of the subprocess - */ - private native int forkAndExec(int mode, byte[] helperpath, - byte[] prog, - byte[] argBlock, int argc, - byte[] envBlock, int envc, - byte[] dir, - int[] fds, - boolean redirectErrorStream) - throws IOException; - - /** - * The thread factory used to create "process reaper" daemon threads. - */ - private static class ProcessReaperThreadFactory implements ThreadFactory { - private final static ThreadGroup group = getRootThreadGroup(); - - private static ThreadGroup getRootThreadGroup() { - return doPrivileged(new PrivilegedAction () { - public ThreadGroup run() { - ThreadGroup root = Thread.currentThread().getThreadGroup(); - while (root.getParent() != null) - root = root.getParent(); - return root; - }}); - } - - public Thread newThread(Runnable grimReaper) { - // Our thread stack requirement is quite modest. - Thread t = new Thread(group, grimReaper, "process reaper", 32768); - t.setDaemon(true); - // A small attempt (probably futile) to avoid priority inversion - t.setPriority(Thread.MAX_PRIORITY); - return t; - } - } - - /** - * The thread pool of "process reaper" daemon threads. - */ - private static final Executor processReaperExecutor = - doPrivileged(new PrivilegedAction() { - public Executor run() { - return Executors.newCachedThreadPool - (new ProcessReaperThreadFactory()); - }}); - - UNIXProcess(final byte[] prog, - final byte[] argBlock, final int argc, - final byte[] envBlock, final int envc, - final byte[] dir, - final int[] fds, - final boolean redirectErrorStream) - throws IOException { - - pid = forkAndExec(launchMechanism.value, - helperpath, - prog, - argBlock, argc, - envBlock, envc, - dir, - fds, - redirectErrorStream); - - try { - doPrivileged(new PrivilegedExceptionAction() { - public Void run() throws IOException { - initStreams(fds); - return null; - }}); - } catch (PrivilegedActionException ex) { - throw (IOException) ex.getException(); - } - } - - static FileDescriptor newFileDescriptor(int fd) { - FileDescriptor fileDescriptor = new FileDescriptor(); - fdAccess.set(fileDescriptor, fd); - return fileDescriptor; - } - - void initStreams(int[] fds) throws IOException { - stdin = (fds[0] == -1) ? - ProcessBuilder.NullOutputStream.INSTANCE : - new ProcessPipeOutputStream(fds[0]); - - stdout = (fds[1] == -1) ? - ProcessBuilder.NullInputStream.INSTANCE : - new ProcessPipeInputStream(fds[1]); - - stderr = (fds[2] == -1) ? - ProcessBuilder.NullInputStream.INSTANCE : - new ProcessPipeInputStream(fds[2]); - - processReaperExecutor.execute(new Runnable() { - public void run() { - int exitcode = waitForProcessExit(pid); - UNIXProcess.this.processExited(exitcode); - }}); - } - - void processExited(int exitcode) { - synchronized (this) { - this.exitcode = exitcode; - hasExited = true; - notifyAll(); - } - - if (stdout instanceof ProcessPipeInputStream) - ((ProcessPipeInputStream) stdout).processExited(); - - if (stderr instanceof ProcessPipeInputStream) - ((ProcessPipeInputStream) stderr).processExited(); - - if (stdin instanceof ProcessPipeOutputStream) - ((ProcessPipeOutputStream) stdin).processExited(); - } - - public OutputStream getOutputStream() { - return stdin; - } - - public InputStream getInputStream() { - return stdout; - } - - public InputStream getErrorStream() { - return stderr; - } - - public synchronized int waitFor() throws InterruptedException { - while (!hasExited) { - wait(); - } - return exitcode; - } - - @Override - public synchronized boolean waitFor(long timeout, TimeUnit unit) - throws InterruptedException - { - if (hasExited) return true; - if (timeout <= 0) return false; - - long timeoutAsNanos = unit.toNanos(timeout); - long startTime = System.nanoTime(); - long rem = timeoutAsNanos; - - while (!hasExited && (rem > 0)) { - wait(Math.max(TimeUnit.NANOSECONDS.toMillis(rem), 1)); - rem = timeoutAsNanos - (System.nanoTime() - startTime); - } - return hasExited; - } - - public synchronized int exitValue() { - if (!hasExited) { - throw new IllegalThreadStateException("process hasn't exited"); - } - return exitcode; - } - - private static native void destroyProcess(int pid, boolean force); - private void destroy(boolean force) { - // There is a risk that pid will be recycled, causing us to - // kill the wrong process! So we only terminate processes - // that appear to still be running. Even with this check, - // there is an unavoidable race condition here, but the window - // is very small, and OSes try hard to not recycle pids too - // soon, so this is quite safe. - synchronized (this) { - if (!hasExited) - destroyProcess(pid, force); - } - try { stdin.close(); } catch (IOException ignored) {} - try { stdout.close(); } catch (IOException ignored) {} - try { stderr.close(); } catch (IOException ignored) {} - } - - public void destroy() { - destroy(false); - } - - @Override - public Process destroyForcibly() { - destroy(true); - return this; - } - - @Override - public synchronized boolean isAlive() { - return !hasExited; - } - - private static native void init(); - - static { - init(); - } - - /** - * A buffered input stream for a subprocess pipe file descriptor - * that allows the underlying file descriptor to be reclaimed when - * the process exits, via the processExited hook. - * - * This is tricky because we do not want the user-level InputStream to be - * closed until the user invokes close(), and we need to continue to be - * able to read any buffered data lingering in the OS pipe buffer. - * - * On AIX this is especially tricky, because the 'close()' system call - * will block if another thread is at the same time blocked in a file - * operation (e.g. 'read()') on the same file descriptor. We therefore - * combine this 'ProcessPipeInputStream' with the DeferredCloseInputStream - * approach used on Solaris (see "UNIXProcess.java.solaris"). This means - * that every potentially blocking operation on the file descriptor - * increments a counter before it is executed and decrements it once it - * finishes. The 'close()' operation will only be executed if there are - * no pending operations. Otherwise it is deferred after the last pending - * operation has finished. - * - */ - static class ProcessPipeInputStream extends BufferedInputStream { - private final Object closeLock = new Object(); - private int useCount = 0; - private boolean closePending = false; - - ProcessPipeInputStream(int fd) { - super(new FileInputStream(newFileDescriptor(fd))); - } - - private InputStream drainInputStream(InputStream in) - throws IOException { - int n = 0; - int j; - byte[] a = null; - synchronized (closeLock) { - if (buf == null) // asynchronous close()? - return null; // discard - j = in.available(); - } - while (j > 0) { - a = (a == null) ? new byte[j] : Arrays.copyOf(a, n + j); - synchronized (closeLock) { - if (buf == null) // asynchronous close()? - return null; // discard - n += in.read(a, n, j); - j = in.available(); - } - } - return (a == null) ? - ProcessBuilder.NullInputStream.INSTANCE : - new ByteArrayInputStream(n == a.length ? a : Arrays.copyOf(a, n)); - } - - /** Called by the process reaper thread when the process exits. */ - synchronized void processExited() { - try { - InputStream in = this.in; - if (in != null) { - InputStream stragglers = drainInputStream(in); - in.close(); - this.in = stragglers; - } - } catch (IOException ignored) { } - } - - private void raise() { - synchronized (closeLock) { - useCount++; - } - } - - private void lower() throws IOException { - synchronized (closeLock) { - useCount--; - if (useCount == 0 && closePending) { - closePending = false; - super.close(); - } - } - } - - @Override - public int read() throws IOException { - raise(); - try { - return super.read(); - } finally { - lower(); - } - } - - @Override - public int read(byte[] b) throws IOException { - raise(); - try { - return super.read(b); - } finally { - lower(); - } - } - - @Override - public int read(byte[] b, int off, int len) throws IOException { - raise(); - try { - return super.read(b, off, len); - } finally { - lower(); - } - } - - @Override - public long skip(long n) throws IOException { - raise(); - try { - return super.skip(n); - } finally { - lower(); - } - } - - @Override - public int available() throws IOException { - raise(); - try { - return super.available(); - } finally { - lower(); - } - } - - @Override - public void close() throws IOException { - // BufferedInputStream#close() is not synchronized unlike most other methods. - // Synchronizing helps avoid racing with drainInputStream(). - synchronized (closeLock) { - if (useCount == 0) { - super.close(); - } - else { - closePending = true; - } - } - } - } - - /** - * A buffered output stream for a subprocess pipe file descriptor - * that allows the underlying file descriptor to be reclaimed when - * the process exits, via the processExited hook. - */ - static class ProcessPipeOutputStream extends BufferedOutputStream { - ProcessPipeOutputStream(int fd) { - super(new FileOutputStream(newFileDescriptor(fd))); - } - - /** Called by the process reaper thread when the process exits. */ - synchronized void processExited() { - OutputStream out = this.out; - if (out != null) { - try { - out.close(); - } catch (IOException ignored) { - // We know of no reason to get an IOException, but if - // we do, there's nothing else to do but carry on. - } - this.out = ProcessBuilder.NullOutputStream.INSTANCE; - } - } - } -} diff -r dca843327b90 -r 97e9abb0864b jdk/src/solaris/classes/java/lang/UNIXProcess.java.bsd --- a/jdk/src/solaris/classes/java/lang/UNIXProcess.java.bsd Thu May 15 11:35:26 2014 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,408 +0,0 @@ -/* - * Copyright (c) 1995, 2013, 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. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * 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. - */ - -package java.lang; - -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.ByteArrayInputStream; -import java.io.FileDescriptor; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Arrays; -import java.util.concurrent.Executors; -import java.util.concurrent.Executor; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.TimeUnit; -import java.security.AccessController; -import static java.security.AccessController.doPrivileged; -import java.security.PrivilegedAction; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; - -/** - * java.lang.Process subclass in the UNIX environment. - * - * @author Mario Wolczko and Ross Knippel. - * @author Konstantin Kladko (ported to Bsd) - * @author Martin Buchholz - */ -final class UNIXProcess extends Process { - private static final sun.misc.JavaIOFileDescriptorAccess fdAccess - = sun.misc.SharedSecrets.getJavaIOFileDescriptorAccess(); - - private final int pid; - private int exitcode; - private boolean hasExited; - - private /* final */ OutputStream stdin; - private /* final */ InputStream stdout; - private /* final */ InputStream stderr; - - private static enum LaunchMechanism { - FORK(1), - POSIX_SPAWN(2); - - private int value; - LaunchMechanism(int x) {value = x;} - }; - - /* On BSD, the default is to spawn */ - private static final LaunchMechanism launchMechanism; - private static byte[] helperpath; - - private static byte[] toCString(String s) { - if (s == null) - return null; - byte[] bytes = s.getBytes(); - byte[] result = new byte[bytes.length + 1]; - System.arraycopy(bytes, 0, - result, 0, - bytes.length); - result[result.length-1] = (byte)0; - return result; - } - - static { - launchMechanism = AccessController.doPrivileged( - new PrivilegedAction() - { - public LaunchMechanism run() { - String javahome = System.getProperty("java.home"); - - helperpath = toCString(javahome + "/lib/jspawnhelper"); - String s = System.getProperty( - "jdk.lang.Process.launchMechanism", "posix_spawn"); - - try { - return LaunchMechanism.valueOf(s.toUpperCase()); - } catch (IllegalArgumentException e) { - throw new Error(s + " is not a supported " + - "process launch mechanism on this platform."); - } - } - }); - } - - /* this is for the reaping thread */ - private native int waitForProcessExit(int pid); - - /** - * Create a process. Depending on the mode flag, this is done by - * one of the following mechanisms. - * - fork(2) and exec(2) - * - posix_spawn(2) - * - * @param fds an array of three file descriptors. - * Indexes 0, 1, and 2 correspond to standard input, - * standard output and standard error, respectively. On - * input, a value of -1 means to create a pipe to connect - * child and parent processes. On output, a value which - * is not -1 is the parent pipe fd corresponding to the - * pipe which has been created. An element of this array - * is -1 on input if and only if it is not -1 on - * output. - * @return the pid of the subprocess - */ - private native int forkAndExec(int mode, byte[] helperpath, - byte[] prog, - byte[] argBlock, int argc, - byte[] envBlock, int envc, - byte[] dir, - int[] fds, - boolean redirectErrorStream) - throws IOException; - - /** - * The thread factory used to create "process reaper" daemon threads. - */ - private static class ProcessReaperThreadFactory implements ThreadFactory { - private final static ThreadGroup group = getRootThreadGroup(); - - private static ThreadGroup getRootThreadGroup() { - return doPrivileged(new PrivilegedAction () { - public ThreadGroup run() { - ThreadGroup root = Thread.currentThread().getThreadGroup(); - while (root.getParent() != null) - root = root.getParent(); - return root; - }}); - } - - public Thread newThread(Runnable grimReaper) { - // Our thread stack requirement is quite modest. - Thread t = new Thread(group, grimReaper, "process reaper", 32768); - t.setDaemon(true); - // A small attempt (probably futile) to avoid priority inversion - t.setPriority(Thread.MAX_PRIORITY); - return t; - } - } - - /** - * The thread pool of "process reaper" daemon threads. - */ - private static final Executor processReaperExecutor = - doPrivileged(new PrivilegedAction() { - public Executor run() { - return Executors.newCachedThreadPool - (new ProcessReaperThreadFactory()); - }}); - - UNIXProcess(final byte[] prog, - final byte[] argBlock, final int argc, - final byte[] envBlock, final int envc, - final byte[] dir, - final int[] fds, - final boolean redirectErrorStream) - throws IOException { - - pid = forkAndExec(launchMechanism.value, - helperpath, - prog, - argBlock, argc, - envBlock, envc, - dir, - fds, - redirectErrorStream); - - try { - doPrivileged(new PrivilegedExceptionAction() { - public Void run() throws IOException { - initStreams(fds); - return null; - }}); - } catch (PrivilegedActionException ex) { - throw (IOException) ex.getException(); - } - } - - static FileDescriptor newFileDescriptor(int fd) { - FileDescriptor fileDescriptor = new FileDescriptor(); - fdAccess.set(fileDescriptor, fd); - return fileDescriptor; - } - - void initStreams(int[] fds) throws IOException { - stdin = (fds[0] == -1) ? - ProcessBuilder.NullOutputStream.INSTANCE : - new ProcessPipeOutputStream(fds[0]); - - stdout = (fds[1] == -1) ? - ProcessBuilder.NullInputStream.INSTANCE : - new ProcessPipeInputStream(fds[1]); - - stderr = (fds[2] == -1) ? - ProcessBuilder.NullInputStream.INSTANCE : - new ProcessPipeInputStream(fds[2]); - - processReaperExecutor.execute(new Runnable() { - public void run() { - int exitcode = waitForProcessExit(pid); - UNIXProcess.this.processExited(exitcode); - }}); - } - - void processExited(int exitcode) { - synchronized (this) { - this.exitcode = exitcode; - hasExited = true; - notifyAll(); - } - - if (stdout instanceof ProcessPipeInputStream) - ((ProcessPipeInputStream) stdout).processExited(); - - if (stderr instanceof ProcessPipeInputStream) - ((ProcessPipeInputStream) stderr).processExited(); - - if (stdin instanceof ProcessPipeOutputStream) - ((ProcessPipeOutputStream) stdin).processExited(); - } - - public OutputStream getOutputStream() { - return stdin; - } - - public InputStream getInputStream() { - return stdout; - } - - public InputStream getErrorStream() { - return stderr; - } - - public synchronized int waitFor() throws InterruptedException { - while (!hasExited) { - wait(); - } - return exitcode; - } - - @Override - public synchronized boolean waitFor(long timeout, TimeUnit unit) - throws InterruptedException - { - if (hasExited) return true; - if (timeout <= 0) return false; - - long timeoutAsNanos = unit.toNanos(timeout); - long startTime = System.nanoTime(); - long rem = timeoutAsNanos; - - while (!hasExited && (rem > 0)) { - wait(Math.max(TimeUnit.NANOSECONDS.toMillis(rem), 1)); - rem = timeoutAsNanos - (System.nanoTime() - startTime); - } - return hasExited; - } - - public synchronized int exitValue() { - if (!hasExited) { - throw new IllegalThreadStateException("process hasn't exited"); - } - return exitcode; - } - - private static native void destroyProcess(int pid, boolean force); - private void destroy(boolean force) { - // There is a risk that pid will be recycled, causing us to - // kill the wrong process! So we only terminate processes - // that appear to still be running. Even with this check, - // there is an unavoidable race condition here, but the window - // is very small, and OSes try hard to not recycle pids too - // soon, so this is quite safe. - synchronized (this) { - if (!hasExited) - destroyProcess(pid, force); - } - try { stdin.close(); } catch (IOException ignored) {} - try { stdout.close(); } catch (IOException ignored) {} - try { stderr.close(); } catch (IOException ignored) {} - } - - public void destroy() { - destroy(false); - } - - @Override - public Process destroyForcibly() { - destroy(true); - return this; - } - - @Override - public synchronized boolean isAlive() { - return !hasExited; - } - - private static native void init(); - - static { - init(); - } - - /** - * A buffered input stream for a subprocess pipe file descriptor - * that allows the underlying file descriptor to be reclaimed when - * the process exits, via the processExited hook. - * - * This is tricky because we do not want the user-level InputStream to be - * closed until the user invokes close(), and we need to continue to be - * able to read any buffered data lingering in the OS pipe buffer. - */ - static class ProcessPipeInputStream extends BufferedInputStream { - private final Object closeLock = new Object(); - - ProcessPipeInputStream(int fd) { - super(new FileInputStream(newFileDescriptor(fd))); - } - private static byte[] drainInputStream(InputStream in) - throws IOException { - int n = 0; - int j; - byte[] a = null; - while ((j = in.available()) > 0) { - a = (a == null) ? new byte[j] : Arrays.copyOf(a, n + j); - n += in.read(a, n, j); - } - return (a == null || n == a.length) ? a : Arrays.copyOf(a, n); - } - - /** Called by the process reaper thread when the process exits. */ - synchronized void processExited() { - synchronized (closeLock) { - try { - InputStream in = this.in; - // this stream is closed if and only if: in == null - if (in != null) { - byte[] stragglers = drainInputStream(in); - in.close(); - this.in = (stragglers == null) ? - ProcessBuilder.NullInputStream.INSTANCE : - new ByteArrayInputStream(stragglers); - } - } catch (IOException ignored) {} - } - } - - @Override - public void close() throws IOException { - // BufferedInputStream#close() is not synchronized unlike most other methods. - // Synchronizing helps avoid race with processExited(). - synchronized (closeLock) { - super.close(); - } - } - } - - /** - * A buffered output stream for a subprocess pipe file descriptor - * that allows the underlying file descriptor to be reclaimed when - * the process exits, via the processExited hook. - */ - static class ProcessPipeOutputStream extends BufferedOutputStream { - ProcessPipeOutputStream(int fd) { - super(new FileOutputStream(newFileDescriptor(fd))); - } - - /** Called by the process reaper thread when the process exits. */ - synchronized void processExited() { - OutputStream out = this.out; - if (out != null) { - try { - out.close(); - } catch (IOException ignored) { - // We know of no reason to get an IOException, but if - // we do, there's nothing else to do but carry on. - } - this.out = ProcessBuilder.NullOutputStream.INSTANCE; - } - } - } -} diff -r dca843327b90 -r 97e9abb0864b jdk/src/solaris/classes/java/lang/UNIXProcess.java.linux --- a/jdk/src/solaris/classes/java/lang/UNIXProcess.java.linux Thu May 15 11:35:26 2014 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,410 +0,0 @@ -/* - * Copyright (c) 1995, 2013, 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. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * 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. - */ - -package java.lang; - -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.ByteArrayInputStream; -import java.io.FileDescriptor; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Arrays; -import java.util.concurrent.Executors; -import java.util.concurrent.Executor; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.TimeUnit; -import java.security.AccessController; -import static java.security.AccessController.doPrivileged; -import java.security.PrivilegedAction; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; - -/** - * java.lang.Process subclass in the UNIX environment. - * - * @author Mario Wolczko and Ross Knippel. - * @author Konstantin Kladko (ported to Linux) - * @author Martin Buchholz - */ -final class UNIXProcess extends Process { - private static final sun.misc.JavaIOFileDescriptorAccess fdAccess - = sun.misc.SharedSecrets.getJavaIOFileDescriptorAccess(); - - private final int pid; - private int exitcode; - private boolean hasExited; - - private /* final */ OutputStream stdin; - private /* final */ InputStream stdout; - private /* final */ InputStream stderr; - - private static enum LaunchMechanism { - FORK(1), - VFORK(3); - - private int value; - LaunchMechanism(int x) {value = x;} - }; - - /* default is VFORK on Linux */ - private static final LaunchMechanism launchMechanism; - private static byte[] helperpath; - - private static byte[] toCString(String s) { - if (s == null) - return null; - byte[] bytes = s.getBytes(); - byte[] result = new byte[bytes.length + 1]; - System.arraycopy(bytes, 0, - result, 0, - bytes.length); - result[result.length-1] = (byte)0; - return result; - } - - static { - launchMechanism = AccessController.doPrivileged( - new PrivilegedAction() - { - public LaunchMechanism run() { - String javahome = System.getProperty("java.home"); - String osArch = System.getProperty("os.arch"); - - helperpath = toCString(javahome + "/lib/" + osArch + "/jspawnhelper"); - String s = System.getProperty( - "jdk.lang.Process.launchMechanism", "vfork"); - - try { - return LaunchMechanism.valueOf(s.toUpperCase()); - } catch (IllegalArgumentException e) { - throw new Error(s + " is not a supported " + - "process launch mechanism on this platform."); - } - } - }); - } - - /* this is for the reaping thread */ - private native int waitForProcessExit(int pid); - - /** - * Create a process. Depending on the mode flag, this is done by - * one of the following mechanisms. - * - fork(2) and exec(2) - * - clone(2) and exec(2) - * - vfork(2) and exec(2) - * - * @param fds an array of three file descriptors. - * Indexes 0, 1, and 2 correspond to standard input, - * standard output and standard error, respectively. On - * input, a value of -1 means to create a pipe to connect - * child and parent processes. On output, a value which - * is not -1 is the parent pipe fd corresponding to the - * pipe which has been created. An element of this array - * is -1 on input if and only if it is not -1 on - * output. - * @return the pid of the subprocess - */ - private native int forkAndExec(int mode, byte[] helperpath, - byte[] prog, - byte[] argBlock, int argc, - byte[] envBlock, int envc, - byte[] dir, - int[] fds, - boolean redirectErrorStream) - throws IOException; - - /** - * The thread factory used to create "process reaper" daemon threads. - */ - private static class ProcessReaperThreadFactory implements ThreadFactory { - private final static ThreadGroup group = getRootThreadGroup(); - - private static ThreadGroup getRootThreadGroup() { - return doPrivileged(new PrivilegedAction () { - public ThreadGroup run() { - ThreadGroup root = Thread.currentThread().getThreadGroup(); - while (root.getParent() != null) - root = root.getParent(); - return root; - }}); - } - - public Thread newThread(Runnable grimReaper) { - // Our thread stack requirement is quite modest. - Thread t = new Thread(group, grimReaper, "process reaper", 32768); - t.setDaemon(true); - // A small attempt (probably futile) to avoid priority inversion - t.setPriority(Thread.MAX_PRIORITY); - return t; - } - } - - /** - * The thread pool of "process reaper" daemon threads. - */ - private static final Executor processReaperExecutor = - doPrivileged(new PrivilegedAction() { - public Executor run() { - return Executors.newCachedThreadPool - (new ProcessReaperThreadFactory()); - }}); - - UNIXProcess(final byte[] prog, - final byte[] argBlock, final int argc, - final byte[] envBlock, final int envc, - final byte[] dir, - final int[] fds, - final boolean redirectErrorStream) - throws IOException { - - pid = forkAndExec(launchMechanism.value, - helperpath, - prog, - argBlock, argc, - envBlock, envc, - dir, - fds, - redirectErrorStream); - - try { - doPrivileged(new PrivilegedExceptionAction() { - public Void run() throws IOException { - initStreams(fds); - return null; - }}); - } catch (PrivilegedActionException ex) { - throw (IOException) ex.getException(); - } - } - - static FileDescriptor newFileDescriptor(int fd) { - FileDescriptor fileDescriptor = new FileDescriptor(); - fdAccess.set(fileDescriptor, fd); - return fileDescriptor; - } - - void initStreams(int[] fds) throws IOException { - stdin = (fds[0] == -1) ? - ProcessBuilder.NullOutputStream.INSTANCE : - new ProcessPipeOutputStream(fds[0]); - - stdout = (fds[1] == -1) ? - ProcessBuilder.NullInputStream.INSTANCE : - new ProcessPipeInputStream(fds[1]); - - stderr = (fds[2] == -1) ? - ProcessBuilder.NullInputStream.INSTANCE : - new ProcessPipeInputStream(fds[2]); - - processReaperExecutor.execute(new Runnable() { - public void run() { - int exitcode = waitForProcessExit(pid); - UNIXProcess.this.processExited(exitcode); - }}); - } - - void processExited(int exitcode) { - synchronized (this) { - this.exitcode = exitcode; - hasExited = true; - notifyAll(); - } - - if (stdout instanceof ProcessPipeInputStream) - ((ProcessPipeInputStream) stdout).processExited(); - - if (stderr instanceof ProcessPipeInputStream) - ((ProcessPipeInputStream) stderr).processExited(); - - if (stdin instanceof ProcessPipeOutputStream) - ((ProcessPipeOutputStream) stdin).processExited(); - } - - public OutputStream getOutputStream() { - return stdin; - } - - public InputStream getInputStream() { - return stdout; - } - - public InputStream getErrorStream() { - return stderr; - } - - public synchronized int waitFor() throws InterruptedException { - while (!hasExited) { - wait(); - } - return exitcode; - } - - @Override - public synchronized boolean waitFor(long timeout, TimeUnit unit) - throws InterruptedException - { - if (hasExited) return true; - if (timeout <= 0) return false; - - long timeoutAsNanos = unit.toNanos(timeout); - long startTime = System.nanoTime(); - long rem = timeoutAsNanos; - - while (!hasExited && (rem > 0)) { - wait(Math.max(TimeUnit.NANOSECONDS.toMillis(rem), 1)); - rem = timeoutAsNanos - (System.nanoTime() - startTime); - } - return hasExited; - } - - public synchronized int exitValue() { - if (!hasExited) { - throw new IllegalThreadStateException("process hasn't exited"); - } - return exitcode; - } - - private static native void destroyProcess(int pid, boolean force); - private void destroy(boolean force) { - // There is a risk that pid will be recycled, causing us to - // kill the wrong process! So we only terminate processes - // that appear to still be running. Even with this check, - // there is an unavoidable race condition here, but the window - // is very small, and OSes try hard to not recycle pids too - // soon, so this is quite safe. - synchronized (this) { - if (!hasExited) - destroyProcess(pid, force); - } - try { stdin.close(); } catch (IOException ignored) {} - try { stdout.close(); } catch (IOException ignored) {} - try { stderr.close(); } catch (IOException ignored) {} - } - - public void destroy() { - destroy(false); - } - - @Override - public Process destroyForcibly() { - destroy(true); - return this; - } - - @Override - public synchronized boolean isAlive() { - return !hasExited; - } - - private static native void init(); - - static { - init(); - } - - /** - * A buffered input stream for a subprocess pipe file descriptor - * that allows the underlying file descriptor to be reclaimed when - * the process exits, via the processExited hook. - * - * This is tricky because we do not want the user-level InputStream to be - * closed until the user invokes close(), and we need to continue to be - * able to read any buffered data lingering in the OS pipe buffer. - */ - static class ProcessPipeInputStream extends BufferedInputStream { - private final Object closeLock = new Object(); - - ProcessPipeInputStream(int fd) { - super(new FileInputStream(newFileDescriptor(fd))); - } - private static byte[] drainInputStream(InputStream in) - throws IOException { - int n = 0; - int j; - byte[] a = null; - while ((j = in.available()) > 0) { - a = (a == null) ? new byte[j] : Arrays.copyOf(a, n + j); - n += in.read(a, n, j); - } - return (a == null || n == a.length) ? a : Arrays.copyOf(a, n); - } - - /** Called by the process reaper thread when the process exits. */ - synchronized void processExited() { - synchronized (closeLock) { - try { - InputStream in = this.in; - // this stream is closed if and only if: in == null - if (in != null) { - byte[] stragglers = drainInputStream(in); - in.close(); - this.in = (stragglers == null) ? - ProcessBuilder.NullInputStream.INSTANCE : - new ByteArrayInputStream(stragglers); - } - } catch (IOException ignored) {} - } - } - - @Override - public void close() throws IOException { - // BufferedInputStream#close() is not synchronized unlike most other methods. - // Synchronizing helps avoid race with processExited(). - synchronized (closeLock) { - super.close(); - } - } - } - - /** - * A buffered output stream for a subprocess pipe file descriptor - * that allows the underlying file descriptor to be reclaimed when - * the process exits, via the processExited hook. - */ - static class ProcessPipeOutputStream extends BufferedOutputStream { - ProcessPipeOutputStream(int fd) { - super(new FileOutputStream(newFileDescriptor(fd))); - } - - /** Called by the process reaper thread when the process exits. */ - synchronized void processExited() { - OutputStream out = this.out; - if (out != null) { - try { - out.close(); - } catch (IOException ignored) { - // We know of no reason to get an IOException, but if - // we do, there's nothing else to do but carry on. - } - this.out = ProcessBuilder.NullOutputStream.INSTANCE; - } - } - } -} diff -r dca843327b90 -r 97e9abb0864b jdk/src/solaris/classes/java/lang/UNIXProcess.java.solaris --- a/jdk/src/solaris/classes/java/lang/UNIXProcess.java.solaris Thu May 15 11:35:26 2014 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,395 +0,0 @@ -/* - * Copyright (c) 1995, 2013, 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. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * 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. - */ - -package java.lang; - -import java.io.*; -import java.util.concurrent.TimeUnit; -import java.security.AccessController; -import java.security.PrivilegedAction; - -/* java.lang.Process subclass in the UNIX environment. - * - * @author Mario Wolczko and Ross Knippel. - */ - -final class UNIXProcess extends Process { - private static final sun.misc.JavaIOFileDescriptorAccess fdAccess - = sun.misc.SharedSecrets.getJavaIOFileDescriptorAccess(); - - private final int pid; - private int exitcode; - private boolean hasExited; - - private OutputStream stdin_stream; - private InputStream stdout_stream; - private DeferredCloseInputStream stdout_inner_stream; - private InputStream stderr_stream; - - private static enum LaunchMechanism { - FORK(1), - POSIX_SPAWN(2); - - private int value; - LaunchMechanism(int x) {value = x;} - }; - - /* On Solaris, the default is to spawn */ - private static final LaunchMechanism launchMechanism; - private static byte[] helperpath; - - private static byte[] toCString(String s) { - if (s == null) - return null; - byte[] bytes = s.getBytes(); - byte[] result = new byte[bytes.length + 1]; - System.arraycopy(bytes, 0, - result, 0, - bytes.length); - result[result.length-1] = (byte)0; - return result; - } - - static { - launchMechanism = AccessController.doPrivileged( - new PrivilegedAction() - { - public LaunchMechanism run() { - String javahome = System.getProperty("java.home"); - String osArch = System.getProperty("os.arch"); - if (osArch.equals("x86")) { - osArch = "i386"; - } else if (osArch.equals("x86_64")) { - osArch = "amd64"; - } - - helperpath = toCString(javahome + "/lib/" + osArch + "/jspawnhelper"); - String s = System.getProperty( - "jdk.lang.Process.launchMechanism", "posix_spawn"); - - try { - return LaunchMechanism.valueOf(s.toUpperCase()); - } catch (IllegalArgumentException e) { - throw new Error(s + " is not a supported " + - "process launch mechanism on this platform."); - } - } - }); - } - - /* this is for the reaping thread */ - private native int waitForProcessExit(int pid); - - /** - * Create a process. Depending on the mode flag, this is done by - * one of the following mechanisms. - * - fork(2) and exec(2) - * - posix_spawn(2) - * - * @param std_fds array of file descriptors. Indexes 0, 1, and - * 2 correspond to standard input, standard output and - * standard error, respectively. On input, a value of -1 - * means to create a pipe to connect child and parent - * processes. On output, a value which is not -1 is the - * parent pipe fd corresponding to the pipe which has - * been created. An element of this array is -1 on input - * if and only if it is not -1 on output. - * @return the pid of the subprocess - */ - private native int forkAndExec(int mode, byte[] helperpath, - byte[] prog, - byte[] argBlock, int argc, - byte[] envBlock, int envc, - byte[] dir, - int[] std_fds, - boolean redirectErrorStream) - throws IOException; - - UNIXProcess(final byte[] prog, - final byte[] argBlock, int argc, - final byte[] envBlock, int envc, - final byte[] dir, - final int[] std_fds, - final boolean redirectErrorStream) - throws IOException { - pid = forkAndExec(launchMechanism.value, - helperpath, - prog, - argBlock, argc, - envBlock, envc, - dir, - std_fds, - redirectErrorStream); - - java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { public Void run() { - if (std_fds[0] == -1) - stdin_stream = ProcessBuilder.NullOutputStream.INSTANCE; - else { - FileDescriptor stdin_fd = new FileDescriptor(); - fdAccess.set(stdin_fd, std_fds[0]); - stdin_stream = new BufferedOutputStream( - new FileOutputStream(stdin_fd)); - } - - if (std_fds[1] == -1) - stdout_stream = ProcessBuilder.NullInputStream.INSTANCE; - else { - FileDescriptor stdout_fd = new FileDescriptor(); - fdAccess.set(stdout_fd, std_fds[1]); - stdout_inner_stream = new DeferredCloseInputStream(stdout_fd); - stdout_stream = new BufferedInputStream(stdout_inner_stream); - } - - if (std_fds[2] == -1) - stderr_stream = ProcessBuilder.NullInputStream.INSTANCE; - else { - FileDescriptor stderr_fd = new FileDescriptor(); - fdAccess.set(stderr_fd, std_fds[2]); - stderr_stream = new DeferredCloseInputStream(stderr_fd); - } - - return null; }}); - - /* - * For each subprocess forked a corresponding reaper thread - * is started. That thread is the only thread which waits - * for the subprocess to terminate and it doesn't hold any - * locks while doing so. This design allows waitFor() and - * exitStatus() to be safely executed in parallel (and they - * need no native code). - */ - - java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { public Void run() { - Thread t = new Thread("process reaper") { - public void run() { - int res = waitForProcessExit(pid); - synchronized (UNIXProcess.this) { - hasExited = true; - exitcode = res; - UNIXProcess.this.notifyAll(); - } - } - }; - t.setDaemon(true); - t.start(); - return null; }}); - } - - public OutputStream getOutputStream() { - return stdin_stream; - } - - public InputStream getInputStream() { - return stdout_stream; - } - - public InputStream getErrorStream() { - return stderr_stream; - } - - public synchronized int waitFor() throws InterruptedException { - while (!hasExited) { - wait(); - } - return exitcode; - } - - @Override - public synchronized boolean waitFor(long timeout, TimeUnit unit) - throws InterruptedException - { - if (hasExited) return true; - if (timeout <= 0) return false; - - long timeoutAsNanos = unit.toNanos(timeout); - long startTime = System.nanoTime(); - long rem = timeoutAsNanos; - - while (!hasExited && (rem > 0)) { - wait(Math.max(TimeUnit.NANOSECONDS.toMillis(rem), 1)); - rem = timeoutAsNanos - (System.nanoTime() - startTime); - } - return hasExited; - } - - public synchronized int exitValue() { - if (!hasExited) { - throw new IllegalThreadStateException("process hasn't exited"); - } - return exitcode; - } - - private static native void destroyProcess(int pid, boolean force); - private synchronized void destroy(boolean force) { - // There is a risk that pid will be recycled, causing us to - // kill the wrong process! So we only terminate processes - // that appear to still be running. Even with this check, - // there is an unavoidable race condition here, but the window - // is very small, and OSes try hard to not recycle pids too - // soon, so this is quite safe. - if (!hasExited) - destroyProcess(pid, force); - try { - stdin_stream.close(); - if (stdout_inner_stream != null) - stdout_inner_stream.closeDeferred(stdout_stream); - if (stderr_stream instanceof DeferredCloseInputStream) - ((DeferredCloseInputStream) stderr_stream) - .closeDeferred(stderr_stream); - } catch (IOException e) { - // ignore - } - } - - public void destroy() { - destroy(false); - } - - @Override - public Process destroyForcibly() { - destroy(true); - return this; - } - - @Override - public synchronized boolean isAlive() { - return !hasExited; - } - - // A FileInputStream that supports the deferment of the actual close - // operation until the last pending I/O operation on the stream has - // finished. This is required on Solaris because we must close the stdin - // and stdout streams in the destroy method in order to reclaim the - // underlying file descriptors. Doing so, however, causes any thread - // currently blocked in a read on one of those streams to receive an - // IOException("Bad file number"), which is incompatible with historical - // behavior. By deferring the close we allow any pending reads to see -1 - // (EOF) as they did before. - // - private static class DeferredCloseInputStream - extends FileInputStream - { - - private DeferredCloseInputStream(FileDescriptor fd) { - super(fd); - } - - private Object lock = new Object(); // For the following fields - private boolean closePending = false; - private int useCount = 0; - private InputStream streamToClose; - - private void raise() { - synchronized (lock) { - useCount++; - } - } - - private void lower() throws IOException { - synchronized (lock) { - useCount--; - if (useCount == 0 && closePending) { - streamToClose.close(); - } - } - } - - // stc is the actual stream to be closed; it might be this object, or - // it might be an upstream object for which this object is downstream. - // - private void closeDeferred(InputStream stc) throws IOException { - synchronized (lock) { - if (useCount == 0) { - stc.close(); - } else { - closePending = true; - streamToClose = stc; - } - } - } - - public void close() throws IOException { - synchronized (lock) { - useCount = 0; - closePending = false; - } - super.close(); - } - - public int read() throws IOException { - raise(); - try { - return super.read(); - } finally { - lower(); - } - } - - public int read(byte[] b) throws IOException { - raise(); - try { - return super.read(b); - } finally { - lower(); - } - } - - public int read(byte[] b, int off, int len) throws IOException { - raise(); - try { - return super.read(b, off, len); - } finally { - lower(); - } - } - - public long skip(long n) throws IOException { - raise(); - try { - return super.skip(n); - } finally { - lower(); - } - } - - public int available() throws IOException { - raise(); - try { - return super.available(); - } finally { - lower(); - } - } - - } - - private static native void init(); - - static { - init(); - } -} diff -r dca843327b90 -r 97e9abb0864b jdk/src/solaris/classes/sun/tools/attach/BsdVirtualMachine.java --- a/jdk/src/solaris/classes/sun/tools/attach/BsdVirtualMachine.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/src/solaris/classes/sun/tools/attach/BsdVirtualMachine.java Fri May 16 02:13:12 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, 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 @@ -24,14 +24,14 @@ */ package sun.tools.attach; -import com.sun.tools.attach.VirtualMachine; +import com.sun.tools.attach.AttachOperationFailedException; import com.sun.tools.attach.AgentLoadException; import com.sun.tools.attach.AttachNotSupportedException; import com.sun.tools.attach.spi.AttachProvider; + import java.io.InputStream; import java.io.IOException; import java.io.File; -import java.util.Properties; /* * Bsd implementation of HotSpotVirtualMachine @@ -191,6 +191,8 @@ } if (completionStatus != 0) { + // read from the stream and use that as the error message + String message = readErrorMessage(sis); sis.close(); // In the event of a protocol mismatch then the target VM @@ -205,7 +207,11 @@ if (cmd.equals("load")) { throw new AgentLoadException("Failed to load agent library"); } else { - throw new IOException("Command failed in target VM"); + if (message == null) { + throw new AttachOperationFailedException("Command failed in target VM"); + } else { + throw new AttachOperationFailedException(message); + } } } @@ -237,8 +243,9 @@ if ((off < 0) || (off > bs.length) || (len < 0) || ((off + len) > bs.length) || ((off + len) < 0)) { throw new IndexOutOfBoundsException(); - } else if (len == 0) + } else if (len == 0) { return 0; + } return BsdVirtualMachine.read(s, bs, off, len); } diff -r dca843327b90 -r 97e9abb0864b jdk/src/solaris/classes/sun/tools/attach/LinuxVirtualMachine.java --- a/jdk/src/solaris/classes/sun/tools/attach/LinuxVirtualMachine.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/src/solaris/classes/sun/tools/attach/LinuxVirtualMachine.java Fri May 16 02:13:12 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, 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 @@ -24,14 +24,14 @@ */ package sun.tools.attach; -import com.sun.tools.attach.VirtualMachine; +import com.sun.tools.attach.AttachOperationFailedException; import com.sun.tools.attach.AgentLoadException; import com.sun.tools.attach.AttachNotSupportedException; import com.sun.tools.attach.spi.AttachProvider; + import java.io.InputStream; import java.io.IOException; import java.io.File; -import java.util.Properties; /* * Linux implementation of HotSpotVirtualMachine @@ -207,6 +207,8 @@ } if (completionStatus != 0) { + // read from the stream and use that as the error message + String message = readErrorMessage(sis); sis.close(); // In the event of a protocol mismatch then the target VM @@ -221,7 +223,11 @@ if (cmd.equals("load")) { throw new AgentLoadException("Failed to load agent library"); } else { - throw new IOException("Command failed in target VM"); + if (message == null) { + throw new AttachOperationFailedException("Command failed in target VM"); + } else { + throw new AttachOperationFailedException(message); + } } } diff -r dca843327b90 -r 97e9abb0864b jdk/src/solaris/classes/sun/tools/attach/SolarisVirtualMachine.java --- a/jdk/src/solaris/classes/sun/tools/attach/SolarisVirtualMachine.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/src/solaris/classes/sun/tools/attach/SolarisVirtualMachine.java Fri May 16 02:13:12 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, 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 @@ -24,15 +24,15 @@ */ package sun.tools.attach; -import com.sun.tools.attach.VirtualMachine; +import com.sun.tools.attach.AttachOperationFailedException; import com.sun.tools.attach.AgentLoadException; import com.sun.tools.attach.AttachNotSupportedException; import com.sun.tools.attach.spi.AttachProvider; + import java.io.InputStream; import java.io.IOException; import java.io.File; import java.io.FileNotFoundException; -import java.util.Properties; /* * Solaris implementation of HotSpotVirtualMachine. @@ -147,11 +147,17 @@ // If non-0 it means an error but we need to special-case the // "load" command to ensure that the right exception is thrown. if (completionStatus != 0) { + // read from the stream and use that as the error message + String message = readErrorMessage(sis); sis.close(); if (cmd.equals("load")) { throw new AgentLoadException("Failed to load agent library"); } else { - throw new IOException("Command failed in target VM"); + if (message == null) { + throw new AttachOperationFailedException("Command failed in target VM"); + } else { + throw new AttachOperationFailedException(message); + } } } diff -r dca843327b90 -r 97e9abb0864b jdk/src/solaris/native/sun/tools/attach/BsdVirtualMachine.c --- a/jdk/src/solaris/native/sun/tools/attach/BsdVirtualMachine.c Thu May 15 11:35:26 2014 -0700 +++ b/jdk/src/solaris/native/sun/tools/attach/BsdVirtualMachine.c Fri May 16 02:13:12 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, 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 @@ -200,14 +200,14 @@ len = remaining; } - RESTARTABLE(read(fd, buf+off, len), n); + RESTARTABLE(read(fd, buf, len), n); if (n == -1) { JNU_ThrowIOExceptionWithLastError(env, "read"); } else { if (n == 0) { n = -1; // EOF } else { - (*env)->SetByteArrayRegion(env, ba, off, (jint)n, (jbyte *)(buf+off)); + (*env)->SetByteArrayRegion(env, ba, off, (jint)n, (jbyte *)(buf)); } } return n; diff -r dca843327b90 -r 97e9abb0864b jdk/src/solaris/native/sun/tools/attach/LinuxVirtualMachine.c --- a/jdk/src/solaris/native/sun/tools/attach/LinuxVirtualMachine.c Thu May 15 11:35:26 2014 -0700 +++ b/jdk/src/solaris/native/sun/tools/attach/LinuxVirtualMachine.c Fri May 16 02:13:12 2014 -0700 @@ -418,14 +418,14 @@ len = remaining; } - RESTARTABLE(read(fd, buf+off, len), n); + RESTARTABLE(read(fd, buf, len), n); if (n == -1) { JNU_ThrowIOExceptionWithLastError(env, "read"); } else { if (n == 0) { n = -1; // EOF } else { - (*env)->SetByteArrayRegion(env, ba, off, (jint)n, (jbyte *)(buf+off)); + (*env)->SetByteArrayRegion(env, ba, off, (jint)n, (jbyte *)(buf)); } } return n; diff -r dca843327b90 -r 97e9abb0864b jdk/src/solaris/native/sun/tools/attach/SolarisVirtualMachine.c --- a/jdk/src/solaris/native/sun/tools/attach/SolarisVirtualMachine.c Thu May 15 11:35:26 2014 -0700 +++ b/jdk/src/solaris/native/sun/tools/attach/SolarisVirtualMachine.c Fri May 16 02:13:12 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, 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 @@ -161,14 +161,14 @@ len = remaining; } - RESTARTABLE(read(fd, buf+off, len), n); + RESTARTABLE(read(fd, buf, len), n); if (n == -1) { JNU_ThrowIOExceptionWithLastError(env, "read"); } else { if (n == 0) { n = -1; // EOF } else { - (*env)->SetByteArrayRegion(env, ba, off, (jint)n, (jbyte *)(buf+off)); + (*env)->SetByteArrayRegion(env, ba, off, (jint)n, (jbyte *)(buf)); } } return n; diff -r dca843327b90 -r 97e9abb0864b jdk/src/windows/classes/sun/tools/attach/WindowsVirtualMachine.java --- a/jdk/src/windows/classes/sun/tools/attach/WindowsVirtualMachine.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/src/windows/classes/sun/tools/attach/WindowsVirtualMachine.java Fri May 16 02:13:12 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, 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 @@ -24,15 +24,15 @@ */ package sun.tools.attach; -import com.sun.tools.attach.VirtualMachine; +import com.sun.tools.attach.AttachOperationFailedException; import com.sun.tools.attach.AgentLoadException; import com.sun.tools.attach.AttachNotSupportedException; import com.sun.tools.attach.spi.AttachProvider; + import sun.tools.attach.HotSpotVirtualMachine; + import java.io.IOException; -import java.io.File; import java.io.InputStream; -import java.util.Properties; import java.util.Random; public class WindowsVirtualMachine extends HotSpotVirtualMachine { @@ -105,11 +105,17 @@ // read completion status int status = readInt(is); if (status != 0) { + // read from the stream and use that as the error message + String message = readErrorMessage(is); // special case the load command so that the right exception is thrown if (cmd.equals("load")) { throw new AgentLoadException("Failed to load agent library"); } else { - throw new IOException("Command failed in target VM"); + if (message == null) { + throw new AttachOperationFailedException("Command failed in target VM"); + } else { + throw new AttachOperationFailedException(message); + } } } diff -r dca843327b90 -r 97e9abb0864b jdk/src/windows/lib/security/java.policy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/windows/lib/security/java.policy Fri May 16 02:13:12 2014 -0700 @@ -0,0 +1,3 @@ +grant codeBase "file:${java.home}/lib/ext/sunmscapi.jar" { + permission java.security.AllPermission; +}; diff -r dca843327b90 -r 97e9abb0864b jdk/src/windows/native/sun/tools/attach/WindowsVirtualMachine.c --- a/jdk/src/windows/native/sun/tools/attach/WindowsVirtualMachine.c Thu May 15 11:35:26 2014 -0700 +++ b/jdk/src/windows/native/sun/tools/attach/WindowsVirtualMachine.c Fri May 16 02:13:12 2014 -0700 @@ -343,7 +343,7 @@ if (nread == 0) { return (jint)-1; // EOF } else { - (*env)->SetByteArrayRegion(env, ba, off, (jint)nread, (jbyte *)(buf+off)); + (*env)->SetByteArrayRegion(env, ba, off, (jint)nread, (jbyte *)(buf)); } } diff -r dca843327b90 -r 97e9abb0864b jdk/test/TEST.groups --- a/jdk/test/TEST.groups Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/TEST.groups Fri May 16 02:13:12 2014 -0700 @@ -97,7 +97,8 @@ jdk_nio = \ java/nio \ - sun/nio + sun/nio \ + jdk/nio jdk_net = \ java/net \ @@ -203,7 +204,6 @@ com/sun/jndi \ com/sun/corba \ lib/testlibrary \ - jdk/nio/zipfs \ sample # diff -r dca843327b90 -r 97e9abb0864b jdk/test/com/sun/management/HotSpotDiagnosticMXBean/CheckOrigin.java --- a/jdk/test/com/sun/management/HotSpotDiagnosticMXBean/CheckOrigin.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/com/sun/management/HotSpotDiagnosticMXBean/CheckOrigin.java Fri May 16 02:13:12 2014 -0700 @@ -26,6 +26,7 @@ * @bug 8028994 * @author Staffan Larsen * @library /lib/testlibrary + * @build jdk.testlibrary.* * @run main CheckOrigin */ diff -r dca843327b90 -r 97e9abb0864b jdk/test/com/sun/tools/attach/BasicTests.java --- a/jdk/test/com/sun/tools/attach/BasicTests.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/com/sun/tools/attach/BasicTests.java Fri May 16 02:13:12 2014 -0700 @@ -38,7 +38,7 @@ * @bug 6173612 6273707 6277253 6335921 6348630 6342019 6381757 * @summary Basic unit tests for the VM attach mechanism. * @library /lib/testlibrary - * @run build Agent BadAgent RedefineAgent Application Shutdown RedefineDummy RunnerUtil + * @run build jdk.testlibrary.* Agent BadAgent RedefineAgent Application Shutdown RedefineDummy RunnerUtil * @run main BasicTests * * This test will perform a number of basic attach tests. diff -r dca843327b90 -r 97e9abb0864b jdk/test/com/sun/tools/attach/PermissionTest.java --- a/jdk/test/com/sun/tools/attach/PermissionTest.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/com/sun/tools/attach/PermissionTest.java Fri May 16 02:13:12 2014 -0700 @@ -34,7 +34,7 @@ * @bug 6173612 6273707 6277253 6335921 6348630 6342019 6381757 * @summary Basic unit tests for the VM attach mechanism. * @library /lib/testlibrary - * @run build Application Shutdown + * @run build jdk.testlibrary.* Application Shutdown * @run main PermissionTest * * Unit test for Attach API - diff -r dca843327b90 -r 97e9abb0864b jdk/test/com/sun/tools/attach/ProviderTest.java --- a/jdk/test/com/sun/tools/attach/ProviderTest.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/com/sun/tools/attach/ProviderTest.java Fri May 16 02:13:12 2014 -0700 @@ -33,7 +33,7 @@ * @bug 6173612 6273707 6277253 6335921 6348630 6342019 6381757 * @summary Basic unit tests for the VM attach mechanism. * @library /lib/testlibrary - * @run build SimpleProvider + * @run build jdk.testlibrary.* SimpleProvider * @run main ProviderTest * * The test will attach and detach to/from the running Application. diff -r dca843327b90 -r 97e9abb0864b jdk/test/java/io/BufferedInputStream/LargeCopyWithMark.java --- a/jdk/test/java/io/BufferedInputStream/LargeCopyWithMark.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/java/io/BufferedInputStream/LargeCopyWithMark.java Fri May 16 02:13:12 2014 -0700 @@ -26,6 +26,7 @@ * @summary BufferedInputStream calculates negative array size with large * streams and mark * @library /lib/testlibrary + * @build jdk.testlibrary.* * @run main/othervm LargeCopyWithMark */ diff -r dca843327b90 -r 97e9abb0864b jdk/test/java/lang/ProcessBuilder/SecurityManagerClinit.java --- a/jdk/test/java/lang/ProcessBuilder/SecurityManagerClinit.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/java/lang/ProcessBuilder/SecurityManagerClinit.java Fri May 16 02:13:12 2014 -0700 @@ -54,9 +54,6 @@ System.getProperty("java.home") + File.separator + "bin" + File.separator + "java"; - // A funky contrived security setup, just for bug repro purposes. - java.security.Security.setProperty("package.access", "java.util"); - final Policy policy = new Policy (new FilePermission("<>", "execute"), diff -r dca843327b90 -r 97e9abb0864b jdk/test/java/lang/String/ToLowerCase.java --- a/jdk/test/java/lang/String/ToLowerCase.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/java/lang/String/ToLowerCase.java Fri May 16 02:13:12 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2014, 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 @@ -23,7 +23,7 @@ /* @test - @bug 4217441 4533872 4900935 8020037 8032012 + @bug 4217441 4533872 4900935 8020037 8032012 8041791 @summary toLowerCase should lower-case Greek Sigma correctly depending on the context (final/non-final). Also it should handle Locale specific (lt, tr, and az) lowercasings and supplementary @@ -72,8 +72,10 @@ // I-dot tests test("\u0130", turkish, "i"); test("\u0130", az, "i"); - test("\u0130", lt, "i"); - test("\u0130", Locale.US, "i"); + test("\u0130", lt, "\u0069\u0307"); + test("\u0130", Locale.US, "\u0069\u0307"); + test("\u0130", Locale.JAPAN, "\u0069\u0307"); + test("\u0130", Locale.ROOT, "\u0069\u0307"); // Remove dot_above in the sequence I + dot_above (Turkish and Azeri) test("I\u0307", turkish, "i"); @@ -111,6 +113,12 @@ if (cp >= Character.MIN_HIGH_SURROGATE && cp <= Character.MAX_HIGH_SURROGATE) { continue; } + if (cp == 0x0130) { + // Although UnicodeData.txt has the lower case char as \u0069, it should be + // handled with the rules in SpecialCasing.txt, i.e., \u0069\u0307 in + // non Turkic locales. + continue; + } int lowerCase = Character.toLowerCase(cp); if (lowerCase == -1) { //Character.ERROR continue; diff -r dca843327b90 -r 97e9abb0864b jdk/test/java/lang/instrument/PremainClass/NoPremainAgentTest.java --- a/jdk/test/java/lang/instrument/PremainClass/NoPremainAgentTest.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/java/lang/instrument/PremainClass/NoPremainAgentTest.java Fri May 16 02:13:12 2014 -0700 @@ -30,7 +30,7 @@ * @bug 6289149 * @summary test when the agent's class is missing the premain() function. * @library /lib/testlibrary - * @run build DummyMain + * @run build jdk.testlibrary.* DummyMain * @run shell ../MakeJAR3.sh NoPremainAgent * @run main NoPremainAgentTest */ diff -r dca843327b90 -r 97e9abb0864b jdk/test/java/lang/instrument/PremainClass/PremainClassTest.java --- a/jdk/test/java/lang/instrument/PremainClass/PremainClassTest.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/java/lang/instrument/PremainClass/PremainClassTest.java Fri May 16 02:13:12 2014 -0700 @@ -30,7 +30,7 @@ * @bug 5055293 * @summary Test non ascii characters in the Premain-Class attribute. * @library /lib/testlibrary - * @run build DummyMain + * @run build jdk.testlibrary.* DummyMain * @run main PremainClassTest */ public class PremainClassTest { diff -r dca843327b90 -r 97e9abb0864b jdk/test/java/lang/instrument/PremainClass/ZeroArgPremainAgentTest.java --- a/jdk/test/java/lang/instrument/PremainClass/ZeroArgPremainAgentTest.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/java/lang/instrument/PremainClass/ZeroArgPremainAgentTest.java Fri May 16 02:13:12 2014 -0700 @@ -30,7 +30,7 @@ * @bug 6289149 * @summary test when the agent's class has a zero arg premain() function. * @library /lib/testlibrary - * @run build DummyMain + * @run build jdk.testlibrary.* DummyMain * @run shell ../MakeJAR3.sh ZeroArgPremainAgent * @run main ZeroArgPremainAgentTest */ diff -r dca843327b90 -r 97e9abb0864b jdk/test/java/lang/management/MemoryMXBean/CollectionUsageThreshold.java --- a/jdk/test/java/lang/management/MemoryMXBean/CollectionUsageThreshold.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/java/lang/management/MemoryMXBean/CollectionUsageThreshold.java Fri May 16 02:13:12 2014 -0700 @@ -31,7 +31,7 @@ * @author Mandy Chung * * @library /lib/testlibrary/ - * @build CollectionUsageThreshold MemoryUtil RunUtil + * @build jdk.testlibrary.* CollectionUsageThreshold MemoryUtil RunUtil * @run main/timeout=300 CollectionUsageThreshold */ diff -r dca843327b90 -r 97e9abb0864b jdk/test/java/lang/management/MemoryMXBean/LowMemoryTest.java --- a/jdk/test/java/lang/management/MemoryMXBean/LowMemoryTest.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/java/lang/management/MemoryMXBean/LowMemoryTest.java Fri May 16 02:13:12 2014 -0700 @@ -31,7 +31,7 @@ * @author Mandy Chung * * @library /lib/testlibrary/ - * @build LowMemoryTest MemoryUtil RunUtil + * @build jdk.testlibrary.* LowMemoryTest MemoryUtil RunUtil * @run main/timeout=600 LowMemoryTest */ diff -r dca843327b90 -r 97e9abb0864b jdk/test/java/net/Authenticator/B8034170.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/net/Authenticator/B8034170.java Fri May 16 02:13:12 2014 -0700 @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2014, 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. + */ + +import java.io.*; +import java.net.*; +import java.util.*; + +/** + * @test + * @bug 8034170 + * @summary Digest authentication interop issue + * @run main/othervm B8034170 unquoted + * @run main/othervm -Dhttp.auth.digest.quoteParameters=true B8034170 quoted + */ + +public class B8034170 { + + static boolean expectQuotes; + + static class BasicServer extends Thread { + + ServerSocket server; + + Socket s; + InputStream is; + OutputStream os; + + static final String realm = "wallyworld"; + + String reply1 = "HTTP/1.1 401 Unauthorized\r\n"+ + "WWW-Authenticate: Digest realm=\""+realm+"\", qop=\"auth\"" + + ", nonce=\"8989de95ea2402b64d73cecdb15da255\"" + + ", opaque=\"bbfb4c9ee92ddccc73521c3e6e841ba2\"\r\n\r\n"; + + String OKreply = "HTTP/1.1 200 OK\r\n"+ + "Date: Mon, 15 Jan 2001 12:18:21 GMT\r\n" + + "Server: Apache/1.3.14 (Unix)\r\n" + + "Connection: close\r\n" + + "Content-Type: text/plain; charset=iso-8859-1\r\n" + + "Content-Length: 10\r\n\r\n"; + + String ERRreply = "HTTP/1.1 500 Internal server error\r\n"+ + "Date: Mon, 15 Jan 2001 12:18:21 GMT\r\n" + + "Server: Apache/1.3.14 (Unix)\r\n" + + "Connection: close\r\n" + + "Content-Length: 0\r\n\r\n"; + + BasicServer (ServerSocket s) { + server = s; + } + + int readAll (Socket s, byte[] buf) throws IOException { + int pos = 0; + InputStream is = s.getInputStream (); + // wait two seconds for request, as client doesn't close + // the connection + s.setSoTimeout(2000); + try { + int n; + while ((n=is.read(buf, pos, buf.length-pos)) > 0) + pos +=n; + } catch (SocketTimeoutException x) { } + return pos; + } + + public void run () { + byte[] buf = new byte[5000]; + try { + System.out.println ("Server 1: accept"); + s = server.accept (); + System.out.println ("accepted"); + os = s.getOutputStream(); + os.write (reply1.getBytes()); + readAll (s, buf); + s.close (); + + System.out.println ("Server 2: accept"); + s = server.accept (); + System.out.println ("accepted"); + os = s.getOutputStream(); + int count = readAll (s, buf); + String reply = new String(buf, 0, count); + + boolean error; + + if (expectQuotes) { + error = false; + if (!reply.contains("qop=\"auth\"")) { + System.out.println ("Expecting quoted qop. Not found"); + error = true; + } + if (!reply.contains("algorithm=\"MD5\"")) { + System.out.println ("Expecting quoted algorithm. Not found"); + error = true; + } + } else { + error = false; + if (!reply.contains("qop=auth")) { + System.out.println ("Expecting unquoted qop. Not found"); + error = true; + } + if (!reply.contains("algorithm=MD5")) { + System.out.println ("Expecting unquoted algorithm. Not found"); + error = true; + } + } + if (error) { + os.write(ERRreply.getBytes()); + os.flush(); + s.close(); + } else { + os.write((OKreply+"HelloWorld").getBytes()); + os.flush(); + s.close(); + } + } + catch (Exception e) { + System.out.println (e); + } + finished (); + } + + public synchronized void finished () { + notifyAll(); + } + + } + + static class MyAuthenticator3 extends Authenticator { + PasswordAuthentication pw; + MyAuthenticator3 () { + super (); + pw = new PasswordAuthentication ("user", "passwordNotCheckedAnyway".toCharArray()); + } + + public PasswordAuthentication getPasswordAuthentication () + { + System.out.println ("Auth called"); + return pw; + } + } + + + static void read (InputStream is) throws IOException { + int c; + System.out.println ("reading"); + while ((c=is.read()) != -1) { + System.out.write (c); + } + System.out.println (""); + System.out.println ("finished reading"); + } + + public static void main (String args[]) throws Exception { + expectQuotes = args[0].equals("quoted"); + + MyAuthenticator3 auth = new MyAuthenticator3 (); + Authenticator.setDefault (auth); + ServerSocket ss = new ServerSocket (0); + int port = ss.getLocalPort (); + BasicServer server = new BasicServer (ss); + synchronized (server) { + server.start(); + System.out.println ("client 1"); + URL url = new URL ("http://localhost:"+port+"/d1/d2/d3/foo.html"); + URLConnection urlc = url.openConnection (); + InputStream is = urlc.getInputStream (); + read (is); + is.close (); + } + } +} diff -r dca843327b90 -r 97e9abb0864b jdk/test/java/net/URLPermission/nstest/lookup.sh --- a/jdk/test/java/net/URLPermission/nstest/lookup.sh Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/java/net/URLPermission/nstest/lookup.sh Fri May 16 02:13:12 2014 -0700 @@ -26,7 +26,7 @@ # @library /lib/testlibrary # @compile -XDignore.symbol.file=true SimpleNameService.java # LookupTest.java SimpleNameServiceDescriptor.java -# @build jdk.testlibrary.Utils +# @build jdk.testlibrary.* # @run shell/timeout=50 lookup.sh # diff -r dca843327b90 -r 97e9abb0864b jdk/test/java/util/Properties/CompatibilityTest.java --- a/jdk/test/java/util/Properties/CompatibilityTest.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/java/util/Properties/CompatibilityTest.java Fri May 16 02:13:12 2014 -0700 @@ -25,8 +25,6 @@ * @test * @bug 8005280 8004371 * @summary Compatibility test - * @run main CompatibilityTest - * @run main/othervm -Dsun.util.spi.XmlPropertiesProvider=jdk.internal.util.xml.BasicXmlPropertiesProvider CompatibilityTest */ import java.io.FileInputStream; diff -r dca843327b90 -r 97e9abb0864b jdk/test/java/util/Properties/ConcurrentLoadAndStoreXML.java --- a/jdk/test/java/util/Properties/ConcurrentLoadAndStoreXML.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/java/util/Properties/ConcurrentLoadAndStoreXML.java Fri May 16 02:13:12 2014 -0700 @@ -25,9 +25,6 @@ * @bug 8005281 * @summary Test that the Properties storeToXML and loadFromXML methods are * thread safe - * @run main ConcurrentLoadAndStoreXML - * @run main/othervm -Dsun.util.spi.XmlPropertiesProvider=jdk.internal.util.xml.BasicXmlPropertiesProvider ConcurrentLoadAndStoreXML - */ import java.io.*; diff -r dca843327b90 -r 97e9abb0864b jdk/test/java/util/Properties/CustomProvider.java --- a/jdk/test/java/util/Properties/CustomProvider.java Thu May 15 11:35:26 2014 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2012, 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 8000354 - * @summary Test - * @compile -XDignore.symbol.file CustomProvider.java MyXmlPropertiesProvider.java - * @run main/othervm -Dsun.util.spi.XmlPropertiesProvider=MyXmlPropertiesProvider CustomProvider - */ - -import java.util.*; -import java.io.*; - -/** - * Sanity test to verify that the property sun.util.spi.XmlPropertiesProvider - * can be used to specify a custom provider for loading/storing properties - * in XML format. - */ -public class CustomProvider { - - public static void main(String[] args) throws IOException { - String provider = System.getProperty("sun.util.spi.XmlPropertiesProvider"); - assertTrue(provider != null, "sun.util.spi.XmlPropertiesProvider not set"); - - OutputStream out = new ByteArrayOutputStream(); - InputStream in = new ByteArrayInputStream(new byte[100]); - - Properties props; - - props = new Properties(); - props.loadFromXML(in); - - props = System.getProperties(); - props.storeToXML(out, "comment"); - props.storeToXML(out, "comment", "UTF-8"); - - // check that the provider's load and store methods have been invoked - - assertTrue(MyXmlPropertiesProvider.createCount() == 1, - "Provider should only be created once"); - assertTrue(MyXmlPropertiesProvider.loadCount() == 1, - "load method expected to be called once"); - assertTrue(MyXmlPropertiesProvider.storeCount() == 2, - "store method expected to be called twice"); - } - - static void assertTrue(boolean b, String msg) { - if (!b) throw new RuntimeException(msg); - } -} diff -r dca843327b90 -r 97e9abb0864b jdk/test/java/util/Properties/LoadAndStoreXML.java --- a/jdk/test/java/util/Properties/LoadAndStoreXML.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/java/util/Properties/LoadAndStoreXML.java Fri May 16 02:13:12 2014 -0700 @@ -23,16 +23,28 @@ /* * @test - * @bug 8000354 8000685 8004371 + * @bug 8000354 8000685 8004371 8043119 * @summary Basic test of storeToXML and loadToXML - * @run main LoadAndStoreXML - * @run main/othervm -Dsun.util.spi.XmlPropertiesProvider=jdk.internal.util.xml.BasicXmlPropertiesProvider LoadAndStoreXML */ -import java.io.*; -import java.util.*; -import java.security.*; -import java.nio.file.*; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.security.CodeSource; +import java.security.Permission; +import java.security.PermissionCollection; +import java.security.Permissions; +import java.security.Policy; +import java.security.ProtectionDomain; +import java.util.InvalidPropertiesFormatException; +import java.util.Properties; +import java.util.PropertyPermission; public class LoadAndStoreXML { @@ -66,6 +78,50 @@ } /** + * A {@code ByteArrayInputStream} that allows testing if the + * {@code close} method has been invoked. + */ + static class TestInputStream extends ByteArrayInputStream { + private boolean closed; + + TestInputStream(byte[] buf) { + super(buf); + } + + boolean isOpen() { + return !closed; + } + + public void close() throws IOException { + try { + super.close(); + } finally { + closed = true; + } + } + } + + /** + * A {@code ByteArrayOutputStream} that allows testing if the + * {@code close} method has been invoked. + */ + static class TestOutputStream extends ByteArrayOutputStream { + private boolean closed; + + boolean isOpen() { + return !closed; + } + + public void close() throws IOException { + try { + super.close(); + } finally { + closed = true; + } + } + } + + /** * Sanity test that properties saved with Properties#storeToXML can be * read with Properties#loadFromXML. */ @@ -79,12 +135,16 @@ props.put("k4", "\u7532\u9aa8\u6587"); props.put("k5", "/lib/jaxp.properties"); - ByteArrayOutputStream out = new ByteArrayOutputStream(); + TestOutputStream out = new TestOutputStream(); props.storeToXML(out, null, encoding); + if (!out.isOpen()) + throw new RuntimeException("OutputStream closed by storeToXML"); Properties p = new Properties(); - ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); + TestInputStream in = new TestInputStream(out.toByteArray()); p.loadFromXML(in); + if (in.isOpen()) + throw new RuntimeException("InputStream not closed by loadFromXML"); if (!p.equals(props)) { System.err.println("stored: " + props); diff -r dca843327b90 -r 97e9abb0864b jdk/test/java/util/Properties/LoadAndStoreXMLWithDefaults.java --- a/jdk/test/java/util/Properties/LoadAndStoreXMLWithDefaults.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/java/util/Properties/LoadAndStoreXMLWithDefaults.java Fri May 16 02:13:12 2014 -0700 @@ -35,58 +35,17 @@ */ public class LoadAndStoreXMLWithDefaults { - public static enum StoreMethod { - // Note: this case will test the default provider when available, - // and the basic provider when it's not. - PROPERTIES { - @Override - public String writeToXML(Properties p) throws IOException { - final ByteArrayOutputStream baos = new ByteArrayOutputStream(); - p.storeToXML(baos, "Test 8016344"); - return baos.toString(); - } - @Override - public Properties loadFromXML(String xml, Properties defaults) - throws IOException { - final ByteArrayInputStream bais = new ByteArrayInputStream(xml.getBytes("UTF-8")); - Properties p = new Properties(defaults); - p.loadFromXML(bais); - return p; - } - }, - // Note: this case always test the basic provider, which is always available. - // so sometimes it's just a dup with the previous case... - BASICPROVIDER { - @Override - public String writeToXML(Properties p) throws IOException { - final ByteArrayOutputStream baos = new ByteArrayOutputStream(); - jdk.internal.util.xml.BasicXmlPropertiesProvider provider = - new jdk.internal.util.xml.BasicXmlPropertiesProvider(); - provider.store(p, baos, "Test 8016344", "UTF-8"); - return baos.toString(); - } - @Override - public Properties loadFromXML(String xml, Properties defaults) - throws IOException { - final ByteArrayInputStream bais = new ByteArrayInputStream(xml.getBytes("UTF-8")); - Properties p = new Properties(defaults); - jdk.internal.util.xml.BasicXmlPropertiesProvider provider = - new jdk.internal.util.xml.BasicXmlPropertiesProvider(); - provider.load(p, bais); - return p; - } - }; - public abstract String writeToXML(Properties p) throws IOException; - public abstract Properties loadFromXML(String xml, Properties defaults) - throws IOException; - public String displayName() { - switch(this) { - case PROPERTIES: return "Properties.storeToXML"; - case BASICPROVIDER: return "BasicXmlPropertiesProvider.store"; - default: - throw new UnsupportedOperationException(this.name()); - } - } + static String writeToXML(Properties props) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + props.storeToXML(baos, "Test 8016344"); + return baos.toString(); + } + + static Properties loadFromXML(String xml, Properties defaults) throws IOException { + ByteArrayInputStream bais = new ByteArrayInputStream(xml.getBytes("UTF-8")); + Properties props = new Properties(defaults); + props.loadFromXML(bais); + return props; } static enum Objects { OBJ1, OBJ2, OBJ3 }; @@ -106,63 +65,59 @@ p3.setProperty("p1.and.p2.and.p3.prop", "prop9-p3"); p3.setProperty("p2.and.p3.prop", "prop10-p3"); - for (StoreMethod m : StoreMethod.values()) { - System.out.println("Testing with " + m.displayName()); - Properties P1 = m.loadFromXML(m.writeToXML(p1), null); - Properties P2 = m.loadFromXML(m.writeToXML(p2), P1); - Properties P3 = m.loadFromXML(m.writeToXML(p3), P2); + Properties P1 = loadFromXML(writeToXML(p1), null); + Properties P2 = loadFromXML(writeToXML(p2), P1); + Properties P3 = loadFromXML(writeToXML(p3), P2); - testResults(m, p1, P1, p2, P2, p3, P3); + testResults(p1, P1, p2, P2, p3, P3); - // Now check that properties whose keys or values are objects - // are skipped. + // Now check that properties whose keys or values are objects + // are skipped. - System.out.println("Testing with " + m.displayName() + " and Objects"); - P1.put("p1.object.prop", Objects.OBJ1); - P1.put(Objects.OBJ1, "p1.object.prop"); - P1.put("p2.object.prop", "p2.object.prop"); - P2.put("p2.object.prop", Objects.OBJ2); - P2.put(Objects.OBJ2, "p2.object.prop"); - P3.put("p3.object.prop", Objects.OBJ3); - P3.put(Objects.OBJ3, "p3.object.prop"); + P1.put("p1.object.prop", Objects.OBJ1); + P1.put(Objects.OBJ1, "p1.object.prop"); + P1.put("p2.object.prop", "p2.object.prop"); + P2.put("p2.object.prop", Objects.OBJ2); + P2.put(Objects.OBJ2, "p2.object.prop"); + P3.put("p3.object.prop", Objects.OBJ3); + P3.put(Objects.OBJ3, "p3.object.prop"); - Properties PP1 = m.loadFromXML(m.writeToXML(P1), null); - Properties PP2 = m.loadFromXML(m.writeToXML(P2), PP1); - Properties PP3 = m.loadFromXML(m.writeToXML(P3), PP2); + Properties PP1 = loadFromXML(writeToXML(P1), null); + Properties PP2 = loadFromXML(writeToXML(P2), PP1); + Properties PP3 = loadFromXML(writeToXML(P3), PP2); - p1.setProperty("p2.object.prop", "p2.object.prop"); - try { - testResults(m, p1, PP1, p2, PP2, p3, PP3); - } finally { - p1.remove("p2.object.prop"); - } + p1.setProperty("p2.object.prop", "p2.object.prop"); + try { + testResults(p1, PP1, p2, PP2, p3, PP3); + } finally { + p1.remove("p2.object.prop"); } } - public static void testResults(StoreMethod m, Properties... pps) { + public static void testResults(Properties... pps) { for (int i=0 ; i < pps.length ; i += 2) { if (!pps[i].equals(pps[i+1])) { - System.err.println(m.displayName() +": P" + (i/2+1) + System.err.println("P" + (i/2+1) + " Reloaded properties differ from original"); System.err.println("\toriginal: " + pps[i]); System.err.println("\treloaded: " + pps[i+1]); - throw new RuntimeException(m.displayName() +": P" + (i/2+1) + throw new RuntimeException("P" + (i/2+1) + " Reloaded properties differ from original"); } if (!pps[i].keySet().equals(pps[i+1].keySet())) { - System.err.println(m.displayName() +": P" + (i/2+1) + System.err.println("P" + (i/2+1) + " Reloaded property names differ from original"); System.err.println("\toriginal: " + pps[i].keySet()); System.err.println("\treloaded: " + pps[i+1].keySet()); - throw new RuntimeException(m.displayName() +": P" + (i/2+1) + throw new RuntimeException("P" + (i/2+1) + " Reloaded property names differ from original"); } if (!pps[i].stringPropertyNames().equals(pps[i+1].stringPropertyNames())) { - System.err.println(m.displayName() +": P" + (i/2+1) + System.err.println("P" + (i/2+1) + " Reloaded string property names differ from original"); System.err.println("\toriginal: " + pps[i].stringPropertyNames()); System.err.println("\treloaded: " + pps[i+1].stringPropertyNames()); - throw new RuntimeException(m.displayName() +": P" + (i/2+1) + throw new RuntimeException("P" + (i/2+1) + " Reloaded string property names differ from original"); } } diff -r dca843327b90 -r 97e9abb0864b jdk/test/java/util/Properties/MyXmlPropertiesProvider.java --- a/jdk/test/java/util/Properties/MyXmlPropertiesProvider.java Thu May 15 11:35:26 2014 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2012, 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. - */ - -import java.util.*; -import java.io.*; - -public class MyXmlPropertiesProvider - extends sun.util.spi.XmlPropertiesProvider -{ - private static int createCount; - private static int loadCount; - private static int storeCount; - - static int createCount() { return createCount; } - static int loadCount() { return loadCount; } - static int storeCount() { return storeCount; } - - public MyXmlPropertiesProvider() { - createCount++; - } - - @Override - public void load(Properties props, InputStream in) - throws IOException, InvalidPropertiesFormatException - { - loadCount++; - } - - @Override - public void store(Properties props, OutputStream out, - String comment, String encoding) - throws IOException - { - storeCount++; - } -} diff -r dca843327b90 -r 97e9abb0864b jdk/test/javax/management/monitor/StartStopTest.java --- a/jdk/test/javax/management/monitor/StartStopTest.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/javax/management/monitor/StartStopTest.java Fri May 16 02:13:12 2014 -0700 @@ -28,7 +28,7 @@ * monitors are started and stopped in a loop. * @author Luis-Miguel Alventosa * @library /lib/testlibrary - * @run build jdk.testlibrary.Utils + * @build jdk.testlibrary.* * @run clean StartStopTest * @run build StartStopTest * @run main/othervm/timeout=300 StartStopTest 1 diff -r dca843327b90 -r 97e9abb0864b jdk/test/jdk/nio/zipfs/Basic.java --- a/jdk/test/jdk/nio/zipfs/Basic.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/jdk/nio/zipfs/Basic.java Fri May 16 02:13:12 2014 -0700 @@ -31,8 +31,11 @@ /** * * @test - * @bug 8038500 + * @bug 8038500 8040059 * @summary Basic test for zip provider + * + * @run main Basic + * @run main/othervm/policy=test.policy Basic */ public class Basic { diff -r dca843327b90 -r 97e9abb0864b jdk/test/jdk/nio/zipfs/PathOps.java --- a/jdk/test/jdk/nio/zipfs/PathOps.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/jdk/nio/zipfs/PathOps.java Fri May 16 02:13:12 2014 -0700 @@ -29,8 +29,11 @@ /** * * @test - * @bug 8038500 + * @bug 8038500 8040059 * @summary Tests path operations for zip provider. + * + * @run main PathOps + * @run main/othervm/policy=test.policy.readonly PathOps */ public class PathOps { diff -r dca843327b90 -r 97e9abb0864b jdk/test/jdk/nio/zipfs/ZFSTests.java --- a/jdk/test/jdk/nio/zipfs/ZFSTests.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/jdk/nio/zipfs/ZFSTests.java Fri May 16 02:13:12 2014 -0700 @@ -22,8 +22,11 @@ */ /* @test - @bug 7156873 - @summary ZipFileSystem regression tests + * @bug 7156873 8040059 + * @summary ZipFileSystem regression tests + * + * @run main ZFSTests + * @run main/othervm/policy=test.policy ZFSTests */ diff -r dca843327b90 -r 97e9abb0864b jdk/test/jdk/nio/zipfs/ZipFSTester.java --- a/jdk/test/jdk/nio/zipfs/ZipFSTester.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/jdk/nio/zipfs/ZipFSTester.java Fri May 16 02:13:12 2014 -0700 @@ -40,8 +40,10 @@ * * @test * @bug 6990846 7009092 7009085 7015391 7014948 7005986 7017840 7007596 - * 7157656 8002390 7012868 7012856 8015728 8038500 + * 7157656 8002390 7012868 7012856 8015728 8038500 8040059 * @summary Test Zip filesystem provider + * @run main ZipFSTester + * @run main/othervm/policy=test.policy ZipFSTester */ public class ZipFSTester { diff -r dca843327b90 -r 97e9abb0864b jdk/test/jdk/nio/zipfs/test.policy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/jdk/nio/zipfs/test.policy Fri May 16 02:13:12 2014 -0700 @@ -0,0 +1,16 @@ +grant codeBase "file:${java.home}/lib/ext/zipfs.jar" { + permission java.io.FilePermission "<>", "read,write"; + permission java.lang.RuntimePermission "fileSystemProvider"; + permission java.util.PropertyPermission "*", "read"; +}; + +grant codeBase "file:${java.home}/lib/ext/sunpkcs11.jar" { + permission java.lang.RuntimePermission "accessClassInPackage.sun.security.*"; +}; + +grant { + permission java.io.FilePermission "<>","read,write,delete"; + permission java.util.PropertyPermission "test.jdk","read"; + permission java.util.PropertyPermission "test.src","read"; + permission java.util.PropertyPermission "user.dir","read"; +}; diff -r dca843327b90 -r 97e9abb0864b jdk/test/jdk/nio/zipfs/test.policy.readonly --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/jdk/nio/zipfs/test.policy.readonly Fri May 16 02:13:12 2014 -0700 @@ -0,0 +1,12 @@ +grant codeBase "file:${java.home}/lib/ext/zipfs.jar" { + permission java.io.FilePermission "<>", "read,write"; + permission java.lang.RuntimePermission "fileSystemProvider"; + permission java.util.PropertyPermission "*", "read"; +}; + +grant { + permission java.io.FilePermission "<>","read"; + permission java.util.PropertyPermission "test.jdk","read"; + permission java.util.PropertyPermission "test.src","read"; + permission java.util.PropertyPermission "user.dir","read"; +}; diff -r dca843327b90 -r 97e9abb0864b jdk/test/lib/security/java.policy/Ext_AllPolicy.java --- a/jdk/test/lib/security/java.policy/Ext_AllPolicy.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/lib/security/java.policy/Ext_AllPolicy.java Fri May 16 02:13:12 2014 -0700 @@ -30,12 +30,24 @@ import java.security.*; public class Ext_AllPolicy { - public static void main (String[] args) { - FilePermission mine = new FilePermission("/tmp/bar", "read"); - SecurityManager sm = System.getSecurityManager(); + public static void main (String[] args) { + boolean allPerms = args.length == 1 && args[0].equals("AllPermission"); + FilePermission mine = new FilePermission("/tmp/bar", "read"); + SecurityManager sm = System.getSecurityManager(); - if (sm != null) { - sm.checkPermission(mine); + if (sm != null) { + try { + sm.checkPermission(mine); + if (!allPerms) { + // Default has no privilege. + throw new RuntimeException(mine + " expected to deny access"); } + } catch (AccessControlException e) { + if (allPerms) { + // expected all permissions granted + throw e; + } + } } + } } diff -r dca843327b90 -r 97e9abb0864b jdk/test/lib/security/java.policy/Ext_AllPolicy.sh --- a/jdk/test/lib/security/java.policy/Ext_AllPolicy.sh Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/lib/security/java.policy/Ext_AllPolicy.sh Fri May 16 02:13:12 2014 -0700 @@ -22,7 +22,7 @@ # # @test -# @bug 4215035 +# @bug 4215035 8040059 # @summary standard extensions path is hard-coded in default system policy file # # @build Ext_AllPolicy @@ -81,6 +81,9 @@ rm Ext_AllPolicy.class ${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} \ - -Djava.security.manager -Djava.ext.dirs="${TESTCLASSES}" Ext_AllPolicy + -Djava.security.manager -Djava.ext.dirs="${TESTCLASSES}" Ext_AllPolicy || exit 10 +${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} \ + -Djava.security.policy=${TESTSRC}${FS}test.policy \ + -Djava.security.manager -Djava.ext.dirs="${TESTCLASSES}" Ext_AllPolicy AllPermission exit $? diff -r dca843327b90 -r 97e9abb0864b jdk/test/lib/security/java.policy/test.policy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/lib/security/java.policy/test.policy Fri May 16 02:13:12 2014 -0700 @@ -0,0 +1,3 @@ +grant codeBase "file:${{java.ext.dirs}}/*" { + permission java.security.AllPermission; +}; diff -r dca843327b90 -r 97e9abb0864b jdk/test/sun/management/jmxremote/bootstrap/CustomLauncherTest.java --- a/jdk/test/sun/management/jmxremote/bootstrap/CustomLauncherTest.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/sun/management/jmxremote/bootstrap/CustomLauncherTest.java Fri May 16 02:13:12 2014 -0700 @@ -41,7 +41,7 @@ * @test * @bug 6434402 8004926 * @library /lib/testlibrary - * @build jdk.testlibrary.ProcessTools + * @build jdk.testlibrary.* * @build TestManager TestApplication CustomLauncherTest * @run main/othervm CustomLauncherTest * @author Jaroslav Bachorik diff -r dca843327b90 -r 97e9abb0864b jdk/test/sun/management/jmxremote/startstop/JMXStartStopTest.java --- a/jdk/test/sun/management/jmxremote/startstop/JMXStartStopTest.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/sun/management/jmxremote/startstop/JMXStartStopTest.java Fri May 16 02:13:12 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2014, 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 @@ -616,7 +616,7 @@ final boolean[] checks = new boolean[3]; jcmd( line -> { - if (line.equals("java.lang.RuntimeException: Invalid agent state")) { + if (line.contains("java.lang.RuntimeException: Invalid agent state")) { checks[0] = true; } }, @@ -627,7 +627,7 @@ jcmd( line -> { - if (line.equals("java.lang.RuntimeException: Invalid agent state")) { + if (line.contains("java.lang.RuntimeException: Invalid agent state")) { checks[1] = true; } }, diff -r dca843327b90 -r 97e9abb0864b jdk/test/sun/reflect/AnonymousNewInstance/ManyNewInstanceAnonTest.java --- a/jdk/test/sun/reflect/AnonymousNewInstance/ManyNewInstanceAnonTest.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/sun/reflect/AnonymousNewInstance/ManyNewInstanceAnonTest.java Fri May 16 02:13:12 2014 -0700 @@ -28,6 +28,7 @@ * @author Robert Field * @library /lib/testlibrary * @compile -XDignore.symbol.file ManyNewInstanceAnonTest.java + * @build jdk.testlibrary.* * @run main ClassFileInstaller ManyNewInstanceAnonTest * @run main/othervm -Xbootclasspath/a:. -Xverify:all ManyNewInstanceAnonTest * @run main/othervm -Xbootclasspath/a:. -Xverify:all -Dsun.reflection.noInflation=true ManyNewInstanceAnonTest diff -r dca843327b90 -r 97e9abb0864b jdk/test/sun/security/validator/ConstructorTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/validator/ConstructorTest.java Fri May 16 02:13:12 2014 -0700 @@ -0,0 +1,467 @@ +/* + * Copyright (c) 2014, 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 6996377 + * @summary shrink duplicate code in the constructor of PKIXValidator + */ + +import java.io.ByteArrayInputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.security.KeyStore; +import java.security.cert.Certificate; +import java.security.cert.CertificateFactory; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.security.cert.TrustAnchor; +import java.security.cert.PKIXBuilderParameters; +import java.security.cert.X509CertSelector; +import javax.security.auth.x500.X500Principal; +import java.util.Date; +import java.util.List; +import java.util.Arrays; +import java.util.ArrayList; +import java.util.Set; +import java.util.HashSet; +import java.util.Enumeration; +import java.util.Collection; +import sun.security.validator.Validator; +import sun.security.validator.PKIXValidator; + +public class ConstructorTest { + + // COMMON-OPTS: All certs created with the following common options: + // -keystore -storepass -keypass -keyalg rsa + // -keysize 2048 -validity 720 -sigalg sha256withrsa + + // keytool -alias root -ext bc:critical=ca:true + // -ext ku:critical=keyCertSign,cRLSign + private static final String ROOT = + "-----BEGIN CERTIFICATE-----\n" + + "MIIC3jCCAcagAwIBAgIEInKZgjANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDEwRS\n" + + "b290MB4XDTE0MDUwODE4MjcwOFoXDTE2MDQyNzE4MjcwOFowDzENMAsGA1UEAxME\n" + + "Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAIzgMkrCZD7PuoFb\n" + + "fmtAd2+Td6nA9sgBd8Z3NjQgP6nwyn79svaVV9XAVLTrLian72wV/1Kbq/6HUXQQ\n" + + "AqyUAvobDwXeIAmE4+D7qcZxiEJgVNr2Ddv1bbS8Y0/Ta72qzjFiEPMO3Y2GP52C\n" + + "ssKQpsdNttHfM9c73cKUspobc3p51k2lkynheshCSNOWxR/Rvsl/gcbEFg8vIEHV\n" + + "oJPwKSrABc4sWiiXQj0yLVW+DKVEFuWNqqitcikQLZFpgOYv8P1SjhJFkcA9s0oN\n" + + "sbvKO2VF141h161i0AFddTsGE85A3j42qEdwQ0cs9gyAoeU865TFvxCuhSqSgJ3a\n" + + "Mdgn7ssCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw\n" + + "HQYDVR0OBBYEFFQY2UJynMSoS7Tf/+DvNPp/ZxXfMA0GCSqGSIb3DQEBCwUAA4IB\n" + + "AQAeXRQnEhxNl8lrcGY1U1LbIdrNMlGnc0JbgwiVYwRlE3+u4GvDae1VueXyY6nw\n" + + "8m63H3Q/Do9/72aw2Q0FSwvDg+k5ssj+gXQ3Gyx8xsVPJEG0TizOSwnWiZtWu65w\n" + + "14p5TB8P8wdPEs6sfE9oheiKhDRjBZHIfqMd4DaBiM9N9qHpSwTJc02BB2KnGwga\n" + + "yiYNJbce7GFKn/exryj972n/Nl4xy1WdZrRwTBbV21/GINw+xdXn1+FD95EGqGlr\n" + + "Sb4+G7U7Ydo+xFpVQnrqxZe98pI5W2bG7VSKvIzcPxfL5/tjwtNaqhiD7wIBNHVx\n" + + "ZeJevm41O9qFQEdXNyVGpB+u\n" + + "-----END CERTIFICATE-----\n"; + + // keytool -alias int -ext bc:critical=ca:true + // -ext ku:critical=keyCertSign,cRLSign + private static final String INTERMED = + "-----BEGIN CERTIFICATE-----\n" + + "MIIC/jCCAeagAwIBAgIEDkzdijANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDEwRS\n" + + "b290MB4XDTE0MDUwODE4MjcyNFoXDTE2MDQyNzE4MjcyNFowDjEMMAoGA1UEAxMD\n" + + "SW50MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwslILfgvXPxdRgu8\n" + + "4SnrZJsSzb/XvYwYGAKTSvsDaI1nXypBbwDGz87+YPpZSJcExcS8I8GBKqN6kXIh\n" + + "YvJ9yMGJX8wdwoMQpw2ZfJpzfw9Nqtlhv8/q5kPlaDghJ+nGNwy5lyYNOzDMVht0\n" + + "1XQG65C+l7m52lDJ478tGRZEFkx0aTh2QUBI59iNji6r2Buyeiijhg4YBrvIlYLK\n" + + "OAHxru4N/Y2Cq3ECUUvm7Lf8tM8yrINS8FLT+pmNcLj8AKkGW8cFFaiGPMyon0/m\n" + + "4iJB7ZaeG+BGm9TvBv93cphAsM2tY+S+P/dLfI01ltucibPkSglmquUSA0xW9ilv\n" + + "PEYWqQIDAQABo2MwYTAfBgNVHSMEGDAWgBRUGNlCcpzEqEu03//g7zT6f2cV3zAP\n" + + "BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU1jeG+pzz\n" + + "WnHa+0PfJNw9JTrZaoMwDQYJKoZIhvcNAQELBQADggEBABRshh0oJ8Dq87Tgcf3w\n" + + "ERVZ/uDWKj76UXWQ3uvKMhnNxKN/vs1rCfhovkptn39CXndOb8m6UkvmMjDtJsiO\n" + + "Oq/DiR6NngCy5yJ5hMuBsdQ2QVvdiqG4Sb+vOaQ2TNQNEHEWC7sB0ztImjxlqDtq\n" + + "yvof5pd8pHeZJNyDo5cHw1cpoUI9GLz6CK5i0wUlBvsYERIX5aRqxqdtKgBefHFN\n" + + "S2ChTRB16A5C1h+Lu79KnoeS33lZt1VeebIA7hvaHkqhGGpncutEYgT8QNFFpjM8\n" + + "yFCjZG+ZuUD/s5hd/xHnPdJzR+RWVKMjjVCTpnni3+NHXo2fh0G8YFhdHQ2F/YFI\n" + + "ig0=\n" + + "-----END CERTIFICATE-----\n"; + + // keytool -alias user -ext ku:c=digitalSignature + // -ext eku=clientAuth + private static final String USER = + "-----BEGIN CERTIFICATE-----\n" + + "MIIDAjCCAeqgAwIBAgIEKgsK2DANBgkqhkiG9w0BAQsFADAOMQwwCgYDVQQDEwNJ\n" + + "bnQwHhcNMTQwNTA4MTgyNzI3WhcNMTYwNDI3MTgyNzI3WjAPMQ0wCwYDVQQDEwRV\n" + + "c2VyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArBFLJZ1liQAEkEyJ\n" + + "9vAiViRXtDDV+lc62DR4DBj1/Vsw9djVOxmwDKM0+jj83F4Qn9vulr+xp2aZzx4Y\n" + + "GiJgbtoxPvZmwNv4MPCNX+fgl/+C0nFKOoSYfHb/tK0Jj6u8HOmQqkbSmGJd/yRL\n" + + "qavapRvhS94tFhiNK7wwLAK9AZ+r7cTEBtUSqfaS7mY7tUsERcZs6z3+rmsuxWw6\n" + + "/xnNTIVWjdUSbEnjZCdkfZ0cjFONotL6aKoa6YXzohzgA5c3SJZqscEaz4yPkMvl\n" + + "7bGy7cn6xjfbb5V3oNqo1dtF3Jm8zp0q8Zgvc47l+DAoGIHSpDhPGX+qSWOTwRla\n" + + "QT6NDwIDAQABo2cwZTAfBgNVHSMEGDAWgBTWN4b6nPNacdr7Q98k3D0lOtlqgzAT\n" + + "BgNVHSUEDDAKBggrBgEFBQcDAjAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0OBBYEFE/p\n" + + "UEn8+capIj2+V+7GoxUhdVnWMA0GCSqGSIb3DQEBCwUAA4IBAQBkEyFJ/1CCMoU3\n" + + "C1sYoq4Wt36z3e4Z2rMjfpFXcagqOQaq+hq+/eG8gDE50tOp30nZF7BxSv0RKnxa\n" + + "KSkrKcupwgPJOZZWVR6ycV3xWm4QleLuDJh3NdK0o8vvIwLQP47fXURzEXTpGodl\n" + + "+hGx7jcghsOKftBDCaleywam4jcZ5YPfp5Ayev0pK/Euf0kZgZAhRM33uJVVfEns\n" + + "UotoGK7SL6hZMCrreVlXygof19p531Ps5xMqu0y2u2xztjVQJ+gPU5zcYbjByUl+\n" + + "pY+wDPb8XU1EoLl7J5UyayXlk0c3KG/5f+CrVi2HtRfCcKLBf8/MH6OFIpX9O77p\n" + + "Qq3r+W/l\n" + + "-----END CERTIFICATE-----\n"; + + // keytool -alias red-ta-key -ext bc:critical=ca:true + // -ext ku:critical=keyCertSign,cRLSign + private static final String RED_ROOT = + "-----BEGIN CERTIFICATE-----\n" + + "MIIC5jCCAc6gAwIBAgIEWK8vRTANBgkqhkiG9w0BAQsFADATMREwDwYDVQQDEwhS\n" + + "ZWQgUm9vdDAeFw0xNDA1MDgxODI3MTNaFw0xNjA0MjcxODI3MTNaMBMxETAPBgNV\n" + + "BAMTCFJlZCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjpMy\n" + + "Qh5yq4R3DrwsWaBZoCR+gda4a1PjGpjlQW/Au6R3hwUDAunkQIz/sX1CnLLJ7cks\n" + + "4m6ba2wjYE3NbVP9D3HozLAv2ErB75/F3evRu5UvzkGLkamyHJBY0xEyFyOaD4MC\n" + + "hhlo8dDEY++YL8Od+m4i56fYXQlTT94u20I+6hZxeIpJxFSHyouZg06jb+URibi0\n" + + "e7I3JApWghgcDfgEXZWlCmB8IswYPdd+XWRFDNc4rSWueRP+SeQOFx9x1jM6+skP\n" + + "DGLpuaChO7cqsUxYnsEx9zhdxQ+v4V3vOye/GigpRaO7WvgPB4g5sYhFlwZ/tp+A\n" + + "KQebXExXCGOOQUoFEwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB\n" + + "/wQEAwIBBjAdBgNVHQ4EFgQUYL8o0Ku7Irg33xzCgA4q1PFz6IQwDQYJKoZIhvcN\n" + + "AQELBQADggEBAGSVpI7Qmb0oupBCs+tXlJ4/+TX6eBGcHydaT/2hlgEEdT7S7y6O\n" + + "iMC8C8wlEKTLZ6MJSxjeFTIO62OkTjCsGtk+BHTaE81QL5rxjGFkvtuQrwck8gHg\n" + + "fAb7daF9ZVLz6B8+cX047xZHx9ZGM/ID+GJg/3fk17WA2BhW1Xkzskby5AWpBDol\n" + + "i6+zEod0uZhpHiWwVSfHlEA+rnkhW632oVaVNNDkeUhsCxrU0k7nlQx8bG5bmUso\n" + + "1MaPP1kRKvcy0UGx6q3s8pcrKw0X1S66n7HV+WbQebg83U0MVE1r/J0Cfi0jMS/x\n" + + "ZUVXs7rjCGFhwfiT/kybKD8adrGHSmLhKs0=\n" + + "-----END CERTIFICATE-----\n"; + + // keytool -alias orange-ta-key -ext bc:critical=ca:true + // -ext ku:critical=keyCertSign,cRLSign + private static final String ORANGE_ROOT = + "-----BEGIN CERTIFICATE-----\n" + + "MIIC7DCCAdSgAwIBAgIEQPSszTANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDEwtP\n" + + "cmFuZ2UgUm9vdDAeFw0xNDA1MDgxODI3MTRaFw0xNjA0MjcxODI3MTRaMBYxFDAS\n" + + "BgNVBAMTC09yYW5nZSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC\n" + + "AQEAknfh3lKWVQxl2w/eRSza6+0+zeTtMkQFCEFpGJsisDK5XOU1HcJMP4QUteWM\n" + + "tg1SGO9bjpiKqJ7JVRnzOC3q6erBj2LmwpWW7p12tg6ENOQfsy6tRZLlQWMFGBkT\n" + + "Tatsg9HwKpr6itvk2wERh18AcIqSjtN94kGTljP1qf9gMd31G5d/HyG6EwMZukJm\n" + + "4/EFpzh3fVwr/EN1WzrYlsBOA+3Tru/k0p8wP6Bomrx1vAEUqRWSLWxsa7we76jL\n" + + "H/kMkyWENyjd/A2c5CwscoG+KSx9cifYnSqrUAmpY88KKuZG2Y1+9ablUEwXW4Gh\n" + + "RYLCGIgxp6NrtFG/eUcDBgtEwQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G\n" + + "A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUPvRE9j3GPGcc3dNGrVrQoWDb9RMwDQYJ\n" + + "KoZIhvcNAQELBQADggEBADjPTuHXMbXc2Kn+i+dnBiQCWcjzaox4KWV4MNO7vkvi\n" + + "ADBk5/vVM+HTzwL+gZNwE96/agcOzwHZ8/Dz4aA3zzmAmQB4bt+pUa0iyGvX6+F5\n" + + "IH1kd4kBnSBMc76fRcEJnebhrXFgTlps5VELMVcEOn3Q4nt+gVfXmPStTkFjM1/4\n" + + "fQggsScLpE2TVkk3oS52NIzG/vyBIt3W0gX20hlQobA2vziJDx8xy/+qe5igyp5F\n" + + "WScwSQE8qeuoDJYJRxpxZ7kq8NiHxfGPw5Hjn518zBz2VKJOsJYmckAMFIdS//kM\n" + + "NUysH6gFksW/PHy75QkbtD4OFtb2zp01ERuf5OoJavs=\n" + + "-----END CERTIFICATE-----\n"; + + // keytool -alias yellow-ta-key -ext bc:critical=ca:true + // -ext ku:critical=keyCertSign,cRLSign + private static final String YELLOW_ROOT = + "-----BEGIN CERTIFICATE-----\n" + + "MIIC7DCCAdSgAwIBAgIEfLA7azANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDEwtZ\n" + + "ZWxsb3cgUm9vdDAeFw0xNDA1MDgxODI3MTZaFw0xNjA0MjcxODI3MTZaMBYxFDAS\n" + + "BgNVBAMTC1llbGxvdyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC\n" + + "AQEAgLMOpzIR8LyALox2AvItM42VjFDp1EyHU0faJZCpwVbQPJ2f+8Gr7XuTv1uZ\n" + + "Ixe6JjcyGNHZG0NuFmMFbK2Y7cg3PdQBjcm+x68iSWzyEUuhytSKSLUt6i+xAg+9\n" + + "h9UGXlBNarVjWq63tPt8HK/YHxt9Ber0iriF3SEUsgMOzRrLw1mw35SmgidRp19y\n" + + "yNXlgQfylEAVtYD9IYhxTm/j9NL3rTgqXiKjvNAVjAUrD2I2nK5WQqO2hmQr9x/9\n" + + "EqgIK03dw0ps7/XL+gpd+zwGZqDr9pbFnko4badiE4AJqPlm6u/Tdc0dSkLu/oXq\n" + + "Ex4iqtM0TP5+oeDXGZv6EprzKQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G\n" + + "A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUp0/g/PqT9jDVGKSsBh997Kg9KBIwDQYJ\n" + + "KoZIhvcNAQELBQADggEBAG4vr5UkWUEA9qNU6wBNg5yySS6KhNVyBDMReyX6qsz6\n" + + "yUIeGU/UC8LwdB+Tl3S+FZyUlsx+gwh1n0ei7eOV58cCeWmZ3sUWvLTwsY9iBNyt\n" + + "HkItOCDO+JEjgo7OhEBlzYkD4MkwAjaYnT4tU41BSnlTR4+jK77f/b1oMVzDv2tL\n" + + "+JAiem04TEoGO97uZ94l6gKwwGO35uejGEUPhFPLtxo+yR2QQqX0S8smG88pCQ82\n" + + "6XscdvRTjSfkuI3LiqNORS0fGZ3ykxDCkDLZZ1mSg1h2/3xOUEbFQ0phhMrnr2Rl\n" + + "mWNGYCam2jns4qmMnbzPIwQduvRkz1O1lusbLNFpcdY=\n" + + "-----END CERTIFICATE-----\n"; + + // keytool -alias green-ta-key -ext bc:critical=ca:true + // -ext ku:critical=keyCertSign,cRLSign + private static final String GREEN_ROOT = + "-----BEGIN CERTIFICATE-----\n" + + "MIIC6jCCAdKgAwIBAgIENWwt8TANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDEwpH\n" + + "cmVlbiBSb290MB4XDTE0MDUwODE4MjcxOFoXDTE2MDQyNzE4MjcxOFowFTETMBEG\n" + + "A1UEAxMKR3JlZW4gUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\n" + + "AKHvh3FRJghpNtLqIk5UDSGkcA3rtEygRsFa51ucwNQ1x4SXOVnsNHZZW66RuKOn\n" + + "6wjS8+xctNnMIy1XNXa2nlAswQVe75xX0jfGMB4w0MlaqLK9HrU479WrWmrBjz/P\n" + + "vvHY8x1CIfTMjOtLO9yxbYQrXsEz6JKxAz6/+ErbkvUjBynezZdJNXgURVz5HmFx\n" + + "e/SUbSALX+Kx+/+hXggaQdwlrpoDl/Nqm6S1iR5xtdZB1CEauIwFDSWOG1TjR1Hp\n" + + "8OSGb0AhwwM5FzIxevwgKke6WHFKf5p4lcpiQZqmhgqyFbARUfUjYX3WzQTmrJ/q\n" + + "87OMIJasvmkNEYkNbrSmI9kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV\n" + + "HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHG7s0KrfUsnl/3/UGYbCrdXTZtcMA0GCSqG\n" + + "SIb3DQEBCwUAA4IBAQBUe18kbDHeqsxM17ahr30hvjdxMkYLkLcGoSOlSI8sFBu6\n" + + "jG4JZvvFXw2ZqMQTLSALvsSZ9wkfS8tDCNEHRvCB6aqW4tjp9ddkfe+56WINzTv6\n" + + "Ibqwg2JGsOzWttpUA5OPLfODbMqOYzT101toF3sKteX0yyiF/SfMTXR5Jv0uo/dp\n" + + "sFeJtWFfhy/Q0jiEAz945BBoSHCIF7Fs4vcls7gNJxfap66W8lamjzFyMDsnlz+b\n" + + "sSLWZmvwM+R/RfL1Q3LPCcZWLiP9WSAO4hUoju1E9WeWHHjlPwJJ/iRECL9cnHRt\n" + + "Z7/kOlNLGxKvpEbY4xqH0zE07UWPCCBlemk/6jlO\n" + + "-----END CERTIFICATE-----\n"; + + // keytool -alias blue-ta-key -ext bc:critical=ca:true + // -ext ku:critical=keyCertSign,cRLSign + private static final String BLUE_ROOT = + "-----BEGIN CERTIFICATE-----\n" + + "MIIC6DCCAdCgAwIBAgIEX3XC9zANBgkqhkiG9w0BAQsFADAUMRIwEAYDVQQDEwlC\n" + + "bHVlIFJvb3QwHhcNMTQwNTA4MTgyNzIwWhcNMTYwNDI3MTgyNzIwWjAUMRIwEAYD\n" + + "VQQDEwlCbHVlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCY\n" + + "pc4r8mfgGGeiYlvHSrEIlp6djHS489P7eqoQRqmS5U/I0lLGNu7QZsY240a9a84S\n" + + "2t6VpZID5juK8AF2v4psShsqgfj+RjVev8FJE/D5j8B4QZ+HmbLJIl80f+YOPaLG\n" + + "HX1eNktLx3S2gkIKHVdn7q3o4DdXBO+YdaBA56lL4l+dWFtto65+5Sjy4yfyvWJz\n" + + "MylXjP/wiC0T3C0NcQX3AIu2tjY2u9lrVbem2rIi0kPFIoYvstKiqXMc/sRf2CfO\n" + + "it5k629HsbvdACVRZFxU3Lz25oP4HGz1kq1cpiIS+W3gQQmCKu9XqzpNRThG0SEL\n" + + "jaH9E4pZDnZiRCr+Mxm1AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P\n" + + "AQH/BAQDAgEGMB0GA1UdDgQWBBS5ebHO4iamr3n0+KtxJYAitg9QcTANBgkqhkiG\n" + + "9w0BAQsFAAOCAQEAGjh/UzERw+skEK4zM1zfL1RsZnUlFu7mTbOBGgccewHWC+MM\n" + + "AQbLo0m4NTEbRoW6fFcAESgE61ZZBLkmhcjXBunNJq6O1hMDpppYA806eG6GcZmK\n" + + "rLOZljxx4D1YC17vMEVsMF9XgIj5dLWceJjotZzNxe+miwXLEkxaGIMe/n2VtCoR\n" + + "BSrGrAeCsFZ7G2NRWUxUEVJrhLnVZJDt6fHd43BCVnV191PyF5TuB08nijyCoJoS\n" + + "/WJkYHxx3vUUfDE5E4UE+iY80BHnAPxiNKwO3XsWjeqbJ8PS+5AvShdG5QdFBhKe\n" + + "/tJTZLs0UEubKdaWd5ZgsXP3913bJm/mBo+eJA==\n" + + "-----END CERTIFICATE-----\n"; + + // keytool -alias indigo-ta-key -ext bc:critical=ca:true + // -ext ku:critical=keyCertSign,cRLSign + private static final String INDIGO_ROOT = + "-----BEGIN CERTIFICATE-----\n" + + "MIIC7DCCAdSgAwIBAgIESdUmczANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDEwtJ\n" + + "bmRpZ28gUm9vdDAeFw0xNDA1MDgxODI3MjFaFw0xNjA0MjcxODI3MjFaMBYxFDAS\n" + + "BgNVBAMTC0luZGlnbyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC\n" + + "AQEA2opDa3wDxQrX6GjffbDGtXyvKw0/vhZTeus4cxdZIYF3CWkGbeurDIhPUKRO\n" + + "Azact0SECJuMXVxkB5vQKBmHRByNh8ugFfzXWi7/rteXTNjLNKnzVr8plbMvzwM7\n" + + "zjIgm0mTRbwv6gZmUbgfmO9FCB8zlV4hYbYbFTJn7GlVPpqZkZNNMTyJkOPxMzXD\n" + + "yaToxyR0uY3cMv9pmks3GxU2XoGTFuqptbL9XFSpwrm5BRfWuJDP1t8moLHQZ5iu\n" + + "tkCz6MVYcrhTlV/UY0PSGcmUvAu83sNBfIGjme0RIiERy02gLJnSZ/M9r1ukCUJE\n" + + "Z6At+9TsNCYNPgW5vcjNLO63/wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G\n" + + "A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU8eJ+kMmanqF+IcAQTjxSMv+VR7kwDQYJ\n" + + "KoZIhvcNAQELBQADggEBAGRB4C5qYXXJJnEGzJZf8S974SaeLmEvHlmaQPOuCxME\n" + + "tCeBoWQqD9qTDVy39izzjA4uE/fCMVCkyr1QL+588dtMI8jJfbzx+TxnlDWlJcMM\n" + + "5J8EJPNEy7eR6qqpFncvjmbXzf16XfzL9qSXwHYCvpo25nEEH801y2njJE2gGzZT\n" + + "raYRFuwzsZLiSV5TyO5MbRXiZLebDXfE/wXukor87pjGpx1/kevjH/g66OpaIBzu\n" + + "IfLePEOekTKXHF1zL89uYHwpUVCzfhO5hNQlSsTCuBkBifSTYm4ixoATi/C2kqze\n" + + "WHUK179u1+7v6xRONLQxe1JDftdlHHVg7DSeTY59euo=\n" + + "-----END CERTIFICATE-----\n"; + + // keytool -alias violet-ta-key -ext bc:critical=ca:true + // -ext ku:critical=keyCertSign,cRLSign + private static final String VIOLET_ROOT = + "-----BEGIN CERTIFICATE-----\n" + + "MIIC7DCCAdSgAwIBAgIEXwgmLDANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDEwtW\n" + + "aW9sZXQgUm9vdDAeFw0xNDA1MDgxODI3MjNaFw0xNjA0MjcxODI3MjNaMBYxFDAS\n" + + "BgNVBAMTC1Zpb2xldCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC\n" + + "AQEAvElr11MoHUNfnx6nBy4NSXFFzA68g57ohTt+sspEn3wzuPErugMypReHLhtH\n" + + "CTrs45T0KU8P4Gi5QHnsBs8yC3QCHNPugo2A4zP+ciTqp+1gRNxQ9wzKSzCoseJg\n" + + "RMQflGFzuEe7gWwYfrsDfD1sJCubfBtBUFCSYf1ZSZbdEMrc3RPtC35Ge+3XRxFZ\n" + + "KdzH8l7gQTtgAmRQmK+i4jwzSHV/Iu2yiRdhjqIZUezf3pYFfJlmfAY5ruQBKkc+\n" + + "KRgdmKanpLbmAo/+3q6snt8V09CoQ+6Cz+P9P0yOxiiwr/6jg9WtHA3ujvtf3dGj\n" + + "EeB8SmzXHFZErQIn+QbrJ3/izwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G\n" + + "A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUlxlHI8JTrX86r4ezgDLICo6rApowDQYJ\n" + + "KoZIhvcNAQELBQADggEBALnfWZx6LC9vDMI8vBH/vbyk2ZQtiQFRt3kbwKtlrw65\n" + + "/bqeGXcQ1Lh9gDzp+uGYSfuDNvtJO6xmfny0W5j5WQVJxs+iWyoJfYxeG0kBZut+\n" + + "hbxJPlehBwhveuznZbeTN3RXeBi8MSxnBD/WC1e2rnfnrxoLfYZ1BSUP8LaIzC32\n" + + "vd6WCgnJRXputlGvnOoAT1WduWonhd7lCoqbtZksw7o0smuAn2mSnod8j948rzzt\n" + + "uDQVao/3tCyoX4NSom2hWooPltk5FTdF9cZKfbaU5TPV+U30RN7/UWY/dCvL1fMq\n" + + "1kvtJbkh+UMHvszHOxlgjk+3J76Wx0PFjNaIfbj2bmk=\n" + + "-----END CERTIFICATE-----\n"; + + public static final String[] rootArrayPEM = { RED_ROOT, ORANGE_ROOT, + YELLOW_ROOT, GREEN_ROOT, BLUE_ROOT, INDIGO_ROOT, VIOLET_ROOT, ROOT }; + + /** + * @param args {cacerts keystore, cert chain} + */ + public static void main(String[] args) throws Exception { + Set trustedCertSet = new HashSet<>(); + CertificateFactory cf = CertificateFactory.getInstance("X.509"); + + for (String pemCert : rootArrayPEM) { + trustedCertSet.add(makeCertFromPEM(pemCert)); + } + + testCtorByCollection(trustedCertSet); + + testCtorByPKIXBuilderParams(trustedCertSet); + } + + public static X509Certificate makeCertFromPEM(String pemCert) + throws CertificateException { + CertificateFactory cf = CertificateFactory.getInstance("X.509"); + ByteArrayInputStream is = new ByteArrayInputStream(pemCert.getBytes()); + + return ((X509Certificate)cf.generateCertificate(is)); + } + + public static void showValidatedChain(Validator v, X509Certificate[] chain, + Set otherCerts) throws Exception { + for (X509Certificate cert : v.validate(chain, otherCerts)) { + System.out.println("\tSubj: " + cert.getSubjectX500Principal() + + " Iss: " + cert.getIssuerX500Principal()); + } + } + + public static Set makeTrustAnchorSet( + Set certSet) throws Exception { + Set anchors = new HashSet<>(); + + for (Certificate cert : certSet) { + anchors.add(new TrustAnchor((X509Certificate)cert, null)); + } + + return anchors; + } + + public static void testCtorByCollection(Set certSet) + throws Exception { + Validator valOK; + Validator valNoGood; + X509Certificate[] chain = new X509Certificate[1]; + Set intermeds = new HashSet<>(); + + // Case 1: Make a PKIXValidator with valid arguments + // Expected result: Well-formed PKIXValidator + System.out.println("Constructor test 1: Valid inputs"); + valOK = Validator.getInstance(Validator.TYPE_PKIX, + Validator.VAR_GENERIC, certSet); + + // Convert our user cert from PEM format, then do the same for + // its intermediate signer and add that as a helper for path building + chain[0] = makeCertFromPEM(USER); + intermeds.add(makeCertFromPEM(INTERMED)); + PKIXBuilderParameters pbParams = ((PKIXValidator)valOK).getParameters(); + pbParams.setDate(new Date(1426399200000L)); // 03-15-2014 6:00:00 GMT + + // See if we can build a trusted path to a root to make sure + // everything still works as expected. + showValidatedChain(valOK, chain, intermeds); + + // Case 2: Make a PKIXValidator with null anchor list. + // Expected result: throw NullPointerException + System.out.println("Constructor test 2: null trustedCerts"); + try { + valNoGood = Validator.getInstance(Validator.TYPE_PKIX, + Validator.VAR_GENERIC, (Collection)null); + // Throw something non Runtime-related to indicate we shouldn't + // have succeeded on construction. + throw new IOException( + "Constructor did not throw NullPointerException"); + } catch (NullPointerException npe) { + System.out.println("\tCaught Exception (" + npe.toString() + + ") [PASS])"); + } + + // Case 3: Try putting a null reference into a populated TA List + // Expected result: throw NullPointerException + System.out.println("Constructor test 3: null in trustedCerts list"); + try { + certSet.add(null); + valNoGood = Validator.getInstance(Validator.TYPE_PKIX, + Validator.VAR_GENERIC, certSet); + // Throw something non Runtime-related to indicate we shouldn't + // have succeeded on construction. + throw new IOException("Constructor did not throw RuntimeException"); + } catch (NullPointerException npe) { + System.out.println("\tCaught Exception (" + npe.toString() + + ") [PASS])"); + } finally { + // Return the certSet list to its original state + certSet.remove(null); + } + + // Case 4: Provide an empty List as the X509Certificate collection + // Expected result: throw RuntimeException + System.out.println("Constructor test 4: empty trustedCerts list"); + try { + valNoGood = Validator.getInstance(Validator.TYPE_PKIX, + Validator.VAR_GENERIC, new ArrayList()); + // Throw something non Runtime-related to indicate we shouldn't + // have succeeded on construction. + throw new IOException("Constructor did not throw RuntimeException"); + } catch (RuntimeException re) { + System.out.println("\tCaught RuntimeException (" + re.toString() + + ") [PASS])"); + } + + // Case 5: Provide an invalid variant + // Expected result: successful construction. + // Note: subsequent calls to validate may throw CertificateException + // if the submitted chain has a length > 1. + System.out.println("Constructor test 5: Unsupported variant"); + valNoGood = Validator.getInstance(Validator.TYPE_PKIX, + "BogusVariant", certSet); + System.out.println("\tSuccessful construction [PASS]"); + + // Case 6: Provide a null variant + // Expected result: throw NullPointerException + System.out.println("Constructor test 6: null variant"); + try { + valNoGood = Validator.getInstance(Validator.TYPE_PKIX, null, + certSet); + // Throw something non Runtime-related to indicate we shouldn't + // have succeeded on construction. + throw new IOException( + "Constructor did not throw NullPointerException"); + } catch (NullPointerException npe) { + System.out.println("\tCaught RuntimeException (" + npe.toString() + + ") [PASS])"); + } + } + + public static void testCtorByPKIXBuilderParams(Set certSet) + throws Exception { + Set taSet = makeTrustAnchorSet(certSet); + Validator valOK; + Validator valNoGood; + X509Certificate[] chain = new X509Certificate[1]; + Set intermeds = new HashSet<>(); + + // Case 7: Make a PKIXValidator with valid arguments + // Expected result: Well-formed PKIXValidator object + System.out.println("Constructor test 7: Valid inputs"); + + // Set up the PKIXBuilderParameters + X509CertSelector sel = new X509CertSelector(); + sel.setSubject("CN=User"); + PKIXBuilderParameters pbParams = new PKIXBuilderParameters(taSet, sel); + pbParams.setRevocationEnabled(false); + pbParams.setDate(new Date(1426399200000L)); // 03-15-2014 6:00:00 GMT + + valOK = Validator.getInstance(Validator.TYPE_PKIX, + Validator.VAR_GENERIC, pbParams); + + // Convert our user cert from PEM format, then do the same for + // its intermediate signer and add that as a helper for path building + chain[0] = makeCertFromPEM(USER); + intermeds.add(makeCertFromPEM(INTERMED)); + + showValidatedChain(valOK, chain, intermeds); + + // Case 8: Make a PKIXValidator but provide a null PKIXBuilderParameters + // Expected result: throw NullPointerException + System.out.println("Constructor test 8: null params"); + try { + valNoGood = Validator.getInstance(Validator.TYPE_PKIX, + Validator.VAR_GENERIC, (PKIXBuilderParameters)null); + // Throw something non Runtime-related to indicate we shouldn't + // have succeeded on construction. + throw new IOException( + "Constructor did not throw NullPointerException"); + } catch (NullPointerException npe) { + System.out.println("\tCaught RuntimeException (" + npe.toString() + + ") [PASS])"); + } + } +} diff -r dca843327b90 -r 97e9abb0864b jdk/test/sun/tools/jcmd/TestJcmdDefaults.java --- a/jdk/test/sun/tools/jcmd/TestJcmdDefaults.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/sun/tools/jcmd/TestJcmdDefaults.java Fri May 16 02:13:12 2014 -0700 @@ -39,6 +39,7 @@ * @test * @bug 7104647 * @library /lib/testlibrary + * @build jdk.testlibrary.* * @run main TestJcmdDefaults */ public class TestJcmdDefaults { diff -r dca843327b90 -r 97e9abb0864b jdk/test/sun/tools/jcmd/TestJcmdSanity.java --- a/jdk/test/sun/tools/jcmd/TestJcmdSanity.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/sun/tools/jcmd/TestJcmdSanity.java Fri May 16 02:13:12 2014 -0700 @@ -40,6 +40,7 @@ * @test * @bug 7104647 7154822 * @library /lib/testlibrary + * @build jdk.testlibrary.* * @run main TestJcmdSanity */ public class TestJcmdSanity { diff -r dca843327b90 -r 97e9abb0864b jdk/test/sun/tools/jmap/BasicJMapTest.java --- a/jdk/test/sun/tools/jmap/BasicJMapTest.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/sun/tools/jmap/BasicJMapTest.java Fri May 16 02:13:12 2014 -0700 @@ -34,6 +34,7 @@ * @bug 6321286 * @summary Unit test for jmap utility * @library /lib/testlibrary + * @build jdk.testlibrary.* * @run main BasicJMapTest */ public class BasicJMapTest { diff -r dca843327b90 -r 97e9abb0864b jdk/test/sun/tools/jstack/BasicJStackTest.java --- a/jdk/test/sun/tools/jstack/BasicJStackTest.java Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/sun/tools/jstack/BasicJStackTest.java Fri May 16 02:13:12 2014 -0700 @@ -32,6 +32,7 @@ * @bug 6260070 * @summary Unit test for jstack utility * @library /lib/testlibrary + * @build jdk.testlibrary.* * @run main BasicJStackTest */ public class BasicJStackTest { diff -r dca843327b90 -r 97e9abb0864b jdk/test/sun/util/calendar/zi/tzdata/VERSION --- a/jdk/test/sun/util/calendar/zi/tzdata/VERSION Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/sun/util/calendar/zi/tzdata/VERSION Fri May 16 02:13:12 2014 -0700 @@ -21,4 +21,4 @@ # or visit www.oracle.com if you need additional information or have any # questions. # -tzdata2014b +tzdata2014c diff -r dca843327b90 -r 97e9abb0864b jdk/test/sun/util/calendar/zi/tzdata/africa --- a/jdk/test/sun/util/calendar/zi/tzdata/africa Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/sun/util/calendar/zi/tzdata/africa Fri May 16 02:13:12 2014 -0700 @@ -358,11 +358,54 @@ # http://www.worldtimezone.com/dst_news/dst_news_egypt02.html #
    +# From Ahmad El-Dardiry (2014-05-07): +# Egypt is to change back to Daylight system on May 15 +# http://english.ahram.org.eg/NewsContent/1/64/100735/Egypt/Politics-/Egypts-government-to-reapply-daylight-saving-time-.aspx + +# From Gunther Vermier (2015-05-13): +# our Egypt office confirms that the change will be at 15 May "midnight" (24:00) + +# From Paul Eggert (2014-05-13): +# Sarah El Deeb and Lee Keath of AP report that the Egyptian government says +# the change is because of blackouts in Cairo, even though Ahram Online (cited +# above) says DST had no affect on electricity consumption. The AP story says +# DST will not be observed during Ramadan. There is no information about when +# DST will end. See: +# http://abcnews.go.com/International/wireStory/el-sissi-pushes-egyptians-line-23614833 +# +# For now, guess that later transitions will use 2010's rules, and that +# Egypt will agree with Morocco (see below) about the date Ramadan starts and +# ends, though (unlike Morocco) it will switch at 00:00 standard time. In +# Egypt the spring-forward transitions are removed for 2020-2022, when the +# guessed spring-forward date falls during the estimated Ramadan, and all +# transitions removed for 2023-2038, where the estimated Ramadan falls entirely +# outside the guessed daylight-saving time. Ramadan intrudes on the guessed +# DST starting in 2039, but that's beyond our somewhat-arbitrary cutoff. + Rule Egypt 2008 only - Aug lastThu 23:00s 0 - Rule Egypt 2009 only - Aug 20 23:00s 0 - Rule Egypt 2010 only - Aug 11 0:00 0 - Rule Egypt 2010 only - Sep 10 0:00 1:00 S Rule Egypt 2010 only - Sep lastThu 23:00s 0 - +Rule Egypt 2014 only - May 15 24:00 1:00 S +Rule Egypt 2014 only - Jun 29 0:00s 0 - +Rule Egypt 2014 only - Jul 29 0:00s 1:00 S +Rule Egypt 2014 max - Sep lastThu 23:00s 0 - +Rule Egypt 2015 2019 - Apr lastFri 0:00s 1:00 S +Rule Egypt 2015 only - Jun 18 0:00s 0 - +Rule Egypt 2015 only - Jul 18 0:00s 1:00 S +Rule Egypt 2016 only - Jun 7 0:00s 0 - +Rule Egypt 2016 only - Jul 7 0:00s 1:00 S +Rule Egypt 2017 only - May 27 0:00s 0 - +Rule Egypt 2017 only - Jun 26 0:00s 1:00 S +Rule Egypt 2018 only - May 16 0:00s 0 - +Rule Egypt 2018 only - Jun 15 0:00s 1:00 S +Rule Egypt 2019 only - May 6 0:00s 0 - +Rule Egypt 2019 only - Jun 5 0:00s 1:00 S +Rule Egypt 2020 only - May 24 0:00s 1:00 S +Rule Egypt 2021 only - May 13 0:00s 1:00 S +Rule Egypt 2022 only - May 3 0:00s 1:00 S +Rule Egypt 2023 max - Apr lastFri 0:00s 1:00 S # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Africa/Cairo 2:05:09 - LMT 1900 Oct diff -r dca843327b90 -r 97e9abb0864b jdk/test/sun/util/calendar/zi/tzdata/asia --- a/jdk/test/sun/util/calendar/zi/tzdata/asia Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/sun/util/calendar/zi/tzdata/asia Fri May 16 02:13:12 2014 -0700 @@ -1370,22 +1370,6 @@ # "Jordan will switch to winter time on Friday, October 27". # -# From Phil Pizzey (2009-04-02): -# ...I think I may have spotted an error in the timezone data for -# Jordan. -# The current (2009d) asia file shows Jordan going to daylight -# saving -# time on the last Thursday in March. -# -# Rule Jordan 2000 max - Mar lastThu 0:00s 1:00 S -# -# However timeanddate.com, which I usually find reliable, shows Jordan -# going to daylight saving time on the last Friday in March since 2002. -# Please see -# -# http://www.timeanddate.com/worldclock/timezone.html?n=11 -# - # From Steffen Thorsen (2009-04-02): # This single one might be good enough, (2009-03-24, Arabic): # diff -r dca843327b90 -r 97e9abb0864b jdk/test/sun/util/calendar/zi/tzdata/europe --- a/jdk/test/sun/util/calendar/zi/tzdata/europe Thu May 15 11:35:26 2014 -0700 +++ b/jdk/test/sun/util/calendar/zi/tzdata/europe Fri May 16 02:13:12 2014 -0700 @@ -2989,6 +2989,10 @@ # From Alexander Krivenyshev (2014-03-17): # time change at 2:00 (2am) on March 30, 2014 # http://vz.ru/news/2014/3/17/677464.html +# From Paul Eggert (2014-03-30): +# Simferopol and Sevastopol reportedly changed their central town clocks +# late the previous day, but this appears to have been ceremonial +# and the discrepancies are small enough to not worry about. 2:00 EU EE%sT 2014 Mar 30 2:00 4:00 - MSK diff -r dca843327b90 -r 97e9abb0864b langtools/.hgtags --- a/langtools/.hgtags Thu May 15 11:35:26 2014 -0700 +++ b/langtools/.hgtags Fri May 16 02:13:12 2014 -0700 @@ -255,3 +255,4 @@ 7736a820af6f15cef9a1499f122e40abc83b2fbd jdk9-b10 f04fccfbd880c819affc3ef33e0083aab9556409 jdk9-b11 72efbe612e494f98b9c3ede1b4a3d02304e1e9cc jdk9-b12 +2c8bb81b5d48161019218c7604fa88c67edc6105 jdk9-b13 diff -r dca843327b90 -r 97e9abb0864b langtools/make/netbeans/langtools/nbproject/project.properties --- a/langtools/make/netbeans/langtools/nbproject/project.properties Thu May 15 11:35:26 2014 -0700 +++ b/langtools/make/netbeans/langtools/nbproject/project.properties Fri May 16 02:13:12 2014 -0700 @@ -1,3 +1,34 @@ +# +# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# - Neither the name of Oracle nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.expand-tabs=true auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.indent-shift-width=4 auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.spaces-per-tab=4 diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java Fri May 16 02:13:12 2014 -0700 @@ -878,8 +878,9 @@ */ static abstract class DocComparator implements Comparator { /** - * compares two parameter arrays by first comparing the length of the arrays, and - * then each Type of the parameter in the array. + * compares two parameter arrays by comparing each Type of the parameter in the array, + * as possible, if the matched strings are identical, and have mismatched array lengths + * then compare the lengths. * @param params1 the first parameter array. * @param params2 the first parameter array. * @return a negative integer, zero, or a positive integer as the first @@ -889,17 +890,14 @@ if (params1.length == 0 && params2.length == 0) { return 0; } - int result = Integer.compare(params1.length, params2.length); - if (result != 0) { - return result; - } - for (int i = 0; i < params1.length; i++) { - result = compareStrings(params1[i].typeName(), params2[i].typeName()); + // try to compare as many as possible + for (int i = 0; i < params1.length && i < params2.length; i++) { + int result = compareStrings(params1[i].typeName(), params2[i].typeName()); if (result != 0) { return result; } } - return 0; + return Integer.compare(params1.length, params2.length); } /** diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/javac/code/Attribute.java --- a/langtools/src/share/classes/com/sun/tools/javac/code/Attribute.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Attribute.java Fri May 16 02:13:12 2014 -0700 @@ -118,7 +118,8 @@ : types.erasure(type); return new Type.ClassType(types.syms.classType.getEnclosingType(), List.of(arg), - types.syms.classType.tsym); + types.syms.classType.tsym, + Type.noAnnotations); } public String toString() { return classType + ".class"; diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/javac/code/Printer.java --- a/langtools/src/share/classes/com/sun/tools/javac/code/Printer.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Printer.java Fri May 16 02:13:12 2014 -0700 @@ -28,7 +28,6 @@ import java.util.Locale; import com.sun.tools.javac.api.Messages; -import com.sun.tools.javac.code.Type.AnnotatedType; import com.sun.tools.javac.code.Type.ArrayType; import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.code.Type.*; @@ -150,14 +149,16 @@ @Override public String visitCapturedType(CapturedType t, Locale locale) { if (seenCaptured.contains(t)) - return localize(locale, "compiler.misc.type.captureof.1", - capturedVarId(t, locale)); + return printAnnotations(t) + + localize(locale, "compiler.misc.type.captureof.1", + capturedVarId(t, locale)); else { try { seenCaptured = seenCaptured.prepend(t); - return localize(locale, "compiler.misc.type.captureof", - capturedVarId(t, locale), - visit(t.wildcard, locale)); + return printAnnotations(t) + + localize(locale, "compiler.misc.type.captureof", + capturedVarId(t, locale), + visit(t.wildcard, locale)); } finally { seenCaptured = seenCaptured.tail; @@ -167,15 +168,16 @@ @Override public String visitForAll(ForAll t, Locale locale) { - return "<" + visitTypes(t.tvars, locale) + ">" + visit(t.qtype, locale); + return printAnnotations(t) + "<" + visitTypes(t.tvars, locale) + + ">" + visit(t.qtype, locale); } @Override public String visitUndetVar(UndetVar t, Locale locale) { if (t.inst != null) { - return visit(t.inst, locale); + return printAnnotations(t) + visit(t.inst, locale); } else { - return visit(t.qtype, locale) + "?"; + return printAnnotations(t) + visit(t.qtype, locale) + "?"; } } @@ -187,25 +189,34 @@ return res.toString(); } - void printBaseElementType(Type t, StringBuilder sb, Locale locale) { + private String printAnnotations(Type t) { + return printAnnotations(t, false); + } + + private String printAnnotations(Type t, boolean prefix) { + StringBuilder sb = new StringBuilder(); + List annos = t.getAnnotationMirrors(); + if (!annos.isEmpty()) { + if (prefix) sb.append(' '); + sb.append(annos); + sb.append(' '); + } + return sb.toString(); + } + + private void printBaseElementType(Type t, StringBuilder sb, Locale locale) { Type arrel = t; while (arrel.hasTag(TypeTag.ARRAY)) { - arrel = arrel.unannotatedType(); arrel = ((ArrayType) arrel).elemtype; } sb.append(visit(arrel, locale)); } - void printBrackets(Type t, StringBuilder sb, Locale locale) { + private void printBrackets(Type t, StringBuilder sb, Locale locale) { Type arrel = t; while (arrel.hasTag(TypeTag.ARRAY)) { - if (arrel.isAnnotated()) { - sb.append(' '); - sb.append(arrel.getAnnotationMirrors()); - sb.append(' '); - } + sb.append(printAnnotations(arrel, true)); sb.append("[]"); - arrel = arrel.unannotatedType(); arrel = ((ArrayType) arrel).elemtype; } } @@ -216,8 +227,10 @@ if (t.getEnclosingType().hasTag(CLASS) && t.tsym.owner.kind == Kinds.TYP) { buf.append(visit(t.getEnclosingType(), locale)); buf.append('.'); + buf.append(printAnnotations(t)); buf.append(className(t, false, locale)); } else { + buf.append(printAnnotations(t)); buf.append(className(t, true, locale)); } if (t.getTypeArguments().nonEmpty()) { @@ -230,7 +243,8 @@ @Override public String visitMethodType(MethodType t, Locale locale) { - return "(" + printMethodArgs(t.argtypes, false, locale) + ")" + visit(t.restype, locale); + return "(" + printMethodArgs(t.argtypes, false, locale) + ")" + + visit(t.restype, locale); } @Override @@ -243,6 +257,7 @@ StringBuilder s = new StringBuilder(); s.append(t.kind); if (t.kind != UNBOUND) { + s.append(printAnnotations(t)); s.append(visit(t.type, locale)); } return s.toString(); @@ -258,28 +273,6 @@ return visitType(t, locale); } - @Override - public String visitAnnotatedType(AnnotatedType t, Locale locale) { - if (t.getAnnotationMirrors().nonEmpty()) { - if (t.unannotatedType().hasTag(TypeTag.ARRAY)) { - StringBuilder res = new StringBuilder(); - printBaseElementType(t, res, locale); - printBrackets(t, res, locale); - return res.toString(); - } else if (t.unannotatedType().hasTag(TypeTag.CLASS) && - t.unannotatedType().getEnclosingType() != Type.noType) { - return visit(t.unannotatedType().getEnclosingType(), locale) + - ". " + - t.getAnnotationMirrors() + - " " + className((ClassType)t.unannotatedType(), false, locale); - } else { - return t.getAnnotationMirrors() + " " + visit(t.unannotatedType(), locale); - } - } else { - return visit(t.unannotatedType(), locale); - } - } - public String visitType(Type t, Locale locale) { String s = (t.tsym == null || t.tsym.name == null) ? localize(locale, "compiler.misc.type.none") @@ -345,8 +338,8 @@ args = args.tail; buf.append(','); } - if (args.head.unannotatedType().hasTag(TypeTag.ARRAY)) { - buf.append(visit(((ArrayType) args.head.unannotatedType()).elemtype, locale)); + if (args.head.hasTag(TypeTag.ARRAY)) { + buf.append(visit(((ArrayType) args.head).elemtype, locale)); if (args.head.getAnnotationMirrors().nonEmpty()) { buf.append(' '); buf.append(args.head.getAnnotationMirrors()); diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/javac/code/Source.java --- a/langtools/src/share/classes/com/sun/tools/javac/code/Source.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Source.java Fri May 16 02:13:12 2014 -0700 @@ -234,7 +234,7 @@ public boolean allowGraphInference() { return compareTo(JDK1_8) >= 0; } - public boolean allowStructuralMostSpecific() { + public boolean allowFunctionalInterfaceMostSpecific() { return compareTo(JDK1_8) >= 0; } public static SourceVersion toSourceVersion(Source source) { diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java --- a/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java Fri May 16 02:13:12 2014 -0700 @@ -956,7 +956,7 @@ this( flags, name, - new ClassType(Type.noType, null, null), + new ClassType(Type.noType, null, null, Type.noAnnotations), owner); this.type.tsym = this; } @@ -992,7 +992,8 @@ public Type erasure(Types types) { if (erasure_field == null) erasure_field = new ClassType(types.erasure(type.getEnclosingType()), - List.nil(), this); + List.nil(), this, + type.getAnnotationMirrors()); return erasure_field; } diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/javac/code/Type.java --- a/langtools/src/share/classes/com/sun/tools/javac/code/Type.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Type.java Fri May 16 02:13:12 2014 -0700 @@ -80,6 +80,9 @@ /** Constant type: special type to be used for marking stuck trees. */ public static final JCNoType stuckType = new JCNoType(); + public static final List noAnnotations = + List.nil(); + /** If this switch is turned on, the names of type variables * and anonymous classes are printed with hashcodes appended. */ @@ -89,6 +92,10 @@ */ public TypeSymbol tsym; + /** The type annotations on this type. + */ + protected final List annos; + /** * Checks if the current type tag is equal to the given tag. * @return true if tag is equal to the current type tag. @@ -173,10 +180,15 @@ public R accept(Type.Visitor v, S s) { return v.visitType(this, s); } - /** Define a type given its tag and type symbol + /** Define a type given its tag, type symbol, and type annotations */ - public Type(TypeSymbol tsym) { + public Type(TypeSymbol tsym, List annos) { + if(annos == null) { + Assert.error("Attempting to create type " + tsym + " with null type annotations"); + } + this.tsym = tsym; + this.annos = annos; } /** An abstract class for mappings from types to types @@ -225,25 +237,15 @@ return this; } - public Type annotatedType(List annos) { - return new AnnotatedType(annos, this); - } + public abstract Type annotatedType(List annos); public boolean isAnnotated() { - return false; - } - - /** - * If this is an annotated type, return the underlying type. - * Otherwise, return the type itself. - */ - public Type unannotatedType() { - return this; + return !annos.isEmpty(); } @Override public List getAnnotationMirrors() { - return List.nil(); + return annos; } @@ -272,16 +274,35 @@ return ts; } + protected void appendAnnotationsString(StringBuilder sb, + boolean prefix) { + if (isAnnotated()) { + if (prefix) { + sb.append(" "); + } + sb.append(annos); + sb.append(" "); + } + } + + protected void appendAnnotationsString(StringBuilder sb) { + appendAnnotationsString(sb, false); + } + /** The Java source which this type represents. */ public String toString() { - String s = (tsym == null || tsym.name == null) - ? "" - : tsym.name.toString(); + StringBuilder sb = new StringBuilder(); + appendAnnotationsString(sb); + if (tsym == null || tsym.name == null) { + sb.append(""); + } else { + sb.append(tsym.name); + } if (moreInfo && hasTag(TYPEVAR)) { - s = s + hashCode(); + sb.append(hashCode()); } - return s; + return sb.toString(); } /** @@ -333,8 +354,8 @@ args = args.tail; buf.append(','); } - if (args.head.unannotatedType().hasTag(ARRAY)) { - buf.append(((ArrayType)args.head.unannotatedType()).elemtype); + if (args.head.hasTag(ARRAY)) { + buf.append(((ArrayType)args.head).elemtype); if (args.head.getAnnotationMirrors().nonEmpty()) { buf.append(args.head.getAnnotationMirrors()); } @@ -486,12 +507,22 @@ TypeTag tag; public JCPrimitiveType(TypeTag tag, TypeSymbol tsym) { - super(tsym); + this(tag, tsym, noAnnotations); + } + + public JCPrimitiveType(TypeTag tag, TypeSymbol tsym, + List annos) { + super(tsym, annos); this.tag = tag; Assert.check(tag.isPrimitive); } @Override + public Type annotatedType(List annos) { + return new JCPrimitiveType(tag, tsym, annos); + } + + @Override public boolean isNumeric() { return tag != BOOLEAN; } @@ -517,7 +548,7 @@ @Override public Type constType(Object constValue) { final Object value = constValue; - return new JCPrimitiveType(tag, tsym) { + return new JCPrimitiveType(tag, tsym, annos) { @Override public Object constValue() { return value; @@ -601,17 +632,35 @@ } public WildcardType(Type type, BoundKind kind, TypeSymbol tsym) { - super(tsym); + this(type, kind, tsym, null, noAnnotations); + } + + public WildcardType(Type type, BoundKind kind, TypeSymbol tsym, + List annos) { + this(type, kind, tsym, null, annos); + } + + public WildcardType(WildcardType t, TypeVar bound, + List annos) { + this(t.type, t.kind, t.tsym, bound, annos); + } + + public WildcardType(Type type, BoundKind kind, TypeSymbol tsym, + TypeVar bound) { + this(type, kind, tsym, noAnnotations); + } + + public WildcardType(Type type, BoundKind kind, TypeSymbol tsym, + TypeVar bound, List annos) { + super(tsym, annos); this.type = Assert.checkNonNull(type); this.kind = kind; - } - public WildcardType(WildcardType t, TypeVar bound) { - this(t.type, t.kind, t.tsym, bound); + this.bound = bound; } - public WildcardType(Type type, BoundKind kind, TypeSymbol tsym, TypeVar bound) { - this(type, kind, tsym); - this.bound = bound; + @Override + public WildcardType annotatedType(List annos) { + return new WildcardType(type, kind, tsym, bound, annos); } @Override @@ -658,6 +707,7 @@ boolean isPrintingBound = false; public String toString() { StringBuilder s = new StringBuilder(); + appendAnnotationsString(s); s.append(kind.toString()); if (kind != UNBOUND) s.append(type); @@ -679,7 +729,7 @@ if (t == type) return this; else - return new WildcardType(t, kind, tsym, bound); + return new WildcardType(t, kind, tsym, bound, annos); } public Type getExtendsBound() { @@ -736,7 +786,12 @@ public List all_interfaces_field; public ClassType(Type outer, List typarams, TypeSymbol tsym) { - super(tsym); + this(outer, typarams, tsym, noAnnotations); + } + + public ClassType(Type outer, List typarams, TypeSymbol tsym, + List annos) { + super(tsym, annos); this.outer_field = outer; this.typarams_field = typarams; this.allparams_field = null; @@ -754,6 +809,15 @@ } @Override + public ClassType annotatedType(List annos) { + final ClassType out = new ClassType(outer_field, typarams_field, tsym, annos); + out.allparams_field = allparams_field; + out.supertype_field = supertype_field; + out.interfaces_field = interfaces_field; + return out; + } + + @Override public TypeTag getTag() { return CLASS; } @@ -765,7 +829,7 @@ public Type constType(Object constValue) { final Object value = constValue; - return new ClassType(getEnclosingType(), typarams_field, tsym) { + return new ClassType(getEnclosingType(), typarams_field, tsym, annos) { @Override public Object constValue() { return value; @@ -781,6 +845,7 @@ */ public String toString() { StringBuilder buf = new StringBuilder(); + appendAnnotationsString(buf); if (getEnclosingType().hasTag(CLASS) && tsym.owner.kind == TYP) { buf.append(getEnclosingType().toString()); buf.append("."); @@ -806,7 +871,7 @@ return s.toString(); } else if (sym.name.isEmpty()) { String s; - ClassType norm = (ClassType) tsym.type.unannotatedType(); + ClassType norm = (ClassType) tsym.type; if (norm == null) { s = Log.getLocalizedString("anonymous.class", (Object)null); } else if (norm.interfaces_field != null && norm.interfaces_field.nonEmpty()) { @@ -858,7 +923,7 @@ return getEnclosingType().isErroneous() || isErroneous(getTypeArguments()) || - this != tsym.type.unannotatedType() && tsym.type.isErroneous(); + this != tsym.type && tsym.type.isErroneous(); } public boolean isParameterized() { @@ -897,7 +962,7 @@ List typarams = getTypeArguments(); List typarams1 = map(typarams, f); if (outer1 == outer && typarams1 == typarams) return this; - else return new ClassType(outer1, typarams1, tsym); + else return new ClassType(outer1, typarams1, tsym, annos); } public boolean contains(Type elem) { @@ -924,7 +989,12 @@ public static class ErasedClassType extends ClassType { public ErasedClassType(Type outer, TypeSymbol tsym) { - super(outer, List.nil(), tsym); + this(outer, tsym, noAnnotations); + } + + public ErasedClassType(Type outer, TypeSymbol tsym, + List annos) { + super(outer, List.nil(), tsym, annos); } @Override @@ -938,7 +1008,9 @@ final List alternatives_field; public UnionClassType(ClassType ct, List alternatives) { - super(ct.outer_field, ct.typarams_field, ct.tsym); + // Presently no way to refer to this type directly, so we + // cannot put annotations directly on it. + super(ct.outer_field, ct.typarams_field, ct.tsym, noAnnotations); allparams_field = ct.allparams_field; supertype_field = ct.supertype_field; interfaces_field = ct.interfaces_field; @@ -971,7 +1043,9 @@ public boolean allInterfaces; public IntersectionClassType(List bounds, ClassSymbol csym, boolean allInterfaces) { - super(Type.noType, List.nil(), csym); + // Presently no way to refer to this type directly, so we + // cannot put annotations directly on it. + super(Type.noType, List.nil(), csym, noAnnotations); this.allInterfaces = allInterfaces; Assert.check((csym.flags() & COMPOUND) != 0); supertype_field = bounds.head; @@ -1011,11 +1085,21 @@ public Type elemtype; public ArrayType(Type elemtype, TypeSymbol arrayClass) { - super(arrayClass); + this(elemtype, arrayClass, noAnnotations); + } + + public ArrayType(Type elemtype, TypeSymbol arrayClass, + List annos) { + super(arrayClass, annos); this.elemtype = elemtype; } @Override + public ArrayType annotatedType(List annos) { + return new ArrayType(elemtype, tsym, annos); + } + + @Override public TypeTag getTag() { return ARRAY; } @@ -1025,7 +1109,11 @@ } public String toString() { - return elemtype + "[]"; + StringBuilder sb = new StringBuilder(); + sb.append(elemtype); + appendAnnotationsString(sb, true); + sb.append("[]"); + return sb.toString(); } public boolean equals(Object obj) { @@ -1068,7 +1156,7 @@ } public ArrayType makeVarargs() { - return new ArrayType(elemtype, tsym) { + return new ArrayType(elemtype, tsym, annos) { @Override public boolean isVarargs() { return true; @@ -1079,7 +1167,7 @@ public Type map(Mapping f) { Type elemtype1 = f.apply(elemtype); if (elemtype1 == elemtype) return this; - else return new ArrayType(elemtype1, tsym); + else return new ArrayType(elemtype1, tsym, annos); } public boolean contains(Type elem) { @@ -1117,13 +1205,20 @@ Type restype, List thrown, TypeSymbol methodClass) { - super(methodClass); + // Presently no way to refer to a method type directly, so + // we cannot put type annotations on it. + super(methodClass, noAnnotations); this.argtypes = argtypes; this.restype = restype; this.thrown = thrown; } @Override + public MethodType annotatedType(List annos) { + throw new AssertionError("Cannot annotate a method type"); + } + + @Override public TypeTag getTag() { return METHOD; } @@ -1138,7 +1233,13 @@ * should be. */ public String toString() { - return "(" + argtypes + ")" + restype; + StringBuilder sb = new StringBuilder(); + appendAnnotationsString(sb); + sb.append('('); + sb.append(argtypes); + sb.append(')'); + sb.append(restype); + return sb.toString(); } public List getParameterTypes() { return argtypes; } @@ -1197,7 +1298,13 @@ public static class PackageType extends Type implements NoType { PackageType(TypeSymbol tsym) { - super(tsym); + // Package types cannot be annotated + super(tsym, noAnnotations); + } + + @Override + public PackageType annotatedType(List annos) { + throw new AssertionError("Cannot annotate a package type"); } @Override @@ -1245,18 +1352,29 @@ public Type lower; public TypeVar(Name name, Symbol owner, Type lower) { - super(null); + this(name, owner, lower, noAnnotations); + } + + public TypeVar(Name name, Symbol owner, Type lower, + List annos) { + super(null, annos); tsym = new TypeVariableSymbol(0, name, this, owner); this.lower = lower; } - public TypeVar(TypeSymbol tsym, Type bound, Type lower) { - super(tsym); + public TypeVar(TypeSymbol tsym, Type bound, Type lower, + List annos) { + super(tsym, annos); this.bound = bound; this.lower = lower; } @Override + public TypeVar annotatedType(List annos) { + return new TypeVar(tsym, bound, lower, annos); + } + + @Override public TypeTag getTag() { return TYPEVAR; } @@ -1317,13 +1435,29 @@ Symbol owner, Type upper, Type lower, - WildcardType wildcard) { - super(name, owner, lower); + WildcardType wildcard, + List annos) { + super(name, owner, lower, annos); this.lower = Assert.checkNonNull(lower); this.bound = upper; this.wildcard = wildcard; } + public CapturedType(TypeSymbol tsym, + Type bound, + Type upper, + Type lower, + WildcardType wildcard, + List annos) { + super(tsym, bound, lower, annos); + this.wildcard = wildcard; + } + + @Override + public CapturedType annotatedType(List annos) { + return new CapturedType(tsym, bound, bound, lower, wildcard, annos); + } + @Override public R accept(Type.Visitor v, S s) { return v.visitCapturedType(this, s); @@ -1336,18 +1470,22 @@ @Override public String toString() { - return "capture#" - + (hashCode() & 0xFFFFFFFFL) % Printer.PRIME - + " of " - + wildcard; + StringBuilder sb = new StringBuilder(); + appendAnnotationsString(sb); + sb.append("capture#"); + sb.append((hashCode() & 0xFFFFFFFFL) % Printer.PRIME); + sb.append(" of "); + sb.append(wildcard); + return sb.toString(); } } public static abstract class DelegatedType extends Type { public Type qtype; public TypeTag tag; - public DelegatedType(TypeTag tag, Type qtype) { - super(qtype.tsym); + public DelegatedType(TypeTag tag, Type qtype, + List annos) { + super(qtype.tsym, annos); this.tag = tag; this.qtype = qtype; } @@ -1373,17 +1511,28 @@ public List tvars; public ForAll(List tvars, Type qtype) { - super(FORALL, (MethodType)qtype); + super(FORALL, (MethodType)qtype, noAnnotations); this.tvars = tvars; } @Override + public ForAll annotatedType(List annos) { + throw new AssertionError("Cannot annotate forall type"); + } + + @Override public R accept(Type.Visitor v, S s) { return v.visitForAll(this, s); } public String toString() { - return "<" + tvars + ">" + qtype; + StringBuilder sb = new StringBuilder(); + appendAnnotationsString(sb); + sb.append('<'); + sb.append(tvars); + sb.append('>'); + sb.append(qtype); + return sb.toString(); } public List getTypeArguments() { return tvars; } @@ -1479,7 +1628,8 @@ } public UndetVar(TypeVar origin, Types types) { - super(UNDETVAR, origin); + // This is a synthesized internal type, so we cannot annotate it. + super(UNDETVAR, origin, noAnnotations); bounds = new EnumMap<>(InferenceBound.class); List declaredBounds = types.getBounds(origin); declaredCount = declaredBounds.length(); @@ -1489,7 +1639,15 @@ } public String toString() { - return (inst == null) ? qtype + "?" : inst.toString(); + StringBuilder sb = new StringBuilder(); + appendAnnotationsString(sb); + if (inst == null) { + sb.append(qtype); + sb.append('?'); + } else { + sb.append(inst); + } + return sb.toString(); } public String debugString() { @@ -1507,6 +1665,11 @@ } @Override + public UndetVar annotatedType(List annos) { + throw new AssertionError("Cannot annotate an UndetVar type"); + } + + @Override public boolean isPartial() { return true; } @@ -1659,7 +1822,15 @@ */ public static class JCNoType extends Type implements NoType { public JCNoType() { - super(null); + // Need to use List.nil(), because JCNoType constructor + // gets called in static initializers in Type, where + // noAnnotations is also defined. + super(null, List.nil()); + } + + @Override + public JCNoType annotatedType(List annos) { + throw new AssertionError("Cannot annotate JCNoType"); } @Override @@ -1686,7 +1857,13 @@ public static class JCVoidType extends Type implements NoType { public JCVoidType() { - super(null); + // Void cannot be annotated + super(null, noAnnotations); + } + + @Override + public JCVoidType annotatedType(List annos) { + throw new AssertionError("Cannot annotate void type"); } @Override @@ -1715,7 +1892,13 @@ static class BottomType extends Type implements NullType { public BottomType() { - super(null); + // Bottom is a synthesized internal type, so it cannot be annotated + super(null, noAnnotations); + } + + @Override + public BottomType annotatedType(List annos) { + throw new AssertionError("Cannot annotate bottom type"); } @Override @@ -1759,7 +1942,12 @@ private Type originalType = null; public ErrorType(Type originalType, TypeSymbol tsym) { - super(noType, List.nil(), null); + this(originalType, tsym, noAnnotations); + } + + public ErrorType(Type originalType, TypeSymbol tsym, + List typeAnnotations) { + super(noType, List.nil(), null, typeAnnotations); this.tsym = tsym; this.originalType = (originalType == null ? noType : originalType); } @@ -1772,6 +1960,11 @@ } @Override + public ErrorType annotatedType(List annos) { + return new ErrorType(originalType, tsym, annos); + } + + @Override public TypeTag getTag() { return ERROR; } @@ -1827,182 +2020,17 @@ } } - public static class AnnotatedType extends Type - implements - javax.lang.model.type.ArrayType, - javax.lang.model.type.DeclaredType, - javax.lang.model.type.PrimitiveType, - javax.lang.model.type.TypeVariable, - javax.lang.model.type.WildcardType { - /** The type annotations on this type. - */ - private List typeAnnotations; - - /** The underlying type that is annotated. - */ - private Type underlyingType; - - protected AnnotatedType(List typeAnnotations, - Type underlyingType) { - super(underlyingType.tsym); - this.typeAnnotations = typeAnnotations; - this.underlyingType = underlyingType; - Assert.check(typeAnnotations != null && typeAnnotations.nonEmpty(), - "Can't create AnnotatedType without annotations: " + underlyingType); - Assert.check(!underlyingType.isAnnotated(), - "Can't annotate already annotated type: " + underlyingType + - "; adding: " + typeAnnotations); - } - - @Override - public TypeTag getTag() { - return underlyingType.getTag(); - } + public static class UnknownType extends Type { - @Override - public boolean isAnnotated() { - return true; - } - - @Override - public List getAnnotationMirrors() { - return typeAnnotations; - } - - - @Override - public TypeKind getKind() { - return underlyingType.getKind(); - } - - @Override - public Type unannotatedType() { - return underlyingType; - } - - @Override - public R accept(Type.Visitor v, S s) { - return v.visitAnnotatedType(this, s); - } - - @Override - public R accept(TypeVisitor v, P p) { - return underlyingType.accept(v, p); - } - - @Override - public Type map(Mapping f) { - underlyingType.map(f); - return this; + public UnknownType() { + // Unknown is a synthesized internal type, so it cannot be + // annotated. + super(null, noAnnotations); } @Override - public Type constType(Object constValue) { return underlyingType.constType(constValue); } - @Override - public Type getEnclosingType() { return underlyingType.getEnclosingType(); } - - @Override - public Type getReturnType() { return underlyingType.getReturnType(); } - @Override - public List getTypeArguments() { return underlyingType.getTypeArguments(); } - @Override - public List getParameterTypes() { return underlyingType.getParameterTypes(); } - @Override - public Type getReceiverType() { return underlyingType.getReceiverType(); } - @Override - public List getThrownTypes() { return underlyingType.getThrownTypes(); } - @Override - public Type getUpperBound() { return underlyingType.getUpperBound(); } - @Override - public Type getLowerBound() { return underlyingType.getLowerBound(); } - - @Override - public boolean isErroneous() { return underlyingType.isErroneous(); } - @Override - public boolean isCompound() { return underlyingType.isCompound(); } - @Override - public boolean isInterface() { return underlyingType.isInterface(); } - @Override - public List allparams() { return underlyingType.allparams(); } - @Override - public boolean isPrimitive() { return underlyingType.isPrimitive(); } - @Override - public boolean isPrimitiveOrVoid() { return underlyingType.isPrimitiveOrVoid(); } - @Override - public boolean isNumeric() { return underlyingType.isNumeric(); } - @Override - public boolean isReference() { return underlyingType.isReference(); } - @Override - public boolean isNullOrReference() { return underlyingType.isNullOrReference(); } - @Override - public boolean isPartial() { return underlyingType.isPartial(); } - @Override - public boolean isParameterized() { return underlyingType.isParameterized(); } - @Override - public boolean isRaw() { return underlyingType.isRaw(); } - @Override - public boolean isFinal() { return underlyingType.isFinal(); } - @Override - public boolean isSuperBound() { return underlyingType.isSuperBound(); } - @Override - public boolean isExtendsBound() { return underlyingType.isExtendsBound(); } - @Override - public boolean isUnbound() { return underlyingType.isUnbound(); } - - @Override - public String toString() { - // This method is only used for internal debugging output. - // See - // com.sun.tools.javac.code.Printer.visitAnnotatedType(AnnotatedType, Locale) - // for the user-visible logic. - if (typeAnnotations != null && - !typeAnnotations.isEmpty()) { - return "(" + typeAnnotations.toString() + " :: " + underlyingType.toString() + ")"; - } else { - return "({} :: " + underlyingType.toString() +")"; - } - } - - @Override - public boolean contains(Type t) { return underlyingType.contains(t); } - - @Override - public Type withTypeVar(Type t) { - // Don't create a new AnnotatedType, as 'this' will - // get its annotations set later. - underlyingType = underlyingType.withTypeVar(t); - return this; - } - - // TODO: attach annotations? - @Override - public TypeSymbol asElement() { return underlyingType.asElement(); } - - // TODO: attach annotations? - @Override - public MethodType asMethodType() { return underlyingType.asMethodType(); } - - @Override - public void complete() { underlyingType.complete(); } - - @Override - public TypeMirror getComponentType() { return ((ArrayType)underlyingType).getComponentType(); } - - // The result is an ArrayType, but only in the model sense, not the Type sense. - public Type makeVarargs() { - return ((ArrayType) underlyingType).makeVarargs().annotatedType(typeAnnotations); - } - - @Override - public TypeMirror getExtendsBound() { return ((WildcardType)underlyingType).getExtendsBound(); } - @Override - public TypeMirror getSuperBound() { return ((WildcardType)underlyingType).getSuperBound(); } - } - - public static class UnknownType extends Type { - - public UnknownType() { - super(null); + public UnknownType annotatedType(List annos) { + throw new AssertionError("Cannot annotate unknown type"); } @Override @@ -2046,7 +2074,6 @@ R visitForAll(ForAll t, S s); R visitUndetVar(UndetVar t, S s); R visitErrorType(ErrorType t, S s); - R visitAnnotatedType(AnnotatedType t, S s); R visitType(Type t, S s); } } diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/javac/code/TypeAnnotationPosition.java --- a/langtools/src/share/classes/com/sun/tools/javac/code/TypeAnnotationPosition.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/TypeAnnotationPosition.java Fri May 16 02:13:12 2014 -0700 @@ -326,15 +326,21 @@ public int getCatchType() { Assert.check(hasCatchType(), - "exception_index does not contain a valid catch type"); - return (-this.exception_index) - 1 ; + "exception_index does not contain valid catch info"); + return ((-this.exception_index) - 1) & 0xff ; } - public void setCatchType(final int catchType) { + public int getStartPos() { + Assert.check(hasCatchType(), + "exception_index does not contain valid catch info"); + return ((-this.exception_index) - 1) >> 8 ; + } + + public void setCatchInfo(final int catchType, final int startPos) { Assert.check(this.exception_index < 0, "exception_index already contains a bytecode index"); Assert.check(catchType >= 0, "Expected a valid catch type"); - this.exception_index = -(catchType + 1); + this.exception_index = -((catchType | startPos << 8) + 1); } /** diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/javac/code/TypeAnnotations.java --- a/langtools/src/share/classes/com/sun/tools/javac/code/TypeAnnotations.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/TypeAnnotations.java Fri May 16 02:13:12 2014 -0700 @@ -32,7 +32,6 @@ import javax.tools.JavaFileObject; import com.sun.tools.javac.code.Attribute.TypeCompound; -import com.sun.tools.javac.code.Type.AnnotatedType; import com.sun.tools.javac.code.Type.ArrayType; import com.sun.tools.javac.code.Type.CapturedType; import com.sun.tools.javac.code.Type.ClassType; @@ -331,7 +330,6 @@ // Note that we don't use the result, the call to // typeWithAnnotations side-effects the type annotation positions. // This is important for constructors of nested classes. - sym.appendUniqueTypeAttributes(typeAnnotations); return; } @@ -391,14 +389,15 @@ private Type typeWithAnnotations(final JCTree typetree, final Type type, final List annotations, final List onlyTypeAnnotations) { - // System.out.printf("typeWithAnnotations(typetree: %s, type: %s, annotations: %s, onlyTypeAnnotations: %s)%n", + //System.err.printf("typeWithAnnotations(typetree: %s, type: %s, annotations: %s, onlyTypeAnnotations: %s)%n", // typetree, type, annotations, onlyTypeAnnotations); if (annotations.isEmpty()) { return type; } if (type.hasTag(TypeTag.ARRAY)) { - Type.ArrayType arType = (Type.ArrayType) type.unannotatedType(); - Type.ArrayType tomodify = new Type.ArrayType(null, arType.tsym); + Type.ArrayType arType = (Type.ArrayType) type; + Type.ArrayType tomodify = new Type.ArrayType(null, arType.tsym, + Type.noAnnotations); Type toreturn; if (type.isAnnotated()) { toreturn = tomodify.annotatedType(type.getAnnotationMirrors()); @@ -413,13 +412,15 @@ while (arType.elemtype.hasTag(TypeTag.ARRAY)) { if (arType.elemtype.isAnnotated()) { Type aelemtype = arType.elemtype; - arType = (Type.ArrayType) aelemtype.unannotatedType(); + arType = (Type.ArrayType) aelemtype; ArrayType prevToMod = tomodify; - tomodify = new Type.ArrayType(null, arType.tsym); + tomodify = new Type.ArrayType(null, arType.tsym, + Type.noAnnotations); prevToMod.elemtype = tomodify.annotatedType(arType.elemtype.getAnnotationMirrors()); } else { arType = (Type.ArrayType) arType.elemtype; - tomodify.elemtype = new Type.ArrayType(null, arType.tsym); + tomodify.elemtype = new Type.ArrayType(null, arType.tsym, + Type.noAnnotations); tomodify = (Type.ArrayType) tomodify.elemtype; } arTree = arrayTypeTree(arTree.elemtype); @@ -569,6 +570,7 @@ private Type typeWithAnnotations(final Type type, final Type stopAt, final List annotations) { + //System.err.println("typeWithAnnotations " + type + " " + annotations + " stopAt " + stopAt); Visitor> visitor = new Type.Visitor>() { @Override @@ -579,7 +581,8 @@ return t.annotatedType(s); } else { ClassType ret = new ClassType(t.getEnclosingType().accept(this, s), - t.typarams_field, t.tsym); + t.typarams_field, t.tsym, + t.getAnnotationMirrors()); ret.all_interfaces_field = t.all_interfaces_field; ret.allparams_field = t.allparams_field; ret.interfaces_field = t.interfaces_field; @@ -590,18 +593,14 @@ } @Override - public Type visitAnnotatedType(AnnotatedType t, List s) { - return t.unannotatedType().accept(this, s).annotatedType(t.getAnnotationMirrors()); - } - - @Override public Type visitWildcardType(WildcardType t, List s) { return t.annotatedType(s); } @Override public Type visitArrayType(ArrayType t, List s) { - ArrayType ret = new ArrayType(t.elemtype.accept(this, s), t.tsym); + ArrayType ret = new ArrayType(t.elemtype.accept(this, s), t.tsym, + t.getAnnotationMirrors()); return ret; } diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/javac/code/Types.java --- a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java Fri May 16 02:13:12 2014 -0700 @@ -131,7 +131,7 @@ * @return the upper bound of the given type */ public Type upperBound(Type t) { - return upperBound.visit(t).unannotatedType(); + return upperBound.visit(t); } // where private final MapVisitor upperBound = new MapVisitor() { @@ -205,7 +205,7 @@ WildcardType unb = new WildcardType(syms.objectType, BoundKind.UNBOUND, syms.boundClass, - (TypeVar)parms.head.unannotatedType()); + (TypeVar)parms.head); if (!containsType(args.head, unb)) return false; parms = parms.tail; @@ -269,7 +269,9 @@ List opens = openVars.toList(); ListBuffer qs = new ListBuffer<>(); for (List iter = opens; iter.nonEmpty(); iter = iter.tail) { - qs.append(new WildcardType(syms.objectType, BoundKind.UNBOUND, syms.boundClass, (TypeVar) iter.head.unannotatedType())); + qs.append(new WildcardType(syms.objectType, BoundKind.UNBOUND, + syms.boundClass, (TypeVar) iter.head, + Type.noAnnotations)); } res = subst(res, opens, qs.toList()); } @@ -599,12 +601,12 @@ //simply replace the wildcards with its bound for (Type t : formalInterface.getTypeArguments()) { if (actualTypeargs.head.hasTag(WILDCARD)) { - WildcardType wt = (WildcardType)actualTypeargs.head.unannotatedType(); + WildcardType wt = (WildcardType)actualTypeargs.head; Type bound; switch (wt.kind) { case EXTENDS: case UNBOUND: - CapturedType capVar = (CapturedType)capturedTypeargs.head.unannotatedType(); + CapturedType capVar = (CapturedType)capturedTypeargs.head; //use declared bound if it doesn't depend on formal type-args bound = capVar.bound.containsAny(capturedSite.getTypeArguments()) ? wt.type : capVar.bound; @@ -642,7 +644,8 @@ csym.members_field = new Scope(csym); MethodSymbol instDescSym = new MethodSymbol(descSym.flags(), descSym.name, descType, csym); csym.members_field.enter(instDescSym); - Type.ClassType ctype = new Type.ClassType(Type.noType, List.nil(), csym); + Type.ClassType ctype = new Type.ClassType(Type.noType, List.nil(), csym, + Type.noAnnotations); ctype.supertype_field = syms.objectType; ctype.interfaces_field = targets; csym.type = ctype; @@ -747,8 +750,6 @@ //where private boolean isSubtypeUncheckedInternal(Type t, Type s, Warner warn) { if (t.hasTag(ARRAY) && s.hasTag(ARRAY)) { - t = t.unannotatedType(); - s = s.unannotatedType(); if (((ArrayType)t).elemtype.isPrimitive()) { return isSameType(elemtype(t), elemtype(s)); } else { @@ -776,8 +777,6 @@ if (!t.hasTag(ARRAY) || isReifiable(t)) { return; } - t = t.unannotatedType(); - s = s.unannotatedType(); ArrayType from = (ArrayType)t; boolean shouldWarn = false; switch (s.getTag()) { @@ -810,12 +809,6 @@ if (t == s) return true; - t = t.unannotatedType(); - s = s.unannotatedType(); - - if (t == s) - return true; - if (s.isPartial()) return isSuperType(s, t); @@ -828,8 +821,9 @@ } // Generally, if 's' is a type variable, recur on lower bound; but - // for alpha <: CAP, alpha should get upper bound CAP - if (!t.hasTag(UNDETVAR)) { + // for inference variables and intersections, we need to keep 's' + // (see JLS 4.10.2 for intersections and 18.2.3 for inference vars) + if (!t.hasTag(UNDETVAR) && !t.isCompound()) { // TODO: JDK-8039198, bounds checking sometimes passes in a wildcard as s Type lower = cvarLowerBound(wildLowerBound(s)); if (s != lower) @@ -899,12 +893,14 @@ if (s.isSuperBound() && !s.isExtendsBound()) { s = new WildcardType(syms.objectType, BoundKind.UNBOUND, - syms.boundClass); + syms.boundClass, + s.getAnnotationMirrors()); changed = true; } else if (s != orig) { s = new WildcardType(upperBound(s), BoundKind.EXTENDS, - syms.boundClass); + syms.boundClass, + s.getAnnotationMirrors()); changed = true; } rewrite.append(s); @@ -918,14 +914,11 @@ @Override public Boolean visitClassType(ClassType t, Type s) { Type sup = asSuper(t, s.tsym); - return sup != null - && sup.tsym == s.tsym - // You're not allowed to write - // Vector vec = new Vector(); - // But with wildcards you can write - // Vector vec = new Vector(); - // which means that subtype checking must be done - // here instead of same-type checking (via containsType). + if (sup == null) return false; + // If t is an intersection, sup might not be a class type + if (!sup.hasTag(CLASS)) return isSubtypeNoCapture(sup, s); + return sup.tsym == s.tsym + // Check type variable containment && (!s.isParameterized() || containsTypeRecursive(s, sup)) && isSubtypeNoCapture(sup.getEnclosingType(), s.getEnclosingType()); @@ -1107,7 +1100,7 @@ if (s.hasTag(TYPEVAR)) { //type-substitution does not preserve type-var types //check that type var symbols and bounds are indeed the same - return sameTypeVars((TypeVar)t.unannotatedType(), (TypeVar)s.unannotatedType()); + return sameTypeVars((TypeVar)t, (TypeVar)s); } else { //special case for s == ? super X, where upper(s) = u @@ -1149,9 +1142,9 @@ HashSet set = new HashSet<>(); for (Type x : interfaces(t)) - set.add(new UniqueType(x.unannotatedType(), Types.this)); + set.add(new UniqueType(x, Types.this)); for (Type x : interfaces(s)) { - if (!set.remove(new UniqueType(x.unannotatedType(), Types.this))) + if (!set.remove(new UniqueType(x, Types.this))) return false; } return (set.isEmpty()); @@ -1256,30 +1249,47 @@ if (!s.hasTag(WILDCARD)) { return false; } else { - WildcardType t2 = (WildcardType)s.unannotatedType(); + WildcardType t2 = (WildcardType)s; return t.kind == t2.kind && isSameType(t.type, t2.type, true); } } }; - /** - * A version of LooseSameTypeVisitor that takes AnnotatedTypes - * into account. - */ - TypeRelation isSameAnnotatedType = new LooseSameTypeVisitor() { + // + + TypeRelation isSameAnnotatedType = new LooseSameTypeVisitor() { + private Boolean compareAnnotations(Type t1, Type t2) { + List annos1 = t1.getAnnotationMirrors(); + List annos2 = t2.getAnnotationMirrors(); + return annos1.containsAll(annos2) && annos2.containsAll(annos1); + } + + @Override + public Boolean visitType(Type t, Type s) { + return compareAnnotations(t, s) && super.visitType(t, s); + } + @Override - public Boolean visitAnnotatedType(AnnotatedType t, Type s) { - if (!s.isAnnotated()) - return false; - if (!t.getAnnotationMirrors().containsAll(s.getAnnotationMirrors())) - return false; - if (!s.getAnnotationMirrors().containsAll(t.getAnnotationMirrors())) - return false; - return visit(t.unannotatedType(), s); + public Boolean visitWildcardType(WildcardType t, Type s) { + return compareAnnotations(t, s) && super.visitWildcardType(t, s); + } + + @Override + public Boolean visitClassType(ClassType t, Type s) { + return compareAnnotations(t, s) && super.visitClassType(t, s); + } + + @Override + public Boolean visitArrayType(ArrayType t, Type s) { + return compareAnnotations(t, s) && super.visitArrayType(t, s); + } + + @Override + public Boolean visitForAll(ForAll t, Type s) { + return compareAnnotations(t, s) && super.visitForAll(t, s); } }; - // // public boolean containedBy(Type t, Type s) { @@ -1287,7 +1297,7 @@ case UNDETVAR: if (s.hasTag(WILDCARD)) { UndetVar undetvar = (UndetVar)t; - WildcardType wt = (WildcardType)s.unannotatedType(); + WildcardType wt = (WildcardType)s; switch(wt.kind) { case UNBOUND: //similar to ? extends Object case EXTENDS: { @@ -1354,7 +1364,7 @@ private Type U(Type t) { while (t.hasTag(WILDCARD)) { - WildcardType w = (WildcardType)t.unannotatedType(); + WildcardType w = (WildcardType)t; if (w.isSuperBound()) return w.bound == null ? syms.objectType : w.bound.bound; else @@ -1365,7 +1375,7 @@ private Type L(Type t) { while (t.hasTag(WILDCARD)) { - WildcardType w = (WildcardType)t.unannotatedType(); + WildcardType w = (WildcardType)t; if (w.isExtendsBound()) return syms.botType; else @@ -1424,15 +1434,15 @@ }; public boolean isCaptureOf(Type s, WildcardType t) { - if (!s.hasTag(TYPEVAR) || !((TypeVar)s.unannotatedType()).isCaptured()) + if (!s.hasTag(TYPEVAR) || !((TypeVar)s).isCaptured()) return false; - return isSameWildcard(t, ((CapturedType)s.unannotatedType()).wildcard); + return isSameWildcard(t, ((CapturedType)s).wildcard); } public boolean isSameWildcard(WildcardType t, Type s) { if (!s.hasTag(WILDCARD)) return false; - WildcardType w = (WildcardType)s.unannotatedType(); + WildcardType w = (WildcardType)s; return w.kind == t.kind && w.type == t.type; } @@ -1541,8 +1551,8 @@ if (t.isCompound() || s.isCompound()) { return !t.isCompound() ? - visitIntersectionType((IntersectionClassType)s.unannotatedType(), t, true) : - visitIntersectionType((IntersectionClassType)t.unannotatedType(), s, false); + visitIntersectionType((IntersectionClassType)s, t, true) : + visitIntersectionType((IntersectionClassType)t, s, false); } if (s.hasTag(CLASS) || s.hasTag(ARRAY)) { @@ -1873,7 +1883,6 @@ case WILDCARD: return elemtype(upperBound(t)); case ARRAY: - t = t.unannotatedType(); return ((ArrayType)t).elemtype; case FORALL: return elemtype(((ForAll)t).qtype); @@ -1920,7 +1929,7 @@ if (t.hasTag(VOID) || t.hasTag(PACKAGE)) { Assert.error("Type t must not be a VOID or PACKAGE type, " + t.toString()); } - return new ArrayType(t, syms.arrayClass); + return new ArrayType(t, syms.arrayClass, Type.noAnnotations); } // @@ -1959,16 +1968,18 @@ return t; Type st = supertype(t); - if (st.hasTag(CLASS) || st.hasTag(TYPEVAR) || st.hasTag(ERROR)) { + if (st.hasTag(CLASS) || st.hasTag(TYPEVAR)) { Type x = asSuper(st, sym); if (x != null) return x; } if ((sym.flags() & INTERFACE) != 0) { for (List l = interfaces(t); l.nonEmpty(); l = l.tail) { - Type x = asSuper(l.head, sym); - if (x != null) - return x; + if (!l.head.hasTag(ERROR)) { + Type x = asSuper(l.head, sym); + if (x != null) + return x; + } } } return null; @@ -2175,56 +2186,65 @@ } private Type erasure(Type t, boolean recurse) { - if (t.isPrimitive()) + if (t.isPrimitive()) { return t; /* fast special case */ - else - return erasure.visit(t, recurse); + } else { + Type out = erasure.visit(t, recurse); + return out; + } } // where private SimpleVisitor erasure = new SimpleVisitor() { public Type visitType(Type t, Boolean recurse) { if (t.isPrimitive()) return t; /*fast special case*/ - else - return t.map(recurse ? erasureRecFun : erasureFun); + else { + final List annos = t.getAnnotationMirrors(); + Type erased = t.map(recurse ? erasureRecFun : erasureFun); + if (!annos.isEmpty()) { + erased = erased.annotatedType(annos); + } + return erased; + } } @Override public Type visitWildcardType(WildcardType t, Boolean recurse) { - return erasure(upperBound(t), recurse); + final List annos = t.getAnnotationMirrors(); + Type erased = erasure(upperBound(t), recurse); + if (!annos.isEmpty()) { + erased = erased.annotatedType(annos); + } + return erased; } @Override public Type visitClassType(ClassType t, Boolean recurse) { Type erased = t.tsym.erasure(Types.this); + List annos = t.getAnnotationMirrors(); if (recurse) { erased = new ErasedClassType(erased.getEnclosingType(),erased.tsym); } + if (!annos.isEmpty()) { + erased = erased.annotatedType(annos); + } return erased; } @Override public Type visitTypeVar(TypeVar t, Boolean recurse) { - return erasure(t.bound, recurse); + final List annos = t.getAnnotationMirrors(); + Type erased = erasure(t.bound, recurse); + if (!annos.isEmpty()) { + erased = erased.annotatedType(annos); + } + return erased; } @Override public Type visitErrorType(ErrorType t, Boolean recurse) { return t; } - - @Override - public Type visitAnnotatedType(AnnotatedType t, Boolean recurse) { - Type erased = erasure(t.unannotatedType(), recurse); - if (erased.isAnnotated()) { - // This can only happen when the underlying type is a - // type variable and the upper bound of it is annotated. - // The annotation on the type variable overrides the one - // on the bound. - erased = ((AnnotatedType)erased).unannotatedType(); - } - return erased.annotatedType(t.getAnnotationMirrors()); - } }; private Mapping erasureFun = new Mapping ("erasure") { @@ -2550,7 +2570,8 @@ public Type visitClassType(ClassType t, Void ignored) { Type outer1 = classBound(t.getEnclosingType()); if (outer1 != t.getEnclosingType()) - return new ClassType(outer1, t.getTypeArguments(), t.tsym); + return new ClassType(outer1, t.getTypeArguments(), t.tsym, + t.getAnnotationMirrors()); else return t; } @@ -2965,7 +2986,8 @@ if (typarams1 == typarams && outer1 == outer) return t; else - return new ClassType(outer1, typarams1, t.tsym); + return new ClassType(outer1, typarams1, t.tsym, + t.getAnnotationMirrors()); } else { Type st = subst(supertype(t)); List is = upperBounds(subst(interfaces(t))); @@ -2986,7 +3008,8 @@ } else { if (t.isExtendsBound() && bound.isExtendsBound()) bound = upperBound(bound); - return new WildcardType(bound, t.kind, syms.boundClass, t.bound); + return new WildcardType(bound, t.kind, syms.boundClass, + t.bound, t.getAnnotationMirrors()); } } @@ -2996,7 +3019,7 @@ if (elemtype == t.elemtype) return t; else - return new ArrayType(elemtype, t.tsym); + return new ArrayType(elemtype, t.tsym, t.getAnnotationMirrors()); } @Override @@ -3006,7 +3029,7 @@ //if 'to' types contain variables that are free in 't' List freevars = newInstances(t.tvars); t = new ForAll(freevars, - Types.this.subst(t.qtype, t.tvars, freevars)); + Types.this.subst(t.qtype, t.tvars, freevars)); } List tvars1 = substBounds(t.tvars, from, to); Type qtype1 = subst(t.qtype); @@ -3015,7 +3038,8 @@ } else if (tvars1 == t.tvars) { return new ForAll(tvars1, qtype1); } else { - return new ForAll(tvars1, Types.this.subst(qtype1, t.tvars, tvars1)); + return new ForAll(tvars1, + Types.this.subst(qtype1, t.tvars, tvars1)); } } @@ -3045,7 +3069,8 @@ ListBuffer newTvars = new ListBuffer<>(); // create new type variables without bounds for (Type t : tvars) { - newTvars.append(new TypeVar(t.tsym, null, syms.botType)); + newTvars.append(new TypeVar(t.tsym, null, syms.botType, + t.getAnnotationMirrors())); } // the new bounds should use the new type variables in place // of the old @@ -3071,7 +3096,8 @@ return t; else { // create new type variable without bounds - TypeVar tv = new TypeVar(t.tsym, null, syms.botType); + TypeVar tv = new TypeVar(t.tsym, null, syms.botType, + t.getAnnotationMirrors()); // the new bound should use the new type variable in place // of the old tv.bound = subst(bound1, List.of(t), List.of(tv)); @@ -3112,7 +3138,7 @@ return tvars1; } private static final Mapping newInstanceFun = new Mapping("newInstanceFun") { - public Type apply(Type t) { return new TypeVar(t.tsym, t.getUpperBound(), t.getLowerBound()); } + public Type apply(Type t) { return new TypeVar(t.tsym, t.getUpperBound(), t.getLowerBound(), t.getAnnotationMirrors()); } }; // @@ -3185,7 +3211,6 @@ * graph. Undefined for all but reference types. */ public int rank(Type t) { - t = t.unannotatedType(); switch(t.getTag()) { case CLASS: { ClassType cls = (ClassType)t; @@ -3267,7 +3292,7 @@ for (Type t : tvars) { if (!first) s.append(", "); first = false; - appendTyparamString(((TypeVar)t.unannotatedType()), s); + appendTyparamString(((TypeVar)t), s); } s.append('>'); return s.toString(); @@ -3439,12 +3464,14 @@ m = new WildcardType(lub(upperBound(act1.head), upperBound(act2.head)), BoundKind.EXTENDS, - syms.boundClass); + syms.boundClass, + Type.noAnnotations); mergeCache.remove(pair); } else { m = new WildcardType(syms.objectType, BoundKind.UNBOUND, - syms.boundClass); + syms.boundClass, + Type.noAnnotations); } merged.append(m.withTypeVar(typarams.head)); } @@ -3453,7 +3480,10 @@ typarams = typarams.tail; } Assert.check(act1.isEmpty() && act2.isEmpty() && typarams.isEmpty()); - return new ClassType(class1.getEnclosingType(), merged.toList(), class1.tsym); + // There is no spec detailing how type annotations are to + // be inherited. So set it to noAnnotations for now + return new ClassType(class1.getEnclosingType(), merged.toList(), + class1.tsym, Type.noAnnotations); } /** @@ -3571,7 +3601,8 @@ } } // lub(A[], B[]) is lub(A, B)[] - return new ArrayType(lub(elements), syms.arrayClass); + return new ArrayType(lub(elements), syms.arrayClass, + Type.noAnnotations); case CLASS_BOUND: // calculate lub(A, B) @@ -3932,7 +3963,6 @@ t = subst(type1, t.tsym.type.getTypeArguments(), t.getTypeArguments()); } } - t = t.unannotatedType(); ClassType cls = (ClassType)t; if (cls.isRaw() || !cls.isParameterized()) return cls; @@ -3951,9 +3981,9 @@ !currentS.isEmpty()) { if (currentS.head != currentT.head) { captured = true; - WildcardType Ti = (WildcardType)currentT.head.unannotatedType(); + WildcardType Ti = (WildcardType)currentT.head; Type Ui = currentA.head.getUpperBound(); - CapturedType Si = (CapturedType)currentS.head.unannotatedType(); + CapturedType Si = (CapturedType)currentS.head; if (Ui == null) Ui = syms.objectType; switch (Ti.kind) { @@ -3986,7 +4016,8 @@ return erasure(t); // some "rare" type involved if (captured) - return new ClassType(cls.getEnclosingType(), S, cls.tsym); + return new ClassType(cls.getEnclosingType(), S, cls.tsym, + cls.getAnnotationMirrors()); else return t; } @@ -3995,7 +4026,6 @@ ListBuffer result = new ListBuffer<>(); for (Type t : types) { if (t.hasTag(WILDCARD)) { - t = t.unannotatedType(); Type bound = ((WildcardType)t).getExtendsBound(); if (bound == null) bound = syms.objectType; @@ -4003,7 +4033,8 @@ syms.noSymbol, bound, syms.botType, - (WildcardType)t)); + (WildcardType)t, + Type.noAnnotations)); } else { result.append(t); } @@ -4089,7 +4120,7 @@ private boolean giveWarning(Type from, Type to) { List bounds = to.isCompound() ? - ((IntersectionClassType)to.unannotatedType()).getComponents() : List.of(to); + ((IntersectionClassType)to).getComponents() : List.of(to); for (Type b : bounds) { Type subFrom = asSub(from, b.tsym); if (b.isParameterized() && @@ -4354,7 +4385,7 @@ Type B(Type t) { while (t.hasTag(WILDCARD)) { - WildcardType w = (WildcardType)t.unannotatedType(); + WildcardType w = (WildcardType)t; t = high ? w.getExtendsBound() : w.getSuperBound(); @@ -4380,12 +4411,14 @@ return new WildcardType(syms.objectType, BoundKind.UNBOUND, syms.boundClass, - formal); + formal, + Type.noAnnotations); } else { return new WildcardType(bound, BoundKind.EXTENDS, syms.boundClass, - formal); + formal, + Type.noAnnotations); } } @@ -4402,12 +4435,14 @@ return new WildcardType(syms.objectType, BoundKind.UNBOUND, syms.boundClass, - formal); + formal, + Type.noAnnotations); } else { return new WildcardType(bound, BoundKind.SUPER, syms.boundClass, - formal); + formal, + Type.noAnnotations); } } @@ -4429,7 +4464,7 @@ public boolean equals(Object obj) { return (obj instanceof UniqueType) && - types.isSameAnnotatedType(type, ((UniqueType)obj).type); + types.isSameType(type, ((UniqueType)obj).type); } public String toString() { @@ -4464,8 +4499,6 @@ public R visitForAll(ForAll t, S s) { return visitType(t, s); } public R visitUndetVar(UndetVar t, S s) { return visitType(t, s); } public R visitErrorType(ErrorType t, S s) { return visitType(t, s); } - // Pretend annotations don't exist - public R visitAnnotatedType(AnnotatedType t, S s) { return visit(t.unannotatedType(), s); } } /** @@ -4596,7 +4629,6 @@ * Assemble signature of given type in string buffer. */ public void assembleSig(Type type) { - type = type.unannotatedType(); switch (type.getTag()) { case BYTE: append('B'); @@ -4693,7 +4725,6 @@ } public void assembleClassSig(Type type) { - type = type.unannotatedType(); ClassType ct = (ClassType) type; ClassSymbol c = (ClassSymbol) ct.tsym; classReference(c); diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Fri May 16 02:13:12 2014 -0700 @@ -517,6 +517,10 @@ return new ResultInfo(pkind, pt, newContext); } + protected ResultInfo dup(Type newPt, CheckContext newContext) { + return new ResultInfo(pkind, newPt, newContext); + } + @Override public String toString() { if (pt != null) { @@ -1865,8 +1869,10 @@ return new ClassType(restype.getEnclosingType(), List.of(new WildcardType(types.erasure(qualifierType), BoundKind.EXTENDS, - syms.boundClass)), - restype.tsym); + syms.boundClass, + Type.noAnnotations)), + restype.tsym, + restype.getAnnotationMirrors()); } else { return restype; } @@ -2036,7 +2042,8 @@ } else if (TreeInfo.isDiamond(tree)) { ClassType site = new ClassType(clazztype.getEnclosingType(), clazztype.tsym.type.getTypeArguments(), - clazztype.tsym); + clazztype.tsym, + clazztype.getAnnotationMirrors()); Env diamondEnv = localEnv.dup(tree); diamondEnv.info.selectSuper = cdef != null; @@ -2255,7 +2262,8 @@ owntype = elemtype; for (List l = tree.dims; l.nonEmpty(); l = l.tail) { attribExpr(l.head, localEnv, syms.intType); - owntype = new ArrayType(owntype, syms.arrayClass); + owntype = new ArrayType(owntype, syms.arrayClass, + Type.noAnnotations); } } else { // we are seeing an untyped aggregate { ... } @@ -2272,7 +2280,8 @@ } if (tree.elems != null) { attribExprs(tree.elems, localEnv, elemtype); - owntype = new ArrayType(elemtype, syms.arrayClass); + owntype = new ArrayType(elemtype, syms.arrayClass, + Type.noAnnotations); } if (!types.isReifiable(elemtype)) log.error(tree.pos(), "generic.array.creation"); @@ -2763,7 +2772,7 @@ targetError = false; } - JCDiagnostic detailsDiag = ((Resolve.ResolveError)refSym).getDiagnostic(JCDiagnostic.DiagnosticType.FRAGMENT, + JCDiagnostic detailsDiag = ((Resolve.ResolveError)refSym.baseSymbol()).getDiagnostic(JCDiagnostic.DiagnosticType.FRAGMENT, that, exprType.tsym, exprType, that.name, argtypes, typeargtypes); JCDiagnostic.DiagnosticType diagKind = targetError ? @@ -2838,7 +2847,8 @@ ResultInfo checkInfo = resultInfo.dup(newMethodTemplate( desc.getReturnType().hasTag(VOID) ? Type.noType : desc.getReturnType(), - that.kind.isUnbound() ? argtypes.tail : argtypes, typeargtypes)); + that.kind.isUnbound() ? argtypes.tail : argtypes, typeargtypes), + new FunctionalReturnContext(resultInfo.checkContext)); Type refType = checkId(that, lookupHelper.site, refSym, localEnv, checkInfo); @@ -3244,7 +3254,7 @@ if (skind == TYP) { Type elt = site; while (elt.hasTag(ARRAY)) - elt = ((ArrayType)elt.unannotatedType()).elemtype; + elt = ((ArrayType)elt).elemtype; if (elt.hasTag(TYPEVAR)) { log.error(tree.pos(), "type.var.cant.be.deref"); result = types.createErrorType(tree.type); @@ -3557,7 +3567,8 @@ normOuter = types.erasure(ownOuter); if (normOuter != ownOuter) owntype = new ClassType( - normOuter, List.nil(), owntype.tsym); + normOuter, List.nil(), owntype.tsym, + owntype.getAnnotationMirrors()); } } break; @@ -3861,7 +3872,7 @@ public void visitTypeArray(JCArrayTypeTree tree) { Type etype = attribType(tree.elemtype, env); - Type type = new ArrayType(etype, syms.arrayClass); + Type type = new ArrayType(etype, syms.arrayClass, Type.noAnnotations); result = check(tree, type, TYP, resultInfo); } @@ -3909,7 +3920,8 @@ clazzOuter = site; } } - owntype = new ClassType(clazzOuter, actuals, clazztype.tsym); + owntype = new ClassType(clazzOuter, actuals, clazztype.tsym, + clazztype.getAnnotationMirrors()); } else { if (formals.length() != 0) { log.error(tree.pos(), "wrong.number.type.args", @@ -4060,7 +4072,8 @@ : attribType(tree.inner, env); result = check(tree, new WildcardType(chk.checkRefType(tree.pos(), type), tree.kind.kind, - syms.boundClass), + syms.boundClass, + Type.noAnnotations), TYP, resultInfo); } @@ -4088,7 +4101,7 @@ public void run() { List compounds = fromAnnotations(annotations); Assert.check(annotations.size() == compounds.size()); - tree.type = tree.type.unannotatedType().annotatedType(compounds); + tree.type = tree.type.annotatedType(compounds); } }); } @@ -4470,6 +4483,7 @@ } } public void visitVarDef(final JCVariableDecl tree) { + //System.err.println("validateTypeAnnotations.visitVarDef " + tree); if (tree.sym != null && tree.sym.type != null) validateAnnotatedType(tree.vartype, tree.sym.type); scan(tree.mods); @@ -4512,6 +4526,7 @@ super.visitNewArray(tree); } public void visitClassDef(JCClassDecl tree) { + //System.err.println("validateTypeAnnotations.visitClassDef " + tree); if (sigOnly) { scan(tree.mods); scan(tree.typarams); @@ -4540,7 +4555,7 @@ * can occur. */ private void validateAnnotatedType(final JCTree errtree, final Type type) { - // System.out.println("Attr.validateAnnotatedType: " + errtree + " type: " + type); + //System.err.println("Attr.validateAnnotatedType: " + errtree + " type: " + type); if (type.isPrimitiveOrVoid()) { return; @@ -4578,8 +4593,7 @@ } } else if (enclTr.hasTag(ANNOTATED_TYPE)) { JCAnnotatedType at = (JCTree.JCAnnotatedType) enclTr; - if (enclTy == null || - enclTy.hasTag(NONE)) { + if (enclTy == null || enclTy.hasTag(NONE)) { if (at.getAnnotations().size() == 1) { log.error(at.underlyingType.pos(), "cant.type.annotate.scoping.1", at.getAnnotations().head.attribute); } else { @@ -4598,16 +4612,16 @@ } else if (enclTr.hasTag(JCTree.Tag.WILDCARD)) { JCWildcard wc = (JCWildcard) enclTr; if (wc.getKind() == JCTree.Kind.EXTENDS_WILDCARD) { - validateAnnotatedType(wc.getBound(), ((WildcardType)enclTy.unannotatedType()).getExtendsBound()); + validateAnnotatedType(wc.getBound(), ((WildcardType)enclTy).getExtendsBound()); } else if (wc.getKind() == JCTree.Kind.SUPER_WILDCARD) { - validateAnnotatedType(wc.getBound(), ((WildcardType)enclTy.unannotatedType()).getSuperBound()); + validateAnnotatedType(wc.getBound(), ((WildcardType)enclTy).getSuperBound()); } else { // Nothing to do for UNBOUND } repeat = false; } else if (enclTr.hasTag(TYPEARRAY)) { JCArrayTypeTree art = (JCArrayTypeTree) enclTr; - validateAnnotatedType(art.getType(), ((ArrayType)enclTy.unannotatedType()).getComponentType()); + validateAnnotatedType(art.getType(), ((ArrayType)enclTy).getComponentType()); repeat = false; } else if (enclTr.hasTag(TYPEUNION)) { JCTypeUnion ut = (JCTypeUnion) enclTr; diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/javac/comp/Check.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java Fri May 16 02:13:12 2014 -0700 @@ -2234,11 +2234,11 @@ if (t.hasTag(TYPEVAR) && (t.tsym.flags() & UNATTRIBUTED) != 0) return; if (seen.contains(t)) { - tv = (TypeVar)t.unannotatedType(); + tv = (TypeVar)t; tv.bound = types.createErrorType(t); log.error(pos, "cyclic.inheritance", t); } else if (t.hasTag(TYPEVAR)) { - tv = (TypeVar)t.unannotatedType(); + tv = (TypeVar)t; seen = seen.prepend(tv); for (Type b : types.getBounds(tv)) checkNonCyclic1(pos, b, seen); diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Fri May 16 02:13:12 2014 -0700 @@ -134,13 +134,18 @@ SpeculativeCache speculativeCache; DeferredType(JCExpression tree, Env env) { - super(null); + super(null, noAnnotations); this.tree = tree; this.env = attr.copyEnv(env); this.speculativeCache = new SpeculativeCache(); } @Override + public DeferredType annotatedType(List typeAnnotations) { + throw new AssertionError("Cannot annotate a deferred type"); + } + + @Override public TypeTag getTag() { return DEFERRED; } diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java Fri May 16 02:13:12 2014 -0700 @@ -373,7 +373,7 @@ List upperBounds = uv.getBounds(InferenceBound.UPPER); if (Type.containsAny(upperBounds, vars)) { TypeSymbol fresh_tvar = new TypeVariableSymbol(Flags.SYNTHETIC, uv.qtype.tsym.name, null, uv.qtype.tsym.owner); - fresh_tvar.type = new TypeVar(fresh_tvar, types.makeCompoundType(uv.getBounds(InferenceBound.UPPER)), null); + fresh_tvar.type = new TypeVar(fresh_tvar, types.makeCompoundType(uv.getBounds(InferenceBound.UPPER)), null, Type.noAnnotations); todo.append(uv); uv.inst = fresh_tvar.type; } else if (upperBounds.nonEmpty()) { @@ -1505,7 +1505,9 @@ LOWER.solve(uv, inferenceContext) : infer.syms.botType; CapturedType prevCaptured = (CapturedType)uv.qtype; - return new CapturedType(prevCaptured.tsym.name, prevCaptured.tsym.owner, upper, lower, prevCaptured.wildcard); + return new CapturedType(prevCaptured.tsym.name, prevCaptured.tsym.owner, + upper, lower, prevCaptured.wildcard, + Type.noAnnotations); } }; diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java Fri May 16 02:13:12 2014 -0700 @@ -28,7 +28,6 @@ import java.util.*; import com.sun.tools.javac.code.*; -import com.sun.tools.javac.code.Type.AnnotatedType; import com.sun.tools.javac.jvm.*; import com.sun.tools.javac.main.Option.PkgInfo; import com.sun.tools.javac.tree.*; @@ -452,7 +451,8 @@ ClassSymbol outerCacheClass = outerCacheClass(); this.mapVar = new VarSymbol(STATIC | SYNTHETIC | FINAL, varName, - new ArrayType(syms.intType, syms.arrayClass), + new ArrayType(syms.intType, syms.arrayClass, + Type.noAnnotations), outerCacheClass); enterSynthetic(pos, mapVar, outerCacheClass.members()); } @@ -493,7 +493,8 @@ syms.lengthVar); JCExpression mapVarInit = make .NewArray(make.Type(syms.intType), List.of(size), null) - .setType(new ArrayType(syms.intType, syms.arrayClass)); + .setType(new ArrayType(syms.intType, syms.arrayClass, + Type.noAnnotations)); // try { $SwitchMap$Color[red.ordinal()] = 1; } catch (java.lang.NoSuchFieldError ex) {} ListBuffer stmts = new ListBuffer<>(); @@ -1979,7 +1980,7 @@ List.of(make.Literal(INT, 0).setType(syms.intType)), null); newcache.type = new ArrayType(types.erasure(outerCacheClass.type), - syms.arrayClass); + syms.arrayClass, Type.noAnnotations); // forNameSym := java.lang.Class.forName( // String s,boolean init,ClassLoader loader) @@ -2568,7 +2569,8 @@ Name valuesName = names.fromString(target.syntheticNameChar() + "VALUES"); while (tree.sym.members().lookup(valuesName).scope != null) // avoid name clash valuesName = names.fromString(valuesName + "" + target.syntheticNameChar()); - Type arrayType = new ArrayType(types.erasure(tree.type), syms.arrayClass); + Type arrayType = new ArrayType(types.erasure(tree.type), + syms.arrayClass, Type.noAnnotations); VarSymbol valuesVar = new VarSymbol(PRIVATE|FINAL|STATIC|SYNTHETIC, valuesName, arrayType, @@ -2841,7 +2843,7 @@ tree.underlyingType = translate(tree.underlyingType); // but maintain type annotations in the type. if (tree.type.isAnnotated()) { - tree.type = tree.underlyingType.type.unannotatedType().annotatedType(tree.type.getAnnotationMirrors()); + tree.type = tree.underlyingType.type.annotatedType(tree.type.getAnnotationMirrors()); } else if (tree.underlyingType.type.isAnnotated()) { tree.type = tree.underlyingType.type; } @@ -3145,7 +3147,8 @@ JCNewArray boxedArgs = make.NewArray(make.Type(varargsElement), List.nil(), elems.toList()); - boxedArgs.type = new ArrayType(varargsElement, syms.arrayClass); + boxedArgs.type = new ArrayType(varargsElement, syms.arrayClass, + Type.noAnnotations); result.append(boxedArgs); } else { if (args.length() != 1) throw new AssertionError(args); diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java Fri May 16 02:13:12 2014 -0700 @@ -457,7 +457,8 @@ * to the symbol table. */ private void addEnumMembers(JCClassDecl tree, Env env) { - JCExpression valuesType = make.Type(new ArrayType(tree.sym.type, syms.arrayClass)); + JCExpression valuesType = make.Type(new ArrayType(tree.sym.type, syms.arrayClass, + Type.noAnnotations)); // public static T[] values() { return ???; } JCMethodDecl values = make. @@ -677,7 +678,7 @@ //because varargs is represented in the tree as a //modifier on the parameter declaration, and not as a //distinct type of array node. - ArrayType atype = (ArrayType)tree.vartype.type.unannotatedType(); + ArrayType atype = (ArrayType)tree.vartype.type; tree.vartype.type = atype.makeVarargs(); } Scope enclScope = enter.enterScope(env); @@ -1255,11 +1256,13 @@ ClassType ct = (ClassType) sym.type; Assert.check(ct.typarams_field.isEmpty()); if (n == 1) { - TypeVar v = new TypeVar(names.fromString("T"), sym, syms.botType); + TypeVar v = new TypeVar(names.fromString("T"), sym, syms.botType, + Type.noAnnotations); ct.typarams_field = ct.typarams_field.prepend(v); } else { for (int i = n; i > 0; i--) { - TypeVar v = new TypeVar(names.fromString("T" + i), sym, syms.botType); + TypeVar v = new TypeVar(names.fromString("T" + i), sym, + syms.botType, Type.noAnnotations); ct.typarams_field = ct.typarams_field.prepend(v); } } @@ -1310,8 +1313,8 @@ } Type mType = new MethodType(argtypes, null, thrown, c); Type initType = typarams.nonEmpty() ? - new ForAll(typarams, mType) : - mType; + new ForAll(typarams, mType) : + mType; MethodSymbol init = new MethodSymbol(flags, names.init, initType, c); init.params = createDefaultConstructorParams(make, baseInit, init, diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java Fri May 16 02:13:12 2014 -0700 @@ -94,7 +94,7 @@ public final boolean boxingEnabled; public final boolean varargsEnabled; public final boolean allowMethodHandles; - public final boolean allowStructuralMostSpecific; + public final boolean allowFunctionalInterfaceMostSpecific; private final boolean debugResolve; private final boolean compactMethodDiags; final EnumSet verboseResolutionMode; @@ -135,7 +135,7 @@ verboseResolutionMode = VerboseResolutionMode.getVerboseResolutionMode(options); Target target = Target.instance(context); allowMethodHandles = target.hasMethodHandles(); - allowStructuralMostSpecific = source.allowStructuralMostSpecific(); + allowFunctionalInterfaceMostSpecific = source.allowFunctionalInterfaceMostSpecific(); polymorphicSignatureScope = new Scope(syms.noSymbol); inapplicableMethodException = new InapplicableMethodException(diags); @@ -1084,50 +1084,47 @@ } public boolean compatible(Type found, Type req, Warner warn) { - if (!allowStructuralMostSpecific || actual == null) { - return super.compatible(found, req, warn); - } else { - switch (actual.getTag()) { - case DEFERRED: - DeferredType dt = (DeferredType) actual; - DeferredType.SpeculativeCache.Entry e = dt.speculativeCache.get(deferredAttrContext.msym, deferredAttrContext.phase); - return (e == null || e.speculativeTree == deferredAttr.stuckTree) - ? super.compatible(found, req, warn) : - mostSpecific(found, req, e.speculativeTree, warn); - default: - return standaloneMostSpecific(found, req, actual, warn); + if (allowFunctionalInterfaceMostSpecific && + unrelatedFunctionalInterfaces(found, req) && + (actual != null && actual.getTag() == DEFERRED)) { + DeferredType dt = (DeferredType) actual; + DeferredType.SpeculativeCache.Entry e = + dt.speculativeCache.get(deferredAttrContext.msym, deferredAttrContext.phase); + if (e != null && e.speculativeTree != deferredAttr.stuckTree) { + return functionalInterfaceMostSpecific(found, req, e.speculativeTree, warn); } } + return super.compatible(found, req, warn); } - private boolean mostSpecific(Type t, Type s, JCTree tree, Warner warn) { - MostSpecificChecker msc = new MostSpecificChecker(t, s, warn); + /** Whether {@code t} and {@code s} are unrelated functional interface types. */ + private boolean unrelatedFunctionalInterfaces(Type t, Type s) { + return types.isFunctionalInterface(t.tsym) && + types.isFunctionalInterface(s.tsym) && + types.asSuper(t, s.tsym) == null && + types.asSuper(s, t.tsym) == null; + } + + /** Parameters {@code t} and {@code s} are unrelated functional interface types. */ + private boolean functionalInterfaceMostSpecific(Type t, Type s, JCTree tree, Warner warn) { + FunctionalInterfaceMostSpecificChecker msc = new FunctionalInterfaceMostSpecificChecker(t, s, warn); msc.scan(tree); return msc.result; } - boolean polyMostSpecific(Type t1, Type t2, Warner warn) { - return (!t1.isPrimitive() && t2.isPrimitive()) - ? true : super.compatible(t1, t2, warn); - } - - boolean standaloneMostSpecific(Type t1, Type t2, Type exprType, Warner warn) { - return (exprType.isPrimitive() == t1.isPrimitive() - && exprType.isPrimitive() != t2.isPrimitive()) - ? true : super.compatible(t1, t2, warn); - } - /** - * Structural checker for most specific. + * Tests whether one functional interface type can be considered more specific + * than another unrelated functional interface type for the scanned expression. */ - class MostSpecificChecker extends DeferredAttr.PolyScanner { + class FunctionalInterfaceMostSpecificChecker extends DeferredAttr.PolyScanner { final Type t; final Type s; final Warner warn; boolean result; - MostSpecificChecker(Type t, Type s, Warner warn) { + /** Parameters {@code t} and {@code s} are unrelated functional interface types. */ + FunctionalInterfaceMostSpecificChecker(Type t, Type s, Warner warn) { this.t = t; this.s = s; this.warn = warn; @@ -1136,102 +1133,96 @@ @Override void skip(JCTree tree) { - result &= standaloneMostSpecific(t, s, tree.type, warn); + result &= false; } @Override public void visitConditional(JCConditional tree) { - if (tree.polyKind == PolyKind.STANDALONE) { - result &= standaloneMostSpecific(t, s, tree.type, warn); - } else { - super.visitConditional(tree); - } - } - - @Override - public void visitApply(JCMethodInvocation tree) { - result &= (tree.polyKind == PolyKind.STANDALONE) - ? standaloneMostSpecific(t, s, tree.type, warn) - : polyMostSpecific(t, s, warn); - } - - @Override - public void visitNewClass(JCNewClass tree) { - result &= (tree.polyKind == PolyKind.STANDALONE) - ? standaloneMostSpecific(t, s, tree.type, warn) - : polyMostSpecific(t, s, warn); + scan(tree.truepart); + scan(tree.falsepart); } @Override public void visitReference(JCMemberReference tree) { - if (types.isFunctionalInterface(t.tsym) && - types.isFunctionalInterface(s.tsym)) { - Type desc_t = types.findDescriptorType(t); - Type desc_s = types.findDescriptorType(s); - if (types.isSameTypes(desc_t.getParameterTypes(), - inferenceContext().asUndetVars(desc_s.getParameterTypes()))) { - if (types.asSuper(t, s.tsym) != null || - types.asSuper(s, t.tsym) != null) { - result &= MostSpecificCheckContext.super.compatible(t, s, warn); - } else if (!desc_s.getReturnType().hasTag(VOID)) { - //perform structural comparison - Type ret_t = desc_t.getReturnType(); - Type ret_s = desc_s.getReturnType(); - result &= ((tree.refPolyKind == PolyKind.STANDALONE) - ? standaloneMostSpecific(ret_t, ret_s, tree.sym.type.getReturnType(), warn) - : polyMostSpecific(ret_t, ret_s, warn)); - } else { - return; - } + Type desc_t = types.findDescriptorType(t); + Type desc_s = types.findDescriptorType(s); + // use inference variables here for more-specific inference (18.5.4) + if (!types.isSameTypes(desc_t.getParameterTypes(), + inferenceContext().asUndetVars(desc_s.getParameterTypes()))) { + result &= false; + } else { + // compare return types + Type ret_t = desc_t.getReturnType(); + Type ret_s = desc_s.getReturnType(); + if (ret_s.hasTag(VOID)) { + result &= true; + } else if (ret_t.hasTag(VOID)) { + result &= false; + } else if (ret_t.isPrimitive() != ret_s.isPrimitive()) { + boolean retValIsPrimitive = + tree.refPolyKind == PolyKind.STANDALONE && + tree.sym.type.getReturnType().isPrimitive(); + result &= (retValIsPrimitive == ret_t.isPrimitive()) && + (retValIsPrimitive != ret_s.isPrimitive()); + } else { + result &= MostSpecificCheckContext.super.compatible(ret_t, ret_s, warn); } - } else { - result &= false; } } @Override public void visitLambda(JCLambda tree) { - if (types.isFunctionalInterface(t.tsym) && - types.isFunctionalInterface(s.tsym)) { - Type desc_t = types.findDescriptorType(t); - Type desc_s = types.findDescriptorType(s); - if (types.isSameTypes(desc_t.getParameterTypes(), - inferenceContext().asUndetVars(desc_s.getParameterTypes()))) { - if (types.asSuper(t, s.tsym) != null || - types.asSuper(s, t.tsym) != null) { - result &= MostSpecificCheckContext.super.compatible(t, s, warn); - } else if (!desc_s.getReturnType().hasTag(VOID)) { - //perform structural comparison - Type ret_t = desc_t.getReturnType(); - Type ret_s = desc_s.getReturnType(); - scanLambdaBody(tree, ret_t, ret_s); - } else { - return; + Type desc_t = types.findDescriptorType(t); + Type desc_s = types.findDescriptorType(s); + // use inference variables here for more-specific inference (18.5.4) + if (!types.isSameTypes(desc_t.getParameterTypes(), + inferenceContext().asUndetVars(desc_s.getParameterTypes()))) { + result &= false; + } else { + // compare return types + Type ret_t = desc_t.getReturnType(); + Type ret_s = desc_s.getReturnType(); + if (ret_s.hasTag(VOID)) { + result &= true; + } else if (ret_t.hasTag(VOID)) { + result &= false; + } else if (unrelatedFunctionalInterfaces(ret_t, ret_s)) { + for (JCExpression expr : lambdaResults(tree)) { + result &= functionalInterfaceMostSpecific(ret_t, ret_s, expr, warn); } + } else if (ret_t.isPrimitive() != ret_s.isPrimitive()) { + for (JCExpression expr : lambdaResults(tree)) { + boolean retValIsPrimitive = expr.isStandalone() && expr.type.isPrimitive(); + result &= (retValIsPrimitive == ret_t.isPrimitive()) && + (retValIsPrimitive != ret_s.isPrimitive()); + } + } else { + result &= MostSpecificCheckContext.super.compatible(ret_t, ret_s, warn); } - } else { - result &= false; } } //where - void scanLambdaBody(JCLambda lambda, final Type t, final Type s) { + private List lambdaResults(JCLambda lambda) { if (lambda.getBodyKind() == JCTree.JCLambda.BodyKind.EXPRESSION) { - result &= MostSpecificCheckContext.this.mostSpecific(t, s, lambda.body, warn); + return List.of((JCExpression) lambda.body); } else { + final ListBuffer buffer = new ListBuffer<>(); DeferredAttr.LambdaReturnScanner lambdaScanner = new DeferredAttr.LambdaReturnScanner() { @Override public void visitReturn(JCReturn tree) { if (tree.expr != null) { - result &= MostSpecificCheckContext.this.mostSpecific(t, s, tree.expr, warn); + buffer.append(tree.expr); } } }; lambdaScanner.scan(lambda.body); + return buffer.toList(); } } } + } public MethodCheck mostSpecificCheck(List actuals, boolean strict) { @@ -1435,7 +1426,7 @@ return bestSoFar; } else if (useVarargs && (sym.flags() & VARARGS) == 0) { return bestSoFar.kind >= ERRONEOUS ? - new BadVarargsMethod((ResolveError)bestSoFar) : + new BadVarargsMethod((ResolveError)bestSoFar.baseSymbol()) : bestSoFar; } Assert.check(sym.kind < AMBIGUOUS); @@ -1527,14 +1518,22 @@ if (m2SignatureMoreSpecific) return m2; return ambiguityError(m1, m2); case AMBIGUOUS: - //check if m1 is more specific than all ambiguous methods in m2 + //compare m1 to ambiguous methods in m2 AmbiguityError e = (AmbiguityError)m2.baseSymbol(); + boolean m1MoreSpecificThanAnyAmbiguous = true; + boolean allAmbiguousMoreSpecificThanM1 = true; for (Symbol s : e.ambiguousSyms) { - if (mostSpecific(argtypes, m1, s, env, site, allowBoxing, useVarargs) != m1) { - return e.addAmbiguousSymbol(m1); - } + Symbol moreSpecific = mostSpecific(argtypes, m1, s, env, site, allowBoxing, useVarargs); + m1MoreSpecificThanAnyAmbiguous &= moreSpecific == m1; + allAmbiguousMoreSpecificThanM1 &= moreSpecific == s; } - return m1; + if (m1MoreSpecificThanAnyAmbiguous) + return m1; + //if m1 is more specific than some ambiguous methods, but other ambiguous methods are + //more specific than m1, add it as a new ambiguous method: + if (!allAmbiguousMoreSpecificThanM1) + e.addAmbiguousSymbol(m1); + return e; default: throw new AssertionError(); } @@ -2195,7 +2194,7 @@ List typeargtypes, LogResolveHelper logResolveHelper) { if (sym.kind >= AMBIGUOUS) { - ResolveError errSym = (ResolveError)sym; + ResolveError errSym = (ResolveError)sym.baseSymbol(); sym = errSym.access(name, qualified ? site.tsym : syms.noSymbol); argtypes = logResolveHelper.getArgumentTypes(errSym, sym, name, argtypes); if (logResolveHelper.resolveDiagnosticNeeded(site, argtypes, typeargtypes)) { @@ -2584,7 +2583,7 @@ sym = super.access(env, pos, location, sym); } else { final JCDiagnostic details = sym.kind == WRONG_MTH ? - ((InapplicableSymbolError)sym).errCandidate().snd : + ((InapplicableSymbolError)sym.baseSymbol()).errCandidate().snd : null; sym = new InapplicableSymbolError(sym.kind, "diamondError", currentResolutionContext) { @Override @@ -2631,7 +2630,7 @@ ((ForAll)sym.type).tvars : List.nil(); Type constrType = new ForAll(site.tsym.type.getTypeArguments().appendList(oldParams), - types.createMethodTypeWithReturn(sym.type.asMethodType(), site)); + types.createMethodTypeWithReturn(sym.type.asMethodType(), site)); MethodSymbol newConstr = new MethodSymbol(sym.flags(), names.init, constrType, site.tsym) { @Override public Symbol baseSymbol() { @@ -2992,12 +2991,12 @@ return true; case WRONG_MTH: InapplicableSymbolError errSym = - (InapplicableSymbolError)s; + (InapplicableSymbolError)s.baseSymbol(); return new Template(MethodCheckDiag.ARITY_MISMATCH.regex()) .matches(errSym.errCandidate().snd); case WRONG_MTHS: InapplicableSymbolsError errSyms = - (InapplicableSymbolsError)s; + (InapplicableSymbolsError)s.baseSymbol(); return errSyms.filterCandidates(errSyms.mapCandidates()).isEmpty(); case WRONG_STATICNESS: return false; @@ -3272,7 +3271,7 @@ List typeargtypes, MethodResolutionPhase maxPhase) { super(referenceTree, names.init, site, argtypes, typeargtypes, maxPhase); if (site.isRaw()) { - this.site = new ClassType(site.getEnclosingType(), site.tsym.type.getTypeArguments(), site.tsym); + this.site = new ClassType(site.getEnclosingType(), site.tsym.type.getTypeArguments(), site.tsym, site.getAnnotationMirrors()); needsInference = true; } } diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java Fri May 16 02:13:12 2014 -0700 @@ -624,18 +624,18 @@ case '+': { sigp++; Type t = sigToType(); - return new WildcardType(t, BoundKind.EXTENDS, - syms.boundClass); + return new WildcardType(t, BoundKind.EXTENDS, syms.boundClass, + Type.noAnnotations); } case '*': sigp++; return new WildcardType(syms.objectType, BoundKind.UNBOUND, - syms.boundClass); + syms.boundClass, Type.noAnnotations); case '-': { sigp++; Type t = sigToType(); - return new WildcardType(t, BoundKind.SUPER, - syms.boundClass); + return new WildcardType(t, BoundKind.SUPER, syms.boundClass, + Type.noAnnotations); } case 'B': sigp++; @@ -680,7 +680,8 @@ return syms.booleanType; case '[': sigp++; - return new ArrayType(sigToType(), syms.arrayClass); + return new ArrayType(sigToType(), syms.arrayClass, + Type.noAnnotations); case '(': sigp++; List argtypes = sigToTypes(')'); @@ -735,7 +736,8 @@ try { return (outer == Type.noType) ? t.erasure(types) : - new ClassType(outer, List.nil(), t); + new ClassType(outer, List.nil(), t, + Type.noAnnotations); } finally { sbp = startSbp; } @@ -745,7 +747,8 @@ ClassSymbol t = syms.enterClass(names.fromUtf(signatureBuffer, startSbp, sbp - startSbp)); - outer = new ClassType(outer, sigToTypes('>'), t) { + outer = new ClassType(outer, sigToTypes('>'), t, + Type.noAnnotations) { boolean completed = false; @Override public Type getEnclosingType() { @@ -808,7 +811,8 @@ t = syms.enterClass(names.fromUtf(signatureBuffer, startSbp, sbp - startSbp)); - outer = new ClassType(outer, List.nil(), t); + outer = new ClassType(outer, List.nil(), t, + Type.noAnnotations); } signatureBuffer[sbp++] = (byte)'$'; continue; @@ -871,7 +875,8 @@ Name name = names.fromUtf(signature, start, sigp - start); TypeVar tvar; if (sigEnterPhase) { - tvar = new TypeVar(name, currentOwner, syms.botType); + tvar = new TypeVar(name, currentOwner, syms.botType, + Type.noAnnotations); typevars.enter(tvar.tsym); } else { tvar = (TypeVar)findTypeVar(name); @@ -910,7 +915,8 @@ // we don't know for sure if this owner is correct. It could // be a method and there is no way to tell before reading the // enclosing method attribute. - TypeVar t = new TypeVar(name, currentOwner, syms.botType); + TypeVar t = new TypeVar(name, currentOwner, syms.botType, + Type.noAnnotations); missingTypeVariables = missingTypeVariables.prepend(t); // System.err.println("Missing type var " + name); return t; @@ -1534,35 +1540,41 @@ // local variable case LOCAL_VARIABLE: { final int table_length = nextChar(); - final TypeAnnotationPosition position = - TypeAnnotationPosition.localVariable(readTypePath()); - - position.lvarOffset = new int[table_length]; - position.lvarLength = new int[table_length]; - position.lvarIndex = new int[table_length]; + final int[] newLvarOffset = new int[table_length]; + final int[] newLvarLength = new int[table_length]; + final int[] newLvarIndex = new int[table_length]; for (int i = 0; i < table_length; ++i) { - position.lvarOffset[i] = nextChar(); - position.lvarLength[i] = nextChar(); - position.lvarIndex[i] = nextChar(); + newLvarOffset[i] = nextChar(); + newLvarLength[i] = nextChar(); + newLvarIndex[i] = nextChar(); } + + final TypeAnnotationPosition position = + TypeAnnotationPosition.localVariable(readTypePath()); + position.lvarOffset = newLvarOffset; + position.lvarLength = newLvarLength; + position.lvarIndex = newLvarIndex; return position; } // resource variable case RESOURCE_VARIABLE: { final int table_length = nextChar(); - final TypeAnnotationPosition position = - TypeAnnotationPosition.resourceVariable(readTypePath()); - - position.lvarOffset = new int[table_length]; - position.lvarLength = new int[table_length]; - position.lvarIndex = new int[table_length]; + final int[] newLvarOffset = new int[table_length]; + final int[] newLvarLength = new int[table_length]; + final int[] newLvarIndex = new int[table_length]; for (int i = 0; i < table_length; ++i) { - position.lvarOffset[i] = nextChar(); - position.lvarLength[i] = nextChar(); - position.lvarIndex[i] = nextChar(); + newLvarOffset[i] = nextChar(); + newLvarLength[i] = nextChar(); + newLvarIndex[i] = nextChar(); } + + final TypeAnnotationPosition position = + TypeAnnotationPosition.resourceVariable(readTypePath()); + position.lvarOffset = newLvarOffset; + position.lvarLength = newLvarLength; + position.lvarIndex = newLvarIndex; return position; } // exception parameter diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java Fri May 16 02:13:12 2014 -0700 @@ -286,7 +286,6 @@ */ @Override public void assembleSig(Type type) { - type = type.unannotatedType(); switch (type.getTag()) { case UNINITIALIZED_THIS: case UNINITIALIZED_OBJECT: @@ -354,7 +353,7 @@ } else if (t.hasTag(ARRAY)) { return typeSig(types.erasure(t)); } else { - throw new AssertionError("xClassName"); + throw new AssertionError("xClassName expects class or array type, got " + t); } } diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java Fri May 16 02:13:12 2014 -0700 @@ -928,7 +928,7 @@ if (o instanceof Pool.MethodHandle) return syms.methodHandleType; if (o instanceof UniqueType) return typeForPool(((UniqueType)o).type); if (o instanceof Type) { - Type ty = ((Type)o).unannotatedType(); + Type ty = (Type) o; if (ty instanceof Type.ArrayType) return syms.classType; if (ty instanceof Type.MethodType) return syms.methodTypeType; @@ -1579,8 +1579,8 @@ /** Add a catch clause to code. */ - public void addCatch( - char startPc, char endPc, char handlerPc, char catchType) { + public void addCatch(char startPc, char endPc, + char handlerPc, char catchType) { catchInfo.append(new char[]{startPc, endPc, handlerPc, catchType}); } @@ -2149,7 +2149,7 @@ for (Attribute.TypeCompound ta : lv.sym.getRawTypeAttributes()) { TypeAnnotationPosition p = ta.position; if (p.hasCatchType()) { - final int idx = findExceptionIndex(p.getCatchType()); + final int idx = findExceptionIndex(p); if (idx == -1) Assert.error("Could not find exception index for type annotation " + ta + " on exception parameter"); @@ -2159,14 +2159,17 @@ } } - private int findExceptionIndex(int catchType) { + private int findExceptionIndex(TypeAnnotationPosition p) { + final int catchType = p.getCatchType(); + final int startPos = p.getStartPos(); + final int len = catchInfo.length(); List iter = catchInfo.toList(); - int len = catchInfo.length(); for (int i = 0; i < len; ++i) { char[] catchEntry = iter.head; iter = iter.tail; - char ct = catchEntry[3]; - if (catchType == ct) { + int ct = catchEntry[3]; + int sp = catchEntry[0]; + if (catchType == ct && sp == startPos) { return i; } } diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java Fri May 16 02:13:12 2014 -0700 @@ -317,10 +317,6 @@ int makeRef(DiagnosticPosition pos, Type type) { checkDimension(pos, type); if (type.isAnnotated()) { - // Treat annotated types separately - we don't want - // to collapse all of them - at least for annotated - // exceptions. - // TODO: review this. return pool.put((Object)type); } else { return pool.put(type.hasTag(CLASS) ? (Object)type.tsym : (Object)type); @@ -1647,7 +1643,7 @@ if (subCatch.type.isAnnotated()) { for (Attribute.TypeCompound tc : subCatch.type.getAnnotationMirrors()) { - tc.position.setCatchType(catchType); + tc.position.setCatchInfo(catchType, startpc); } } } @@ -1664,7 +1660,7 @@ if (subCatch.type.isAnnotated()) { for (Attribute.TypeCompound tc : subCatch.type.getAnnotationMirrors()) { - tc.position.setCatchType(catchType); + tc.position.setCatchInfo(catchType, startpc); } } } diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/javac/jvm/JNIWriter.java --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/JNIWriter.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/JNIWriter.java Fri May 16 02:13:12 2014 -0700 @@ -674,11 +674,6 @@ } @Override - public R visitAnnotatedType(Type.AnnotatedType t, P p) { - return defaultAction(t, p); - } - - @Override public R visitType(Type t, P p) { return defaultAction(t, p); } diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/javac/jvm/Pool.java --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/Pool.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/Pool.java Fri May 16 02:13:12 2014 -0700 @@ -102,10 +102,11 @@ */ public int put(Object value) { value = makePoolValue(value); -// assert !(value instanceof Type.TypeVar); + Assert.check(!(value instanceof Type.TypeVar)); + Assert.check(!(value instanceof Types.UniqueType && + ((UniqueType) value).type instanceof Type.TypeVar)); Integer index = indices.get(value); if (index == null) { -// System.err.println("put " + value + " " + value.getClass());//DEBUG index = pp; indices.put(value, index); pool = ArrayUtils.ensureCapacity(pool, pp); diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/javac/jvm/UninitializedType.java --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/UninitializedType.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/UninitializedType.java Fri May 16 02:13:12 2014 -0700 @@ -26,6 +26,7 @@ package com.sun.tools.javac.jvm; import com.sun.tools.javac.code.*; +import com.sun.tools.javac.util.List; import static com.sun.tools.javac.code.TypeTag.UNINITIALIZED_OBJECT; import static com.sun.tools.javac.code.TypeTag.UNINITIALIZED_THIS; @@ -41,19 +42,27 @@ class UninitializedType extends Type.DelegatedType { public static UninitializedType uninitializedThis(Type qtype) { - return new UninitializedType(UNINITIALIZED_THIS, qtype, -1); + return new UninitializedType(UNINITIALIZED_THIS, qtype, -1, + qtype.getAnnotationMirrors()); } public static UninitializedType uninitializedObject(Type qtype, int offset) { - return new UninitializedType(UNINITIALIZED_OBJECT, qtype, offset); + return new UninitializedType(UNINITIALIZED_OBJECT, qtype, offset, + qtype.getAnnotationMirrors()); } public final int offset; // PC where allocation took place - private UninitializedType(TypeTag tag, Type qtype, int offset) { - super(tag, qtype); + private UninitializedType(TypeTag tag, Type qtype, int offset, + List typeAnnotations) { + super(tag, qtype, typeAnnotations); this.offset = offset; } + @Override + public UninitializedType annotatedType(List typeAnnotations) { + return new UninitializedType(tag, qtype, offset, typeAnnotations); + } + Type initializedType() { return qtype; } diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java --- a/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java Fri May 16 02:13:12 2014 -0700 @@ -35,9 +35,6 @@ import java.util.Queue; import java.util.ResourceBundle; import java.util.Set; -import java.util.logging.Handler; -import java.util.logging.Level; -import java.util.logging.Logger; import javax.annotation.processing.Processor; import javax.lang.model.SourceVersion; @@ -1292,11 +1289,16 @@ * Perform dataflow checks on an attributed parse tree. */ protected void flow(Env env, Queue> results) { + if (compileStates.isDone(env, CompileState.FLOW)) { + results.add(env); + return; + } + try { if (shouldStop(CompileState.FLOW)) return; - if (relax || compileStates.isDone(env, CompileState.FLOW)) { + if (relax) { results.add(env); return; } diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/javac/model/JavacTypes.java --- a/langtools/src/share/classes/com/sun/tools/javac/model/JavacTypes.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javac/model/JavacTypes.java Fri May 16 02:13:12 2014 -0700 @@ -168,7 +168,8 @@ case PACKAGE: throw new IllegalArgumentException(componentType.toString()); } - return new Type.ArrayType((Type) componentType, syms.arrayClass); + return new Type.ArrayType((Type) componentType, syms.arrayClass, + Type.noAnnotations); } public WildcardType getWildcardType(TypeMirror extendsBound, @@ -193,7 +194,8 @@ case DECLARED: case ERROR: case TYPEVAR: - return new Type.WildcardType(bound, bkind, syms.boundClass); + return new Type.WildcardType(bound, bkind, syms.boundClass, + Type.noAnnotations); default: throw new IllegalArgumentException(bound.toString()); } @@ -243,7 +245,8 @@ } // TODO: Would like a way to check that type args match formals. - return (DeclaredType) new Type.ClassType(outer, targs.toList(), sym); + return (DeclaredType) new Type.ClassType(outer, targs.toList(), sym, + Type.noAnnotations); } /** diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java --- a/langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java Fri May 16 02:13:12 2014 -0700 @@ -1089,7 +1089,8 @@ for (ClassSymbol cs : symtab.classes.values()) { if (cs.classfile != null || cs.kind == Kinds.ERR) { cs.reset(); - cs.type = new ClassType(cs.type.getEnclosingType(), null, cs); + cs.type = new ClassType(cs.type.getEnclosingType(), + null, cs, Type.noAnnotations); if (cs.completer == null) { cs.completer = initialCompleter; } diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java --- a/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java Fri May 16 02:13:12 2014 -0700 @@ -643,6 +643,9 @@ super.setPos(pos); return this; } + + public boolean isPoly() { return false; } + public boolean isStandalone() { return true; } } /** @@ -663,6 +666,9 @@ /** is this poly expression a 'true' poly expression? */ public PolyKind polyKind; + + @Override public boolean isPoly() { return polyKind == PolyKind.POLY; } + @Override public boolean isStandalone() { return polyKind == PolyKind.STANDALONE; } } /** diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/javadoc/AnnotatedTypeImpl.java --- a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotatedTypeImpl.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotatedTypeImpl.java Fri May 16 02:13:12 2014 -0700 @@ -65,7 +65,7 @@ @Override public com.sun.javadoc.Type underlyingType() { - return TypeMaker.getType(env, type.unannotatedType(), true, false); + return TypeMaker.getType(env, type, true, false); } @Override diff -r dca843327b90 -r 97e9abb0864b langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java --- a/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java Fri May 16 02:13:12 2014 -0700 @@ -140,9 +140,6 @@ */ static String getTypeString(DocEnv env, Type t, boolean full) { // TODO: should annotations be included here? - if (t.isAnnotated()) { - t = t.unannotatedType(); - } switch (t.getTag()) { case ARRAY: StringBuilder s = new StringBuilder(); diff -r dca843327b90 -r 97e9abb0864b langtools/test/Makefile --- a/langtools/test/Makefile Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/Makefile Fri May 16 02:13:12 2014 -0700 @@ -186,6 +186,12 @@ JTREG_OPTIONS += -timeoutFactor:$(JTREG_TIMEOUT_FACTOR) endif +# Default verbosity setting for jtreg +JTREG_VERBOSE = fail,error,nopass + +# Default verbosity setting for jck +JCK_VERBOSE = non-pass + # Assertions: some tests show failures when assertions are enabled. # Since javac is typically loaded via the bootclassloader (either via TESTJAVA # or TESTBOOTCLASSPATH), you may need -esa to enable assertions in javac. @@ -256,6 +262,8 @@ # Version of java used to run jtreg. Should normally be the same as TESTJAVA # TESTJAVA # Version of java to be tested. +# JTREG_VERBOSE +# Verbosity setting for jtreg # JTREG_OPTIONS # Additional options for jtreg # JTREG_TESTDIRS @@ -273,7 +281,7 @@ JT_JAVA=$(JT_JAVA) $(JTREG) \ -J-Xmx512m \ -vmoption:-Xmx768m \ - -a -ignore:quiet -v:fail,error,nopass \ + -a -ignore:quiet $(if $(JTREG_VERBOSE),-v:$(JTREG_VERBOSE)) \ -r:$(JTREG_OUTPUT_DIR)/JTreport \ -w:$(JTREG_OUTPUT_DIR)/JTwork \ -jdk:$(TESTJAVA) \ @@ -312,6 +320,8 @@ # Default is JDK 7 # TESTJAVA # Version of java to be tested. +# JCK_VERBOSE +# Verbosity setting for jtjck # JCK_COMPILER_OPTIONS # Additional options for JCK-compiler # JCK_COMPILER_TESTDIRS @@ -325,9 +335,9 @@ @rm -f -r $(JCK_COMPILER_OUTPUT_DIR)/work $(JCK_COMPILER_OUTPUT_DIR)/report \ $(JCK_COMPILER_OUTPUT_DIR)/diff.html $(JCK_COMPILER_OUTPUT_DIR)/status.txt @mkdir -p $(JCK_COMPILER_OUTPUT_DIR) - $(JT_JAVA)/bin/java -XX:MaxPermSize=256m -Xmx512m \ + $(JT_JAVA)/bin/java -Xmx512m \ -jar $(JCK_HOME)/JCK-compiler-8/lib/jtjck.jar \ - -v:non-pass \ + $(if $(JCK_VERBOSE),-v:$(JCK_VERBOSE)) \ -r:$(JCK_COMPILER_OUTPUT_DIR)/report \ -w:$(JCK_COMPILER_OUTPUT_DIR)/work \ -jdk:$(TESTJAVA) \ @@ -361,6 +371,8 @@ # Version of java used to run JCK. Should normally be the same as TESTJAVA # TESTJAVA # Version of java to be tested. +# JCK_VERBOSE +# Verbosity setting for jtjck # JCK_RUNTIME_OPTIONS # Additional options for JCK-runtime # JCK_RUNTIME_TESTDIRS @@ -374,9 +386,9 @@ @rm -f -r $(JCK_RUNTIME_OUTPUT_DIR)/work $(JCK_RUNTIME_OUTPUT_DIR)/report \ $(JCK_RUNTIME_OUTPUT_DIR)/diff.html $(JCK_RUNTIME_OUTPUT_DIR)/status.txt @mkdir -p $(JCK_RUNTIME_OUTPUT_DIR) - $(JT_JAVA)/bin/java -XX:MaxPermSize=256m -Xmx512m \ + $(JT_JAVA)/bin/java -Xmx512m \ -jar $(JCK_HOME)/JCK-runtime-8/lib/jtjck.jar \ - -v:non-pass \ + $(if $(JCK_VERBOSE),-v:$(JCK_VERBOSE)) \ -r:$(JCK_RUNTIME_OUTPUT_DIR)/report \ -w:$(JCK_RUNTIME_OUTPUT_DIR)/work \ -jdk:$(TESTJAVA) \ diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/5093723/T5093723.java --- a/langtools/test/com/sun/javadoc/5093723/T5093723.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/5093723/T5093723.java Fri May 16 02:13:12 2014 -0700 @@ -25,23 +25,24 @@ * @test * @bug 5093723 * @summary REGRESSION: ClassCastException in SingleIndexWriter - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build T5093723 * @run main T5093723 */ public class T5093723 extends JavadocTester { - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR + ".out", "-Xdoclint:none", - SRC_DIR + "/DocumentedClass.java", - SRC_DIR + "/UndocumentedClass.java" - }; + public static void main(String... args) throws Exception { + T5093723 tester = new T5093723(); + tester.runTests(); + } - public static void main(String... args) { - T5093723 tester = new T5093723(); - if (tester.runJavadoc(ARGS) != 0) - throw new AssertionError("non-zero return code from javadoc"); + @Test + void test() { + javadoc("-d", "out", + "-Xdoclint:none", + testSrc("DocumentedClass.java"), + testSrc("UndocumentedClass.java")); + checkExit(Exit.OK); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/AccessAsciiArt/AccessAsciiArt.java --- a/langtools/test/com/sun/javadoc/AccessAsciiArt/AccessAsciiArt.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/AccessAsciiArt/AccessAsciiArt.java Fri May 16 02:13:12 2014 -0700 @@ -26,142 +26,31 @@ * @bug 4706779 4956908 * @summary Add text equivalent of class tree ASCII art for accessibility * @author dkramer + * @library ../lib + * @build JavadocTester * @run main AccessAsciiArt */ - -import com.sun.javadoc.*; -import java.util.*; -import java.io.*; - - -/** - * Runs javadoc and runs regression tests on the resulting HTML. - * It reads each file, complete with newlines, into a string to easily - * find strings that contain newlines. - */ -public class AccessAsciiArt { - - private static final String BUGID = "4706779-4956908"; - private static final String BUGNAME = "AccessAsciiArt"; - private static final String TMPDEST_DIR1 = "./docs1/"; - private static final String TMPDEST_DIR2 = "./docs2/"; +public class AccessAsciiArt extends JavadocTester { - // Subtest number. Needed because runResultsOnHTML is run twice, - // and subtestNum should increment across subtest runs. - public static int subtestNum = 0; - public static int numSubtestsPassed = 0; - - // Entry point - public static void main(String[] args) { - - // Directory that contains source files that javadoc runs on - String srcdir = System.getProperty("test.src", "."); - - // Test for all cases except the split index page - runJavadoc(new String[] {"-d", TMPDEST_DIR1, - "-sourcepath", srcdir, - "p1", "p1.subpkg"}); - runTestsOnHTML(testArray); - - printSummary(); - } - - /** Run javadoc */ - public static void runJavadoc(String[] javadocArgs) { - if (com.sun.tools.javadoc.Main.execute(javadocArgs) != 0) { - throw new Error("Javadoc failed to execute"); - } + public static void main(String... args) throws Exception { + AccessAsciiArt tester = new AccessAsciiArt(); + tester.runTests(); } - /** - * Assign value for [ stringToFind, filename ] - * NOTE: The standard doclet uses the same separator "\n" for all OS's - */ - private static final String[][] testArray = { - - // Test the top line of the class tree - { -"
  • p1.C
  • ", - TMPDEST_DIR1 + "p1/subpkg/SSC.html" }, - - // Test the second line of the class tree - { -"
  • p1.SC
  • ", - TMPDEST_DIR1 + "p1/subpkg/SSC.html" }, - - // Test the third line of the class tree - { -"
  • p1.subpkg.SSC
  • ", - TMPDEST_DIR1 + "p1/subpkg/SSC.html" }, - - }; - - public static void runTestsOnHTML(String[][] testArray) { - - for (int i = 0; i < testArray.length; i++) { - - subtestNum += 1; - - // Read contents of file into a string - String fileString = readFileToString(testArray[i][1]); - - // Get string to find - String stringToFind = testArray[i][0]; + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "p1", "p1.subpkg"); + checkExit(Exit.OK); - // Find string in file's contents - if (findString(fileString, stringToFind) == -1) { - System.out.println("\nSub-test " + (subtestNum) - + " for bug " + BUGID + " (" + BUGNAME + ") FAILED\n" - + "when searching for:\n" - + stringToFind); - } else { - numSubtestsPassed += 1; - System.out.println("\nSub-test " + (subtestNum) + " passed:\n" + stringToFind); - } - } - } - - public static void printSummary() { - if ( numSubtestsPassed == subtestNum ) { - System.out.println("\nAll " + numSubtestsPassed + " subtests passed"); - } else { - throw new Error("\n" + (subtestNum - numSubtestsPassed) + " of " + (subtestNum) - + " subtests failed for bug " + BUGID + " (" + BUGNAME + ")\n"); - } - } - - // Read the file into a String - public static String readFileToString(String filename) { - try { - File file = new File(filename); - if ( !file.exists() ) { - System.out.println("\nFILE DOES NOT EXIST: " + filename); - } - BufferedReader in = new BufferedReader(new FileReader(file)); - - // Create an array of characters the size of the file - char[] allChars = new char[(int)file.length()]; - - // Read the characters into the allChars array - in.read(allChars, 0, (int)file.length()); - in.close(); - - // Convert to a string - String allCharsString = new String(allChars); - - return allCharsString; - - } catch (FileNotFoundException e) { - System.err.println(e); - return ""; - } catch (IOException e) { - System.err.println(e); - return ""; - } - } - - public static int findString(String fileString, String stringToFind) { - return fileString.indexOf(stringToFind); + checkOutput("p1/subpkg/SSC.html", true, + // Test the top line of the class tree + "
  • p1.C
  • ", + // Test the second line of the class tree + "
  • p1.SC
  • ", + // Test the third line of the class tree + "
  • p1.subpkg.SSC
  • "); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/AccessFrameTitle/AccessFrameTitle.java --- a/langtools/test/com/sun/javadoc/AccessFrameTitle/AccessFrameTitle.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/AccessFrameTitle/AccessFrameTitle.java Fri May 16 02:13:12 2014 -0700 @@ -26,141 +26,32 @@ * @bug 4636655 * @summary Add title attribute to tags for accessibility * @author dkramer + * @library ../lib + * @build JavadocTester * @run main AccessFrameTitle */ - -import com.sun.javadoc.*; -import java.util.*; -import java.io.*; - - -/** - * Runs javadoc and runs regression tests on the resulting HTML. - * It reads each file, complete with newlines, into a string to easily - * find strings that contain newlines. - */ -public class AccessFrameTitle { - - private static final String BUGID = "4636655"; - private static final String BUGNAME = "AccessFrameTitle"; - private static final String TMPDEST_DIR1 = "./docs1/"; - private static final String TMPDEST_DIR2 = "./docs2/"; +public class AccessFrameTitle extends JavadocTester { - // Subtest number. Needed because runResultsOnHTML is run twice, - // and subtestNum should increment across subtest runs. - public static int subtestNum = 0; - public static int numSubtestsPassed = 0; - - // Entry point - public static void main(String[] args) { - - // Directory that contains source files that javadoc runs on - String srcdir = System.getProperty("test.src", "."); - - // Test for all cases except the split index page - runJavadoc(new String[] {"-d", TMPDEST_DIR1, - "-sourcepath", srcdir, - "p1", "p2"}); - runTestsOnHTML(testArray); - - printSummary(); - } - - /** Run javadoc */ - public static void runJavadoc(String[] javadocArgs) { - if (com.sun.tools.javadoc.Main.execute(javadocArgs) != 0) { - throw new Error("Javadoc failed to execute"); - } + public static void main(String... args) throws Exception { + AccessFrameTitle tester = new AccessFrameTitle(); + tester.runTests(); } - /** - * Assign value for [ stringToFind, filename ] - * NOTE: The standard doclet uses the same separator "\n" for all OS's - */ - private static final String[][] testArray = { - - // Testing only for the presence of the title attributes. - // To make this test more robust, only - // the initial part of each title string is tested for, - // in case the ending part of the string later changes - - { "title=\"All classes and interfaces (except non-static nested types)\"", - TMPDEST_DIR1 + "index.html" }, - - { "title=\"All Packages\"", - TMPDEST_DIR1 + "index.html" }, - - { "title=\"Package, class and interface descriptions\"", - TMPDEST_DIR1 + "index.html" }, - - }; - - public static void runTestsOnHTML(String[][] testArray) { - - for (int i = 0; i < testArray.length; i++) { - - subtestNum += 1; - - // Read contents of file into a string - String fileString = readFileToString(testArray[i][1]); - - // Get string to find - String stringToFind = testArray[i][0]; + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "p1", "p2"); + checkExit(Exit.OK); - // Find string in file's contents - if (findString(fileString, stringToFind) == -1) { - System.out.println("\nSub-test " + (subtestNum) - + " for bug " + BUGID + " (" + BUGNAME + ") FAILED\n" - + "when searching for:\n" - + stringToFind); - } else { - numSubtestsPassed += 1; - System.out.println("\nSub-test " + (subtestNum) + " passed:\n" + stringToFind); - } - } - } - - public static void printSummary() { - if ( numSubtestsPassed == subtestNum ) { - System.out.println("\nAll " + numSubtestsPassed + " subtests passed"); - } else { - throw new Error("\n" + (subtestNum - numSubtestsPassed) + " of " + (subtestNum) - + " subtests failed for bug " + BUGID + " (" + BUGNAME + ")\n"); - } - } - - // Read the file into a String - public static String readFileToString(String filename) { - try { - File file = new File(filename); - if ( !file.exists() ) { - System.out.println("\nFILE DOES NOT EXIST: " + filename); - } - BufferedReader in = new BufferedReader(new FileReader(file)); - - // Create an array of characters the size of the file - char[] allChars = new char[(int)file.length()]; - - // Read the characters into the allChars array - in.read(allChars, 0, (int)file.length()); - in.close(); - - // Convert to a string - String allCharsString = new String(allChars); - - return allCharsString; - - } catch (FileNotFoundException e) { - System.err.println(e); - return ""; - } catch (IOException e) { - System.err.println(e); - return ""; - } - } - - public static int findString(String fileString, String stringToFind) { - return fileString.indexOf(stringToFind); + // Testing only for the presence of the title attributes. + // To make this test more robust, only + // the initial part of each title string is tested for, + // in case the ending part of the string later changes + checkOutput("index.html", true, + "title=\"All classes and interfaces (except non-static nested types)\"", + "title=\"All Packages\"", + "title=\"Package, class and interface descriptions\""); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/AccessH1/AccessH1.java --- a/langtools/test/com/sun/javadoc/AccessH1/AccessH1.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/AccessH1/AccessH1.java Fri May 16 02:13:12 2014 -0700 @@ -26,141 +26,35 @@ * @bug 4636667 7052425 8016549 * @summary Use , and

    in proper sequence for accessibility * @author dkramer + * @library ../lib + * @build JavadocTester * @run main AccessH1 */ -import com.sun.javadoc.*; -import java.util.*; -import java.io.*; - - -/** - * Runs javadoc and runs regression tests on the resulting HTML. - * It reads each file, complete with newlines, into a string to easily - * find strings that contain newlines. - */ -public class AccessH1 { - - protected static final String NL = System.getProperty("line.separator"); - - private static final String BUGID = "4636667-7052425"; - private static final String BUGNAME = "AccessH1"; - private static final String TMPDEST_DIR1 = "./docs1/"; - private static final String TMPDEST_DIR2 = "./docs2/"; +public class AccessH1 extends JavadocTester { - // Subtest number. Needed because runResultsOnHTML is run twice, - // and subtestNum should increment across subtest runs. - public static int subtestNum = 0; - public static int numSubtestsPassed = 0; - - // Entry point - public static void main(String[] args) { - - // Directory that contains source files that javadoc runs on - String srcdir = System.getProperty("test.src", "."); - - // Test for all cases except the split index page - runJavadoc(new String[] {"-d", TMPDEST_DIR1, - "-doctitle", "Document Title", - "-sourcepath", srcdir, - "p1", "p2"}); - runTestsOnHTML(testArray); - - printSummary(); - } - - /** Run javadoc */ - public static void runJavadoc(String[] javadocArgs) { - if (com.sun.tools.javadoc.Main.execute(javadocArgs) != 0) { - throw new Error("Javadoc failed to execute"); - } + public static void main(String... args) throws Exception { + AccessH1 tester = new AccessH1(); + tester.runTests(); } - /** - * Assign value for [ stringToFind, filename ] - * NOTE: The standard doclet uses the same separator "\n" for all OS's - */ - private static final String[][] testArray = { - // Test the style sheet - { - "h1 {\n" + - " font-size:20px;\n" + - "}", - TMPDEST_DIR1 + "stylesheet.css" - }, - // Test the doc title in the overview page - { - "

    Document Title

    ", - TMPDEST_DIR1 + "overview-summary.html" - } - }; - - public static void runTestsOnHTML(String[][] testArray) { - - for (int i = 0; i < testArray.length; i++) { - - subtestNum += 1; - - // Read contents of file into a string - String fileString = readFileToString(testArray[i][1]); - - // Get string to find - String stringToFind = testArray[i][0]; + @Test + void test() { + javadoc("-d", "out", + "-doctitle", "Document Title", + "-sourcepath", testSrc, + "p1", "p2"); + checkExit(Exit.OK); - // Find string in file's contents - if (findString(fileString, stringToFind) == -1) { - System.out.println("\nSub-test " + (subtestNum) - + " for bug " + BUGID + " (" + BUGNAME + ") FAILED\n" - + "when searching for:\n" - + stringToFind); - } else { - numSubtestsPassed += 1; - System.out.println("\nSub-test " + (subtestNum) + " passed:\n" + stringToFind); - } - } - } - - public static void printSummary() { - if ( numSubtestsPassed == subtestNum ) { - System.out.println("\nAll " + numSubtestsPassed + " subtests passed"); - } else { - throw new Error("\n" + (subtestNum - numSubtestsPassed) + " of " + (subtestNum) - + " subtests failed for bug " + BUGID + " (" + BUGNAME + ")\n"); - } - } + // Test the style sheet + checkOutput("stylesheet.css", true, + "h1 {\n" + + " font-size:20px;\n" + + "}"); - // Read the file into a String - public static String readFileToString(String filename) { - try { - File file = new File(filename); - if ( !file.exists() ) { - System.out.println("\nFILE DOES NOT EXIST: " + filename); - } - BufferedReader in = new BufferedReader(new FileReader(file)); - - // Create an array of characters the size of the file - char[] allChars = new char[(int)file.length()]; - - // Read the characters into the allChars array - in.read(allChars, 0, (int)file.length()); - in.close(); - - // Convert to a string - String allCharsString = new String(allChars); - - return allCharsString; - - } catch (FileNotFoundException e) { - System.err.println(e); - return ""; - } catch (IOException e) { - System.err.println(e); - return ""; - } - } - - public static int findString(String fileString, String stringToFind) { - return fileString.replace(NL, "\n").indexOf(stringToFind); + // Test the doc title in the overview page + checkOutput("overview-summary.html", true, + "

    Document Title

    "); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/AccessSkipNav/AccessSkipNav.java --- a/langtools/test/com/sun/javadoc/AccessSkipNav/AccessSkipNav.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/AccessSkipNav/AccessSkipNav.java Fri May 16 02:13:12 2014 -0700 @@ -26,150 +26,40 @@ * @bug 4638136 7198273 8025633 * @summary Add ability to skip over nav bar for accessibility * @author dkramer + * @library ../lib + * @build JavadocTester * @run main AccessSkipNav */ - -import com.sun.javadoc.*; -import java.util.*; -import java.io.*; - - -/** - * Runs javadoc and runs regression tests on the resulting HTML. - * It reads each file, complete with newlines, into a string to easily - * find strings that contain newlines. - */ -public class AccessSkipNav { - - protected static final String NL = System.getProperty("line.separator"); - - private static final String BUGID = "4638136 - 7198273"; - private static final String BUGNAME = "AccessSkipNav"; - private static final String TMPDEST_DIR1 = "./docs1/"; - private static final String TMPDEST_DIR2 = "./docs2/"; +public class AccessSkipNav extends JavadocTester { - // Subtest number. Needed because runResultsOnHTML is run twice, - // and subtestNum should increment across subtest runs. - public static int subtestNum = 0; - public static int numSubtestsPassed = 0; - - // Entry point - public static void main(String[] args) { - - // Directory that contains source files that javadoc runs on - String srcdir = System.getProperty("test.src", "."); - - // Test for all cases except the split index page - runJavadoc(new String[] {"-d", TMPDEST_DIR1, - "-sourcepath", srcdir, - "p1", "p2"}); - runTestsOnHTML(testArray); - - printSummary(); - } - - /** Run javadoc */ - public static void runJavadoc(String[] javadocArgs) { - if (com.sun.tools.javadoc.Main.execute(javadocArgs) != 0) { - throw new Error("Javadoc failed to execute"); - } + public static void main(String... args) throws Exception { + AccessSkipNav tester = new AccessSkipNav(); + tester.runTests(); } - /** - * Assign value for [ stringToFind, filename ] - * NOTE: The standard doclet uses the same separator "\n" for all OS's - */ - private static final String[][] testArray = { - - // Testing only for the presence of the and - - // Top navbar - { "Skip navigation links", - TMPDEST_DIR1 + "p1/C1.html" }, - - // Top navbar - { "\n" + - "\n" + - "", - TMPDEST_DIR1 + "p1/C1.html" }, - - // Bottom navbar - { "Skip navigation links", - TMPDEST_DIR1 + "p1/C1.html" }, - - // Bottom navbar - { "\n" + - "\n" + - "", - TMPDEST_DIR1 + "p1/C1.html" } - }; - - public static void runTestsOnHTML(String[][] testArray) { - - for (int i = 0; i < testArray.length; i++) { - - subtestNum += 1; - - // Read contents of file into a string - String fileString = readFileToString(testArray[i][1]); - - // Get string to find - String stringToFind = testArray[i][0]; + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "p1", "p2"); + checkExit(Exit.OK); - // Find string in file's contents - if (findString(fileString, stringToFind) == -1) { - System.out.println("\nSub-test " + (subtestNum) - + " for bug " + BUGID + " (" + BUGNAME + ") FAILED\n" - + "when searching for:\n" - + stringToFind); - } else { - numSubtestsPassed += 1; - System.out.println("\nSub-test " + (subtestNum) + " passed:\n" + stringToFind); - } - } - } - - public static void printSummary() { - if ( numSubtestsPassed == subtestNum ) { - System.out.println("\nAll " + numSubtestsPassed + " subtests passed"); - } else { - throw new Error("\n" + (subtestNum - numSubtestsPassed) + " of " + (subtestNum) - + " subtests failed for bug " + BUGID + " (" + BUGNAME + ")\n"); - } - } + // Testing only for the presence of the and + checkOutput("p1/C1.html", true, + // Top navbar + "Skip navigation links", + // Top navbar + "\n" + + "\n" + + "", + // Bottom navbar + "Skip navigation links", + // Bottom navbar + "\n" + + "\n" + + ""); - // Read the file into a String - public static String readFileToString(String filename) { - try { - File file = new File(filename); - if ( !file.exists() ) { - System.out.println("\nFILE DOES NOT EXIST: " + filename); - } - BufferedReader in = new BufferedReader(new FileReader(file)); - // Create an array of characters the size of the file - char[] allChars = new char[(int)file.length()]; - - // Read the characters into the allChars array - in.read(allChars, 0, (int)file.length()); - in.close(); - - // Convert to a string - String allCharsString = new String(allChars); - - return allCharsString; - - } catch (FileNotFoundException e) { - System.err.println(e); - return ""; - } catch (IOException e) { - System.err.println(e); - return ""; - } - } - - public static int findString(String fileString, String stringToFind) { - return fileString.replace(NL, "\n").indexOf(stringToFind); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/AccessSummary/AccessSummary.java --- a/langtools/test/com/sun/javadoc/AccessSummary/AccessSummary.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/AccessSummary/AccessSummary.java Fri May 16 02:13:12 2014 -0700 @@ -26,45 +26,35 @@ * @bug 4637604 4775148 * @summary Test the tables for summary attribute * @author dkramer - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build AccessSummary * @run main AccessSummary */ public class AccessSummary extends JavadocTester { - - /** - * Assign value for [ fileToSearch, stringToFind ] - */ - private static final String[][] TESTARRAY1 = { - - // Test that the summary attribute appears - { "overview-summary.html", - "summary=\"Packages table, listing packages, and an explanation\"" }, - - // Test that the summary attribute appears - { "p1/C1.html", - "summary=\"Constructor Summary table, listing constructors, and an explanation\"" }, - - // Test that the summary attribute appears - { "constant-values.html", - "summary=\"Constant Field Values table, listing constant fields, and values\"" } - }; - - // First test with -header only - private static final String[] JAVADOC_ARGS = new String[] { - "-d", OUTPUT_DIR, - "-sourcepath", SRC_DIR, - "p1", "p2"}; - /** * The entry point of the test. * @param args the array of command line arguments. + * @throws Exception if the test fails */ - public static void main(String[] args) { - JavadocTester tester = new AccessSummary(); - tester.run(JAVADOC_ARGS, TESTARRAY1, new String[][] {}); - tester.printSummary(); // Necessary for string search + public static void main(String... args) throws Exception { + AccessSummary tester = new AccessSummary(); + tester.runTests(); + } + + @Test + void testAccessSummary() { + javadoc("-d", "out", "-sourcepath", testSrc, "p1", "p2"); + checkExit(Exit.OK); + checkOutput("overview-summary.html", true, + "summary=\"Packages table, listing packages, and an explanation\""); + + // Test that the summary attribute appears + checkOutput("p1/C1.html", true, + "summary=\"Constructor Summary table, listing constructors, and an explanation\""); + + // Test that the summary attribute appears + checkOutput("constant-values.html", true, + "summary=\"Constant Field Values table, listing constant fields, and values\""); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/AuthorDD/AuthorDD.java --- a/langtools/test/com/sun/javadoc/AuthorDD/AuthorDD.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/AuthorDD/AuthorDD.java Fri May 16 02:13:12 2014 -0700 @@ -26,143 +26,37 @@ * @bug 4651598 8026567 * @summary Javadoc wrongly inserts tags when using multiple @author tags * @author dkramer + * @library ../lib + * @build JavadocTester * @run main AuthorDD */ - -import com.sun.javadoc.*; -import java.util.*; -import java.io.*; - - /** * Runs javadoc and runs regression tests on the resulting HTML. - * It reads each file, complete with newlines, into a string to easily - * find strings that contain newlines. */ -public class AuthorDD -{ - - protected static final String NL = System.getProperty("line.separator"); - - private static final String BUGID = "4651598"; - private static final String BUGNAME = "AuthorDD"; - - // Subtest number. Needed because runResultsOnHTML is run twice, and subtestNum - // should increment across subtest runs. - public static int subtestNum = 0; - public static int numSubtestsPassed = 0; - - // Entry point - public static void main(String[] args) { +public class AuthorDD extends JavadocTester { - // Directory that contains source files that javadoc runs on - String srcdir = System.getProperty("test.src", "."); - - // Test for all cases except the split index page - runJavadoc(new String[] {"-d", BUGID, - "-author", - "-version", - "-sourcepath", srcdir, - "p1"}); - runTestsOnHTML(testArray); - - printSummary(); - } - - /** Run javadoc */ - public static void runJavadoc(String[] javadocArgs) { - if (com.sun.tools.javadoc.Main.execute(AuthorDD.class.getClassLoader(), - javadocArgs) != 0) { - throw new Error("Javadoc failed to execute"); - } + public static void main(String... args) throws Exception { + AuthorDD tester = new AuthorDD(); + tester.runTests(); } - /** - * Assign value for [ stringToFind, filename ] - * NOTE: The standard doclet uses the same separator "\n" for all OS's - */ - private static final String[][] testArray = { - - // Test single @since tag: - - { "
    Since:
    \n" + - "
    JDK 1.0
    ", - BUGID + "/p1/C1.html" }, - - // Test multiple @author tags: - - { "
    Author:
    \n" + - "
    Doug Kramer, Jamie, Neal
    ", - BUGID + "/p1/C1.html" }, - - }; - - public static void runTestsOnHTML(String[][] testArray) { - - for (int i = 0; i < testArray.length; i++) { - - subtestNum += 1; - - // Read contents of file into a string - String fileString = readFileToString(testArray[i][1]); - - // Get string to find - String stringToFind = testArray[i][0]; + @Test + void test() { + // Test for all cases except the split index page + javadoc("-d", "out", + "-author", + "-version", + "-sourcepath", testSrc, + "p1"); + checkExit(Exit.OK); - // Find string in file's contents - if (findString(fileString, stringToFind) == -1) { - System.out.println("\nSub-test " + (subtestNum) - + " for bug " + BUGID + " (" + BUGNAME + ") FAILED\n" - + "when searching for:\n" - + stringToFind); - } else { - numSubtestsPassed += 1; - System.out.println("\nSub-test " + (subtestNum) + " passed:\n" + stringToFind); - } - } - } - - public static void printSummary() { - if ( numSubtestsPassed == subtestNum ) { - System.out.println("\nAll " + numSubtestsPassed + " subtests passed"); - } else { - throw new Error("\n" + (subtestNum - numSubtestsPassed) + " of " + (subtestNum) - + " subtests failed for bug " + BUGID + " (" + BUGNAME + ")\n"); - } - } - - // Read the file into a String - public static String readFileToString(String filename) { - try { - File file = new File(filename); - if ( !file.exists() ) { - System.out.println("\nFILE DOES NOT EXIST: " + filename); - } - BufferedReader in = new BufferedReader(new FileReader(file)); - - // Create an array of characters the size of the file - char[] allChars = new char[(int)file.length()]; - - // Read the characters into the allChars array - in.read(allChars, 0, (int)file.length()); - in.close(); - - // Convert to a string - String allCharsString = new String(allChars); - - return allCharsString; - - } catch (FileNotFoundException e) { - System.err.println(e); - return ""; - } catch (IOException e) { - System.err.println(e); - return ""; - } - } - - public static int findString(String fileString, String stringToFind) { - return fileString.replace(NL, "\n").indexOf(stringToFind); + checkOutput("p1/C1.html", true, + // Test single @since tag: + "
    Since:
    \n" + + "
    JDK 1.0
    ", + // Test multiple @author tags: + "
    Author:
    \n" + + "
    Doug Kramer, Jamie, Neal
    "); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/DocRootSlash/DocRootSlash.java --- a/langtools/test/com/sun/javadoc/DocRootSlash/DocRootSlash.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/DocRootSlash/DocRootSlash.java Fri May 16 02:13:12 2014 -0700 @@ -26,13 +26,11 @@ * @bug 4524350 4662945 4633447 * @summary stddoclet: {@docRoot} inserts an extra trailing "/" * @author dkramer + * @library ../lib + * @build JavadocTester * @run main DocRootSlash */ -import com.sun.javadoc.*; -import java.util.*; -import java.io.*; -import java.nio.*; import java.util.regex.*; /** @@ -40,149 +38,55 @@ * It reads each file, complete with newlines, into a string to easily * find strings that contain newlines. */ -public class DocRootSlash -{ - private static final String BUGID = "4524350, 4662945, or 4633447"; - private static final String BUGNAME = "DocRootSlash"; - private static final String TMPDIR_STRING1 = "./docs1/"; +public class DocRootSlash extends JavadocTester { - // Test number. Needed because runResultsOnHTMLFile is run twice, and subtestNum - // should increment across test runs. - public static int subtestNum = 0; - public static int numOfSubtestsPassed = 0; + public static void main(String... args) throws Exception { + DocRootSlash tester = new DocRootSlash(); + tester.runTests(); + } - // Entry point - public static void main(String[] args) { - + @Test + void test() { // Directory that contains source files that javadoc runs on String srcdir = System.getProperty("test.src", "."); - runJavadoc(new String[] {"-d", TMPDIR_STRING1, - "-Xdoclint:none", - "-overview", (srcdir + "/overview.html"), - "-header", "{@docroot} {@docRoot}", - "-sourcepath", srcdir, - "p1", "p2"}); - runTestsOnHTMLFiles(filenameArray); - - printSummary(); - } - - /** Run javadoc */ - public static void runJavadoc(String[] javadocArgs) { - if (com.sun.tools.javadoc.Main.execute(javadocArgs) != 0) { - throw new Error("Javadoc failed to execute"); - } - } + javadoc("-d", "out", + "-Xdoclint:none", + "-overview", (srcdir + "/overview.html"), + "-header", "{@docroot} {@docRoot}", + "-sourcepath", srcdir, + "p1", "p2"); - /** The array of filenames to test */ - private static final String[] filenameArray = { - TMPDIR_STRING1 + "p1/C1.html" , - TMPDIR_STRING1 + "p1/package-summary.html", - TMPDIR_STRING1 + "overview-summary.html" - }; - - public static void runTestsOnHTMLFiles(String[] filenameArray) { - String fileString; - - // Bugs 4524350 4662945 - for (int i = 0; i < filenameArray.length; i++ ) { - - // Read contents of file (whose filename is in filenames) into a string - fileString = readFileToString(filenameArray[i]); - - System.out.println("\nSub-tests for file: " + filenameArray[i] - + " --------------"); - - // Loop over all tests in a single file - for ( int j = 0; j < 11; j++ ) { - subtestNum += 1; - - // Compare actual to expected string for a single subtest - compareActualToExpected(fileString); - } - } + checkFiles( + "p1/C1.html" , + "p1/package-summary.html", + "overview-summary.html"); // Bug 4633447: Special test for overview-frame.html // Find two strings in file "overview-frame.html" - String filename = TMPDIR_STRING1 + "overview-frame.html"; - fileString = readFileToString(filename); - - // Find first string in overview-frame.html - subtestNum += 1; - String stringToFind = ""; - String result; - if ( fileString.indexOf(stringToFind) == -1 ) { - result = "FAILED"; - } else { - result = "succeeded"; - numOfSubtestsPassed += 1; - } - System.out.println("\nSub-test " + (subtestNum) - + " for bug " + BUGID + " (" + BUGNAME + ") " + result + "\n" - + "when searching for:\n" - + stringToFind + "\n" - + "in file " + filename); - - // Find second string in overview-frame.html - subtestNum += 1; - stringToFind = ""; - if ( fileString.indexOf(stringToFind) == -1 ) { - result = "FAILED"; - } else { - result = "succeeded"; - numOfSubtestsPassed += 1; - } - System.out.println("\nSub-test " + (subtestNum) - + " for bug " + BUGID + " (" + BUGNAME + ") " + result + "\n" - + "when searching for:\n" - + stringToFind + "\n" - + "in file " + filename); + checkOutput("overview-frame.html", true, + "", + ""); } - public static void printSummary() { - System.out.println(""); - if ( numOfSubtestsPassed == subtestNum ) { - System.out.println("\nAll " + numOfSubtestsPassed + " subtests passed"); - } else { - throw new Error("\n" + (subtestNum - numOfSubtestsPassed) + " of " + (subtestNum) - + " subtests failed for bug " + BUGID + " (" + BUGNAME + ")\n"); - } - } - - // Read the contents of the file into a String - public static String readFileToString(String filename) { - try { - File file = new File(filename); - if ( !file.exists() ) { - System.out.println("\nFILE DOES NOT EXIST: " + filename); - } + void checkFiles(String... filenameArray) { + int count = 0; - BufferedReader in = new BufferedReader(new FileReader(file)); - - // Create an array of characters the size of the file - char[] allChars = new char[(int)file.length()]; - - // Read the characters into the allChars array - in.read(allChars, 0, (int)file.length()); - in.close(); + for (String f : filenameArray) { + // Read contents of file into a string + String fileString = readFile(f); + System.out.println("\nSub-tests for file: " + f + " --------------"); + // Loop over all tests in a single file + for ( int j = 0; j < 11; j++ ) { - // Convert to a string - String allCharsString = new String(allChars); - - return allCharsString; - } catch (FileNotFoundException e) { - System.err.println(e); - return ""; - } catch (IOException e) { - System.err.println(e); - return ""; + // Compare actual to expected string for a single subtest + compareActualToExpected(++count, fileString); + } } } /** - * Regular expression pattern matching code adapted from Eric's - * /java/pubs/dev/linkfix/src/LinkFix.java + * Regular expression pattern matching code * * Prefix Pattern: * flag (?i) (case insensitive, so "a href" == "A HREF" and all combinations) @@ -197,34 +101,33 @@ * group4 (.*?) (label - zero or more characters) * group5 () (end tag) */ - static String prefix = "(?i)()"; // doublequotes (end group1, group2, group3) - static String ref2 = ")(\\S+?)([^<>]*>)"; // no quotes (end group1, group2, group3) - static String label = "(.*?)"; // text label (group4) - static String end = "()"; // (group5) + private static final String prefix = "(?i)()"; // doublequotes (end group1, group2, group3) + private static final String ref2 = ")(\\S+?)([^<>]*>)"; // no quotes (end group1, group2, group3) + private static final String label = "(.*?)"; // text label (group4) + private static final String end = "()"; // (group5) /** * Compares the actual string to the expected string in the specified string - * str String to search through + * @param str String to search through */ - static void compareActualToExpected(String str) { - // Pattern must be compiled each run because subtestNum is incremented + void compareActualToExpected(int count, String str) { + checking("comparison for " + str); + + // Pattern must be compiled each run because numTestsRun is incremented Pattern actualLinkPattern1 = - Pattern.compile("Sub-test " + subtestNum + " Actual: " + prefix + ref1, Pattern.DOTALL); + Pattern.compile("Sub-test " + count + " Actual: " + prefix + ref1, Pattern.DOTALL); Pattern expectLinkPattern1 = - Pattern.compile("Sub-test " + subtestNum + " Expect: " + prefix + ref1, Pattern.DOTALL); + Pattern.compile("Sub-test " + count + " Expect: " + prefix + ref1, Pattern.DOTALL); // Pattern linkPattern2 = Pattern.compile(prefix + ref2 + label + end, Pattern.DOTALL); - CharBuffer charBuffer = CharBuffer.wrap(str); - Matcher actualLinkMatcher1 = actualLinkPattern1.matcher(charBuffer); - Matcher expectLinkMatcher1 = expectLinkPattern1.matcher(charBuffer); - String result; - if ( expectLinkMatcher1.find() && actualLinkMatcher1.find() ) { + Matcher actualLinkMatcher1 = actualLinkPattern1.matcher(str); + Matcher expectLinkMatcher1 = expectLinkPattern1.matcher(str); + if (expectLinkMatcher1.find() && actualLinkMatcher1.find()) { String expectRef = expectLinkMatcher1.group(2); String actualRef = actualLinkMatcher1.group(2); - if ( actualRef.equals(expectRef) ) { - result = "succeeded"; - numOfSubtestsPassed += 1; + if (actualRef.equals(expectRef)) { + passed(expectRef); // System.out.println("pattern: " + actualLinkPattern1.pattern()); // System.out.println("actualRef: " + actualRef); // System.out.println("group0: " + actualLinkMatcher1.group()); @@ -233,15 +136,13 @@ // System.out.println("group3: " + actualLinkMatcher1.group(3)); // System.exit(0); } else { - result = "FAILED"; + failed("\n" + + "Actual: \"" + actualRef + "\"\n" + + "Expect: \"" + expectRef + "\""); } - System.out.println("\nSub-test " + (subtestNum) - + " for bug " + BUGID + " (" + BUGNAME + ") " + result + "\n" - + "Actual: \"" + actualRef + "\"" + "\n" - + "Expect: \"" + expectRef + "\""); } else { - System.out.println("Didn't find that fits the pattern: " - + expectLinkPattern1.pattern() ); + failed("Didn't find that fits the pattern: " + + expectLinkPattern1.pattern()); } } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/InheritDocForUserTags/DocTest.java --- a/langtools/test/com/sun/javadoc/InheritDocForUserTags/DocTest.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/InheritDocForUserTags/DocTest.java Fri May 16 02:13:12 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2014, 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 @@ -26,11 +26,11 @@ * @bug 8008768 * @summary Using {@inheritDoc} in simple tag defined via -tag fails * @author Mike Duigou + * @library ../lib + * @build JavadocTester * @run main DocTest */ -import java.io.*; - /** * DocTest documentation. * @@ -38,41 +38,27 @@ * @implSpec DocTest implementation spec. * @implNote DocTest implementation note. */ -public class DocTest { +public class DocTest extends JavadocTester { public static void main(String... args) throws Exception { - String[] javadoc_args = { - "-verbose", - "-d", "DocTest", - "-tag", "apiNote:optcm:API Note", - "-tag", "implSpec:optcm:Implementation Requirements:", - "-tag", "implNote:optcm:Implementation Note:", - "-package", - new File(System.getProperty("test.src"), "DocTest.java").getPath() - }; + DocTest tester = new DocTest(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-verbose", + "-d", "DocTest", + "-tag", "apiNote:optcm:API Note", + "-tag", "implSpec:optcm:Implementation Requirements:", + "-tag", "implNote:optcm:Implementation Note:", + "-package", + testSrc("DocTest.java") + ); + checkExit(Exit.OK); // javadoc does not report an exit code for an internal exception (!) // so monitor stderr for stack dumps. - PrintStream prevErr = System.err; - ByteArrayOutputStream err_baos = new ByteArrayOutputStream(); - PrintStream err_ps = new PrintStream(err_baos); - System.setErr(err_ps); - - int rc; - try { - rc = com.sun.tools.javadoc.Main.execute(javadoc_args); - } finally { - err_ps.close(); - System.setErr(prevErr); - } - - String err = err_baos.toString(); - System.err.println(err); - - if (rc != 0) - throw new Exception("javadoc exited with rc=" + rc); - - if (err.contains("at com.sun.")) - throw new Exception("javadoc output contains stack trace"); + checkOutput(Output.STDERR, false, "at com.sun"); } /** diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/JavascriptWinTitle/JavascriptWinTitle.java --- a/langtools/test/com/sun/javadoc/JavascriptWinTitle/JavascriptWinTitle.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/JavascriptWinTitle/JavascriptWinTitle.java Fri May 16 02:13:12 2014 -0700 @@ -27,172 +27,49 @@ * @summary Javascript IE load error when linked by -linkoffline * Window title shouldn't change when loading left frames (javascript) * @author dkramer + * @library ../lib + * @build JavadocTester * @run main JavascriptWinTitle */ - -import com.sun.javadoc.*; -import java.util.*; -import java.io.*; - - -/** - * Runs javadoc and runs regression tests on the resulting HTML. - * It reads each file, complete with newlines, into a string to easily - * find strings that contain newlines. - */ -public class JavascriptWinTitle { - - protected static final String NL = System.getProperty("line.separator"); - - private static final String BUGID = "4645058"; - private static final String BUGNAME = "JavascriptWinTitle"; - private static final String TMPDEST_DIR1 = "./docs1/"; - private static final String TMPDEST_DIR2 = "./docs2/"; - - // Subtest number. Needed because runResultsOnHTML is run twice, - // and subtestNum should increment across subtest runs. - public static int subtestNum = 0; - public static int numSubtestsPassed = 0; +public class JavascriptWinTitle extends JavadocTester { - // Entry point - public static void main(String[] args) { - - // Directory that contains source files that javadoc runs on - String srcdir = System.getProperty("test.src", "."); - - // Test for all cases except the split index page - runJavadoc(new String[] {"-d", TMPDEST_DIR1, - "-doctitle", "Document Title", - "-windowtitle", "Window Title", - "-overview", (srcdir + "/overview.html"), - "-linkoffline", - "http://java.sun.com/j2se/1.4/docs/api", srcdir, - "-sourcepath", srcdir, - "p1", "p2"}); - runTestsOnHTML(testArray); - - printSummary(); - } - - /** Run javadoc */ - public static void runJavadoc(String[] javadocArgs) { - if (com.sun.tools.javadoc.Main.execute(javadocArgs) != 0) { - throw new Error("Javadoc failed to execute"); - } + public static void main(String... args) throws Exception { + JavascriptWinTitle tester = new JavascriptWinTitle(); + tester.runTests(); } - /** - * Assign value for [ stringToFind, filename ] - * NOTE: The standard doclet uses the same separator "\n" for all OS's - */ - private static final String[][] testArray = { - - // Test the javascript "type" attribute is present: - { "", - TMPDEST_DIR1 + "/p1/C.html" - } - - }; - - public static void runTestsOnHTML(String[][] testArray) { - - for (int i = 0; i < testArray.length; i++) { - - subtestNum += 1; - - // Read contents of file into a string - String fileString = readFileToString(testArray[i][1]); + @Test + void test() { + javadoc("-d", "out", + "-doctitle", "Document Title", + "-windowtitle", "Window Title", + "-overview", testSrc("overview.html"), + "-linkoffline", "http://java.sun.com/j2se/1.4/docs/api", testSrc, + "-sourcepath", testSrc, + "p1", "p2"); + checkExit(Exit.OK); + checkOutput("overview-summary.html", true, + ""); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/MetaTag/MetaTag.java --- a/langtools/test/com/sun/javadoc/MetaTag/MetaTag.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/MetaTag/MetaTag.java Fri May 16 02:13:12 2014 -0700 @@ -21,114 +21,94 @@ * questions. */ -import java.text.SimpleDateFormat; -import java.util.Date; - /* * @test * @bug 4034096 4764726 6235799 * @summary Add support for HTML keywords via META tag for * class and member names to improve API search * @author dkramer - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build MetaTag * @run main MetaTag */ +import java.text.SimpleDateFormat; +import java.util.Date; + public class MetaTag extends JavadocTester { - //Test information. - private static final SimpleDateFormat m_dateFormat = new SimpleDateFormat("yyyy-MM-dd"); - - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, - "-sourcepath", SRC_DIR, - "-keywords", - "-doctitle", "Sample Packages", - "p1", "p2" - }; - - private static final String[] ARGS_NO_TIMESTAMP_NO_KEYWORDS = new String[] { - "-d", OUTPUT_DIR + "-2", - "-sourcepath", SRC_DIR, - "-notimestamp", - "-doctitle", "Sample Packages", - "p1", "p2" - }; - - //Input for string search tests. - private static final String[][] TEST = { - - { "p1/C1.html", - "" }, - - { "p1/C1.html", - "" }, - - { "p1/C1.html", - "" }, - - { "p1/C1.html", - "" }, - - { "p1/C1.html", - "" }, - - { "p1/package-summary.html", - "" }, - - { "overview-summary.html", - "" }, - - //NOTE: Hopefully, this regression test is not run at midnight. If the output - //was generated yesterday and this test is run today, the test will fail. - { "overview-summary.html", - ""}, - }; - - private static final String[][] NEGATED_TEST2 = { - //No keywords when -keywords is not used. - { "p1/C1.html", - "" }, - - { "p1/C1.html", - "" }, - - { "p1/C1.html", - "" }, - - { "p1/C1.html", - "" }, - - { "p1/C1.html", - "" }, - - { "p1/package-summary.html", - "" }, - - { "overview-summary.html", - "" }, - - //The date metatag should not show up when -notimestamp is used. - - //NOTE: Hopefully, this regression test is not run at midnight. If the output - //was generated yesterday and this test is run today, the test will fail. - { "overview-summary.html", - ""}, - }; - /** * The entry point of the test. - * @param args the array of command line arguments. + * @param args the array of command line arguments + * @throws Exception if the test fails */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { MetaTag tester = new MetaTag(); - tester.run(ARGS, TEST, NO_TEST); - tester.run(ARGS_NO_TIMESTAMP_NO_KEYWORDS, NO_TEST, NEGATED_TEST2); - tester.printSummary(); + tester.runTests(); + } + + @Test + void testStandard() { + javadoc("-d", "out-1", + "-sourcepath", testSrc, + "-keywords", + "-doctitle", "Sample Packages", + "p1", "p2"); + + checkExit(Exit.OK); + + checkOutput("p1/C1.html", true, + "", + "", + "", + "", + ""); + + checkOutput("p1/package-summary.html", true, + ""); + + checkOutput("overview-summary.html", true, + ""); + + // NOTE: Hopefully, this regression test is not run at midnight. If the output + // was generated yesterday and this test is run today, the test will fail. + checkOutput("overview-summary.html", true, + ""); + } + + @Test + void testNoTimestamp() { + javadoc("-d", "out-2", + "-sourcepath", testSrc, + "-notimestamp", + "-doctitle", "Sample Packages", + "p1", "p2"); + checkExit(Exit.OK); + + // No keywords when -keywords is not used. + checkOutput("p1/C1.html", false, + "", + "", + "", + "", + ""); + + checkOutput("p1/package-summary.html", false, + ""); + + checkOutput("overview-summary.html", false, + ""); + + // The date metatag should not show up when -notimestamp is used. + // NOTE: Hopefully, this regression test is not run at midnight. If the output + // was generated yesterday and this test is run today, the test will fail. + checkOutput("overview-summary.html", false, + ""); + } + + private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + + String date() { + return dateFormat.format(new Date()); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/PackagesHeader/PackagesHeader.java --- a/langtools/test/com/sun/javadoc/PackagesHeader/PackagesHeader.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/PackagesHeader/PackagesHeader.java Fri May 16 02:13:12 2014 -0700 @@ -28,83 +28,62 @@ * is present for three sets of options: (1) -header, * (2) -packagesheader, and (3) -header -packagesheader * @author dkramer - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build PackagesHeader * @run main PackagesHeader */ public class PackagesHeader extends JavadocTester { - //Test information. - private static final String OUTPUT_DIR1 = OUTPUT_DIR + "-1/"; - private static final String OUTPUT_DIR2 = OUTPUT_DIR + "-2/"; - private static final String OUTPUT_DIR3 = OUTPUT_DIR + "-3/"; + public static void main(String... args) throws Exception { + JavadocTester tester = new PackagesHeader(); + tester.runTests(); + } - /** - * Assign value for [ fileToSearch, stringToFind ] - */ - private static final String[][] TESTARRAY1 = { + @Test + void testHeader() { + // First test with -header only + javadoc("-d", "out-header", + "-header", "Main Frame Header", + "-sourcepath", testSrc, + "p1", "p2"); + checkExit(Exit.OK); // Test that the -header shows up in the packages frame - { "overview-frame.html", - "Main Frame Header" } - }; + checkOutput("overview-frame.html", true, + "Main Frame Header"); + } - private static final String[][] TESTARRAY2 = { + @Test + void testPackagesHeader() { + // Second test with -packagesheader only + javadoc("-d", "out-packages-header", + "-packagesheader", "Packages Frame Header", + "-sourcepath", testSrc, + "p1", "p2"); + checkExit(Exit.OK); // Test that the -packagesheader string shows // up in the packages frame + checkOutput("overview-frame.html", true, + "Packages Frame Header"); + } - { "overview-frame.html", - "Packages Frame Header" } - }; - - private static final String[][] TESTARRAY3 = { + @Test + void testBothHeaders() { + // Third test with both -packagesheader and -header + javadoc("-d", "out-both", + "-packagesheader", "Packages Frame Header", + "-header", "Main Frame Header", + "-sourcepath", testSrc, + "p1", "p2"); + checkExit(Exit.OK); // Test that the both headers show up and are different - - { "overview-frame.html", - "Packages Frame Header" }, - - { "overview-summary.html", - "Main Frame Header" } - }; - - // First test with -header only - private static final String[] JAVADOC_ARGS1 = new String[] { - "-d", OUTPUT_DIR1, - "-header", "Main Frame Header", - "-sourcepath", SRC_DIR, - "p1", "p2"}; - - // Second test with -packagesheader only - private static final String[] JAVADOC_ARGS2 = new String[] { - "-d", OUTPUT_DIR2, - "-packagesheader", "Packages Frame Header", - "-sourcepath", SRC_DIR, - "p1", "p2"}; + checkOutput("overview-frame.html", true, + "Packages Frame Header"); - // Third test with both -packagesheader and -header - private static final String[] JAVADOC_ARGS3 = new String[] { - "-d", OUTPUT_DIR3, - "-packagesheader", "Packages Frame Header", - "-header", "Main Frame Header", - "-sourcepath", SRC_DIR, - "p1", "p2"}; - - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - JavadocTester tester = new PackagesHeader(); - - tester.run(JAVADOC_ARGS1, TESTARRAY1, NO_TEST); - tester.run(JAVADOC_ARGS2, TESTARRAY2, NO_TEST); - tester.run(JAVADOC_ARGS3, TESTARRAY3, NO_TEST); - - tester.printSummary(); + checkOutput("overview-summary.html", true, + "Main Frame Header"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/T6735320/T6735320.java --- a/langtools/test/com/sun/javadoc/T6735320/T6735320.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/T6735320/T6735320.java Fri May 16 02:13:12 2014 -0700 @@ -25,24 +25,24 @@ * @test * @bug 6735320 * @summary javadoc throws exception if serialField value is missing - * @library ../lib/ - * @build JavadocTester T6735320 + * @library ../lib + * @build JavadocTester * @run main T6735320 */ + public class T6735320 extends JavadocTester { - private static final String[] ARGS = new String[]{ - "-d", OUTPUT_DIR + ".out", - SRC_DIR + "/SerialFieldTest.java" - }; - - public static void main(String... args) { + public static void main(String... args) throws Exception { T6735320 tester = new T6735320(); - if (tester.runJavadoc(ARGS) == 0) { - throw new AssertionError("zero return code from javadoc"); - } - if (tester.getErrorOutput().contains("StringIndexOutOfBoundsException")) { - throw new AssertionError("javadoc threw StringIndexOutOfBoundsException"); - } + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + testSrc("SerialFieldTest.java")); + checkExit(Exit.FAILED); + checkOutput(Output.STDERR, false, + "StringIndexOutOfBoundsException"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/ValidHtml/ValidHtml.java --- a/langtools/test/com/sun/javadoc/ValidHtml/ValidHtml.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/ValidHtml/ValidHtml.java Fri May 16 02:13:12 2014 -0700 @@ -30,174 +30,52 @@ * not allowed outside <FRAMESET> element * HTML table tags inserted in wrong place in pakcage use page * @author dkramer + * @library ../lib + * @build JavadocTester * @run main ValidHtml */ -import com.sun.javadoc.*; -import java.util.*; -import java.io.*; - -/** - * Runs javadoc and runs regression tests on the resulting HTML. - * It reads each file, complete with newlines, into a string to easily - * find strings that contain newlines. - */ -public class ValidHtml { - - protected static final String NL = System.getProperty("line.separator"); +public class ValidHtml extends JavadocTester { - private static final String BUGID = "4275630"; - private static final String BUGNAME = "ValidHtml"; - private static final String TMPDEST_DIR1 = "./docs1/"; - private static final String TMPDEST_DIR2 = "./docs2/"; + public static void main(String... args) throws Exception { + ValidHtml tester = new ValidHtml(); + tester.runTests(); + } - // Subtest number. Needed because runResultsOnHTML is run twice, - // and subtestNum should increment across subtest runs. - public static int subtestNum = 0; - public static int numSubtestsPassed = 0; - - // Entry point - public static void main(String[] args) { - - // Directory that contains source files that javadoc runs on - String srcdir = System.getProperty("test.src", "."); - + @Test + void test() { // Test for all cases except the split index page - runJavadoc(new String[]{"-d", TMPDEST_DIR1, + javadoc("-d", "out", "-doctitle", "Document Title", "-windowtitle", "Window Title", "-use", - "-overview", (srcdir + "/overview.html"), - "-sourcepath", srcdir, - "p1", "p2" - }); - runTestsOnHTML(testArray); + "-overview", testSrc("overview.html"), + "-sourcepath", testSrc, + "p1", "p2"); + checkExit(Exit.OK); - printSummary(); - } + // Test the proper DOCTYPE element are present: + checkOutput("index.html", true, FRAMESET); + checkOutput("overview-summary.html", true, LOOSE); + checkOutput("p1/package-summary.html", true, LOOSE); + checkOutput("p1/C.html", true, LOOSE); + checkOutput("overview-frame.html", true, LOOSE); + checkOutput("allclasses-frame.html", true, LOOSE); + checkOutput("p1/package-frame.html", true, LOOSE); - /** Run javadoc */ - public static void runJavadoc(String[] javadocArgs) { - if (com.sun.tools.javadoc.Main.execute(javadocArgs) != 0) { - throw new Error("Javadoc failed to execute"); - } + // Test that <NOFRAMES> is inside <FRAMESET> element: + checkOutput("index.html", true, + "\n" + + ""); + + // Test the table elements are in the correct order: + checkOutput("p1/package-use.html", true, + "\n" + + ""); } - /** - * Assign value for [ stringToFind, filename ] - * NOTE: The standard doclet uses the same separator "\n" for all OS's - */ - private static final String[][] testArray = { - // Test the proper DOCTYPE element is present: - { - "", - TMPDEST_DIR1 + "index.html" - }, - // Test the proper DOCTYPE element is present: - { - "", - TMPDEST_DIR1 + "overview-summary.html" - }, - // Test the proper DOCTYPE element is present: - { - "", - TMPDEST_DIR1 + "p1/package-summary.html" - }, - // Test the proper DOCTYPE element is present: - { - "", - TMPDEST_DIR1 + "p1/C.html" - }, - // Test the proper DOCTYPE element is present: - { - "", - TMPDEST_DIR1 + "overview-frame.html" - }, - // Test the proper DOCTYPE element is present: - { - "", - TMPDEST_DIR1 + "allclasses-frame.html" - }, - // Test the proper DOCTYPE element is present: - { - "", - TMPDEST_DIR1 + "p1/package-frame.html" - }, - // Test that is inside <FRAMESET> element: - { - "\n" + - "", - TMPDEST_DIR1 + "index.html" - }, - // Test the table elements are in the correct order: - { - "\n" + - "", - TMPDEST_DIR1 + "/p1/package-use.html" - } - }; - - public static void runTestsOnHTML(String[][] testArray) { - - for (int i = 0; i < testArray.length; i++) { - - subtestNum += 1; - - // Read contents of file into a string - String fileString = readFileToString(testArray[i][1]); - - // Get string to find - String stringToFind = testArray[i][0]; - - // Find string in file's contents - if (findString(fileString, stringToFind) == -1) { - System.out.println("\nSub-test " + (subtestNum) + " for bug " + BUGID + " (" + BUGNAME + ") FAILED\n" + "when searching for:\n" + stringToFind); - } else { - numSubtestsPassed += 1; - System.out.println("\nSub-test " + (subtestNum) + " passed:\n" + stringToFind); - } - } - } - - public static void printSummary() { - if (numSubtestsPassed == subtestNum) { - System.out.println("\nAll " + numSubtestsPassed + " subtests passed"); - } else { - throw new Error("\n" + (subtestNum - numSubtestsPassed) + " of " + (subtestNum) + " subtests failed for bug " + BUGID + " (" + BUGNAME + ")\n"); - } - } - - // Read the file into a String - public static String readFileToString(String filename) { - try { - File file = new File(filename); - if (!file.exists()) { - System.out.println("\nFILE DOES NOT EXIST: " + filename); - } - BufferedReader in = new BufferedReader(new FileReader(file)); - - // Create an array of characters the size of the file - char[] allChars = new char[(int) file.length()]; - - // Read the characters into the allChars array - in.read(allChars, 0, (int) file.length()); - in.close(); - - // Convert to a string - String allCharsString = new String(allChars); - - return allCharsString; - - } catch (FileNotFoundException e) { - System.err.println(e); - return ""; - } catch (IOException e) { - System.err.println(e); - return ""; - } - } - - public static int findString(String fileString, String stringToFind) { - return fileString.replace(NL, "\n").indexOf(stringToFind); - } + private static final String FRAMESET = + ""; + private static final String LOOSE = + ""; } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/VersionNumber/VersionNumber.java --- a/langtools/test/com/sun/javadoc/VersionNumber/VersionNumber.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/VersionNumber/VersionNumber.java Fri May 16 02:13:12 2014 -0700 @@ -26,131 +26,31 @@ * @bug 4720849 * @summary com.sun.tools.doclets.standard.Standard contains hard-coded version number * @author dkramer + * @library ../lib + * @build JavadocTester * @run main VersionNumber */ -import com.sun.javadoc.*; -import java.util.*; -import java.io.*; - - /** * Runs javadoc and runs regression tests on the resulting HTML. - * It reads each file, complete with newlines, into a string to easily - * find strings that contain newlines. */ -public class VersionNumber { - - private static final String BUGID = "4720849"; - private static final String BUGNAME = "VersionNumber"; - private static final String TMPDEST_DIR1 = "./docs1/"; - private static final String TMPDEST_DIR2 = "./docs2/"; - - // Subtest number. Needed because runResultsOnHTML is run twice, - // and subtestNum should increment across subtest runs. - public static int subtestNum = 0; - public static int numSubtestsPassed = 0; +public class VersionNumber extends JavadocTester { - // Entry point - public static void main(String[] args) { - - // Directory that contains source files that javadoc runs on - String srcdir = System.getProperty("test.src", "."); - - // Test for all cases except the split index page - runJavadoc(new String[] {"-d", TMPDEST_DIR1, - "p1"}); - runTestsOnHTML(testArray); - - printSummary(); - } - - /** Run javadoc */ - public static void runJavadoc(String[] javadocArgs) { - if (com.sun.tools.javadoc.Main.execute(javadocArgs) != 0) { - throw new Error("Javadoc failed to execute"); - } + public static void main(String... args) throws Exception { + VersionNumber tester = new VersionNumber(); + tester.runTests(); } - /** - * Assign value for [ stringToFind, filename ] - * NOTE: The standard doclet uses the same separator "\n" for all OS's - */ - private static final String[][] testArray = { - - // Test the proper DOCTYPE element is present: - { - ""}, - { "pkg/AnnotationTypeField.html", - "

    Field Summary

    "}, - { "pkg/AnnotationTypeField.html", - "
    DEFAULT_NAME" + - " "}, - { "pkg/AnnotationTypeField.html", - ""}, - { "pkg/AnnotationTypeField.html", - "

    DEFAULT_NAME

    \n" + - "
    public static final java." +
    -            "lang.String DEFAULT_NAME
    "}, - { "pkg/AnnotationType.html", - "
  • Summary: 
  • \n" + - "
  • Field | 
  • "}, - { "pkg/AnnotationType.html", - "
  • Detail: 
  • \n" + - "
  • Field | 
  • "}, - }; - private static final String[][] NEGATED_TEST = { - { "pkg/AnnotationType.html", - "
    \n\n" + - "

    \n\n" + - "

    " + - "" + "


    "} - }; + checkOutput("pkg/AnnotationTypeField.html", true, + "
  • Summary: 
  • \n" + + "
  • Field | 
  • ", + "
  • Detail: 
  • \n" + + "
  • Field | 
  • ", + "", + "

    Field Summary

    ", + "DEFAULT_NAME" + + " ", + "", + "

    DEFAULT_NAME

    \n" + + "
    public static final java."
    +                + "lang.String DEFAULT_NAME
    "); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestAnnotationTypes tester = new TestAnnotationTypes(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + checkOutput("pkg/AnnotationType.html", true, + "
  • Summary: 
  • \n" + + "
  • Field | 
  • ", + "
  • Detail: 
  • \n" + + "
  • Field | 
  • "); + + checkOutput("pkg/AnnotationType.html", false, + "
    \n\n" + + "

    \n\n" + + "

    " + + "" + "


    "); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testBackSlashInLink/TestBackSlashInLink.java --- a/langtools/test/com/sun/javadoc/testBackSlashInLink/TestBackSlashInLink.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testBackSlashInLink/TestBackSlashInLink.java Fri May 16 02:13:12 2014 -0700 @@ -27,28 +27,27 @@ * @summary Test to make sure that the link to source documentation * has a forward slash. It would be wrong to use a back slash. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestBackSlashInLink * @run main TestBackSlashInLink */ public class TestBackSlashInLink extends JavadocTester { - private static final String[][] TEST = { - { "C.html", "src-html/C.html#line.7"}}; - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-linksource", SRC_DIR + "/C.java"}; + public static void main(String... args) throws Exception { + TestBackSlashInLink tester = new TestBackSlashInLink(); + tester.runTests(); + } - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestBackSlashInLink tester = new TestBackSlashInLink(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-linksource", + testSrc("C.java")); + checkExit(Exit.OK); + + checkOutput("C.html", true, + "src-html/C.html#line.7"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testBadPackageFileInJar/TestBadPackageFileInJar.java --- a/langtools/test/com/sun/javadoc/testBadPackageFileInJar/TestBadPackageFileInJar.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testBadPackageFileInJar/TestBadPackageFileInJar.java Fri May 16 02:13:12 2014 -0700 @@ -27,33 +27,27 @@ * @summary Test to make sure that Javadoc emits a useful warning * when a bad package.html file is in the JAR. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestBadPackageFileInJar * @run main TestBadPackageFileInJar */ public class TestBadPackageFileInJar extends JavadocTester { - private static final String[][] TEST = - new String[][] { - {ERROR_OUTPUT, - "badPackageFileInJar.jar" + FS + "pkg/package.html: error - Body tag missing from HTML"} - }; + public static void main(String... args) throws Exception { + TestBadPackageFileInJar tester = new TestBadPackageFileInJar(); + tester.runTests(); + } - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-classpath", - SRC_DIR + "/badPackageFileInJar.jar", "pkg"}; - + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-classpath", testSrc("badPackageFileInJar.jar"), + "pkg"); + checkExit(Exit.FAILED); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestBadPackageFileInJar tester = new TestBadPackageFileInJar(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + checkOutput(Output.ERROR, true, + "badPackageFileInJar.jar" + FS + "pkg/package.html: error - Body tag missing from HTML"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testBadSourceFile/TestBadSourceFile.java --- a/langtools/test/com/sun/javadoc/testBadSourceFile/TestBadSourceFile.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testBadSourceFile/TestBadSourceFile.java Fri May 16 02:13:12 2014 -0700 @@ -27,27 +27,28 @@ * @summary Make sure exception is not thrown if there is a bad source * file in the same directory as the file being documented. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestBadSourceFile * @run main TestBadSourceFile */ public class TestBadSourceFile extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-Xdoclint:none", "-d", OUTPUT_DIR, SRC_DIR + "/C2.java" - }; - /** * The entry point of the test. - * @param args the array of command line arguments. + * @param args the array of command line arguments + * @throws Exception if the test fails */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestBadSourceFile tester = new TestBadSourceFile(); - int exitCode = tester.run(ARGS, NO_TEST, NO_TEST); - tester.checkExitCode(0, exitCode); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-Xdoclint:none", + "-d", "out", + testSrc("C2.java")); + checkExit(Exit.OK); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testBaseClass/TestBaseClass.java --- a/langtools/test/com/sun/javadoc/testBaseClass/TestBaseClass.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testBaseClass/TestBaseClass.java Fri May 16 02:13:12 2014 -0700 @@ -26,29 +26,25 @@ * @bug 4197513 * @summary Javadoc does not process base class. * @author jamieh - * @library ../lib/ + * @library ../lib * @build BaseClass * @build JavadocTester - * @build TestBaseClass * @run main TestBaseClass */ public class TestBaseClass extends JavadocTester { - private static final String[] ARGS = - new String[] { - "-sourcepath", SRC_DIR, - "-docletpath", SRC_DIR, "-doclet", "BaseClass", - SRC_DIR + "/Bar.java", "baz"}; + public static void main(String... args) throws Exception { + TestBaseClass tester = new TestBaseClass(); + tester.runTests(); + } - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestBaseClass tester = new TestBaseClass(); - if (tester.run(ARGS, NO_TEST, NO_TEST) != 0) { - throw new Error("Javadoc failed to execute."); - } + @Test + void test() { + javadoc("-sourcepath", testSrc, + "-docletpath", testSrc, + "-doclet", "BaseClass", + testSrc("Bar.java"), "baz"); + checkExit(Exit.OK); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testBreakIterator/TestBreakIterator.java --- a/langtools/test/com/sun/javadoc/testBreakIterator/TestBreakIterator.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testBreakIterator/TestBreakIterator.java Fri May 16 02:13:12 2014 -0700 @@ -29,29 +29,27 @@ * Correct Answer: "The class is empty (i.e. it has no members)." * Wrong Answer: "The class is empty (i.e." * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestBreakIterator * @run main TestBreakIterator */ public class TestBreakIterator extends JavadocTester { - private static final String[][] TEST = { - { "pkg/BreakIteratorTest.html", - "The class is empty (i.e. it has no members)."}}; - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-breakiterator", "pkg"}; + public static void main(String... args) throws Exception { + TestBreakIterator tester = new TestBreakIterator(); + tester.runTests(); + } - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestBreakIterator tester = new TestBreakIterator(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-breakiterator", + "pkg"); + checkExit(Exit.OK); + + checkOutput("pkg/BreakIteratorTest.html", true, + "The class is empty (i.e. it has no members)."); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testCRLineSeparator/TestCRLineSeparator.java --- a/langtools/test/com/sun/javadoc/testCRLineSeparator/TestCRLineSeparator.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testCRLineSeparator/TestCRLineSeparator.java Fri May 16 02:13:12 2014 -0700 @@ -26,9 +26,8 @@ * @bug 4979486 * @summary Make sure tool parses CR line separators properly. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestCRLineSeparator * @run main TestCRLineSeparator */ @@ -37,32 +36,27 @@ public class TestCRLineSeparator extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", ".", "pkg" - }; - - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/MyClass.html", "Line 1\n" + - " Line 2"} - }; + public static void main(String... args) throws Exception { + TestCRLineSeparator tester = new TestCRLineSeparator(); + tester.runTests(); + } + @Test + void test() throws IOException { + initFiles(new File(testSrc), new File("src"), "pkg"); + javadoc("-d", "out", + "-sourcepath", "src", + "pkg"); + checkExit(Exit.OK); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) throws Exception { - initFiles(new File(SRC_DIR), new File("."), "pkg"); - TestCRLineSeparator tester = new TestCRLineSeparator(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + checkOutput("pkg/MyClass.html", true, + "Line 1\n" + + " Line 2"); } // recursively copy files from fromDir to toDir, replacing newlines // with \r - static void initFiles(File fromDir, File toDir, String f) throws IOException { + void initFiles(File fromDir, File toDir, String f) throws IOException { File from_f = new File(fromDir, f); File to_f = new File(toDir, f); if (from_f.isDirectory()) { @@ -71,23 +65,17 @@ initFiles(from_f, to_f, child); } } else { - List lines = new ArrayList(); - BufferedReader in = new BufferedReader(new FileReader(from_f)); - try { + List lines = new ArrayList<>(); + try (BufferedReader in = new BufferedReader(new FileReader(from_f))) { String line; while ((line = in.readLine()) != null) lines.add(line); - } finally { - in.close(); } - BufferedWriter out = new BufferedWriter(new FileWriter(to_f)); - try { + try (BufferedWriter out = new BufferedWriter(new FileWriter(to_f))) { for (String line: lines) { out.write(line); out.write("\r"); } - } finally { - out.close(); } } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testCharset/TestCharset.java --- a/langtools/test/com/sun/javadoc/testCharset/TestCharset.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testCharset/TestCharset.java Fri May 16 02:13:12 2014 -0700 @@ -27,39 +27,34 @@ * @summary Run a test on -charset to make sure the charset gets generated as a * part of the meta tag. * @author Bhavesh Patel - * @library ../lib/ - * @build JavadocTester TestCharset + * @library ../lib + * @build JavadocTester * @run main TestCharset */ public class TestCharset extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-charset", "UTF-8", "-sourcepath", SRC_DIR, "pkg" - }; - - private static final String[][] TEST = { - { "index.html", - ""}, - { "pkg/Foo.html", - ""} - }; + public static void main(String... args) throws Exception { + TestCharset tester = new TestCharset(); + tester.runTests(); + } - private static final String[][] NEGATED_TEST = { - { "index.html", - ""}, - { "pkg/Foo.html", - ""} - }; + @Test + void test() { + javadoc("-d", "out", + "-charset", "UTF-8", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestCharset tester = new TestCharset(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + checkOutput("index.html", true, + ""); + checkOutput("pkg/Foo.html", true, + ""); + + checkOutput("index.html", false, + ""); + checkOutput("pkg/Foo.html", false, + ""); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testClassCrossReferences/TestClassCrossReferences.java --- a/langtools/test/com/sun/javadoc/testClassCrossReferences/TestClassCrossReferences.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testClassCrossReferences/TestClassCrossReferences.java Fri May 16 02:13:12 2014 -0700 @@ -26,7 +26,7 @@ * @bug 4652655 4857717 8025633 8026567 * @summary This test verifies that class cross references work properly. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester * @build TestClassCrossReferences * @run main TestClassCrossReferences @@ -34,37 +34,34 @@ public class TestClassCrossReferences extends JavadocTester { - private static final String[][] TEST = { - { "C.html", - "Link to math package"}, - { "C.html", - "Link to AttributeContext innerclass"}, - { "C.html", - "Link to external class BigDecimal"}, - { "C.html", - "Link to external member gcd"}, - { "C.html", - "
    \n" + - "
    Overrides:
    \n" + - "
    toString in class java.lang.Object
    \n" + - "
    "} - }; - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-linkoffline", "http://java.sun.com/j2se/1.4/docs/api/", - SRC_DIR, SRC_DIR + "/C.java"}; + public static void main(String... args) throws Exception { + TestClassCrossReferences tester = new TestClassCrossReferences(); + tester.runTests(); + } + + @Test + void test() { + final String uri = "http://java.sun.com/j2se/1.4/docs/api/"; + + javadoc("-d", "out", + "-sourcepath", testSrc, + "-linkoffline", uri, testSrc, + testSrc("C.java")); + checkExit(Exit.OK); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestClassCrossReferences tester = new TestClassCrossReferences(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + checkOutput("C.html", true, + "" + + "Link to math package", + "Link to AttributeContext innerclass", + "Link to external class BigDecimal", + "Link to external member gcd", + "
    \n" + + "
    Overrides:
    \n" + + "
    toString in class java.lang.Object
    \n" + + "
    "); } + } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testClassTree/TestClassTree.java --- a/langtools/test/com/sun/javadoc/testClassTree/TestClassTree.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testClassTree/TestClassTree.java Fri May 16 02:13:12 2014 -0700 @@ -29,64 +29,52 @@ * Make sure class tree includes heirarchy for enums and annotation * types. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestClassTree * @run main TestClassTree */ public class TestClassTree extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg" - }; + public static void main(String... args) throws Exception { + TestClassTree tester = new TestClassTree(); + tester.runTests(); + } - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/package-tree.html", - "
      \n" + - "
    • pkg.ParentClass"}, - - { "pkg/package-tree.html", - "

      Annotation Type Hierarchy

      \n" + - "
        \n" + - "
      • pkg.AnnotationType " + - "(implements java.lang.annotation.Annotation)
      • \n" + - "
      "}, + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); - { "pkg/package-tree.html", - "

      Enum Hierarchy

      \n" + - "
        \n" + - "
      • java.lang.Object\n" + - "
          \n" + - "
        • java.lang.Enum<E> (implements java.lang." + - "Comparable<T>, java.io.Serializable)\n" + - "
            \n" + - "
          • pkg.Coin
          • \n" + - "
          \n" + - "
        • \n" + - "
        \n" + - "
      • \n" + - "
      " - }, - }; - private static final String[][] NEGATED_TEST = { - { "pkg/package-tree.html", - "
    • class pkg.ParentClass
    • "} - }; + checkOutput("pkg/package-tree.html", true, + "
        \n" + + "
      • pkg.ParentClass", + "

        Annotation Type Hierarchy

        \n" + + "
          \n" + + "
        • pkg.AnnotationType " + + "(implements java.lang.annotation.Annotation)
        • \n" + + "
        ", + "

        Enum Hierarchy

        \n" + + "
          \n" + + "
        • java.lang.Object\n" + + "
            \n" + + "
          • java.lang.Enum<E> (implements java.lang." + + "Comparable<T>, java.io.Serializable)\n" + + "
              \n" + + "
            • pkg.Coin
            • \n" + + "
            \n" + + "
          • \n" + + "
          \n" + + "
        • \n" + + "
        "); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestClassTree tester = new TestClassTree(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + checkOutput("pkg/package-tree.html", false, + "
      • class pkg.ParentClass
      • "); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testCmndLineClass/TestCmndLineClass.java --- a/langtools/test/com/sun/javadoc/testCmndLineClass/TestCmndLineClass.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testCmndLineClass/TestCmndLineClass.java Fri May 16 02:13:12 2014 -0700 @@ -28,47 +28,44 @@ * when specifying packages on the command line and specifying individual * classes. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestCmndLineClass * @run main TestCmndLineClass */ public class TestCmndLineClass extends JavadocTester { - private static final String OUTPUT_DIR1 = "4506980-tmp1"; - private static final String OUTPUT_DIR2 = "4506980-tmp2"; - private static final String[] ARGS1 = - new String[] { - "-d", OUTPUT_DIR1, "-sourcepath", SRC_DIR, - "-notimestamp", SRC_DIR + "/C5.java", "pkg1", "pkg2" - }; - private static final String[] ARGS2 = - new String[] { - "-d", OUTPUT_DIR2, "-sourcepath", SRC_DIR, - "-notimestamp", SRC_DIR + "/C5.java", - SRC_DIR + "/pkg1/C1.java", - SRC_DIR + "/pkg1/C2.java", - SRC_DIR + "/pkg2/C3.java", - SRC_DIR + "/pkg2/C4.java" - }; - private static final String[] FILES_TO_DIFF = { - "C5.html", - "pkg1/C1.html", - "pkg1/C2.html", - "pkg2/C3.html", - "pkg2/C4.html" - }; + public static void main(String... args) throws Exception { + TestCmndLineClass tester = new TestCmndLineClass(); + tester.runTests(); + } + + @Test + void test() { + String outdir1 = "out-1"; + String outdir2 = "out-2"; + + javadoc("-d", outdir1, + "-sourcepath", testSrc, + "-notimestamp", + testSrc("C5.java"), "pkg1", "pkg2"); + checkExit(Exit.OK); + javadoc("-d", outdir2, + "-sourcepath", testSrc, + "-notimestamp", + testSrc("C5.java"), + testSrc("pkg1/C1.java"), + testSrc("pkg1/C2.java"), + testSrc("pkg2/C3.java"), + testSrc("pkg2/C4.java")); + checkExit(Exit.OK); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestCmndLineClass tester = new TestCmndLineClass(); - tester.run(ARGS1, NO_TEST, NO_TEST); - tester.run(ARGS2, NO_TEST, NO_TEST); - tester.runDiffs(OUTPUT_DIR1, OUTPUT_DIR2, FILES_TO_DIFF); + diff(outdir1, outdir2, + "C5.html", + "pkg1/C1.html", + "pkg1/C2.html", + "pkg2/C3.html", + "pkg2/C4.html"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testCompletionFailure/TestCompletionFailure.java --- a/langtools/test/com/sun/javadoc/testCompletionFailure/TestCompletionFailure.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testCompletionFailure/TestCompletionFailure.java Fri May 16 02:13:12 2014 -0700 @@ -26,32 +26,28 @@ * @bug 8027977 * @summary Test to verify javadoc executes without CompletionFailure exception. * @author Bhavesh Patel - * @library ../lib/ - * @build JavadocTester TestCompletionFailure + * @library ../lib + * @build JavadocTester * @run main TestCompletionFailure */ public class TestCompletionFailure extends JavadocTester { - //Input for string search tests. - private static final String[][] NEGATED_TEST = { - {ERROR_OUTPUT, "TestCompletionFailure: error - " + - "com.sun.tools.javac.code.Symbol$CompletionFailure: class file for " + - "sun.util.locale.provider.LocaleProviderAdapter not found" - } - }; + public static void main(String... args) throws Exception { + TestCompletionFailure tester = new TestCompletionFailure(); + tester.runTests(); + } - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg1" - }; + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.OK); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) throws Exception { - TestCompletionFailure tester = new TestCompletionFailure(); - tester.run(ARGS, NO_TEST, NEGATED_TEST); - tester.printSummary(); + checkOutput(Output.STDERR, false, + "TestCompletionFailure: error - " + + "com.sun.tools.javac.code.Symbol$CompletionFailure: class file for " + + "sun.util.locale.provider.LocaleProviderAdapter not found"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testConstantValuesPage/TestConstantValuesPage.java --- a/langtools/test/com/sun/javadoc/testConstantValuesPage/TestConstantValuesPage.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testConstantValuesPage/TestConstantValuesPage.java Fri May 16 02:13:12 2014 -0700 @@ -27,28 +27,26 @@ * @summary Test to make sure that constant values page does not get * generated when doclet has nothing to document. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestConstantValuesPage * @run main TestConstantValuesPage */ public class TestConstantValuesPage extends JavadocTester { - private static final String[][] NEGATED_TEST = { - {NOTICE_OUTPUT, "constant-values.html..."} - }; - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "foo"}; + public static void main(String... args) throws Exception { + TestConstantValuesPage tester = new TestConstantValuesPage(); + tester.runTests(); + } - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestConstantValuesPage tester = new TestConstantValuesPage(); - tester.run(ARGS, NO_TEST, NEGATED_TEST); - tester.printSummary(); + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "foo"); + checkExit(Exit.FAILED); + + checkOutput(Output.NOTICE, false, + "constant-values.html..."); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testConstructorIndent/TestConstructorIndent.java --- a/langtools/test/com/sun/javadoc/testConstructorIndent/TestConstructorIndent.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testConstructorIndent/TestConstructorIndent.java Fri May 16 02:13:12 2014 -0700 @@ -27,37 +27,31 @@ * @summary The constructor comments should be surrounded by *
        . Check for this in the output. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestConstructorIndent * @run main TestConstructorIndent */ public class TestConstructorIndent extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, SRC_DIR + "/C.java" - }; + public static void main(String... args) throws Exception { + TestConstructorIndent tester = new TestConstructorIndent(); + tester.runTests(); + } - //Input for string search tests. - private static final String[][] TEST = { - { "C.html", "
        " + - "This is just a simple constructor.
        \n" + - "
        \n" + - "
        Parameters:
        \n" + - "
        i - a param.
        \n" + - "
        " - } - }; + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + testSrc("C.java")); + checkExit(Exit.OK); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestConstructorIndent tester = new TestConstructorIndent(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + checkOutput("C.html", true, + "
        " + + "This is just a simple constructor.
        \n" + + "
        \n" + + "
        Parameters:
        \n" + + "
        i - a param.
        \n" + + "
        "); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testConstructors/TestConstructors.java --- a/langtools/test/com/sun/javadoc/testConstructors/TestConstructors.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testConstructors/TestConstructors.java Fri May 16 02:13:12 2014 -0700 @@ -26,106 +26,66 @@ * @bug 8025524 8031625 * @summary Test for constructor name which should be a non-qualified name. * @author Bhavesh Patel - * @library ../lib/ - * @build JavadocTester TestConstructors + * @library ../lib + * @build JavadocTester * @run main TestConstructors */ public class TestConstructors extends JavadocTester { - //Input for string search tests. - private static final String[][] TEST = { - { "pkg1/Outer.html", - "
        See Also:
        \n" + - "
        Inner(), \n" + - "Inner(int), \n" + - "NestedInner(), \n" + - "NestedInner(int), \n" + - "Outer(), \n" + - "Outer(int)" - }, - { "pkg1/Outer.html", - "Link: Inner(), " + - "Outer(int), " + - "" + - "NestedInner(int)" - }, - { "pkg1/Outer.html", - "Outer()" - }, - { "pkg1/Outer.html", - "" - }, - { "pkg1/Outer.html", - "Outer(int i)" - }, - { "pkg1/Outer.html", - "" - }, - { "pkg1/Outer.Inner.html", - "Inner()" - }, - { "pkg1/Outer.Inner.html", - "" - }, - { "pkg1/Outer.Inner.html", - "Inner(int i)" - }, - { "pkg1/Outer.Inner.html", - "" - }, - { "pkg1/Outer.Inner.NestedInner.html", - "NestedInner()" - }, - { "pkg1/Outer.Inner.NestedInner.html", - "" - }, - { "pkg1/Outer.Inner.NestedInner.html", - "NestedInner(int i)" - }, - { "pkg1/Outer.Inner.NestedInner.html", - "" - } - }; + public static void main(String... args) throws Exception { + TestConstructors tester = new TestConstructors(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.OK); - private static final String[][] NEGATED_TEST = { - { "pkg1/Outer.Inner.html", - "Outer.Inner--" - }, - { "pkg1/Outer.Inner.html", - "Outer.Inner-int-" - }, - { "pkg1/Outer.Inner.NestedInner.html", - "Outer.Inner.NestedInner--" - }, - { "pkg1/Outer.Inner.NestedInner.html", - "Outer.Inner.NestedInner-int-" - }, - { "pkg1/Outer.html", - "Outer.Inner()" - }, - { "pkg1/Outer.html", - "Outer.Inner(int)" - }, - { "pkg1/Outer.html", - "Outer.Inner.NestedInner()" - }, - { "pkg1/Outer.html", - "Outer.Inner.NestedInner(int)" - } - }; + checkOutput("pkg1/Outer.html", true, + "
        See Also:
        \n" + + "
        Inner(), \n" + + "Inner(int), \n" + + "NestedInner(), \n" + + "NestedInner(int), \n" + + "Outer(), \n" + + "Outer(int)", + "Link: Inner(), " + + "Outer(int), " + + "" + + "NestedInner(int)", + "Outer()", + "", + "Outer(int i)", + ""); - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg1" - }; + checkOutput("pkg1/Outer.Inner.html", true, + "Inner()", + "", + "Inner(int i)", + ""); + + checkOutput("pkg1/Outer.Inner.NestedInner.html", true, + "NestedInner()", + "", + "NestedInner(int i)", + ""); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) throws Exception { - TestConstructors tester = new TestConstructors(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + checkOutput("pkg1/Outer.Inner.html", false, + "Outer.Inner--", + "Outer.Inner-int-"); + + checkOutput("pkg1/Outer.Inner.NestedInner.html", false, + "Outer.Inner.NestedInner--", + "Outer.Inner.NestedInner-int-"); + + checkOutput("pkg1/Outer.html", false, + "Outer.Inner()", + "Outer.Inner(int)", + "Outer.Inner.NestedInner()", + "Outer.Inner.NestedInner(int)"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testCustomTag/TestCustomTag.java --- a/langtools/test/com/sun/javadoc/testCustomTag/TestCustomTag.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testCustomTag/TestCustomTag.java Fri May 16 02:13:12 2014 -0700 @@ -26,69 +26,67 @@ * @bug 8006248 * @summary Test custom tag. Verify that an unknown tag generates appropriate warnings. * @author Bhavesh Patel - * @library ../lib/ - * @build JavadocTester taglets.CustomTag TestCustomTag + * @library ../lib + * @build JavadocTester taglets.CustomTag * @run main TestCustomTag */ public class TestCustomTag extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-Xdoclint:none", "-d", OUTPUT_DIR, "-tagletpath", SRC_DIR, - "-taglet", "taglets.CustomTag", "-sourcepath", - SRC_DIR, SRC_DIR + "/TagTestClass.java" - }; + public static void main(String... args) throws Exception { + TestCustomTag tester = new TestCustomTag(); + tester.runTests(); + } - private static final String[] ARGS1 = new String[] { - "-d", OUTPUT_DIR + "-1", "-tagletpath", - SRC_DIR, "-taglet", "taglets.CustomTag", - "-sourcepath", SRC_DIR, SRC_DIR + "/TagTestClass.java" - }; - private static final String[] ARGS2 = new String[] { - "-Xdoclint:none", "-d", OUTPUT_DIR + "-2", "-sourcepath", - SRC_DIR, SRC_DIR + "/TagTestClass.java" - }; + @Test + void test1() { + javadoc("-Xdoclint:none", + "-d", "out-1", + "-tagletpath", testSrc, // TODO: probably useless + "-taglet", "taglets.CustomTag", + "-sourcepath", testSrc, + testSrc("TagTestClass.java")); + checkExit(Exit.OK); - private static final String[] ARGS3 = new String[] { - "-d", OUTPUT_DIR + "-3", "-sourcepath", - SRC_DIR, SRC_DIR + "/TagTestClass.java" - }; + checkOutput(Output.WARNING, true, + "warning - @unknownTag is an unknown tag."); + } - //Input for string search tests. - private static final String[][] TEST = new String[][] { - {WARNING_OUTPUT, "warning - @unknownTag is an unknown tag." - } - }; + @Test + void test2() { + javadoc("-d", "out-2", + "-tagletpath", testSrc, // TODO: probably useless + "-taglet", "taglets.CustomTag", + "-sourcepath", testSrc, + testSrc("TagTestClass.java")); + checkExit(Exit.FAILED); - private static final String[][] TEST1 = new String[][] { - {ERROR_OUTPUT, "error: unknown tag: unknownTag" - } - }; - private static final String[][] TEST2 = new String[][] { - {WARNING_OUTPUT, "warning - @customTag is an unknown tag." - }, - {WARNING_OUTPUT, "warning - @unknownTag is an unknown tag." - } - }; + checkOutput(Output.ERROR, true, + "error: unknown tag: unknownTag"); + } + + @Test + void test3() { + javadoc("-Xdoclint:none", + "-d", "out-3", + "-sourcepath", testSrc, + testSrc("TagTestClass.java")); + checkExit(Exit.OK); - private static final String[][] TEST3 = new String[][] { - {ERROR_OUTPUT, "error: unknown tag: customTag" - }, - {ERROR_OUTPUT, "error: unknown tag: unknownTag" - } - }; + checkOutput(Output.WARNING, true, + "warning - @customTag is an unknown tag.", + "warning - @unknownTag is an unknown tag."); + } - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestCustomTag tester = new TestCustomTag(); - tester.run(ARGS, TEST, NO_TEST); - tester.run(ARGS1, TEST1, NO_TEST); - tester.run(ARGS2, TEST2, NO_TEST); - tester.run(ARGS3, TEST3, NO_TEST); - tester.printSummary(); + @Test + void test4() { + javadoc("-d", "out-4", + "-sourcepath", testSrc, + testSrc("TagTestClass.java")); + checkExit(Exit.FAILED); + + checkOutput(Output.ERROR, true, + "error: unknown tag: customTag", + "error: unknown tag: unknownTag"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testDeprecatedDocs/TestDeprecatedDocs.java --- a/langtools/test/com/sun/javadoc/testDeprecatedDocs/TestDeprecatedDocs.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testDeprecatedDocs/TestDeprecatedDocs.java Fri May 16 02:13:12 2014 -0700 @@ -26,76 +26,65 @@ * @bug 4927552 8026567 * @summary * @author jamieh - * @library ../lib/ - * @build JavadocTester TestDeprecatedDocs + * @library ../lib + * @build JavadocTester * @run main TestDeprecatedDocs */ public class TestDeprecatedDocs extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg" - }; + public static void main(String... args) throws Exception { + TestDeprecatedDocs tester = new TestDeprecatedDocs(); + tester.runTests(); + } - private static final String TARGET_FILE = - "deprecated-list.html"; - - private static final String TARGET_FILE2 = - "pkg/DeprecatedClassByAnnotation.html"; + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); - //Input for string search tests. - private static final String[][] TEST = { - {TARGET_FILE, "annotation_test1 passes"}, - {TARGET_FILE, "annotation_test2 passes"}, - {TARGET_FILE, "annotation_test3 passes"}, - {TARGET_FILE, "class_test1 passes"}, - {TARGET_FILE, "class_test2 passes"}, - {TARGET_FILE, "class_test3 passes"}, - {TARGET_FILE, "class_test4 passes"}, - {TARGET_FILE, "enum_test1 passes"}, - {TARGET_FILE, "enum_test2 passes"}, - {TARGET_FILE, "error_test1 passes"}, - {TARGET_FILE, "error_test2 passes"}, - {TARGET_FILE, "error_test3 passes"}, - {TARGET_FILE, "error_test4 passes"}, - {TARGET_FILE, "exception_test1 passes"}, - {TARGET_FILE, "exception_test2 passes"}, - {TARGET_FILE, "exception_test3 passes"}, - {TARGET_FILE, "exception_test4 passes"}, - {TARGET_FILE, "interface_test1 passes"}, - {TARGET_FILE, "interface_test2 passes"}, - {TARGET_FILE, "interface_test3 passes"}, - {TARGET_FILE, "interface_test4 passes"}, - {TARGET_FILE, "pkg.DeprecatedClassByAnnotation"}, - {TARGET_FILE, "pkg.DeprecatedClassByAnnotation()"}, - {TARGET_FILE, "pkg.DeprecatedClassByAnnotation.method()"}, - {TARGET_FILE, "pkg.DeprecatedClassByAnnotation.field"}, + checkOutput("deprecated-list.html", true, + "annotation_test1 passes", + "annotation_test2 passes", + "annotation_test3 passes", + "class_test1 passes", + "class_test2 passes", + "class_test3 passes", + "class_test4 passes", + "enum_test1 passes", + "enum_test2 passes", + "error_test1 passes", + "error_test2 passes", + "error_test3 passes", + "error_test4 passes", + "exception_test1 passes", + "exception_test2 passes", + "exception_test3 passes", + "exception_test4 passes", + "interface_test1 passes", + "interface_test2 passes", + "interface_test3 passes", + "interface_test4 passes", + "pkg.DeprecatedClassByAnnotation", + "pkg.DeprecatedClassByAnnotation()", + "pkg.DeprecatedClassByAnnotation.method()", + "pkg.DeprecatedClassByAnnotation.field" + ); - {TARGET_FILE2, "
        @Deprecated\n" +
        -                 "public class DeprecatedClassByAnnotation\n" +
        -                 "extends java.lang.Object
        "}, - - {TARGET_FILE2, "
        @Deprecated\n" +
        -                 "public int field
        \n" + - "
        Deprecated. 
        "}, - - {TARGET_FILE2, "
        @Deprecated\n" +
        -                 "public DeprecatedClassByAnnotation()
        \n" + - "
        Deprecated. 
        "}, - - {TARGET_FILE2, "
        @Deprecated\n" +
        -                 "public void method()
        \n" + - "
        Deprecated. 
        "}, - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestDeprecatedDocs tester = new TestDeprecatedDocs(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + checkOutput("pkg/DeprecatedClassByAnnotation.html", true, + "
        @Deprecated\n"
        +                + "public class DeprecatedClassByAnnotation\n"
        +                + "extends java.lang.Object
        ", + "
        @Deprecated\n"
        +                + "public int field
        \n" + + "
        Deprecated. 
        ", + "
        @Deprecated\n"
        +                + "public DeprecatedClassByAnnotation()
        \n" + + "
        Deprecated. 
        ", + "
        @Deprecated\n"
        +                + "public void method()
        \n" + + "
        Deprecated. 
        "); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testDocEncoding/TestDocEncoding.java --- a/langtools/test/com/sun/javadoc/testDocEncoding/TestDocEncoding.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testDocEncoding/TestDocEncoding.java Fri May 16 02:13:12 2014 -0700 @@ -31,36 +31,30 @@ * @summary Run tests on -docencoding to see if the value is used for stylesheet as well. * @author jayashree viswanathan - * @library ../lib/ - * @build JavadocTester TestDocEncoding + * @library ../lib + * @build JavadocTester * @run main TestDocEncoding */ public class TestDocEncoding extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, - "-docencoding", "Cp930", - "-sourcepath", SRC_DIR, - "-notimestamp", - "pkg" - }; + public static void main(String... args) throws Exception { + TestDocEncoding tester = new TestDocEncoding(); + tester.runTests(); + } - private static final String[][] NEGATED_TEST = { - { "stylesheet.css", - "body {\n" + - " background-color:#ffffff;"} - }; + @Test + void test() { + javadoc("-d", "out", + "-docencoding", "Cp930", + "-sourcepath", testSrc, + "-notimestamp", + "pkg"); + checkExit(Exit.OK); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestDocEncoding tester = new TestDocEncoding(); - tester.run(ARGS, NO_TEST, NEGATED_TEST); - tester.printSummary(); + checkOutput("stylesheet.css", false, + "body {\n" + + " background-color:#ffffff;"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testDocErrorReporter/TestDocErrorReporter.java --- a/langtools/test/com/sun/javadoc/testDocErrorReporter/TestDocErrorReporter.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testDocErrorReporter/TestDocErrorReporter.java Fri May 16 02:13:12 2014 -0700 @@ -27,31 +27,30 @@ * @summary Make sure that option validation errors and sent to the * DocErrorReporter. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestDocErrorReporter * @run main TestDocErrorReporter */ public class TestDocErrorReporter extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-encoding", "xyz", - SRC_DIR + "/TestDocErrorReporter.java" - }; - - //Input for Javadoc return code test. - private static final int EXPECTED_EXIT_CODE = 1; - /** * The entry point of the test. - * @param args the array of command line arguments. + * @param args the array of command line arguments + * @throws Exception if the test fails */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestDocErrorReporter tester = new TestDocErrorReporter(); - int actualExitCode = tester.run(ARGS, NO_TEST, NO_TEST); - tester.checkExitCode(EXPECTED_EXIT_CODE, actualExitCode); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-encoding", "xyz", + testSrc("TestDocErrorReporter.java")); + + checkExit(Exit.FAILED); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testDocFileDir/TestDocFileDir.java --- a/langtools/test/com/sun/javadoc/testDocFileDir/TestDocFileDir.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testDocFileDir/TestDocFileDir.java Fri May 16 02:13:12 2014 -0700 @@ -21,8 +21,6 @@ * questions. */ -import java.io.File; - /* * @test * @bug 4258405 4973606 8024096 @@ -31,68 +29,59 @@ * directory. * Also test that -docfilessubdirs and -excludedocfilessubdir both work. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestDocFileDir * @run main TestDocFileDir */ public class TestDocFileDir extends JavadocTester { - private static final String[][] TEST1 = { - { "pkg/doc-files/testfile.txt", - "This doc file did not get trashed."} - }; + public static void main(String... args) throws Exception { + TestDocFileDir tester = new TestDocFileDir(); + tester.runTests(); + } - private static final String[] FILE_TEST2 = { - "pkg/doc-files/subdir-used1/testfile.txt", - "pkg/doc-files/subdir-used2/testfile.txt" - }; - private static final String[] FILE_NEGATED_TEST2 = { - "pkg/doc-files/subdir-excluded1/testfile.txt", - "pkg/doc-files/subdir-excluded2/testfile.txt" - }; - - private static final String[][] TEST0 = { - {"pkg/doc-files/testfile.txt", - "This doc file did not get trashed."} - }; - - //Output dir = Input Dir - private static final String[] ARGS1 = - new String[] { - "-d", OUTPUT_DIR + "-1", - "-sourcepath", - "blah" + File.pathSeparator + OUTPUT_DIR + "-1" + - File.pathSeparator + "blah", "pkg"}; + // Output dir = "", Input dir = "" + @Test + void test1() { + copyDir(testSrc("pkg"), "."); + setOutputDirectoryCheck(DirectoryCheck.NO_HTML_FILES); + javadoc("pkg/C.java"); + checkExit(Exit.OK); + checkOutput("pkg/doc-files/testfile.txt", true, + "This doc file did not get trashed."); + } - //Exercising -docfilessubdirs and -excludedocfilessubdir - private static final String[] ARGS2 = - new String[] { - "-d", OUTPUT_DIR + "-2", - "-sourcepath", SRC_DIR, - "-docfilessubdirs", - "-excludedocfilessubdir", "subdir-excluded1:subdir-excluded2", - "pkg"}; - - //Output dir = "", Input dir = "" - private static final String[] ARGS0 = - new String[] {"pkg/C.java"}; - + // Output dir = Input Dir + @Test + void test2() { + String outdir = "out2"; + copyDir(testSrc("pkg"), outdir); + setOutputDirectoryCheck(DirectoryCheck.NO_HTML_FILES); + javadoc("-d", outdir, + "-sourcepath", "blah" + PS + outdir + PS + "blah", + "pkg"); + checkExit(Exit.OK); + checkOutput("pkg/doc-files/testfile.txt", true, + "This doc file did not get trashed."); + } - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestDocFileDir tester = new TestDocFileDir(); - tester.setCheckOutputDirectoryCheck(DirectoryCheck.NO_HTML_FILES); - copyDir(SRC_DIR + "/pkg", "."); - tester.run(ARGS0, TEST0, NO_TEST); - copyDir(SRC_DIR + "/pkg", OUTPUT_DIR + "-1"); - tester.run(ARGS1, TEST1, NO_TEST); - tester.setCheckOutputDirectoryCheck(DirectoryCheck.NONE); - tester.run(ARGS2, NO_TEST, NO_TEST, FILE_TEST2, FILE_NEGATED_TEST2); - tester.printSummary(); + // Exercising -docfilessubdirs and -excludedocfilessubdir + @Test + void test3() { + String outdir = "out3"; + setOutputDirectoryCheck(DirectoryCheck.NONE); + javadoc("-d", outdir, + "-sourcepath", testSrc, + "-docfilessubdirs", + "-excludedocfilessubdir", "subdir-excluded1:subdir-excluded2", + "pkg"); + checkExit(Exit.OK); + checkFiles(true, + "pkg/doc-files/subdir-used1/testfile.txt", + "pkg/doc-files/subdir-used2/testfile.txt"); + checkFiles(false, + "pkg/doc-files/subdir-excluded1/testfile.txt", + "pkg/doc-files/subdir-excluded2/testfile.txt"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testDocFiles/TestDocFiles.java --- a/langtools/test/com/sun/javadoc/testDocFiles/TestDocFiles.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testDocFiles/TestDocFiles.java Fri May 16 02:13:12 2014 -0700 @@ -25,28 +25,26 @@ * @test * @bug 8008949 * @summary verify that doc-files get copied - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestDocFiles * @run main TestDocFiles */ public class TestDocFiles extends JavadocTester { - private static final String[][] TEST = { - { "pkg/doc-files/test.txt", "test file"}}; - - private static final String[] ARGS = - new String[] { - "-d", "tmp", "-sourcepath", SRC_DIR, "pkg"}; + public static void main(String... args) throws Exception { + TestDocFiles tester = new TestDocFiles(); + tester.runTests(); + } - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestDocFiles tester = new TestDocFiles(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("pkg/doc-files/test.txt", true, + "test file"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testDocRootInlineTag/TestDocRootInlineTag.java --- a/langtools/test/com/sun/javadoc/testDocRootInlineTag/TestDocRootInlineTag.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testDocRootInlineTag/TestDocRootInlineTag.java Fri May 16 02:13:12 2014 -0700 @@ -28,42 +28,38 @@ * If docRoot performs as documented, the test passes. * Make sure that the docRoot tag works with the -bottom option. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestDocRootInlineTag * @run main TestDocRootInlineTag */ public class TestDocRootInlineTag extends JavadocTester { - private static final String[][] TEST = { - { "TestDocRootTag.html", - "File"}, - { "TestDocRootTag.html", - "glossary"}, - { "TestDocRootTag.html", - "Second File Link"}, - { "TestDocRootTag.html", "The value of @docRoot is \"./\""}, - { "index-all.html", "My package page is " + - "here"} - }; - private static final String[] ARGS = - new String[] { - "-bottom", "The value of @docRoot is \"{@docRoot}\"", - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-linkoffline", "http://www.java.sun.com/j2se/1.4/docs/api", - SRC_DIR, SRC_DIR + "/TestDocRootTag.java", "pkg" - }; + public static void main(String... args) throws Exception { + TestDocRootInlineTag tester = new TestDocRootInlineTag(); + tester.runTests(); + } + + @Test + void test() { + String uri = "http://www.java.sun.com/j2se/1.4/docs/api"; - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestDocRootInlineTag tester = new TestDocRootInlineTag(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + javadoc("-bottom", "The value of @docRoot is \"{@docRoot}\"", + "-d", "out", + "-sourcepath", testSrc, + "-linkoffline", uri, testSrc, + testSrc("TestDocRootTag.java"), "pkg"); + checkExit(Exit.OK); + + checkOutput("TestDocRootTag.html", true, + "File", + "glossary", + "Second File Link", + "The value of @docRoot is \"./\""); + + checkOutput("index-all.html", true, + "My package page is here"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testDocRootLink/TestDocRootLink.java --- a/langtools/test/com/sun/javadoc/testDocRootLink/TestDocRootLink.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testDocRootLink/TestDocRootLink.java Fri May 16 02:13:12 2014 -0700 @@ -26,109 +26,78 @@ * @bug 6553182 8025416 8029504 * @summary This test verifies the -Xdocrootparent option. * @author Bhavesh Patel - * @library ../lib/ - * @build JavadocTester TestDocRootLink + * @library ../lib + * @build JavadocTester * @run main TestDocRootLink */ public class TestDocRootLink extends JavadocTester { - private static final String[][] TEST1 = { - { "pkg1/C1.html", - "Refer Here" - }, - { "pkg1/C1.html", + public static void main(String... args) throws Exception { + TestDocRootLink tester = new TestDocRootLink(); + tester.runTests(); + } + + @Test + void test1() { + javadoc("-d", "out-1", + "-sourcepath", testSrc, + "pkg1", "pkg2"); + checkExit(Exit.OK); + + checkOutput("pkg1/C1.html", true, + "Refer Here", "This Here should not be replaced\n" + - " with an absolute link." - }, - { "pkg1/C1.html", - "Testing Link 1 and\n" + - " Link 2." - }, - { "pkg1/package-summary.html", - "\n" + - " Test document 1" - }, - { "pkg1/package-summary.html", - "\n" + - " Another Test document 1" - }, - { "pkg1/package-summary.html", - "\n" + - " Another Test document 2." - } - }; - private static final String[][] NEGATED_TEST1 = { - { "pkg1/C1.html", - "" - }, - { "pkg1/C1.html", - "" - }, - { "pkg1/package-summary.html", - "" - }, - { "pkg1/package-summary.html", - "" - } - }; - private static final String[][] TEST2 = { - { "pkg2/C2.html", - "Refer Here" - }, - { "pkg2/C2.html", - "This Here should not be replaced\n" + - " with an absolute link." - }, - { "pkg2/C2.html", + " with an absolute link.", "Testing Link 1 and\n" + - " Link 2." - }, - { "pkg2/package-summary.html", - "\n" + - " Test document 1" - }, - { "pkg2/package-summary.html", - "\n" + - " Another Test document 1" - }, - { "pkg2/package-summary.html", + " Link 2."); + + checkOutput("pkg1/package-summary.html", true, + "\n" + + " Test document 1", + "\n" + + " Another Test document 1", "\n" + - " Another Test document 2." - } - }; - private static final String[][] NEGATED_TEST2 = { - { "pkg2/C2.html", - "" - }, - { "pkg2/C2.html", - "" - }, - { "pkg2/package-summary.html", - "" - }, - { "pkg2/package-summary.html", - "" - } - }; - private static final String[] ARGS1 = - new String[]{ - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg1", "pkg2" - }; - private static final String[] ARGS2 = - new String[]{ - "-d", OUTPUT_DIR + "-1", "-Xdocrootparent", - "http://download.oracle.com/javase/7/docs", "-sourcepath", - SRC_DIR, "pkg1", "pkg2" - }; + " Another Test document 2."); + + // TODO: should this check *any* reference to http://download.oracle.com/ + checkOutput("pkg1/C1.html", false, + "", + ""); + + checkOutput("pkg1/package-summary.html", false, + "", + ""); + } + + @Test + void test2() { + javadoc("-d", "out-2", + "-Xdocrootparent", "http://download.oracle.com/javase/7/docs", + "-sourcepath", testSrc, + "pkg1", "pkg2"); + checkExit(Exit.OK); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestDocRootLink tester = new TestDocRootLink(); - tester.run(ARGS1, TEST1, NEGATED_TEST1); - tester.run(ARGS2, TEST2, NEGATED_TEST2); - tester.printSummary(); + checkOutput("pkg2/C2.html", true, + "Refer Here", + "This Here should not be replaced\n" + + " with an absolute link.", + "Testing Link 1 and\n" + + " Link 2."); + + checkOutput("pkg2/package-summary.html", true, + "\n" + + " Test document 1", + "\n" + + " Another Test document 1", + "\n" + + " Another Test document 2."); + + checkOutput("pkg2/C2.html", false, + "", + ""); + + checkOutput("pkg2/package-summary.html", false, + "", + ""); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testDupParamWarn/TestDupParamWarn.java --- a/langtools/test/com/sun/javadoc/testDupParamWarn/TestDupParamWarn.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testDupParamWarn/TestDupParamWarn.java Fri May 16 02:13:12 2014 -0700 @@ -27,28 +27,26 @@ * @summary Test to ensure that the doclet does not print out bad * warning messages about duplicate param tags. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestDupParamWarn * @run main TestDupParamWarn */ public class TestDupParamWarn extends JavadocTester { - private static final String[] ARGS = - new String[] {"-d", OUTPUT_DIR, "-sourcepath", - SRC_DIR + "/", "pkg"}; - private static final String[][] NEGATED_TEST = - new String[][] {{WARNING_OUTPUT, - "Parameter \"a\" is documented more than once."}}; + public static void main(String... args) throws Exception { + JavadocTester tester = new TestDupParamWarn(); + tester.runTests(); + } - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - JavadocTester tester = new TestDupParamWarn(); - tester.run(ARGS, NO_TEST, NEGATED_TEST); - tester.printSummary(); + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput(Output.WARNING, false, + "Parameter \"a\" is documented more than once."); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testEmptyClass/TestEmptyClass.java --- a/langtools/test/com/sun/javadoc/testEmptyClass/TestEmptyClass.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testEmptyClass/TestEmptyClass.java Fri May 16 02:13:12 2014 -0700 @@ -27,39 +27,32 @@ * @summary Test to make sure that Javadoc behaves properly when * run on a completely empty class (no comments or members). * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestEmptyClass * @run main TestEmptyClass */ public class TestEmptyClass extends JavadocTester { - private static final String[][] NEGATED_TEST = { + public static void main(String... args) throws Exception { + TestEmptyClass tester = new TestEmptyClass(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-classpath", testSrc("src"), + "-d", "out", + "-sourcepath", testSrc("src"), + testSrc("src/Empty.java")); + checkExit(Exit.OK); //The overview tree should not link to classes that were not documented - { "overview-tree.html", ""}, + checkOutput("overview-tree.html", false, + ""); //The index page should not link to classes that were not documented - { "index-all.html", ""}, - }; - private static final String[] ARGS = - new String[] { - "-classpath", SRC_DIR + "/src", - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR + "/src", - SRC_DIR + "/src/Empty.java" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestEmptyClass tester = new TestEmptyClass(); - int exitCode = tester.run(ARGS, NO_TEST, NEGATED_TEST); - tester.printSummary(); - if (exitCode != 0) { - throw new Error("Error found while executing Javadoc"); - } + checkOutput("index-all.html", false, + ""); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testEnclosingClass/TestEnclosingClass.java --- a/langtools/test/com/sun/javadoc/testEnclosingClass/TestEnclosingClass.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testEnclosingClass/TestEnclosingClass.java Fri May 16 02:13:12 2014 -0700 @@ -26,31 +26,26 @@ * @bug 5008230 * @summary Check the outer class when documenting enclosing class/interface. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestEnclosingClass * @run main TestEnclosingClass */ public class TestEnclosingClass extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg" - }; + public static void main(String... args) throws Exception { + TestEnclosingClass tester = new TestEnclosingClass(); + tester.runTests(); + } - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/MyClass.MyInterface.html", "Enclosing class:"} - }; + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestEnclosingClass tester = new TestEnclosingClass(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + checkOutput("pkg/MyClass.MyInterface.html", true, + "Enclosing class:"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testEncoding/TestEncoding.java --- a/langtools/test/com/sun/javadoc/testEncoding/TestEncoding.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testEncoding/TestEncoding.java Fri May 16 02:13:12 2014 -0700 @@ -27,32 +27,28 @@ * @summary This test determines if the value of the -encoding option is * properly passed from Javadoc to the source file parser. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestEncoding * @run main TestEncoding */ public class TestEncoding extends JavadocTester { + public static void main(String... args) throws Exception { + TestEncoding tester = new TestEncoding(); + tester.runTests(); + } - //If ??? is found in the output, the source file was not read with the correct encoding setting. - private static final String[][] NEGATED_TEST = { - { "EncodeTest.html", "??"} - }; - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-encoding", "iso-8859-1", SRC_DIR + "/EncodeTest.java" - }; + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-encoding", "iso-8859-1", + testSrc("EncodeTest.java")); + checkExit(Exit.OK); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestEncoding tester = new TestEncoding(); - tester.run(ARGS, NO_TEST, NEGATED_TEST); - tester.printSummary(); + // If ??? is found in the output, the source file was not read with the correct encoding setting. + checkOutput("EncodeTest.html", false, + "??"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testExternalOverridenMethod/TestExternalOverridenMethod.java --- a/langtools/test/com/sun/javadoc/testExternalOverridenMethod/TestExternalOverridenMethod.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testExternalOverridenMethod/TestExternalOverridenMethod.java Fri May 16 02:13:12 2014 -0700 @@ -28,41 +28,38 @@ * are documented properly. The method should still include "implements" or * "overrides" documentation even though the method is external. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester TestExternalOverridenMethod * @run main TestExternalOverridenMethod */ public class TestExternalOverridenMethod extends JavadocTester { - private static final String[][] TEST = { - { "pkg/XReader.html", - "
        Overrides:
        \n" + - "
        read in class " + - "FilterReader
        "}, - { "pkg/XReader.html", - "
        Specified by:
        \n" + - "
        readInt in interface " + - "DataInput
        "}}; + public static void main(String... args) throws Exception { + TestExternalOverridenMethod tester = new TestExternalOverridenMethod(); + tester.runTests(); + } - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-linkoffline", "http://java.sun.com/j2se/1.4.1/docs/api", SRC_DIR, - "pkg" - }; + @Test + void test() { + String uri = "http://java.sun.com/j2se/1.4.1/docs/api"; + javadoc("-d", "out", + "-sourcepath", testSrc, + "-linkoffline", uri, testSrc, + "pkg"); + checkExit(Exit.OK); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestExternalOverridenMethod tester = new TestExternalOverridenMethod(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + checkOutput("pkg/XReader.html", true, + "
        Overrides:
        \n" + + "
        read in class " + + "FilterReader
        ", + "
        Specified by:
        \n" + + "
        readInt in interface " + + "DataInput
        " + ); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testGeneratedBy/TestGeneratedBy.java --- a/langtools/test/com/sun/javadoc/testGeneratedBy/TestGeneratedBy.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testGeneratedBy/TestGeneratedBy.java Fri May 16 02:13:12 2014 -0700 @@ -25,14 +25,41 @@ * @test * @bug 8000418 8024288 * @summary Verify that files use a common Generated By string - * @library ../lib/ - * @build JavadocTester TestGeneratedBy + * @library ../lib + * @build JavadocTester * @run main TestGeneratedBy */ public class TestGeneratedBy extends JavadocTester { - private static final String[] FILES = { + public static void main(String... args) throws Exception { + TestGeneratedBy tester = new TestGeneratedBy(); + tester.runTests(); + } + + @Test + void testTimestamp() { + javadoc("-d", "out-timestamp", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkTimestamps(true); + } + + @Test + void testNoTimestamp() { + javadoc("-d", "out-notimestamp", + "-notimestamp", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkTimestamps(false); + } + + void checkTimestamps(boolean timestamp) { + checkTimestamps(timestamp, "pkg/MyClass.html", "pkg/package-summary.html", "pkg/package-frame.html", @@ -45,63 +72,25 @@ "serialized-form.html", "help-doc.html", "index-all.html", - "index.html" - }; - - private static final String[] STD_ARGS = - new String[] { - "-d", OUTPUT_DIR, - "-sourcepath", SRC_DIR, - "pkg" - }; + "index.html"); - private static final String[] NO_TIMESTAMP_ARGS = - new String[] { - "-notimestamp", - "-d", OUTPUT_DIR + "-1", - "-sourcepath", SRC_DIR, - "pkg" - }; - - - private static String[][] getTests(boolean timestamp) { - String version = System.getProperty("java.version"); - String[][] tests = new String[FILES.length][]; - for (int i = 0; i < FILES.length; i++) { - String genBy = "Generated by javadoc"; - if (timestamp) genBy += " (" + version + ") on "; - tests[i] = new String[] { - FILES[i], genBy - }; - } - return tests; } - private static String[][] getNegatedTests(boolean timestamp) { - String[][] tests = new String[FILES.length][]; - for (int i = 0; i < FILES.length; i++) { - tests[i] = new String[] { - FILES[i], + void checkTimestamps(boolean timestamp, String... files) { + String version = System.getProperty("java.version"); + String genBy = "Generated by javadoc"; + if (timestamp) genBy += " (" + version + ") on "; + + for (String file: files) { + // genBy is the current standard "Generated by" text + checkOutput(file, true, genBy); + + // These are older versions of the "Generated by" text + checkOutput(file, false, (timestamp ? "Generated by javadoc (version" : "Generated by javadoc ("), - "Generated by javadoc on" - }; - } - return tests; - } - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestGeneratedBy tester = new TestGeneratedBy(); - int ec1 = tester.run(STD_ARGS, getTests(true), getNegatedTests(true)); - int ec2 = tester.run(NO_TIMESTAMP_ARGS, getTests(false), getNegatedTests(false)); - tester.printSummary(); - if (ec1 != 0 || ec2 != 0) { - throw new Error("Error found while executing Javadoc"); + "Generated by javadoc on"); } } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testGroupOption/TestGroupOption.java --- a/langtools/test/com/sun/javadoc/testGroupOption/TestGroupOption.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testGroupOption/TestGroupOption.java Fri May 16 02:13:12 2014 -0700 @@ -27,49 +27,46 @@ * @summary Test to make sure the -group option does not cause a bad warning * to be printed. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestGroupOption * @run main TestGroupOption */ public class TestGroupOption extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS1 = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-group", "Package One", "pkg1", - "-group", "Package Two", "pkg2", - "-group", "Package Three", "pkg3", - "pkg1", "pkg2", "pkg3" - }; + public static void main(String... args) throws Exception { + TestGroupOption tester = new TestGroupOption(); + tester.runTests(); + } - private static final String[] ARGS2 = new String[] { - "-d", OUTPUT_DIR + "-1", "-sourcepath", SRC_DIR, - "-group", "Package One", "pkg1", - "-group", "Package One", "pkg2", - "-group", "Package One", "pkg3", - "pkg1", "pkg2", "pkg3" - }; + @Test + void test1() { + //Make sure the warning is not printed when -group is used correctly. + javadoc("-d", "out-1", + "-sourcepath", testSrc, + "-group", "Package One", "pkg1", + "-group", "Package Two", "pkg2", + "-group", "Package Three", "pkg3", + "pkg1", "pkg2", "pkg3"); + checkExit(Exit.OK); - //Input for string search tests. - private static final String[][] NEGATED_TEST1 = {{WARNING_OUTPUT, "-group"}}; - - private static final String[][] TEST2 = {{WARNING_OUTPUT, "-group"}}; + checkOutput(Output.WARNING, false, + "-group"); + } - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - //Make sure the warning is not printed when -group is used correctly. - TestGroupOption tester = new TestGroupOption(); - tester.run(ARGS1, NO_TEST, NEGATED_TEST1); - tester.printSummary(); + @Test + void test2() { + //Make sure the warning is printed when -group is not used correctly. + javadoc("-d", "out-2", + "-sourcepath", testSrc, + "-group", "Package One", "pkg1", + "-group", "Package One", "pkg2", + "-group", "Package One", "pkg3", + "pkg1", "pkg2", "pkg3"); + checkExit(Exit.OK); - //Make sure the warning is printed when -group is not used correctly. - tester = new TestGroupOption(); - tester.run(ARGS2, TEST2, NO_TEST); - tester.printSummary(); + checkOutput(Output.WARNING, true, + "-group"); + } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testHeadings/TestHeadings.java --- a/langtools/test/com/sun/javadoc/testHeadings/TestHeadings.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testHeadings/TestHeadings.java Fri May 16 02:13:12 2014 -0700 @@ -26,7 +26,7 @@ * @bug 4905786 6259611 * @summary Make sure that headings use the TH tag instead of the TD tag. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester * @build TestHeadings * @run main TestHeadings @@ -34,87 +34,82 @@ public class TestHeadings extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-use", "-header", "Test Files", - "pkg1", "pkg2" - }; - - //Input for string search tests. private static final String[][] TEST = { - //Package summary - { "pkg1/package-summary.html", - "" + - "Class\n" + - "Description" - }, - // Class documentation - { "pkg1/C1.html", - "Modifier and Type\n" + - "Field and Description" - }, - { "pkg1/C1.html", - "

        Methods inherited from class java.lang.Object

        " + { }, - - // Class use documentation - { "pkg1/class-use/C1.html", - "Package\n" + - "Description" + { "serialized-form.html" }, - { "pkg1/class-use/C1.html", - "Modifier and Type\n" + - "Field and Description" + { "serialized-form.html" }, - // Deprecated - { "deprecated-list.html", - "Method and Description" - }, - - // Constant values - { "constant-values.html", - "" + - "Modifier and Type\n" + - "Constant Field\n" + - "Value" - }, - - // Serialized Form - { "serialized-form.html", - "

        Package pkg1

        " + { }, - { "serialized-form.html", - "

        Class " + - "pkg1.C1 extends java.lang.Object implements Serializable

        " - }, - { "serialized-form.html", - "

        Serialized Fields

        " + { "overview-frame.html" }, - - // Overview Frame - { "overview-frame.html", - "

        Test Files

        " - }, - { "overview-frame.html", - "Overview List" - }, - - // Overview Summary - { "overview-summary.html", - "Overview" + { } }; - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestHeadings tester = new TestHeadings(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-use", + "-header", "Test Files", + "pkg1", "pkg2"); + checkExit(Exit.OK); + + //Package summary + checkOutput("pkg1/package-summary.html", true, + "" + + "Class\n" + + "Description"); + + // Class documentation + checkOutput("pkg1/C1.html", true, + "Modifier and Type\n" + + "Field and Description", + "

        Methods inherited from class java.lang.Object

        "); + + // Class use documentation + checkOutput("pkg1/class-use/C1.html", true, + "Package\n" + + "Description", + "Modifier and Type\n" + + "Field and Description"); + + // Deprecated + checkOutput("deprecated-list.html", true, + "Method and Description"); + + // Constant values + checkOutput("constant-values.html", true, + "" + + "Modifier and Type\n" + + "Constant Field\n" + + "Value"); + + // Serialized Form + checkOutput("serialized-form.html", true, + "

        Package pkg1

        ", + "

        Class " + + "pkg1.C1 extends java.lang.Object implements Serializable

        ", + "

        Serialized Fields

        "); + + // Overview Frame + checkOutput("overview-frame.html", true, + "

        Test Files

        ", + "Overview List"); + + // Overview Summary + checkOutput("overview-summary.html", true, + "Overview"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testHelpFile/TestHelpFile.java --- a/langtools/test/com/sun/javadoc/testHelpFile/TestHelpFile.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testHelpFile/TestHelpFile.java Fri May 16 02:13:12 2014 -0700 @@ -26,32 +26,26 @@ * @bug 7132631 * @summary Make sure that the help file is generated correctly. * @author Bhavesh Patel - * @library ../lib/ - * @build JavadocTester TestHelpFile + * @library ../lib + * @build JavadocTester * @run main TestHelpFile */ public class TestHelpFile extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - SRC_DIR + "/TestHelpFile.java" - }; + public static void main(String... args) throws Exception { + TestHelpFile tester = new TestHelpFile(); + tester.runTests(); + } - private static final String[][] TEST = { - { "help-doc.html", - "Constant Field Values" - }, - }; + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + testSrc("TestHelpFile.java")); + checkExit(Exit.OK); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestHelpFile tester = new TestHelpFile(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + checkOutput("help-doc.html", true, + "Constant Field Values"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testHelpOption/TestHelpOption.java --- a/langtools/test/com/sun/javadoc/testHelpOption/TestHelpOption.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testHelpOption/TestHelpOption.java Fri May 16 02:13:12 2014 -0700 @@ -27,81 +27,79 @@ * @summary Make sure that the -help option works properly. Make sure * the help link appears in the documentation. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester TestHelpOption * @run main TestHelpOption */ public class TestHelpOption extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-help", - SRC_DIR + "/TestHelpOption.java" - }; + public static void main(String... args) throws Exception { + TestHelpOption tester = new TestHelpOption(); + tester.runTests(); + } + + @Test + void testWithOption() { + javadoc("-d", "out1", + "-sourcepath", testSrc, + "-help", + testSrc("TestHelpOption.java")); + checkExit(Exit.OK); - private static final String[] ARGS2 = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - SRC_DIR + "/TestHelpOption.java" - }; + checkOutput(true); + } + + @Test + void testWithoutOption() { + javadoc("-d", "out2", + "-sourcepath", testSrc, + testSrc("TestHelpOption.java")); + checkExit(Exit.OK); + + checkOutput(false); + } - private static final String[][] TEST = { - {STANDARD_OUTPUT, "-d "}, - {STANDARD_OUTPUT, "-use "}, - {STANDARD_OUTPUT, "-version "}, - {STANDARD_OUTPUT, "-author "}, - {STANDARD_OUTPUT, "-docfilessubdirs "}, - {STANDARD_OUTPUT, "-splitindex "}, - {STANDARD_OUTPUT, "-windowtitle "}, - {STANDARD_OUTPUT, "-doctitle "}, - {STANDARD_OUTPUT, "-header "}, - {STANDARD_OUTPUT, "-footer "}, - {STANDARD_OUTPUT, "-bottom "}, - {STANDARD_OUTPUT, "-link "}, - {STANDARD_OUTPUT, "-linkoffline "}, - {STANDARD_OUTPUT, "-excludedocfilessubdir "}, - {STANDARD_OUTPUT, "-group "}, - {STANDARD_OUTPUT, "-nocomment "}, - {STANDARD_OUTPUT, "-nodeprecated "}, - {STANDARD_OUTPUT, "-noqualifier "}, - {STANDARD_OUTPUT, "-nosince "}, - {STANDARD_OUTPUT, "-notimestamp "}, - {STANDARD_OUTPUT, "-nodeprecatedlist "}, - {STANDARD_OUTPUT, "-notree "}, - {STANDARD_OUTPUT, "-noindex "}, - {STANDARD_OUTPUT, "-nohelp "}, - {STANDARD_OUTPUT, "-nonavbar "}, - {STANDARD_OUTPUT, "-serialwarn "}, - {STANDARD_OUTPUT, "-tag "}, - {STANDARD_OUTPUT, "-taglet "}, - {STANDARD_OUTPUT, "-tagletpath "}, - {STANDARD_OUTPUT, "-charset "}, - {STANDARD_OUTPUT, "-helpfile "}, - {STANDARD_OUTPUT, "-linksource "}, - {STANDARD_OUTPUT, "-sourcetab "}, - {STANDARD_OUTPUT, "-keywords "}, - {STANDARD_OUTPUT, "-stylesheetfile "}, - {STANDARD_OUTPUT, "-docencoding "}, - }; + private void checkOutput(boolean withOption) { + checkOutput(Output.STDOUT, withOption, + "-d ", + "-use ", + "-version ", + "-author ", + "-docfilessubdirs ", + "-splitindex ", + "-windowtitle ", + "-doctitle ", + "-header ", + "-footer ", + "-bottom ", + "-link ", + "-linkoffline ", + "-excludedocfilessubdir ", + "-group ", + "-nocomment ", + "-nodeprecated ", + "-noqualifier ", + "-nosince ", + "-notimestamp ", + "-nodeprecatedlist ", + "-notree ", + "-noindex ", + "-nohelp ", + "-nonavbar ", + "-serialwarn ", + "-tag ", + "-taglet ", + "-tagletpath ", + "-charset ", + "-helpfile ", + "-linksource ", + "-sourcetab ", + "-keywords ", + "-stylesheetfile ", + "-docencoding "); - private static final String[][] TEST2 = { - { "TestHelpOption.html", - "
      • Help
      • " - }, - }; - - //The help option should not crash the doclet. - private static final int EXPECTED_EXIT_CODE = 0; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestHelpOption tester = new TestHelpOption(); - int actualExitCode = tester.run(ARGS, TEST, NO_TEST); - tester.checkExitCode(EXPECTED_EXIT_CODE, actualExitCode); - tester.run(ARGS2, TEST2, NO_TEST); - tester.printSummary(); + checkOutput("TestHelpOption.html", !withOption, + "
      • Help
      • "); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testHiddenMembers/TestHiddenMembers.java --- a/langtools/test/com/sun/javadoc/testHiddenMembers/TestHiddenMembers.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testHiddenMembers/TestHiddenMembers.java Fri May 16 02:13:12 2014 -0700 @@ -27,34 +27,37 @@ * @summary Test to make sure that hidden overriden members are not * documented as inherited. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestHiddenMembers * @run main TestHiddenMembers */ public class TestHiddenMembers extends JavadocTester { - - //We should not inherit any members from BaseClass because they are all overriden and hidden - //(declared as private). private static final String[][] NEGATED_TEST = { - { "pkg/SubClass.html", - "inherited from class pkg.BaseClass"} + { } }; private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "pkg" + }; - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestHiddenMembers tester = new TestHiddenMembers(); - tester.run(ARGS, NO_TEST, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + // We should not inherit any members from BaseClass because they are all overriden and hidden + // (declared as private). + // TODO: check normal case of generated tags: upper case of lower case + checkOutput("pkg/SubClass.html", false, + "inherited from class pkg.BaseClass"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testHref/TestHref.java --- a/langtools/test/com/sun/javadoc/testHref/TestHref.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testHref/TestHref.java Fri May 16 02:13:12 2014 -0700 @@ -26,73 +26,57 @@ * @bug 4663254 8016328 8025633 8026567 * @summary Verify that spaces do not appear in hrefs and anchors. * @author jamieh - * @library ../lib/ - * @build JavadocTester TestHref + * @library ../lib + * @build JavadocTester * @run main TestHref */ public class TestHref extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-linkoffline", - "http://java.sun.com/j2se/1.4/docs/api/", SRC_DIR, "pkg" - }; + public static void main(String... args) throws Exception { + TestHref tester = new TestHref(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-Xdoclint:none", + "-d", "out", + "-sourcepath", testSrc, + "-linkoffline", "http://java.sun.com/j2se/1.4/docs/api/", testSrc, + "pkg"); + checkExit(Exit.OK); - //Input for string search tests. - private static final String[][] TEST = { - //External link. - { "pkg/C1.html", - "href=\"http://java.sun.com/j2se/1.4/docs/api/java/lang/Object.html?is-external=true#wait-long-int-\"" - }, - //Member summary table link. - { "pkg/C1.html", - "href=\"../pkg/C1.html#method-int-int-java.util.ArrayList-\"" - }, - //Anchor test. - { "pkg/C1.html", - "\n" + - "\n" + - "" - }, - //Backward compatibility anchor test. - { "pkg/C1.html", - "\n" + - "\n" + - "" - }, - //{@link} test. - { "pkg/C2.html", - "Link: " - }, - //@see test. - { "pkg/C2.html", - "See Also:\n" + - "
        " - }, + checkOutput("pkg/C1.html", true, + //External link. + "href=\"http://java.sun.com/j2se/1.4/docs/api/java/lang/Object.html?is-external=true#wait-long-int-\"", + //Member summary table link. + "href=\"../pkg/C1.html#method-int-int-java.util.ArrayList-\"", + //Anchor test. + "\n" + + "\n" + + "", + //Backward compatibility anchor test."pkg/C1.html", + "\n" + + "\n" + + ""); - //Header does not link to the page itself. - { "pkg/C4.html", - "Class C4<E extends C4<E>>" - }, + checkOutput("pkg/C2.html", true, + //{@link} test. + "Link: ", + //@see test. + "See Also:\n" + + "
        " + ); - //Signature does not link to the page itself. - { "pkg/C4.html", - "public abstract class C4<E extends C4<E>>" - }, - }; - private static final String[][] NEGATED_TEST = - { - {WARNING_OUTPUT, " tag is malformed"} - }; + checkOutput("pkg/C4.html", true, + //Header does not link to the page itself. + "Class C4<E extends C4<E>>", + //Signature does not link to the page itself. + "public abstract class C4<E extends C4<E>>" + ); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestHref tester = new TestHref(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + checkOutput(Output.WARNING, false, + " tag is malformed"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testHrefInDocComment/TestHrefInDocComment.java --- a/langtools/test/com/sun/javadoc/testHrefInDocComment/TestHrefInDocComment.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testHrefInDocComment/TestHrefInDocComment.java Fri May 16 02:13:12 2014 -0700 @@ -27,26 +27,22 @@ * @summary Determine if Hrefs are processed properly when they * appear in doc comments. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestHrefInDocComment * @run main TestHrefInDocComment */ public class TestHrefInDocComment extends JavadocTester { - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg"}; + public static void main(String... args) throws Exception { + TestHrefInDocComment tester = new TestHrefInDocComment(); + tester.runTests(); + } - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestHrefInDocComment tester = new TestHrefInDocComment(); - if (tester.run(ARGS, NO_TEST, NO_TEST) != 0) { - throw new Error("Javadoc failed to execute properly with given source."); - } + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, "pkg"); + checkExit(Exit.OK); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testHtmlComments/TestHtmlComments.java --- a/langtools/test/com/sun/javadoc/testHtmlComments/TestHtmlComments.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testHtmlComments/TestHtmlComments.java Fri May 16 02:13:12 2014 -0700 @@ -27,32 +27,26 @@ * @summary The field detail comment should not show up in the output if there * are no fields to document. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestHtmlComments * @run main TestHtmlComments */ public class TestHtmlComments extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, SRC_DIR + "/C.java" - }; + public static void main(String... args) throws Exception { + TestHtmlComments tester = new TestHtmlComments(); + tester.runTests(); + } - //Input for string search tests. - private static final String[][] NEGATED_TEST = { - { "C.html", - ""} - }; + @Test + void run() { + javadoc("-d", "out", + "-sourcepath", testSrc, + testSrc("C.java")); + checkExit(Exit.OK); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestHtmlComments tester = new TestHtmlComments(); - tester.run(ARGS, NO_TEST, NEGATED_TEST); - tester.printSummary(); + checkOutput("C.html", false, + ""); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/TestHtmlDefinitionListTag.java --- a/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/TestHtmlDefinitionListTag.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/TestHtmlDefinitionListTag.java Fri May 16 02:13:12 2014 -0700 @@ -28,159 +28,250 @@ * @bug 6786690 6820360 8025633 8026567 * @summary This test verifies the nesting of definition list tags. * @author Bhavesh Patel - * @library ../lib/ - * @build JavadocTester TestHtmlDefinitionListTag + * @library ../lib + * @build JavadocTester * @run main TestHtmlDefinitionListTag */ +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + public class TestHtmlDefinitionListTag extends JavadocTester { - // Test common to all runs of javadoc. The class signature should print - // properly enclosed definition list tags and the Annotation Type - // Optional Element should print properly nested definition list tags - // for default value. - private static final String[][] TEST_ALL = { - { "pkg1/C1.html", + public static void main(String... args) throws Exception { + TestHtmlDefinitionListTag tester = new TestHtmlDefinitionListTag(); + tester.runTests(); + } + + @Test + void test_Comment_Deprecated() { +// tester.run(ARGS1, TEST_ALL, NEGATED_TEST_NO_C5); +// tester.runTestsOnHTML(NO_TEST, NEGATED_TEST_C5); +// tester.runTestsOnHTML(TEST_CMNT_DEPR, NO_TEST); + javadoc("-Xdoclint:none", + "-d", "out-1", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.OK); + checkCommon(true); + checkCommentDeprecated(true); + } + + @Test + void test_NoComment_Deprecated() { +// tester.run(ARGS2, TEST_ALL, NEGATED_TEST_NO_C5); +// tester.runTestsOnHTML(NO_TEST, NEGATED_TEST_C5); +// tester.runTestsOnHTML(NO_TEST, TEST_CMNT_DEPR); + javadoc("-Xdoclint:none", + "-d", "out-2", + "-nocomment", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.OK); + checkCommon(true); + checkCommentDeprecated(false); // ?? + } + + @Test + void test_Comment_NoDeprecated() { +// tester.run(ARGS3, TEST_ALL, NEGATED_TEST_NO_C5); +// tester.runTestsOnHTML(TEST_NODEPR, TEST_NOCMNT_NODEPR); + javadoc("-Xdoclint:none", + "-d", "out-3", + "-nodeprecated", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.OK); + checkCommon(false); + checkNoDeprecated(); + checkNoCommentNoDeprecated(false); + } + + @Test + void testNoCommentNoDeprecated() { +// tester.run(ARGS4, TEST_ALL, NEGATED_TEST_NO_C5); +// tester.runTestsOnHTML(TEST_NOCMNT_NODEPR, TEST_CMNT_DEPR); + javadoc("-Xdoclint:none", + "-d", "out-4", + "-nocomment", + "-nodeprecated", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.OK); + checkCommon(false); + checkNoCommentNoDeprecated(true); + checkCommentDeprecated(false); + } + + void checkCommon(boolean checkC5) { + // Test common to all runs of javadoc. The class signature should print + // properly enclosed definition list tags and the Annotation Type + // Optional Element should print properly nested definition list tags + // for default value. + checkOutput("pkg1/C1.html", true, "
        public class C1\n" +
                         "extends java.lang.Object\n" +
        -                "implements java.io.Serializable
        "}, - { "pkg1/C4.html", + "implements java.io.Serializable"); + checkOutput("pkg1/C4.html", true, "
        \n" + "
        Default:
        \n" + "
        true
        \n" + - "
        "}}; + ""); + + // Test for valid HTML generation which should not comprise of empty + // definition list tags. + List files= new ArrayList<>(Arrays.asList( + "pkg1/package-summary.html", + "pkg1/C1.html", + "pkg1/C1.ModalExclusionType.html", + "pkg1/C2.html", + "pkg1/C2.ModalType.html", + "pkg1/C3.html", + "pkg1/C4.html", + "overview-tree.html", + "serialized-form.html" + )); - // Test for normal run of javadoc in which various ClassDocs and - // serialized form should have properly nested definition list tags - // enclosing comments, tags and deprecated information. - private static final String[][] TEST_CMNT_DEPR = { - { "pkg1/package-summary.html", - "
        \n" + - "
        Since:
        \n" + - "
        JDK1.0
        \n" + - "
        "}, - { "pkg1/C1.html", + if (checkC5) + files.add("pkg1/C5.html"); + + for (String f: files) { + checkOutput(f, false, + "
        ", + "
        \n
        "); + } + } + + void checkCommentDeprecated(boolean expectFound) { + // Test for normal run of javadoc in which various ClassDocs and + // serialized form should have properly nested definition list tags + // enclosing comments, tags and deprecated information. + checkOutput("pkg1/package-summary.html", expectFound, "
        \n" + "
        Since:
        \n" + "
        JDK1.0
        \n" + - "
        See Also:
        \n" + - "
        " + - "C2, \n" + - "" + - "Serialized Form
        \n" + - "
        "}, - { "pkg1/C1.html", - "
        \n" + - "
        Since:
        \n" + - "
        1.4
        \n" + - "
        See Also:
        \n" + - "
        " + - "setUndecorated(boolean)
        \n" + - "
        "}, - { "pkg1/C1.html", - "
        \n" + - "
        Parameters:
        \n" + - "
        title - the title
        \n" + - "
        test - boolean value" + - "
        \n" + - "
        Throws:
        \n" + - "
        java.lang.IllegalArgumentException - if the " + - "owner's\n" + - " GraphicsConfiguration is not from a screen " + - "device
        \n" + - "
        HeadlessException
        \n" + - "
        "}, - { "pkg1/C1.html", - "
        \n" + - "
        Parameters:
        \n" + - "
        undecorated" + - " - true if no decorations are\n" + - " to be enabled;\n" + - " false " + - "if decorations are to be enabled.
        \n" + - "
        Since:" + - "
        \n" + - "
        1.4
        \n" + - "
        See Also:
        \n" + - "
        " + - "readObject()" + - "
        \n" + - "
        "}, - { "pkg1/C1.html", - "
        \n" + - "
        Throws:
        \n" + - "
        java.io.IOException
        \n" + - "
        See Also:" + - "
        \n" + - "
        " + - "setUndecorated(boolean)
        \n" + - "
        "}, - { "pkg1/C2.html", - "
        \n" + - "
        Parameters:" + - "
        \n" + - "
        set - boolean
        \n" + - "
        " + - "Since:
        \n" + - "
        1.4
        \n" + - "
        "}, - { "serialized-form.html", - "
        \n" + - "
        Throws:" + - "
        \n" + - "
        " + - "java.io.IOException
        \n" + - "
        See Also:" + - "
        \n" + - "
        " + - "C1.setUndecorated(boolean)
        \n" + - "
        "}, - { "serialized-form.html", - "Deprecated." + - " As of JDK version 1.5, replaced by\n" + - " " + - "setUndecorated(boolean).\n" + - "
        This field indicates whether the C1 is " + - "undecorated.
        \n" + - " \n" + - "
        \n" + - "
        Since:
        \n" + - "
        1.4
        \n" + - "
        See Also:" + - "
        \n" + - "
        " + - "C1.setUndecorated(boolean)
        \n" + - "
        "}, - { "serialized-form.html", - "Deprecated." + - " As of JDK version 1.5, replaced by\n" + - " " + - "setUndecorated(boolean).\n" + - "
        Reads the object stream.
        \n" + - "
        \n" + - "
        Throws:" + - "
        \n" + - "
        " + - "IOException
        \n" + - "
        java.io.IOException
        \n" + - "
        "}, - { "serialized-form.html", - "Deprecated." + - " \n" + - "
        The name for this class.
        "}}; + ""); + + checkOutput("pkg1/C1.html", expectFound, + "
        \n" + + "
        Since:
        \n" + + "
        JDK1.0
        \n" + + "
        See Also:
        \n" + + "
        " + + "C2, \n" + + "" + + "Serialized Form
        \n" + + "
        ", + "
        \n" + + "
        Since:
        \n" + + "
        1.4
        \n" + + "
        See Also:
        \n" + + "
        " + + "setUndecorated(boolean)
        \n" + + "
        ", + "
        \n" + + "
        Parameters:
        \n" + + "
        title - the title
        \n" + + "
        test - boolean value" + + "
        \n" + + "
        Throws:
        \n" + + "
        java.lang.IllegalArgumentException - if the " + + "owner's\n" + + " GraphicsConfiguration is not from a screen " + + "device
        \n" + + "
        HeadlessException
        \n" + + "
        ", + "
        \n" + + "
        Parameters:
        \n" + + "
        undecorated" + + " - true if no decorations are\n" + + " to be enabled;\n" + + " false " + + "if decorations are to be enabled.
        \n" + + "
        Since:" + + "
        \n" + + "
        1.4
        \n" + + "
        See Also:
        \n" + + "
        " + + "readObject()" + + "
        \n" + + "
        ", + "
        \n" + + "
        Throws:
        \n" + + "
        java.io.IOException
        \n" + + "
        See Also:" + + "
        \n" + + "
        " + + "setUndecorated(boolean)
        \n" + + "
        "); - // Test with -nodeprecated option. The ClassDocs should have properly nested - // definition list tags enclosing comments and tags. The ClassDocs should not - // display definition list for deprecated information. The serialized form - // should display properly nested definition list tags for comments, tags - // and deprecated information. - private static final String[][] TEST_NODEPR = { - { "pkg1/package-summary.html", + checkOutput("pkg1/C2.html", expectFound, + "
        \n" + + "
        Parameters:" + + "
        \n" + + "
        set - boolean
        \n" + + "
        " + + "Since:
        \n" + + "
        1.4
        \n" + + "
        "); + + checkOutput("serialized-form.html", expectFound, + "
        \n" + + "
        Throws:" + + "
        \n" + + "
        " + + "java.io.IOException
        \n" + + "
        See Also:" + + "
        \n" + + "
        " + + "C1.setUndecorated(boolean)
        \n" + + "
        ", + "Deprecated." + + " As of JDK version 1.5, replaced by\n" + + " " + + "setUndecorated(boolean).\n" + + "
        This field indicates whether the C1 is " + + "undecorated.
        \n" + + " \n" + + "
        \n" + + "
        Since:
        \n" + + "
        1.4
        \n" + + "
        See Also:" + + "
        \n" + + "
        " + + "C1.setUndecorated(boolean)
        \n" + + "
        ", + "Deprecated." + + " As of JDK version 1.5, replaced by\n" + + " " + + "setUndecorated(boolean).\n" + + "
        Reads the object stream.
        \n" + + "
        \n" + + "
        Throws:" + + "
        \n" + + "
        " + + "IOException
        \n" + + "
        java.io.IOException
        \n" + + "
        ", + "Deprecated." + + " \n" + + "
        The name for this class.
        "); + } + + void checkNoDeprecated() { + // Test with -nodeprecated option. The ClassDocs should have properly nested + // definition list tags enclosing comments and tags. The ClassDocs should not + // display definition list for deprecated information. The serialized form + // should display properly nested definition list tags for comments, tags + // and deprecated information. + checkOutput("pkg1/package-summary.html", true, "
        \n" + "
        Since:
        \n" + "
        JDK1.0
        \n" + - "
        "}, - { "pkg1/C1.html", + ""); + + checkOutput("pkg1/C1.html", true, "
        \n" + "
        Since:" + "
        \n" + @@ -191,216 +282,124 @@ "C2, \n" + "" + "Serialized Form
        \n" + - ""}, - { "pkg1/C1.html", - "
        \n" + - "
        Parameters:" + - "
        \n" + - "
        title - the title
        \n" + - "
        " + - "test - boolean value
        \n" + - "
        Throws:" + - "
        \n" + - "
        java.lang.IllegalArgumentException" + - " - if the owner's\n" + - " GraphicsConfiguration" + - " is not from a screen device
        \n" + - "
        " + - "HeadlessException
        \n" + - "
        "}, - { "pkg1/C1.html", - "
        \n" + - "
        Parameters:" + - "
        \n" + - "
        undecorated - true" + - " if no decorations are\n" + - " to be enabled;\n" + - " false if decorations are to be enabled." + - "
        \n" + - "
        Since:
        \n" + - "
        1.4
        \n" + - "
        See Also:
        \n" + - "
        " + - "readObject()
        \n" + - "
        "}, - { "pkg1/C1.html", - "
        \n" + - "
        Throws:" + - "
        \n" + - "
        java.io.IOException
        \n" + - "
        " + - "See Also:
        \n" + - "
        " + - "setUndecorated(boolean)
        \n" + - "
        "}, - { "serialized-form.html", - "
        \n" + - "
        Throws:" + - "
        \n" + - "
        " + - "java.io.IOException
        \n" + - "
        See Also:" + - "
        \n" + - "
        " + - "C1.setUndecorated(boolean)
        \n" + - "
        "}, - { "serialized-form.html", - "Deprecated." + - " As of JDK version 1.5, replaced by\n" + - " " + - "setUndecorated(boolean).\n" + - "
        This field indicates whether the C1 is " + - "undecorated.
        \n" + - " \n" + - "
        \n" + - "
        Since:
        \n" + - "
        1.4
        \n" + - "
        See Also:" + - "
        \n" + - "
        " + - "C1.setUndecorated(boolean)
        \n" + - "
        "}, - { "serialized-form.html", - "Deprecated." + - " As of JDK version 1.5, replaced by\n" + - " " + - "setUndecorated(boolean).\n" + - "
        Reads the object stream.
        \n" + - "
        \n" + - "
        Throws:" + - "
        \n" + - "
        " + - "IOException
        \n" + - "
        java.io.IOException
        \n" + - "
        "}, - { "serialized-form.html", - "Deprecated." + - " \n" + - "
        " + - "The name for this class.
        "}}; + ""); + + checkOutput("pkg1/C1.html", true, + "
        \n" + + "
        Parameters:" + + "
        \n" + + "
        title - the title
        \n" + + "
        " + + "test - boolean value
        \n" + + "
        Throws:" + + "
        \n" + + "
        java.lang.IllegalArgumentException" + + " - if the owner's\n" + + " GraphicsConfiguration" + + " is not from a screen device
        \n" + + "
        " + + "HeadlessException
        \n" + + "
        ", + "
        \n" + + "
        Parameters:" + + "
        \n" + + "
        undecorated - true" + + " if no decorations are\n" + + " to be enabled;\n" + + " false if decorations are to be enabled." + + "
        \n" + + "
        Since:
        \n" + + "
        1.4
        \n" + + "
        See Also:
        \n" + + "
        " + + "readObject()
        \n" + + "
        ", + "
        \n" + + "
        Throws:" + + "
        \n" + + "
        java.io.IOException
        \n" + + "
        " + + "See Also:
        \n" + + "
        " + + "setUndecorated(boolean)
        \n" + + "
        "); - // Test with -nocomment and -nodeprecated options. The ClassDocs whould - // not display definition lists for any member details. - private static final String[][] TEST_NOCMNT_NODEPR = { - { "pkg1/C1.html", + checkOutput("serialized-form.html", true, + "
        \n" + + "
        Throws:" + + "
        \n" + + "
        " + + "java.io.IOException
        \n" + + "
        See Also:" + + "
        \n" + + "
        " + + "C1.setUndecorated(boolean)
        \n" + + "
        ", + "Deprecated." + + " As of JDK version 1.5, replaced by\n" + + " " + + "setUndecorated(boolean).\n" + + "
        This field indicates whether the C1 is " + + "undecorated.
        \n" + + " \n" + + "
        \n" + + "
        Since:
        \n" + + "
        1.4
        \n" + + "
        See Also:" + + "
        \n" + + "
        " + + "C1.setUndecorated(boolean)
        \n" + + "
        ", + "Deprecated." + + " As of JDK version 1.5, replaced by\n" + + " " + + "setUndecorated(boolean).\n" + + "
        Reads the object stream.
        \n" + + "
        \n" + + "
        Throws:" + + "
        \n" + + "
        " + + "IOException
        \n" + + "
        java.io.IOException
        \n" + + "
        ", + "Deprecated." + + " \n" + + "
        " + + "The name for this class.
        "); + } + + void checkNoCommentNoDeprecated(boolean expectFound) { + // Test with -nocomment and -nodeprecated options. The ClassDocs whould + // not display definition lists for any member details. + checkOutput("pkg1/C1.html", expectFound, "
        public void readObject()\n" +
                         "                throws java.io.IOException
        \n" + - ""}, - { "pkg1/C2.html", "
        public C2()
        \n" + - ""}, - { "pkg1/C1.ModalExclusionType.html", "
        public " +
        +                "");
        +
        +        checkOutput("pkg1/C2.html", expectFound,
        +                "
        public C2()
        \n" + + ""); + + checkOutput("pkg1/C1.ModalExclusionType.html", expectFound, + "
        public " +
                         "static final C1.ModalExclusionType " +
                         "APPLICATION_EXCLUDE
        \n" + - ""}, - { "serialized-form.html", "
        boolean " +
        +                "");
        +
        +        checkOutput("serialized-form.html", expectFound,
        +                "
        boolean " +
                         "undecorated
        \n" + "
        " + "Deprecated. As of JDK version 1.5, replaced by\n" + " " + "setUndecorated(boolean).
        \n" + - ""}, - { "serialized-form.html", "" + + "", + "" + "Deprecated. As of JDK version" + " 1.5, replaced by\n" + " " + "setUndecorated(boolean).\n" + - ""}}; - - // Test for valid HTML generation which should not comprise of empty - // definition list tags. - private static final String[][] NEGATED_TEST_NO_C5 = { - { "pkg1/package-summary.html", - "
        "}, - { "pkg1/package-summary.html", - "
        \n" + - "
        "}, - { "pkg1/C1.html", - "
        "}, - { "pkg1/C1.html", - "
        \n" + - "
        "}, - { "pkg1/C1.ModalExclusionType.html", - "
        "}, - { "pkg1/C1.ModalExclusionType.html", - "
        \n" + - "
        "}, - { "pkg1/C2.html", - "
        "}, - { "pkg1/C2.html", - "
        \n" + - "
        "}, - { "pkg1/C2.ModalType.html", - "
        "}, - { "pkg1/C2.ModalType.html", - "
        \n" + - "
        "}, - { "pkg1/C3.html", - "
        "}, - { "pkg1/C3.html", - "
        \n" + - "
        "}, - { "pkg1/C4.html", - "
        "}, - { "pkg1/C4.html", - "
        \n" + - "
        "}, - { "overview-tree.html", - "
        "}, - { "overview-tree.html", - "
        \n" + - "
        "}, - { "serialized-form.html", - "
        "}, - { "serialized-form.html", - "
        \n" + - "
        "}}; - private static final String[][] NEGATED_TEST_C5 = { - { "pkg1/C5.html", - "
        "}, - { "pkg1/C5.html", - "
        \n" + - "
        "}}; - - private static final String[] ARGS1 = - new String[] { - "-Xdoclint:none", "-d", OUTPUT_DIR + "-1", "-sourcepath", SRC_DIR, "pkg1"}; - - private static final String[] ARGS2 = - new String[] { - "-Xdoclint:none", "-d", OUTPUT_DIR + "-2", "-nocomment", "-sourcepath", - SRC_DIR, "pkg1"}; - - private static final String[] ARGS3 = - new String[] { - "-Xdoclint:none", "-d", OUTPUT_DIR + "-3", "-nodeprecated", "-sourcepath", - SRC_DIR, "pkg1"}; - - private static final String[] ARGS4 = - new String[] { - "-Xdoclint:none", "-d", OUTPUT_DIR + "-4", "-nocomment", "-nodeprecated", - "-sourcepath", SRC_DIR, "pkg1"}; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestHtmlDefinitionListTag tester = new TestHtmlDefinitionListTag(); - tester.run(ARGS1, TEST_ALL, NEGATED_TEST_NO_C5); - tester.runTestsOnHTML(NO_TEST, NEGATED_TEST_C5); - tester.runTestsOnHTML(TEST_CMNT_DEPR, NO_TEST); - - tester.run(ARGS2, TEST_ALL, NEGATED_TEST_NO_C5); - tester.runTestsOnHTML(NO_TEST, NEGATED_TEST_C5); - tester.runTestsOnHTML(NO_TEST, TEST_CMNT_DEPR); - - tester.run(ARGS3, TEST_ALL, NEGATED_TEST_NO_C5); - tester.runTestsOnHTML(TEST_NODEPR, TEST_NOCMNT_NODEPR); - - tester.run(ARGS4, TEST_ALL, NEGATED_TEST_NO_C5); - tester.runTestsOnHTML(TEST_NOCMNT_NODEPR, TEST_CMNT_DEPR); - - tester.printSummary(); + ""); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testHtmlDocument/TestHtmlDocument.java --- a/langtools/test/com/sun/javadoc/testHtmlDocument/TestHtmlDocument.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testHtmlDocument/TestHtmlDocument.java Fri May 16 02:13:12 2014 -0700 @@ -27,33 +27,38 @@ * @test * @bug 6851834 * @summary This test verifies the HTML document generation for javadoc output. + * @library ../lib + * @build JavadocTester * @author Bhavesh Patel - * @build TestHtmlDocument * @run main TestHtmlDocument */ -import java.io.*; import com.sun.tools.doclets.formats.html.markup.*; /** * The class reads each file, complete with newlines, into a string to easily * compare the existing markup with the generated markup. */ -public class TestHtmlDocument { - - protected static final String NL = System.getProperty("line.separator"); - - private static final String BUGID = "6851834"; - private static final String BUGNAME = "TestHtmlDocument"; - private static String srcdir = System.getProperty("test.src", "."); +public class TestHtmlDocument extends JavadocTester { // Entry point - public static void main(String[] args) throws IOException { + public static void main(String... args) throws Exception { + TestHtmlDocument tester = new TestHtmlDocument(); + tester.runTests(); + } + + @Test + void test() { + checking("markup"); // Check whether the generated markup is same as the existing markup. - if (generateHtmlTree().equals(readFileToString(srcdir + "/testMarkup.html"))) { - System.out.println("\nTest passed for bug " + BUGID + " (" + BUGNAME + ")\n"); + String expected = readFile(testSrc, "testMarkup.html").replace("\n", NL); + String actual = generateHtmlTree(); + if (actual.equals(expected)) { + passed(""); } else { - throw new Error("\nTest failed for bug " + BUGID + " (" + BUGNAME + ")\n"); + failed("expected content in " + testSrc("testMarkup.html") + "\n" + + "Actual output:\n" + + actual); } } @@ -136,25 +141,4 @@ HtmlDocument htmlDoc = new HtmlDocument(htmlDocType, html); return htmlDoc.toString(); } - - // Read the file into a String - public static String readFileToString(String filename) throws IOException { - File file = new File(filename); - if ( !file.exists() ) { - System.out.println("\nFILE DOES NOT EXIST: " + filename); - } - BufferedReader in = new BufferedReader(new FileReader(file)); - StringBuilder fileString = new StringBuilder(); - // Create an array of characters the size of the file - try { - String line; - while ((line = in.readLine()) != null) { - fileString.append(line); - fileString.append(NL); - } - } finally { - in.close(); - } - return fileString.toString(); - } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testHtmlStrongTag/TestHtmlStrongTag.java --- a/langtools/test/com/sun/javadoc/testHtmlStrongTag/TestHtmlStrongTag.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testHtmlStrongTag/TestHtmlStrongTag.java Fri May 16 02:13:12 2014 -0700 @@ -26,44 +26,49 @@ /* * @test * @bug 6786028 8026567 - * @summary This test verifys the use of HTML tag instead of by Javadoc std doclet. + * @summary This test verifies the use of HTML tag instead of by Javadoc std doclet. * @author Bhavesh Patel - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestHtmlStrongTag * @run main TestHtmlStrongTag */ public class TestHtmlStrongTag extends JavadocTester { - private static final String[][] TEST1 = { - { "pkg1/C1.html", - "See Also:"}}; - private static final String[][] NEGATED_TEST1 = { - { "pkg1/C1.html", "Method Summary"}, - { "pkg1/C1.html", ""}, - { "pkg1/package-summary.html", - "Class Summary"}}; - private static final String[][] TEST2 = { - { "pkg2/C2.html", "Comments:"}}; - private static final String[][] NEGATED_TEST2 = { - { "pkg2/C2.html", "Method Summary"}}; + public static void main(String... args) throws Exception { + TestHtmlStrongTag tester = new TestHtmlStrongTag(); + tester.runTests(); + } + + @Test + void test1() { + javadoc("-d", "out-1", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.OK); + + checkOutput("pkg1/C1.html", true, + "See Also:"); - private static final String[] ARGS1 = - new String[] { - "-d", OUTPUT_DIR + "-1", "-sourcepath", SRC_DIR, "pkg1"}; - private static final String[] ARGS2 = - new String[] { - "-d", OUTPUT_DIR + "-2", "-sourcepath", SRC_DIR, "pkg2"}; + checkOutput("pkg1/C1.html", false, + "Method Summary", + ""); + + checkOutput("pkg1/package-summary.html", false, + "Class Summary"); + } - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestHtmlStrongTag tester = new TestHtmlStrongTag(); - tester.run(ARGS1, TEST1, NEGATED_TEST1); - tester.run(ARGS2, TEST2, NEGATED_TEST2); - tester.printSummary(); + @Test + void test2() { + javadoc("-d", "out-2", + "-sourcepath", testSrc, + "pkg2"); + checkExit(Exit.OK); + + checkOutput("pkg2/C2.html", true, + "Comments:"); + + checkOutput("pkg2/C2.html", false, + "Method Summary"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testHtmlTableStyles/TestHtmlTableStyles.java --- a/langtools/test/com/sun/javadoc/testHtmlTableStyles/TestHtmlTableStyles.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testHtmlTableStyles/TestHtmlTableStyles.java Fri May 16 02:13:12 2014 -0700 @@ -26,69 +26,59 @@ * @bug 8008164 * @summary Test styles on HTML tables generated by javadoc. * @author Bhavesh Patel - * @library ../lib/ - * @build JavadocTester TestHtmlTableStyles + * @library ../lib + * @build JavadocTester * @run main TestHtmlTableStyles */ public class TestHtmlTableStyles extends JavadocTester { - //Input for string search tests. - private static final String[][] TEST = { - { "pkg1/TestTable.html", - "" - }, - { "pkg1/TestTable.html", - "
        " - }, - { "pkg1/TestTable.html", - "
        " - }, - { "pkg1/TestTable.html", - "
        " - }, - { "pkg1/package-summary.html", - "
        " - }, - { "pkg1/class-use/TestTable.html", - "
        " - }, - { "overview-summary.html", - "
        " - }, - { "deprecated-list.html", + public static void main(String... args) throws Exception { + TestHtmlTableStyles tester = new TestHtmlTableStyles(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-use", + "pkg1", "pkg2"); + checkExit(Exit.OK); + + checkOutput("pkg1/TestTable.html", true, + "
        ", + "
        ", + "
        ", + "
        "); + + checkOutput("pkg1/package-summary.html", true, + "
        "); + + checkOutput("pkg1/class-use/TestTable.html", true, + "
        "); + + checkOutput("overview-summary.html", true, + "
        "); + + checkOutput("deprecated-list.html", true, "
        " - }, - { "constant-values.html", + "deprecated methods, and an explanation\">"); + + checkOutput("constant-values.html", true, "
        " - }, - }; - - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-use", "pkg1", "pkg2" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) throws Exception { - TestHtmlTableStyles tester = new TestHtmlTableStyles(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + "constant fields, and values\">"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testHtmlTableTags/TestHtmlTableTags.java --- a/langtools/test/com/sun/javadoc/testHtmlTableTags/TestHtmlTableTags.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testHtmlTableTags/TestHtmlTableTags.java Fri May 16 02:13:12 2014 -0700 @@ -26,9 +26,8 @@ * @bug 6786688 8008164 * @summary HTML tables should have table summary, caption and table headers. * @author Bhavesh Patel - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestHtmlTableTags * @run main TestHtmlTableTags */ @@ -36,400 +35,350 @@ //Javadoc arguments. private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-use", "pkg1", "pkg2" + }; - //Input for string tests for HTML table tags. - private static final String[][] TABLE_TAGS_TEST = { - /* - * Test for validating summary for HTML tables - */ + + public static void main(String... args) throws Exception { + TestHtmlTableTags tester = new TestHtmlTableTags(); + tester.runTests(); + } + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-use", + "pkg1", "pkg2"); + checkExit(Exit.OK); + + checkHtmlTableSummaries(); + checkHtmlTableCaptions(); + checkHtmlTableHeaders(); + } + + /* + * Tests for validating summary for HTML tables + */ + void checkHtmlTableSummaries() { //Package summary - { "pkg1/package-summary.html", - "
        " - }, - { "pkg1/package-summary.html", - "
        " - }, - { "pkg2/package-summary.html", - "
        " - }, - { "pkg2/package-summary.html", - "
        " - }, + checkOutput("pkg1/package-summary.html", true, + "
        ", + "
        "); + + checkOutput("pkg2/package-summary.html", true, + "
        ", + "
        "); + // Class documentation - { "pkg1/C1.html", - "
        " - }, - { "pkg1/C1.html", - "
        " - }, - { "pkg2/C2.html", - "
        " - }, - { "pkg2/C2.html", - "
        " - }, - { "pkg2/C2.ModalExclusionType.html", - "
        " - }, - { "pkg2/C3.html", - "
        " - }, - { "pkg2/C4.html", - "
        " - }, - // Class use documentation - { "pkg1/class-use/I1.html", - "
        " - }, - { "pkg1/class-use/C1.html", - "
        " - }, - { "pkg1/class-use/C1.html", - "
        " - }, - { "pkg2/class-use/C2.html", - "
        " - }, - { "pkg2/class-use/C2.html", - "
        " - }, - { "pkg2/class-use/C2.ModalExclusionType.html", - "
        " - }, - { "pkg2/class-use/C2.ModalExclusionType.html", - "
        " - }, - // Package use documentation - { "pkg1/package-use.html", - "
        " - }, - { "pkg1/package-use.html", - "
        " - }, - { "pkg2/package-use.html", - "
        " - }, - { "pkg2/package-use.html", - "
        " - }, - // Deprecated - { "deprecated-list.html", - "
        " - }, - { "deprecated-list.html", - "
        " - }, - // Constant values - { "constant-values.html", - "
        " - }, - // Overview Summary - { "overview-summary.html", - "
        " - }, + checkOutput("pkg1/C1.html", true, + "
        ", + "
        "); + + checkOutput("pkg2/C2.html", true, + "
        ", + "
        "); - /* - * Test for validating caption for HTML tables - */ + checkOutput("pkg2/C2.ModalExclusionType.html", true, + "
        "); - //Package summary - { "pkg1/package-summary.html", - "" - }, - { "pkg1/package-summary.html", - "" - }, - { "pkg2/package-summary.html", - "" - }, - { "pkg2/package-summary.html", - "" - }, - // Class documentation - { "pkg1/C1.html", - "" - }, - { "pkg1/C1.html", - "" - }, - { "pkg2/C2.html", - "" - }, - { "pkg2/C2.html", - "" - }, - { "pkg2/C2.ModalExclusionType.html", - "" - }, - { "pkg2/C3.html", - "" - }, - { "pkg2/C4.html", - "" - }, + checkOutput("pkg2/C3.html", true, + "
        Class Summary" + - " Interface Summary" + - " Enum Summary" + - " Annotation Types Summary" + - " Fields All " + - "Methods " + - "" + - "Instance Methods " + - "" + - "Concrete Methods " + - "" + - "Deprecated Methods " + - "Nested Classes Constructors Enum Constants Required Elements " + - "Optional Elements " + - "
        "); + + checkOutput("pkg2/C4.html", true, + "
        "); + // Class use documentation - { "pkg1/class-use/I1.html", - "" - }, - { "pkg1/class-use/C1.html", - "" - }, - { "pkg1/class-use/C1.html", - "" - }, - { "pkg2/class-use/C2.html", - "" - }, - { "pkg2/class-use/C2.html", - "" - }, - { "pkg2/class-use/C2.ModalExclusionType.html", - "" - }, + checkOutput("pkg1/class-use/I1.html", true, + "
        Packages that use I1" + - " Fields in " + - "pkg2 declared as C1 " + - "Methods in " + - "pkg2 that return C1" + - " Fields in " + - "pkg1 declared as C2" + - " Methods in " + - "pkg1 that return C2" + - " Methods in " + - "pkg2 that return C2.ModalExclusionType" + - " 
        "); + + checkOutput("pkg1/class-use/C1.html", true, + "
        ", + "
        "); + + checkOutput("pkg2/class-use/C2.html", true, + "
        ", + "
        "); + + checkOutput("pkg2/class-use/C2.ModalExclusionType.html", true, + "
        "); + + checkOutput("pkg2/class-use/C2.ModalExclusionType.html", true, + "
        "); + // Package use documentation - { "pkg1/package-use.html", - "" - }, - { "pkg1/package-use.html", - "" - }, - { "pkg2/package-use.html", - "" - }, - { "pkg2/package-use.html", - "" - }, + checkOutput("pkg1/package-use.html", true, + "
        Packages that use " + - "pkg1 Classes in " + - "pkg1 used by pkg1" + - " Packages that use " + - "pkg2 Classes in " + - "pkg2 used by pkg1" + - " 
        ", + "
        "); + + checkOutput("pkg2/package-use.html", true, + "
        ", + "
        "); + // Deprecated - { "deprecated-list.html", - "" - }, - { "deprecated-list.html", - "" - }, + checkOutput("deprecated-list.html", true, + "
        Deprecated Fields" + - " Deprecated Methods" + - " 
        ", + "
        "); + // Constant values - { "constant-values.html", - "" - }, + checkOutput("constant-values.html", true, + "
        pkg1." + - "C1 
        "); + // Overview Summary - { "overview-summary.html", - "" - }, + checkOutput("overview-summary.html", true, + "
        Packages 
        "); + } - /* - * Test for validating headers for HTML tables - */ - + /* + * Tests for validating caption for HTML tables + */ + void checkHtmlTableCaptions() { //Package summary - { "pkg1/package-summary.html", - "\n" + - "" - }, - { "pkg1/package-summary.html", - "\n" + - "" - }, - { "pkg2/package-summary.html", - "\n" + - "" - }, - { "pkg2/package-summary.html", - "\n" + - "" - }, + checkOutput("pkg1/package-summary.html", true, + "", + ""); + + checkOutput("pkg2/package-summary.html", true, + "", + ""); + // Class documentation - { "pkg1/C1.html", - "\n" + - "" - }, - { "pkg1/C1.html", - "\n" + - "" - }, - { "pkg2/C2.html", - "\n" + - "" - }, - { "pkg2/C2.html", - "" - }, - { "pkg2/C2.ModalExclusionType.html", - "" - }, - { "pkg2/C3.html", - "\n" + - "" - }, - { "pkg2/C4.html", - "\n" + - "" - }, + checkOutput("pkg1/C1.html", true, + "", + ""); + + checkOutput("pkg2/C2.html", true, + "", + ""); + + checkOutput("pkg2/C2.ModalExclusionType.html", true, + ""); + + checkOutput("pkg2/C3.html", true, + ""); + + checkOutput("pkg2/C4.html", true, + ""); + // Class use documentation - { "pkg1/class-use/I1.html", - "\n" + - "" - }, - { "pkg1/class-use/C1.html", - "\n" + - "" - }, - { "pkg1/class-use/C1.html", - "\n" + - "" - }, - { "pkg2/class-use/C2.html", - "\n" + - "" - }, - { "pkg2/class-use/C2.html", - "\n" + - "" - }, - { "pkg2/class-use/C2.ModalExclusionType.html", - "\n" + - "" - }, - { "pkg2/class-use/C2.ModalExclusionType.html", - "\n" + - "" - }, + checkOutput("pkg1/class-use/I1.html", true, + ""); + + checkOutput("pkg1/class-use/C1.html", true, + "", + ""); + + checkOutput("pkg2/class-use/C2.html", true, + "", + ""); + + checkOutput("pkg2/class-use/C2.ModalExclusionType.html", true, + ""); + // Package use documentation - { "pkg1/package-use.html", - "\n" + - "" - }, - { "pkg1/package-use.html", - "" - }, - { "pkg2/package-use.html", - "\n" + - "" - }, - { "pkg2/package-use.html", - "" - }, + checkOutput("pkg1/package-use.html", true, + "", + ""); + + checkOutput("pkg2/package-use.html", true, + "", + ""); + // Deprecated - { "deprecated-list.html", - "" - }, - { "deprecated-list.html", - "" - }, + checkOutput("deprecated-list.html", true, + "", + ""); + // Constant values - { "constant-values.html", - "\n" + - "Constant Field\n" + - "" - }, + checkOutput("constant-values.html", true, + ""); + // Overview Summary - { "overview-summary.html", - "\n" + - "" - } - }; + checkOutput("overview-summary.html", true, + ""); + } + + /* + * Test for validating headers for HTML tables + */ + void checkHtmlTableHeaders() { + //Package summary + checkOutput("pkg1/package-summary.html", true, + "\n" + + "", + "\n" + + ""); + + checkOutput("pkg2/package-summary.html", true, + "\n" + + "", + "\n" + + ""); + + // Class documentation + checkOutput("pkg1/C1.html", true, + "\n" + + "", + "\n" + + ""); + + checkOutput("pkg2/C2.html", true, + "\n" + + "", + ""); + + checkOutput("pkg2/C2.ModalExclusionType.html", true, + ""); + + checkOutput("pkg2/C3.html", true, + "\n" + + ""); + + checkOutput("pkg2/C4.html", true, + "\n" + + ""); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestHtmlTableTags tester = new TestHtmlTableTags(); - tester.run(ARGS, TABLE_TAGS_TEST, NO_TEST); - tester.printSummary(); + // Class use documentation + checkOutput("pkg1/class-use/I1.html", true, + "\n" + + ""); + + checkOutput("pkg1/class-use/C1.html", true, + "\n" + + "", + "\n" + + ""); + + checkOutput("pkg2/class-use/C2.html", true, + "\n" + + "", + "\n" + + ""); + + checkOutput("pkg2/class-use/C2.ModalExclusionType.html", true, + "\n" + + "", + "\n" + + ""); + + // Package use documentation + checkOutput("pkg1/package-use.html", true, + "\n" + + "", + ""); + + checkOutput("pkg2/package-use.html", true, + "\n" + + "", + ""); + + // Deprecated + checkOutput("deprecated-list.html", true, + "", + ""); + + // Constant values + checkOutput("constant-values.html", true, + "\n" + + "Constant Field\n" + + ""); + + // Overview Summary + checkOutput("overview-summary.html", true, + "\n" + + ""); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testHtmlTag/TestHtmlTag.java --- a/langtools/test/com/sun/javadoc/testHtmlTag/TestHtmlTag.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testHtmlTag/TestHtmlTag.java Fri May 16 02:13:12 2014 -0700 @@ -28,9 +28,8 @@ * @bug 6786682 * @summary This test verifies the use of lang attribute by . * @author Bhavesh Patel - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestHtmlTag * @run main TestHtmlTag */ @@ -38,43 +37,65 @@ public class TestHtmlTag extends JavadocTester { - private static final String[][] TEST1 = { - { "pkg1/C1.html", - ""}, - { "pkg1/package-summary.html", - ""}}; - private static final String[][] NEGATED_TEST1 = { - { "pkg1/C1.html", ""}}; - private static final String[][] TEST2 = { - { "pkg2/C2.html", ""}, - { "pkg2/package-summary.html", ""}}; - private static final String[][] NEGATED_TEST2 = { - { "pkg2/C2.html", ""}}; - private static final String[][] TEST3 = { - { "pkg1/C1.html", ""}, - { "pkg1/package-summary.html", ""}}; - private static final String[][] NEGATED_TEST3 = { - { "pkg1/C1.html", ""}}; + public static void main(String... args) throws Exception { + TestHtmlTag tester = new TestHtmlTag(); + tester.runTests(); + } + + @Test + void test_default() { + javadoc("-d", "out-default", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.OK); + + String defaultLanguage = Locale.getDefault().getLanguage(); + + checkOutput("pkg1/C1.html", true, + ""); + + checkOutput("pkg1/package-summary.html", true, + ""); + + checkOutput("pkg1/C1.html", false, + ""); + } - private static final String[] ARGS1 = - new String[] { - "-d", OUTPUT_DIR + "-1", "-sourcepath", SRC_DIR, "pkg1"}; - private static final String[] ARGS2 = - new String[] { - "-locale", "ja", "-d", OUTPUT_DIR + "-2", "-sourcepath", SRC_DIR, "pkg2"}; - private static final String[] ARGS3 = - new String[] { - "-locale", "en_US", "-d", OUTPUT_DIR + "-3", "-sourcepath", SRC_DIR, "pkg1"}; + @Test + void test_ja() { + // TODO: why does this test need/use pkg2; why can't it use pkg1 + // like the other two tests, so that we can share the check methods? + javadoc("-locale", "ja", + "-d", "out-ja", + "-sourcepath", testSrc, + "pkg2"); + checkExit(Exit.OK); + + checkOutput("pkg2/C2.html", true, + ""); + + checkOutput("pkg2/package-summary.html", true, + ""); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestHtmlTag tester = new TestHtmlTag(); - tester.run(ARGS1, TEST1, NEGATED_TEST1); - tester.run(ARGS2, TEST2, NEGATED_TEST2); - tester.run(ARGS3, TEST3, NEGATED_TEST3); - tester.printSummary(); + checkOutput("pkg2/C2.html", false, + ""); + } + + @Test + void test_en_US() { + javadoc("-locale", "en_US", + "-d", "out-en_US", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.OK); + + checkOutput("pkg1/C1.html", true, + ""); + + checkOutput("pkg1/package-summary.html", true, + ""); + + checkOutput("pkg1/C1.html", false, + ""); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testIndentation/TestIndentation.java --- a/langtools/test/com/sun/javadoc/testIndentation/TestIndentation.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testIndentation/TestIndentation.java Fri May 16 02:13:12 2014 -0700 @@ -25,37 +25,30 @@ * @test * @bug 8011288 * @summary Erratic/inconsistent indentation of signatures - * @library ../lib/ + * @library ../lib * @build JavadocTester * @run main TestIndentation */ public class TestIndentation extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "p" - }; + public static void main(String... args) throws Exception { + TestIndentation tester = new TestIndentation(); + tester.runTests(); + } - //Input for string search tests. - private static final String[][] TEST = { - { "p/Indent.html", - "
        public <T> void m(T t1," },
        -        { "p/Indent.html",
        -          "\n" +
        -          "                  T t2)" },
        -        { "p/Indent.html",
        -          "\n" +
        -          "           throws java.lang.Exception" }
        -    };
        +    @Test
        +    void test() {
        +        javadoc("-d", "out",
        +                "-sourcepath", testSrc,
        +                "p");
        +        checkExit(Exit.OK);
         
        -    /**
        -     * The entry point of the test.
        -     * @param args the array of command line arguments.
        -     */
        -    public static void main(String[] args) {
        -        TestIndentation tester = new TestIndentation();
        -        tester.run(ARGS, TEST, NO_TEST);
        -        tester.printSummary();
        +        checkOutput("p/Indent.html", true,
        +                "
        public <T> void m(T t1,",
        +                "\n"
        +                + "                  T t2)",
        +                "\n"
        +                + "           throws java.lang.Exception");
             }
         }
        diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testIndex/TestIndex.java
        --- a/langtools/test/com/sun/javadoc/testIndex/TestIndex.java	Thu May 15 11:35:26 2014 -0700
        +++ b/langtools/test/com/sun/javadoc/testIndex/TestIndex.java	Fri May 16 02:13:12 2014 -0700
        @@ -28,64 +28,53 @@
          *           Also test that index-all.html has the appropriate output.
          *           Test for unnamed package in index.
          * @author   jamieh
        - * @library  ../lib/
        + * @library  ../lib
          * @build    JavadocTester
        - * @build    TestIndex
          * @run main TestIndex
          */
         
         public class TestIndex extends JavadocTester {
         
        -    //Javadoc arguments.
        -    private static final String[] ARGS = new String[] {
        -        "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg", SRC_DIR + "/NoPackage.java"
        -    };
        +    public static void main(String... args) throws Exception {
        +        TestIndex tester = new TestIndex();
        +        tester.runTests();
        +    }
         
        -    //Input for string search tests.
        -    private static final String[][] TEST = {
        +    @Test
        +    void test() {
        +        javadoc("-d", "out",
        +                "-sourcepath", testSrc,
        +                "pkg", testSrc("NoPackage.java"));
        +        checkExit(Exit.OK);
        +
                 //Make sure the horizontal scroll bar does not appear in class frame.
        -        { "index.html",
        -            ""},
        +        checkOutput("index.html", true,
        +                "");
         
                 //Test index-all.html
        -        { "index-all.html",
        -            "C" +
        -            " - Class in pkg"},
        -        { "index-all.html",
        -            "" +
        -            "Interface - Interface in " +
        -            "pkg"},
        -        { "index-all.html",
        -            "" +
        -            "AnnotationType - Annotation Type in " +
        -            "pkg"},
        -        { "index-all.html",
        -            "" +
        -            "Coin - Enum in " +
        -            "pkg"},
        -        { "index-all.html",
        -            "Class in <Unnamed>"},
        -        { "index-all.html",
        -            "
        \n" + - "
        " + - "Java - Static variable in class pkg.C
        \n" + - "
         
        \n" + - "
        JDK " + - "- Static variable in class pkg." + - "C
        \n" + - "
         
        \n" + - "
        "}, - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestIndex tester = new TestIndex(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + checkOutput("index-all.html", true, + "C" + + " - Class in pkg", + "" + + "Interface - Interface in " + + "pkg", + "" + + "AnnotationType - Annotation Type in " + + "pkg", + "" + + "Coin - Enum in " + + "pkg", + "Class in <Unnamed>", + "
        \n" + + "
        " + + "Java - Static variable in class pkg.C
        \n" + + "
         
        \n" + + "
        JDK " + + "- Static variable in class pkg." + + "C
        \n" + + "
         
        \n" + + "
        "); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testInlineLinkLabel/TestInlineLinkLabel.java --- a/langtools/test/com/sun/javadoc/testInlineLinkLabel/TestInlineLinkLabel.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testInlineLinkLabel/TestInlineLinkLabel.java Fri May 16 02:13:12 2014 -0700 @@ -26,34 +26,29 @@ * @bug 4524136 * @summary Test to make sure label is used for inline links. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestInlineLinkLabel * @run main TestInlineLinkLabel */ public class TestInlineLinkLabel extends JavadocTester { - private static final String[][] TEST = { - //Search for the label to the package link. - { "pkg/C1.html" , - "Here is a link to a package"}, + public static void main(String... args) throws Exception { + TestInlineLinkLabel tester = new TestInlineLinkLabel(); + tester.runTests(); + } - //Search for the label to the class link - { "pkg/C1.html" , - "Here is a link to a class"} - }; - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg"}; + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestInlineLinkLabel tester = new TestInlineLinkLabel(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + checkOutput("pkg/C1.html", true, + //Search for the label to the package link. + "Here is a link to a package", + //Search for the label to the class link + "Here is a link to a class"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testInterface/TestInterface.java --- a/langtools/test/com/sun/javadoc/testInterface/TestInterface.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testInterface/TestInterface.java Fri May 16 02:13:12 2014 -0700 @@ -29,101 +29,82 @@ * If A implements I and B extends A, B should be in the list of * implementing classes in the documentation for I. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestInterface * @run main TestInterface */ public class TestInterface extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg" - }; + public static void main(String... args) throws Exception { + TestInterface tester = new TestInterface(); + tester.runTests(); + } - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/Interface.html", - "
        int method()
        "}, - { "pkg/Interface.html", - "
        static final int field
        "}, - + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); - // Make sure known implementing class list is correct and omits type parameters. - { "pkg/Interface.html", - "
        \n" + - "
        All Known Implementing Classes:
        \n" + - "
        Child" + - ", Parent" + - "
        \n" + - "
        "}, + checkOutput("pkg/Interface.html", true, + "
        int method()
        ", + "
        static final int field
        ", + // Make sure known implementing class list is correct and omits type parameters. + "
        \n" + + "
        All Known Implementing Classes:
        \n" + + "
        Child" + + ", Parent" + + "
        \n" + + "
        "); - // Make sure "All Implemented Interfaces": has substituted type parameters - { "pkg/Child.html", - "
        \n" + - "
        All Implemented Interfaces:
        \n" + - "
        " + - "Interface<T>
        \n" + - "
        " - }, - //Make sure Class Tree has substituted type parameters. - { "pkg/Child.html", - "
          \n" + - "
        • java.lang.Object
        • \n" + - "
        • \n" + - "
            \n" + - "
          • " + - "pkg.Parent<T>
          • \n" + - "
          • \n" + - "
              \n" + - "
            • pkg.Child<T>
            • \n" + - "
            \n" + - "
          • \n" + - "
          \n" + - "
        • \n" + - "
        " - }, - //Make sure "Direct Know Subclasses" omits type parameters - { "pkg/Parent.html", - "
        \n" + - "
        Direct Known Subclasses:
        \n" + - "
        Child" + - "
        \n" + - "
        " - }, - //Make sure "Specified By" has substituted type parameters. - { "pkg/Child.html", - "
        Specified by:
        \n" + - "
        method" + - " in interface " + - "" + - "Interface<" + - "T>
        " - }, - //Make sure "Overrides" has substituted type parameters. - { "pkg/Child.html", - "
        Overrides:
        \n" + - "
        method" + - " in class Parent<T>
        " - }, - }; - private static final String[][] NEGATED_TEST = { - { "pkg/Interface.html", - "public int method()"}, - { "pkg/Interface.html", - "public static final int field"}, - }; + checkOutput("pkg/Child.html", true, + // Make sure "All Implemented Interfaces": has substituted type parameters + "
        \n" + + "
        All Implemented Interfaces:
        \n" + + "
        " + + "Interface<T>
        \n" + + "
        ", + //Make sure Class Tree has substituted type parameters. + "
          \n" + + "
        • java.lang.Object
        • \n" + + "
        • \n" + + "
            \n" + + "
          • " + + "pkg.Parent<T>
          • \n" + + "
          • \n" + + "
              \n" + + "
            • pkg.Child<T>
            • \n" + + "
            \n" + + "
          • \n" + + "
          \n" + + "
        • \n" + + "
        ", + //Make sure "Specified By" has substituted type parameters. + "
        Specified by:
        \n" + + "
        method" + + " in interface " + + "" + + "Interface<" + + "T>
        ", + //Make sure "Overrides" has substituted type parameters. + "
        Overrides:
        \n" + + "
        method" + + " in class Parent<T>
        "); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestInterface tester = new TestInterface(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + checkOutput("pkg/Parent.html", true, + //Make sure "Direct Know Subclasses" omits type parameters + "
        \n" + + "
        Direct Known Subclasses:
        \n" + + "
        Child" + + "
        \n" + + "
        "); + + checkOutput("pkg/Interface.html", false, + "public int method()", + "public static final int field"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testJavaFX/TestJavaFX.java --- a/langtools/test/com/sun/javadoc/testJavaFX/TestJavaFX.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testJavaFX/TestJavaFX.java Fri May 16 02:13:12 2014 -0700 @@ -26,73 +26,57 @@ * @bug 7112427 8012295 8025633 8026567 * @summary Test of the JavaFX doclet features. * @author jvalenta - * @library ../lib/ - * @build JavadocTester TestJavaFX + * @library ../lib + * @build JavadocTester * @run main TestJavaFX */ public class TestJavaFX extends JavadocTester { - private static final String[][] TEST = - new String[][] { - { "C.html", - "
        See Also:
        \n" + - "
        getRate(), \n" + - "setRate(double)
        "}, - { "C.html", - "
        public final void setRate(double value)
        \n" + - "
        Sets the value of the property rate.
        \n" + - "
        \n" + - "
        Property description:
        " }, - { "C.html", - "
        public final double getRate()
        \n" + - "
        Gets the value of the property rate.
        \n" + - "
        \n" + - "
        Property description:
        " }, - { "C.html", - "
        " }, - { "C.html", - "

        isPaused

        \n" + - "
        public final double isPaused()
        \n" + - "
        Gets the value of the property paused.
        " }, - { "D.html", - "

        Properties inherited from class C

        \n" + - "paused, rate" }, - }; - private static final String[][] NO_TEST = - new String[][] { - { "C.html", - "A()"}, - }; + checkOutput("C.html", true, + "
        See Also:
        \n" + + "
        getRate(), \n" + + "setRate(double)
        ", + "
        public final void setRate(double value)
        \n" + + "
        Sets the value of the property rate.
        \n" + + "
        \n" + + "
        Property description:
        ", + "
        public final double getRate()
        \n" + + "
        Gets the value of the property rate.
        \n" + + "
        \n" + + "
        Property description:
        ", + "
        ", + "

        isPaused

        \n" + + "
        public final double isPaused()
        \n" + + "
        Gets the value of the property paused.
        "); - - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-javafx", - SRC_DIR + "/C.java", SRC_DIR + "/D.java" - }; + checkOutput("C.html", false, + "A()"); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestJavaFX tester = new TestJavaFX(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + checkOutput("D.html", true, + "

        Properties inherited from class C

        \n" + + "paused, rate"); } + } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testJavascript/TestJavascript.java --- a/langtools/test/com/sun/javadoc/testJavascript/TestJavascript.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testJavascript/TestJavascript.java Fri May 16 02:13:12 2014 -0700 @@ -26,98 +26,93 @@ * @bug 4665566 4855876 7025314 8012375 8015997 8016328 8024756 * @summary Verify that the output has the right javascript. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestJavascript * @run main TestJavascript */ public class TestJavascript extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg", SRC_DIR + - "/TestJavascript.java" - }; + public static void main(String... args) throws Exception { + TestJavascript tester = new TestJavascript(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg", testSrc("TestJavascript.java")); + checkExit(Exit.OK); + + checkOutput("pkg/C.html", true, + "Frames"); + + checkOutput("TestJavascript.html", true, + "Frames"); - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/C.html", - "Frames"}, - { "TestJavascript.html", - "Frames"}, - { "index.html", - ""}, + checkOutput("index.html", true, + ""); //Make sure title javascript only runs if is-external is not true - { "pkg/C.html", - " try {\n" + - " if (location.href.indexOf('is-external=true') == -1) {\n" + - " parent.document.title=\"C\";\n" + - " }\n" + - " }\n" + - " catch(err) {\n" + - " }"}, - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestJavascript tester = new TestJavascript(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + checkOutput("pkg/C.html", true, + " try {\n" + + " if (location.href.indexOf('is-external=true') == -1) {\n" + + " parent.document.title=\"C\";\n" + + " }\n" + + " }\n" + + " catch(err) {\n" + + " }"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testLambdaFeature/TestLambdaFeature.java --- a/langtools/test/com/sun/javadoc/testLambdaFeature/TestLambdaFeature.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testLambdaFeature/TestLambdaFeature.java Fri May 16 02:13:12 2014 -0700 @@ -40,79 +40,74 @@ public class TestLambdaFeature extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg", "pkg1" - }; + public static void main(String... args) throws Exception { + TestLambdaFeature tester = new TestLambdaFeature(); + tester.runTests(); + } + + @Test + void testDefault() { + javadoc("-d", "out-default", + "-sourcepath", testSrc, + "pkg", "pkg1"); + checkExit(Exit.OK); - private static final String[] ARGS_1 = new String[] { - "-d", OUTPUT_DIR + "-2", "-sourcepath", SRC_DIR, "-source", "1.7", "pkg1" - }; + checkOutput("pkg/A.html", true, + "", + "
        default void defaultMethod()
        ", + "", + "
        \n" + + "
        Functional Interface:
        \n" + + "
        This is a functional interface and can therefore be used as " + + "the assignment target for a lambda expression or method " + + "reference.
        \n" + + "
        "); - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/A.html", - ""}, - { "pkg/A.html", - "
        default void defaultMethod()
        "}, - { "pkg/A.html", - ""}, - { "pkg/A.html", - "
        \n" + - "
        Functional Interface:
        \n" + - "
        This is a functional interface and can therefore be used as " + - "the assignment target for a lambda expression or method " + - "reference.
        \n" + - "
        "}, - { "pkg1/FuncInf.html", - "
        \n" + - "
        Functional Interface:
        \n" + - "
        This is a functional interface and can therefore be used as " + - "the assignment target for a lambda expression or method " + - "reference.
        \n" + - "
        "} - }; - private static final String[][] NEGATED_TEST = { - { "pkg/A.html", - ""}, - { "pkg/A.html", - "
        default default void defaultMethod()
        "}, - { "pkg/B.html", - ""}, - { "pkg1/NotAFuncInf.html", - "
        \n" + - "
        Functional Interface:
        \n" + - "
        This is a functional interface and can therefore be used as " + - "the assignment target for a lambda expression or method " + - "reference.
        \n" + - "
        "}, - { "pkg/B.html", - "
        \n" + - "
        Functional Interface:
        "} - }; - private static final String[][] NEGATED_TEST_1 = { - { "pkg1/FuncInf.html", - "
        \n" + - "
        Functional Interface:
        "} - }; + checkOutput("pkg1/FuncInf.html", true, + "
        \n" + + "
        Functional Interface:
        \n" + + "
        This is a functional interface and can therefore be used as " + + "the assignment target for a lambda expression or method " + + "reference.
        \n" + + "
        "); + + checkOutput("pkg/A.html", false, + "
        ", + "
        default default void defaultMethod()
        "); + + checkOutput("pkg/B.html", false, + "", + "
        \n" + + "
        Functional Interface:
        "); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestLambdaFeature tester = new TestLambdaFeature(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.run(ARGS_1, NO_TEST, NEGATED_TEST_1); - tester.printSummary(); + checkOutput("pkg1/NotAFuncInf.html", false, + "
        \n" + + "
        Functional Interface:
        \n" + + "
        This is a functional interface and can therefore be used as " + + "the assignment target for a lambda expression or method " + + "reference.
        \n" + + "
        "); + } + + @Test + void testSource7() { + javadoc("-d", "out-7", + "-sourcepath", testSrc, + "-source", "1.7", + "pkg1"); + checkExit(Exit.OK); + + checkOutput("pkg1/FuncInf.html", false, + "
        \n" + + "
        Functional Interface:
        "); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testLeadingSpaces/LeadingSpaces.java --- a/langtools/test/com/sun/javadoc/testLeadingSpaces/LeadingSpaces.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testLeadingSpaces/LeadingSpaces.java Fri May 16 02:13:12 2014 -0700 @@ -29,37 +29,35 @@ * begin their comment without a leading star without leading * spaces stripped * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build LeadingSpaces * @run main LeadingSpaces */ public class LeadingSpaces extends JavadocTester { - - private static final String[][] TEST = { - { "LeadingSpaces.html", -" 1\n" + -" 2\n" + -" 3\n" + -" 4\n" + -" 5\n" + -" 6\n" + -" 7"} - }; - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - SRC_DIR + "/LeadingSpaces.java"}; - /** * The entry point of the test. * @param args the array of command line arguments. + * @throws Exception if the test fails */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { LeadingSpaces tester = new LeadingSpaces(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void testLeadingSpaces() { + javadoc("-d", "out", "-sourcepath", testSrc, + testSrc("LeadingSpaces.java")); + checkExit(Exit.OK); + checkOutput("LeadingSpaces.html", true, + " 1\n" + + " 2\n" + + " 3\n" + + " 4\n" + + " 5\n" + + " 6\n" + + " 7"); } /** diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testLegacyTaglet/TestLegacyTaglet.java --- a/langtools/test/com/sun/javadoc/testLegacyTaglet/TestLegacyTaglet.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testLegacyTaglet/TestLegacyTaglet.java Fri May 16 02:13:12 2014 -0700 @@ -27,38 +27,35 @@ * @summary Test to ensure that the refactored version of the standard * doclet still works with Taglets that implement the 1.4.0 interface. * @author jamieh - * @library ../lib/ - * @compile ../lib/JavadocTester.java TestLegacyTaglet.java ToDoTaglet.java UnderlineTaglet.java Check.java + * @library ../lib + * @build JavadocTester ToDoTaglet UnderlineTaglet Check * @run main TestLegacyTaglet */ public class TestLegacyTaglet extends JavadocTester { - private static final String[] ARGS = - new String[] {"-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-tagletpath", SRC_DIR, "-taglet", "ToDoTaglet", "-taglet", "Check", - "-taglet", "UnderlineTaglet", SRC_DIR + "/C.java"}; + public static void main(String... args) throws Exception { + TestLegacyTaglet tester = new TestLegacyTaglet(); + tester.runTests(); + } - private static final String[][] TEST = new String[][] { - { "C.html", "This is an underline"}, - { "C.html", - "
        To Do:
        " + - "ClassDescription" + - "InterfaceDescription" + - "EnumDescription" + - "Annotation TypeDescription
        Class Summary" + + " Interface Summary" + + " Enum Summary" + + " Annotation Types Summary" + + " 
        Modifier and TypeField and DescriptionModifier and TypeMethod and DescriptionModifier and TypeClass and DescriptionConstructor and DescriptionEnum Constant and DescriptionModifier and TypeRequired Element and DescriptionModifier and TypeOptional Element and Description
        Fields All " + + "Methods " + + "" + + "Instance Methods " + + "" + + "Concrete Methods " + + "" + + "Deprecated Methods " + + "Nested Classes Constructors Enum Constants Required Elements " + + "Optional Elements " + + "
        PackageDescriptionModifier and TypeField and DescriptionModifier and TypeMethod and DescriptionModifier and TypeField and DescriptionModifier and TypeMethod and DescriptionPackageDescriptionModifier and TypeMethod and Description
        Packages that use I1" + + " Fields in " + + "pkg2 declared as C1 " + + "Methods in " + + "pkg2 that return C1" + + " Fields in " + + "pkg1 declared as C2" + + " Methods in " + + "pkg1 that return C2" + + " Methods in " + + "pkg2 that return C2.ModalExclusionType" + + " 
        PackageDescriptionClass and DescriptionPackageDescriptionClass and Description
        Packages that use " + + "pkg1 Classes in " + + "pkg1 used by pkg1" + + " Packages that use " + + "pkg2 Classes in " + + "pkg2 used by pkg1" + + " 
        Field and DescriptionMethod and Description
        Deprecated Fields" + + " Deprecated Methods" + + " 
        " + - "Modifier and TypeValue
        pkg1." + + "C1 
        " + - "PackageDescription
        Packages 
        " + + "ClassDescription" + + "InterfaceDescription" + + "EnumDescription" + + "Annotation TypeDescriptionModifier and TypeField and DescriptionModifier and TypeMethod and DescriptionModifier and TypeClass and DescriptionConstructor and DescriptionEnum Constant and DescriptionModifier and TypeRequired Element and DescriptionModifier and TypeOptional Element and DescriptionPackageDescriptionModifier and TypeField and DescriptionModifier and TypeMethod and DescriptionModifier and TypeField and DescriptionModifier and TypeMethod and DescriptionPackageDescriptionModifier and TypeMethod and DescriptionPackageDescriptionClass and DescriptionPackageDescriptionClass and DescriptionField and DescriptionMethod and Description" + + "Modifier and TypeValue" + + "PackageDescriptionrate\n" + - "
        Defines the direction/speed at which the Timeline is expected to"}, + public static void main(String... args) throws Exception { + TestJavaFX tester = new TestJavaFX(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-javafx", + testSrc("C.java"), testSrc("D.java")); + checkExit(Exit.FAILED); // should be EXIT_OK -- need to fix C.java - { "C.html", - "Default value:"}, - { "C.html", - "Since:\n" + - "
        JavaFX 8.0
        " }, - { "C.html", - "

        Sets the value of the property Property"}, - { "C.html", - "

        Gets the value of the property Property"}, - { "C.html", - "Property description:"}, - { "C.html", - "

        setTestMethodProperty() rate\n" + + "
        Defines the direction/speed at which the Timeline is expected to", + "Default value:", + "Since:\n" + + "
        JavaFX 8.0
        ", + "

        Sets the value of the property Property", + "

        Gets the value of the property Property", + "Property description:", + "

        setTestMethodProperty() default void
        " + + "All Methods " + + "" + + "Instance Methods" + + " " + + "Abstract Methods " + + "" + + "Default Methods" + + " 
        default void
        " + - "All Methods " + - "" + - "Instance Methods" + - " " + - "Abstract Methods " + - "" + - "Default Methods" + - " 
        default default voiddefault voiddefault default voiddefault void
        " + - "
        Finish this class.
        "}, - { "C.html", + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-tagletpath", testSrc, + "-taglet", "ToDoTaglet", + "-taglet", "Check", + "-taglet", "UnderlineTaglet", + testSrc("C.java")); + checkExit(Exit.OK); + checkOutput("C.html", true, + "This is an underline", "
        To Do:
        " + - "
        Tag in Method.
        "} - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestLegacyTaglet tester = new TestLegacyTaglet(); - tester.run(ARGS, TEST, NO_TEST); - if (tester.getErrorOutput().contains("NullPointerException")) { - throw new AssertionError("javadoc threw NullPointerException"); - } - tester.printSummary(); + "Finish this class.", + "
        To Do:
        " + + "
        Tag in Method.
        "); + checkOutput(Output.STDERR, false, + "NullPointerException"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testLinkOption/TestBadLinkOption.java --- a/langtools/test/com/sun/javadoc/testLinkOption/TestBadLinkOption.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testLinkOption/TestBadLinkOption.java Fri May 16 02:13:12 2014 -0700 @@ -26,34 +26,32 @@ * @bug 4625883 * @summary Make sure that bad -link arguments trigger warnings. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestBadLinkOption * @run main TestBadLinkOption */ public class TestBadLinkOption extends JavadocTester { - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-link", OUTPUT_DIR, "pkg" - }; - - private static final String[][] TEST = { - {WARNING_OUTPUT, "Error reading file:"} - }; + public static void main(String... args) throws Exception { + TestBadLinkOption tester = new TestBadLinkOption(); + tester.runTests(); + } - private static final String[][] NEG_TEST = { - {ERROR_OUTPUT, "Error reading file:"} - }; + @Test + void test() { + String out = "out"; + javadoc("-d", out, + "-sourcepath", testSrc, + "-link", out, + "pkg"); + checkExit(Exit.OK); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestBadLinkOption tester = new TestBadLinkOption(); - tester.run(ARGS, TEST, NEG_TEST); - tester.printSummary(); + // TODO: the file it is trying to read, out/out/package-list, warrants investigation + checkOutput(Output.WARNING, true, + "Error reading file:"); + + checkOutput(Output.ERROR, false, + "Error reading file:"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testLinkOption/TestLinkOption.java --- a/langtools/test/com/sun/javadoc/testLinkOption/TestLinkOption.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testLinkOption/TestLinkOption.java Fri May 16 02:13:12 2014 -0700 @@ -27,105 +27,111 @@ * @summary Test to make sure that -link and -linkoffline link to * right files, and URLs with and without trailing slash are accepted. * @author jamieh - * @library ../lib/ - * @build JavadocTester TestLinkOption + * @library ../lib + * @build JavadocTester * @run main TestLinkOption */ import java.io.File; public class TestLinkOption extends JavadocTester { + /** + * The entry point of the test. + * @param args the array of command line arguments. + */ + public static void main(String... args) throws Exception { + TestLinkOption tester = new TestLinkOption(); + tester.runTests(); + } - //Generate the documentation using -linkoffline and a URL as the first parameter. - private static final String[] ARGS1 = new String[] { - "-d", OUTPUT_DIR + "-1", "-sourcepath", SRC_DIR, - "-linkoffline", "http://java.sun.com/j2se/1.4/docs/api/", - SRC_DIR, "-package", "pkg", "java.lang" - }; + // The following test runs javadoc multiple times; it is important that the + // first one is run first, since the subsequent runs refer to the output + // it generates. Therefore we run everything serially in a single @Test + // method and not in independent @Test methods. + @Test + void test() { + // Generate the documentation using -linkoffline and a URL as the first parameter. + String out1 = "out1"; + String url = "http://java.sun.com/j2se/1.4/docs/api/"; + javadoc("-d", out1, + "-sourcepath", testSrc, + "-linkoffline", url, testSrc, + "-package", + "pkg", "java.lang"); + checkExit(Exit.OK); - private static final String[][] TEST1 = { - { "pkg/C.html", - "Link to String Class" - }, - //Make sure the parameters are indented properly when the -link option is used. - { "pkg/C.html", - "(int p1,\n" + - " int p2,\n" + - " int p3)" - }, - { "pkg/C.html", - "(int p1,\n" + - " int p2,\n" + - " " + - "Object p3)" - }, - { "java/lang/StringBuilderChild.html", - "
        public abstract class StringBuilderChild\n" +
        -                "extends Object
        " - }, + checkOutput("pkg/C.html", true, + "Link to String Class", + //Make sure the parameters are indented properly when the -link option is used. + "(int p1,\n" + + " int p2,\n" + + " int p3)", + "(int p1,\n" + + " int p2,\n" + + " " + + "Object p3)"); + + checkOutput("java/lang/StringBuilderChild.html", true, + "
        public abstract class StringBuilderChild\n"
        +                + "extends Object
        " + ); - }; - private static final String[][] NEGATED_TEST1 = NO_TEST; + // Generate the documentation using -linkoffline and a relative path as the first parameter. + // We will try linking to the docs generated in test 1 with a relative path. + String out2 = "out2"; + javadoc("-d", out2, + "-sourcepath", testSrc, + "-linkoffline", "../" + out1, out1, + "-package", + "pkg2"); + checkExit(Exit.OK); + checkOutput("pkg2/C2.html", true, + "This is a link to Class C." + ); - //Generate the documentation using -linkoffline and a relative path as the first parameter. - //We will try linking to the docs generated in test 1 with a relative path. - private static final String[] ARGS2 = new String[] { - "-d", OUTPUT_DIR + "-2", "-sourcepath", SRC_DIR, - "-linkoffline", "../" + OUTPUT_DIR + "-1", - OUTPUT_DIR + "-1", "-package", "pkg2" - }; + String out3 = "out3"; + javadoc(createArguments(out3, out1, true)); // with trailing slash + checkExit(Exit.OK); - private static final String[][] TEST2 = { - { "pkg2/C2.html", - "This is a link to Class C." - } - }; + String out4 = "out4"; + javadoc(createArguments(out4, out1, false)); // without trailing slash + checkExit(Exit.OK); + // Note: the following test is very weak, and will fail if ever the test + // of the message is changed. We should have a separate test to verify + // this is the text that is given when there is a problem with a URL + checkOutput(Output.WARNING, false, + "warning - Error fetching URL"); + } + /* * Create the documentation using the -link option, vary the behavior with * both trailing and no trailing slash. We are only interested in ensuring * that the command executes with no errors or related warnings. */ - static String[] createArguments(boolean withTrailingSlash) { - String packagePath = new File(OUTPUT_DIR + "-1").getAbsolutePath(); - String outputDirName = OUTPUT_DIR; + static String[] createArguments(String outDir, String packageDir, boolean withTrailingSlash) { + String packagePath = new File(packageDir).getAbsolutePath(); if (withTrailingSlash) { // add the trailing slash, if it is not present! if (!packagePath.endsWith(FS)) { packagePath = packagePath + FS; } - outputDirName = outputDirName + "-3"; } else { // remove the trailing slash, if it is present! if (packagePath.endsWith(FS)) { packagePath = packagePath.substring(0, packagePath.length() - 1); } - outputDirName = outputDirName + "-4"; } String args[] = { - "-d", outputDirName, "-sourcepath", SRC_DIR, - "-link", "file:///" + packagePath, "-package", "pkg2" + "-d", outDir, + "-sourcepath", testSrc, + "-link", "file:///" + packagePath, + "-package", + "pkg2" }; System.out.println("packagePath: " + packagePath); return args; } - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestLinkOption tester = new TestLinkOption(); - tester.run(ARGS1, TEST1, NEGATED_TEST1); - tester.run(ARGS2, TEST2, NO_TEST); - tester.runJavadoc(createArguments(true)); // with trailing slash - tester.runJavadoc(createArguments(false)); // without trailing slash - tester.printSummary(); - if (tester.getWarningOutput().contains("warning - Error fetching URL")) { - throw new Error("URL rejected ?"); - } - tester.printSummary(); - } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testLinkOption/TestNewLineInLink.java --- a/langtools/test/com/sun/javadoc/testLinkOption/TestNewLineInLink.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testLinkOption/TestNewLineInLink.java Fri May 16 02:13:12 2014 -0700 @@ -27,32 +27,27 @@ * @summary Make sure that a new line may act as a separator between * link and label. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestNewLineInLink * @run main TestNewLineInLink */ public class TestNewLineInLink extends JavadocTester { - private static final String[][] NEGATED_TEST = - new String[][] { - {ERROR_OUTPUT, - "illegal character"} - }; + public static void main(String... args) throws Exception { + TestNewLineInLink tester = new TestNewLineInLink(); + tester.runTests(); + } - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-linkoffline", "http://www.java.sun.com/j2se/1.4/docs/api", - SRC_DIR, "testNewLineInLink"}; + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-linkoffline", "http://www.java.sun.com/j2se/1.4/docs/api", testSrc, + "testNewLineInLink"); + checkExit(Exit.OK); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestNewLineInLink tester = new TestNewLineInLink(); - tester.run(ARGS, new String[][] {}, NEGATED_TEST); - tester.printSummary(); + checkOutput(Output.ERROR, false, + "illegal character"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testLinkTaglet/TestLinkTaglet.java --- a/langtools/test/com/sun/javadoc/testLinkTaglet/TestLinkTaglet.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testLinkTaglet/TestLinkTaglet.java Fri May 16 02:13:12 2014 -0700 @@ -27,53 +27,46 @@ * @summary Make sure that you can link from one member to another using * non-qualified name, furthermore, ensure the right one is linked. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestLinkTaglet * @run main TestLinkTaglet */ public class TestLinkTaglet extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg", SRC_DIR + - "/checkPkg/B.java" - }; + public static void main(String... args) throws Exception { + TestLinkTaglet tester = new TestLinkTaglet(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-Xdoclint:none", + "-d", "out", + "-sourcepath", testSrc, + "pkg", testSrc("checkPkg/B.java")); + checkExit(Exit.OK); - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/C.html", - "Qualified Link: C.InnerC.
        \n" + - " Unqualified Link1: C.InnerC.
        \n" + - " Unqualified Link2: C.InnerC.
        \n" + - " Qualified Link: method(pkg.C.InnerC, pkg.C.InnerC2).
        \n" + - " Unqualified Link: method(C.InnerC, C.InnerC2).
        \n" + - " Unqualified Link: method(InnerC, InnerC2).
        " - }, - { "pkg/C.InnerC.html", - "Link to member in outer class: C.MEMBER
        \n" + - " Link to member in inner class: C.InnerC2.MEMBER2
        \n" + - " Link to another inner class: C.InnerC2" - }, - { "pkg/C.InnerC2.html", - "
        \n" + - "
        Enclosing class:
        \n" + - "
        C
        \n" + - "
        " - }, - }; - private static final String[][] NEGATED_TEST = { - {WARNING_OUTPUT, "Tag @see: reference not found: A"}, - }; + checkOutput("pkg/C.html", true, + "Qualified Link: C.InnerC.
        \n" + + " Unqualified Link1: C.InnerC.
        \n" + + " Unqualified Link2: C.InnerC.
        \n" + + " Qualified Link: method(pkg.C.InnerC, pkg.C.InnerC2).
        \n" + + " Unqualified Link: method(C.InnerC, C.InnerC2).
        \n" + + " Unqualified Link: method(InnerC, InnerC2).
        "); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestLinkTaglet tester = new TestLinkTaglet(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + checkOutput("pkg/C.InnerC.html", true, + "Link to member in outer class: C.MEMBER
        \n" + + " Link to member in inner class: C.InnerC2.MEMBER2
        \n" + + " Link to another inner class: C.InnerC2"); + + checkOutput("pkg/C.InnerC2.html", true, + "
        \n" + + "
        Enclosing class:
        \n" + + "
        C
        \n" + + "
        "); + + checkOutput(Output.WARNING, false, + "Tag @see: reference not found: A"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testLinkToSerialForm/TestLinkToSerialForm.java --- a/langtools/test/com/sun/javadoc/testLinkToSerialForm/TestLinkToSerialForm.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testLinkToSerialForm/TestLinkToSerialForm.java Fri May 16 02:13:12 2014 -0700 @@ -27,29 +27,28 @@ * @summary Test to make sure that there is a link with a proper anchor * from a serializable class to serialized-form.html. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestLinkToSerialForm * @run main TestLinkToSerialForm */ public class TestLinkToSerialForm extends JavadocTester { - private static final String[][] TEST = { - { "serialized-form.html", ""}, - { "pkg/C.html", ""} - }; - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg"}; + public static void main(String... args) throws Exception { + TestLinkToSerialForm tester = new TestLinkToSerialForm(); + tester.runTests(); + } - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestLinkToSerialForm tester = new TestLinkToSerialForm(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("serialized-form.html", true, + ""); + checkOutput("pkg/C.html", true, + ""); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testLiteralCodeInPre/TestLiteralCodeInPre.java --- a/langtools/test/com/sun/javadoc/testLiteralCodeInPre/TestLiteralCodeInPre.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testLiteralCodeInPre/TestLiteralCodeInPre.java Fri May 16 02:13:12 2014 -0700 @@ -25,73 +25,61 @@ * @test * @bug 8002387 8014636 * @summary Improve rendered HTML formatting for {@code} - * @library ../lib/ - * @build JavadocTester TestLiteralCodeInPre + * @library ../lib + * @build JavadocTester * @run main TestLiteralCodeInPre */ public class TestLiteralCodeInPre extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-Xdoclint:none", "pkg" - }; + public static void main(String... args) throws Exception { + TestLiteralCodeInPre tester = new TestLiteralCodeInPre(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-Xdoclint:none", + "pkg"); + checkExit(Exit.OK); - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/Test.html", - "no_pre()
        \n" + - "
        abcdefghi
        " }, - { "pkg/Test.html", - "no_pre_extra_whitespace()
        \n" + - "
        abcdef ghi
        " }, - { "pkg/Test.html", - "in_pre()\n" + - "
         abc  def  ghi
        " }, - { "pkg/Test.html", - "pre_after_text()\n" + - "
        xyz
         abc  def  ghi
        " }, - { "pkg/Test.html", - "after_pre()\n" + - "
        xyz
         pqr 
        abcdef ghi
        " }, - { "pkg/Test.html", - "back_in_pre()\n" + - "
        xyz
         pqr 
        mno
         abc  def  ghi
        " }, - { "pkg/Test.html", - "typical_usage_code()\n" + - "
        Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n" + - " Example:
        \n" +
        -            "   line 1 <T> void m(T t) {\n" +
        -            "   line 2     // do something with T\n" +
        -            "   line 3 }\n" +
        -            " 
        \n" + - " and so it goes.
        " }, - { "pkg/Test.html", - "typical_usage_literal()\n" + - "
        Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n" + - " Example:
        \n" +
        -            "   line 1 <T> void m(T t) {\n" +
        -            "   line 2     // do something with T\n" +
        -            "   line 3 }\n" +
        -            " 
        \n" + - " and so it goes.
        " }, - { "pkg/Test.html", - "recommended_usage_literal()\n" + - "
        Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n" + - " Example:
        \n" +
        -            "   line 1 <T> void m(T t) {\n" +
        -            "   line 2     // do something with T\n" +
        -            "   line 3 } 
        \n" + - " and so it goes.
        " } - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestLiteralCodeInPre tester = new TestLiteralCodeInPre(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + checkOutput("pkg/Test.html", true, + "no_pre()\n" + + "
        abcdefghi
        ", + "no_pre_extra_whitespace()\n" + + "
        abcdef ghi
        ", + "in_pre()\n" + + "
         abc  def  ghi
        ", + "pre_after_text()\n" + + "
        xyz
         abc  def  ghi
        ", + "after_pre()\n" + + "
        xyz
         pqr 
        abcdef ghi
        ", + "back_in_pre()\n" + + "
        xyz
         pqr 
        mno
         abc  def  ghi
        ", + "typical_usage_code()\n" + + "
        Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n" + + " Example:
        \n"
        +                + "   line 1 <T> void m(T t) {\n"
        +                + "   line 2     // do something with T\n"
        +                + "   line 3 }\n"
        +                + " 
        \n" + + " and so it goes.
        ", + "typical_usage_literal()\n" + + "
        Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n" + + " Example:
        \n"
        +                + "   line 1 <T> void m(T t) {\n"
        +                + "   line 2     // do something with T\n"
        +                + "   line 3 }\n"
        +                + " 
        \n" + + " and so it goes.
        ", + "recommended_usage_literal()\n" + + "
        Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n" + + " Example:
        \n"
        +                + "   line 1 <T> void m(T t) {\n"
        +                + "   line 2     // do something with T\n"
        +                + "   line 3 } 
        \n" + + " and so it goes.
        "); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testMemberInheritence/TestMemberInheritence.java --- a/langtools/test/com/sun/javadoc/testMemberInheritence/TestMemberInheritence.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testMemberInheritence/TestMemberInheritence.java Fri May 16 02:13:12 2014 -0700 @@ -27,83 +27,63 @@ * @summary Test to make sure that members are inherited properly in the Javadoc. * Verify that inheritence labels are correct. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestMemberInheritence * @run main TestMemberInheritence */ public class TestMemberInheritence extends JavadocTester { - private static final String[][] TEST = { - //Public field should be inherited - { "pkg/SubClass.html", - "
        "}, - - //Public method should be inherited - { "pkg/SubClass.html", - ""}, - - //Public inner class should be inherited. - { "pkg/SubClass.html", - ""}, + public static void main(String... args) throws Exception { + TestMemberInheritence tester = new TestMemberInheritence(); + tester.runTests(); + } - //Protected field should be inherited - { "pkg/SubClass.html", - ""}, - - //Protected method should be inherited - { "pkg/SubClass.html", - ""}, - - //Protected inner class should be inherited. - { "pkg/SubClass.html", - ""}, - - // New labels as of 1.5.0 - { "pkg/SubClass.html", - "Nested classes/interfaces inherited from class pkg." + - "BaseClass"}, - { "pkg/SubClass.html", - "Nested classes/interfaces inherited from interface pkg." + - "BaseInterface"}, + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg", "diamond", "inheritDist"); + checkExit(Exit.OK); - // Test overriding/implementing methods with generic parameters. - { "pkg/BaseClass.html", - "
        \n" + - "
        Specified by:
        \n" + - "
        " + - "getAnnotation in interface " + - "" + - "BaseInterface
        \n" + - "
        "}, - - // Test diamond inheritence member summary (6256068) - { "diamond/Z.html", - "aMethod"}, - - // Test that doc is inherited from closed parent (6270645) - { "inheritDist/C.html", - "
        m1-B
        "}, + checkOutput("pkg/SubClass.html", true, + // Public field should be inherited + "", + // Public method should be inherited + "", + // Public inner class should be inherited. + "", + // Protected field should be inherited + "", + // Protected method should be inherited + "", + // Protected inner class should be inherited. + "", + // New labels as of 1.5.0 + "Nested classes/interfaces inherited from class pkg." + + "BaseClass", + "Nested classes/interfaces inherited from interface pkg." + + "BaseInterface"); - }; + checkOutput("pkg/BaseClass.html", true, + // Test overriding/implementing methods with generic parameters. + "
        \n" + + "
        Specified by:
        \n" + + "
        " + + "getAnnotation in interface " + + "" + + "BaseInterface
        \n" + + "
        "); - private static final String[][] NEGATED_TEST = { - { "pkg/SubClass.html", - "staticMethod"}, - }; - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg", "diamond", - "inheritDist"}; + checkOutput("diamond/Z.html", true, + // Test diamond inheritence member summary (6256068) + "aMethod"); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestMemberInheritence tester = new TestMemberInheritence(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + checkOutput("inheritDist/C.html", true, + // Test that doc is inherited from closed parent (6270645) + "
        m1-B
        "); + + checkOutput("pkg/SubClass.html", false, + "staticMethod"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testMemberSummary/TestMemberSummary.java --- a/langtools/test/com/sun/javadoc/testMemberSummary/TestMemberSummary.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testMemberSummary/TestMemberSummary.java Fri May 16 02:13:12 2014 -0700 @@ -28,50 +28,40 @@ * type than the method in the child class. Make sure the * documentation is inherited but the return type isn't. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestMemberSummary * @run main TestMemberSummary */ public class TestMemberSummary extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg","pkg2" - }; + public static void main(String... args) throws Exception { + TestMemberSummary tester = new TestMemberSummary(); + tester.runTests(); + } - //Input for string search tests. - private static final String[][] TEST = { - // Check return type in member summary. - { "pkg/PublicChild.html", - "PublicChild\n" + - "" + - "returnTypeTest()" - }, - // Check return type in member detail. - { "pkg/PublicChild.html", - "
        public " +
        -            "PublicChild returnTypeTest()
        " - }, + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg","pkg2"); + checkExit(Exit.OK); - // Legacy anchor dimensions (6290760) - { "pkg2/A.html", - "\n" + - "\n" + - "\n" + - "\n" + - "" - }, - }; + checkOutput("pkg/PublicChild.html", true, + // Check return type in member summary. + "PublicChild\n" + + "" + + "returnTypeTest()", + // Check return type in member detail. + "
        public "
        +                + "PublicChild returnTypeTest()
        "); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestMemberSummary tester = new TestMemberSummary(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + // Legacy anchor dimensions (6290760) + checkOutput("pkg2/A.html", true, + "\n" + + "\n" + + "\n" + + "\n" + + ""); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testMethodTypes/TestMethodTypes.java --- a/langtools/test/com/sun/javadoc/testMethodTypes/TestMethodTypes.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testMethodTypes/TestMethodTypes.java Fri May 16 02:13:12 2014 -0700 @@ -26,97 +26,74 @@ * @bug 8002304 8024096 * @summary Test for various method types in the method summary table * @author Bhavesh Patel - * @library ../lib/ - * @build JavadocTester TestMethodTypes + * @library ../lib + * @build JavadocTester * @run main TestMethodTypes */ public class TestMethodTypes extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg1" - }; + public static void main(String... args) throws Exception { + TestMethodTypes tester = new TestMethodTypes(); + tester.runTests(); + } - private static final String[][] TEST = { - { "pkg1/A.html", - "var methods = {" - }, + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.OK); - { "pkg1/A.html", - "All " + - "Methods " + - "" + - "Static Methods " + - "" + - "Instance Methods " + - "" + - "Concrete Methods " + - "" + - "Deprecated Methods " + - "" - }, - - { "pkg1/A.html", - "" - }, - - { "pkg1/B.html", - "All " + - "Methods " + - "" + - "Instance Methods " + - "" + - "Abstract Methods " + - "" - }, - - { "pkg1/D.html", - "var methods = {" - }, + checkOutput("pkg1/A.html", true, + "var methods = {", + "All " + + "Methods " + + "" + + "Static Methods " + + "" + + "Instance Methods " + + "" + + "Concrete Methods " + + "" + + "Deprecated Methods " + + "", + ""); - { "pkg1/D.html", - "All " + - "Methods " + - "" + - "Instance Methods " + - "" + - "Abstract Methods " + - "" + - "Concrete Methods " + - "" + - "Deprecated Methods " + - "" - }, + checkOutput("pkg1/B.html", true, + "All " + + "Methods " + + "" + + "Instance Methods " + + "" + + "Abstract Methods " + + ""); - { "pkg1/D.html", - "" - }, - }; - private static final String[][] NEGATED_TEST = { - { "pkg1/A.html", - "Methods " + - "" - }, - - { "pkg1/B.html", - "Methods " + - "" - }, + checkOutput("pkg1/D.html", true, + "var methods = {", + "All " + + "Methods " + + "" + + "Instance Methods " + + "" + + "Abstract Methods " + + "" + + "Concrete Methods " + + "" + + "Deprecated Methods " + + "", + ""); - { "pkg1/D.html", - "Methods " + - "" - }, - }; + checkOutput("pkg1/A.html", false, + "Methods " + + ""); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestMethodTypes tester = new TestMethodTypes(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + checkOutput("pkg1/B.html", false, + "Methods " + + ""); + + checkOutput("pkg1/D.html", false, + "Methods " + + ""); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testModifier/TestModifier.java --- a/langtools/test/com/sun/javadoc/testModifier/TestModifier.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testModifier/TestModifier.java Fri May 16 02:13:12 2014 -0700 @@ -26,29 +26,25 @@ * @bug 4210388 * @summary Javadoc declares interfaces to be "abstract". * @author jamieh - * @library ../lib/ + * @library ../lib * @build ModifierAbstract * @build JavadocTester - * @build TestModifier * @run main TestModifier */ public class TestModifier extends JavadocTester { - private static final String[] ARGS = - new String[] { - "-sourcepath", SRC_DIR, - "-docletpath", SRC_DIR, "-doclet", "ModifierAbstract", - SRC_DIR + "/Interface.java", SRC_DIR + "/Test.java"}; + public static void main(String... args) throws Exception { + TestModifier tester = new TestModifier(); + tester.runTests(); + } - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestModifier tester = new TestModifier(); - if (tester.run(ARGS, NO_TEST, NO_TEST) != 0) { - throw new Error("Javadoc error occured during execution."); - } + @Test + void test() { + javadoc("-sourcepath", testSrc, + "-docletpath", testSrc, + "-doclet", "ModifierAbstract", + testSrc("Interface.java"), testSrc("Test.java")); + checkExit(Exit.OK); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testNavigation/TestNavigation.java --- a/langtools/test/com/sun/javadoc/testNavigation/TestNavigation.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testNavigation/TestNavigation.java Fri May 16 02:13:12 2014 -0700 @@ -27,49 +27,44 @@ * @summary Make sure the Next/Prev Class links iterate through all types. * Make sure the navagation is 2 columns, not 3. * @author jamieh - * @library ../lib/ - * @build JavadocTester TestNavigation + * @library ../lib + * @build JavadocTester * @run main TestNavigation */ public class TestNavigation extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg" - }; + public static void main(String... args) throws Exception { + TestNavigation tester = new TestNavigation(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("pkg/A.html", true, + "
      • Prev Class
      • ", + "Next Class"); - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/A.html", "
      • Prev Class
      • "}, - { "pkg/A.html", - "Next Class"}, - { "pkg/C.html", - "Prev Class"}, - { "pkg/C.html", - "Next Class"}, - { "pkg/E.html", - "Prev Class"}, - { "pkg/E.html", - "Next Class"}, - { "pkg/I.html", - "Prev Class"}, - { "pkg/I.html", "
      • Next Class
      • "}, - // Test for 4664607 - { "pkg/I.html", - "\n" + - "\n" + - "\n" + - ""} - }; + checkOutput("pkg/C.html", true, + "Prev Class", + "Next Class"); + + checkOutput("pkg/E.html", true, + "Prev Class", + "Next Class"); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestNavigation tester = new TestNavigation(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + checkOutput("pkg/I.html", true, + "Prev Class", + "
      • Next Class
      • ", + // Test for 4664607 + "\n" + + "\n" + + "\n" + + ""); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testNestedGenerics/TestNestedGenerics.java --- a/langtools/test/com/sun/javadoc/testNestedGenerics/TestNestedGenerics.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testNestedGenerics/TestNestedGenerics.java Fri May 16 02:13:12 2014 -0700 @@ -26,35 +26,28 @@ * @bug 6758050 8025633 * @summary Test HTML output for nested generic types. * @author bpatel - * @library ../lib/ - * @build JavadocTester TestNestedGenerics + * @library ../lib + * @build JavadocTester * @run main TestNestedGenerics */ public class TestNestedGenerics extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[]{ - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "pkg" - }; + public static void main(String... args) throws Exception { + TestNestedGenerics tester = new TestNestedGenerics(); + tester.runTests(); + } - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/NestedGenerics.html", + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("pkg/NestedGenerics.html", true, "" - } - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestNestedGenerics tester = new TestNestedGenerics(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + "(java.util.Map<A, java.util.Map<A, A>>)"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testNestedInlineTag/TestNestedInlineTag.java --- a/langtools/test/com/sun/javadoc/testNestedInlineTag/TestNestedInlineTag.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testNestedInlineTag/TestNestedInlineTag.java Fri May 16 02:13:12 2014 -0700 @@ -25,12 +25,11 @@ * @test * @summary Test for nested inline tags. * * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester * @build testtaglets.UnderlineTaglet * @build testtaglets.BoldTaglet * @build testtaglets.GreenTaglet - * @build TestNestedInlineTag * @run main TestNestedInlineTag */ @@ -38,7 +37,6 @@ * This should be green, underlined and bold (Class): {@underline {@bold {@green My test}}} . */ public class TestNestedInlineTag extends JavadocTester { - /** * This should be green, underlined and bold (Field): {@underline {@bold {@green My test}}} . */ @@ -54,44 +52,35 @@ */ public void method(){} - private static final String[][] TEST = { - //Test nested inline tag in class description. - { "TestNestedInlineTag.html", - "This should be green, underlined and bold (Class): My test" - }, - - //Test nested inline tag in field description. - { "TestNestedInlineTag.html", - "This should be green, underlined and bold (Field): My test" - }, - - //Test nested inline tag in constructor description. - { "TestNestedInlineTag.html", - "This should be green, underlined and bold (Constructor): My test" - }, - - //Test nested inline tag in method description. - { "TestNestedInlineTag.html", - "This should be green, underlined and bold (Method): My test" - } - }; - - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-taglet", "testtaglets.UnderlineTaglet", - "-taglet", "testtaglets.BoldTaglet", - "-taglet", "testtaglets.GreenTaglet", - SRC_DIR + "/TestNestedInlineTag.java" - }; - /** * The entry point of the test. * @param args the array of command line arguments. + * @throws Exception if the test fails */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestNestedInlineTag tester = new TestNestedInlineTag(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-taglet", "testtaglets.UnderlineTaglet", + "-taglet", "testtaglets.BoldTaglet", + "-taglet", "testtaglets.GreenTaglet", + testSrc("TestNestedInlineTag.java")); + checkExit(Exit.OK); + + checkOutput("TestNestedInlineTag.html", true, + //Test nested inline tag in class description. + "This should be green, underlined and bold (Class): My test", + //Test nested inline tag in field description. + "This should be green, underlined and bold (Field): My test", + //Test nested inline tag in constructor description. + "This should be green, underlined and bold (Constructor): My test", + //Test nested inline tag in method description. + "This should be green, underlined and bold (Method): My test" + ); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java --- a/langtools/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java Fri May 16 02:13:12 2014 -0700 @@ -28,738 +28,612 @@ * language features. Check the output to ensure that the new * language features are properly documented. * @author jamieh - * @library ../lib/ - * @build JavadocTester TestNewLanguageFeatures + * @library ../lib + * @build JavadocTester * @run main TestNewLanguageFeatures */ public class TestNewLanguageFeatures extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-Xdoclint:none", "-d", OUTPUT_DIR, "-use", "-sourcepath", SRC_DIR, - "pkg", "pkg1", "pkg2" - }; + public static void main(String... args) throws Exception { + TestNewLanguageFeatures tester = new TestNewLanguageFeatures(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-Xdoclint:none", + "-d", "out", + "-use", "-sourcepath", + testSrc, + "pkg", "pkg1", "pkg2"); + checkExit(Exit.OK); + + checkEnums(); + checkTypeParameters(); + checkVarArgs(); + checkAnnotationTypeUsage(); + } - //Input for string search tests. - private static final String[][] TEST = - { - //================================= - // ENUM TESTING - //================================= - //Make sure enum header is correct. - { "pkg/Coin.html", "Enum Coin"}, - //Make sure enum signature is correct. - { "pkg/Coin.html", "
        public enum " +
        -                     "Coin\n" +
        -                     "extends java.lang.Enum<Coin>
        " - }, - //Check for enum constant section - { "pkg/Coin.html", "Enum Constants" + - " "}, - //Detail for enum constant - { "pkg/Coin.html", - "Dime"}, - //Automatically insert documentation for values() and valueOf(). - { "pkg/Coin.html", - "Returns an array containing the constants of this enum type,"}, - { "pkg/Coin.html", - "Returns the enum constant of this type with the specified name"}, - { "pkg/Coin.html", "for (Coin c : Coin.values())"}, - { "pkg/Coin.html", - "Overloaded valueOf() method has correct documentation."}, - { "pkg/Coin.html", - "Overloaded values method has correct documentation."}, + //================================= + // ENUM TESTING + //================================= + void checkEnums() { + checkOutput("pkg/Coin.html", true, + // Make sure enum header is correct. + "Enum Coin", + // Make sure enum signature is correct. + "
        public enum "
        +                + "Coin\n"
        +                + "extends java.lang.Enum<Coin>
        ", + // Check for enum constant section + "Enum Constants" + + " ", + // Detail for enum constant + "Dime", + // Automatically insert documentation for values() and valueOf(). + "Returns an array containing the constants of this enum type,", + "Returns the enum constant of this type with the specified name", + "for (Coin c : Coin.values())", + "Overloaded valueOf() method has correct documentation.", + "Overloaded values method has correct documentation."); + + // NO constructor section + checkOutput("pkg/Coin.html", false, + "

        Constructor Summary

        "); + } + + //================================= + // TYPE PARAMETER TESTING + //================================= - //================================= - // TYPE PARAMETER TESTING - //================================= - //Make sure the header is correct. - { "pkg/TypeParameters.html", - "Class TypeParameters<E>"}, - //Check class type parameters section. - { "pkg/TypeParameters.html", - "
        Type Parameters:
        \n" + - "
        E - " + - "the type parameter for this class."}, - //Type parameters in @see/@link - { "pkg/TypeParameters.html", - "
        \n" + - "
        See Also:
        \n" + - "
        " + - "" + - "TypeParameters
        \n" + - "
        "}, - //Method that uses class type parameter. - { "pkg/TypeParameters.html", - "(E param)"}, - //Method type parameter section. - { "pkg/TypeParameters.html", - "Type Parameters:\n" + - "
        T - This is the first " + - "type parameter.
        \n" + - "
        V - This is the second type " + - "parameter."}, - //Signature of method with type parameters - { "pkg/TypeParameters.html", - "public <T extends java.util.List,V> " + - "java.lang.String[] methodThatHasTypeParameters"}, - //Wildcard testing. - { "pkg/Wildcards.html", - "" + - "TypeParameters<? super java.lang.String> a"}, - { "pkg/Wildcards.html", - "" + - "TypeParameters<? extends java.lang.StringBuffer> b"}, - { "pkg/Wildcards.html", - "" + - "TypeParameters c"}, - //Bad type parameter warnings. - {WARNING_OUTPUT, "warning - @param argument " + - "\"\" is not a type parameter name."}, - {WARNING_OUTPUT, "warning - @param argument " + - "\"\" is not a type parameter name."}, - - //Signature of subclass that has type parameters. - { "pkg/TypeParameterSubClass.html", - "
        public class TypeParameterSubClass<T extends " +
        -                "java.lang.String>\n" +
        -                "extends " +
        -                "" +
        -                "TypeParameterSuperClass<T>
        "}, + void checkTypeParameters() { + checkOutput("pkg/TypeParameters.html", true, + // Make sure the header is correct. + "Class TypeParameters<E>", + // Check class type parameters section. + "
        Type Parameters:
        \n" + + "
        E - " + + "the type parameter for this class.", + // Type parameters in @see/@link + "
        \n" + + "
        See Also:
        \n" + + "
        " + + "" + + "TypeParameters
        \n" + + "
        ", + // Method that uses class type parameter. + "(E param)", + // Method type parameter section. + "Type Parameters:\n" + + "
        T - This is the first " + + "type parameter.
        \n" + + "
        V - This is the second type " + + "parameter.", + // Signature of method with type parameters + "public <T extends java.util.List,V> " + + "java.lang.String[] methodThatHasTypeParameters"); - //Interface generic parameter substitution - //Signature of subclass that has type parameters. - { "pkg/TypeParameters.html", - "
        \n" + - "
        All Implemented Interfaces:
        \n" + - "
        " + - "SubInterface<E>, SuperInterface<E>
        \n" + - "
        "}, - { "pkg/SuperInterface.html", - "
        \n" + - "
        All Known Subinterfaces:
        \n" + - "
        " + - "SubInterface<V>
        \n" + - "
        "}, - { "pkg/SubInterface.html", - "
        \n" + - "
        All Superinterfaces:
        \n" + - "
        " + - "SuperInterface<V>
        \n" + - "
        "}, + checkOutput("pkg/Wildcards.html", true, + // Wildcard testing. + "" + + "TypeParameters<? super java.lang.String> a", + "" + + "TypeParameters<? extends java.lang.StringBuffer> b", + "" + + "TypeParameters c"); - //================================= - // VAR ARG TESTING - //================================= - { "pkg/VarArgs.html", "(int... i)"}, - { "pkg/VarArgs.html", "(int[][]... i)"}, - { "pkg/VarArgs.html", "-int:A...-"}, - { "pkg/VarArgs.html", - "" + - "TypeParameters... t"}, + checkOutput(Output.WARNING, true, + // Bad type parameter warnings. + "warning - @param argument " + + "\"\" is not a type parameter name.", + "warning - @param argument " + + "\"\" is not a type parameter name."); - //================================= - // ANNOTATION TYPE TESTING - //================================= - //Make sure the summary links are correct. - { "pkg/AnnotationType.html", - "
      • Summary: 
      • \n" + - "
      • Field | 
      • \n" + - "
      • " + - "Required | 
      • \n" + - "
      • " + - "Optional
      • "}, - //Make sure the detail links are correct. - { "pkg/AnnotationType.html", - "
      • Detail: 
      • \n" + - "
      • Field | 
      • \n" + - "
      • Element
      • "}, - //Make sure the heading is correct. - { "pkg/AnnotationType.html", - "Annotation Type AnnotationType"}, - //Make sure the signature is correct. - { "pkg/AnnotationType.html", - "public @interface AnnotationType"}, - //Make sure member summary headings are correct. - { "pkg/AnnotationType.html", - "

        Required Element Summary

        "}, - { "pkg/AnnotationType.html", - "

        Optional Element Summary

        "}, - //Make sure element detail heading is correct - { "pkg/AnnotationType.html", - "Element Detail"}, - //Make sure default annotation type value is printed when necessary. - { "pkg/AnnotationType.html", - "
        \n" + - "
        Default:
        \n" + - "
        \"unknown\"
        \n" + - "
        "}, + // Signature of subclass that has type parameters. + checkOutput("pkg/TypeParameterSubClass.html", true, + "
        public class TypeParameterSubClass<T extends "
        +                + "java.lang.String>\n"
        +                + "extends "
        +                + ""
        +                + "TypeParameterSuperClass<T>
        "); - //================================= - // ANNOTATION TYPE USAGE TESTING - //================================= + // Interface generic parameter substitution + // Signature of subclass that has type parameters. + checkOutput("pkg/TypeParameters.html", true, + "
        \n" + + "
        All Implemented Interfaces:
        \n" + + "
        " + + "SubInterface<E>, SuperInterface<E>
        \n" + + "
        "); - //PACKAGE - { "pkg/package-summary.html", - "@AnnotationType(optional=\"Package Annotation\",\n" + - " required=1994)"}, - - //CLASS - { "pkg/AnnotationTypeUsage.html", - "
        @AnnotationType(" +
        -                "optional" +
        -                "=\"Class Annotation\",\n" +
        -                "                " +
        -                "required=1994)\n" +
        -                "public class " +
        -                "AnnotationTypeUsage\n" +
        -                "extends java.lang.Object
        "}, + checkOutput("pkg/SuperInterface.html", true, + "
        \n" + + "
        All Known Subinterfaces:
        \n" + + "
        " + + "SubInterface<V>
        \n" + + "
        "); + checkOutput("pkg/SubInterface.html", true, + "
        \n" + + "
        All Superinterfaces:
        \n" + + "
        " + + "SuperInterface<V>
        \n" + + "
        "); - //FIELD - { "pkg/AnnotationTypeUsage.html", - "
        @AnnotationType(" +
        -                "optional" +
        -                "=\"Field Annotation\",\n" +
        -                "                " +
        -                "required=1994)\n" +
        -                "public int field
        "}, - - //CONSTRUCTOR - { "pkg/AnnotationTypeUsage.html", - "
        @AnnotationType(" +
        -                "optional" +
        -                "=\"Constructor Annotation\",\n" +
        -                "                " +
        -                "required=1994)\n" +
        -                "public AnnotationTypeUsage()
        "}, + //============================================================== + // Handle multiple bounds. + //============================================================== + checkOutput("pkg/MultiTypeParameters.html", true, + "public <T extends java.lang.Number & java.lang.Runnable> T foo(T t)"); - //METHOD - { "pkg/AnnotationTypeUsage.html", - "
        @AnnotationType(" +
        -                "optional" +
        -                "=\"Method Annotation\",\n" +
        -                "                " +
        -                "required=1994)\n" +
        -                "public void method()
        "}, - - //METHOD PARAMS - { "pkg/AnnotationTypeUsage.html", - "
        public void methodWithParams(" +
        -                "" +
        -                "@AnnotationType(" +
        -                "optional=\"Parameter Annotation\",required=1994)\n" +
        -                "                             int documented,\n" +
        -                "                             int undocmented)
        "}, + //============================================================== + // Test Class-Use Documentation for Type Parameters. + //============================================================== + // ClassUseTest1: + checkOutput("pkg2/class-use/Foo.html", true, + "Classes in pkg2 with type parameters of " + + "type " + + "Foo ", + "ClassUseTest1<T extends " + + "Foo" + + " & " + + "Foo2> ", + "Methods in pkg2 with type parameters of " + + "type Foo ", + "ClassUseTest1." + + "method" + + "(T t) ", + "Fields in pkg2 with type parameters of " + + "type " + + "Foo ", + "td class=\"colFirst\">ParamTest" + + "<Foo>" + ); - //CONSTRUCTOR PARAMS - { "pkg/AnnotationTypeUsage.html", - "
        public AnnotationTypeUsage(" +
        -                "@AnnotationType(" +
        -                "optional=\"Constructor Param Annotation\",required=1994)\n" +
        -                "                           int documented,\n" +
        -                "                           int undocmented)
        "}, - - //================================= - // ANNOTATION TYPE USAGE TESTING (All Different Types). - //================================= - - //Integer - { "pkg1/B.html", - "d=3.14,"}, - - //Double - { "pkg1/B.html", - "d=3.14,"}, - - //Boolean - { "pkg1/B.html", - "b=true,"}, + checkOutput("pkg2/class-use/ParamTest.html", true, + "Fields in pkg2 declared as ParamTest" + + " ", + "ParamTest<Foo>" + ); - //String - { "pkg1/B.html", - "s=\"sigh\","}, - - //Class - { "pkg1/B.html", - "c=Foo.class,"}, - - //Bounded Class - { "pkg1/B.html", - "w=TypeParameterSubClass.class,"}, - - //Enum - { "pkg1/B.html", - "e=Penny,"}, - - //Annotation Type - { "pkg1/B.html", - "a=@AnnotationType(optional=\"foo\",required=1994),"}, - - //String Array - { "pkg1/B.html", - "sa={\"up\",\"down\"},"}, - - //Primitive - { "pkg1/B.html", - "primitiveClassTest=boolean.class,"}, - - //XXX: Add array test case after this if fixed: - //5020899: Incorrect internal representation of class-valued annotation elements - - //Make sure that annotations are surrounded by
         and 
        - { "pkg1/B.html", - "
        @A"},
        -            { "pkg1/B.html",
        -                "public interface B
        "}, - + checkOutput("pkg2/class-use/Foo2.html", true, + "Classes in pkg2 with type parameters of " + + "type Foo2 " + + "", + "ClassUseTest1<T extends " + + "Foo" + + " & " + + "Foo2> ", + "Methods in pkg2 with type parameters of " + + "type Foo2 " + + "", + "" + + "ClassUseTest1.method" + + "(T t) " + ); - //============================================================== - // Handle multiple bounds. - //============================================================== - { "pkg/MultiTypeParameters.html", - "public <T extends java.lang.Number & java.lang.Runnable> T foo(T t)"}, - - //============================================================== - // Test Class-Use Documenation for Type Parameters. - //============================================================== - - //ClassUseTest1: - { "pkg2/class-use/Foo.html", - "Classes in pkg2 with type parameters of " + - "type " + - "Foo " - }, - { "pkg2/class-use/Foo.html", - "ClassUseTest1<T extends " + - "Foo" + - " & " + - "Foo2> " - }, - { "pkg2/class-use/Foo.html", - "Methods in pkg2 with type parameters of " + - "type Foo " - }, - { "pkg2/class-use/Foo.html", - "ClassUseTest1." + - "method" + - "(T t) " - }, - { "pkg2/class-use/Foo.html", - "Fields in pkg2 with type parameters of " + - "type " + - "Foo " - }, - { "pkg2/class-use/Foo.html", - "td class=\"colFirst\">ParamTest" + - "<Foo>" - }, + // ClassUseTest2: > + checkOutput("pkg2/class-use/ParamTest.html", true, + "Classes in pkg2 with type parameters of " + + "type ParamTest" + + " ", + "ClassUseTest2<T extends " + + "" + + "ParamTest<" + + "Foo3>> ", + "Methods in pkg2 with type parameters of " + + "type ParamTest" + + " ", + "ClassUseTest2." + + "method" + + "(T t) ", + "Fields in pkg2 declared as ParamTest" + + " ", + "ParamTest" + + "<" + + "Foo>", + "Methods in pkg2 with type parameters of " + + "type ParamTest" + + " ", + "<T extends ParamTest" + + "<Foo3>>
        ParamTest" + + "<Foo3>
        " + ); - { "pkg2/class-use/ParamTest.html", - "Fields in pkg2 declared as ParamTest" + - " " - }, - { "pkg2/class-use/ParamTest.html", - "ParamTest<Foo>" - }, + checkOutput("pkg2/class-use/Foo3.html", true, + "Classes in pkg2 with type parameters of " + + "type " + + "Foo3 ", + "ClassUseTest2<T extends " + + "" + + "ParamTest<" + + "Foo3>> ", + "Methods in pkg2 with type parameters of " + + "type Foo3 " + + "", + "ClassUseTest2." + + "method" + + "(T t) ", + "Methods in pkg2 that return types with " + + "arguments of type Foo3" + + " ", + "<T extends ParamTest<" + + "Foo3" + + ">>
        ParamTest<Foo3>
        " + ); - { "pkg2/class-use/Foo2.html", - "Classes in pkg2 with type parameters of " + - "type Foo2 " + - "" - }, - { "pkg2/class-use/Foo2.html", - "ClassUseTest1<T extends " + - "Foo" + - " & " + - "Foo2> " - }, - { "pkg2/class-use/Foo2.html", - "Methods in pkg2 with type parameters of " + - "type Foo2 " + - "" - }, - { "pkg2/class-use/Foo2.html", - "" + - "ClassUseTest1.method" + - "(T t) " - }, + // ClassUseTest3: >> + checkOutput("pkg2/class-use/ParamTest2.html", true, + "Classes in pkg2 with type parameters of " + + "type ParamTest2" + + " ", + "ClassUseTest3<T extends " + + "" + + "ParamTest2<java.util.List<? extends " + + "" + + "Foo4>>> ", + "Methods in pkg2 with type parameters of " + + "type ParamTest2" + + " ", + "ClassUseTest3" + + ".method(T t) ", + "<T extends " + + "ParamTest2<java.util.List<? extends Foo4>" + + ">>
        ParamTest2<java.util.List" + + "<? extends Foo4>>
        " + ); - //ClassUseTest2: > - { "pkg2/class-use/ParamTest.html", - "Classes in pkg2 with type parameters of " + - "type ParamTest" + - " " - }, - { "pkg2/class-use/ParamTest.html", - "ClassUseTest2<T extends " + - "" + - "ParamTest<" + - "Foo3>> " - }, - { "pkg2/class-use/ParamTest.html", - "Methods in pkg2 with type parameters of " + - "type ParamTest" + - " " - }, - { "pkg2/class-use/ParamTest.html", - "ClassUseTest2." + - "method" + - "(T t) " - }, - { "pkg2/class-use/ParamTest.html", - "Fields in pkg2 declared as ParamTest" + - " " - }, - { "pkg2/class-use/ParamTest.html", - "ParamTest" + - "<" + - "Foo>" - }, - { "pkg2/class-use/ParamTest.html", - "Methods in pkg2 with type parameters of " + - "type ParamTest" + - " " - }, - { "pkg2/class-use/ParamTest.html", - "<T extends ParamTest" + - "<Foo3>>
        ParamTest" + - "<Foo3>
        " - }, + checkOutput("pkg2/class-use/Foo4.html", true, + "Classes in pkg2 with type parameters of " + + "type Foo4 " + + "", + "ClassUseTest3<T extends " + + "" + + "ParamTest2<java.util.List<? extends " + + "" + + "Foo4>>> ", + "Methods in pkg2 with type parameters of " + + "type Foo4 ", + "ClassUseTest3." + + "method(T t)" + + " ", + "Methods in pkg2 that return types with " + + "arguments of type Foo4 ", + "<T extends " + + "ParamTest2<java.util.List<? extends Foo4>" + + ">>
        ParamTest2<java.util.List" + + "<? extends Foo4>>
        " + ); - { "pkg2/class-use/Foo3.html", - "Classes in pkg2 with type parameters of " + - "type " + - "Foo3 " - }, - { "pkg2/class-use/Foo3.html", - "ClassUseTest2<T extends " + - "" + - "ParamTest<" + - "Foo3>> " - }, - { "pkg2/class-use/Foo3.html", - "Methods in pkg2 with type parameters of " + - "type Foo3 " + - "" - }, - { "pkg2/class-use/Foo3.html", - "ClassUseTest2." + - "method" + - "(T t) " - }, - { "pkg2/class-use/Foo3.html", - "Methods in pkg2 that return types with " + - "arguments of type Foo3" + - " " - }, - { "pkg2/class-use/Foo3.html", - "<T extends ParamTest<" + - "Foo3" + - ">>
        ParamTest<Foo3>
        " - }, + // Type parameters in constructor and method args + checkOutput("pkg2/class-use/Foo4.html", true, + "Method parameters in pkg2 with type arguments of " + + "type Foo4 " + + "\n" + + "\n" + + "Modifier and Type\n" + + "Method and Description\n" + + "\n" + + "\n" + + "\n" + + "void\n" + + "ClassUseTest3." + + "method(java." + + "util.Set<Foo4> p) \n" + + "\n" + + "", + "Constructor parameters in pkg2 with type arguments " + + "of type Foo4 " + + "" + ); + + //================================= + // TYPE PARAMETER IN INDEX + //================================= + checkOutput("index-all.html", true, + "" + + "method(Vector<Object>)" + ); + + // TODO: duplicate of previous case; left in delibarately for now to simplify comparison testing + //================================= + // TYPE PARAMETER IN INDEX + //================================= + checkOutput("index-all.html", true, + "" + + "method(Vector<Object>)" + ); - //ClassUseTest3: >> - { "pkg2/class-use/ParamTest2.html", - "Classes in pkg2 with type parameters of " + - "type ParamTest2" + - " " - }, - { "pkg2/class-use/ParamTest2.html", - "ClassUseTest3<T extends " + - "" + - "ParamTest2<java.util.List<? extends " + - "" + - "Foo4>>> " - }, - { "pkg2/class-use/ParamTest2.html", - "Methods in pkg2 with type parameters of " + - "type ParamTest2" + - " " - }, - { "pkg2/class-use/ParamTest2.html", - "ClassUseTest3" + - ".method(T t) " - }, - { "pkg2/class-use/ParamTest2.html", - "<T extends " + - "ParamTest2<java.util.List<? extends Foo4>" + - ">>
        ParamTest2<java.util.List" + - "<? extends Foo4>>
        " - }, + // No type parameters in class frame. + checkOutput("allclasses-frame.html", false, + "" + + "TypeParameters<E>" + ); + + } + + //================================= + // VAR ARG TESTING + //================================= + void checkVarArgs() { + checkOutput("pkg/VarArgs.html", true, + "(int... i)", + "(int[][]... i)", + "-int:A...-", + "" + + "TypeParameters... t"); + } - { "pkg2/class-use/Foo4.html", - "Classes in pkg2 with type parameters of " + - "type Foo4 " + - "" - }, - { "pkg2/class-use/Foo4.html", - "ClassUseTest3<T extends " + - "" + - "ParamTest2<java.util.List<? extends " + - "" + - "Foo4>>> " - }, - { "pkg2/class-use/Foo4.html", - "Methods in pkg2 with type parameters of " + - "type Foo4 " - }, - { "pkg2/class-use/Foo4.html", - "ClassUseTest3." + - "method(T t)" + - " " - }, - { "pkg2/class-use/Foo4.html", - "Methods in pkg2 that return types with " + - "arguments of type Foo4 " - }, - { "pkg2/class-use/Foo4.html", - "<T extends " + - "ParamTest2<java.util.List<? extends Foo4>" + - ">>
        ParamTest2<java.util.List" + - "<? extends Foo4>>
        " - }, + //================================= + // ANNOTATION TYPE TESTING + //================================= + void checkAnnotationTypes() { + checkOutput("pkg/AnnotationType.html", true, + // Make sure the summary links are correct. + "
      • Summary: 
      • \n" + + "
      • Field | 
      • \n" + + "
      • " + + "Required | 
      • \n" + + "
      • " + + "Optional
      • ", + // Make sure the detail links are correct. + "
      • Detail: 
      • \n" + + "
      • Field | 
      • \n" + + "
      • Element
      • ", + // Make sure the heading is correct. + "Annotation Type AnnotationType", + // Make sure the signature is correct. + "public @interface AnnotationType", + // Make sure member summary headings are correct. + "

        Required Element Summary

        ", + "

        Optional Element Summary

        ", + // Make sure element detail heading is correct + "Element Detail", + // Make sure default annotation type value is printed when necessary. + "
        \n" + + "
        Default:
        \n" + + "
        \"unknown\"
        \n" + + "
        "); + } + + //================================= + // ANNOTATION TYPE USAGE TESTING + //================================= + void checkAnnotationTypeUsage() { + checkOutput("pkg/package-summary.html", true, + // PACKAGE + "@AnnotationType(optional=\"Package Annotation\",\n" + + " required=1994)"); - //Type parameters in constructor and method args - { "pkg2/class-use/Foo4.html", - "Method parameters in pkg2 with type arguments of " + - "type Foo4 " + - "\n" + - "\n" + - "Modifier and Type\n" + - "Method and Description\n" + - "\n" + - "\n" + - "\n" + - "void\n" + - "ClassUseTest3." + - "method(java." + - "util.Set<Foo4> p) \n" + - "\n" + - "" - }, - { "pkg2/class-use/Foo4.html", - "Constructor parameters in pkg2 with type arguments " + - "of type Foo4 " + - "" - }, - - //================================= - // Annotatation Type Usage - //================================= - { "pkg/class-use/AnnotationType.html", - "Packages with annotations of type " + - "AnnotationType " + - "" - }, - - { "pkg/class-use/AnnotationType.html", - "Classes in pkg with annotations of type " + - "AnnotationType " - }, - - { "pkg/class-use/AnnotationType.html", - "Fields in pkg with annotations of type " + - "AnnotationType" + - " " - }, + checkOutput("pkg/AnnotationTypeUsage.html", true, + // CLASS + "
        @AnnotationType("
        +                + "optional"
        +                + "=\"Class Annotation\",\n"
        +                + "                "
        +                + "required=1994)\n"
        +                + "public class "
        +                + "AnnotationTypeUsage\n"
        +                + "extends java.lang.Object
        ", + // FIELD + "
        @AnnotationType("
        +                + "optional"
        +                + "=\"Field Annotation\",\n"
        +                + "                "
        +                + "required=1994)\n"
        +                + "public int field
        ", + // CONSTRUCTOR + "
        @AnnotationType("
        +                + "optional"
        +                + "=\"Constructor Annotation\",\n"
        +                + "                "
        +                + "required=1994)\n"
        +                + "public AnnotationTypeUsage()
        ", + // METHOD + "
        @AnnotationType("
        +                + "optional"
        +                + "=\"Method Annotation\",\n"
        +                + "                "
        +                + "required=1994)\n"
        +                + "public void method()
        ", + // METHOD PARAMS + "
        public void methodWithParams("
        +                + ""
        +                + "@AnnotationType("
        +                + "optional=\"Parameter Annotation\",required=1994)\n"
        +                + "                             int documented,\n"
        +                + "                             int undocmented)
        ", + // CONSTRUCTOR PARAMS + "
        public AnnotationTypeUsage("
        +                + "@AnnotationType("
        +                + "optional=\"Constructor Param Annotation\",required=1994)\n"
        +                + "                           int documented,\n"
        +                + "                           int undocmented)
        "); - { "pkg/class-use/AnnotationType.html", - "Methods in pkg with annotations of type " + - "AnnotationType" + - " " - }, - - { "pkg/class-use/AnnotationType.html", - "Method parameters in pkg with annotations of type " + - "AnnotationType" + - " " - }, - - { "pkg/class-use/AnnotationType.html", - "Constructors in pkg with annotations of type " + - "AnnotationType" + - " " - }, - - { "pkg/class-use/AnnotationType.html", - "Constructor parameters in pkg with annotations of " + - "type AnnotationType " - }, - - //================================= - // TYPE PARAMETER IN INDEX - //================================= - { "index-all.html", - "" + - "method(Vector<Object>)" - }, - //================================= - // TYPE PARAMETER IN INDEX - //================================= - { "index-all.html", - "" + - "method(Vector<Object>)" - }, - }; - private static final String[][] NEGATED_TEST = { + //================================= + // Annotatation Type Usage //================================= - // ENUM TESTING - //================================= - //NO constructor section - { "pkg/Coin.html", "

        Constructor Summary

        "}, - //================================= - // TYPE PARAMETER TESTING - //================================= - //No type parameters in class frame. - { "allclasses-frame.html", - "" + - "TypeParameters<E>" - }, + checkOutput("pkg/class-use/AnnotationType.html", true, + "Packages with annotations of type " + + "AnnotationType " + + "", + "Classes in pkg with annotations of type " + + "AnnotationType ", + "Fields in pkg with annotations of type " + + "AnnotationType" + + " ", + "Methods in pkg with annotations of type " + + "AnnotationType" + + " ", + "Method parameters in pkg with annotations of type " + + "AnnotationType" + + " ", + "Constructors in pkg with annotations of type " + + "AnnotationType" + + " ", + "Constructor parameters in pkg with annotations of " + + "type AnnotationType " + ); //============================================================== // ANNOTATION TYPE USAGE TESTING (When @Documented is omitted) //=============================================================== - - //CLASS - { "pkg/AnnotationTypeUsage.html", - "@AnnotationTypeUndocumented(optional=\"Class Annotation\",\n" + - " required=1994)\n" + - "public class AnnotationTypeUsage
        extends java.lang.Object
        "}, - - //FIELD - { "pkg/AnnotationTypeUsage.html", - "@AnnotationTypeUndocumented(optional=\"Field Annotation\",\n" + - " required=1994)\n" + - "public int field"}, - - //CONSTRUCTOR - { "pkg/AnnotationTypeUsage.html", - "@AnnotationTypeUndocumented(optional=\"Constructor Annotation\",\n" + - " required=1994)\n" + - "public AnnotationTypeUsage()"}, - - //METHOD - { "pkg/AnnotationTypeUsage.html", - "@AnnotationTypeUndocumented(optional=\"Method Annotation\",\n" + - " required=1994)\n" + - "public void method()"}, + checkOutput("pkg/AnnotationTypeUsage.html", false, + // CLASS + "@AnnotationTypeUndocumented(optional=\"Class Annotation\",\n" + + " required=1994)\n" + + "public class AnnotationTypeUsage
        extends java.lang.Object
        ", + // FIELD + "@AnnotationTypeUndocumented(optional=\"Field Annotation\",\n" + + " required=1994)\n" + + "public int field", + // CONSTRUCTOR + "@AnnotationTypeUndocumented(optional=\"Constructor Annotation\",\n" + + " required=1994)\n" + + "public AnnotationTypeUsage()", + // METHOD + "@AnnotationTypeUndocumented(optional=\"Method Annotation\",\n" + + " required=1994)\n" + + "public void method()"); //================================= // Make sure annotation types do not // trigger this warning. //================================= - {WARNING_OUTPUT, - "Internal error: package sets don't match: [] with: null" - }, - }; + checkOutput(Output.WARNING, false, + "Internal error: package sets don't match: [] with: null"); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestNewLanguageFeatures tester = new TestNewLanguageFeatures(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + //================================= + // ANNOTATION TYPE USAGE TESTING (All Different Types). + //================================= + checkOutput("pkg1/B.html", true, + // Integer + "d=3.14,", + // Double + "d=3.14,", + // Boolean + "b=true,", + // String + "s=\"sigh\",", + // Class + "c=Foo.class,", + // Bounded Class + "w=TypeParameterSubClass.class,", + // Enum + "e=Penny,", + // Annotation Type + "a=@AnnotationType(optional=\"foo\",required=1994),", + // String Array + "sa={\"up\",\"down\"},", + // Primitive + "primitiveClassTest=boolean.class,"); + + // XXX: Add array test case after this if fixed: + //5020899: Incorrect internal representation of class-valued annotation elements + // Make sure that annotations are surrounded by
         and 
        + checkOutput("pkg1/B.html", true, + "
        @A",
        +                "public interface B
        "); + } + } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testNoPackagesFile/TestNoPackagesFile.java --- a/langtools/test/com/sun/javadoc/testNoPackagesFile/TestNoPackagesFile.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testNoPackagesFile/TestNoPackagesFile.java Fri May 16 02:13:12 2014 -0700 @@ -27,31 +27,26 @@ * @summary Verify that packages.html is no longer generated since it is no * longer used. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestNoPackagesFile * @run main TestNoPackagesFile */ public class TestNoPackagesFile extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - SRC_DIR + "/C.java" - }; + public static void main(String... args) throws Exception { + TestNoPackagesFile tester = new TestNoPackagesFile(); + tester.runTests(); + } - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestNoPackagesFile tester = new TestNoPackagesFile(); - tester.run(ARGS, NO_TEST, NO_TEST); - if ((new java.io.File(OUTPUT_DIR + "/packages.html")).exists()) { - throw new Error("Test Fails: packages file should not be " + "generated anymore."); - } else { - System.out.println("Test passes: packages.html not found."); - } + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + testSrc("C.java")); + checkExit(Exit.OK); + + // packages.html file should not be generated anymore. + checkFiles(false, "packages.html"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testNonFrameWarning/TestNonFrameWarning.java --- a/langtools/test/com/sun/javadoc/testNonFrameWarning/TestNonFrameWarning.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testNonFrameWarning/TestNonFrameWarning.java Fri May 16 02:13:12 2014 -0700 @@ -26,31 +26,28 @@ * @bug 7001086 * @summary Test Non-frame warning. * @author Bhavesh Patel - * @library ../lib/ - * @build JavadocTester TestNonFrameWarning + * @library ../lib + * @build JavadocTester * @run main TestNonFrameWarning */ public class TestNonFrameWarning extends JavadocTester { - private static final String[][] TEST = { - { "index.html", - "

        This document is designed to be viewed using the frames feature. " + - "If you see this message, you are using a non-frame-capable web client. " + - "Link to Non-frame version.

        " - } - }; - private static final String[] ARGS = new String[]{ - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg" - }; + public static void main(String... args) throws Exception { + TestNonFrameWarning tester = new TestNonFrameWarning(); + tester.runTests(); + } - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestNonFrameWarning tester = new TestNonFrameWarning(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("index.html", true, + "

        This document is designed to be viewed using the frames feature. " + + "If you see this message, you are using a non-frame-capable web client. " + + "Link to Non-frame version.

        "); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testNotifications/TestNotifications.java --- a/langtools/test/com/sun/javadoc/testNotifications/TestNotifications.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testNotifications/TestNotifications.java Fri May 16 02:13:12 2014 -0700 @@ -28,50 +28,43 @@ * be created. * Make sure classname is not include in javadoc usage message. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestNotifications * @run main TestNotifications */ public class TestNotifications extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg" - }; - - private static final String[] ARGS2 = new String[] { - "-help" - }; + public static void main(String... args) throws Exception { + TestNotifications tester = new TestNotifications(); + tester.runTests(); + } - //Input for string search tests. - private static final String[][] TEST = { - {NOTICE_OUTPUT, "Creating destination directory: \"" + OUTPUT_DIR} - }; - private static final String[][] NEGATED_TEST = { - {NOTICE_OUTPUT, "Creating destination directory: \"" + OUTPUT_DIR} - }; + @Test + void test1() { + String outDir = "out"; - private static final String[][] NEGATED_TEST2 = { - {NOTICE_OUTPUT, "[classnames]"} - }; + // Notify that the destination directory must be created. + javadoc("-d", outDir, "-sourcepath", testSrc, "pkg"); + checkExit(Exit.OK); + checkOutput(Output.NOTICE, true, + "Creating destination directory: \"" + outDir); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestNotifications tester = new TestNotifications(); - // Notify that the destination directory must be created. - tester.run(ARGS, TEST, NO_TEST); // No need to notify that the destination must be created because // it already exists. - tester.setCheckOutputDirectoryCheck(DirectoryCheck.NONE); - tester.run(ARGS, NO_TEST, NEGATED_TEST); - tester.setCheckOutputDirectoryCheck(DirectoryCheck.NO_HTML_FILES); + setOutputDirectoryCheck(DirectoryCheck.NONE); + javadoc("-d", outDir, "-sourcepath", testSrc, "pkg"); + checkExit(Exit.OK); + checkOutput(Output.NOTICE, false, + "Creating destination directory: \"" + outDir); + } + + @Test + void test() { //Make sure classname is not include in javadoc usage message. - tester.run(ARGS2, NO_TEST, NEGATED_TEST2); - tester.printSummary(); + setOutputDirectoryCheck(DirectoryCheck.NO_HTML_FILES); + javadoc("-help"); + checkOutput(Output.NOTICE, false, + "[classnames]"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testOptions/TestOptions.java --- a/langtools/test/com/sun/javadoc/testOptions/TestOptions.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testOptions/TestOptions.java Fri May 16 02:13:12 2014 -0700 @@ -26,34 +26,30 @@ * @bug 4749567 * @summary Test the output for -header and -footer options. * @author Bhavesh Patel - * @library ../lib/ - * @build JavadocTester TestOptions + * @library ../lib + * @build JavadocTester * @run main TestOptions */ public class TestOptions extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-header", "Test header", "-footer", "Test footer", - "-sourcepath", SRC_DIR, "pkg" - }; + public static void main(String... args) throws Exception { + TestOptions tester = new TestOptions(); + tester.runTests(); + } - private static final String[][] TEST = { - { "pkg/package-summary.html", - "
        Test header
        "}, - { "pkg/package-summary.html", - "
        Test footer
        "} - }; + @Test + void test() { + javadoc("-d", "out", + "-header", "Test header", + "-footer", "Test footer", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestOptions tester = new TestOptions(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + checkOutput("pkg/package-summary.html", true, + "
        Test header
        ", + "
        Test footer
        "); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testOrdering/TestOrdering.java --- a/langtools/test/com/sun/javadoc/testOrdering/TestOrdering.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testOrdering/TestOrdering.java Fri May 16 02:13:12 2014 -0700 @@ -23,113 +23,115 @@ /* * @test - * @bug 8039410 + * @bug 8039410 8042601 * @summary test to determine if members are ordered correctly * @author ksrini * @library ../lib/ * @build JavadocTester - * @build TestOrdering * @run main TestOrdering */ -import java.util.regex.Matcher; -import java.util.regex.Pattern; +public class TestOrdering extends JavadocTester { -public class TestOrdering extends JavadocTester { - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ public static void main(String[] args) throws Exception { TestOrdering tester = new TestOrdering(); - // test unnamed packages - String[] ARGS = { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-use", - SRC_DIR + "/C.java", SRC_DIR + "/UsedInC.java" - }; - tester.runJavadoc(ARGS); - checkExecutableMemberOrdering(tester.readFileToString("class-use/UsedInC.html")); + tester.runTests(); + } - // next test using packages - String[] ARGS1 = { - "-d", OUTPUT_DIR + "-1", "-sourcepath", SRC_DIR, "-use", - "pkg1" - }; - tester.runJavadoc(ARGS1); - checkClassUseOrdering(tester.readFileToString("pkg1/class-use/UsedClass.html")); - checkIndexPathOrdering(tester.readFileToString("index-all.html")); + @Test + void testUnnamedPackages() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-use", + testSrc("C.java"), testSrc("UsedInC.java")); + checkExit(Exit.OK); + checkExecutableMemberOrdering("class-use/UsedInC.html"); + } + + @Test + void testNamedPackages() { + javadoc("-d", "out-1", + "-sourcepath", testSrc, + "-use", + "pkg1"); + checkExit(Exit.OK); + checkClassUseOrdering("pkg1/class-use/UsedClass.html"); + checkIndexPathOrdering("index-all.html"); } - static void checkExecutableMemberOrdering(String usePage) { + void checkExecutableMemberOrdering(String usePage) { + String contents = readFile(usePage); // check constructors - int idx1 = usePage.indexOf("C.html#C-UsedInC"); - int idx2 = usePage.indexOf("C.html#C-UsedInC-int"); - int idx3 = usePage.indexOf("C.html#C-UsedInC-java.lang.String"); + checking("constructors"); + int idx1 = contents.indexOf("C.html#C-UsedInC"); + int idx2 = contents.indexOf("C.html#C-UsedInC-int"); + int idx3 = contents.indexOf("C.html#C-UsedInC-java.lang.String"); if (idx1 == -1 || idx2 == -1 || idx3 == -1) { - throw new Error("ctor strings not found"); - } - if (idx1 > idx2 || idx2 > idx3 || idx1 > idx3) { - throw new Error("ctor strings are out of order"); - } + failed("ctor strings not found"); + } else if (idx1 > idx2 || idx2 > idx3 || idx1 > idx3) { + failed("ctor strings are out of order"); + } else + passed("ctor strings are in order"); // check methods - idx1 = usePage.indexOf("C.html#ymethod-int"); - idx2 = usePage.indexOf("C.html#ymethod-java.lang.String"); + checking("methods"); + idx1 = contents.indexOf("C.html#ymethod-int"); + idx2 = contents.indexOf("C.html#ymethod-java.lang.String"); if (idx1 == -1 || idx2 == -1) { - throw new Error("#ymethod strings not found"); - } - if (idx1 > idx2) { - throw new Error("#ymethod strings are out of order"); - } - System.out.println("Executable Member Ordering: OK"); + failed("#ymethod strings not found"); + } else if (idx1 > idx2) { + failed("#ymethod strings are out of order"); + } else + passed("Executable Member Ordering: OK"); } - static void checkClassUseOrdering(String usePage) { + void checkClassUseOrdering(String usePage) { checkClassUseOrdering(usePage, "pkg1/C#ITERATION#.html#zfield"); checkClassUseOrdering(usePage, "pkg1/C#ITERATION#.html#fieldInC#ITERATION#"); checkClassUseOrdering(usePage, "pkg1/C#ITERATION#.html#zmethod-pkg1.UsedClass"); checkClassUseOrdering(usePage, "pkg1/C#ITERATION#.html#methodInC#ITERATION#"); } - static void checkClassUseOrdering(String usePage, String searchString) { + void checkClassUseOrdering(String usePage, String searchString) { + String contents = readFile(usePage); int lastidx = 0; System.out.println("testing for " + searchString); for (int i = 1; i < 5; i++) { String s = searchString.replaceAll("#ITERATION#", Integer.toString(i)); - System.out.println(s); - int idx = usePage.indexOf(s); + checking(s); + int idx = contents.indexOf(s); if (idx < lastidx) { - throw new Error(s + ", member ordering error, last:" + lastidx + ", got:" + idx); + failed(s + ", member ordering error, last:" + lastidx + ", got:" + idx); + } else { + passed("\tlast: " + lastidx + " got:" + idx); } - System.out.println("\tlast: " + lastidx + " got:" + idx); lastidx = idx; } } - static void checkIndexPathOrdering(String indexPage) { - String[] OrderedExpectedStrings = { - "pkg1/UsedClass.html#add-java.lang.Double", - "pkg1/ZZTop.html#add-double", - "pkg1/ZZTop.html#add-java.lang.Double", - "pkg1/UsedClass.html#add-float", - "pkg1/ZZTop.html#add-float", - "pkg1/UsedClass.html#add-int", - "pkg1/ZZTop.html#add-int", - "pkg1/UsedClass.html#add-java.lang.Integer", - "pkg1/ZZTop.html#add-java.lang.Integer", - "pkg1/UsedClass.html#add-double-double", - "pkg1/UsedClass.html#add-double-java.lang.Double", - "pkg1/ZZTop.html#add-double-double", - "pkg1/ZZTop.html#add-double-java.lang.Double" - }; - int lastidx = 0; - for (String x : OrderedExpectedStrings) { - int idx = indexPage.indexOf(x); - if (idx < lastidx) { - throw new Error(x + ", index is out of order, last:" + lastidx + ", got:" + idx); - } - System.out.println(x + ": OK"); - lastidx = idx; - } + void checkIndexPathOrdering(String indexPage) { + checkOrder(indexPage, + "pkg1/UsedClass.html#add--", + "pkg1/ZZTop.html#add--", + "pkg1/UsedClass.html#add-double-", + "pkg1/UsedClass.html#add-java.lang.Double-", + "pkg1/ZZTop.html#add-double-", + "pkg1/ZZTop.html#add-java.lang.Double-", + "pkg1/UsedClass.html#add-double-byte-", + "pkg1/ZZTop.html#add-double-byte-", + "pkg1/UsedClass.html#add-double-double-", + "pkg1/UsedClass.html#add-double-java.lang.Double-", + "pkg1/ZZTop.html#add-double-double-", + "pkg1/ZZTop.html#add-double-java.lang.Double-", + "pkg1/UsedClass.html#add-float-", + "pkg1/ZZTop.html#add-float-", + "pkg1/UsedClass.html#add-float-int-", + "pkg1/ZZTop.html#add-float-int-", + "pkg1/UsedClass.html#add-int-", + "pkg1/ZZTop.html#add-int-", + "pkg1/UsedClass.html#add-int-float-", + "pkg1/ZZTop.html#add-int-float-", + "pkg1/UsedClass.html#add-java.lang.Integer-", + "pkg1/ZZTop.html#add-java.lang.Integer-"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testOrdering/pkg1/UsedClass.java --- a/langtools/test/com/sun/javadoc/testOrdering/pkg1/UsedClass.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testOrdering/pkg1/UsedClass.java Fri May 16 02:13:12 2014 -0700 @@ -26,18 +26,11 @@ * For index and class-use testing */ public class UsedClass { - // This is the exact order we expect to see /** - * @param i param + * just an empty param method. */ - public void add(int i){} - - /** - * @param i param - * @return double - */ - public int add(Integer i) {return 0;} + public void add(){} /** * @param d param @@ -45,18 +38,30 @@ public void add(double d){} /** + * @param i param + * @param f param + */ + public void add(int i, float f){} + + /** + * @param f param + * @param i param + */ + public void add(float f, int i){} + + /** + * @param d param + * @param b param + */ + public void add(double d, byte b){} + + /** * @param d param * @return Double */ public Double add(Double d) {return (double) 22/7;} /** - * @param f param - * @return Float - */ - public Float add(float f) {return (float) 22/7;} - - /** * @param d1 param * @param d2 param * @return double @@ -69,4 +74,21 @@ * @return double */ public double add(double d1, Double d2) {return d1 + d2;} + + /** + * @param f param + * @return Float + */ + public Float add(float f) {return (float) 22/7;} + + /** + * @param i param + */ + public void add(int i){} + + /** + * @param i param + * @return double + */ + public int add(Integer i) {return 0;} } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testOrdering/pkg1/ZZTop.java --- a/langtools/test/com/sun/javadoc/testOrdering/pkg1/ZZTop.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testOrdering/pkg1/ZZTop.java Fri May 16 02:13:12 2014 -0700 @@ -26,18 +26,11 @@ * For index testing only */ public class ZZTop { - // This is the exact order we expect to see /** - * @param i param + * just an empty param method. */ - public void add(int i){} - - /** - * @param i param - * @return double - */ - public int add(Integer i) {return 0;} + public void add(){} /** * @param d param @@ -45,17 +38,30 @@ public void add(double d){} /** + * @param i param + * @param f param + */ + public void add(int i, float f){} + + /** + * @param f param + * @param i param + */ + public void add(float f, int i){} + + /** + * @param d param + * @param b param + */ + public void add(double d, byte b){} + + /** * @param d param * @return Double */ public Double add(Double d) {return (double) 22/7;} /** - * @param f param - * @return Float - */ - public Float add(float f) {return (float) 22/7;} - /** * @param d1 param * @param d2 param * @return double @@ -68,4 +74,21 @@ * @return double */ public double add(double d1, Double d2) {return d1 + d2;} + + /** + * @param f param + * @return Float + */ + public Float add(float f) {return (float) 22/7;} + + /** + * @param i param + */ + public void add(int i){} + + /** + * @param i param + * @return double + */ + public int add(Integer i) {return 0;} } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testOverridenMethods/TestMultiInheritence.java --- a/langtools/test/com/sun/javadoc/testOverridenMethods/TestMultiInheritence.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testOverridenMethods/TestMultiInheritence.java Fri May 16 02:13:12 2014 -0700 @@ -27,59 +27,54 @@ * @summary Make sure that all inherited methods from multiple extended * interfaces are documented * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestMultiInheritence * @run main TestMultiInheritence */ +// TODO: should be TestMultiInheritance public class TestMultiInheritence extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg3" - }; + public static void main(String... args) throws Exception { + TestMultiInheritence tester = new TestMultiInheritence(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg3"); + checkExit(Exit.OK); + + // Method foo() is inherited from BOTH I2 and I3 - //Method foo() is inherited from BOTH I2 and I3 - private static final String[][] TEST = { - { "pkg3/I1.html", - "Methods inherited from interface pkg3." + - "" + - "I2"}, - { "pkg3/I1.html", - "Methods inherited from interface pkg3." + - "" + - "I3"}, - { "pkg3/I0.html", - "Methods inherited from interface pkg3." + - "" + - "I2"}, - { "pkg3/I0.html", - "Methods inherited from interface pkg3." + - "" + - "I3"}, - }; + checkOutput("pkg3/I1.html", true, + "Methods inherited from interface pkg3." + + "" + + "I2", + "Methods inherited from interface pkg3." + + "" + + "I3"); - //Method foo() is NOT inherited from I4 because it is overriden by - //I3. - private static final String[][] NEGATED_TEST = { - { "pkg3/I1.html", - "Methods inherited from interface pkg3." + - "" + - "I4"}, - { "pkg3/I0.html", - "Methods inherited from interface pkg3." + - "" + - "I4"}, - }; + checkOutput("pkg3/I0.html", true, + "Methods inherited from interface pkg3." + + "" + + "I2", + "Methods inherited from interface pkg3." + + "" + + "I3"); + + // Method foo() is NOT inherited from I4 because it is overriden by I3. - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestMultiInheritence tester = new TestMultiInheritence(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + checkOutput("pkg3/I1.html", false, + "Methods inherited from interface pkg3." + + "" + + "I4"); + + checkOutput("pkg3/I0.html", false, + "Methods inherited from interface pkg3." + + "" + + "I4"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenMethodDocCopy.java --- a/langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenMethodDocCopy.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenMethodDocCopy.java Fri May 16 02:13:12 2014 -0700 @@ -27,35 +27,32 @@ * @summary Inherited comment should link directly to member, not just * class * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestOverridenMethodDocCopy * @run main TestOverridenMethodDocCopy */ public class TestOverridenMethodDocCopy extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg1", "pkg2" - }; - - //Input for string search tests. - private static final String[][] TEST = { - { "pkg1/SubClass.html", - "Description copied from class: " + - "" + - "BaseClass" - } - }; - /** * The entry point of the test. * @param args the array of command line arguments. */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestOverridenMethodDocCopy tester = new TestOverridenMethodDocCopy(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg1", "pkg2"); + checkExit(Exit.OK); + + checkOutput("pkg1/SubClass.html", true, + "Description copied from class: " + + "" + + "BaseClass"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethods.java --- a/langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethods.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethods.java Fri May 16 02:13:12 2014 -0700 @@ -27,61 +27,50 @@ * @summary Determine if overriden methods are properly documented when * -protected (default) visibility flag is used. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestOverridenPrivateMethods * @run main TestOverridenPrivateMethods */ public class TestOverridenPrivateMethods extends JavadocTester { - private static final String[][] TEST = { - //The public method should be overriden - { "pkg1/SubClass.html", - "
        Overrides:
        \n" + - "
        Overrides:\n" + - "
        Overrides:\n" + - "
        Overrides:\n" + + "
        Overrides:\n" + - "
        Overrides:\n" + - "
        Overrides:\n" + + "
        Overrides:\n" + + "
        Overrides:\n" + + "
        Overrides:\n" + + "
        Overrides:\n" + - "
        " + - "publicMethod in class " + - "BaseClass
        "}, + public static void main(String... args) throws Exception { + TestOverridenPrivateMethodsWithPackageFlag tester = new TestOverridenPrivateMethodsWithPackageFlag(); + tester.runTests(); + } - //The public method in different package should be overriden - { "pkg2/SubClass.html", - "
        Overrides:
        \n" + - "
        " + - "publicMethod in class " + - "BaseClass
        "}, + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-package", + "pkg1", "pkg2"); + checkExit(Exit.OK); - //The package private method should be overriden since the base and sub class are in the same - //package. - { "pkg1/SubClass.html", - "
        Overrides:
        \n" + - "
        " + - "packagePrivateMethod in class " + - "BaseClass
        "} - }; - - private static final String[][] NEGATED_TEST = { + // The public method should be overridden + checkOutput("pkg1/SubClass.html", true, + "
        Overrides:
        \n" + + "
        " + + "publicMethod in class " + + "BaseClass
        "); - //The private method in should not be overriden - { "pkg1/SubClass.html", - "
        Overrides:
        \n" + - "
        "}, + // The public method in different package should be overridden + checkOutput("pkg2/SubClass.html", true, + "
        Overrides:
        \n" + + "
        " + + "publicMethod in class " + + "BaseClass
        "); - //The private method in different package should not be overriden - { "pkg2/SubClass.html", - "
        Overrides:
        \n" + - "
        "}, + // The package private method should be overridden since the base and sub class are in the same + // package. + checkOutput("pkg1/SubClass.html", true, + "
        Overrides:
        \n" + + "
        " + + "packagePrivateMethod in class " + + "BaseClass
        "); - //The package private method should not be overriden since the base and sub class are in - //different packages. - { "pkg2/SubClass.html", - "
        Overrides:
        \n" + - "
        "}, - }; + // The private method in should not be overridden + checkOutput("pkg1/SubClass.html", false, + "
        Overrides:
        \n" + + "
        "); - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-package", "pkg1", "pkg2"}; + // The private method in different package should not be overridden + checkOutput("pkg2/SubClass.html", false, + "
        Overrides:
        \n" + + "
        "); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestOverridenPrivateMethodsWithPackageFlag tester = new TestOverridenPrivateMethodsWithPackageFlag(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + // The package private method should not be overridden since the base and sub class are in + // different packages. + checkOutput("pkg2/SubClass.html", false, + "
        Overrides:
        \n" + + "
        "); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethodsWithPrivateFlag.java --- a/langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethodsWithPrivateFlag.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethodsWithPrivateFlag.java Fri May 16 02:13:12 2014 -0700 @@ -24,67 +24,59 @@ /* * @test * @bug 4634891 8026567 - * @summary Determine if overriden methods are properly documented when + * @summary Determine if overridden methods are properly documented when * -protected (default) visibility flag is used. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestOverridenPrivateMethodsWithPrivateFlag * @run main TestOverridenPrivateMethodsWithPrivateFlag */ public class TestOverridenPrivateMethodsWithPrivateFlag extends JavadocTester { - private static final String[][] TEST = { - //The public method should be overriden - { "pkg1/SubClass.html", - "
        Overrides:
        \n" + - "
        Overrides:\n" + - "
        Overrides:\n" + - "
        Overrides:\n" + - "
        Overrides:\n" + - "
        Overrides:\n" + - "
        Overrides:\n" + + "
        Overrides:\n" + + "
        Overrides:\n" + + "
        Deprecated.\n" + "
        This package is Deprecated." + "
        " - }, - { "deprecated-list.html", + ); + + checkOutput("deprecated-list.html", true, "
      • Deprecated Packages
      • " - } - }; - private static final String[][] NEGATED_TEST2 = { - { "overview-summary.html", "pkg1"}, - { "allclasses-frame.html", "FooDepr"} - }; + ); + } - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestPackageDeprecation tester = new TestPackageDeprecation(); - tester.run(ARGS1, TEST1, NO_TEST); - tester.run(ARGS2, NO_TEST, NEGATED_TEST2); - if ((new java.io.File(OUTPUT_DIR + "-2/pkg1/" + - "package-summary.html")).exists()) { - throw new Error("Test Fails: packages summary should not be" + - "generated for deprecated package."); - } else { - System.out.println("Test passes: package-summary.html not found."); - } - if ((new java.io.File(OUTPUT_DIR + "-2/FooDepr.html")).exists()) { - throw new Error("Test Fails: FooDepr should not be" + - "generated as it is deprecated."); - } else { - System.out.println("Test passes: FooDepr.html not found."); - } - tester.printSummary(); + @Test + void testNoDeprecated() { + javadoc("-d", "out-nodepr", + "-sourcepath", testSrc, + "-use", + "-nodeprecated", + "pkg", "pkg1", testSrc("C2.java"), testSrc("FooDepr.java")); + checkExit(Exit.OK); + + checkOutput("overview-summary.html", false, + "pkg1"); + checkOutput("allclasses-frame.html", false, + "FooDepr"); + + checkFiles(false, + "pkg1/package-summary.html", + "FooDepr.html"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testPackagePage/TestPackagePage.java --- a/langtools/test/com/sun/javadoc/testPackagePage/TestPackagePage.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testPackagePage/TestPackagePage.java Fri May 16 02:13:12 2014 -0700 @@ -28,69 +28,58 @@ * passed to Javadoc. Also test that the proper package links are generated * when single or multiple packages are documented. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestPackagePage * @run main TestPackagePage */ public class TestPackagePage extends JavadocTester { + public static void main(String... args) throws Exception { + TestPackagePage tester = new TestPackagePage(); + tester.runTests(); + } + + @Test + void testSinglePackage() { + javadoc("-d", "out-1", + "-sourcepath", testSrc, + testSrc("com/pkg/C.java")); + checkExit(Exit.OK); + + checkOutput("com/pkg/package-summary.html", true, + "This is a package page."); + + // With just one package, all general pages link to the single package page. + checkOutput("com/pkg/C.html", true, + "Package"); + checkOutput("com/pkg/package-tree.html", true, + "
      • Package
      • "); + checkOutput("deprecated-list.html", true, + "
      • Package
      • "); + checkOutput("index-all.html", true, + "
      • Package
      • "); + checkOutput("help-doc.html", true, + "
      • Package
      • "); + } + private static final String[][] TEST1 = { - { "com/pkg/package-summary.html", - "This is a package page." - }, - //With just one package, all general pages link to the single package page. - { "com/pkg/C.html", - "Package" - }, - { "com/pkg/package-tree.html", - "
      • Package
      • " - }, - { "deprecated-list.html", - "
      • Package
      • " - }, - { "index-all.html", - "
      • Package
      • " - }, - { "help-doc.html", - "
      • Package
      • " - }, }; - private static final String[][] TEST2 = { - //With multiple packages, there is no package link in general pages. - { "deprecated-list.html", - "
      • Package
      • " - }, - { "index-all.html", - "
      • Package
      • " - }, - { "help-doc.html", - "
      • Package
      • " - }, - }; + + @Test + void testMultiplePackages() { + javadoc("-d", "out-2", + "-sourcepath", testSrc, + "com.pkg", "pkg2"); + checkExit(Exit.OK); - private static final String[] ARGS1 = - new String[] { - "-d", OUTPUT_DIR + "-1", "-sourcepath", SRC_DIR, - SRC_DIR + "/com/pkg/C.java" - }; - - private static final String[] ARGS2 = - new String[] { - "-d", OUTPUT_DIR + "-2", "-sourcepath", SRC_DIR, - "com.pkg", "pkg2" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestPackagePage tester = new TestPackagePage(); - tester.run(ARGS1, TEST1, NO_TEST); - tester.run(ARGS2, TEST2, NO_TEST); - tester.printSummary(); + //With multiple packages, there is no package link in general pages. + checkOutput("deprecated-list.html", true, + "
      • Package
      • "); + checkOutput("index-all.html", true, + "
      • Package
      • "); + checkOutput("help-doc.html", true, + "
      • Package
      • "); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testParamTaglet/TestParamTaglet.java --- a/langtools/test/com/sun/javadoc/testParamTaglet/TestParamTaglet.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testParamTaglet/TestParamTaglet.java Fri May 16 02:13:12 2014 -0700 @@ -28,50 +28,38 @@ * match up with a real parameters. * Make sure inheritDoc cannot be used in an invalid param tag. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestParamTaglet * @run main TestParamTaglet */ public class TestParamTaglet extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg" - }; + public static void main(String... args) throws Exception { + TestParamTaglet tester = new TestParamTaglet(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.FAILED); - //Input for string search tests. - private static final String[][] TEST = { - //Regular param tags. - { "pkg/C.html", - "Parameters:\n" + - "
        param1 - testing 1 2 3.
        \n" + - "
        param2 - testing 1 2 3." - }, - //Param tags that don't match with any real parameters. - { "pkg/C.html", - "Parameters:\n" + - "
        p1 - testing 1 2 3.
        \n" + - "
        p2 - testing 1 2 3." - }, - //{@inherit} doc misuse does not cause doclet to throw exception. - // Param is printed with nothing inherited. - //XXX: in the future when Configuration is available during doc inheritence, - //print a warning for this mistake. - { "pkg/C.html", - "inheritBug -" - }, - - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestParamTaglet tester = new TestParamTaglet(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + checkOutput("pkg/C.html", true, + //Regular param tags. + "Parameters:\n" + + "
        param1 - testing 1 2 3.
        \n" + + "
        param2 - testing 1 2 3.", + //Param tags that don't match with any real parameters. + "Parameters:\n" + + "
        p1 - testing 1 2 3.
        \n" + + "
        p2 - testing 1 2 3.", + //{@inherit} doc misuse does not cause doclet to throw exception. + // Param is printed with nothing inherited. + //XXX: in the future when Configuration is available during doc inheritence, + //print a warning for this mistake. + "inheritBug -"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testPrivateClasses/TestPrivateClasses.java --- a/langtools/test/com/sun/javadoc/testPrivateClasses/TestPrivateClasses.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testPrivateClasses/TestPrivateClasses.java Fri May 16 02:13:12 2014 -0700 @@ -37,237 +37,185 @@ * Make sure when no modifier appear in the class signature, the * signature is displayed correctly without extra space at the beginning. * @author jamieh - * @library ../lib/ - * @build JavadocTester TestPrivateClasses + * @library ../lib + * @build JavadocTester * @run main TestPrivateClasses */ public class TestPrivateClasses extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS1 = new String[] { - "-d", OUTPUT_DIR + "-1", "-sourcepath", SRC_DIR, "pkg", "pkg2" - }; - private static final String[] ARGS2 = new String[] { - "-d", OUTPUT_DIR + "-2", "-sourcepath", SRC_DIR, "-private", - "pkg", "pkg2" - }; + public static void main(String... args) throws Exception { + TestPrivateClasses tester = new TestPrivateClasses(); + tester.runTests(); + } - // Test output when -private flag is not used. - private static final String[][] TEST1 = { - // Field inheritence from non-public superclass. - { "pkg/PublicChild.html", - "" + - "fieldInheritedFromParent" - }, - - // Method inheritence from non-public superclass. - { "pkg/PublicChild.html", - "" + - "methodInheritedFromParent" - }, + @Test + void testDefault() { + javadoc("-d", "out-default", + "-sourcepath", testSrc, + "pkg", "pkg2"); + checkExit(Exit.OK); - // Field inheritence from non-public superinterface. - { "pkg/PublicInterface.html", - "" + - "fieldInheritedFromInterface" - }, - - // Method inheritence from non-public superinterface. - { "pkg/PublicInterface.html", - "" + - "methodInterface" - }, - - // private class does not show up in tree - { "pkg/PublicChild.html", - "
          \n" + - "
        • java.lang.Object
        • \n" + - "
        • \n" + - "
            \n" + - "
          • pkg.PublicChild
          • \n" + - "
          \n" + - "
        • \n" + - "
        " - }, - - // Method is documented as though it is declared in the inheriting method. - { "pkg/PublicChild.html", - "
        public void methodInheritedFromParent(int p1)"
        -        },
        +        checkOutput("pkg/PublicChild.html", true,
        +                // Field inheritence from non-public superclass.
        +                ""
        +                + "fieldInheritedFromParent",
        +                // Method inheritance from non-public superclass.
        +                ""
        +                + "methodInheritedFromParent",
        +                // private class does not show up in tree
        +                "
          \n" + + "
        • java.lang.Object
        • \n" + + "
        • \n" + + "
            \n" + + "
          • pkg.PublicChild
          • \n" + + "
          \n" + + "
        • \n" + + "
        ", + // Method is documented as though it is declared in the inheriting method. + "
        public void methodInheritedFromParent(int p1)",
        +                "
        \n" + + "
        All Implemented Interfaces:
        \n" + + "
        " + + "PublicInterface
        \n" + + "
        "); - //Make sure implemented interfaces from private superclass are inherited - { "pkg/PublicInterface.html", - "
        \n" + - "
        All Known Implementing Classes:
        \n" + - "
        " + - "PublicChild
        \n" + - "
        "}, - - { "pkg/PublicChild.html", - "
        \n" + - "
        All Implemented Interfaces:
        \n" + - "
        " + - "PublicInterface
        \n" + - "
        "}, + checkOutput("pkg/PublicChild.html", false, + // Should not document that a method overrides method from private class. + "Overrides:", + // Should not document that a method specified by private interface. + "Specified by:", + // Should not mention that any documentation was copied. + "Description copied from", + // Don't extend private classes or interfaces + "PrivateParent", + "PrivateInterface"); - //Generic interface method test. - { "pkg2/C.html", - "This comment should get copied to the implementing class"}, - }; - private static final String[][] NEGATED_TEST1 = { - // Should not document that a method overrides method from private class. - { "pkg/PublicChild.html", - "Overrides:"}, - // Should not document that a method specified by private interface. - { "pkg/PublicChild.html", - "Specified by:"}, - { "pkg/PublicInterface.html", - "Specified by:"}, - // Should not mention that any documentation was copied. - { "pkg/PublicChild.html", - "Description copied from"}, - { "pkg/PublicInterface.html", - "Description copied from"}, - // Don't extend private classes or interfaces - { "pkg/PublicChild.html", - "PrivateParent"}, - { "pkg/PublicInterface.html", - "PrivateInterface"}, - { "pkg/PublicChild.html", - "PrivateInterface"}, - { "pkg/PublicInterface.html", - "All Superinterfaces"}, - // Make inherited constant are documented correctly. - { "constant-values.html", - "PrivateInterface"}, + checkOutput("pkg/PublicInterface.html", true, + // Field inheritance from non-public superinterface. + "" + + "fieldInheritedFromInterface", + // Method inheritance from non-public superinterface. + "" + + "methodInterface", + //Make sure implemented interfaces from private superclass are inherited + "
        \n" + + "
        All Known Implementing Classes:
        \n" + + "
        " + + "PublicChild
        \n" + + "
        "); - //Do not inherit private interface method with generic parameters. - //This method has been implemented. - { "pkg2/C.html", - "hello"}, - }; + checkOutput("pkg/PublicInterface.html", false, + "Specified by:", + "Description copied from", + "PrivateInterface", + "All Superinterfaces"); + + checkOutput("pkg2/C.html", true, + //Generic interface method test. + "This comment should get copied to the implementing class"); + + checkOutput("pkg2/C.html", false, + //Do not inherit private interface method with generic parameters. + //This method has been implemented. + "hello"); + + checkOutput("constant-values.html", false, + // Make inherited constant are documented correctly. + "PrivateInterface"); + } - // Test output when -private flag is used. - private static final String[][] TEST2 = { - // Field inheritence from non-public superclass. - { "pkg/PublicChild.html", - "Fields inherited from class pkg." + - "" + - "PrivateParent" - }, - { "pkg/PublicChild.html", - "" + - "fieldInheritedFromParent" - }, - // Field inheritence from non-public superinterface. - { "pkg/PublicInterface.html", - "Fields inherited from interface pkg." + - "" + - "PrivateInterface" - }, - { "pkg/PublicInterface.html", - "" + - "fieldInheritedFromInterface" - }, - // Method inheritence from non-public superclass. - { "pkg/PublicChild.html", - "Methods inherited from class pkg." + - "" + - "PrivateParent" - }, - { "pkg/PublicChild.html", - "" + - "methodInheritedFromParent" - }, - // Should document that a method overrides method from private class. - { "pkg/PublicChild.html", - "
        Overrides:
        \n" + - "
        " + - "methodOverridenFromParent in class " + - "" + - "PrivateParent
        "}, - // Should document that a method is specified by private interface. - { "pkg/PublicChild.html", - "
        Specified by:
        \n" + - "
        " + - "methodInterface in interface " + - "" + - "PrivateInterface
        "}, - // Method inheritence from non-public superinterface. - { "pkg/PublicInterface.html", - "Methods inherited from interface pkg." + - "" + - "PrivateInterface" - }, - { "pkg/PrivateInterface.html", - "" + - "methodInterface" - }, - // Should mention that any documentation was copied. - { "pkg/PublicChild.html", - "Description copied from"}, - // Extend documented private classes or interfaces - { "pkg/PublicChild.html", - "extends"}, - { "pkg/PublicInterface.html", - "extends"}, - { "pkg/PublicInterface.html", - "All Superinterfaces"}, + @Test + void testPrivate() { + javadoc("-d", "out-private", + "-sourcepath", testSrc, + "-private", + "pkg", "pkg2"); + checkExit(Exit.OK); + + checkOutput("pkg/PublicChild.html", true, + // Field inheritence from non-public superclass. + "Fields inherited from class pkg." + + "" + + "PrivateParent", + "" + + "fieldInheritedFromParent", + // Method inheritence from non-public superclass. + "Methods inherited from class pkg." + + "" + + "PrivateParent", + "" + + "methodInheritedFromParent", + // Should document that a method overrides method from private class. + "
        Overrides:
        \n" + + "
        " + + "methodOverridenFromParent in class " + + "" + + "PrivateParent
        ", + // Should document that a method is specified by private interface. + "
        Specified by:
        \n" + + "
        " + + "methodInterface in interface " + + "" + + "PrivateInterface
        ", + // Should mention that any documentation was copied. + "Description copied from", + // Extend documented private classes or interfaces + "extends", + "
        \n" + + "
        All Implemented Interfaces:
        \n" + + "
        " + + "PrivateInterface, " + + "" + + "PublicInterface
        \n" + + "
        ", + "
        public class PublicChild");
         
        -      //Make sure implemented interfaces from private superclass are inherited
        -      { "pkg/PublicInterface.html",
        -        "
        \n" + - "
        All Known Implementing Classes:
        \n" + - "
        " + - "PrivateParent, " + - "PublicChild" + - "
        \n" + - "
        "}, - - { "pkg/PublicChild.html", - "
        \n" + - "
        All Implemented Interfaces:
        \n" + - "
        " + - "PrivateInterface, " + - "" + - "PublicInterface
        \n" + - "
        "}, - - //Since private flag is used, we can document that private interface method - //with generic parameters has been implemented. - { "pkg2/C.html", - "Description copied from interface: " + - "I"}, + checkOutput("pkg/PublicInterface.html", true, + // Field inheritence from non-public superinterface. + "Fields inherited from interface pkg." + + "" + + "PrivateInterface", + "" + + "fieldInheritedFromInterface", + // Method inheritance from non-public superinterface. + "Methods inherited from interface pkg." + + "" + + "PrivateInterface", + // Extend documented private classes or interfaces + "extends", + "All Superinterfaces", + //Make sure implemented interfaces from private superclass are inherited + "
        \n" + + "
        All Known Implementing Classes:
        \n" + + "
        " + + "PrivateParent, " + + "PublicChild" + + "
        \n" + + "
        "); - { "pkg2/C.html", - "
        Specified by:
        \n" + - "
        hello" + - " in interface " + - "I" + - "<java.lang.String>
        "}, - - //Make sure when no modifier appear in the class signature, the - //signature is displayed correctly without extra space at the beginning. - { "pkg/PrivateParent.html", - "
        class PrivateParent"},
        +        checkOutput("pkg/PrivateInterface.html", true,
        +                ""
        +                + "methodInterface"
        +        );
         
        -      { "pkg/PublicChild.html",
        -            "
        public class PublicChild"},
        -    };
        -    private static final String[][] NEGATED_TEST2 = {
        -        { "pkg/PrivateParent.html",
        -            "
         class PrivateParent"},
        -    };
        +        checkOutput("pkg2/C.html", true,
        +                //Since private flag is used, we can document that private interface method
        +                //with generic parameters has been implemented.
        +                "Description copied from interface: "
        +                + "I",
        +                "
        Specified by:
        \n" + + "
        hello" + + " in interface " + + "I" + + "<java.lang.String>
        "); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestPrivateClasses tester = new TestPrivateClasses(); - tester.run(ARGS1, TEST1, NEGATED_TEST1); - tester.run(ARGS2, TEST2, NEGATED_TEST2); - tester.printSummary(); + checkOutput("pkg/PrivateParent.html", true, + //Make sure when no modifier appear in the class signature, the + //signature is displayed correctly without extra space at the beginning. + "
        class PrivateParent");
        +
        +        checkOutput("pkg/PrivateParent.html", false,
        +                "
         class PrivateParent");
             }
         }
        diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testProfiles/TestProfiles.java
        --- a/langtools/test/com/sun/javadoc/testProfiles/TestProfiles.java	Thu May 15 11:35:26 2014 -0700
        +++ b/langtools/test/com/sun/javadoc/testProfiles/TestProfiles.java	Fri May 16 02:13:12 2014 -0700
        @@ -26,194 +26,174 @@
          * @bug      8006124 8009684 8016921 8023700 8024096 8008164 8026567 8026770
          * @summary  Test javadoc support for profiles.
          * @author   Bhavesh Patel, Evgeniya Stepanova
        - * @library  ../lib/
        - * @build    JavadocTester TestProfiles
        + * @library ../lib
        + * @build    JavadocTester
          * @run main TestProfiles
          */
         public class TestProfiles extends JavadocTester {
         
        -    //Test information.
        -    private static final String PROFILE_OUTPUT_DIR = OUTPUT_DIR + "-1";
        -    private static final String PACKAGE_OUTPUT_DIR = OUTPUT_DIR + "-2";
        -    //Javadoc arguments.
        -    private static final String[] ARGS1 = new String[]{
        -        "-d", PROFILE_OUTPUT_DIR, "-sourcepath", SRC_DIR, "-Xprofilespath",
        -         SRC_DIR + "/profile-rtjar-includes.txt", "pkg1", "pkg2",
        -         "pkg3", "pkg4", "pkg5", "pkgDeprecated"
        -    };
        -    private static final String[] ARGS2 = new String[]{
        -        "-d", PACKAGE_OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg1", "pkg2",
        -        "pkg3", "pkg4", "pkg5"
        -    };
        -    //Input for string tests for profiles.
        -    private static final String[][] PROFILES_TEST = {
        +    public static void main(String... args) throws Exception {
        +        TestProfiles tester = new TestProfiles();
        +        tester.runTests();
        +    }
        +
        +    @Test
        +    void testProfiles() {
        +        javadoc("-d", "out-profiles",
        +                "-sourcepath", testSrc,
        +                "-Xprofilespath", testSrc("profile-rtjar-includes.txt"),
        +                "pkg1", "pkg2", "pkg3", "pkg4", "pkg5", "pkgDeprecated");
        +        checkExit(Exit.OK);
        +
                 // Tests for profile-overview-frame.html listing all profiles.
        -        { "profile-overview-frame.html",
        -            "All Packages"
        -        },
        -        { "profile-overview-frame.html",
        -            "
      • " - + "compact1
      • " - }, + checkOutput("profile-overview-frame.html", true, + "All Packages", + "
      • " + + "compact1
      • "); + // Tests for profileName-frame.html listing all packages in a profile. - { "compact2-frame.html", - "" - + "All PackagesAll Profiles" - }, - { "compact2-frame.html", - "
      • pkg4
      • " - }, + checkOutput("compact2-frame.html", true, + "" + + "All PackagesAll Profiles", + "
      • pkg4
      • "); + // Test for profileName-package-frame.html listing all types in a // package of a profile. - { "pkg2/compact2-package-frame.html", - "" - + "compact2 - pkg2" - }, + checkOutput("pkg2/compact2-package-frame.html", true, + "" + + "compact2 - pkg2"); + // Tests for profileName-summary.html listing the summary for a profile. - { "compact2-summary.html", - "
      • Prev Profile
      • \n" - + "
      • Next Profile
      • " - }, - { "compact2-summary.html", - "

        Profile compact2

        " - }, - { "compact2-summary.html", - "

        pkg2

        " - }, - { "compact2-summary.html", - "
          \n" + - "
        • \n" - + "

          " - + "pkg2

          \n" + - "" - }, - { "compact2-summary.html", - "
          " - }, + checkOutput("compact2-summary.html", true, + "
        • Prev Profile
        • \n" + + "
        • Next Profile
        • ", + "

          Profile compact2

          ", + "

          pkg2

          ", + "
          ", + "
          "); + + // Tests for profileName-package-summary.html listing the summary for a // package in a profile. - { "pkg5/compact3-package-summary.html", - "
        • Prev Package" - + "
        • " - }, - { "pkg5/compact3-package-summary.html", - "
          compact3
          " - }, - { "pkg5/compact3-package-summary.html", - "
            \n" + - "
          • \n" - + "
          " - }, - //Test for "overview-frame.html" showing the "All Profiles" link. - { "overview-frame.html", - "All Profiles" - }, - //Test for "className.html" showing the profile information for the type. - { "pkg2/Class1Pkg2.html", - "
          compact1, compact2, compact3
          " - }, - { "index.html", - "" - }, - //Test for "overview-summary.html" showing the profile list. - { "overview-summary.html", - "" - }, - //Test deprecated class in profiles - { "compact1-summary.html", - "\n" - + "
          Class1Pkg2Deprecated" - }, - { "deprecated-list.html", - "pkg2.Class1Pkg2\n" - +"
          Class1Pkg2. This class is deprecated
          " - }, + checkOutput("pkg5/compact3-package-summary.html", true, + "
        • Prev Package" + + "
        • ", + "
          compact3
          ", + "
            \n" + + "
          • \n" + + ""); + + // Test for "overview-frame.html" showing the "All Profiles" link. + checkOutput("overview-frame.html", true, + "All Profiles"); + + // Test for "className.html" showing the profile information for the type. + checkOutput("pkg2/Class1Pkg2.html", true, + "
            compact1, compact2, compact3
            "); + + checkOutput("index.html", true, + ""); + + // Test for "overview-summary.html" showing the profile list. + checkOutput("overview-summary.html", true, + ""); + + // Test deprecated class in profiles + checkOutput("compact1-summary.html", true, + "\n" + + "
            Class1Pkg2Deprecated"); + + checkOutput("deprecated-list.html", true, + "pkg2.Class1Pkg2\n" + + "
            Class1Pkg2. This class is deprecated
            "); + //Test deprecated package in profile - { "deprecated-list.html", - "
            pkgDeprecated\n" - +"
            This package is Deprecated." - + " Use pkg1.
            " - }, - { "pkgDeprecated/package-summary.html", - "
            Deprecated.\n" - + "
            This package is Deprecated." - + " Use pkg1.
            " - }, - // need to add teststring when JDK-8015496 will be fixed - //Test exception in profiles - { "compact1-summary.html", - "\n" - + "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" - + "" - }, + checkOutput("deprecated-list.html", true, + "
            Exception Summary" - + " 
            Exception" - + "Description
            ClassExceptionpkgDeprecated\n" + + "
            This package is Deprecated." + + " Use pkg1.
            "); + + checkOutput("pkgDeprecated/package-summary.html", true, + "
            Deprecated.\n" + + "
            This package is Deprecated." + + " Use pkg1.
            "); + + // TODO: need to add teststring when JDK-8015496 will be fixed + // Test exception in profiles + checkOutput("compact1-summary.html", true, + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + ""); + //Test errors in profiles - { "compact1-summary.html", - "
            Exception Summary" + + " 
            Exception" + + "Description
            ClassException
            \n" - + "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" - + "\n" + - "" - } - }; - private static final String[][] PROFILES_NEGATED_TEST = { - { "pkg3/Class2Pkg3.html", - "
            compact1" - }, - { "pkg3/Interface1Pkg3.html", - "
            compact1" - }, - { "pkg4/compact2-package-frame.html", + checkOutput("compact1-summary.html", true, + "
            Error Summary " - + "
            ErrorDescription
            " - + "ClassError
            \n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + ""); + + // negative tests + checkOutput("pkg3/Class2Pkg3.html", false, + "
            compact1"); + + checkOutput("pkg3/Interface1Pkg3.html", false, + "
            compact1"); + + checkOutput("pkg4/compact2-package-frame.html", false, "
          • Anno1Pkg4
          • " - }, - { "compact1-summary.html","
          • Use
          • " - }, - { "compact2-summary.html", + + "target=\"classFrame\">Anno1Pkg4"); + + checkOutput("compact1-summary.html", false, + "
          • Use
          • "); + + checkOutput("compact2-summary.html", false, "
            Error Summary " + + "
            ErrorDescription
            " + + "ClassError
            " - }, - { "pkg5/compact3-package-summary.html", + + "listing classes, and an explanation\">"); + + checkOutput("pkg5/compact3-package-summary.html", false, "
              \n" + "
            • \n" + "
            • \n" + "
            " - } - }; - private static final String[][] PACKAGES_TEST = { - { "overview-frame.html", - "

            Packages

            " - }, - { "pkg4/package-frame.html", - "

            pkg4

            " - }, - { "pkg4/package-summary.html", - "
            \n" + - "

            Package pkg4

            \n" + - "
            " - } - }; - private static final String[][] PACKAGES_NEGATED_TEST = { - { "overview-frame.html", - "All Profiles" - }, - { "pkg2/Class1Pkg2.html", - "
            compact1, compact2, compact3
            " - }, - { "overview-summary.html", - "" - } - }; - private static final String[] PACKAGES_NEGATED_FILE_TEST = { - "profile-overview-frame.html", - "compact2-frame.html", - "pkg2/compact2-package-frame.html", - "compact2-summary.html", - "pkg5/compact3-package-summary.html" - }; + + "interfaces, and an explanation\">"); + } + + @Test + void testPackages() { + javadoc("-d", "out-packages", + "-sourcepath", testSrc, + "pkg1", "pkg2", "pkg3", "pkg4", "pkg5"); + checkExit(Exit.OK); + + checkOutput("overview-frame.html", true, + "

            Packages

            "); + + checkOutput("pkg4/package-frame.html", true, + "

            pkg4

            "); + + checkOutput("pkg4/package-summary.html", true, + "
            \n" + + "

            Package pkg4

            \n" + + "
            "); - /** - * The entry point of the test. - * - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestProfiles tester = new TestProfiles(); - tester.run(ARGS1, PROFILES_TEST, PROFILES_NEGATED_TEST); - tester.run(ARGS2, PACKAGES_TEST, PACKAGES_NEGATED_TEST, NO_FILE_TEST, PACKAGES_NEGATED_FILE_TEST); - tester.printSummary(); + checkOutput("overview-frame.html", false, + "All Profiles"); + + checkOutput("pkg2/Class1Pkg2.html", false, + "
            compact1, compact2, compact3
            "); + + checkOutput("overview-summary.html", false, + ""); + + checkFiles(false, + "profile-overview-frame.html", + "compact2-frame.html", + "pkg2/compact2-package-frame.html", + "compact2-summary.html", + "pkg5/compact3-package-summary.html"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testProfiles/TestProfilesConfiguration.java --- a/langtools/test/com/sun/javadoc/testProfiles/TestProfilesConfiguration.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testProfiles/TestProfilesConfiguration.java Fri May 16 02:13:12 2014 -0700 @@ -26,97 +26,98 @@ * @bug 8006124 8009684 8015663 8015496 8026567 * @summary Test javadoc options support for profiles. * @author Evgeniya Stepanova - * @library ../lib/ - * @build JavadocTester TestProfilesConfiguration + * @library ../lib + * @build JavadocTester * @run main TestProfilesConfiguration */ public class TestProfilesConfiguration extends JavadocTester { - //Test information. - private static final String PROFILE_CONFIGURATION_OUTPUT_DIR = OUTPUT_DIR + "-3"; - private static final String NODEPR_NOPKGS_OUTPUT_DIR = OUTPUT_DIR + "-4"; - //Javadoc arguments. - private static final String[] ARGS3 = new String[]{ - "-d", PROFILE_CONFIGURATION_OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-nocomment", "-keywords", "-Xprofilespath", SRC_DIR + - "/profile-rtjar-includes.txt", "-doctitle", "Simple doctitle", - "-use", "pkg3", "pkg1", "pkg2", "pkg4", - "pkg5", "-packagesheader", "Simple packages header","pkgDeprecated" - }; - private static final String[] ARGS4 = new String[]{ - "-d", NODEPR_NOPKGS_OUTPUT_DIR, "-sourcepath", SRC_DIR, "-nocomment", - "-nodeprecated", "-keywords", "-Xprofilespath", SRC_DIR + - "/profile-rtjar-includes-nopkgs.txt", "-doctitle", "Simple doctitle", - "-use", "-packagesheader", "Simple packages header", - "pkg1", "pkg2", "pkg3", "pkg4", "pkg5", "pkgDeprecated" - }; - private static final String[][] NODEPR_NOPKGS_TEST = { - { "overview-summary.html", - "" - }, - { "profile-overview-frame.html", - "" - } - }; - private static final String[][] NODEPR_NOPKGS_NEGATED_TEST = { - { "overview-summary.html", - "compact1" - } - }; + public static void main(String... args) throws Exception { + TestProfilesConfiguration tester = new TestProfilesConfiguration(); + tester.runTests(); +// tester.run(ARGS3, PROFILES_CONFIGURATION_TEST, PROFILES_CONFIGURATION_NEGATED_TEST); +// tester.run(ARGS4, NODEPR_NOPKGS_TEST, NODEPR_NOPKGS_NEGATED_TEST); +// tester.printSummary(); + } + + @Test + void testProfiles() { + javadoc("-d", "out-profiles", + "-sourcepath", testSrc, + "-nocomment", + "-keywords", + "-Xprofilespath", testSrc("profile-rtjar-includes.txt"), + "-doctitle", "Simple doctitle", + "-use", + "-packagesheader", "Simple packages header", + "pkg3", "pkg1", "pkg2", "pkg4", "pkg5", "pkgDeprecated"); + checkExit(Exit.OK); + + checkOutput("compact1-summary.html", true, + //-use option test string fo profile view page + "
          • Use
          • ", + // -keywords option test string for profiles + "", + // Deprecated information on a package + "

            pkgDeprecated

            \n" + + "
            " + + "Deprecated.
            " + ); + + //-nocomments option test string + checkOutput("compact1-summary.html", false, + "
            Class1Pkg2.
            " + ); + + // -doctitle option test string + checkOutput("overview-summary.html", true, + "
            \n" + + "

            Simple doctitle

            " + ); - private static final String[][] PROFILES_CONFIGURATION_TEST = { - //-use option test string fo profile view page - { "compact1-summary.html","
          • Use
          • " - }, - //-doctitle option test string - { "overview-summary.html", - "
            \n" + - "

            Simple doctitle

            " - }, - //-packagesheader option test string fo profiles - { "profile-overview-frame.html", - "

            Simple packages header

            " - }, - //-keywords option test string for profiles - { "compact1-summary.html", - "" - }, - //Deprecated information on a package - { "compact1-summary.html", - "

            pkgDeprecated

            \n" + - "
            " + - "Deprecated.
            " - } - }; - private static final String[][] PROFILES_CONFIGURATION_NEGATED_TEST = { - //-nocomments option test string - { "compact1-summary.html", - "
            Class1Pkg2.
            " - } - }; + // -packagesheader option test string fo profiles + checkOutput("profile-overview-frame.html", true, + "

            Simple packages header

            " + ); + } + + + @Test + void testNoDeprNoPackages() { + javadoc("-d", "out-noDeprNoPackages", + "-sourcepath", testSrc, + "-nocomment", + "-nodeprecated", + "-keywords", + "-Xprofilespath", testSrc("profile-rtjar-includes-nopkgs.txt"), + "-doctitle", "Simple doctitle", + "-use", + "-packagesheader", "Simple packages header", + "pkg1", "pkg2", "pkg3", "pkg4", "pkg5", "pkgDeprecated"); + checkExit(Exit.OK); - /** - * The entry point of the test. - * - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestProfilesConfiguration tester = new TestProfilesConfiguration(); - tester.run(ARGS3, PROFILES_CONFIGURATION_TEST, - PROFILES_CONFIGURATION_NEGATED_TEST); - tester.run(ARGS4, NODEPR_NOPKGS_TEST, - NODEPR_NOPKGS_NEGATED_TEST); - tester.printSummary(); + checkOutput("overview-summary.html", true, + "" + ); + + checkOutput("profile-overview-frame.html", true, + "" + ); + + checkOutput("overview-summary.html", false, + "compact1" + ); + } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testRecurseSubPackages/TestRecurseSubPackages.java --- a/langtools/test/com/sun/javadoc/testRecurseSubPackages/TestRecurseSubPackages.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testRecurseSubPackages/TestRecurseSubPackages.java Fri May 16 02:13:12 2014 -0700 @@ -26,35 +26,33 @@ * @bug 4074234 * @summary Make Javadoc capable of traversing/recursing all of given subpackages. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestRecurseSubPackages * @run main TestRecurseSubPackages */ public class TestRecurseSubPackages extends JavadocTester { - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-subpackages", "pkg1", "-exclude", "pkg1.pkg2.packageToExclude" - }; + public static void main(String... args) throws Exception { + TestRecurseSubPackages tester = new TestRecurseSubPackages(); + tester.runTests(); + } - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - String[][] tests = new String[6][2]; - for (int i = 0; i < tests.length; i++) { - tests[i][0] = "allclasses-frame.html"; - tests[i][1] = "C" + (i+1) + ".html"; + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-subpackages", "pkg1", + "-exclude", "pkg1.pkg2.packageToExclude"); + checkExit(Exit.OK); + + for (int i = 1; i <= 6; i++) { + checkOutput("allclasses-frame.html", true, + "C" + i + ".html"); } - String[][] negatedTests = new String[][] { - { "allclasses-frame.html", "DummyClass.html"} - }; - TestRecurseSubPackages tester = new TestRecurseSubPackages(); - tester.run(ARGS, tests, negatedTests); - tester.printSummary(); + + checkOutput("allclasses-frame.html", false, + "DummyClass.html"); } + } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testRelativeLinks/TestRelativeLinks.java --- a/langtools/test/com/sun/javadoc/testRelativeLinks/TestRelativeLinks.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testRelativeLinks/TestRelativeLinks.java Fri May 16 02:13:12 2014 -0700 @@ -27,81 +27,64 @@ * @summary Test to make sure that relative paths are redirected in the * output so that they are not broken. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestRelativeLinks * @run main TestRelativeLinks */ public class TestRelativeLinks extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-use", "-sourcepath", SRC_DIR, "pkg", "pkg2" - }; + public static void main(String... args) throws Exception { + TestRelativeLinks tester = new TestRelativeLinks(); + tester.runTests(); + } - //Input for string search tests. - private static final String[][] TEST = { - //These relative paths should stay relative because they appear - //in the right places. - { "pkg/C.html", - "relative class link"}, - { "pkg/C.html", - "relative field link"}, - { "pkg/C.html", - "relative method link"}, - { "pkg/package-summary.html", - "relative package link"}, - { "pkg/C.html", + @Test + void test() { + javadoc("-d", "out", + "-use", + "-sourcepath", testSrc, + "pkg", "pkg2"); + checkExit(Exit.OK); + + // These relative paths should stay relative because they appear + // in the right places. + checkOutput("pkg/C.html", true, + "relative class link", + "relative field link", + "relative method link", " relative-multi-line-link."}, - - //These relative paths should be redirected because they are in different - //places. + " href=\"relative-multi-line-link.html\">relative-multi-line-link."); + checkOutput("pkg/package-summary.html", true, + "relative package link"); - //INDEX PAGE - { "index-all.html", - "relative class link"}, - { "index-all.html", - "relative field link"}, - { "index-all.html", - "relative method link"}, - { "index-all.html", - "relative package link"}, - { "index-all.html", + // These relative paths should be redirected because they are in different + // places. + + // INDEX PAGE + checkOutput("index-all.html", true, + "relative class link", + "relative field link", + "relative method link", + "relative package link", " relative-multi-line-link."}, - - - //PACKAGE USE - { "pkg/package-use.html", - "relative package link."}, - { "pkg/package-use.html", - "relative class link"}, + " href=\"./pkg/relative-multi-line-link.html\">relative-multi-line-link."); - //CLASS_USE - { "pkg/class-use/C.html", - "relative field link"}, - { "pkg/class-use/C.html", - "relative method link"}, - { "pkg/class-use/C.html", - "relative package link"}, - { "pkg/class-use/C.html", - " relative-multi-line-link."}, + // PACKAGE USE + checkOutput("pkg/package-use.html", true, + "relative package link.", + "relative class link"); - //PACKAGE OVERVIEW - { "overview-summary.html", - "relative package link"}, - }; + // CLASS_USE + checkOutput("pkg/class-use/C.html", true, + "relative field link", + "relative method link", + "relative package link", + " relative-multi-line-link."); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestRelativeLinks tester = new TestRelativeLinks(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + // PACKAGE OVERVIEW + checkOutput("overview-summary.html", true, + "relative package link"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testRepeatedAnnotations/TestRepeatedAnnotations.java --- a/langtools/test/com/sun/javadoc/testRepeatedAnnotations/TestRepeatedAnnotations.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testRepeatedAnnotations/TestRepeatedAnnotations.java Fri May 16 02:13:12 2014 -0700 @@ -26,147 +26,125 @@ * @bug 8005092 * @summary Test repeated annotations output. * @author bpatel - * @library ../lib/ - * @build JavadocTester TestRepeatedAnnotations + * @library ../lib + * @build JavadocTester * @run main TestRepeatedAnnotations */ public class TestRepeatedAnnotations extends JavadocTester { - //Test information. + public static void main(String... args) throws Exception { + TestRepeatedAnnotations tester = new TestRepeatedAnnotations(); + tester.runTests(); + } - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg", "pkg1" - }; + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg", "pkg1"); + checkExit(Exit.OK); - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/C.html", - "@ContaineeSynthDoc " + - "@ContaineeSynthDoc"}, - { "pkg/C.html", - "@ContaineeRegDoc " + - "@ContaineeRegDoc"}, - { "pkg/C.html", - "@RegContainerDoc" + - "(value={" + - "@RegContaineeNotDoc," + - "@RegContaineeNotDoc})"}, - { "pkg/C.html", - "@ContaineeSynthDoc " + - "@ContaineeSynthDoc " + - "@ContaineeSynthDoc"}, - { "pkg/C.html", - "@ContainerSynthDoc(" + - "value=" + - "@ContaineeSynthDoc)"}, - { "pkg/C.html", - "@ContaineeSynthDoc " + - "@ContaineeSynthDoc"}, + checkOutput("pkg/C.html", true, + "@ContaineeSynthDoc " + + "@ContaineeSynthDoc", + "@ContaineeRegDoc " + + "@ContaineeRegDoc", + "@RegContainerDoc" + + "(value={" + + "@RegContaineeNotDoc," + + "@RegContaineeNotDoc})", + "@ContaineeSynthDoc " + + "@ContaineeSynthDoc " + + "@ContaineeSynthDoc", + "@ContainerSynthDoc(" + + "value=" + + "@ContaineeSynthDoc)", + "@ContaineeSynthDoc " + + "@ContaineeSynthDoc"); - { "pkg/D.html", - "@RegDoc" + - "(x=1)"}, - { "pkg/D.html", - "@RegArryDoc" + - "(y=1)"}, - { "pkg/D.html", - "@RegArryDoc" + - "(y={1,2})"}, - { "pkg/D.html", - "@NonSynthDocContainer" + - "(value=" + - "@RegArryDoc)"}, + checkOutput("pkg/D.html", true, + "@RegDoc" + + "(x=1)", + "@RegArryDoc" + + "(y=1)", + "@RegArryDoc" + + "(y={1,2})", + "@NonSynthDocContainer" + + "(value=" + + "@RegArryDoc)"); - { "pkg1/C.html", - "@RegContainerValDoc" + - "(value={" + - "@RegContaineeNotDoc," + - "@RegContaineeNotDoc}," + - "y=3)"}, - { "pkg1/C.html", - "@ContainerValDoc" + - "(value={" + - "@ContaineeNotDoc," + - "@ContaineeNotDoc}," + - "x=1)"} - }; - - private static final String[][] NEGATED_TEST = { - { "pkg/C.html", - "@RegContaineeDoc " + - "@RegContaineeDoc"}, - { "pkg/C.html", - "@RegContainerNotDoc" + - "(value={" + - "@RegContaineeNotDoc," + - "@RegContaineeNotDoc})"}, + checkOutput("pkg1/C.html", true, + "@RegContainerValDoc" + + "(value={" + + "@RegContaineeNotDoc," + + "@RegContaineeNotDoc}," + + "y=3)", + "@ContainerValDoc" + + "(value={" + + "@ContaineeNotDoc," + + "@ContaineeNotDoc}," + + "x=1)"); - { "pkg1/C.html", - "@ContaineeSynthDoc " + - "@ContaineeSynthDoc"}, - { "pkg1/C.html", - "@RegContainerValNotDoc" + - "(value={" + - "@RegContaineeDoc," + - "@RegContaineeDoc}," + - "y=4)"}, - { "pkg1/C.html", - "@ContainerValNotDoc" + - "(value={" + - "@ContaineeNotDoc," + - "@ContaineeNotDoc}," + - "x=2)"}, - { "pkg1/C.html", - "@ContainerSynthNotDoc(" + - "value=" + - "@ContaineeSynthDoc)"} - }; + checkOutput("pkg/C.html", false, + "@RegContaineeDoc " + + "@RegContaineeDoc", + "@RegContainerNotDoc" + + "(value={" + + "@RegContaineeNotDoc," + + "@RegContaineeNotDoc})"); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestRepeatedAnnotations tester = new TestRepeatedAnnotations(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + checkOutput("pkg1/C.html", false, + "@ContaineeSynthDoc " + + "@ContaineeSynthDoc", + "@RegContainerValNotDoc" + + "(value={" + + "@RegContaineeDoc," + + "@RegContaineeDoc}," + + "y=4)", + "@ContainerValNotDoc" + + "(value={" + + "@ContaineeNotDoc," + + "@ContaineeNotDoc}," + + "x=2)", + "@ContainerSynthNotDoc(" + + "value=" + + "@ContaineeSynthDoc)"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testReturnTag/TestReturnTag.java --- a/langtools/test/com/sun/javadoc/testReturnTag/TestReturnTag.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testReturnTag/TestReturnTag.java Fri May 16 02:13:12 2014 -0700 @@ -26,26 +26,13 @@ * @bug 4490068 * @summary Warn when a return tag is used on a method without a return type. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestReturnTag * @run main TestReturnTag */ public class TestReturnTag extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-Xdoclint:none", "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, SRC_DIR + - "/TestReturnTag.java" - }; - - //Input for string search tests. - private static final String[][] TEST = { - {WARNING_OUTPUT, - "warning - @return tag cannot be used in method with void return type."} - }; - /** * Trigger warning message when return tag is used on a void method. * @@ -53,13 +40,20 @@ */ public void method() {} - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestReturnTag tester = new TestReturnTag(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void tests() { + javadoc("-Xdoclint:none", + "-d", "out", + "-sourcepath", testSrc, + testSrc("TestReturnTag.java")); + checkExit(Exit.OK); + + checkOutput(Output.WARNING, true, + "warning - @return tag cannot be used in method with void return type."); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testSeeTag/TestSeeTag.java --- a/langtools/test/com/sun/javadoc/testSeeTag/TestSeeTag.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testSeeTag/TestSeeTag.java Fri May 16 02:13:12 2014 -0700 @@ -26,37 +26,29 @@ * @bug 8017191 * @summary Javadoc is confused by at-link to imported classes outside of the set of generated packages * @author jjg - * @library ../lib/ - * @build JavadocTester TestSeeTag + * @library ../lib + * @build JavadocTester * @run main TestSeeTag */ public class TestSeeTag extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg" - }; + public static void main(String... args) throws Exception { + TestSeeTag tester = new TestSeeTag(); + tester.runTests(); + } - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/Test.html", - "List" - } - }; - private static final String[][] NEGATED_TEST = { - { "pkg/Test.html", - "<code>List</code>" - } - }; + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestSeeTag tester = new TestSeeTag(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + checkOutput("pkg/Test.html", true, + "List"); + + checkOutput("pkg/Test.html", false, + "<code>List</code>"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testSerialVersionUID/TestSerialVersionUID.java --- a/langtools/test/com/sun/javadoc/testSerialVersionUID/TestSerialVersionUID.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testSerialVersionUID/TestSerialVersionUID.java Fri May 16 02:13:12 2014 -0700 @@ -27,32 +27,25 @@ * @summary Test to make sure that the serialVersionUID is properly * documented in the serialized form. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestSerialVersionUID * @run main TestSerialVersionUID */ public class TestSerialVersionUID extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, - SRC_DIR + "/C.java" - }; + public static void main(String... args) throws Exception { + TestSerialVersionUID tester = new TestSerialVersionUID(); + tester.runTests(); + } - //Input for string search tests. - private static final String[][] TEST = { - { "serialized-form.html", "-111111111111111L"} - }; + @Test + void test() { + javadoc("-d", "out", + testSrc("C.java")); + checkExit(Exit.OK); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestSerialVersionUID tester = new TestSerialVersionUID(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + checkOutput("serialized-form.html", true, + "-111111111111111L"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testSerializedForm/TestSerializedForm.java --- a/langtools/test/com/sun/javadoc/testSerializedForm/TestSerializedForm.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testSerializedForm/TestSerializedForm.java Fri May 16 02:13:12 2014 -0700 @@ -38,85 +38,76 @@ * @run main TestSerializedForm */ -import java.lang.*; import java.io.*; public class TestSerializedForm extends JavadocTester implements Serializable { + public static void main(String... args) throws Exception { + TestSerializedForm tester = new TestSerializedForm(); + tester.runTests(); +// tester.run(ARGS, TEST, NEGATED_TEST); +// tester.run(ARGS_PRIVATE, TEST_PRIVATE, NEGATED_TEST_PRIVATE); +// tester.printSummary(); + } - private static final String[][] TEST = { - { "serialized-form.html", - "protected java.lang.Object readResolve()"}, - { "serialized-form.html", - "protected java.lang.Object writeReplace()"}, - { "serialized-form.html", - "protected java.lang.Object readObjectNoData()"}, - { "serialized-form.html", - "See Also"}, - { "serialized-form.html", - "

            Class pkg1.NestedInnerClass.InnerClass.ProNestedInnerClass " + - "extends java.lang.Object implements Serializable

            "}, - { "serialized-form.html", - "

            Class pkg1.PrivateIncludeInnerClass.PriInnerClass extends " + - "java.lang.Object implements Serializable

            "}, - { "serialized-form.html", - "

            Class pkg1.ProtectedInnerClass.ProInnerClass extends " + - "java.lang.Object implements Serializable

            "} - }; + @Test + void testDefault() { + javadoc("-d", "out-default", + "-sourcepath", testSrc, + testSrc("TestSerializedForm.java"), "pkg1"); + checkExit(Exit.OK); - private static final String[][] TEST_PRIVATE = { - { "serialized-form.html", - "

            Class pkg1.NestedInnerClass.InnerClass.ProNestedInnerClass " + - "extends java.lang.Object implements Serializable

            "}, - { "serialized-form.html", - "

            Class " + - "pkg1.PrivateIncludeInnerClass.PriInnerClass extends java.lang.Object implements Serializable

            "}, - { "serialized-form.html", - "

            Class " + - "pkg1.ProtectedInnerClass.ProInnerClass extends java.lang.Object implements Serializable

            "} - }; + checkOutput("serialized-form.html", true, + "protected java.lang.Object readResolve()", + "protected java.lang.Object writeReplace()", + "protected java.lang.Object readObjectNoData()", + "See Also", + "

            Class pkg1.NestedInnerClass.InnerClass.ProNestedInnerClass " + + "extends java.lang.Object implements Serializable

            ", + "

            Class pkg1.PrivateIncludeInnerClass.PriInnerClass extends " + + "java.lang.Object implements Serializable

            ", + "

            Class pkg1.ProtectedInnerClass.ProInnerClass extends " + + "java.lang.Object implements Serializable

            "); - private static final String[][] NEGATED_TEST = { - { "serialized-form.html", - "

            Class pkg1.NestedInnerClass.InnerClass.ProNestedInnerClass " + - "extends java.lang.Object implements Serializable

            "}, - { "serialized-form.html", - "

            Class " + - "pkg1.PrivateInnerClass.PriInnerClass extends java.lang.Object implements Serializable

            "}, - { "serialized-form.html", - "

            Class " + - "pkg1.ProtectedInnerClass.ProInnerClass extends java.lang.Object implements Serializable

            "}, - { "serialized-form.html", - "

            Class pkg1.PublicExcludeInnerClass.PubInnerClass extends java.lang.Object implements " + - "Serializable

            "} - }; + checkOutput("serialized-form.html", false, + "

            Class pkg1.NestedInnerClass.InnerClass.ProNestedInnerClass " + + "extends java.lang.Object implements Serializable

            ", + "

            Class " + + "pkg1.PrivateInnerClass.PriInnerClass extends java.lang.Object implements Serializable

            ", + "

            Class " + + "pkg1.ProtectedInnerClass.ProInnerClass extends java.lang.Object implements Serializable

            ", + "

            Class pkg1.PublicExcludeInnerClass.PubInnerClass extends java.lang.Object implements " + + "Serializable

            "); + } + + @Test + void testPrivate() { + javadoc("-private", + "-d", "out-private", + "-sourcepath", testSrc, + testSrc("TestSerializedForm.java"), "pkg1"); + checkExit(Exit.OK); - private static final String[][] NEGATED_TEST_PRIVATE = { - { "serialized-form.html", - "

            Class pkg1.NestedInnerClass.InnerClass.ProNestedInnerClass " + - "extends java.lang.Object implements Serializable

            "}, - { "serialized-form.html", - "

            Class pkg1.PrivateInnerClass.PriInnerClass extends " + - "java.lang.Object implements Serializable

            "}, - { "serialized-form.html", - "

            Class pkg1.ProtectedInnerClass.ProInnerClass extends " + - "java.lang.Object implements Serializable

            "}, - { "serialized-form.html", - "

            Class pkg1.PublicExcludeInnerClass.PubInnerClass " + - "extends java.lang.Object implements Serializable

            "} - }; + checkOutput("serialized-form.html", true, + "

            Class pkg1.NestedInnerClass.InnerClass.ProNestedInnerClass " + + "extends java.lang.Object implements Serializable

            ", + "

            Class " + + "pkg1.PrivateIncludeInnerClass.PriInnerClass extends java.lang.Object implements Serializable

            ", + "

            Class " + + "pkg1.ProtectedInnerClass.ProInnerClass extends java.lang.Object implements Serializable

            "); - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - SRC_DIR + "/TestSerializedForm.java", "pkg1" - }; - - private static final String[] ARGS_PRIVATE = new String[] { - "-private", "-d", OUTPUT_DIR + "-1", "-sourcepath", SRC_DIR, - SRC_DIR + "/TestSerializedForm.java", "pkg1" - }; + checkOutput("serialized-form.html", false, + "

            Class pkg1.NestedInnerClass.InnerClass.ProNestedInnerClass " + + "extends java.lang.Object implements Serializable

            ", + "

            Class pkg1.PrivateInnerClass.PriInnerClass extends " + + "java.lang.Object implements Serializable

            ", + "

            Class pkg1.ProtectedInnerClass.ProInnerClass extends " + + "java.lang.Object implements Serializable

            ", + "

            Class pkg1.PublicExcludeInnerClass.PubInnerClass " + + "extends java.lang.Object implements Serializable

            "); + } /** * @serial @@ -128,12 +119,6 @@ * The entry point of the test. * @param args the array of command line arguments. */ - public static void main(String[] args) { - TestSerializedForm tester = new TestSerializedForm(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.run(ARGS_PRIVATE, TEST_PRIVATE, NEGATED_TEST_PRIVATE); - tester.printSummary(); - } /** * @param s ObjectInputStream. diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testSerializedFormDeprecationInfo/TestSerializedFormDeprecationInfo.java --- a/langtools/test/com/sun/javadoc/testSerializedFormDeprecationInfo/TestSerializedFormDeprecationInfo.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testSerializedFormDeprecationInfo/TestSerializedFormDeprecationInfo.java Fri May 16 02:13:12 2014 -0700 @@ -28,118 +28,142 @@ * @bug 6802694 8025633 8026567 * @summary This test verifies deprecation info in serialized-form.html. * @author Bhavesh Patel - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestSerializedFormDeprecationInfo * @run main TestSerializedFormDeprecationInfo */ public class TestSerializedFormDeprecationInfo extends JavadocTester { + public static void main(String... args) throws Exception { + TestSerializedFormDeprecationInfo tester = new TestSerializedFormDeprecationInfo(); + tester.runTests(); + } + + @Test + void testDefault() { + javadoc("-d", "out-default", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.FAILED); // TODO: should be OK + + checkCommentDeprecated(true); + checkNoComment(false); + } + + @Test + void testNoComment() { + javadoc("-d", "out-nocmnt", + "-nocomment", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.FAILED); // TODO: should be OK + + checkNoComment(true); + checkCommentDeprecated(false); + } + + @Test + void testNoDeprecated() { + javadoc("-d", "out-nodepr", + "-nodeprecated", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.FAILED); // TODO: should be OK + + checkNoDeprecated(true); + checkNoCommentNoDeprecated(false); + } + + @Test + void testNoCommentNoDeprecated() { + javadoc("-d", "out-nocmnt-nodepr", + "-nocomment", + "-nodeprecated", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.FAILED); // TODO: should be OK + checkNoCommentNoDeprecated(true); + checkNoDeprecated(false); + } + // Test for normal run of javadoc. The serialized-form.html should // display the inline comments, tags and deprecation information if any. - private static final String[][] TEST_CMNT_DEPR = { - { "serialized-form.html", "
            \n" + - "
            Throws:
            \n" + - "
            " + - "java.io.IOException
            \n" + - "
            See Also:" + - "
            \n" + - "
            " + - "C1.setUndecorated(boolean)
            \n" + - "
            "}, - { "serialized-form.html", - "Deprecated." + - " As of JDK version 1.5, replaced by\n" + - " " + - "setUndecorated(boolean).
            \n" + - "
            This field indicates whether the C1 " + - "is undecorated.
            \n" + - " \n" + - "
            \n" + - "
            Since:
            \n" + - "
            1.4
            \n" + - "
            See Also:" + - "
            \n" + - "
            " + - "C1.setUndecorated(boolean)
            \n" + - "
            "}, - { "serialized-form.html", - "Deprecated." + - " As of JDK version 1.5, replaced by\n" + - " " + - "setUndecorated(boolean).
            \n" + - "
            Reads the object stream.
            \n" + - "
            \n" + - "
            Throws:
            \n" + - "
            " + - "IOException
            \n" + - "
            java.io.IOException
            \n" + - "
            "}, - { "serialized-form.html", - "Deprecated." + - " \n" + - "
            " + - "The name for this class.
            "}}; + void checkCommentDeprecated(boolean expectFound) { + checkOutput("serialized-form.html", expectFound, + "
            \n" + + "
            Throws:
            \n" + + "
            " + + "java.io.IOException
            \n" + + "
            See Also:" + + "
            \n" + + "
            " + + "C1.setUndecorated(boolean)
            \n" + + "
            ", + "Deprecated." + + " As of JDK version 1.5, replaced by\n" + + " " + + "setUndecorated(boolean).\n" + + "
            This field indicates whether the C1 " + + "is undecorated.
            \n" + + " \n" + + "
            \n" + + "
            Since:
            \n" + + "
            1.4
            \n" + + "
            See Also:" + + "
            \n" + + "
            " + + "C1.setUndecorated(boolean)
            \n" + + "
            ", + "Deprecated." + + " As of JDK version 1.5, replaced by\n" + + " " + + "setUndecorated(boolean).\n" + + "
            Reads the object stream.
            \n" + + "
            \n" + + "
            Throws:
            \n" + + "
            " + + "IOException
            \n" + + "
            java.io.IOException
            \n" + + "
            ", + "Deprecated." + + " \n" + + "
            " + + "The name for this class.
            "); + } // Test with -nocomment option. The serialized-form.html should // not display the inline comments and tags but should display deprecation // information if any. - private static final String[][] TEST_NOCMNT = { - { "serialized-form.html", - "
            boolean undecorated
            \n" + - "
            Deprecated. " + - "As of JDK version 1.5, replaced by\n" + - " " + - "setUndecorated(boolean).
            \n" + - ""}, - { "serialized-form.html", - "" + - "Deprecated. As of JDK version" + - " 1.5, replaced by\n" + - " " + - "setUndecorated(boolean).\n" + - ""}}; + void checkNoComment(boolean expectFound) { + checkOutput("serialized-form.html", expectFound, + "
            boolean undecorated
            \n" + + "
            Deprecated. " + + "As of JDK version 1.5, replaced by\n" + + " " + + "setUndecorated(boolean).
            \n" + + "", + "" + + "Deprecated. As of JDK version" + + " 1.5, replaced by\n" + + " " + + "setUndecorated(boolean).\n" + + ""); + } // Test with -nodeprecated option. The serialized-form.html should // ignore the -nodeprecated tag and display the deprecation info. This // test is similar to the normal run of javadoc in which inline comment, tags // and deprecation information will be displayed. - private static final String[][] TEST_NODEPR = TEST_CMNT_DEPR; + void checkNoDeprecated(boolean expectFound) { + checkCommentDeprecated(expectFound); + } // Test with -nodeprecated and -nocomment options. The serialized-form.html should // ignore the -nodeprecated tag and display the deprecation info but should not // display the inline comments and tags. This test is similar to the test with // -nocomment option. - private static final String[][] TEST_NOCMNT_NODEPR = TEST_NOCMNT; - - private static final String[] ARGS1 = - new String[] { - "-d", OUTPUT_DIR + "-1", "-sourcepath", SRC_DIR, "pkg1"}; - - private static final String[] ARGS2 = - new String[] { - "-d", OUTPUT_DIR + "-2", "-nocomment", "-sourcepath", SRC_DIR, "pkg1"}; - - private static final String[] ARGS3 = - new String[] { - "-d", OUTPUT_DIR + "-3", "-nodeprecated", "-sourcepath", SRC_DIR, "pkg1"}; - - private static final String[] ARGS4 = - new String[] { - "-d", OUTPUT_DIR + "-4", "-nocomment", "-nodeprecated", "-sourcepath", - SRC_DIR, "pkg1"}; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestSerializedFormDeprecationInfo tester = new TestSerializedFormDeprecationInfo(); - tester.run(ARGS1, TEST_CMNT_DEPR, TEST_NOCMNT); - tester.run(ARGS2, TEST_NOCMNT, TEST_CMNT_DEPR); - tester.run(ARGS3, TEST_NODEPR, TEST_NOCMNT_NODEPR); - tester.run(ARGS4, TEST_NOCMNT_NODEPR, TEST_NODEPR); - tester.printSummary(); + void checkNoCommentNoDeprecated(boolean expectFound) { + checkNoComment(expectFound); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testSimpleTag/TestSimpleTag.java --- a/langtools/test/com/sun/javadoc/testSimpleTag/TestSimpleTag.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testSimpleTag/TestSimpleTag.java Fri May 16 02:13:12 2014 -0700 @@ -24,47 +24,38 @@ /* * @test * @bug 4695326 4750173 4920381 8026567 - * @summary Test the declarartion of simple tags using -tag. Verify that + * @summary Test the declaration of simple tags using -tag. Verify that * "-tag name" is a shortcut for "-tag name:a:Name:". Also verity that * you can escape the ":" character with a back slash so that it is not * considered a separator when parsing the simple tag argument. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestSimpleTag * @run main TestSimpleTag */ public class TestSimpleTag extends JavadocTester { - private static final String[][] TEST = - new String[][] { - { "C.html", - "Todo:"}, - { "C.html", - "EJB Beans:"}, - { "C.html", - "Regular Tag:"}, - { "C.html", - "Back-Slash-Tag:"}, - }; + public static void main(String... args) throws Exception { + TestSimpleTag tester = new TestSimpleTag(); + tester.runTests(); + } - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-tag", "todo", - "-tag", "ejb\\:bean:a:EJB Beans:", - "-tag", "regular:a:Regular Tag:", - "-tag", "back-slash\\:tag\\\\:a:Back-Slash-Tag:", - SRC_DIR + "/C.java" - }; + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-tag", "todo", + "-tag", "ejb\\:bean:a:EJB Beans:", + "-tag", "regular:a:Regular Tag:", + "-tag", "back-slash\\:tag\\\\:a:Back-Slash-Tag:", + testSrc("C.java")); + checkExit(Exit.FAILED); // TODO: investigate why failed - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestSimpleTag tester = new TestSimpleTag(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + checkOutput("C.html", true, + "Todo:", + "EJB Beans:", + "Regular Tag:", + "Back-Slash-Tag:"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testSimpleTagExclude/TestSimpleTagExclude.java --- a/langtools/test/com/sun/javadoc/testSimpleTagExclude/TestSimpleTagExclude.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testSimpleTagExclude/TestSimpleTagExclude.java Fri May 16 02:13:12 2014 -0700 @@ -27,31 +27,27 @@ * @summary Test the parsing of the -tag option. The user should be able to * exclude a simple tag by using -tag tagname:X * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestSimpleTagExclude * @run main TestSimpleTagExclude */ public class TestSimpleTagExclude extends JavadocTester { - private static final String[][] NEGATED_TEST = { - { "DummyClass.html", "todo"} - }; - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-tag", "todo:X", - SRC_DIR + "/DummyClass.java" - }; + public static void main(String... args) throws Exception { + TestSimpleTagExclude tester = new TestSimpleTagExclude(); + tester.runTests(); + } - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestSimpleTagExclude tester = new TestSimpleTagExclude(); - if (tester.run(ARGS, NO_TEST, NEGATED_TEST) != 0) { - throw new Error("Javadoc failed to execute."); - } - tester.printSummary(); + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-tag", "todo:X", + testSrc("DummyClass.java")); + checkExit(Exit.OK); + + checkOutput("DummyClass.html", false, + "todo"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testSimpleTagInherit/TestSimpleTagInherit.java --- a/langtools/test/com/sun/javadoc/testSimpleTagInherit/TestSimpleTagInherit.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testSimpleTagInherit/TestSimpleTagInherit.java Fri May 16 02:13:12 2014 -0700 @@ -25,8 +25,8 @@ * @test * @bug 8008768 8026567 * @summary Using {@inheritDoc} in simple tag defined via -tag fails - * @library ../lib/ - * @build JavadocTester TestSimpleTagInherit + * @library ../lib + * @build JavadocTester * @run main TestSimpleTagInherit */ @@ -34,28 +34,31 @@ //Javadoc arguments. private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-tag", "custom:optcm:Custom:", - "p" + }; //Input for string search tests. private static final String[][] TEST = { - { "p/TestClass.html", - "
            Custom:
            \n" + - "
            doc for BaseClass class
            " }, - { "p/TestClass.html", - "
            Custom:
            \n" + - "
            doc for BaseClass method
            " } + { } }; - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestSimpleTagInherit tester = new TestSimpleTagInherit(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-tag", "custom:optcm:Custom:", + "p"); + checkExit(Exit.OK); + + checkOutput("p/TestClass.html", true, + "
            Custom:
            \n" + + "
            doc for BaseClass class
            ", + "
            Custom:
            \n" + + "
            doc for BaseClass method
            "); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testSinceTag/TestSinceTag.java --- a/langtools/test/com/sun/javadoc/testSinceTag/TestSinceTag.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testSinceTag/TestSinceTag.java Fri May 16 02:13:12 2014 -0700 @@ -26,44 +26,49 @@ * @bug 7180906 8026567 * @summary Test to make sure that the since tag works correctly * @author Bhavesh Patel - * @library ../lib/ - * @build JavadocTester TestSinceTag + * @library ../lib + * @build JavadocTester * @run main TestSinceTag */ public class TestSinceTag extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS1 = new String[] { - "-d", OUTPUT_DIR + "-1", "-sourcepath", SRC_DIR, "pkg1" - }; - - private static final String[] ARGS2 = new String[] { - "-d", OUTPUT_DIR + "-2", "-sourcepath", SRC_DIR, "-nosince", "pkg1" - }; - - //Input for string search tests. - private static final String[][] TEST = { - { "pkg1/C1.html", - "
            \n" + - "
            Since:
            \n" + - "
            JDK1.0
            " - }, - { "serialized-form.html", - "
            \n" + - "
            Since:
            \n" + - "
            1.4
            " - } - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestSinceTag tester = new TestSinceTag(); - tester.run(ARGS1, TEST, NO_TEST); - tester.run(ARGS2, NO_TEST, TEST); + tester.runTests(); tester.printSummary(); } + + @Test + void testSince() { + javadoc("-d", "out-since", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.FAILED); // TODO: investigate + + checkSince(true); + } + + @Test + void testNoSince() { + javadoc("-d", "out-nosince", + "-sourcepath", testSrc, + "-nosince", + "pkg1"); + checkExit(Exit.FAILED); // TODO: investigate + + checkSince(false); + } + + void checkSince(boolean on) { + checkOutput("pkg1/C1.html", on, + "
            \n" + + "
            Since:
            \n" + + "
            JDK1.0
            "); + + checkOutput("serialized-form.html", on, + "
            \n" + + "
            Since:
            \n" + + "
            1.4
            "); + } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testSingleQuotedLink/TestSingleQuotedLink.java --- a/langtools/test/com/sun/javadoc/testSingleQuotedLink/TestSingleQuotedLink.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testSingleQuotedLink/TestSingleQuotedLink.java Fri May 16 02:13:12 2014 -0700 @@ -26,35 +26,32 @@ * @bug 6457406 * @summary Verify that a link in single quotes copied to the class-use page as is. * @author Yuri Nesterenko - * @library ../lib/ - * @build JavadocTester TestSingleQuotedLink + * @library ../lib + * @build JavadocTester * @run main TestSingleQuotedLink */ public class TestSingleQuotedLink extends JavadocTester { - // We are testing the redirection algorithm with a known scenario when a writer is not forced to ignore it: "-use". - private static final String[][] TEST = { - { "pkg1/class-use/C1.html", - "" - } - }; - private static final String[][] NEGATED_TEST = { - { "pkg1/class-use/C1.html", - "pkg1/\'http://download.oracle.com/javase/8/docs/technotes/guides/indexC2.html\'>" - } - }; - private static final String[] ARGS = - new String[]{ - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-use", "pkg1" - }; + public static void main(String... args) throws Exception { + TestSingleQuotedLink tester = new TestSingleQuotedLink(); + tester.runTests(); + } - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestSingleQuotedLink tester = new TestSingleQuotedLink(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + @Test + void run() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-use", + "pkg1"); + checkExit(Exit.OK); + + // We are testing the redirection algorithm with a known scenario when a + // writer is not forced to ignore it: "-use". + + checkOutput("pkg1/class-use/C1.html", true, + ""); + + checkOutput("pkg1/class-use/C1.html", false, + "pkg1/\'http://download.oracle.com/javase/8/docs/technotes/guides/indexC2.html\'>"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testSourceTab/TestSourceTab.java --- a/langtools/test/com/sun/javadoc/testSourceTab/TestSourceTab.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testSourceTab/TestSourceTab.java Fri May 16 02:13:12 2014 -0700 @@ -27,9 +27,8 @@ * @summary Test to make sure that the source documentation is indented properly * when -linksourcetab is used. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestSourceTab * @run main TestSourceTab */ @@ -37,45 +36,39 @@ public class TestSourceTab extends JavadocTester { - private static final String TMP_SRC_DIR = "tmpSrc"; - private static final String OUTPUT_DIR1 = OUTPUT_DIR + "-tabLengthEight"; - private static final String OUTPUT_DIR2 = OUTPUT_DIR + "-tabLengthFour"; - - //Run Javadoc on a source file with that is indented with a single tab per line - private static final String[] ARGS1 = - new String[] { - "-d", OUTPUT_DIR1, "-sourcepath", TMP_SRC_DIR, - "-notimestamp", "-linksource", TMP_SRC_DIR + "/SingleTab/C.java" - }; - - //Run Javadoc on a source file with that is indented with a two tab per line - //If we double the tabs and decrease the tab length by a half, the output should - //be the same as the one generated above. - private static final String[] ARGS2 = - new String[] { - "-d", OUTPUT_DIR2, "-sourcepath", TMP_SRC_DIR, - "-notimestamp", "-sourcetab", "4", TMP_SRC_DIR + "/DoubleTab/C.java" - }; - - //Files to diff - private static final String[] FILES_TO_DIFF = { - "src-html/C.html", - "C.html" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) throws IOException { + public static void main(String... args) throws Exception { TestSourceTab tester = new TestSourceTab(); - tester.run(ARGS1, NO_TEST, NO_TEST); - tester.run(ARGS2, NO_TEST, NO_TEST); - tester.runDiffs(OUTPUT_DIR1, OUTPUT_DIR2, FILES_TO_DIFF); + tester.runTests(); } - TestSourceTab() throws IOException { - initTabs(new File(SRC_DIR), new File(TMP_SRC_DIR)); + @Test + void test() throws Exception { + String tmpSrcDir = "tmpSrc"; + String outdir1 = "out-tabLengthEight"; + String outdir2 = "out-tabLengthFour"; + initTabs(new File(testSrc), new File(tmpSrcDir)); + + // Run Javadoc on a source file with that is indented with a single tab per line + javadoc("-d", outdir1, + "-sourcepath", tmpSrcDir, + "-notimestamp", + "-linksource", + tmpSrcDir + "/SingleTab/C.java"); + checkExit(Exit.OK); + + // Run Javadoc on a source file with that is indented with a two tab per line + // If we double the tabs and decrease the tab length by a half, the output should + // be the same as the one generated above. + javadoc("-d", outdir2, + "-sourcepath", tmpSrcDir, + "-notimestamp", + "-sourcetab", "4", + tmpSrcDir + "/DoubleTab/C.java"); + checkExit(Exit.OK); + + diff(outdir1, outdir2, + "src-html/C.html", + "C.html"); } void initTabs(File from, File to) throws IOException { @@ -91,26 +84,20 @@ String read(File f) throws IOException { StringBuilder sb = new StringBuilder(); - BufferedReader in = new BufferedReader(new FileReader(f)); - try { + try (BufferedReader in = new BufferedReader(new FileReader(f))) { String line; while ((line = in.readLine()) != null) { sb.append(line); - sb.append("\n"); + sb.append(NL); } - } finally { - in.close(); } return sb.toString(); } void write(File f, String s) throws IOException { f.getParentFile().mkdirs(); - Writer out = new FileWriter(f); - try { + try (Writer out = new FileWriter(f)) { out.write(s); - } finally { - out.close(); } } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testStylesheet/TestStylesheet.java --- a/langtools/test/com/sun/javadoc/testStylesheet/TestStylesheet.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testStylesheet/TestStylesheet.java Fri May 16 02:13:12 2014 -0700 @@ -26,132 +26,118 @@ * @bug 4494033 7028815 7052425 8007338 8023608 8008164 8016549 * @summary Run tests on doclet stylesheet. * @author jamieh - * @library ../lib/ - * @build JavadocTester TestStylesheet + * @library ../lib + * @build JavadocTester * @run main TestStylesheet */ public class TestStylesheet extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg" - }; + public static void main(String... args) throws Exception { + TestStylesheet tester = new TestStylesheet(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); - //Input for string search tests. - private static final String[][] TEST = { - { "stylesheet.css", - "/* Javadoc style sheet */"}, - { "stylesheet.css", - "/*\n" + - "Overall document style\n" + - "*/"}, - { "stylesheet.css", - "/*\n" + - "Heading styles\n" + - "*/"}, - { "stylesheet.css", - "/*\n" + - "Navigation bar styles\n" + - "*/"}, - { "stylesheet.css", - "body {\n" + - " background-color:#ffffff;\n" + - " color:#353833;\n" + - " font-family:'DejaVu Sans', Arial, Helvetica, sans-serif;\n" + - " font-size:14px;\n" + - " margin:0;\n" + - "}"}, - { "stylesheet.css", - "ul {\n" + - " list-style-type:disc;\n" + - "}"}, - { "stylesheet.css", - ".overviewSummary caption, .memberSummary caption, .typeSummary caption,\n" + - ".useSummary caption, .constantsSummary caption, .deprecatedSummary caption {\n" + - " position:relative;\n" + - " text-align:left;\n" + - " background-repeat:no-repeat;\n" + - " color:#253441;\n" + - " font-weight:bold;\n" + - " clear:none;\n" + - " overflow:hidden;\n" + - " padding:0px;\n" + - " padding-top:10px;\n" + - " padding-left:1px;\n" + - " margin:0px;\n" + - " white-space:pre;\n" + - "}"}, - { "stylesheet.css", - ".overviewSummary caption span, .memberSummary caption span, .typeSummary caption span,\n" + - ".useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span {\n" + - " white-space:nowrap;\n" + - " padding-top:5px;\n" + - " padding-left:12px;\n" + - " padding-right:12px;\n" + - " padding-bottom:7px;\n" + - " display:inline-block;\n" + - " float:left;\n" + - " background-color:#F8981D;\n" + - " border: none;\n" + - " height:16px;\n" + - "}"}, - { "stylesheet.css", - ".memberSummary caption span.activeTableTab span {\n" + - " white-space:nowrap;\n" + - " padding-top:5px;\n" + - " padding-left:12px;\n" + - " padding-right:12px;\n" + - " margin-right:3px;\n" + - " display:inline-block;\n" + - " float:left;\n" + - " background-color:#F8981D;\n" + - " height:16px;\n" + - "}"}, - { "stylesheet.css", - ".memberSummary caption span.tableTab span {\n" + - " white-space:nowrap;\n" + - " padding-top:5px;\n" + - " padding-left:12px;\n" + - " padding-right:12px;\n" + - " margin-right:3px;\n" + - " display:inline-block;\n" + - " float:left;\n" + - " background-color:#4D7A97;\n" + - " height:16px;\n" + - "}"}, - { "stylesheet.css", - ".memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab {\n" + - " padding-top:0px;\n" + - " padding-left:0px;\n" + - " padding-right:0px;\n" + - " background-image:none;\n" + - " float:none;\n" + - " display:inline;\n" + - "}"}, - { "stylesheet.css", - "@import url('resources/fonts/dejavu.css');"}, + // TODO: most of this test seems a bit silly, since javadoc is simply + // copying in the stylesheet from the source directory + checkOutput("stylesheet.css", true, + "/* Javadoc style sheet */", + "/*\n" + + "Overall document style\n" + + "*/", + "/*\n" + + "Heading styles\n" + + "*/", + "/*\n" + + "Navigation bar styles\n" + + "*/", + "body {\n" + + " background-color:#ffffff;\n" + + " color:#353833;\n" + + " font-family:'DejaVu Sans', Arial, Helvetica, sans-serif;\n" + + " font-size:14px;\n" + + " margin:0;\n" + + "}", + "ul {\n" + + " list-style-type:disc;\n" + + "}", + ".overviewSummary caption, .memberSummary caption, .typeSummary caption,\n" + + ".useSummary caption, .constantsSummary caption, .deprecatedSummary caption {\n" + + " position:relative;\n" + + " text-align:left;\n" + + " background-repeat:no-repeat;\n" + + " color:#253441;\n" + + " font-weight:bold;\n" + + " clear:none;\n" + + " overflow:hidden;\n" + + " padding:0px;\n" + + " padding-top:10px;\n" + + " padding-left:1px;\n" + + " margin:0px;\n" + + " white-space:pre;\n" + + "}", + ".overviewSummary caption span, .memberSummary caption span, .typeSummary caption span,\n" + + ".useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span {\n" + + " white-space:nowrap;\n" + + " padding-top:5px;\n" + + " padding-left:12px;\n" + + " padding-right:12px;\n" + + " padding-bottom:7px;\n" + + " display:inline-block;\n" + + " float:left;\n" + + " background-color:#F8981D;\n" + + " border: none;\n" + + " height:16px;\n" + + "}", + ".memberSummary caption span.activeTableTab span {\n" + + " white-space:nowrap;\n" + + " padding-top:5px;\n" + + " padding-left:12px;\n" + + " padding-right:12px;\n" + + " margin-right:3px;\n" + + " display:inline-block;\n" + + " float:left;\n" + + " background-color:#F8981D;\n" + + " height:16px;\n" + + "}", + ".memberSummary caption span.tableTab span {\n" + + " white-space:nowrap;\n" + + " padding-top:5px;\n" + + " padding-left:12px;\n" + + " padding-right:12px;\n" + + " margin-right:3px;\n" + + " display:inline-block;\n" + + " float:left;\n" + + " background-color:#4D7A97;\n" + + " height:16px;\n" + + "}", + ".memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab {\n" + + " padding-top:0px;\n" + + " padding-left:0px;\n" + + " padding-right:0px;\n" + + " background-image:none;\n" + + " float:none;\n" + + " display:inline;\n" + + "}", + "@import url('resources/fonts/dejavu.css');"); + // Test whether a link to the stylesheet file is inserted properly // in the class documentation. - { "pkg/A.html", - ""} - }; - private static final String[][] NEGATED_TEST = { - { "stylesheet.css", - "* {\n" + - " margin:0;\n" + - " padding:0;\n" + - "}"} - }; + checkOutput("pkg/A.html", true, + ""); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestStylesheet tester = new TestStylesheet(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + checkOutput("stylesheet.css", false, + "* {\n" + + " margin:0;\n" + + " padding:0;\n" + + "}"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testSubTitle/TestSubTitle.java --- a/langtools/test/com/sun/javadoc/testSubTitle/TestSubTitle.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testSubTitle/TestSubTitle.java Fri May 16 02:13:12 2014 -0700 @@ -26,44 +26,38 @@ * @bug 7010342 * @summary Test for correct sub title generation. * @author Bhavesh Patel - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestSubTitle * @run main TestSubTitle */ public class TestSubTitle extends JavadocTester { - private static final String[][] TEST = { - { "pkg/package-summary.html", - "
            This is the description of package pkg.
            " - }, - { "pkg/C.html", - "
            pkg
            " - } - }; - private static final String[][] NEG_TEST = { - { "pkg/package-summary.html", + public static void main(String... args) throws Exception { + TestSubTitle tester = new TestSubTitle(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("pkg/package-summary.html", true, + "
            This is the description of package pkg.
            "); + + checkOutput("pkg/C.html", true, + "
            pkg
            "); + + checkOutput("pkg/package-summary.html", false, "

            \n" + "

            This is the " + "description of package pkg.
            \n" + - "

            " - }, - { "pkg/C.html", - "

            pkg

            " - } - }; - private static final String[] ARGS = new String[]{ - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg" - }; + "

            "); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestSubTitle tester = new TestSubTitle(); - tester.run(ARGS, TEST, NEG_TEST); - tester.printSummary(); + checkOutput("pkg/C.html", false, + "

            pkg

            "); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testSummaryHeading/TestSummaryHeading.java --- a/langtools/test/com/sun/javadoc/testSummaryHeading/TestSummaryHeading.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testSummaryHeading/TestSummaryHeading.java Fri May 16 02:13:12 2014 -0700 @@ -28,31 +28,26 @@ * "Method Summary" heading should still show up since the class * inherits methods. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestSummaryHeading * @run main TestSummaryHeading */ public class TestSummaryHeading extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, SRC_DIR + "/C.java" - }; + public static void main(String... args) throws Exception { + TestSummaryHeading tester = new TestSummaryHeading(); + tester.runTests(); + } - //Input for string search tests. - private static final String[][] TEST = { - { "C.html", "

            Method Summary

            "} - }; + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + testSrc("C.java")); + checkExit(Exit.OK); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestSummaryHeading tester = new TestSummaryHeading(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + checkOutput("C.html", true, + "

            Method Summary

            "); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testSuperclassInSerialForm/TestSuperClassInSerialForm.java --- a/langtools/test/com/sun/javadoc/testSuperclassInSerialForm/TestSuperClassInSerialForm.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testSuperclassInSerialForm/TestSuperClassInSerialForm.java Fri May 16 02:13:12 2014 -0700 @@ -27,30 +27,27 @@ * @summary Test to make sure link to superclass is generated for * each class in serialized form page. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestSuperClassInSerialForm * @run main TestSuperClassInSerialForm */ public class TestSuperClassInSerialForm extends JavadocTester { - private static final String[][] TEST = { - { "serialized-form.html", - "
            pkg.SubClass extends SuperClass"} - }; - - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg" - }; + public static void main(String... args) throws Exception { + TestSuperClassInSerialForm tester = new TestSuperClassInSerialForm(); + tester.runTests(); + } - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestSuperClassInSerialForm tester = new TestSuperClassInSerialForm(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("serialized-form.html", true, + "pkg.SubClass" + + " extends SuperClass"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testSupplementary/TestSupplementary.java --- a/langtools/test/com/sun/javadoc/testSupplementary/TestSupplementary.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testSupplementary/TestSupplementary.java Fri May 16 02:13:12 2014 -0700 @@ -27,9 +27,8 @@ * @summary Test to make sure that "see" tag and "serialField" tag handle supplementary * characters correctly. This test case needs to be run in en_US locale. * @author Naoto Sato - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestSupplementary * @run main TestSupplementary */ @@ -37,33 +36,33 @@ public class TestSupplementary extends JavadocTester { - private static final String[][] TEST = { - {WARNING_OUTPUT, "C.java:38: warning - Tag @see:illegal character: \"119040\" in \"C#method\ud834\udd00()"}, - {WARNING_OUTPUT, "C.java:44: warning - illegal character \ud801 in @serialField tag: field\ud801\ud801 int."}, - {WARNING_OUTPUT, "C.java:44: warning - illegal character \ud834\udd7b in @serialField tag: \ud834\udd7bfield int."}, - }; - private static final String[][] NEGATED_TEST = { - {WARNING_OUTPUT, "C.java:14: warning - Tag @see:illegal character"}, - {WARNING_OUTPUT, "C.java:19: warning - Tag @see:illegal character"}, - {WARNING_OUTPUT, "C.java:24: warning - Tag @see:illegal character"}, - {WARNING_OUTPUT, "C.java:31: warning - illegal character"}, - }; - private static final String[] ARGS = new String[] { - "-locale", "en_US", "-d", OUTPUT_DIR, SRC_DIR + "/C.java" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { Locale saveLocale = Locale.getDefault(); try { TestSupplementary tester = new TestSupplementary(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); } finally { Locale.setDefault(saveLocale); } } + + @Test + void test() { + javadoc("-locale", "en_US", + "-d", "out", + testSrc("C.java")); + checkExit(Exit.FAILED); + + checkOutput(Output.WARNING, true, + "C.java:38: warning - Tag @see:illegal character: \"119040\" in \"C#method\ud834\udd00()", + "C.java:44: warning - illegal character \ud801 in @serialField tag: field\ud801\ud801 int.", + "C.java:44: warning - illegal character \ud834\udd7b in @serialField tag: \ud834\udd7bfield int."); + + // TODO: do we need to specify the file and line number in these messages? + checkOutput(Output.WARNING, false, + "C.java:14: warning - Tag @see:illegal character", + "C.java:19: warning - Tag @see:illegal character", + "C.java:24: warning - Tag @see:illegal character", + "C.java:31: warning - illegal character"); + } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testTagHolderMethod/TestTagHolderMethod.java --- a/langtools/test/com/sun/javadoc/testTagHolderMethod/TestTagHolderMethod.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testTagHolderMethod/TestTagHolderMethod.java Fri May 16 02:13:12 2014 -0700 @@ -26,7 +26,7 @@ * @bug 4706525 * @summary Determine if the new Tag.holder() method works properly. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester * @build TestTagHolderMethod * @run main TestTagHolderMethod @@ -36,10 +36,6 @@ public class TestTagHolderMethod extends JavadocTester { - public static final String[] ARGS = new String[] { - "-docletpath", SRC_DIR, "-doclet", "TestTagHolderMethod", "-sourcepath", - SRC_DIR, "pkg"}; - /** * Doclet entry point. */ @@ -55,14 +51,13 @@ } private static void checkHolders(Doc[] holders) throws Exception { - for (int i = 0; i < holders.length; i++) { - Doc holder = holders[i]; + for (Doc holder : holders) { Tag[] tags = holder.tags(); - for (int j = 0; j < tags.length; j++) { - if (! tags[j].holder().name().equals(holder.name())) { + for (Tag tag : tags) { + if (!tag.holder().name().equals(holder.name())) { throw new Exception("The holder method does not return the correct Doc object."); } else { - System.out.println(tags[j].name() + " is held by " + holder.name()); + System.out.println(tag.name() + " is held by " + holder.name()); } } } @@ -71,9 +66,19 @@ /** * The entry point of the test. * @param args the array of command line arguments. + * @throws Exception if the test fails */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { JavadocTester tester = new TestTagHolderMethod(); - tester.run(ARGS, new String[][]{}, new String[][]{}); + tester.runTests(); + } + + @Test + void test() { + javadoc("-docletpath", testSrc, // unlikely to be effective + "-doclet", "TestTagHolderMethod", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testTagInheritence/TestTagInheritence.java --- a/langtools/test/com/sun/javadoc/testTagInheritence/TestTagInheritence.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testTagInheritence/TestTagInheritence.java Fri May 16 02:13:12 2014 -0700 @@ -26,46 +26,44 @@ * @bug 4496223 4496270 4618686 4720974 4812240 6253614 6253604 * @summary * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestTagInheritence * @run main TestTagInheritence */ +// TODO: Inheritence should be Inheritance! fix separately as noreg-trivial public class TestTagInheritence extends JavadocTester { - private static final String[] ARGS = new String[] { - "-Xdoclint:none", "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg", - "firstSentence", "firstSentence2" - }; + public static void main(String... args) throws Exception { + TestTagInheritence tester = new TestTagInheritence(); + tester.runTests(); + } - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - String[][] tests = new String[42][2]; + @Test + void test() { + javadoc("-Xdoclint:none", + "-d", "out", + "-sourcepath", testSrc, + "pkg", "firstSentence", "firstSentence2"); + checkExit(Exit.OK); + //Test bad inheritDoc tag warning. - tests[0][0]= WARNING_OUTPUT; - tests[0][1] = "warning - @inheritDoc used but testBadInheritDocTag() " + - "does not override or implement any method."; + checkOutput(Output.WARNING, true, + "warning - @inheritDoc used but testBadInheritDocTag() " + + "does not override or implement any method."); //Test valid usage of inheritDoc tag. - for (int i = 1; i < tests.length-2; i++) { - tests[i][0] = "pkg/TestTagInheritence.html"; - tests[i][1] = "Test " + i + " passes"; + for (int i = 1; i < 40; i++) { + checkOutput("pkg/TestTagInheritence.html", true, + "Test " + i + " passes"); } //First sentence test (6253614) - tests[tests.length - 2][0] = "firstSentence/B.html"; - tests[tests.length - 2][1] = "
            First sentence.
            "; + checkOutput("firstSentence/B.html", true, + "
            First sentence.
            "); //Another first sentence test (6253604) - tests[tests.length - 1][0] = "firstSentence2/C.html"; - tests[tests.length - 1][1] = "
            First sentence.
            "; - - TestTagInheritence tester = new TestTagInheritence(); - tester.run(ARGS, tests, NO_TEST); - tester.printSummary(); + checkOutput("firstSentence2/C.html", true, + "
            First sentence.
            "); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testTagMisuse/TestTagMisuse.java --- a/langtools/test/com/sun/javadoc/testTagMisuse/TestTagMisuse.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testTagMisuse/TestTagMisuse.java Fri May 16 02:13:12 2014 -0700 @@ -25,31 +25,35 @@ * @test * @summary Determine if proper warning messages are printed when know. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester * @build TestTagMisuse * @run main TestTagMisuse */ public class TestTagMisuse extends JavadocTester { - private static final String[][] TEST = { - {WARNING_OUTPUT, "warning - Tag @param cannot be used in field documentation."}, - {WARNING_OUTPUT, "warning - Tag @throws cannot be used in field documentation."}, - {WARNING_OUTPUT, "warning - Tag @return cannot be used in constructor documentation."}, - {WARNING_OUTPUT, "warning - Tag @throws cannot be used in inline documentation."}, - }; - private static final String[] ARGS = new String[] { - "-Xdoclint:none", "-d", OUTPUT_DIR, SRC_DIR + "/TestTagMisuse.java" - }; - /** * The entry point of the test. * @param args the array of command line arguments. + * @throws Exception if the test fails */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestTagMisuse tester = new TestTagMisuse(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-Xdoclint:none", + "-d", "out", + testSrc("TestTagMisuse.java")); + checkExit(Exit.OK); + + checkOutput(Output.WARNING, true, + "warning - Tag @param cannot be used in field documentation.", + "warning - Tag @throws cannot be used in field documentation.", + "warning - Tag @return cannot be used in constructor documentation.", + "warning - Tag @throws cannot be used in inline documentation."); } /** diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testTagOutput/TestTagOutput.java --- a/langtools/test/com/sun/javadoc/testTagOutput/TestTagOutput.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testTagOutput/TestTagOutput.java Fri May 16 02:13:12 2014 -0700 @@ -28,36 +28,32 @@ * @bug 8026370 8026567 * @summary This test checks the generated tag output. * @author Bhavesh Patel - * @library ../lib/ - * @build JavadocTester TestTagOutput + * @library ../lib + * @build JavadocTester * @run main TestTagOutput */ public class TestTagOutput extends JavadocTester { - private static final String[][] TEST = { - { "pkg1/DeprecatedTag.html", - "
            Deprecated. 
            "}, - { "pkg1/DeprecatedTag.html", - "
            Deprecated. " + - "Do not use this.
            "}}; - - private static final String[][] NEGATED_TEST = { - { "pkg1/DeprecatedTag.html", - "
            Deprecated." + - " 
            "}}; + public static void main(String... args) throws Exception { + TestTagOutput tester = new TestTagOutput(); + tester.runTests(); + } - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg1"}; + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.OK); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestTagOutput tester = new TestTagOutput(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + checkOutput("pkg1/DeprecatedTag.html", true, + "
            Deprecated. 
            ", + "
            Deprecated. " + + "Do not use this.
            "); + + checkOutput("pkg1/DeprecatedTag.html", false, + "
            Deprecated." + + " 
            "); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testTaglets/TestTaglets.java --- a/langtools/test/com/sun/javadoc/testTaglets/TestTaglets.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testTaglets/TestTaglets.java Fri May 16 02:13:12 2014 -0700 @@ -29,49 +29,41 @@ * Run Javadoc on some sample source that uses {@inheritDoc}. Make * sure that only the first sentence shows up in the summary table. * @author jamieh - * @library ../lib/ - * @build JavadocTester - * @build TestTaglets - * @build taglets.Foo + * @library ../lib + * @build JavadocTester taglets.Foo * @run main TestTaglets */ public class TestTaglets extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS_4654308 = new String[] { - "-d", "4654308", "-tagletpath", SRC_DIR, "-taglet", "taglets.Foo", - "-sourcepath", SRC_DIR, SRC_DIR + "/C.java" - }; + public static void main(String... args) throws Exception { + TestTaglets tester = new TestTaglets(); + tester.runTests(); + } - private static final String[] ARGS_4767038 = new String[] { - "-d", "4767038", "-sourcepath", SRC_DIR, SRC_DIR + "/Parent.java", - SRC_DIR + "/Child.java" - }; - - //Input for string search tests. - private static final String[][] TEST_4654308 = new String[][] { - { "C.html", "Foo:" + - "
            my only method is here" + - "
            "} - }; + @Test + void test_4654308() { + javadoc("-d", "out-4654308", + "-tagletpath", testSrc, // TODO: probably does no good + "-taglet", "taglets.Foo", + "-sourcepath", testSrc, + testSrc("C.java")); + checkExit(Exit.OK); - private static final String[][] TEST_4767038 = new String[][] { - { "Child.html", - "This is the first sentence."} - }; - + checkOutput("C.html", true, + "Foo:" + + "
            my only method is here" + + "
            "); + } - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestTaglets tester = new TestTaglets(); - tester.run(ARGS_4654308, TEST_4654308, NO_TEST); - tester.printSummary(); - tester = new TestTaglets(); - tester.run(ARGS_4767038, TEST_4767038, NO_TEST); - tester.printSummary(); + @Test + void test_4767038() { + javadoc("-d", "out-4767038", + "-sourcepath", testSrc, + testSrc("Parent.java"), testSrc("Child.java")); + checkExit(Exit.OK); + + checkOutput("Child.html", true, + "This is the first sentence."); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testThrowsHead/TestThrowsHead.java --- a/langtools/test/com/sun/javadoc/testThrowsHead/TestThrowsHead.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testThrowsHead/TestThrowsHead.java Fri May 16 02:13:12 2014 -0700 @@ -28,28 +28,25 @@ * not documented with a throws tag, we generate a link to it in the * throws section. Make sure that the link is below a Throws heading. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestThrowsHead * @run main TestThrowsHead */ public class TestThrowsHead extends JavadocTester { - private static final String[][] TEST = { - { "C.html", "
            Throws:"} - }; - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, SRC_DIR + "/C.java" - }; + public static void main(String... args) throws Exception { + TestThrowsHead tester = new TestThrowsHead(); + tester.runTests(); + } - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestThrowsHead tester = new TestThrowsHead(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + @Test + void test() { + javadoc("-d", "out", + testSrc("C.java")); + checkExit(Exit.OK); + + checkOutput("C.html", true, + "
            Throws:"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testThrowsInheritence/TestThrowsTagInheritence.java --- a/langtools/test/com/sun/javadoc/testThrowsInheritence/TestThrowsTagInheritence.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testThrowsInheritence/TestThrowsTagInheritence.java Fri May 16 02:13:12 2014 -0700 @@ -28,36 +28,35 @@ * override the throws tags in interface. This test also verifies that throws tags are inherited properly * the case where the name of one exception is not fully qualified. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestThrowsTagInheritence * @run main TestThrowsTagInheritence */ +// TODO: should be TestThrowsInheritance! public class TestThrowsTagInheritence extends JavadocTester { - private static final String[][] TEST = { - //The class should not inherit the tag from the interface. - { "Foo.html", "Test 1 passes."} - }; - private static final String[][] NEGATED_TEST = { - //The class should not inherit the tag from the interface. - { "C.html", "Test 1 fails."} + public static void main(String... args) throws Exception { + TestThrowsTagInheritence tester = new TestThrowsTagInheritence(); + tester.runTests(); + } - }; - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, SRC_DIR + "/C.java", - SRC_DIR + "/I.java", SRC_DIR + "/Foo.java", - SRC_DIR + "/Iface.java" - }; + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + testSrc("C.java"), + testSrc("I.java"), + testSrc("Foo.java"), + testSrc("Iface.java")); + checkExit(Exit.OK); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestThrowsTagInheritence tester = new TestThrowsTagInheritence(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + // The class should not inherit the tag from the interface. + checkOutput("Foo.html", true, + "Test 1 passes."); + + //The class should not inherit the tag from the interface. + checkOutput("C.html", false, + "Test 1 fails."); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testThrowsTag/TestThrowsTag.java --- a/langtools/test/com/sun/javadoc/testThrowsTag/TestThrowsTag.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testThrowsTag/TestThrowsTag.java Fri May 16 02:13:12 2014 -0700 @@ -27,22 +27,26 @@ * @summary Test to make sure that exceptions always show up in the * correct order. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestThrowsTag * @run main TestThrowsTag */ public class TestThrowsTag extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg" - }; + public static void main(String... args) throws Exception { + TestThrowsTag tester = new TestThrowsTag(); + tester.runTests(); + } - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/C.html", + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.FAILED); // TODO: investigate why failed + + checkOutput("pkg/C.html", true, "
            T1 - the first throws tag.
            \n" + "
            T2 - the second throws tag.
            \n" + "
            T3 - the third throws tag.
            \n" + @@ -51,16 +55,6 @@ "
            T6 - the second inherited throws tag.
            \n" + "
            T7 - the third inherited throws tag.
            \n" + "
            T8 - the fourth inherited throws tag.
            " - }, - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestThrowsTag tester = new TestThrowsTag(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + ); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testTitleInHref/TestTitleInHref.java --- a/langtools/test/com/sun/javadoc/testTitleInHref/TestTitleInHref.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testTitleInHref/TestTitleInHref.java Fri May 16 02:13:12 2014 -0700 @@ -26,42 +26,35 @@ * @bug 4714257 * @summary Test to make sure that the title attribute shows up in links. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestTitleInHref * @run main TestTitleInHref */ public class TestTitleInHref extends JavadocTester { - private static final String[][] TEST = { - //Test to make sure that the title shows up in a class link. - { "pkg/Links.html", - ""}, - - //Test to make sure that the title shows up in an interface link. - { "pkg/Links.html", - ""}, - - //Test to make sure that the title shows up in cross link shows up - { "pkg/Links.html", - "This is a cross link to class File"}, - - }; + public static void main(String... args) throws Exception { + TestTitleInHref tester = new TestTitleInHref(); + tester.runTests(); + } - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-linkoffline", "http://java.sun.com/j2se/1.4/docs/api", - SRC_DIR, "pkg" - }; + @Test + void test() { + String uri = "http://java.sun.com/j2se/1.4/docs/api"; + javadoc("-d", "out", + "-sourcepath", testSrc, + "-linkoffline", uri, testSrc, + "pkg"); + checkExit(Exit.OK); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestTitleInHref tester = new TestTitleInHref(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + checkOutput("pkg/Links.html", true, + //Test to make sure that the title shows up in a class link. + "", + //Test to make sure that the title shows up in an interface link. + "", + //Test to make sure that the title shows up in cross link shows up + "" + + "This is a cross link to class File"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testTopOption/TestTopOption.java --- a/langtools/test/com/sun/javadoc/testTopOption/TestTopOption.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testTopOption/TestTopOption.java Fri May 16 02:13:12 2014 -0700 @@ -26,55 +26,44 @@ * @bug 6227616 * @summary Test the new -top option. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestTopOption * @run main TestTopOption */ public class TestTopOption extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-overview", "SRC_DIR + '/' + overview.html", "-use", "-top", - "TOP TEXT", "-d", OUTPUT_DIR, "-sourcepath", - SRC_DIR, "pkg" - }; + public static void main(String... args) throws Exception { + TestTopOption tester = new TestTopOption(); + tester.runTests(); + } - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/AnnotationType.html", - "TOP TEXT"}, - { "pkg/class-use/AnnotationType.html", - "TOP TEXT"}, - - { "pkg/Cl.html", - "TOP TEXT"}, - { "pkg/class-use/Cl.html", - "TOP TEXT"}, + @Test + void test() { + javadoc("-overview", testSrc("overview.html"), + "-use", + "-top", "TOP TEXT", + "-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); - { "pkg/package-summary.html", - "TOP TEXT"}, - { "pkg/package-use.html", - "TOP TEXT"}, + checkTopText( + "pkg/AnnotationType.html", + "pkg/class-use/AnnotationType.html", + "pkg/Cl.html", + "pkg/class-use/Cl.html", + "pkg/package-summary.html", + "pkg/package-use.html", + "overview-summary.html", + "overview-tree.html", + "constant-values.html", + "help-doc.html"); + } - { "overview-summary.html", - "TOP TEXT"}, - { "overview-tree.html", - "TOP TEXT"}, - { "constant-values.html", - "TOP TEXT"}, - { "help-doc.html", - "TOP TEXT"}, - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestTopOption tester = new TestTopOption(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + void checkTopText(String... files) { + for (String file : files) { + checkOutput(file, true, "TOP TEXT"); + } } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testTypeAnnotations/TestTypeAnnotations.java --- a/langtools/test/com/sun/javadoc/testTypeAnnotations/TestTypeAnnotations.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testTypeAnnotations/TestTypeAnnotations.java Fri May 16 02:13:12 2014 -0700 @@ -26,360 +26,327 @@ * @bug 8005091 8009686 8025633 8026567 * @summary Make sure that type annotations are displayed correctly * @author Bhavesh Patel - * @library ../lib/ + * @library ../lib * @ignore - * @build JavadocTester TestTypeAnnotations + * @build JavadocTester * @run main TestTypeAnnotations */ public class TestTypeAnnotations extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-private", "typeannos" - }; + public static void main(String... args) throws Exception { + TestTypeAnnotations tester = new TestTypeAnnotations(); + tester.runTests(); + } - //Input for string search tests. - private static final String[][] TEST = { + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-private", + "typeannos"); + checkExit(Exit.OK); + // Test for type annotations on Class Extends (ClassExtends.java). - { "typeannos/MyClass.html", - "extends @ClassExtA ParameterizedClass<" + - "@ClassExtB java.lang.String>" - }, - { "typeannos/MyClass.html", - "implements @ClassExtB java.lang.CharSequence, " + - "@ClassExtA ParameterizedInterface<" + - "@ClassExtB java.lang.String>" - }, - { "typeannos/MyInterface.html", - "extends @ClassExtA " + - "ParameterizedInterface<@ClassExtA java.lang.String>, " + - "@ClassExtB java.lang.CharSequence" - }, + checkOutput("typeannos/MyClass.html", true, + "extends @ClassExtA ParameterizedClass<" + + "@ClassExtB java.lang.String>", + + "implements @ClassExtB java.lang.CharSequence, " + + "@ClassExtA ParameterizedInterface<" + + "@ClassExtB java.lang.String>"); + + checkOutput("typeannos/MyInterface.html", true, + "extends @ClassExtA " + + "ParameterizedInterface<@ClassExtA java.lang.String>, " + + "@ClassExtB java.lang.CharSequence"); // Test for type annotations on Class Parameters (ClassParameters.java). - { "typeannos/ExtendsBound.html", - "class ExtendsBound<K extends @ClassParamA java.lang.String>" - }, - { "typeannos/ExtendsGeneric.html", - "
            class ExtendsGeneric<K extends " +
            -            "@ClassParamA Unannotated<" +
            -            "@ClassParamB java.lang.String>>"
            -        },
            -        { "typeannos/TwoBounds.html",
            -            "
            class TwoBounds<K extends " +
            -            "@ClassParamA java.lang.String,V extends @ClassParamB" +
            -            " java.lang.String>"
            -        },
            -        { "typeannos/Complex1.html",
            -            "class Complex1<K extends " +
            -            "@ClassParamA java.lang.String & java.lang.Runnable>"
            -        },
            -        { "typeannos/Complex2.html",
            -            "class Complex2<K extends java.lang." +
            -            "String & @ClassParamB java.lang.Runnable>"
            -        },
            -        { "typeannos/ComplexBoth.html",
            -            "class ComplexBoth<K extends @ClassParamA java.lang.String & @ClassParamA" +
            -            " java.lang.Runnable>"
            -        },
            +        checkOutput("typeannos/ExtendsBound.html", true,
            +                "class ExtendsBound<K extends @ClassParamA java.lang.String>");
            +
            +        checkOutput("typeannos/ExtendsGeneric.html", true,
            +                "
            class ExtendsGeneric<K extends "
            +                + "@ClassParamA Unannotated<"
            +                + "@ClassParamB java.lang.String>>");
            +
            +        checkOutput("typeannos/TwoBounds.html", true,
            +                "
            class TwoBounds<K extends "
            +                + "@ClassParamA java.lang.String,V extends @ClassParamB"
            +                + " java.lang.String>");
            +
            +        checkOutput("typeannos/Complex1.html", true,
            +                "class Complex1<K extends "
            +                + "@ClassParamA java.lang.String & java.lang.Runnable>");
            +
            +        checkOutput("typeannos/Complex2.html", true,
            +                "class Complex2<K extends java.lang."
            +                + "String & @ClassParamB java.lang.Runnable>");
            +
            +        checkOutput("typeannos/ComplexBoth.html", true,
            +                "class ComplexBoth<K extends @ClassParamA java.lang.String & @ClassParamA"
            +                + " java.lang.Runnable>");
             
                     // Test for type annotations on fields (Fields.java).
            -        { "typeannos/DefaultScope.html",
            -            "
            Parameterized<@FldA java.lang.String," +
            -            "@FldB java.lang.String> bothTypeArgs
            " - }, - { "typeannos/DefaultScope.html", - "
            @FldA java.lang.String @FldB [] " +
            -            "array1Deep
            " - }, - { "typeannos/DefaultScope.html", - "
            java.lang.String[] @FldB [] array2SecondOld
            " - }, - { "typeannos/DefaultScope.html", - "
            @FldD java.lang.String @FldC @FldA" +
            -            " [] @FldC @FldB [] array2Deep
            " - }, - { "typeannos/ModifiedScoped.html", - "
            public final Parameterized<@FldA " +
            -            "Parameterized<@FldA java.lang.String," +
            -            "@FldB java.lang.String>,@FldB java.lang.String> " +
            -            "nestedParameterized
            " - }, - { "typeannos/ModifiedScoped.html", - "
            public final @FldA java.lang.String[][] " +
            -            "array2
            " - }, + checkOutput("typeannos/DefaultScope.html", true, + "
            Parameterized<@FldA java.lang.String,"
            +                + "@FldB java.lang.String> bothTypeArgs
            ", + + "
            @FldA java.lang.String @FldB [] "
            +                + "array1Deep
            ", + + "
            java.lang.String[] @FldB [] array2SecondOld
            ", + + "
            @FldD java.lang.String @FldC @FldA"
            +                + " [] @FldC @FldB [] array2Deep
            "); + + checkOutput("typeannos/ModifiedScoped.html", true, + "
            public final Parameterized<@FldA "
            +                + "Parameterized<@FldA java.lang.String,"
            +                + "@FldB java.lang.String>,@FldB java.lang.String> "
            +                + "nestedParameterized
            ", + + "
            public final @FldA java.lang.String[][] "
            +                + "array2
            "); // Test for type annotations on method return types (MethodReturnType.java). - { "typeannos/MtdDefaultScope.html", - "
            public <T> @MRtnA java.lang.String" +
            -            " method()
            " - }, - { "typeannos/MtdDefaultScope.html", - "
            @MRtnA java.lang.String @MRtnA [] " +
            -            "@MRtnB [] array2Deep()
            " - }, - { "typeannos/MtdDefaultScope.html", - "
            @MRtnA java.lang.String[][] array2()
            " - }, - { "typeannos/MtdModifiedScoped.html", - "
            public final MtdParameterized<@MRtnA " +
            -            "MtdParameterized<@MRtnA java.lang." +
            -            "String,@MRtnB java.lang.String>,@MRtnB java." +
            -            "lang.String> nestedMtdParameterized()
            " - }, + checkOutput("typeannos/MtdDefaultScope.html", true, + "
            public <T> @MRtnA java.lang.String"
            +                + " method()
            ", + + "
            @MRtnA java.lang.String @MRtnA [] "
            +                + "@MRtnB [] array2Deep()
            ", + + "
            @MRtnA java.lang.String[][] array2()
            "); + + checkOutput("typeannos/MtdModifiedScoped.html", true, + "
            public final MtdParameterized<@MRtnA "
            +                + "MtdParameterized<@MRtnA java.lang."
            +                + "String,@MRtnB java.lang.String>,@MRtnB java."
            +                + "lang.String> nestedMtdParameterized()
            "); // Test for type annotations on method type parameters (MethodTypeParameters.java). - { "typeannos/UnscopedUnmodified.html", - "
            <K extends @MTyParamA java.lang.String>" +
            -            " void methodExtends()
            " - }, - { "typeannos/UnscopedUnmodified.html", - "
            <K extends @MTyParamA " +
            -            "MtdTyParameterized<@MTyParamB java.lang.String" +
            -            ">> void nestedExtends()
            " - }, - { "typeannos/PublicModifiedMethods.html", - "
            public final <K extends @MTyParamA " +
            -            "java.lang.String> void methodExtends()
            " - }, - { "typeannos/PublicModifiedMethods.html", - "
            public final <K extends @MTyParamA " +
            -            "java.lang.String,V extends @MTyParamA " +
            -            "MtdTyParameterized<@MTyParamB java.lang.String" +
            -            ">> void dual()
            " - }, + checkOutput("typeannos/UnscopedUnmodified.html", true, + "
            <K extends @MTyParamA java.lang.String>"
            +                + " void methodExtends()
            ", + + "
            <K extends @MTyParamA "
            +                + "MtdTyParameterized<@MTyParamB java.lang.String"
            +                + ">> void nestedExtends()
            "); + + checkOutput("typeannos/PublicModifiedMethods.html", true, + "
            public final <K extends @MTyParamA "
            +                + "java.lang.String> void methodExtends()
            ", + + "
            public final <K extends @MTyParamA "
            +                + "java.lang.String,V extends @MTyParamA "
            +                + "MtdTyParameterized<@MTyParamB java.lang.String"
            +                + ">> void dual()
            "); // Test for type annotations on parameters (Parameters.java). - { "typeannos/Parameters.html", - "
            void unannotated(" +
            -            "ParaParameterized<java.lang.String,java.lang.String>" +
            -            " a)
            " - }, - { "typeannos/Parameters.html", - "
            void nestedParaParameterized(" +
            -            "ParaParameterized<@ParamA " +
            -            "ParaParameterized<@ParamA java.lang.String," +
            -            "@ParamB java.lang.String>,@ParamB" +
            -            " java.lang.String> a)
            " - }, - { "typeannos/Parameters.html", - "
            void array2Deep(@ParamA java.lang.String " +
            -            "@ParamA [] @ParamB [] a)
            " - }, + checkOutput("typeannos/Parameters.html", true, + "
            void unannotated("
            +                + "ParaParameterized<java.lang.String,java.lang.String>"
            +                + " a)
            ", + + "
            void nestedParaParameterized("
            +                + "ParaParameterized<@ParamA "
            +                + "ParaParameterized<@ParamA java.lang.String,"
            +                + "@ParamB java.lang.String>,@ParamB"
            +                + " java.lang.String> a)
            ", + + "
            void array2Deep(@ParamA java.lang.String "
            +                + "@ParamA [] @ParamB [] a)
            "); // Test for type annotations on throws (Throws.java). - { "typeannos/ThrDefaultUnmodified.html", - "
            void oneException()\n" +
            -            "           throws @ThrA java.lang.Exception
            " - }, - { "typeannos/ThrDefaultUnmodified.html", - "
            void twoExceptions()\n" +
            -            "            throws @ThrA java.lang.RuntimeException,\n" +
            -            "                   @ThrA java.lang.Exception
            " - }, - { "typeannos/ThrPublicModified.html", - "
            public final void oneException(java.lang.String a)\n" +
            -            "                        throws @ThrA java.lang.Exception
            " - }, - { "typeannos/ThrPublicModified.html", - "
            public final void twoExceptions(java.lang.String a)\n" +
            -            "                         throws @ThrA java.lang.RuntimeException,\n" +
            -            "                                @ThrA java.lang.Exception
            " - }, - { "typeannos/ThrWithValue.html", - "
            void oneException()\n" +
            -            "           throws @ThrB(value=\"m\") java.lang.Exception
            " - }, - { "typeannos/ThrWithValue.html", - "
            void twoExceptions()\n" +
            -            "            throws @ThrB(value=\"m\") java.lang.RuntimeException,\n" +
            -            "                   @ThrA java.lang.Exception
            " - }, + checkOutput("typeannos/ThrDefaultUnmodified.html", true, + "
            void oneException()\n"
            +                + "           throws @ThrA java.lang.Exception
            ", + + "
            void twoExceptions()\n"
            +                + "            throws @ThrA java.lang.RuntimeException,\n"
            +                + "                   @ThrA java.lang.Exception
            "); + + checkOutput("typeannos/ThrPublicModified.html", true, + "
            public final void oneException(java.lang.String a)\n"
            +                + "                        throws @ThrA java.lang.Exception
            ", + + "
            public final void twoExceptions(java.lang.String a)\n"
            +                + "                         throws @ThrA java.lang.RuntimeException,\n"
            +                + "                                @ThrA java.lang.Exception
            "); + + checkOutput("typeannos/ThrWithValue.html", true, + "
            void oneException()\n"
            +                + "           throws @ThrB(value=\"m\") java.lang.Exception
            ", + + "
            void twoExceptions()\n"
            +                + "            throws @ThrB(value=\"m\") java.lang.RuntimeException,\n"
            +                + "                   @ThrA java.lang.Exception
            "); // Test for type annotations on type parameters (TypeParameters.java). - { "typeannos/TestMethods.html", - "
            <K,V extends @TyParaA java.lang.String> " +
            -            "void secondAnnotated()
            " - }, + checkOutput("typeannos/TestMethods.html", true, + "
            <K,V extends @TyParaA java.lang.String> "
            +                + "void secondAnnotated()
            "); // Test for type annotations on wildcard type (Wildcards.java). - { "typeannos/BoundTest.html", - "
            void wcExtends(MyList<? extends @WldA" +
            -            " java.lang.String> l)
            " - }, - { "typeannos/BoundTest.html", - "
            MyList<? super @WldA java.lang.String>" +
            -            " returnWcSuper()
            " - }, - { "typeannos/BoundWithValue.html", - "
            void wcSuper(MyList<? super @WldB(value=\"m\") java.lang." +
            -            "String> l)
            " - }, - { "typeannos/BoundWithValue.html", - "
            MyList<? extends @WldB(value=\"m\") java.lang.String" +
            -            "> returnWcExtends()
            " - }, + checkOutput("typeannos/BoundTest.html", true, + "
            void wcExtends(MyList<? extends @WldA"
            +                + " java.lang.String> l)
            ", + + "
            MyList<? super @WldA java.lang.String>"
            +                + " returnWcSuper()
            "); + + checkOutput("typeannos/BoundWithValue.html", true, + "
            void wcSuper(MyList<? super @WldB(value=\"m\") java.lang."
            +                + "String> l)
            ", + + "
            MyList<? extends @WldB(value=\"m\") java.lang.String"
            +                + "> returnWcExtends()
            "); // Test for receiver annotations (Receivers.java). - { "typeannos/DefaultUnmodified.html", - "
            void withException(@RcvrA " +
            -            "DefaultUnmodified this)\n" +
            -            "            throws java." +
            -            "lang.Exception
            " - }, - { "typeannos/DefaultUnmodified.html", - "
            java.lang.String nonVoid(@RcvrA @RcvrB" +
            -            "(value=\"m\")" +
            -            " DefaultUnmodified this)
            " - }, - { "typeannos/DefaultUnmodified.html", - "
            <T extends java.lang.Runnable> void accept(" +
            -            "@RcvrA DefaultUnmodified this,\n" +
            -            "                                           T r)\n" +
            -            "                                    throws java.lang.Exception
            " - }, - { "typeannos/PublicModified.html", - "
            public final java.lang.String nonVoid(" +
            -            "@RcvrA PublicModified this)
            " - }, - { "typeannos/PublicModified.html", - "
            public final <T extends java.lang.Runnable> " +
            -            "void accept(@RcvrA PublicModified this,\n" +
            -            "                                                        T r)\n" +
            -            "                                                 throws java.lang.Exception
            " - }, - { "typeannos/WithValue.html", - "
            <T extends java.lang.Runnable> void accept(" +
            -            "@RcvrB(" +
            -            "value=\"m\") WithValue this,\n" +
            -            "                                           T r)\n" +
            -            "                                    throws java.lang.Exception
            " - }, - { "typeannos/WithFinal.html", - "
            java.lang.String nonVoid(@RcvrB(value=\"m\") WithFinal" +
            -            " this)
            " - }, - { "typeannos/WithBody.html", - "
            void field(@RcvrA WithBody this)
            " - }, - { "typeannos/Generic2.html", - "
            void test2(@RcvrA Generic2<X> this)
            " - } - }; + checkOutput("typeannos/DefaultUnmodified.html", true, + "
            void withException(@RcvrA "
            +                + "DefaultUnmodified this)\n"
            +                + "            throws java."
            +                + "lang.Exception
            ", + + "
            java.lang.String nonVoid(@RcvrA @RcvrB"
            +                + "(value=\"m\")"
            +                + " DefaultUnmodified this)
            ", + + "
            <T extends java.lang.Runnable> void accept("
            +                + "@RcvrA DefaultUnmodified this,\n"
            +                + "                                           T r)\n"
            +                + "                                    throws java.lang.Exception
            "); + + checkOutput("typeannos/PublicModified.html", true, + "
            public final java.lang.String nonVoid("
            +                + "@RcvrA PublicModified this)
            ", - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestTypeAnnotations tester = new TestTypeAnnotations(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + "
            public final <T extends java.lang.Runnable> "
            +                + "void accept(@RcvrA PublicModified this,\n"
            +                + "                                                        T r)\n"
            +                + "                                                 throws java.lang.Exception
            "); + + checkOutput("typeannos/WithValue.html", true, + "
            <T extends java.lang.Runnable> void accept("
            +                + "@RcvrB("
            +                + "value=\"m\") WithValue this,\n"
            +                + "                                           T r)\n"
            +                + "                                    throws java.lang.Exception
            "); + + checkOutput("typeannos/WithFinal.html", true, + "
            java.lang.String nonVoid(@RcvrB(value=\"m\") WithFinal"
            +                + " this)
            "); + + checkOutput("typeannos/WithBody.html", true, + "
            void field(@RcvrA WithBody this)
            "); + + checkOutput("typeannos/Generic2.html", true, + "
            void test2(@RcvrA Generic2<X> this)
            "); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testTypeParams/TestTypeParameters.java --- a/langtools/test/com/sun/javadoc/testTypeParams/TestTypeParameters.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testTypeParams/TestTypeParameters.java Fri May 16 02:13:12 2014 -0700 @@ -30,66 +30,61 @@ * class-use pages. The class/annotation pages should check for type * parameter links in the class/annotation signature section when -linksource is set. * @author jamieh - * @library ../lib/ - * @build JavadocTester TestTypeParameters + * @library ../lib + * @build JavadocTester * @run main TestTypeParameters */ public class TestTypeParameters extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS1 = new String[]{ - "-d", OUTPUT_DIR + "-1", "-use", "-sourcepath", SRC_DIR, - "pkg" - }; - private static final String[] ARGS2 = new String[]{ - "-d", OUTPUT_DIR + "-2", "-linksource", "-sourcepath", SRC_DIR, - "pkg" - }; + public static void main(String... args) throws Exception { + TestTypeParameters tester = new TestTypeParameters(); + tester.runTests(); + } + + @Test + void test1() { + javadoc("-d", "out-1", + "-use", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("pkg/C.html", true, + "
            ", + "<T> java.lang.Object"); + + checkOutput("pkg/package-summary.html", true, + "C<E extends Parent>"); - //Input for string search tests. - private static final String[][] TEST1 = { - { "pkg/C.html", - "" - }, - { "pkg/C.html", - "<T> java.lang.Object" - }, - { "pkg/package-summary.html", - "C<E extends Parent>" - }, - { "pkg/class-use/Foo4.html", - "" + - "ClassUseTest3<T extends ParamTest2<java.util.List<? extends " + - "Foo4>>>" - }, - //Nested type parameters - { "pkg/C.html", - "\n" + - "\n" + - "" - }, - }; - private static final String[][] TEST2 = { - { "pkg/ClassUseTest3.html", + checkOutput("pkg/class-use/Foo4.html", true, + "" + + "ClassUseTest3<T extends ParamTest2<java.util.List<? extends " + + "Foo4>>>"); + + // Nested type parameters + checkOutput("pkg/C.html", true, + "\n" + + "\n" + + ""); + } + + + @Test + void test2() { + javadoc("-d", "out-2", + "-linksource", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("pkg/ClassUseTest3.html", true, "public class " + "ClassUseTest3<T extends ParamTest2<java.util.List<? extends " + - "Foo4>>>" - } - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestTypeParameters tester = new TestTypeParameters(); - tester.run(ARGS1, TEST1, NO_TEST); - tester.run(ARGS2, TEST2, NO_TEST); - tester.printSummary(); + "Foo4>>>"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testUnnamedPackage/TestUnnamedPackage.java --- a/langtools/test/com/sun/javadoc/testUnnamedPackage/TestUnnamedPackage.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testUnnamedPackage/TestUnnamedPackage.java Fri May 16 02:13:12 2014 -0700 @@ -27,49 +27,40 @@ * @summary Reference unnamed package as "Unnamed", not empty string. * Generate a package summary for the unnamed package. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestUnnamedPackage * @run main TestUnnamedPackage */ public class TestUnnamedPackage extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, SRC_DIR + "/C.java" - }; + public static void main(String... args) throws Exception { + TestUnnamedPackage tester = new TestUnnamedPackage(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + testSrc("C.java")); + checkExit(Exit.OK); - //Input for string search tests. - private static final String[][] TEST = { - { "package-summary.html", - "

            Package <Unnamed>

            " - }, - { "package-summary.html", - "This is a package comment for the unnamed package." - }, - { "package-summary.html", - "This is a class in the unnamed package." - }, - { "package-tree.html", - "

            Hierarchy For Package <Unnamed>

            " - }, - { "index-all.html", - "title=\"class in <Unnamed>\"" - }, - { "C.html", ""} - }; - private static final String[][] NEGATED_TEST = { - {ERROR_OUTPUT, "BadSource"}, - }; + checkOutput("package-summary.html", true, + "

            Package <Unnamed>

            ", + "This is a package comment for the unnamed package.", + "This is a class in the unnamed package."); + + checkOutput("package-tree.html", true, + "

            Hierarchy For Package <Unnamed>

            "); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestUnnamedPackage tester = new TestUnnamedPackage(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + checkOutput("index-all.html", true, + "title=\"class in <Unnamed>\""); + + checkOutput("C.html", true, + "
            "); + + checkOutput(Output.ERROR, false, + "BadSource"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testUseOption/TestUseOption.java --- a/langtools/test/com/sun/javadoc/testUseOption/TestUseOption.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testUseOption/TestUseOption.java Fri May 16 02:13:12 2014 -0700 @@ -26,100 +26,76 @@ * @bug 4496290 4985072 7006178 7068595 8016328 * @summary A simple test to determine if -use works. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestUseOption * @run main TestUseOption */ public class TestUseOption extends JavadocTester { - //Input for string search tests. - private static final String[] TEST2 = { - "Field in C1.", - "Field in C2.", - "Field in C4.", - "Field in C5.", - "Field in C6.", - "Field in C7.", - "Field in C8.", - "Method in C1.", - "Method in C2.", - "Method in C4.", - "Method in C5.", - "Method in C6.", - "Method in C7.", - "Method in C8.", - }; + public static void main(String... args) throws Exception { + TestUseOption tester = new TestUseOption(); + tester.runTests(); + } - private static final String[][] TEST3 = { - { "class-use/UsedInC.html", - "Uses of " + - "UsedInC in <Unnamed>" - }, - { "package-use.html", - "" - } - }; + @Test + void test1() { + javadoc("-d", "out-1", + "-sourcepath", testSrc, + "-use", + "pkg1", "pkg2"); + checkExit(Exit.OK); - private static final String[][] TEST4 = { - { "pkg2/class-use/C3.html", - "" + - "Frames" + // Eight tests for class use. + for (int i = 1; i <= 8; i++) { + checkOutput("pkg1/class-use/C1.html", true, + "Test " + i + " passes"); } - }; - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-use", "pkg1", "pkg2" - }; - - private static final String[] ARGS2 = new String[] { - "-d", OUTPUT_DIR+"-2", "-sourcepath", SRC_DIR, "-use", "pkg1", "pkg2" - }; + // Three more tests for package use. + for (int i = 1; i <= 3; i++) { + checkOutput("pkg1/package-use.html", true, + "Test " + i + " passes"); + } - private static final String[] ARGS3 = new String[] { - "-d", OUTPUT_DIR + "-3", "-sourcepath", SRC_DIR, "-use", - SRC_DIR + "/C.java", SRC_DIR + "/UsedInC.java" - }; - - private static final String[] ARGS4 = new String[] { - "-d", OUTPUT_DIR + "-4", "-sourcepath", SRC_DIR, "-use", "pkg1", "pkg2" - }; + checkOrder("pkg1/class-use/UsedClass.html", + "Field in C1.", + "Field in C2.", + "Field in C4.", + "Field in C5.", + "Field in C6.", + "Field in C7.", + "Field in C8.", + "Method in C1.", + "Method in C2.", + "Method in C4.", + "Method in C5.", + "Method in C6.", + "Method in C7.", + "Method in C8." + ); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) throws Exception { - String[][] tests = new String[11][2]; - //Eight tests for class use. - for (int i = 0; i < 8; i++) { - tests[i][0] = "pkg1/class-use/C1.html"; - tests[i][1] = "Test " + (i + 1) + " passes"; - } - //Three more tests for package use. - for (int i = 8, j = 1; i < tests.length; i++, j++) { - tests[i][0] = "pkg1/package-use.html"; - tests[i][1] = "Test " + j + " passes"; - } - TestUseOption tester = new TestUseOption(); - tester.run(ARGS, tests, NO_TEST); - tester.printSummary(); - tester.run(ARGS2, NO_TEST, NO_TEST); - String usePageContents = tester.readFileToString("pkg1/class-use/UsedClass.html"); - int prevIndex = -1; - int currentIndex = -1; - for (int i = 0; i < TEST2.length; i++) { - currentIndex = usePageContents.indexOf(TEST2[i]); - System.err.println(TEST2[i] + " at index " + currentIndex); - if (currentIndex < prevIndex) - throw new Exception(TEST2[i] + " is in the wrong order."); - prevIndex = currentIndex; - } - tester.printSummary(); - tester.run(ARGS3, TEST3, NO_TEST); - tester.run(ARGS4, TEST4, NO_TEST); - tester.printSummary(); + checkOutput("pkg2/class-use/C3.html", true, + "" + + "Frames" + ); + } + + @Test + void test2() { + javadoc("-d", "out-2", + "-sourcepath", testSrc, + "-use", + testSrc("C.java"), testSrc("UsedInC.java")); + checkExit(Exit.OK); + + checkOutput("class-use/UsedInC.html", true, + "Uses of " + + "UsedInC in <Unnamed>" + ); + checkOutput("package-use.html", true, + "" + ); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testValueTag/TestValueTag.java --- a/langtools/test/com/sun/javadoc/testValueTag/TestValueTag.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testValueTag/TestValueTag.java Fri May 16 02:13:12 2014 -0700 @@ -27,141 +27,114 @@ * @summary This test ensures that the value tag works in all * use cases. The explainations for each test case are written below. * @author jamieh - * @library ../lib/ - * @build JavadocTester TestValueTag + * @library ../lib + * @build JavadocTester * @run main TestValueTag */ public class TestValueTag extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-tag", - "todo", "pkg1", "pkg2" - }; - - private static final String[] ARGS1 = - new String[] { - "-Xdoclint:none", - "-d", OUTPUT_DIR + "-1", "-sourcepath", SRC_DIR, "-tag", - "todo", "pkg1", "pkg2" - }; - - //Input for string search tests. - private static final String[][] TEST = { - //Base case: using @value on a constant. - { "pkg1/Class1.html", - "Result: \"Test 1 passes\""}, - //Retrieve value of constant in same class. - { "pkg1/Class1.html", - "Result: \"Test 2 passes\""}, - { "pkg1/Class1.html", - "Result: \"Test 3 passes\""}, - { "pkg1/Class1.html", - "Result: \"Test 4 passes\""}, - { "pkg1/Class1.html", - "Result: \"Test 5 passes\""}, - { "pkg1/Class1.html", - "Result: \"Test 6 passes\""}, - //Retrieve value of constant in different class. - { "pkg1/Class2.html", - "Result: \"Test 7 passes\""}, - { "pkg1/Class2.html", - "Result: \"Test 8 passes\""}, - { "pkg1/Class2.html", - "Result: \"Test 9 passes\""}, - { "pkg1/Class2.html", - "Result: \"Test 10 passes\""}, - { "pkg1/Class2.html", - "Result: \"Test 11 passes\""}, - //Retrieve value of constant in different package - { "pkg1/Class2.html", - "Result: \"Test 12 passes\""}, - { "pkg1/Class2.html", - "Result: \"Test 13 passes\""}, - { "pkg1/Class2.html", - "Result: \"Test 14 passes\""}, - { "pkg1/Class2.html", - "Result: \"Test 15 passes\""}, - { "pkg1/Class2.html", - "Result: \"Test 16 passes\""}, - //Retrieve value of constant from a package page - { "pkg2/package-summary.html", - "Result: \"Test 17 passes\""}, - //Test @value tag used with custom tag. - { "pkg1/CustomTagUsage.html", - "
            Todo:
            \n" + - "
            the value of this constant is 55.
            "}, - //Test @value errors printed dues to invalid use or when used with - //non-constant or with bad references. - {ERROR_OUTPUT,"error: value does not refer to a constant\n" + - " * Result: {@value TEST_12_ERROR}" - }, - {ERROR_OUTPUT,"error: {@value} not allowed here\n" + - " * Result: {@value}" - }, - {ERROR_OUTPUT,"error: value does not refer to a constant\n" + - " * Result: {@value NULL}" - }, - {ERROR_OUTPUT,"error: {@value} not allowed here\n" + - " * Invalid (null): {@value}" - }, - {ERROR_OUTPUT,"error: {@value} not allowed here\n" + - " * Invalid (non-constant field): {@value}" - }, - {ERROR_OUTPUT,"error: value does not refer to a constant\n" + - " * Here is a bad value reference: {@value UnknownClass#unknownConstant}" - }, - {ERROR_OUTPUT,"error: reference not found\n" + - " * Here is a bad value reference: {@value UnknownClass#unknownConstant}" - }, - {ERROR_OUTPUT,"error: {@value} not allowed here\n" + - " * @todo the value of this constant is {@value}" - } - }; - private static final String[][] TEST1 = { - //Test @value warning printed when used with non-constant. - {WARNING_OUTPUT,"warning - @value tag (which references nonConstant) " + - "can only be used in constants." - }, - {WARNING_OUTPUT,"warning - @value tag (which references NULL) " + - "can only be used in constants." - }, - {WARNING_OUTPUT,"warning - @value tag (which references TEST_12_ERROR) " + - "can only be used in constants." - }, - //Test warning printed for bad reference. - {WARNING_OUTPUT,"warning - UnknownClass#unknownConstant (referenced by " + - "@value tag) is an unknown reference." - }, - //Test warning printed for invalid use of @value. - {WARNING_OUTPUT,"warning - @value tag cannot be used here." - } - }; - private static final String[][] NEGATED_TEST = { - //Base case: using @value on a constant. - { "pkg1/Class1.html", - "Result: \"Test 12 " + - "generates an error message\""}, - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestValueTag tester = new TestValueTag(); - tester.run(ARGS, TEST, NEGATED_TEST); - checkForException(tester); - tester.run(ARGS1, TEST1, NO_TEST); - checkForException(tester); - tester.printSummary(); + tester.runTests(); } - public static void checkForException(TestValueTag tester) { - if (tester.getErrorOutput().contains("DocletAbortException")) { - throw new AssertionError("javadoc threw DocletAbortException"); - } + @Test + void test1() { + javadoc("-d", "out1", + "-sourcepath", testSrc, + "-tag", "todo", + "pkg1", "pkg2"); + checkExit(Exit.FAILED); + + checkOutput("pkg1/Class1.html", true, + // Base case: using @value on a constant. + "Result: \"Test 1 passes\"", + // Retrieve value of constant in same class. + "Result: \"Test 2 passes\"", + "Result: \"Test 3 passes\"", + "Result: \"Test 4 passes\"", + "Result: \"Test 5 passes\"", + "Result: \"Test 6 passes\""); + + checkOutput("pkg1/Class2.html", true, + // Retrieve value of constant in different class. + "Result: \"Test 7 passes\"", + "Result: \"Test 8 passes\"", + "Result: \"Test 9 passes\"", + "Result: \"Test 10 passes\"", + "Result: \"Test 11 passes\"", + // Retrieve value of constant in different package + "Result: \"Test 12 passes\"", + "Result: \"Test 13 passes\"", + "Result: \"Test 14 passes\"", + "Result: \"Test 15 passes\"", + "Result: \"Test 16 passes\""); + + checkOutput("pkg2/package-summary.html", true, + // Retrieve value of constant from a package page + "Result: \"Test 17 passes\""); + + checkOutput("pkg1/CustomTagUsage.html", true, + // Test @value tag used with custom tag. + "
            Todo:
            \n" + + "
            the value of this constant is 55.
            "); + + checkOutput(Output.ERROR, true, + // Test @value errors printed due to invalid use or when used with + // non-constant or with bad references. + "error: value does not refer to a constant\n" + + " * Result: {@value TEST_12_ERROR}", + "error: {@value} not allowed here\n" + + " * Result: {@value}", + "error: value does not refer to a constant\n" + + " * Result: {@value NULL}", + "error: {@value} not allowed here\n" + + " * Invalid (null): {@value}", + "error: {@value} not allowed here\n" + + " * Invalid (non-constant field): {@value}", + "error: value does not refer to a constant\n" + + " * Here is a bad value reference: {@value UnknownClass#unknownConstant}", + "error: reference not found\n" + + " * Here is a bad value reference: {@value UnknownClass#unknownConstant}", + "error: {@value} not allowed here\n" + + " * @todo the value of this constant is {@value}" + ); + + checkOutput("pkg1/Class1.html", false, + //Base case: using @value on a constant. + "Result: \"Test 12 " + + "generates an error message\""); + + checkForException(); + } + + @Test() + void test2() { + javadoc("-Xdoclint:none", + "-d", "out2", + "-sourcepath", testSrc, + "-tag", "todo", + "pkg1", "pkg2"); + checkExit(Exit.OK); + checkOutput(Output.WARNING, true, + //Test @value warning printed when used with non-constant. + "warning - @value tag (which references nonConstant) " + + "can only be used in constants.", + "warning - @value tag (which references NULL) " + + "can only be used in constants.", + "warning - @value tag (which references TEST_12_ERROR) " + + "can only be used in constants.", + //Test warning printed for bad reference. + "warning - UnknownClass#unknownConstant (referenced by " + + "@value tag) is an unknown reference.", + //Test warning printed for invalid use of @value. + "warning - @value tag cannot be used here." + ); + checkForException(); + } + + void checkForException() { + checkOutput(Output.STDERR, false, "DocletAbortException"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testWarnBadParamNames/TestWarnBadParamNames.java --- a/langtools/test/com/sun/javadoc/testWarnBadParamNames/TestWarnBadParamNames.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testWarnBadParamNames/TestWarnBadParamNames.java Fri May 16 02:13:12 2014 -0700 @@ -24,33 +24,31 @@ /* * @test * @bug 4693440 - * @summary Test to make sure that warning is printed when bad paramenter + * @summary Test to make sure that warning is printed when bad parameter * name is used with param. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestWarnBadParamNames * @run main TestWarnBadParamNames */ public class TestWarnBadParamNames extends JavadocTester { - private static final String[][] TEST = { - {WARNING_OUTPUT, "warning - @param argument \"int\" is not a parameter name."}, - {WARNING_OUTPUT, "warning - @param argument \"IDontExist\" is not a parameter name."}, - {WARNING_OUTPUT, "warning - Parameter \"arg\" is documented more than once."}, - }; - private static final String[] ARGS = new String[] { - "-Xdoclint:none", "-d", OUTPUT_DIR, SRC_DIR + "/C.java" - }; + public static void main(String... args) throws Exception { + TestWarnBadParamNames tester = new TestWarnBadParamNames(); + tester.runTests(); + } - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestWarnBadParamNames tester = new TestWarnBadParamNames(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + @Test + void test() { + javadoc("-Xdoclint:none", + "-d", "out", + testSrc("C.java")); + checkExit(Exit.OK); + + checkOutput(Output.WARNING, true, + "warning - @param argument \"int\" is not a parameter name.", + "warning - @param argument \"IDontExist\" is not a parameter name.", + "warning - Parameter \"arg\" is documented more than once."); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testWarnings/TestWarnings.java --- a/langtools/test/com/sun/javadoc/testWarnings/TestWarnings.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testWarnings/TestWarnings.java Fri May 16 02:13:12 2014 -0700 @@ -30,55 +30,50 @@ * a "link unresolved" warning. * Make sure error message starts with "error -". * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestWarnings * @run main TestWarnings */ public class TestWarnings extends JavadocTester { - - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-Xdoclint:none", "-d", OUTPUT_DIR + "-1", "-sourcepath", SRC_DIR, "pkg" - }; + public static void main(String... args) throws Exception { + TestWarnings tester = new TestWarnings(); + tester.runTests(); + } - private static final String[] ARGS2 = new String[] { - "-Xdoclint:none", "-d", OUTPUT_DIR + "-2", "-private", "-sourcepath", SRC_DIR, - "pkg" - }; + @Test + void testDefault() { + javadoc("-Xdoclint:none", + "-d", "out-default", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.FAILED); // TODO: investigate; suspect bad input HTML - //Input for string search tests. - private static final String[][] TEST = { - {WARNING_OUTPUT, - "X.java:11: warning - Missing closing '}' character for inline tag"}, - {ERROR_OUTPUT, - "package.html: error - Body tag missing from HTML"}, + checkOutput(Output.WARNING, true, + "X.java:11: warning - Missing closing '}' character for inline tag"); + checkOutput(Output.ERROR, true, + "package.html: error - Body tag missing from HTML"); - }; - private static final String[][] NEGATED_TEST = { - { "pkg/X.html", "can't find m()"}, - { "pkg/X.html", "can't find X()"}, - { "pkg/X.html", "can't find f"}, - }; + checkOutput("pkg/X.html", false, + "can't find m()"); + checkOutput("pkg/X.html", false, + "can't find X()"); + checkOutput("pkg/X.html", false, + "can't find f"); + } - private static final String[][] TEST2 = { - { "pkg/X.html", - "m()
            "}, - { "pkg/X.html", - "X()
            "}, - { "pkg/X.html", - "f
            "}, - }; + @Test + void testPrivate() { + javadoc("-Xdoclint:none", + "-d", "out-private", + "-private", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.FAILED); // TODO: investigate; suspect bad input HTML - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestWarnings tester = new TestWarnings(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.run(ARGS2, TEST2, NO_TEST); - tester.printSummary(); + checkOutput("pkg/X.html", true, + "m()
            ", + "X()
            ", + "f
            "); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testWindowTitle/TestWindowTitle.java --- a/langtools/test/com/sun/javadoc/testWindowTitle/TestWindowTitle.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testWindowTitle/TestWindowTitle.java Fri May 16 02:13:12 2014 -0700 @@ -26,180 +26,192 @@ * @bug 8016675 8026736 * @summary Test for window title. * @author Bhavesh Patel - * @library ../lib/ - * @build JavadocTester TestWindowTitle + * @library ../lib + * @build JavadocTester * @run main TestWindowTitle */ - public class TestWindowTitle extends JavadocTester { - //Window title with JavaScript special characters. - private static final String TITLE_JS_CHARS = - "Testing \"Window 'Title'\" with a \\ backslash and a / " + - "forward slash and a \u00e8 unicode char also a tab and also a " + - "\t special character another \u0002 unicode)"; - private static final String[] ARGS_JS_CHARS = new String[]{ - "-d", OUTPUT_DIR + "-1", "-windowtitle", TITLE_JS_CHARS, "-sourcepath", SRC_DIR, "p1", "p2" - }; - private static final String[][] TEST_JS_CHARS = { - { "overview-summary.html", - "parent.document.title=\"Overview (Testing \\\"Window \\\'Title\\\'\\\" " + - "with a \\\\ backslash and a / forward slash and a \\u00E8 unicode char " + - "also a tab and also a \\t special character another \\u0002 unicode))\";" - }, - }; - private static final String[][] NEG_TEST_JS_CHARS = { - { "overview-summary.html", - "parent.document.title=\"Overview (Testing \"Window \'Title\'\" " + - "with a \\ backslash and a / forward slash and a \u00E8 unicode char " + - "also a tab and also a \t special character another \u0002 unicode))\";" - } - }; - - //Window title with a script tag. - private static final String TITLE_SCRIPT_TAG = - "Testing script tag in title ."; - private static final String[] ARGS_SCRIPT_TAG = new String[]{ - "-d", OUTPUT_DIR + "-2", "-windowtitle", TITLE_SCRIPT_TAG, "-sourcepath", SRC_DIR, "p1", "p2" - }; - private static final String[][] TEST_SCRIPT_TAG = { - { "overview-summary.html", - "parent.document.title=\"Overview (Testing script tag in title alert" + - "(\\\"Should not pop up\\\").)\";" - }, - { "p2/C2.html", - "parent.document.title=\"C2 (Testing script tag in title alert" + - "(\\\"Should not pop up\\\").)\";" - } - }; - private static final String[][] NEG_TEST_SCRIPT_TAG = { - { "overview-summary.html", - "parent.document.title=\"Overview (Testing script tag in title .)\";" - }, - { "p2/C2.html", - "parent.document.title=\"C2 (Testing script tag in title .)\";" - } - }; - - //Window title with other HTML tags. - private static final String TITLE_HTML_TAGS = - "Testing another

            HTML

            tag. Another

            tag

            . A " + - "tag with attributes. "; - private static final String[] ARGS_EMPTY_TAGS = new String[]{ - "-d", OUTPUT_DIR + "-5", "-windowtitle", TITLE_EMPTY_TAGS, "-sourcepath", SRC_DIR, "p1", "p2" - }; - private static final String[][] TEST_EMPTY_TAGS = { - { "overview-summary.html", - "parent.document.title=\"Overview\";" - } - }; - private static final String[][] NEG_TEST_EMPTY_TAGS = { - { "overview-summary.html", - "parent.document.title=\"Overview ()\";" - } - }; - - //Window title with unicode characters. - private static final String TITLE_UNICODE_CHARS = - "Testing unicode \u003cscript\u003ealert(\"Should not pop up\")\u003c/script\u003e."; - private static final String[] ARGS_UNICODE_CHARS = new String[]{ - "-d", OUTPUT_DIR + "-6", "-windowtitle", TITLE_UNICODE_CHARS, "-sourcepath", SRC_DIR, "p1", "p2" - }; - private static final String[][] TEST_UNICODE_CHARS = { - { "overview-summary.html", - "parent.document.title=\"Overview (Testing unicode alert(\\\"Should " + - "not pop up\\\").)\";" - } - }; - private static final String[][] NEG_TEST_UNICODE_CHARS = { - { "overview-summary.html", - "parent.document.title=\"Overview (Testing unicode .)\";" - } - }; - - //An empty window title. - private static final String TITLE_EMPTY = - ""; - private static final String[] ARGS_EMPTY_TITLE = new String[]{ - "-d", OUTPUT_DIR + "-7", "-windowtitle", TITLE_EMPTY, "-sourcepath", SRC_DIR, "p1", "p2" - }; - private static final String[][] TEST_EMPTY = { - { "overview-summary.html", - "parent.document.title=\"Overview\";" - } - }; - - //Test doctitle. - private static final String[] ARGS_DOCTITLE = new String[]{ - "-d", OUTPUT_DIR + "-8", "-doctitle", TITLE_JS_CHARS, "-sourcepath", SRC_DIR, "p1", "p2" - }; - private static final String[][] NEG_TEST_DOCTITLE = { - { "overview-summary.html", - "parent.document.title=\"Overview (Testing \\\"Window \\\'Title\\\'\\\" " + - "with a \\\\ backslash and a / forward slash and a \\u00E8 unicode char " + - "also a tab and also a \\t special character another \\u0002 unicode)\";" - }, - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestWindowTitle tester = new TestWindowTitle(); - tester.run(ARGS_JS_CHARS, TEST_JS_CHARS, NEG_TEST_JS_CHARS); - tester.run(ARGS_SCRIPT_TAG, TEST_SCRIPT_TAG, NEG_TEST_SCRIPT_TAG); - tester.run(ARGS_HTML_TAGS, TEST_HTML_TAGS, NEG_TEST_HTML_TAGS); - tester.run(ARGS_HTML_ENTITIES, TEST_HTML_ENTITIES, NEG_TEST_HTML_ENTITIES); - tester.run(ARGS_EMPTY_TAGS, TEST_EMPTY_TAGS, NEG_TEST_EMPTY_TAGS); - tester.run(ARGS_UNICODE_CHARS, TEST_UNICODE_CHARS, NEG_TEST_UNICODE_CHARS); - tester.run(ARGS_EMPTY_TITLE, TEST_EMPTY, NO_TEST); - tester.run(ARGS_DOCTITLE, NO_TEST, NEG_TEST_DOCTITLE); + tester.runTests(); tester.printSummary(); } + + @Test + void testJavaScriptChars() { + // Window title with JavaScript special characters. + String title = "Testing \"Window 'Title'\" with a \\ backslash and a / " + + "forward slash and a \u00e8 unicode char also a tab and also a " + + "\t special character another \u0002 unicode)"; + + javadoc("-d", "out-js-chars", + "-windowtitle", title, + "-sourcepath", testSrc, + "p1", "p2"); + checkExit(Exit.OK); + + checkOutput("overview-summary.html", true, + "parent.document.title=\"Overview (Testing \\\"Window \\\'Title\\\'\\\" " + + "with a \\\\ backslash and a / forward slash and a \\u00E8 unicode char " + + "also a tab and also a \\t special character another \\u0002 unicode))\";" + ); + + checkOutput("overview-summary.html", false, + "parent.document.title=\"Overview (Testing \"Window \'Title\'\" " + + "with a \\ backslash and a / forward slash and a \u00E8 unicode char " + + "also a tab and also a \t special character another \u0002 unicode))\";" + ); + } + + @Test + void testScriptTag() { + // Window title with a script tag. + String title = "Testing script tag in title ."; + + javadoc("-d", "out-script", + "-windowtitle", title, + "-sourcepath", testSrc, + "p1", "p2"); + checkExit(Exit.OK); + + checkOutput("overview-summary.html", true, + "parent.document.title=\"Overview (Testing script tag in title alert" + + "(\\\"Should not pop up\\\").)\";" + ); + + checkOutput("p2/C2.html", true, + "parent.document.title=\"C2 (Testing script tag in title alert" + + "(\\\"Should not pop up\\\").)\";" + ); + + checkOutput("overview-summary.html", false, + "parent.document.title=\"Overview (Testing script tag in title .)\";" + ); + + checkOutput("p2/C2.html", false, + "parent.document.title=\"C2 (Testing script tag in title .)\";" + ); + } + + @Test + void testHtmlTags() { + // Window title with other HTML tags. + String title = "Testing another

            HTML

            tag. Another

            tag

            . A " + + "tag with attributes. "; + + javadoc("-d", "out-empty-tags", + "-windowtitle", title, + "-sourcepath", testSrc, + "p1", "p2"); + + checkOutput("overview-summary.html", true, + "parent.document.title=\"Overview\";" + ); + + checkOutput("overview-summary.html", false, + "parent.document.title=\"Overview ()\";" + ); + } + + @Test + void testUnicode() { + //Window title with unicode characters. + String title = "Testing unicode \u003cscript\u003ealert(\"Should not pop up\")\u003c/script\u003e."; + + javadoc("-d", "out-unicode", + "-windowtitle", title, + "-sourcepath", testSrc, + "p1", "p2"); + checkExit(Exit.OK); + + checkOutput("overview-summary.html", true, + "parent.document.title=\"Overview (Testing unicode alert(\\\"Should " + + "not pop up\\\").)\";" + ); + + checkOutput("overview-summary.html", false, + "parent.document.title=\"Overview (Testing unicode .)\";" + ); + } + + @Test + void testEmpty() { + // An empty window title. + String title = ""; + javadoc("-d", "out-empty", + "-windowtitle", title, + "-sourcepath", testSrc, "p1", "p2"); + checkExit(Exit.OK); + + checkOutput("overview-summary.html", true, + "parent.document.title=\"Overview\";" + ); + } + + @Test + void testDocTitle() { + // Window title with JavaScript special characters, specified with -doctitle + String title = "Testing \"Window 'Title'\" with a \\ backslash and a / " + + "forward slash and a \u00e8 unicode char also a tab and also a " + + "\t special character another \u0002 unicode)"; + + javadoc("-d", "out-doctitle", + "-doctitle", title, + "-sourcepath", testSrc, + "p1", "p2"); + checkExit(Exit.OK); + + checkOutput("overview-summary.html", false, + "parent.document.title=\"Overview (Testing \\\"Window \\\'Title\\\'\\\" " + + "with a \\\\ backslash and a / forward slash and a \\u00E8 unicode char " + + "also a tab and also a \\t special character another \\u0002 unicode)\";" + ); + } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/testXOption/TestXOption.java --- a/langtools/test/com/sun/javadoc/testXOption/TestXOption.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/testXOption/TestXOption.java Fri May 16 02:13:12 2014 -0700 @@ -25,43 +25,48 @@ * @test * @bug 8007687 * @summary Make sure that the -X option works properly. - * @library ../lib/ - * @build JavadocTester TestXOption + * @library ../lib + * @build JavadocTester * @run main TestXOption */ public class TestXOption extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-X", - SRC_DIR + "/TestXOption.java" - }; + public static void main(String... args) throws Exception { + TestXOption tester = new TestXOption(); + tester.runTests(); + } - private static final String[] ARGS2 = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - SRC_DIR + "/TestXOption.java" - }; + @Test + void testWithOption() { + javadoc("-d", "out1", + "-sourcepath", testSrc, + "-X", + testSrc("TestXOption.java")); + checkExit(Exit.OK); + checkOutput(true); + } - private static final String[][] TEST = { - {NOTICE_OUTPUT, "-Xmaxerrs "}, - {NOTICE_OUTPUT, "-Xmaxwarns "}, - {STANDARD_OUTPUT, "-Xdocrootparent "}, - {STANDARD_OUTPUT, "-Xdoclint "}, - {STANDARD_OUTPUT, "-Xdoclint:"}, - }; + @Test + void testWithoutOption() { + javadoc("-d", "out2", + "-sourcepath", testSrc, + testSrc("TestXOption.java")); + checkExit(Exit.OK); + checkOutput(false); + } - //The help option should not crash the doclet. - private static final int EXPECTED_EXIT_CODE = 0; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestXOption tester = new TestXOption(); - int actualExitCode = tester.run(ARGS, TEST, NO_TEST); - tester.checkExitCode(EXPECTED_EXIT_CODE, actualExitCode); - tester.printSummary(); + private void checkOutput(boolean expectFound) { + // TODO: It's an ugly hidden side-effect of the current doclet API + // that the -X output from the tool and the -X output from the doclet + // come out on different streams! + // When we clean up the doclet API, this should be rationalized. + checkOutput(Output.NOTICE, expectFound, + "-Xmaxerrs ", + "-Xmaxwarns "); + checkOutput(Output.STDOUT, expectFound, + "-Xdocrootparent ", + "-Xdoclint ", + "-Xdoclint:"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/com/sun/javadoc/typeAnnotations/smoke/TestSmoke.java --- a/langtools/test/com/sun/javadoc/typeAnnotations/smoke/TestSmoke.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/com/sun/javadoc/typeAnnotations/smoke/TestSmoke.java Fri May 16 02:13:12 2014 -0700 @@ -27,91 +27,84 @@ * @summary Smoke test for ensuring that annotations are emitted to javadoc * * @author Mahmood Ali - * @library ../../lib/ + * @library ../../lib * @ignore * @build JavadocTester - * @build TestSmoke * @run main TestSmoke */ public class TestSmoke extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-private", "-sourcepath", SRC_DIR, "pkg" - }; + public static void main(String... args) throws Exception { + TestSmoke tester = new TestSmoke(); + tester.runTests(); + } - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/T0x1C.html", "@DA"}, - { "pkg/T0x1D.html", "@DA"}, - { "pkg/T0x0D.html", "@DA"}, - { "pkg/T0x06.html", "@DA"}, - { "pkg/T0x0B.html", "@DA"}, - { "pkg/T0x0F.html", "@DA"}, + @Test + void test() { + javadoc("-d", "out", + "-private", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("pkg/T0x1C.html", true, "@DA"); + checkOutput("pkg/T0x1D.html", true, "@DA"); + checkOutput("pkg/T0x0D.html", true, "@DA"); + checkOutput("pkg/T0x06.html", true, "@DA"); + checkOutput("pkg/T0x0B.html", true, "@DA"); + checkOutput("pkg/T0x0F.html", true, "@DA"); /* @ignore 8013406: Test cases fail in javadoc test TestSmoke.java - { "pkg/T0x20.html", "@DA"}, + checkOutput("pkg/T0x20.html", true, "@DA"); */ /* @ignore 8013406: Test cases fail in javadoc test TestSmoke.java - { "pkg/T0x20A.html", "@DTPA"}, + checkOutput("pkg/T0x20A.html", true, "@DTPA"); */ /* @ignore 8013406: Test cases fail in javadoc test TestSmoke.java - { "pkg/T0x20B.html", "@DA"}, + checkOutput("pkg/T0x20B.html", true, "@DA"); */ /* @ignore 8013406: Test cases fail in javadoc test TestSmoke.java - { "pkg/T0x22.html", "@DA"}, + checkOutput("pkg/T0x22.html", true, "@DA"); */ /* @ignore 8013406: Test cases fail in javadoc test TestSmoke.java - { "pkg/T0x22A.html", "@DTPA"}, + checkOutput("pkg/T0x22A.html", true, "@DTPA"); */ /* @ignore 8013406: Test cases fail in javadoc test TestSmoke.java - { "pkg/T0x22B.html", "@DA"}, + checkOutput("pkg/T0x22B.html", true, "@DA"); */ - { "pkg/T0x10.html", "@DA"}, - { "pkg/T0x10A.html", "@DA"}, - { "pkg/T0x12.html", "@DA"}, - { "pkg/T0x11.html", "@DA"}, - { "pkg/T0x13.html", "@DA"}, - { "pkg/T0x15.html", "@DA"}, - { "pkg/T0x14.html", "@DA"}, - { "pkg/T0x16.html", "@DA"} - }; + checkOutput("pkg/T0x10.html", true, "@DA"); + checkOutput("pkg/T0x10A.html", true, "@DA"); + checkOutput("pkg/T0x12.html", true, "@DA"); + checkOutput("pkg/T0x11.html", true, "@DA"); + checkOutput("pkg/T0x13.html", true, "@DA"); + checkOutput("pkg/T0x15.html", true, "@DA"); + checkOutput("pkg/T0x14.html", true, "@DA"); + checkOutput("pkg/T0x16.html", true, "@DA"); - private static final String[][] NEGATED_TEST = { - { "pkg/T0x1C.html", "@A"}, - { "pkg/T0x1D.html", "@A"}, - { "pkg/T0x00.html", "@A"}, - { "pkg/T0x01.html", "@A"}, - { "pkg/T0x02.html", "@A"}, - { "pkg/T0x04.html", "@A"}, - { "pkg/T0x08.html", "@A"}, - { "pkg/T0x0D.html", "@A"}, - { "pkg/T0x06.html", "@A"}, - { "pkg/T0x0B.html", "@A"}, - { "pkg/T0x0F.html", "@A"}, - { "pkg/T0x20.html", "@A"}, - { "pkg/T0x20A.html", "@A"}, - { "pkg/T0x20B.html", "@A"}, - { "pkg/T0x22.html", "@A"}, - { "pkg/T0x22A.html", "@A"}, - { "pkg/T0x22B.html", "@A"}, - { "pkg/T0x10.html", "@A"}, - { "pkg/T0x10A.html", "@A"}, - { "pkg/T0x12.html", "@A"}, - { "pkg/T0x11.html", "@A"}, - { "pkg/T0x13.html", "@A"}, - { "pkg/T0x15.html", "@A"}, - { "pkg/T0x14.html", "@A"}, - { "pkg/T0x16.html", "@A"} - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestSmoke tester = new TestSmoke(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + checkOutput("pkg/T0x1C.html", false, "@A"); + checkOutput("pkg/T0x1D.html", false, "@A"); + checkOutput("pkg/T0x00.html", false, "@A"); + checkOutput("pkg/T0x01.html", false, "@A"); + checkOutput("pkg/T0x02.html", false, "@A"); + checkOutput("pkg/T0x04.html", false, "@A"); + checkOutput("pkg/T0x08.html", false, "@A"); + checkOutput("pkg/T0x0D.html", false, "@A"); + checkOutput("pkg/T0x06.html", false, "@A"); + checkOutput("pkg/T0x0B.html", false, "@A"); + checkOutput("pkg/T0x0F.html", false, "@A"); + checkOutput("pkg/T0x20.html", false, "@A"); + checkOutput("pkg/T0x20A.html", false, "@A"); + checkOutput("pkg/T0x20B.html", false, "@A"); + checkOutput("pkg/T0x22.html", false, "@A"); + checkOutput("pkg/T0x22A.html", false, "@A"); + checkOutput("pkg/T0x22B.html", false, "@A"); + checkOutput("pkg/T0x10.html", false, "@A"); + checkOutput("pkg/T0x10A.html", false, "@A"); + checkOutput("pkg/T0x12.html", false, "@A"); + checkOutput("pkg/T0x11.html", false, "@A"); + checkOutput("pkg/T0x13.html", false, "@A"); + checkOutput("pkg/T0x15.html", false, "@A"); + checkOutput("pkg/T0x14.html", false, "@A"); + checkOutput("pkg/T0x16.html", false, "@A"); } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/tools/javac/T8029569/VarargsAmbiguityCrashTest.java --- a/langtools/test/tools/javac/T8029569/VarargsAmbiguityCrashTest.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/tools/javac/T8029569/VarargsAmbiguityCrashTest.java Fri May 16 02:13:12 2014 -0700 @@ -1,30 +1,8 @@ /* - * Copyright (c) 2013, 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 8029569 + * @test /nodynamiccopyright/ + * @bug 8029569 8037379 * @summary internal javac cast exception when resolving varargs ambiguity + * fix for JDK-8029569 doesn't cover all possible cases * @compile/fail/ref=VarargsAmbiguityCrashTest.out -XDrawDiagnostics VarargsAmbiguityCrashTest.java */ diff -r dca843327b90 -r 97e9abb0864b langtools/test/tools/javac/T8029569/VarargsAmbiguityCrashTest.out --- a/langtools/test/tools/javac/T8029569/VarargsAmbiguityCrashTest.out Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/tools/javac/T8029569/VarargsAmbiguityCrashTest.out Fri May 16 02:13:12 2014 -0700 @@ -1,2 +1,2 @@ -VarargsAmbiguityCrashTest.java:33:9: compiler.err.ref.ambiguous: m2, kindname.method, m2(java.lang.Exception...), VarargsAmbiguityCrashTest, kindname.method, m2(java.lang.Long,java.lang.Exception...), VarargsAmbiguityCrashTest +VarargsAmbiguityCrashTest.java:11:9: compiler.err.ref.ambiguous: m2, kindname.method, m2(java.lang.Exception...), VarargsAmbiguityCrashTest, kindname.method, m2(java.lang.Long,java.lang.Exception...), VarargsAmbiguityCrashTest 1 error diff -r dca843327b90 -r 97e9abb0864b langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/Driver.java --- a/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/Driver.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/Driver.java Fri May 16 02:13:12 2014 -0700 @@ -42,7 +42,7 @@ public class Driver { - private static final PrintStream out = System.out; + private static final PrintStream out = System.err; public static void main(String[] args) throws Exception { if (args.length == 0 || args.length > 1) diff -r dca843327b90 -r 97e9abb0864b langtools/test/tools/javac/api/taskListeners/EventsBalancedTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/api/taskListeners/EventsBalancedTest.java Fri May 16 02:13:12 2014 -0700 @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2014, 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 8040822 + * @summary Check that all TaskEvents are balanced. + */ + +import java.io.*; +import java.net.URI; +import java.util.*; +import java.util.Map.Entry; + +import javax.tools.*; + +import com.sun.source.util.*; +import com.sun.source.util.TaskEvent.Kind; +import com.sun.tools.javac.api.JavacTool; +import com.sun.tools.javac.comp.CompileStates.CompileState; + +public class EventsBalancedTest { + JavacTool tool = (JavacTool) ToolProvider.getSystemJavaCompiler(); + StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null); + + public static void main(String... args) throws IOException { + new EventsBalancedTest().test(); + } + + void test() throws IOException { + TestSource a = new TestSource("B", "class B extends A { }"); + TestSource b = new TestSource("A", "abstract class A { }"); + + test(null, Arrays.asList(a, b)); + test(null, Arrays.asList(b, a)); + test(Arrays.asList("-XD-relax"), Arrays.asList(a, b)); + test(Arrays.asList("-XD-relax"), Arrays.asList(b, a)); + + for (CompileState stop : CompileState.values()) { + test(Arrays.asList("-XDshouldStopPolicyIfNoError=" + stop, + "-XDshouldStopPolicyIfError=" + stop), + Arrays.asList(a, b)); + test(Arrays.asList("-XDshouldStopPolicyIfNoError=" + stop, + "-XDshouldStopPolicyIfError=" + stop), + Arrays.asList(b, a)); + } + } + + void test(Iterable options, Iterable files) throws IOException { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + TestListener listener = new TestListener(); + JavacTask task = tool.getTask(pw, fm, null, options, null, files); + + task.setTaskListener(listener); + + task.call(); + + for (Entry e : listener.kind2Count.entrySet()) { + if (e.getValue() != null && e.getValue() != 0) { + throw new IllegalStateException("Not balanced event: " + e.getKey()); + } + } + } + + static class TestListener implements TaskListener { + final Map kind2Count = new HashMap<>(); + + int get(Kind k) { + Integer count = kind2Count.get(k); + + if (count == null) + kind2Count.put(k, count = 0); + + return count; + } + + @Override + public void started(TaskEvent e) { + kind2Count.put(e.getKind(), get(e.getKind()) + 1); + } + + @Override + public void finished(TaskEvent e) { + int count = get(e.getKind()); + + if (count <= 0) + throw new IllegalStateException("count<=0 for: " + e.getKind()); + + kind2Count.put(e.getKind(), count - 1); + } + + } + static class TestSource extends SimpleJavaFileObject { + final String content; + public TestSource(String fileName, String content) { + super(URI.create("myfo:/" + fileName + ".java"), JavaFileObject.Kind.SOURCE); + this.content = content; + } + + @Override + public CharSequence getCharContent(boolean ignoreEncodingErrors) { + return content; + } + } + +} diff -r dca843327b90 -r 97e9abb0864b langtools/test/tools/javac/generics/inference/T8028503/PrimitiveTypeInBoundForMethodRefTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/inference/T8028503/PrimitiveTypeInBoundForMethodRefTest.java Fri May 16 02:13:12 2014 -0700 @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2014, 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 8028503 + * @summary javac, for method references a primitive type can be added as a bound + * @compile PrimitiveTypeInBoundForMethodRefTest.java + */ + +class PrimitiveTypeInBoundForMethodRefTest { + + interface Mapper { + U map(T t); + } + + static Iterable map(Mapper mapper) { + return null; + } + + static void test() { + Iterable map = map(PrimitiveTypeInBoundForMethodRefTest::length); + } + + public static int length(String s) { + return 0; + } +} diff -r dca843327b90 -r 97e9abb0864b langtools/test/tools/javac/generics/typevars/IntersectionSubVar.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/typevars/IntersectionSubVar.java Fri May 16 02:13:12 2014 -0700 @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2014, 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 8042656 + * @summary Subtyping for intersection types containing type variables + * @compile IntersectionSubVar.java + */ + +class IntersectionSubVar { + + interface Box { + void set(T arg); + T get(); + } + + Box glb(Box arg1, Box arg2) { + return null; + } + + void takeBox(Box box) {} + + void test(Box arg1, Box arg2, Box arg3) { + T t = glb(arg1, arg2).get(); // assign T&Cloneable to T + takeBox(arg3); // inference tests Box <: Box + } + +} diff -r dca843327b90 -r 97e9abb0864b langtools/test/tools/javac/lambda/MethodReference42.out --- a/langtools/test/tools/javac/lambda/MethodReference42.out Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/tools/javac/lambda/MethodReference42.out Fri May 16 02:13:12 2014 -0700 @@ -1,4 +1,4 @@ -MethodReference42.java:38:11: compiler.err.cant.apply.symbol: kindname.method, m1, MethodReference42.SAM1, @811, kindname.class, MethodReference42, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.eq.upper.bounds: X, java.lang.String, java.lang.Number)) -MethodReference42.java:40:11: compiler.err.cant.apply.symbol: kindname.method, m3, MethodReference42.SAM3, @855, kindname.class, MethodReference42, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.eq.upper.bounds: X, java.lang.Object, java.lang.Number)) +MethodReference42.java:38:11: compiler.err.cant.apply.symbol: kindname.method, m1, MethodReference42.SAM1, @811, kindname.class, MethodReference42, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.ret.type.in.lambda: (compiler.misc.incompatible.eq.upper.bounds: X, java.lang.String, java.lang.Number))) +MethodReference42.java:40:11: compiler.err.cant.apply.symbol: kindname.method, m3, MethodReference42.SAM3, @855, kindname.class, MethodReference42, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.ret.type.in.lambda: (compiler.misc.incompatible.eq.upper.bounds: X, java.lang.Object, java.lang.Number))) MethodReference42.java:41:9: compiler.err.ref.ambiguous: m4, kindname.method, m4(MethodReference42.SAM2), MethodReference42, kindname.method, m4(MethodReference42.SAM3), MethodReference42 3 errors diff -r dca843327b90 -r 97e9abb0864b langtools/test/tools/javac/lambda/MethodReference44.out --- a/langtools/test/tools/javac/lambda/MethodReference44.out Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/tools/javac/lambda/MethodReference44.out Fri May 16 02:13:12 2014 -0700 @@ -1,4 +1,4 @@ -MethodReference44.java:40:11: compiler.err.cant.apply.symbol: kindname.method, g1, MethodReference44.SAM1, @864, kindname.class, MethodReference44, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.eq.upper.bounds: X, java.lang.String, java.lang.Number)) -MethodReference44.java:42:11: compiler.err.cant.apply.symbol: kindname.method, g3, MethodReference44.SAM3, @932, kindname.class, MethodReference44, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.eq.upper.bounds: X, java.lang.Object, java.lang.Number)) +MethodReference44.java:40:11: compiler.err.cant.apply.symbol: kindname.method, g1, MethodReference44.SAM1, @864, kindname.class, MethodReference44, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.ret.type.in.lambda: (compiler.misc.incompatible.eq.upper.bounds: X, java.lang.String, java.lang.Number))) +MethodReference44.java:42:11: compiler.err.cant.apply.symbol: kindname.method, g3, MethodReference44.SAM3, @932, kindname.class, MethodReference44, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.ret.type.in.lambda: (compiler.misc.incompatible.eq.upper.bounds: X, java.lang.Object, java.lang.Number))) MethodReference44.java:43:9: compiler.err.ref.ambiguous: g4, kindname.method, g4(MethodReference44.SAM2), MethodReference44, kindname.method, g4(MethodReference44.SAM3), MethodReference44 3 errors diff -r dca843327b90 -r 97e9abb0864b langtools/test/tools/javac/lambda/MostSpecific10.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/lambda/MostSpecific10.java Fri May 16 02:13:12 2014 -0700 @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2014, 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 8034223 + * @summary Structural most-specific logic for lambdas, method refs, parens, and conditionals + * @compile MostSpecific10.java + */ +class MostSpecific10 { + + interface GetInt { + int get(); + } + + interface GetInteger { + Integer get(); + } + + void m(GetInt getter) {} + void m(GetInteger getter) {} + + void test(boolean cond) { + m(() -> 23); + m("abc"::length); + m(( () -> 23 )); + m(( "abc"::length )); + m(cond ? () -> 23 : "abc"::length); + m(( cond ? () -> 23 : "abc"::length )); + m(cond ? (() -> 23) : ("abc"::length) ); + m(( cond ? () -> 23 : cond ? ("abc"::length) : (() -> 23) )); + } + +} diff -r dca843327b90 -r 97e9abb0864b langtools/test/tools/javac/lambda/MostSpecific11.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/lambda/MostSpecific11.java Fri May 16 02:13:12 2014 -0700 @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2014, 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 8034223 + * @summary Return type Object is not more specific than return type String + * @compile MostSpecific11.java + */ +class MostSpecific11 { + + interface I { Object run(); } + interface J { String run(); } + + void m(I arg) {} + void m(J arg) {} + + void test() { + m(() -> { throw new RuntimeException(); }); + } + +} diff -r dca843327b90 -r 97e9abb0864b langtools/test/tools/javac/lambda/MostSpecific12.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/lambda/MostSpecific12.java Fri May 16 02:13:12 2014 -0700 @@ -0,0 +1,38 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8034223 + * @summary Most-specific testing with inference variables in function parameter types + * @compile/fail/ref=MostSpecific12.out -XDrawDiagnostics MostSpecific12.java + */ +class MostSpecific12 { + + interface I { void take(T arg1, String arg2); } + interface J { void take(String arg1, T arg2); } + interface K { void take(String arg1, String arg2); } + + void m1(I arg) {} + void m1(K arg) {} + + void m2(J arg) {} + void m2(K arg) {} + + void m3(I arg) {} + void m3(J arg) {} + + void test() { + m1((String s1, String s2) -> {}); // ok + m2((String s1, String s2) -> {}); // ok + m3((String s1, String s2) -> {}); // error + + m1(this::referencedMethod); // ok + m2(this::referencedMethod); // ok + m3(this::referencedMethod); // error + + m1(String::compareTo); // ok + m2(String::compareTo); // ok + m3(String::compareTo); // error + } + + void referencedMethod(String s1, String s2) {} + +} diff -r dca843327b90 -r 97e9abb0864b langtools/test/tools/javac/lambda/MostSpecific12.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/lambda/MostSpecific12.out Fri May 16 02:13:12 2014 -0700 @@ -0,0 +1,4 @@ +MostSpecific12.java:25:9: compiler.err.ref.ambiguous: m3, kindname.method, m3(MostSpecific12.I), MostSpecific12, kindname.method, m3(MostSpecific12.J), MostSpecific12 +MostSpecific12.java:29:9: compiler.err.ref.ambiguous: m3, kindname.method, m3(MostSpecific12.I), MostSpecific12, kindname.method, m3(MostSpecific12.J), MostSpecific12 +MostSpecific12.java:33:9: compiler.err.ref.ambiguous: m3, kindname.method, m3(MostSpecific12.I), MostSpecific12, kindname.method, m3(MostSpecific12.J), MostSpecific12 +3 errors diff -r dca843327b90 -r 97e9abb0864b langtools/test/tools/javac/lambda/MostSpecific13.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/lambda/MostSpecific13.java Fri May 16 02:13:12 2014 -0700 @@ -0,0 +1,21 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8034223 + * @summary Most-specific testing with inference variables in function parameter types + * @compile/fail/ref=MostSpecific13.out -XDrawDiagnostics MostSpecific13.java + */ +class MostSpecific13 { + + interface UnaryOp { T apply(T arg); } + interface IntegerToNumber { Number apply(Integer arg); } + + void m(UnaryOp f) {} + void m(IntegerToNumber f) {} + + void test() { + m((Integer i) -> i); // error + m(this::id); // error + } + + Integer id(Integer arg) { return arg; } +} \ No newline at end of file diff -r dca843327b90 -r 97e9abb0864b langtools/test/tools/javac/lambda/MostSpecific13.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/lambda/MostSpecific13.out Fri May 16 02:13:12 2014 -0700 @@ -0,0 +1,3 @@ +MostSpecific13.java:16:9: compiler.err.ref.ambiguous: m, kindname.method, m(MostSpecific13.UnaryOp), MostSpecific13, kindname.method, m(MostSpecific13.IntegerToNumber), MostSpecific13 +MostSpecific13.java:17:9: compiler.err.ref.ambiguous: m, kindname.method, m(MostSpecific13.UnaryOp), MostSpecific13, kindname.method, m(MostSpecific13.IntegerToNumber), MostSpecific13 +2 errors diff -r dca843327b90 -r 97e9abb0864b langtools/test/tools/javac/lambda/MostSpecific14.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/lambda/MostSpecific14.java Fri May 16 02:13:12 2014 -0700 @@ -0,0 +1,33 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8034223 + * @summary Most-specific testing for nested functional interface types + * @compile/fail/ref=MostSpecific14.out -XDrawDiagnostics MostSpecific14.java + */ +class MostSpecific14 { + interface ToNumber { Number get(); } + interface ToToNumber { ToNumber get(); } + interface Factory { T get(); } + + void m1(Factory> f) {} + void m1(ToToNumber f) {} + + void m2(Factory> f) {} + void m2(ToToNumber f) {} + + void m3(Factory> f) {} + void m3(ToToNumber f) {} + + + void test() { + m1(() -> () -> 23); // ok: choose ToToNumber + m2(() -> () -> 23); // error: ambiguous + m3(() -> () -> 23); // ok: choose Factory> + + m1(() -> this::getInteger); // ok: choose ToToNumber + m2(() -> this::getInteger); // error: ambiguous + m3(() -> this::getInteger); // ok: choose Factory> + } + + Integer getInteger() { return 23; } +} \ No newline at end of file diff -r dca843327b90 -r 97e9abb0864b langtools/test/tools/javac/lambda/MostSpecific14.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/lambda/MostSpecific14.out Fri May 16 02:13:12 2014 -0700 @@ -0,0 +1,3 @@ +MostSpecific14.java:24:9: compiler.err.ref.ambiguous: m2, kindname.method, m2(MostSpecific14.Factory>), MostSpecific14, kindname.method, m2(MostSpecific14.ToToNumber), MostSpecific14 +MostSpecific14.java:28:9: compiler.err.ref.ambiguous: m2, kindname.method, m2(MostSpecific14.Factory>), MostSpecific14, kindname.method, m2(MostSpecific14.ToToNumber), MostSpecific14 +2 errors diff -r dca843327b90 -r 97e9abb0864b langtools/test/tools/javac/lambda/TargetType16.java --- a/langtools/test/tools/javac/lambda/TargetType16.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/tools/javac/lambda/TargetType16.java Fri May 16 02:13:12 2014 -0700 @@ -1,9 +1,9 @@ /* * @test /nodynamiccopyright/ - * @bug 8003280 + * @bug 8003280 8034223 * @summary Add lambda tests * Check void-compatibility in strict vs. loose conversion contexts - * @compile/fail/ref=TargetType16.out -XDrawDiagnostics TargetType16.java + * @compile TargetType16.java */ class TargetType16 { @@ -20,6 +20,6 @@ static void m(SAM2 s2) { } public static void main(String[] args) { - m(() -> { throw new AssertionError(); }); //ambiguous + m(() -> { throw new AssertionError(); }); // prefer SAM2 } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/tools/javac/lambda/TargetType16.out --- a/langtools/test/tools/javac/lambda/TargetType16.out Thu May 15 11:35:26 2014 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2 +0,0 @@ -TargetType16.java:23:9: compiler.err.ref.ambiguous: m, kindname.method, m(TargetType16.SAM1), TargetType16, kindname.method, m(TargetType16.SAM2), TargetType16 -1 error diff -r dca843327b90 -r 97e9abb0864b langtools/test/tools/javac/lambda/TargetType23.java --- a/langtools/test/tools/javac/lambda/TargetType23.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/tools/javac/lambda/TargetType23.java Fri May 16 02:13:12 2014 -0700 @@ -31,7 +31,12 @@ void call(Sam2 s) { } void call(Sam3 s) { } + void call2(Sam0 s) { } + void call2(Sam2 s) { } + void call2(Sam3 s) { } + void test() { - call(()-> { throw new RuntimeException(); }); //ambiguous - both call(Sam0), call(Sam2), call(Sam3) match + call(()-> { throw new RuntimeException(); }); // ambiguous - call(Sam1) vs. call(Sam2) + call2(()-> { throw new RuntimeException(); }); // ok } } diff -r dca843327b90 -r 97e9abb0864b langtools/test/tools/javac/lambda/TargetType23.out --- a/langtools/test/tools/javac/lambda/TargetType23.out Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/tools/javac/lambda/TargetType23.out Fri May 16 02:13:12 2014 -0700 @@ -1,2 +1,2 @@ -TargetType23.java:35:9: compiler.err.ref.ambiguous: call, kindname.method, call(TargetType23.Sam2), TargetType23, kindname.method, call(TargetType23.Sam3), TargetType23 +TargetType23.java:39:9: compiler.err.ref.ambiguous: call, kindname.method, call(TargetType23.Sam1), TargetType23, kindname.method, call(TargetType23.Sam2), TargetType23 1 error diff -r dca843327b90 -r 97e9abb0864b langtools/test/tools/javac/options/xprefer/XPreferTest.java --- a/langtools/test/tools/javac/options/xprefer/XPreferTest.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/tools/javac/options/xprefer/XPreferTest.java Fri May 16 02:13:12 2014 -0700 @@ -26,6 +26,7 @@ * @summary Tests which path is used to represent an implicit type given * various xprefer arguments and multiple .class / .java files involved. * @bug 8028196 + * @ignore 8042839 XPreferTest fails on Windows */ import java.io.File; diff -r dca843327b90 -r 97e9abb0864b langtools/test/tools/javac/resolve/AmbiguityErrorTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/resolve/AmbiguityErrorTest.java Fri May 16 02:13:12 2014 -0700 @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2014, 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 8041663 + */ + +public class AmbiguityErrorTest { + + public interface A { } + + public interface B extends A { } + + public interface C { + A m(B strategy); + } + + public interface D { + A m(A strategy); + A m(B strategy); + } + + public interface T1 extends C, D { } + public interface T2 extends D, C { } + + int count; + + class T1Impl implements T1, T2 { + public A m(B strategy) { + count++; + return null; + } + public A m(A strategy) { + throw new AssertionError("Should not get here."); + } + } + + public static void main(String... args) { + new AmbiguityErrorTest().test(); + } + + void test() { + T1 t1 = new T1Impl(); + T2 t2 = new T1Impl(); + final B b = new B() { }; + t1.m(b); + t2.m(b); + + if (count != 2) { + throw new IllegalStateException("Did not call the methods properly"); + } + } + +} diff -r dca843327b90 -r 97e9abb0864b langtools/test/tools/javac/resolve/ResolveHarness.java --- a/langtools/test/tools/javac/resolve/ResolveHarness.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/tools/javac/resolve/ResolveHarness.java Fri May 16 02:13:12 2014 -0700 @@ -23,8 +23,8 @@ /* * @test - * @bug 7098660 8014649 - * @summary Write better overload resolution/inference tests + * @bug 7098660 8014649 8034223 + * @summary Test harness for overload resolution/inference tests * @library /tools/javac/lib * @build JavacTestingAbstractProcessor ResolveHarness * @run main ResolveHarness diff -r dca843327b90 -r 97e9abb0864b langtools/test/tools/javac/resolve/tests/PrimitiveOverReferenceVarargsAmbiguous.java --- a/langtools/test/tools/javac/resolve/tests/PrimitiveOverReferenceVarargsAmbiguous.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/tools/javac/resolve/tests/PrimitiveOverReferenceVarargsAmbiguous.java Fri May 16 02:13:12 2014 -0700 @@ -23,44 +23,44 @@ @TraceResolve(keys={"compiler.err.ref.ambiguous"}) class PrimitiveOverReferenceVarargsAmbiguous { - @Candidate(applicable=Phase.VARARGS, mostSpecific=true) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_byte(byte... b) {} - @Candidate(applicable=Phase.VARARGS) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_byte(Byte... b) {} - @Candidate(applicable=Phase.VARARGS, mostSpecific=true) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_short(short... s) {} - @Candidate(applicable=Phase.VARARGS) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_short(Short... s) {} - @Candidate(applicable=Phase.VARARGS, mostSpecific=true) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_int(int... i) {} - @Candidate(applicable=Phase.VARARGS) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_int(Integer... i) {} - @Candidate(applicable=Phase.VARARGS, mostSpecific=true) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_long(long... l) {} - @Candidate(applicable=Phase.VARARGS) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_long(Long... l) {} - @Candidate(applicable=Phase.VARARGS, mostSpecific=true) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_float(float... f) {} - @Candidate(applicable=Phase.VARARGS) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_float(Float... f) {} - @Candidate(applicable=Phase.VARARGS, mostSpecific=true) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_double(double... d) {} - @Candidate(applicable=Phase.VARARGS) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_double(Double... d) {} - @Candidate(applicable=Phase.VARARGS, mostSpecific=true) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_char(char... c) {} - @Candidate(applicable=Phase.VARARGS) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_char(Character... c) {} - @Candidate(applicable=Phase.VARARGS, mostSpecific=true) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_bool(boolean... z) {} - @Candidate(applicable=Phase.VARARGS) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_bool(Boolean... z) {} { diff -r dca843327b90 -r 97e9abb0864b langtools/test/tools/javac/resolve/tests/PrimitiveVsReferenceSamePhase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/resolve/tests/PrimitiveVsReferenceSamePhase.java Fri May 16 02:13:12 2014 -0700 @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2014 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. + */ + +@TraceResolve(keys={"compiler.err.ref.ambiguous"}) +class PrimitiveVsReferenceSamePhase { + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_byte(Byte b1, byte b2) {} + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_byte(Byte b1, Byte b2) {} + + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_short(Short s1, short s2) {} + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_short(Short s1, Short s2) {} + + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_int(Integer i1, int i2) {} + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_int(Integer i1, Integer i2) {} + + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_long(Long l1, long l2) {} + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_long(Long l1, Long l2) {} + + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_float(Float f1, float f2) {} + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_float(Float f1, Float f2) {} + + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_double(Double d1, double d2) {} + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_double(Double d1, Double d2) {} + + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_char(Character c1, char c2) {} + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_char(Character c1, Character c2) {} + + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_bool(Boolean z1, boolean z2) {} + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_bool(Boolean z1, Boolean z2) {} + + { + m_byte((byte)0, (byte)0); + m_short((short)0, (short)0); + m_int(0, 0); + m_long(0L, 0L); + m_float(0.0f, 0.0f); + m_double(0.0, 0.0); + m_char('?', '?'); + m_bool(false, false); + } +} diff -r dca843327b90 -r 97e9abb0864b langtools/test/tools/javac/types/TypeHarness.java --- a/langtools/test/tools/javac/types/TypeHarness.java Thu May 15 11:35:26 2014 -0700 +++ b/langtools/test/tools/javac/types/TypeHarness.java Fri May 16 02:13:12 2014 -0700 @@ -255,7 +255,8 @@ public ClassType Class(long flags, Type... typeArgs) { ClassSymbol csym = new ClassSymbol(flags, syntheticName(), predef.noSymbol); - csym.type = new ClassType(Type.noType, List.from(typeArgs), csym); + csym.type = new ClassType(Type.noType, List.from(typeArgs), csym, + Type.noAnnotations); ((ClassType)csym.type).supertype_field = predef.objectType; return (ClassType)csym.type; } @@ -301,7 +302,7 @@ } public ArrayType Array(Type elemType) { - return new ArrayType(elemType, predef.arrayClass); + return new ArrayType(elemType, predef.arrayClass, Type.noAnnotations); } public TypeVar TypeVariable() { @@ -310,16 +311,16 @@ public TypeVar TypeVariable(Type bound) { TypeSymbol tvsym = new TypeVariableSymbol(0, syntheticName(), null, predef.noSymbol); - tvsym.type = new TypeVar(tvsym, bound, null); + tvsym.type = new TypeVar(tvsym, bound, null, Type.noAnnotations); return (TypeVar)tvsym.type; } public WildcardType Wildcard(BoundKind bk, Type bound) { - return new WildcardType(bound, bk, predef.boundClass); + return new WildcardType(bound, bk, predef.boundClass, Type.noAnnotations); } public CapturedType CapturedVariable(Type upper, Type lower) { - return new CapturedType(syntheticName(), predef.noSymbol, upper, lower, null); + return new CapturedType(syntheticName(), predef.noSymbol, upper, lower, null, Type.noAnnotations); } public ClassType Intersection(Type classBound, Type... intfBounds) { diff -r dca843327b90 -r 97e9abb0864b nashorn/.hgtags --- a/nashorn/.hgtags Thu May 15 11:35:26 2014 -0700 +++ b/nashorn/.hgtags Fri May 16 02:13:12 2014 -0700 @@ -246,3 +246,4 @@ 0eaa55c7abe5d96023a4b38a326f411209c43f49 jdk9-b10 4d60c3292e14aac90dc3b8232496ba4af4254cc3 jdk9-b11 282e9a675e079cc84dbfaa4c10050f08397faab0 jdk9-b12 +be4580ae56e2ef0ce521d3f840753eaa83cacf33 jdk9-b13 diff -r dca843327b90 -r 97e9abb0864b nashorn/make/build.xml --- a/nashorn/make/build.xml Thu May 15 11:35:26 2014 -0700 +++ b/nashorn/make/build.xml Fri May 16 02:13:12 2014 -0700 @@ -279,6 +279,10 @@ +grant codeBase "file:/${toString:nashorn.ext.path}/nashorn.jar" { + permission java.security.AllPermission; +}; + grant codeBase "file:/${basedir}/${nashorn.internal.tests.jar}" { permission java.security.AllPermission; };
            <W extends java.lang.String,V extends " + + "java.util.List>
            java.lang.Object
            <W extends java.lang.String,V extends " + - "java.util.List>
            java.lang.Object
            " + - "UsedInC " + + "UsedInC