< prev index next >

test/hotspot/jtreg/runtime/Nestmates/membership/TestNestmateMembership.java

Print this page

        

@@ -26,138 +26,335 @@
  * @bug 8046171
  * @summary Test the various rules for nest members and nest-hosts
  * @compile TestNestmateMembership.java
  *          PackagedNestHost.java
  *          PackagedNestHost2.java
- *          NotAMember2.java
- * @compile MissingNestHost.jcod
- *          ArrayNestHost.jcod
- *          NotAMember.jcod
- *          NotAMember2.jcod
+ *
+ * @compile TargetNoHost.jcod
+ *          CallerNoHost.jcod
+ *          TargetMissingHost.jcod
+ *          CallerMissingHost.jcod
+ *          CallerNotInstanceHost.jcod
+ *          TargetNotInstanceHost.jcod
+ *          CallerNotOurHost.jcod
+ *          TargetNotOurHost.jcod
  *          PackagedNestHost.jcod
  *          PackagedNestHost2Member.jcod
+ *          PackagedNestHostMember.jcod
+ *
  * @run main/othervm TestNestmateMembership
  */
 
 // We test all the "illegal" relationships between a nest member and its nest-host
 // except for the case where the name of the nest-member matches the name listed
 // in the nest-host, but resolves to a different class. There doesn't seem to
 // be a way to construct that scenario.
 // For each nested class below there is a corresponding .jcod file which breaks one
 // of the rules regarding nest membership. For the package related tests we have
-// additional PackageNestHost*.java sources. We also have NotAMember2.java.
+// additional PackageNestHost*.java sources.
 // Note that all the .java files must be compiled in the same step, while all
 // .jcod files must be compiled in a later step.
 
