23
24 /**
25 * @test
26 * @bug 8199852
27 * @summary Test exception messages of LinkageError. A class loader loads
28 * twice the same class. Should trigger exception in
29 * SystemDictionary::check_constraints().
30 * @compile ../common/Foo.java
31 * @compile ../common/J.java
32 * ../common/PreemptingClassLoader.java
33 * @run main/othervm Test
34 */
35
36 public class Test {
37
38 // Check that all names have external formatting ('.' and not '/' in package names).
39 // Check for parent of class loader.
40 // Break each expectedErrorMessage into 2 parts due to the class loader name containing
41 // the unique @<id> identity hash which cannot be compared against.
42 static String expectedErrorMessage1_part1 = "loader PreemptingClassLoader @";
43 static String expectedErrorMessage1_part2 =
44 " (instance of PreemptingClassLoader, " +
45 "child of 'app' jdk.internal.loader.ClassLoaders$AppClassLoader) " +
46 "attempted duplicate class definition for test.Foo.";
47
48 // Check that all names have external formatting ('.' and not '/' in package names).
49 // Check for name and parent of class loader.
50 static String expectedErrorMessage2_part1 = "loader 'DuplicateLE_Test_Loader' @";
51 static String expectedErrorMessage2_part2 =
52 " (instance of PreemptingClassLoader, " +
53 "child of 'app' jdk.internal.loader.ClassLoaders$AppClassLoader) " +
54 "attempted duplicate class definition for test.Foo.";
55
56 // Check that all names have external formatting ('.' and not '/' in package names).
57 // Check for name and parent of class loader. Type should be mentioned as 'interface'.
58 static String expectedErrorMessage3_part1 = "loader 'DuplicateLE_Test_Loader_IF' @";
59 static String expectedErrorMessage3_part2 =
60 " (instance of PreemptingClassLoader, " +
61 "child of 'app' jdk.internal.loader.ClassLoaders$AppClassLoader) " +
62 "attempted duplicate interface definition for test.J.";
63
64 // Test that the error message is correct when a loader constraint error is
65 // detected during vtable creation.
66 //
67 // In this test, during vtable creation for class Task, method "Task.m()LFoo;"
68 // overrides "J.m()LFoo;". But, Task's class Foo and super type J's class Foo
69 // are different. So, a LinkageError exception should be thrown because the
70 // loader constraint check will fail.
71 public static void test(String loaderName, String expectedErrorMessage_part1,
72 String expectedErrorMessage_part2, String testType) throws Exception {
73 String[] classNames = {testType};
74 ClassLoader l = new PreemptingClassLoader(loaderName, classNames, false);
75 l.loadClass(testType);
76 try {
77 l.loadClass(testType).newInstance();
78 throw new RuntimeException("Expected LinkageError exception not thrown");
79 } catch (LinkageError e) {
80 String errorMsg = e.getMessage();
81 if (!errorMsg.contains(expectedErrorMessage_part1) ||
82 !errorMsg.contains(expectedErrorMessage_part2)) {
83 System.out.println("Expected: " + expectedErrorMessage_part1 + "<id>" + expectedErrorMessage_part2 + "\n" +
84 "but got: " + errorMsg);
85 throw new RuntimeException("Wrong LinkageError exception thrown: " + errorMsg);
86 }
87 System.out.println("Passed with message: " + errorMsg);
88 }
89 }
90
91 public static void main(String args[]) throws Exception {
92 test(null, expectedErrorMessage1_part1, expectedErrorMessage1_part2, "test.Foo");
93 test("DuplicateLE_Test_Loader", expectedErrorMessage2_part1, expectedErrorMessage2_part2, "test.Foo");
94 test("DuplicateLE_Test_Loader_IF", expectedErrorMessage3_part1, expectedErrorMessage3_part2, "test.J");
95 }
96 }
97
|
23
24 /**
25 * @test
26 * @bug 8199852
27 * @summary Test exception messages of LinkageError. A class loader loads
28 * twice the same class. Should trigger exception in
29 * SystemDictionary::check_constraints().
30 * @compile ../common/Foo.java
31 * @compile ../common/J.java
32 * ../common/PreemptingClassLoader.java
33 * @run main/othervm Test
34 */
35
36 public class Test {
37
38 // Check that all names have external formatting ('.' and not '/' in package names).
39 // Check for parent of class loader.
40 // Break each expectedErrorMessage into 2 parts due to the class loader name containing
41 // the unique @<id> identity hash which cannot be compared against.
42 static String expectedErrorMessage1_part1 = "loader PreemptingClassLoader @";
43 static String expectedErrorMessage1_part2 = " attempted duplicate class definition for test.Foo. (test.Foo is in unnamed module of loader PreemptingClassLoader @";
44 static String expectedErrorMessage1_part3 = ", parent loader 'app')";
45
46 // Check that all names have external formatting ('.' and not '/' in package names).
47 // Check for name and parent of class loader.
48 static String expectedErrorMessage2_part1 = "loader 'DuplicateLE_Test_Loader' @";
49 static String expectedErrorMessage2_part2 = " attempted duplicate class definition for test.Foo. (test.Foo is in unnamed module of loader 'DuplicateLE_Test_Loader' @";
50 static String expectedErrorMessage2_part3 = ", parent loader 'app')";
51
52 // Check that all names have external formatting ('.' and not '/' in package names).
53 // Check for name and parent of class loader. Type should be mentioned as 'interface'.
54 static String expectedErrorMessage3_part1 = "loader 'DuplicateLE_Test_Loader_IF' @";
55 static String expectedErrorMessage3_part2 = " attempted duplicate interface definition for test.J. (test.J is in unnamed module of loader 'DuplicateLE_Test_Loader_IF' @";
56 static String expectedErrorMessage3_part3 = ", parent loader 'app')";
57
58
59 // Test that the error message is correct when a loader constraint error is
60 // detected during vtable creation.
61 //
62 // In this test, during vtable creation for class Task, method "Task.m()LFoo;"
63 // overrides "J.m()LFoo;". But, Task's class Foo and super type J's class Foo
64 // are different. So, a LinkageError exception should be thrown because the
65 // loader constraint check will fail.
66 public static void test(String loaderName,
67 String expectedErrorMessage_part1,
68 String expectedErrorMessage_part2,
69 String expectedErrorMessage_part3,
70 String testType) throws Exception {
71 String[] classNames = {testType};
72 ClassLoader l = new PreemptingClassLoader(loaderName, classNames, false);
73 l.loadClass(testType);
74 try {
75 l.loadClass(testType).newInstance();
76 throw new RuntimeException("Expected LinkageError exception not thrown");
77 } catch (LinkageError e) {
78 String errorMsg = e.getMessage();
79 if (!errorMsg.contains(expectedErrorMessage_part1) ||
80 !errorMsg.contains(expectedErrorMessage_part2) ||
81 !errorMsg.contains(expectedErrorMessage_part3)) {
82 System.out.println("Expected: " + expectedErrorMessage_part1 + "<id>" + expectedErrorMessage_part2 + "\n" +
83 "but got: " + errorMsg);
84 throw new RuntimeException("Wrong LinkageError exception thrown: " + errorMsg);
85 }
86 System.out.println("Passed with message: " + errorMsg);
87 }
88 }
89
90 public static void main(String args[]) throws Exception {
91 test(null, expectedErrorMessage1_part1, expectedErrorMessage1_part2,
92 expectedErrorMessage1_part3, "test.Foo");
93 test("DuplicateLE_Test_Loader", expectedErrorMessage2_part1, expectedErrorMessage2_part2,
94 expectedErrorMessage2_part3, "test.Foo");
95 test("DuplicateLE_Test_Loader_IF", expectedErrorMessage3_part1, expectedErrorMessage3_part2,
96 expectedErrorMessage3_part3, "test.J");
97 }
98 }
|