test/hotspot/jtreg/runtime/SharedArchiveFile/serviceability/ReplaceCriticalClasses.java
author iklam
Wed, 17 Oct 2018 15:57:10 -0700
changeset 52319 625f6c742392
child 52626 991fe09c698c
permissions -rw-r--r--
8212200: assert when shared java.lang.Object is redefined by JVMTI agent Reviewed-by: dholmes, jiangli, hseigel, lfoltan, sspitsyn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52319
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
     1
/*
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
     2
 * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
     4
 *
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
     7
 * published by the Free Software Foundation.
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
     8
 *
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    13
 * accompanied this code).
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    14
 *
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    18
 *
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    21
 * questions.
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    22
 *
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    23
 */
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    24
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    25
/*
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    26
 * @test
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    27
 * @summary Tests how CDS works when critical library classes are replaced with JVMTI ClassFileLoadHook
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    28
 * @library /test/lib
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    29
 * @requires vm.cds
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    30
 * @build sun.hotspot.WhiteBox
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    31
 * @run driver ClassFileInstaller -jar whitebox.jar sun.hotspot.WhiteBox
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    32
 * @run main/othervm/native ReplaceCriticalClasses
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    33
 */
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    34
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    35
import java.util.regex.Matcher;
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    36
import java.util.regex.Pattern;
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    37
import jdk.test.lib.cds.CDSTestUtils;
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    38
import jdk.test.lib.cds.CDSOptions;
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    39
import jdk.test.lib.process.OutputAnalyzer;
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    40
import sun.hotspot.WhiteBox;
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    41
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    42
public class ReplaceCriticalClasses {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    43
    public static void main(String args[]) throws Throwable {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    44
        if (args.length == 0) {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    45
            launchChildProcesses();
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    46
        } else if (args.length == 3 && args[0].equals("child")) {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    47
            Class klass = Class.forName(args[2].replace("/", "."));
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    48
            if (args[1].equals("-shared")) {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    49
                testInChild(true, klass);
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    50
            } else if (args[1].equals("-notshared")) {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    51
                testInChild(false, klass);
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    52
            } else {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    53
                throw new RuntimeException("Unknown child exec option " + args[1]);
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    54
            }
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    55
            return;
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    56
        } else {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    57
            throw new RuntimeException("Usage: @run main/othervm/native ReplaceCriticalClasses");
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    58
        }
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    59
    }
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    60
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    61
    static void launchChildProcesses() throws Throwable {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    62
        String tests[] = {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    63
            // CDS should be disabled -- these critical classes will be replaced
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    64
            // because JvmtiExport::early_class_hook_env() is true.
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    65
            "-early -notshared java/lang/Object",
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    66
            "-early -notshared java/lang/String",
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    67
            "-early -notshared java/lang/Cloneable",
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    68
            "-early -notshared java/io/Serializable",
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    69
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    70
            // CDS should not be disabled -- these critical classes cannot be replaced because
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    71
            // JvmtiExport::early_class_hook_env() is false.
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    72
            "java/lang/Object",
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    73
            "java/lang/String",
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    74
            "java/lang/Cloneable",
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    75
            "java/io/Serializable",
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    76
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    77
            // Try to replace classes that are used by the archived subgraph graphs.
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    78
            "-subgraph java/util/ArrayList",
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    79
            "-subgraph java/lang/module/ResolvedModule",
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    80
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    81
            // Replace classes that are loaded after JVMTI_PHASE_PRIMORDIAL. It's OK to replace such
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    82
            // classes even when CDS is enabled. Nothing bad should happen.
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    83
            "-notshared jdk/internal/vm/PostVMInitHook",
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    84
            "-notshared java/util/Locale",
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    85
            "-notshared sun/util/locale/BaseLocale",
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    86
            "-notshared java/lang/Readable",
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    87
        };
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    88
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    89
        int n = 0;
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    90
        for (String s : tests) {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    91
            System.out.println("Test case[" + (n++) + "] = \"" + s + "\"");
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    92
            String args[] = s.split("\\s+"); // split by space character
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    93
            launchChild(args);
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    94
        }
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    95
    }
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    96
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    97
    static void launchChild(String args[]) throws Throwable {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    98
        if (args.length < 1) {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
    99
            throw new RuntimeException("Invalid test case. Should be <-early> <-subgraph> <-notshared> klassName");
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   100
        }
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   101
        String klassName = null;
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   102
        String early = "";
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   103
        boolean subgraph = false;
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   104
        String shared = "-shared";
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   105
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   106
        for (int i=0; i<args.length-1; i++) {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   107
            String opt = args[i];
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   108
            if (opt.equals("-early")) {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   109
                early = "-early,";
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   110
            } else if (opt.equals("-subgraph")) {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   111
                subgraph = true;
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   112
            } else if (opt.equals("-notshared")) {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   113
                shared = opt;
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   114
            } else {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   115
                throw new RuntimeException("Unknown option: " + opt);
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   116
            }
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   117
        }
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   118
        klassName = args[args.length-1];
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   119
        Class.forName(klassName.replace("/", ".")); // make sure it's a valid class
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   120
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   121
        // We will pass an option like "-agentlib:SimpleClassFileLoadHook=java/util/Locale,XXX,XXX".
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   122
        // The SimpleClassFileLoadHook agent would attempt to hook the java/util/Locale class
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   123
        // but leave the class file bytes unchanged (it replaces all bytes "XXX" with "XXX", i.e.,
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   124
        // a no-op). JVMTI doesn't check the class file bytes returned by the agent, so as long
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   125
        // as the agent returns a buffer, it will not load the class from CDS, and will instead
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   126
        // load the class by parsing the buffer.
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   127
        //
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   128
        // Note that for safety we don't change the contents of the class file bytes. If in the
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   129
        // future JVMTI starts checking the contents of the class file bytes, this test would need
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   130
        // to be updated. (You'd see the test case with java/util/Locale staring to fail).
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   131
        String agent = "-agentlib:SimpleClassFileLoadHook=" + early + klassName + ",XXX,XXX";
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   132
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   133
        CDSOptions opts = (new CDSOptions())
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   134
            .setXShareMode("auto")
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   135
            .setUseSystemArchive(true)
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   136
            .setUseVersion(false)
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   137
            .addSuffix("-showversion",
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   138
                       "-Xlog:cds",
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   139
                       "-XX:+UnlockDiagnosticVMOptions",
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   140
                       agent,
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   141
                       "-XX:+WhiteBoxAPI",
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   142
                       "-Xbootclasspath/a:" + ClassFileInstaller.getJarPath("whitebox.jar"));
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   143
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   144
        if (subgraph) {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   145
            opts.addSuffix("-Xlog:cds+heap",
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   146
                           "-Xlog:class+load");
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   147
        }
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   148
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   149
        opts.addSuffix("ReplaceCriticalClasses",
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   150
                       "child",
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   151
                       shared,
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   152
                       klassName);
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   153
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   154
        final boolean expectDisable = !early.equals("");
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   155
        final boolean checkSubgraph = subgraph;
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   156
        CDSTestUtils.run(opts).assertNormalExit(out -> {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   157
                if (expectDisable) {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   158
                    out.shouldContain("UseSharedSpaces: CDS is disabled because early JVMTI ClassFileLoadHook is in use.");
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   159
                    System.out.println("CDS disabled as expected");
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   160
                }
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   161
                if (checkSubgraph) {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   162
                    // As of 2018/10/21 the classes in the archived subgraphs won't be
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   163
                    // replaced because all archived subgraphs were loaded in JVMTI_PHASE_PRIMORDIAL.
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   164
                    //
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   165
                    // This is the first class to be loaded after JVMTI has exited JVMTI_PHASE_PRIMORDIAL.
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   166
                    // Make sure no subgraphs are loaded afterwards.
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   167
                    //
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   168
                    // Can't use out.shouldNotMatch() because that doesn't match across multiple lines.
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   169
                    String firstNonPrimordialClass = "jdk.jfr.internal.EventWriter";
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   170
                    String regexp = firstNonPrimordialClass + ".*initialize_from_archived_subgraph";
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   171
                    Pattern regex = Pattern.compile(regexp, Pattern.DOTALL);
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   172
                    Matcher matcher = regex.matcher(out.getStdout());
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   173
                    if (matcher.find()) {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   174
                        out.reportDiagnosticSummary();
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   175
                        throw new RuntimeException("'" + regexp
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   176
                                                   + "' found in stdout: '" + matcher.group() + "' \n");
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   177
                    }
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   178
                }
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   179
            });
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   180
    }
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   181
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   182
    static void testInChild(boolean shouldBeShared, Class klass) {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   183
        WhiteBox wb = WhiteBox.getWhiteBox();
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   184
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   185
        if (shouldBeShared && !wb.isSharedClass(klass)) {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   186
            throw new RuntimeException(klass + " should be shared but but actually is not.");
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   187
        }
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   188
        if (!shouldBeShared && wb.isSharedClass(klass)) {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   189
            throw new RuntimeException(klass + " should not be shared but actually is.");
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   190
        }
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   191
        System.out.println("wb.isSharedClass(klass): " + wb.isSharedClass(klass) + " == " + shouldBeShared);
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   192
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   193
        String strings[] = {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   194
            // interned strings from j.l.Object
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   195
            "@",
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   196
            "nanosecond timeout value out of range",
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   197
            "timeoutMillis value is negative",
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   198
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   199
            // interned strings from j.l.Integer
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   200
            "0",
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   201
            "0X",
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   202
            "0x",
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   203
            "int"
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   204
        };
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   205
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   206
        // Make sure the interned string table is same
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   207
        for (String s : strings) {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   208
            String i = s.intern();
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   209
            if (s != i) {
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   210
                throw new RuntimeException("Interned string mismatch: \"" + s + "\" @ " + System.identityHashCode(s) +
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   211
                                           " vs \"" + i + "\" @ " + System.identityHashCode(i));
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   212
            }
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   213
        }
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   214
        // We have tried to use ClassFileLoadHook to replace critical library classes (which may
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   215
        // may not have succeeded, depending on whether the agent has requested
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   216
        // can_generate_all_class_hook_events/can_generate_early_class_hook_events capabilities).
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   217
        //
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   218
        // In any case, the JVM should have started properly (perhaps with CDS disabled) and
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   219
        // the above operations should succeed.
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   220
        System.out.println("If I can come to here without crashing, things should be OK");
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   221
    }
625f6c742392 8212200: assert when shared java.lang.Object is redefined by JVMTI agent
iklam
parents:
diff changeset
   222
}