31 import jdk.internal.org.objectweb.asm.*;
32
33 /**
34 * The testsets contained in this class are executed by ./VerifierTest_*.java, so that
35 * individual testsets can be executed in parallel to shorten the total time required.
36 */
37 public class VerifierTest implements Opcodes {
38 // Test verification settings for dumping & runtime
39 static final String VFY_ALL = "-Xverify:all";
40 static final String VFY_REMOTE = "-Xverify:remote"; // default
41 static final String VFY_NONE = "-Xverify:none";
42
43 static final String ERR =
44 "ERROR: class VerifierTestC was loaded unexpectedly";
45 static final String MAP_FAIL =
46 "shared archive file was created with less restrictive verification setting";
47 static final String VFY_ERR = "java.lang.VerifyError";
48 static final String PASS_RESULT = "Hi, how are you?";
49 static final String VFY_INFO_MESSAGE =
50 "All non-system classes will be verified (-Xverify:remote) during CDS dump time.";
51
52 enum Testset1Part {
53 A, B
54 }
55
56 public static void main(String[] args) throws Exception {
57 String subCaseId = args[0];
58 String jarName_verifier_test_tmp = "verifier_test_tmp" + "_" + subCaseId;
59 String jarName_verifier_test = "verifier_test" + "_" + subCaseId;
60 String jarName_greet = "greet" + "_" + subCaseId;
61 String jarName_hi = "hi" + "_" + subCaseId;
62
63
64 JarBuilder.build(jarName_verifier_test_tmp, "VerifierTest0", "VerifierTestA",
65 "VerifierTestB", "VerifierTestC", "VerifierTestD", "VerifierTestE",
66 "UnverifiableBase", "UnverifiableIntf", "UnverifiableIntfSub");
67 JarBuilder.build(jarName_greet, "Greet");
68 JarBuilder.build(jarName_hi, "Hi", "Hi$MyClass");
69
70 File dir = new File(System.getProperty("test.classes", "."));
87 "VerifierTestC",
88 "VerifierTestD",
89 "VerifierTestE",
90 "VerifierTest0");
91
92
93 switch (subCaseId) {
94 case "0": testset_0(jar, noAppClasses, appClasses); return;
95 case "1A": testset_1(jar, noAppClasses, appClasses, Testset1Part.A); return;
96 case "1B": testset_1(jar, noAppClasses, appClasses, Testset1Part.B); return;
97 case "2": testset_2(jarName_greet, jarName_hi); return;
98 default:
99 throw new RuntimeException("Unknown option: " + subCaseId);
100 }
101 }
102
103 static void testset_0(String jar, String[] noAppClasses, String[] appClasses) throws Exception {
104 // Dumping should fail if the IgnoreUnverifiableClassesDuringDump
105 // option is not enabled.
106 OutputAnalyzer output = TestCommon.dump(jar, appClasses,
107 "-XX:+UnlockDiagnosticVMOptions",
108 "-XX:-IgnoreUnverifiableClassesDuringDump");
109 output.shouldContain("Please remove the unverifiable classes");
110 output.shouldHaveExitValue(1);
111
112 // By default, bad classes should be ignored during dumping.
113 TestCommon.testDump(jar, appClasses);
114 }
115
116 static void checkRuntimeOutput(OutputAnalyzer output, String expected) throws Exception {
117 output.shouldContain(expected);
118 if (expected.equals(PASS_RESULT) ||
119 expected.equals(VFY_ERR)) {
120 output.shouldHaveExitValue(0);
121 } else {
122 output.shouldNotHaveExitValue(0);
123 }
124 }
125
126 static void testset_1(String jar, String[] noAppClasses, String[] appClasses, Testset1Part part)
169 default:
170 assert part == Testset1Part.B;
171 loop_start = 9;
172 loop_stop = config.length;
173 break;
174 }
175
176 String prev_dump_setting = "";
177 for (int i = loop_start; i < loop_stop; i ++) {
178 String dump_list[] = config[i][0].equals("app") ? appClasses :
179 noAppClasses;
180 String dump_setting = config[i][1];
181 String runtime_setting = config[i][2];
182 String expected_output_str = config[i][3];
183 System.out.println("Test case [" + i + "]: dumping " + config[i][0] +
184 " with " + dump_setting +
185 ", run with " + runtime_setting);
186 if (!dump_setting.equals(prev_dump_setting)) {
187 OutputAnalyzer dumpOutput = TestCommon.dump(
188 jar, dump_list, dump_setting,
189 // FIXME: the following options are for working around a GC
190 // issue - assert failure when dumping archive with the -Xverify:all
191 "-Xms256m",
192 "-Xmx256m");
193 if (dump_setting.equals(VFY_NONE) &&
194 runtime_setting.equals(VFY_REMOTE)) {
195 dumpOutput.shouldContain(VFY_INFO_MESSAGE);
196 }
197 }
198 TestCommon.run("-cp", jar,
199 runtime_setting,
200 "VerifierTest0")
201 .ifNoMappingFailure(output -> checkRuntimeOutput(output, expected_output_str));
202 prev_dump_setting = dump_setting;
203 }
204 }
205
206 static void testset_2(String jarName_greet, String jarName_hi) throws Exception {
207 String appClasses[];
208 String jar;
226 {"app", VFY_ALL, VFY_REMOTE, PASS_RESULT },
227 {"app", VFY_ALL, VFY_ALL, PASS_RESULT },
228 {"app", VFY_ALL, VFY_NONE, PASS_RESULT },
229 // Dump app/ext with -Xverify:none
230 {"app", VFY_NONE, VFY_REMOTE, PASS_RESULT},
231 {"app", VFY_NONE, VFY_ALL, MAP_FAIL},
232 {"app", VFY_NONE, VFY_NONE, PASS_RESULT },
233 };
234 String prev_dump_setting = "";
235 for (int i = 0; i < config2.length; i ++) {
236 // config2[i][0] is always set to "app" in this test
237 String dump_setting = config2[i][1];
238 String runtime_setting = config2[i][2];
239 String expected_output_str = config2[i][3];
240 System.out.println("Test case [" + i + "]: dumping " + config2[i][0] +
241 " with " + dump_setting +
242 ", run with " + runtime_setting);
243 if (!dump_setting.equals(prev_dump_setting)) {
244 OutputAnalyzer dumpOutput = TestCommon.dump(
245 jar, appClasses, dump_setting,
246 // FIXME: the following options are for working around a GC
247 // issue - assert failure when dumping archive with the -Xverify:all
248 "-Xms256m",
249 "-Xmx256m");
250 if (dump_setting.equals(VFY_NONE) &&
251 runtime_setting.equals(VFY_REMOTE)) {
252 dumpOutput.shouldContain(VFY_INFO_MESSAGE);
253 }
254 }
255 TestCommon.run("-cp", jar,
256 runtime_setting,
257 "Hi")
258 .ifNoMappingFailure(output -> checkRuntimeOutput(output, expected_output_str));
259 prev_dump_setting = dump_setting;
260 }
261 }
262
263 static void createTestJarFile(File jarSrcFile, File jarFile) throws Exception {
264 jarFile.delete();
265 Files.copy(jarSrcFile.toPath(), jarFile.toPath());
|
31 import jdk.internal.org.objectweb.asm.*;
32
33 /**
34 * The testsets contained in this class are executed by ./VerifierTest_*.java, so that
35 * individual testsets can be executed in parallel to shorten the total time required.
36 */
37 public class VerifierTest implements Opcodes {
38 // Test verification settings for dumping & runtime
39 static final String VFY_ALL = "-Xverify:all";
40 static final String VFY_REMOTE = "-Xverify:remote"; // default
41 static final String VFY_NONE = "-Xverify:none";
42
43 static final String ERR =
44 "ERROR: class VerifierTestC was loaded unexpectedly";
45 static final String MAP_FAIL =
46 "shared archive file was created with less restrictive verification setting";
47 static final String VFY_ERR = "java.lang.VerifyError";
48 static final String PASS_RESULT = "Hi, how are you?";
49 static final String VFY_INFO_MESSAGE =
50 "All non-system classes will be verified (-Xverify:remote) during CDS dump time.";
51 static final String CDS_LOGGING = "-Xlog:cds,cds+hashtables";
52
53 enum Testset1Part {
54 A, B
55 }
56
57 public static void main(String[] args) throws Exception {
58 String subCaseId = args[0];
59 String jarName_verifier_test_tmp = "verifier_test_tmp" + "_" + subCaseId;
60 String jarName_verifier_test = "verifier_test" + "_" + subCaseId;
61 String jarName_greet = "greet" + "_" + subCaseId;
62 String jarName_hi = "hi" + "_" + subCaseId;
63
64
65 JarBuilder.build(jarName_verifier_test_tmp, "VerifierTest0", "VerifierTestA",
66 "VerifierTestB", "VerifierTestC", "VerifierTestD", "VerifierTestE",
67 "UnverifiableBase", "UnverifiableIntf", "UnverifiableIntfSub");
68 JarBuilder.build(jarName_greet, "Greet");
69 JarBuilder.build(jarName_hi, "Hi", "Hi$MyClass");
70
71 File dir = new File(System.getProperty("test.classes", "."));
88 "VerifierTestC",
89 "VerifierTestD",
90 "VerifierTestE",
91 "VerifierTest0");
92
93
94 switch (subCaseId) {
95 case "0": testset_0(jar, noAppClasses, appClasses); return;
96 case "1A": testset_1(jar, noAppClasses, appClasses, Testset1Part.A); return;
97 case "1B": testset_1(jar, noAppClasses, appClasses, Testset1Part.B); return;
98 case "2": testset_2(jarName_greet, jarName_hi); return;
99 default:
100 throw new RuntimeException("Unknown option: " + subCaseId);
101 }
102 }
103
104 static void testset_0(String jar, String[] noAppClasses, String[] appClasses) throws Exception {
105 // Dumping should fail if the IgnoreUnverifiableClassesDuringDump
106 // option is not enabled.
107 OutputAnalyzer output = TestCommon.dump(jar, appClasses,
108 CDS_LOGGING,
109 "-XX:+UnlockDiagnosticVMOptions",
110 "-XX:-IgnoreUnverifiableClassesDuringDump");
111 output.shouldContain("Please remove the unverifiable classes");
112 output.shouldHaveExitValue(1);
113
114 // By default, bad classes should be ignored during dumping.
115 TestCommon.testDump(jar, appClasses);
116 }
117
118 static void checkRuntimeOutput(OutputAnalyzer output, String expected) throws Exception {
119 output.shouldContain(expected);
120 if (expected.equals(PASS_RESULT) ||
121 expected.equals(VFY_ERR)) {
122 output.shouldHaveExitValue(0);
123 } else {
124 output.shouldNotHaveExitValue(0);
125 }
126 }
127
128 static void testset_1(String jar, String[] noAppClasses, String[] appClasses, Testset1Part part)
171 default:
172 assert part == Testset1Part.B;
173 loop_start = 9;
174 loop_stop = config.length;
175 break;
176 }
177
178 String prev_dump_setting = "";
179 for (int i = loop_start; i < loop_stop; i ++) {
180 String dump_list[] = config[i][0].equals("app") ? appClasses :
181 noAppClasses;
182 String dump_setting = config[i][1];
183 String runtime_setting = config[i][2];
184 String expected_output_str = config[i][3];
185 System.out.println("Test case [" + i + "]: dumping " + config[i][0] +
186 " with " + dump_setting +
187 ", run with " + runtime_setting);
188 if (!dump_setting.equals(prev_dump_setting)) {
189 OutputAnalyzer dumpOutput = TestCommon.dump(
190 jar, dump_list, dump_setting,
191 CDS_LOGGING,
192 // FIXME: the following options are for working around a GC
193 // issue - assert failure when dumping archive with the -Xverify:all
194 "-Xms256m",
195 "-Xmx256m");
196 if (dump_setting.equals(VFY_NONE) &&
197 runtime_setting.equals(VFY_REMOTE)) {
198 dumpOutput.shouldContain(VFY_INFO_MESSAGE);
199 }
200 }
201 TestCommon.run("-cp", jar,
202 runtime_setting,
203 "VerifierTest0")
204 .ifNoMappingFailure(output -> checkRuntimeOutput(output, expected_output_str));
205 prev_dump_setting = dump_setting;
206 }
207 }
208
209 static void testset_2(String jarName_greet, String jarName_hi) throws Exception {
210 String appClasses[];
211 String jar;
229 {"app", VFY_ALL, VFY_REMOTE, PASS_RESULT },
230 {"app", VFY_ALL, VFY_ALL, PASS_RESULT },
231 {"app", VFY_ALL, VFY_NONE, PASS_RESULT },
232 // Dump app/ext with -Xverify:none
233 {"app", VFY_NONE, VFY_REMOTE, PASS_RESULT},
234 {"app", VFY_NONE, VFY_ALL, MAP_FAIL},
235 {"app", VFY_NONE, VFY_NONE, PASS_RESULT },
236 };
237 String prev_dump_setting = "";
238 for (int i = 0; i < config2.length; i ++) {
239 // config2[i][0] is always set to "app" in this test
240 String dump_setting = config2[i][1];
241 String runtime_setting = config2[i][2];
242 String expected_output_str = config2[i][3];
243 System.out.println("Test case [" + i + "]: dumping " + config2[i][0] +
244 " with " + dump_setting +
245 ", run with " + runtime_setting);
246 if (!dump_setting.equals(prev_dump_setting)) {
247 OutputAnalyzer dumpOutput = TestCommon.dump(
248 jar, appClasses, dump_setting,
249 CDS_LOGGING,
250 // FIXME: the following options are for working around a GC
251 // issue - assert failure when dumping archive with the -Xverify:all
252 "-Xms256m",
253 "-Xmx256m");
254 if (dump_setting.equals(VFY_NONE) &&
255 runtime_setting.equals(VFY_REMOTE)) {
256 dumpOutput.shouldContain(VFY_INFO_MESSAGE);
257 }
258 }
259 TestCommon.run("-cp", jar,
260 runtime_setting,
261 "Hi")
262 .ifNoMappingFailure(output -> checkRuntimeOutput(output, expected_output_str));
263 prev_dump_setting = dump_setting;
264 }
265 }
266
267 static void createTestJarFile(File jarSrcFile, File jarFile) throws Exception {
268 jarFile.delete();
269 Files.copy(jarSrcFile.toPath(), jarFile.toPath());
|