author | iklam |
Wed, 17 Oct 2018 15:57:10 -0700 | |
changeset 52319 | 625f6c742392 |
child 52626 | 991fe09c698c |
permissions | -rw-r--r-- |
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 |
} |