test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/TestAddDeleteMethods.java
author sspitsyn
Tue, 30 Apr 2019 01:56:28 -0700
changeset 54651 e6e327553024
parent 54585 3452d108d06d
permissions -rw-r--r--
8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated Summary: Mark new option depricated Reviewed-by: dcubed, coleenp, dholmes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
54585
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
     1
/*
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
     2
 * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
     4
 *
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
     7
 * published by the Free Software Foundation.
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
     8
 *
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    13
 * accompanied this code).
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    14
 *
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    18
 *
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    21
 * questions.
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    22
 */
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    23
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    24
/*
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    25
 * @test
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    26
 * @bug 8192936
54651
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    27
 * @requires os.family != "solaris"
54585
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    28
 * @summary RI does not follow the JVMTI RedefineClasses spec; need to disallow adding and deleting methods
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    29
 * @library /test/lib
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    30
 * @modules java.base/jdk.internal.misc
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    31
 * @modules java.compiler
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    32
 *          java.instrument
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    33
 *          jdk.jartool/sun.tools.jar
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    34
 * @run main RedefineClassHelper
54651
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    35
 * @run main/othervm -javaagent:redefineagent.jar TestAddDeleteMethods AllowAddDelete=no
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    36
 * @run main/othervm -javaagent:redefineagent.jar -XX:+AllowRedefinitionToAddDeleteMethods TestAddDeleteMethods AllowAddDelete=yes
54585
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    37
 */
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    38
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    39
import static jdk.test.lib.Asserts.assertEquals;
54651
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    40
import java.lang.Runnable;
54585
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    41
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    42
// package access top-level class to avoid problem with RedefineClassHelper
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    43
// and nested types.
54651
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    44
class A implements Runnable {
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    45
    private        void foo()       { System.out.println(" OLD foo called"); }
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    46
    public         void publicFoo() { System.out.println(" OLD publicFoo called"); }
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    47
    private final  void finalFoo()  { System.out.println(" OLD finalFoo called");  }
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    48
    private static void staticFoo() { System.out.println(" OLD staticFoo called"); }
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    49
    public         void run()       { foo(); publicFoo(); finalFoo(); staticFoo(); }
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    50
}
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    51
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    52
class B implements Runnable {
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    53
    public         void run() { }
54585
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    54
}
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    55
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    56
public class TestAddDeleteMethods {
54651
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    57
    static private boolean allowAddDeleteMethods = false;
54585
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    58
54651
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    59
    static private A a;
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    60
    static private B b;
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    61
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    62
    // This redefinition is expected to always succeed.
54585
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    63
    public static String newA =
54651
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    64
        "class A implements Runnable {" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    65
            "private        void foo()       { System.out.println(\" NEW foo called\"); }" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    66
            "public         void publicFoo() { System.out.println(\" NEW publicFoo called\"); }" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    67
            "private final  void finalFoo()  { System.out.println(\" NEW finalFoo called\");  }" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    68
            "private static void staticFoo() { System.out.println(\" NEW staticFoo called\"); }" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    69
            "public         void run()       { foo(); publicFoo(); finalFoo(); staticFoo(); }" +
54585
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    70
        "}";
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    71
54651
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    72
    // This redefinition is expected to always fail.
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    73
    public static String ADeleteFoo =
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    74
        "class A implements Runnable {" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    75
            "public         void publicFoo() { System.out.println(\" NEW publicFoo called\"); }" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    76
            "private final  void finalFoo()  { System.out.println(\" NEW finalFoo called\");  }" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    77
            "private static void staticFoo() { System.out.println(\" NEW staticFoo called\"); }" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    78
            "public         void run()       { publicFoo(); finalFoo(); staticFoo(); }" +
54585
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    79
        "}";
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    80
54651
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    81
    // This redefinition is expected to always fail.
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    82
    public static String ADeletePublicFoo =
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    83
        "class A implements Runnable {" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    84
            "private        void foo()       { System.out.println(\" NEW foo called\"); }" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    85
            "private final  void finalFoo()  { System.out.println(\" NEW finalFoo called\");  }" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    86
            "private static void staticFoo() { System.out.println(\" NEW staticFoo called\"); }" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    87
            "public         void run()       { foo(); finalFoo(); staticFoo(); }" +
54585
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    88
        "}";
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
    89
54651
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    90
    // This redefinition is expected to succeed with option -XX:+AllowRedefinitionToAddDeleteMethods.
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    91
    public static String ADeleteFinalFoo =
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    92
        "class A implements Runnable {" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    93
            "private        void foo()       { System.out.println(\" NEW foo called\"); }" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    94
            "public         void publicFoo() { System.out.println(\" NEW publicFoo called\"); }" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    95
            "private static void staticFoo() { System.out.println(\" NEW staticFoo called\"); }" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    96
            "public         void run()       { foo(); publicFoo(); staticFoo(); }" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    97
        "}";
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    98
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
    99
    // This redefinition is expected to succeed with option -XX:+AllowRedefinitionToAddDeleteMethods.
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   100
    // With compatibility option redefinition ADeleteFinalFoo already deleted finalFoo method.
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   101
    // So, this redefinition will add it back which is expected to work.
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   102
    public static String ADeleteStaticFoo =
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   103
        "class A implements Runnable {" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   104
            "private        void foo()       { System.out.println(\" NEW foo called\"); }" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   105
            "public         void publicFoo() { System.out.println(\" NEW publicFoo called\"); }" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   106
            "private final  void finalFoo()  { System.out.println(\" NEW finalFoo called\");  }" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   107
            "public         void run()       { foo(); publicFoo(); finalFoo(); }" +
54585
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   108
        "}";
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   109
54651
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   110
    // This redefinition is expected to always fail.
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   111
    public static String BAddBar =
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   112
        "class B implements Runnable {" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   113
            "private        void bar()       { System.out.println(\" bar called\"); }" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   114
            "public         void run()       { bar(); }" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   115
        "}";
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   116
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   117
    // This redefinition is expected to always fail.
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   118
    public static String BAddPublicBar =
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   119
        "class B implements Runnable {" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   120
            "public         void publicBar() { System.out.println(\" publicBar called\"); }" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   121
            "public         void run()       { publicBar(); }" +
54585
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   122
        "}";
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   123
54651
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   124
    // This redefinition is expected to succeed with option -XX:+AllowRedefinitionToAddDeleteMethods.
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   125
    public static String BAddFinalBar =
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   126
        "class B implements Runnable {" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   127
            "private final  void finalBar()  { System.out.println(\" finalBar called\"); }" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   128
            "public         void run()       { finalBar(); }" +
54585
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   129
        "}";
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   130
54651
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   131
    // This redefinition is expected to succeed with option -XX:+AllowRedefinitionToAddDeleteMethods.
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   132
    // With compatibility option redefinition BAddFinalBar added finalBar method.
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   133
    // So, this redefinition will deleate it back which is expected to work.
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   134
    public static String BAddStaticBar =
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   135
        "class B implements Runnable {" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   136
            "private static void staticBar() { System.out.println(\" staticBar called\"); }" +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   137
            "public         void run()       { staticBar(); }" +
54585
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   138
        "}";
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   139
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   140
    static private final String ExpMsgPrefix = "attempted to ";
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   141
    static private final String ExpMsgPostfix = " a method";
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   142
54651
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   143
    static private void log(String msg) { System.out.println(msg); }
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   144
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   145
    public static void test(Runnable obj, String newBytes, String expSuffix, String methodName,
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   146
                            boolean expectedRedefToPass) throws Exception {
54585
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   147
        String expectedMessage = ExpMsgPrefix + expSuffix + ExpMsgPostfix;
54651
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   148
        Class klass = obj.getClass();
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   149
        String className = klass.getName();
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   150
        String expResult = expectedRedefToPass ? "PASS" : "FAIL";
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   151
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   152
        log("");
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   153
        log("## Test " + expSuffix + " method \'" + methodName + "\' in class " + className +
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   154
            "; redefinition expected to " + expResult);
54585
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   155
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   156
        try {
54651
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   157
            RedefineClassHelper.redefineClass(klass, newBytes);
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   158
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   159
            if (expectedRedefToPass) {
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   160
                log(" Did not get UOE at redefinition as expected");
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   161
            } else {
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   162
                throw new RuntimeException("Failed, expected UOE");
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   163
            }
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   164
            obj.run();
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   165
            log("");
54585
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   166
        } catch (UnsupportedOperationException uoe) {
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   167
            String message = uoe.getMessage();
54651
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   168
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   169
            if (expectedRedefToPass) {
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   170
                throw new RuntimeException("Failed, unexpected UOE: " + message);
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   171
            } else {
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   172
                log(" Got expected UOE: " + message);
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   173
                if (!message.endsWith(expectedMessage)) {
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   174
                    throw new RuntimeException("Expected UOE error message to end with: " + expectedMessage);
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   175
                }
54585
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   176
            }
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   177
        }
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   178
    }
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   179
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   180
    static {
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   181
        a = new A();
54651
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   182
        b = new B();
54585
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   183
    }
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   184
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   185
    public static void main(String[] args) throws Exception {
54651
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   186
        if (args.length > 0 && args[0].equals("AllowAddDelete=yes")) {
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   187
            allowAddDeleteMethods = true;
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   188
        }
54585
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   189
54651
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   190
        log("## Test original class A");
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   191
        a.run();
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   192
        log("");
54585
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   193
54651
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   194
        log("## Test with modified method bodies in class A; redefinition expected to pass: true");
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   195
        RedefineClassHelper.redefineClass(A.class, newA);
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   196
        a.run();
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   197
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   198
        test(a, ADeleteFoo,       "delete", "foo",       false);
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   199
        test(a, ADeletePublicFoo, "delete", "publicFoo", false);
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   200
        test(a, ADeleteFinalFoo,  "delete", "finalFoo",  allowAddDeleteMethods);
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   201
        test(a, ADeleteStaticFoo, "delete", "staticFoo", allowAddDeleteMethods);
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   202
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   203
        test(b, BAddBar,          "add", "bar",       false);
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   204
        test(b, BAddPublicBar,    "add", "publicBar", false);
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   205
        test(b, BAddFinalBar,     "add", "finalBar",  allowAddDeleteMethods);
e6e327553024 8222934: mark new VM option AllowRedefinitionToAddOrDeleteMethods as deprecated
sspitsyn
parents: 54585
diff changeset
   206
        test(b, BAddStaticBar,    "add", "staticBar", allowAddDeleteMethods);
54585
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   207
    }
3452d108d06d 8192936: RI does not follow the JVMTI RedefineClasses spec that is too strict in the definition
coleenp
parents:
diff changeset
   208
}