test/jdk/java/lang/reflect/Proxy/ProxyGeneratorCombo.java
author rriggs
Wed, 21 Aug 2019 16:19:17 -0400
changeset 57827 425412369353
permissions -rw-r--r--
8207814: (proxy) upgrade the proxy class generator Reviewed-by: mchung
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
57827
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
     1
/*
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
     2
 * Copyright (c) 2011, 2019, Oracle and/or its affiliates. All rights reserved.
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
     4
 *
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
     7
 * published by the Free Software Foundation.
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
     8
 *
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    13
 * accompanied this code).
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    14
 *
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    18
 *
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    21
 * questions.
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    22
 */
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    23
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    24
/*
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    25
 * @test
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    26
 * @summary Proxy Generator Combo tests
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    27
 * @library /test/langtools/tools/javac/lib .
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    28
 * @modules jdk.compiler/com.sun.tools.javac.api
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    29
 *          jdk.compiler/com.sun.tools.javac.code
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    30
 *          jdk.compiler/com.sun.tools.javac.comp
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    31
 *          jdk.compiler/com.sun.tools.javac.main
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    32
 *          jdk.compiler/com.sun.tools.javac.tree
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    33
 *          jdk.compiler/com.sun.tools.javac.util
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    34
 * @build combo.ComboTestHelper
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    35
 * @run main/othervm ProxyGeneratorCombo
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    36
 * @run main/othervm -Djdk.proxy.ProxyGenerator.v49=true ProxyGeneratorCombo
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    37
 */
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    38
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    39
import java.io.IOException;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    40
import java.lang.reflect.InvocationHandler;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    41
import java.lang.reflect.InvocationTargetException;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    42
import java.lang.reflect.Method;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    43
import java.lang.reflect.Modifier;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    44
import java.lang.reflect.Proxy;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    45
import java.lang.reflect.UndeclaredThrowableException;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    46
import java.util.Arrays;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    47
import java.util.ArrayList;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    48
import java.util.Collections;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    49
import java.util.HashMap;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    50
import java.util.HashSet;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    51
import java.util.List;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    52
import java.util.Map;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    53
import java.util.Set;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    54
import java.util.StringJoiner;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    55
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    56
import combo.ComboInstance;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    57
import combo.ComboParameter;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    58
import combo.ComboTask.Result;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    59
import combo.ComboTestHelper;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    60
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    61
public class ProxyGeneratorCombo extends ComboInstance<ProxyGeneratorCombo> {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    62
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    63
    // The unique number to qualify interface names, unique across multiple runs
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    64
    private static int uniqueId = 0;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    65
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    66
    /**
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    67
     * Class Access kinds.
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    68
     */
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    69
    enum ClassAccessKind implements ComboParameter {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    70
        PUBLIC("public"),
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    71
        PACKAGE(""),
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    72
        ;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    73
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    74
        String classAccessTemplate;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    75
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    76
        ClassAccessKind(String classAccessTemplate) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    77
            this.classAccessTemplate = classAccessTemplate;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    78
        }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    79
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    80
        @Override
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    81
        public String expand(String optParameter) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    82
            return classAccessTemplate;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    83
        }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    84
    }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    85
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    86
    /**
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    87
     * Signatures of methods to be tested.
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    88
     */
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    89
    enum MethodsKind implements ComboParameter {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    90
        NONE(""),
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    91
        ZERO("#{METHODACCESS} void zero() #{EXCEPTION};"),
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    92
        ONE("#{METHODACCESS} void one(#{ARG[0]} a) #{EXCEPTION};"),
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    93
        TWO("#{METHODACCESS} void one(#{ARG[0]} b);\n" +
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    94
                "#{METHODACCESS} void two(#{ARG[0]} a, #{ARG[1]} b);"),
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    95
        THREE("#{METHODACCESS} void one(#{ARG[0]} a);\n" +
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    96
                "#{METHODACCESS} void two(#{ARG[0]} a, #{ARG[1]} b);\n" +
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    97
                "#{METHODACCESS} void three(#{ARG[0]} a, #{ARG[1]} b, #{ARG[0]} c);");
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    98
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
    99
        String methodsKindTemplate;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   100
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   101
        MethodsKind(String methodsKindTemplate) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   102
            this.methodsKindTemplate = methodsKindTemplate;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   103
        }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   104
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   105
        @Override
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   106
        public String expand(String optParameter) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   107
            return methodsKindTemplate;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   108
        }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   109
    }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   110
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   111
    /**
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   112
     * Type of arguments to insert in method signatures
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   113
     */
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   114
    enum ArgumentKind implements ComboParameter {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   115
        BOOLEAN("boolean"),
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   116
        BYTE("byte"),
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   117
        CHAR("char"),
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   118
        SHORT("short"),
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   119
        INT("int"),
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   120
        LONG("long"),
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   121
        FLOAT("float"),
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   122
        DOUBLE("double"),
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   123
        STRING("String");
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   124
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   125
        String argumentsKindTemplate;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   126
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   127
        ArgumentKind(String argumentsKindTemplate) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   128
            this.argumentsKindTemplate = argumentsKindTemplate;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   129
        }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   130
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   131
        @Override
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   132
        public String expand(String optParameter) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   133
            return argumentsKindTemplate;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   134
        }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   135
    }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   136
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   137
    /**
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   138
     * Exceptions to be added to zero and one methods.
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   139
     */
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   140
    enum ExceptionKind implements ComboParameter {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   141
        NONE(null),
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   142
        EXCEPTION(java.lang.Exception.class),
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   143
        RUNTIME_EXCEPTION(java.lang.RuntimeException.class),
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   144
        ILLEGAL_ARGUMENT_EXCEPTION(java.lang.IllegalArgumentException.class),
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   145
        IOEXCEPTION(java.io.IOException.class),
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   146
        /**
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   147
         * Used only for throw testing, is empty for throws clause in the source,
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   148
         */
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   149
        UNDECLARED_EXCEPTION(Exception1.class),
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   150
        ;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   151
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   152
        Class<? extends Throwable> exceptionKindClass;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   153
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   154
        ExceptionKind(Class<? extends Throwable> exceptionKindClass) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   155
            this.exceptionKindClass = exceptionKindClass;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   156
        }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   157
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   158
        @Override
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   159
        public String expand(String optParameter) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   160
            return exceptionKindClass == null || exceptionKindClass == Exception1.class
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   161
                    ? "" : "throws " + exceptionKindClass.getName();
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   162
        }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   163
    }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   164
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   165
    /**
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   166
     * Extra interfaces to be added.
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   167
     */
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   168
    enum MultiInterfacesKind implements ComboParameter {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   169
        NONE(new Class<?>[0]),
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   170
        INTERFACE_WITH_EXCEPTION(new Class<?>[] {InterfaceWithException.class}),
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   171
        ;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   172
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   173
        Class<?>[] multiInterfaceClasses;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   174
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   175
        MultiInterfacesKind(Class<?>[] multiInterfaceClasses) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   176
            this.multiInterfaceClasses = multiInterfaceClasses;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   177
        }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   178
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   179
        @Override
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   180
        // Not used for expansion only execution
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   181
        public String expand(String optParameter) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   182
            throw new RuntimeException("NYI");
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   183
        }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   184
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   185
        Class<?>[] classes() {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   186
            return multiInterfaceClasses;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   187
        }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   188
    }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   189
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   190
    @Override
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   191
    public int id() {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   192
        return ++uniqueId;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   193
    }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   194
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   195
    protected void fail(String msg, Throwable thrown) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   196
        super.fail(msg);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   197
        thrown.printStackTrace();
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   198
    }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   199
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   200
    /**
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   201
     * Test interface with a "one(int)" method.
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   202
     */
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   203
    interface InterfaceWithException {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   204
        // The signature must match the ONE MethodsKind above
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   205
        void one(int a) throws RuntimeException, IOException;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   206
    }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   207
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   208
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   209
    /**
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   210
     * Main to generate combinations and run the tests.
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   211
     * @param args unused
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   212
     * @throws Exception In case of failure
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   213
     */
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   214
    public static void main(String... args) throws Exception {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   215
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   216
        // Test variations of access declarations
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   217
        new ComboTestHelper<ProxyGeneratorCombo>()
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   218
                .withDimension("CLASSACCESS", ClassAccessKind.values())
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   219
                .withDimension("METHODACCESS", new ClassAccessKind[]{ClassAccessKind.PUBLIC})
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   220
                .withDimension("METHODS", ProxyGeneratorCombo::saveMethod,
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   221
                        new MethodsKind[] {MethodsKind.NONE, MethodsKind.ZERO, MethodsKind.ONE})
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   222
                .withDimension("ARG[0]", new ArgumentKind[] {ArgumentKind.INT})
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   223
                .withDimension("EXCEPTION", ProxyGeneratorCombo::saveException,
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   224
                        new ExceptionKind[]{ExceptionKind.NONE})
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   225
                .run(ProxyGeneratorCombo::new);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   226
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   227
        // Test variations of argument types
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   228
        new ComboTestHelper<ProxyGeneratorCombo>()
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   229
                .withDimension("CLASSACCESS", new ClassAccessKind[]{ClassAccessKind.PUBLIC})
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   230
                .withDimension("METHODACCESS", new ClassAccessKind[]{ClassAccessKind.PUBLIC})
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   231
                .withDimension("METHODS", ProxyGeneratorCombo::saveMethod,
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   232
                        MethodsKind.values())
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   233
                .withArrayDimension("ARG", ProxyGeneratorCombo::saveArg, 2,
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   234
                        ArgumentKind.values())
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   235
                .withDimension("EXCEPTION", ProxyGeneratorCombo::saveException,
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   236
                        new ExceptionKind[]{ExceptionKind.NONE})
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   237
                .withFilter(ProxyGeneratorCombo::filter)
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   238
                .run(ProxyGeneratorCombo::new);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   239
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   240
        // Test for conflicts in Exceptions on methods with the same signatures
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   241
        new ComboTestHelper<ProxyGeneratorCombo>()
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   242
                .withDimension("CLASSACCESS", new ClassAccessKind[]{ClassAccessKind.PUBLIC})
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   243
                .withDimension("METHODACCESS", new ClassAccessKind[]{ClassAccessKind.PUBLIC})
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   244
                .withDimension("METHODS", ProxyGeneratorCombo::saveMethod, new MethodsKind[] {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   245
                        MethodsKind.ZERO})
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   246
                .withDimension("EXCEPTION", ProxyGeneratorCombo::saveException,
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   247
                        ExceptionKind.values())
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   248
                .withDimension("MULTI_INTERFACES", ProxyGeneratorCombo::saveInterface,
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   249
                        new MultiInterfacesKind[] {MultiInterfacesKind.NONE})
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   250
                .run(ProxyGeneratorCombo::new);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   251
    }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   252
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   253
    /**
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   254
     * Basic template.
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   255
     */
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   256
    String template = "#{CLASSACCESS} interface #{TESTNAME} {\n" +
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   257
            "#{METHODS}" +
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   258
            "}";
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   259
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   260
    // Saved values of Combo values
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   261
    private MultiInterfacesKind currInterface = MultiInterfacesKind.NONE;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   262
    private MethodsKind currMethod = MethodsKind.NONE;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   263
    private ExceptionKind currException = ExceptionKind.NONE;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   264
    private ArgumentKind[] currArgs = new ArgumentKind[0];
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   265
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   266
    void saveInterface(ComboParameter s) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   267
        currInterface = (MultiInterfacesKind)s;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   268
    }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   269
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   270
    void saveMethod(ComboParameter s) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   271
        currMethod = (MethodsKind)s;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   272
    }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   273
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   274
    void saveException(ComboParameter s) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   275
        currException = (ExceptionKind)s;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   276
    }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   277
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   278
    void saveArg(ComboParameter s, int index) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   279
        if (index >= currArgs.length) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   280
            currArgs = Arrays.copyOf(currArgs, index + 1);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   281
        }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   282
        currArgs[index] = (ArgumentKind)s;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   283
    }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   284
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   285
    /**
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   286
     * Filter out needless tests (mostly with more variations of arguments than needed).
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   287
     * @return true to run the test, false if not
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   288
     */
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   289
    boolean filter() {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   290
        if ((currMethod == MethodsKind.NONE || currMethod == MethodsKind.ZERO) &&
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   291
                currArgs.length >= 2) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   292
            return currArgs[0] == ArgumentKind.INT &&
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   293
                currArgs[1] == ArgumentKind.INT;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   294
        }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   295
        if (currMethod == MethodsKind.ONE &&
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   296
                currArgs.length >= 2 ) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   297
            return currArgs[0] == currArgs[1];
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   298
        }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   299
        return true;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   300
    }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   301
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   302
    /**
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   303
     * Generate the source file and compile.
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   304
     * Generate a proxy for the interface and test the resulting Proxy
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   305
     * for the methods, exceptions and handling of a thrown exception
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   306
     * @throws IOException catch all IOException
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   307
     */
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   308
    @Override
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   309
    public void doWork() throws IOException {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   310
        String cp = System.getProperty("test.classes");
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   311
        String ifaceName = "Interface_" + this.id();
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   312
        newCompilationTask()
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   313
                .withSourceFromTemplate(ifaceName, template.replace("#{TESTNAME}", ifaceName))
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   314
                .withOption("-d")
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   315
                .withOption(cp)
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   316
                .generate(this::checkCompile);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   317
        try {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   318
            ClassLoader loader = ClassLoader.getSystemClassLoader();
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   319
            Class<?> tc = Class.forName(ifaceName);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   320
            InvocationHandler handler =
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   321
                    new ProxyHandler(currException.exceptionKindClass);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   322
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   323
            // Construct array of interfaces for the proxy
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   324
            Class<?>[] interfaces = new Class<?>[currInterface.classes().length + 1];
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   325
            interfaces[0] = tc;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   326
            System.arraycopy(currInterface.classes(), 0,
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   327
                    interfaces, 1,
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   328
                    currInterface.classes().length);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   329
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   330
            Object proxy = Proxy.newProxyInstance(loader, interfaces, handler);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   331
            if (!Proxy.isProxyClass(proxy.getClass())) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   332
                fail("generated proxy is not a proxy class");
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   333
                return;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   334
            }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   335
            for (Class<?> i : interfaces) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   336
                if (!i.isAssignableFrom(proxy.getClass())) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   337
                    fail("proxy is not assignable to " + i.getName());
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   338
                }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   339
            }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   340
            try {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   341
                String s = proxy.toString();
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   342
            } catch (Exception ex) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   343
                ex.printStackTrace();
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   344
                fail("proxy.toString() threw an exception");
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   345
            }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   346
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   347
            checkDeclaredProxyExceptions(proxy, interfaces);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   348
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   349
            if (currMethod == MethodsKind.ZERO && currException != ExceptionKind.NONE) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   350
                checkThrowsException(proxy, interfaces);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   351
            }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   352
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   353
        } catch (Exception ex) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   354
            throw new RuntimeException("doWork unexpected", ex);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   355
        }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   356
    }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   357
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   358
    /**
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   359
     * Check that the exceptions declared on the proxy match the declarations for
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   360
     * exceptions from the interfaces.
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   361
     *
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   362
     * @param proxy a proxy object
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   363
     * @param interfaces the interfaces that defined it
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   364
     */
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   365
    void checkDeclaredProxyExceptions(Object proxy, Class<?>[] interfaces) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   366
        var allMethods = allMethods(Arrays.asList(interfaces));
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   367
        Method[] methods = proxy.getClass().getDeclaredMethods();
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   368
        for (Method m : methods) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   369
            String sig = toShortSignature(m);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   370
            var imethods = allMethods.get(sig);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   371
            if (imethods != null) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   372
                var expectedEx = Set.copyOf(Arrays.asList(m.getExceptionTypes()));
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   373
                var exs = Set.copyOf(extractExceptions(imethods));
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   374
                if (!expectedEx.equals(exs)) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   375
                    System.out.printf("mismatch on exceptions for method %s:%nExpected: " +
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   376
                                    "%s%nActual:  %s%n",
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   377
                            sig, expectedEx, exs);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   378
                    fail("Exceptions declared on proxy don't match interface methods");
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   379
                }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   380
            }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   381
        }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   382
    }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   383
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   384
    void checkThrowsException(Object proxy, Class<?>[] interfaces) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   385
        ProxyHandler ph = (ProxyHandler)(Proxy.getInvocationHandler(proxy));
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   386
        try {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   387
            Method m = proxy.getClass().getDeclaredMethod("zero");
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   388
            m.invoke(proxy);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   389
            fail("Missing exception: " + ph.exceptionClass);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   390
        } catch (NoSuchMethodException nsme) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   391
            System.out.printf("No method 'zero()' to test exceptions with%n");
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   392
            for (var cl : interfaces) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   393
                System.out.printf("     i/f %s: %s%n", cl, Arrays.toString(cl.getMethods()));
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   394
            }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   395
            Method[] methods = proxy.getClass().getMethods();
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   396
            System.out.printf("    Proxy methods: %s%n", Arrays.toString(methods));
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   397
            fail("No such method test bug", nsme);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   398
        } catch (InvocationTargetException actual) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   399
            ph.checkThrownException(actual.getTargetException());
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   400
        } catch (IllegalAccessException iae) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   401
            fail("IllegalAccessException", iae);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   402
        }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   403
    }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   404
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   405
    /**
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   406
     * Exceptions known to be supported by all methods with the same signature.
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   407
     * @return a list of universal exception types
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   408
     */
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   409
    private static List<Class<?>> extractExceptions(List<Method> methods) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   410
        // for all methods with the same signature
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   411
        // start with the exceptions from the first method
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   412
        // while there are any exceptions remaining
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   413
        // look at the next method
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   414
        List<Class<?>> exceptions = null;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   415
        for (Method m : methods) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   416
            var e = m.getExceptionTypes();
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   417
            if (e.length == 0)
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   418
                return emptyClassList();
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   419
            List<Class<?>> elist = Arrays.asList(e);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   420
            if (exceptions == null) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   421
                exceptions = elist;    // initialize to first method exceptions
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   422
            } else {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   423
                // for each exception
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   424
                // if it is compatible (both ways) with any of the existing exceptions continue
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   425
                //    else remove the current exception
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   426
                var okExceptions = new HashSet<Class<?>>();
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   427
                for (int j = 0; j < exceptions.size(); j++) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   428
                    var ex = exceptions.get(j);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   429
                    for (int i = 0; i < elist.size();i++) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   430
                        var ci = elist.get(i);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   431
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   432
                        if (ci.isAssignableFrom(ex)) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   433
                            okExceptions.add(ex);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   434
                        }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   435
                        if (ex.isAssignableFrom(ci)) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   436
                            okExceptions.add(ci);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   437
                        }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   438
                    }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   439
                }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   440
                if (exceptions.isEmpty()) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   441
                    // The empty set terminates the search for a common set of exceptions
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   442
                    return emptyClassList();
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   443
                }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   444
                // Use the new set for the next iteration
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   445
                exceptions = List.copyOf(okExceptions);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   446
            }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   447
        }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   448
        return (exceptions == null) ? emptyClassList() : exceptions;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   449
    }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   450
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   451
    /**
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   452
     * An empty correctly typed list of classes.
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   453
     * @return An empty typed list of classes
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   454
     */
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   455
    @SuppressWarnings("unchecked")
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   456
    static List<Class<?>> emptyClassList() {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   457
        return Collections.EMPTY_LIST;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   458
    }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   459
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   460
    /**
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   461
     * Accumulate all of the unique methods.
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   462
     *
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   463
     * @param interfaces a list of interfaces
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   464
     * @return a map from signature to List of methods, unique by signature
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   465
     */
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   466
    private static Map<String, List<Method>> allMethods(List<Class<?>> interfaces) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   467
        Map<String, List<Method>> methods = new HashMap<>();
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   468
        for (Class<?> c : interfaces) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   469
            for (Method m : c.getMethods()) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   470
                if (!Modifier.isStatic(m.getModifiers())) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   471
                    String sig = toShortSignature(m);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   472
                    methods.computeIfAbsent(sig, s -> new ArrayList<Method>())
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   473
                            .add(m);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   474
                }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   475
            }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   476
        }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   477
        return methods;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   478
    }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   479
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   480
    /**
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   481
     * The signature of a method without the return type.
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   482
     * @param m a Method
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   483
     * @return the signature with method name and parameters
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   484
     */
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   485
    static String toShortSignature(Method m) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   486
        StringJoiner sj = new StringJoiner(",", m.getName() + "(", ")");
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   487
        for (Class<?> parameterType : m.getParameterTypes()) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   488
            sj.add(parameterType.getTypeName());
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   489
        }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   490
        return sj.toString();
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   491
    }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   492
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   493
    /**
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   494
     * Report any compilation errors.
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   495
     * @param res the result
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   496
     */
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   497
    void checkCompile(Result<?> res) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   498
        if (res.hasErrors()) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   499
            fail("invalid diagnostics for source:\n" +
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   500
                    res.compilationInfo() +
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   501
                    "\nFound error: " + res.hasErrors());
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   502
        }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   503
    }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   504
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   505
    /**
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   506
     * The Handler for the proxy includes the method to invoke the proxy
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   507
     * and the expected exception, if any.
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   508
     */
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   509
    class ProxyHandler implements InvocationHandler {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   510
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   511
        private final Class<? extends Throwable> exceptionClass;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   512
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   513
        ProxyHandler(Class<? extends Throwable> throwable) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   514
            this.exceptionClass = throwable;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   515
        }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   516
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   517
        /**
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   518
         * Invoke a method on the proxy or return a value.
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   519
         * @param   proxy the proxy instance that the method was invoked on
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   520
         * @param   method a method
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   521
         * @param   args some args
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   522
         * @return
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   523
         * @throws Throwable a throwable
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   524
         */
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   525
        @Override
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   526
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   527
            if (method.getName().equals("toString")) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   528
                return "Proxy" + System.identityHashCode(proxy);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   529
            }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   530
            if (method.getName().equals("zero")) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   531
                if (exceptionClass != null) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   532
                    throw exceptionClass.getDeclaredConstructor().newInstance();
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   533
                }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   534
            }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   535
            return "meth: " + method.toString();
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   536
        }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   537
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   538
        /**
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   539
         * Check that the expected exception was thrown.
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   540
         * Special case is handled for Exception1 which does not appear in the
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   541
         * throws clause of the method so UndeclaredThrowableException is expected.
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   542
         */
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   543
        void checkThrownException(Throwable thrown) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   544
            if (exceptionClass == Exception1.class &&
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   545
                    thrown instanceof UndeclaredThrowableException &&
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   546
                    ((UndeclaredThrowableException)thrown).getUndeclaredThrowable() instanceof Exception1) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   547
                // Exception1 caused UndeclaredThrowableException
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   548
                return;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   549
            } else if (exceptionClass == Exception1.class) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   550
                fail("UndeclaredThrowableException", thrown);
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   551
            }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   552
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   553
            if (exceptionClass != null &&
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   554
                    !exceptionClass.equals(thrown.getClass())) {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   555
                throw new RuntimeException("Wrong exception thrown: expected: " + exceptionClass +
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   556
                        ", actual: " + thrown.getClass());
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   557
            }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   558
        }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   559
    }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   560
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   561
    /**
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   562
     * Exception to be thrown as a test of InvocationTarget.
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   563
     */
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   564
    static class Exception1 extends Exception {
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   565
        private static final long serialVersionUID = 1L;
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   566
        Exception1() {}
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   567
    }
425412369353 8207814: (proxy) upgrade the proxy class generator
rriggs
parents:
diff changeset
   568
}