+// As access checking requires resolution and validation of the nest-host of
+// both the caller class and the target class, we must check that all
+// combinations of good/bad caller/target are checked for each of the
+// possible errors:
+// - no nest-host attribute
+// - nest-host class can not be found
+// - nest-host class is not an instance class
+// - class is not a member of nest-host's nest
+// - class and nest-host are in different packages
+
 public class TestNestmateMembership {
 
-    // jcod modified to have non-existent nest-host
-    static class MissingNestHost {
+    static class Caller {
+        private static void m() {
+            System.out.println("Caller.m()");
+        }
+        public static void invokeTarget() {
+            Target.m();
+        }
+        public static void invokeTargetNoHost() {
+            TargetNoHost.m();
+        }
+        public static void invokeTargetMissingHost() {
+            TargetMissingHost.m();
+        }
+        public static void invokeTargetNotInstanceHost() {
+            TargetNotInstanceHost.m();
+        }
+        public static void invokeTargetNotOurHost() {
+            TargetNotOurHost.m();
+        }
+    }
+
+    static class CallerNoHost {
+        private static void m() {
+            System.out.println("CallerNoHost.m() - java version");
+        }
+        public static void invokeTarget() {
+            Target.m();
+        }
+        public static void invokeTargetNoHost() {
+            TargetNoHost.m();
+        }
+    }
+
+    static class CallerMissingHost {
+        String msg = "NoCallerMissingHost"; // for cp entry
         private static void m() {
-            System.out.println("MissingNestHost.m() - java version");
+            System.out.println("CallerMissingHost.m() - java version");
+        }
+        public static void invokeTarget() {
+            Target.m();
+        }
+        public static void invokeTargetMissingHost() {
+            TargetMissingHost.m();
         }
     }
 
-    // jcod modified to have non-instance class Object[] as nest-host
-    static class ArrayNestHost {
-        Object[] oa; // create CP entry
+    static class CallerNotInstanceHost {
+        Object[] oa; // create CP entry to use in jcod change
         private static void m() {
-            System.out.println("ArrayNestHost.m() - java version");
+            System.out.println("CallerNotInstanceHost.m() - java version");
+        }
+        public static void invokeTarget() {
+            Target.m();
+        }
+        public static void invokeTargetNotInstanceHost() {
+            TargetNotInstanceHost.m();
+        }
+    }
+
+    static class CallerNotOurHost {
+        private static void m() {
+            System.out.println("CallerNotOurHost.m() - java version");
+        }
+        public static void invokeTarget() {
+            Target.m();
+        }
+        public static void invokeTargetNotOurHost() {
+            TargetNotOurHost.m();
         }
     }
 
-    // jcod modified to have Object as nest-host, which has no nest-members
-    static class NotAMember {
+    static class Target {
         private static void m() {
-            System.out.println("NotAMember.m() - java version");
+            System.out.println("Target.m()");
+        }
+    }
+
+    static class TargetNoHost {
+        private static void m() {
+            System.out.println("TargetNoHost.m() - java version");
+        }
+    }
+
+    static class TargetMissingHost {
+        String msg = "NoTargetMissingHost";  // for cp entry
+        private static void m() {
+            System.out.println("TargetMissingHost.m() - java version");
+        }
+    }
+
+    static class TargetNotInstanceHost {
+        Object[] oa; // create CP entry to use in jcod change
+        private static void m() {
+            System.out.println("TargetNotInstanceHost.m() - java version");
+        }
+    }
+
+    static class TargetNotOurHost {
+        private static void m() {
+            System.out.println("TargetNotOurHost.m() - java version");
         }
     }
 
     public static void main(String[] args) throws Throwable {
-        test_MissingNestHost();
-        test_ArrayNestHost();
-        test_WrongPackageForNestMember();
-        test_NotAMember();
-        test_NotAMember2();
+        test_GoodCalls();
+        test_NoHost();
+        test_MissingHost();
+        test_NotInstanceHost();
+        test_NotOurHost();
+        test_WrongPackageHost();
     }
 
-    static void test_WrongPackageForNestMember() {
-        System.out.println("Testing for nest-host and nest-member in different packages");
-        String msg = "Class P2.PackagedNestHost2$Member is in a different" +
-                     " package to its nest-host class P1.PackagedNestHost";
+    static void test_GoodCalls(){
         try {
-            P1.PackagedNestHost.doAccess();
-            throw new Error("Missing IncompatibleClassChangeError: " + msg);
+            Caller.invokeTarget();
         }
-        catch (IncompatibleClassChangeError expected) {
-            if (!expected.getMessage().contains(msg))
-                throw new Error("Wrong IncompatibleClassChangeError: \"" +
-                                expected.getMessage() + "\" does not contain \"" +
-                                msg + "\"");
-            System.out.println("OK - got expected exception: " + expected);
+        catch (Exception e) {
+            throw new Error("Unexpected exception on good calls: " + e);
         }
     }
 
-    static void test_MissingNestHost() throws Throwable {
+    static void test_NoHost() throws Throwable {
+        System.out.println("Testing for missing nest-host attribute");
+        String msg = "tried to access method " +
+            "TestNestmateMembership$TargetNoHost.m()V from class " +
+            "TestNestmateMembership$Caller";
+        try {
+            Caller.invokeTargetNoHost();
+            throw new Error("Missing IllegalAccessError: " + msg);
+        }
+        catch (IllegalAccessError expected) {
+            check_expected(expected, msg);
+        }
+        msg = "tried to access method TestNestmateMembership$Target.m()V" +
+            " from class TestNestmateMembership$CallerNoHost";
+        try {
+            CallerNoHost.invokeTarget();
+            throw new Error("Missing IllegalAccessError: " + msg);
+        }
+        catch (IllegalAccessError expected) {
+            check_expected(expected, msg);
+        }
+        msg = "tried to access method TestNestmateMembership$TargetNoHost.m()V" +
+            " from class TestNestmateMembership$CallerNoHost";
+        try {
+            CallerNoHost.invokeTargetNoHost();
+            throw new Error("Missing IllegalAccessError: " + msg);
+        }
+        catch (IllegalAccessError expected) {
+            check_expected(expected, msg);
+        }
+    }
+
+    static void test_MissingHost() throws Throwable {
         System.out.println("Testing for nest-host class that does not exist");
-        String msg = "NoSuchClass";
+        String msg = "Unable to load nest-host class of " +
+            "TestNestmateMembership$TargetMissingHost";
+        String cause_msg = "NoTargetMissingHost";
         try {
-            MissingNestHost.m();
+            Caller.invokeTargetMissingHost();
             throw new Error("Missing NoClassDefFoundError: " + msg);
         }
         catch (NoClassDefFoundError expected) {
-            if (!expected.getMessage().contains(msg))
-                throw new Error("Wrong NoClassDefFoundError: \"" +
-                                expected.getMessage() + "\" does not contain \"" +
-                                msg + "\"");
-            System.out.println("OK - got expected exception: " + expected);
+            check_expected(expected, msg);
+            Throwable cause = expected.getCause();
+            if (cause instanceof NoClassDefFoundError) {
+                check_expected(cause, cause_msg);
+            }
+            else throw new Error("Unexpected NoClassDefFoundError", expected);
+        }
+        msg = "Unable to load nest-host class of " +
+            "TestNestmateMembership$CallerMissingHost";
+        cause_msg = "NoCallerMissingHost";
+        try {
+            CallerMissingHost.invokeTarget();
+            throw new Error("Missing NoClassDefFoundError: " + msg);
+        }
+        catch (NoClassDefFoundError expected) {
+            check_expected(expected, msg);
+            Throwable cause = expected.getCause();
+            if (cause instanceof NoClassDefFoundError) {
+                check_expected(cause, cause_msg);
+            }
+            else throw new Error("Unexpected NoClassDefFoundError", expected);
+        }
+        msg = "Unable to load nest-host class of "+
+            "TestNestmateMembership$CallerMissingHost";
+        cause_msg = "NoCallerMissingHost";
+        try {
+            CallerMissingHost.invokeTargetMissingHost();
+            throw new Error("Missing NoClassDefFoundError: " + msg);
+        }
+        catch (NoClassDefFoundError expected) {
+            check_expected(expected, msg);
+            Throwable cause = expected.getCause();
+            if (cause instanceof NoClassDefFoundError) {
+                check_expected(cause, cause_msg);
+            }
+            else throw new Error("Unexpected NoClassDefFoundError", expected);
         }
     }
 
-    static void test_ArrayNestHost() throws Throwable {
+    static void test_NotInstanceHost() throws Throwable {
         System.out.println("Testing for nest-host class that is not an instance class");
-        String msg = "ArrayNestHost has non-instance class [Ljava.lang.Object; as nest-host";
+        String msg = "Type TestNestmateMembership$TargetNotInstanceHost is not a "+
+            "nest member of [Ljava.lang.Object;: nest-host is not an instance class";
         try {
-            ArrayNestHost.m();
-            throw new Error("Missing IncompatibleClassChangeError: " + msg);
+            Caller.invokeTargetNotInstanceHost();
+            throw new Error("Missing IllegalAccessError: " + msg);
         }
-        catch (IncompatibleClassChangeError expected) {
-            if (!expected.getMessage().contains(msg))
-                throw new Error("Wrong IncompatibleClassChangeError: \"" +
-                                expected.getMessage() + "\" does not contain \"" +
-                                msg + "\"");
-            System.out.println("OK - got expected exception: " + expected);
+        catch (IllegalAccessError expected) {
+            check_expected(expected, msg);
+        }
+        msg = "Type TestNestmateMembership$CallerNotInstanceHost is not a "+
+            "nest member of [Ljava.lang.Object;: nest-host is not an instance class";
+        try {
+            CallerNotInstanceHost.invokeTarget();
+            throw new Error("Missing IllegalAccessError: " + msg);
+        }
+        catch (IllegalAccessError expected) {
+            check_expected(expected, msg);
+        }
+        msg = "Type TestNestmateMembership$CallerNotInstanceHost is not a "+
+            "nest member of [Ljava.lang.Object;: nest-host is not an instance class";
+        try {
+            CallerNotInstanceHost.invokeTargetNotInstanceHost();
+            throw new Error("Missing IllegalAccessError: " + msg);
+        }
+        catch (IllegalAccessError expected) {
+            check_expected(expected, msg);
         }
     }
 
-    static void test_NotAMember() throws Throwable {
-        System.out.println("Testing for nest-host class that has no nest");
-        String msg = "NotAMember is not a nest member of java.lang.Object";
+    static void test_NotOurHost() throws Throwable {
+        System.out.println("Testing for nest-host class that does not list us in its nest");
+        String msg = "Type TestNestmateMembership$TargetNotOurHost is not a nest member" +
+            " of java.lang.Object: current type is not listed as a nest member";
         try {
-            NotAMember.m();
-            throw new Error("Missing IncompatibleClassChangeError: " + msg);
+            Caller.invokeTargetNotOurHost();
+            throw new Error("Missing IllegalAccessError: " + msg);
         }
-        catch (IncompatibleClassChangeError expected) {
-            if (!expected.getMessage().contains(msg))
-                throw new Error("Wrong IncompatibleClassChangeError: \"" +
-                                expected.getMessage() + "\" does not contain \"" +
-                                msg + "\"");
-            System.out.println("OK - got expected exception: " + expected);
+        catch (IllegalAccessError expected) {
+            check_expected(expected, msg);
+        }
+        msg = "Type TestNestmateMembership$CallerNotOurHost is not a nest member" +
+            " of java.lang.Object: current type is not listed as a nest member";
+        try {
+            CallerNotOurHost.invokeTarget();
+            throw new Error("Missing IllegalAccessError: " + msg);
+        }
+        catch (IllegalAccessError expected) {
+            check_expected(expected, msg);
+        }
+        msg = "Type TestNestmateMembership$CallerNotOurHost is not a nest member" +
+            " of java.lang.Object: current type is not listed as a nest member";
+        try {
+            CallerNotOurHost.invokeTargetNotOurHost();
+            throw new Error("Missing IllegalAccessError: " + msg);
+        }
+        catch (IllegalAccessError expected) {
+            check_expected(expected, msg);
         }
     }
 
-    static void test_NotAMember2() throws Throwable {
-        System.out.println("Testing for nest-host class that doesn't list this class as a member");
-        String msg = "NotAMember2$Member is not a nest member of TestNestmateMembership";
+    static void test_WrongPackageHost() {
+        System.out.println("Testing for nest-host and nest-member in different packages");
+        String msg = "Type P2.PackagedNestHost2$Member is not a nest member of " +
+            "P1.PackagedNestHost: types are in different packages";
+        try {
+            P1.PackagedNestHost.doAccess();
+            throw new Error("Missing IllegalAccessError: " + msg);
+        }
+        catch (IllegalAccessError expected) {
+            check_expected(expected, msg);
+        }
         try {
-            NotAMember2.Member.m();
-            throw new Error("Missing IncompatibleClassChangeError: " + msg);
+            P2.PackagedNestHost2.Member.doAccess();
+            throw new Error("Missing IllegalAccessError: " + msg);
+        }
+        catch (IllegalAccessError expected) {
+            check_expected(expected, msg);
         }
-        catch (IncompatibleClassChangeError expected) {
+    }
+
+    static void check_expected(Throwable expected, String msg) {
             if (!expected.getMessage().contains(msg))
-                throw new Error("Wrong IncompatibleClassChangeError: \"" +
+            throw new Error("Wrong " + expected.getClass().getSimpleName() +": \"" +
                                 expected.getMessage() + "\" does not contain \"" +
                                 msg + "\"");
             System.out.println("OK - got expected exception: " + expected);
         }
-    }
 }
< prev index next >