< prev index next >

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

Print this page

        

*** 26,163 **** * @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 * PackagedNestHost.jcod * PackagedNestHost2Member.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. // Note that all the .java files must be compiled in the same step, while all // .jcod files must be compiled in a later step. public class TestNestmateMembership { ! // jcod modified to have non-existent nest-host ! static class MissingNestHost { private static void m() { ! System.out.println("MissingNestHost.m() - java version"); } } ! // jcod modified to have non-instance class Object[] as nest-host ! static class ArrayNestHost { ! Object[] oa; // create CP entry private static void m() { ! System.out.println("ArrayNestHost.m() - java version"); } } ! // jcod modified to have Object as nest-host, which has no nest-members ! static class NotAMember { private static void m() { ! System.out.println("NotAMember.m() - java version"); } } public static void main(String[] args) throws Throwable { ! test_MissingNestHost(); ! test_ArrayNestHost(); ! test_WrongPackageForNestMember(); ! test_NotAMember(); ! test_NotAMember2(); } ! 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"; try { ! P1.PackagedNestHost.doAccess(); ! throw new Error("Missing IncompatibleClassChangeError: " + 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); } } ! static void test_MissingNestHost() throws Throwable { System.out.println("Testing for nest-host class that does not exist"); ! String msg = "NoSuchClass"; try { ! MissingNestHost.m(); 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); } } ! static void test_ArrayNestHost() 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"; try { ! ArrayNestHost.m(); ! throw new Error("Missing IncompatibleClassChangeError: " + 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); } } ! 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"; try { ! NotAMember.m(); ! throw new Error("Missing IncompatibleClassChangeError: " + 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); } } ! 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"; try { ! NotAMember2.Member.m(); ! throw new Error("Missing IncompatibleClassChangeError: " + 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); } - } } --- 26,360 ---- * @bug 8046171 * @summary Test the various rules for nest members and nest-hosts * @compile TestNestmateMembership.java * PackagedNestHost.java * PackagedNestHost2.java ! * ! * @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. // 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 { ! 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("CallerMissingHost.m() - java version"); ! } ! public static void invokeTarget() { ! Target.m(); ! } ! public static void invokeTargetMissingHost() { ! TargetMissingHost.m(); } } ! static class CallerNotInstanceHost { ! Object[] oa; // create CP entry to use in jcod change private static void m() { ! 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(); } } ! static class Target { private static void m() { ! 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_GoodCalls(); ! test_NoHost(); ! test_MissingHost(); ! test_NotInstanceHost(); ! test_NotOurHost(); ! test_WrongPackageHost(); } ! static void test_GoodCalls(){ try { ! Caller.invokeTarget(); } ! catch (Exception e) { ! throw new Error("Unexpected exception on good calls: " + e); } } ! 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 = "Unable to load nest-host class of " + ! "TestNestmateMembership$TargetMissingHost"; ! String cause_msg = "NoTargetMissingHost"; try { ! Caller.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); ! } ! 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_NotInstanceHost() throws Throwable { System.out.println("Testing for nest-host class that is not an instance class"); ! String msg = "Type TestNestmateMembership$TargetNotInstanceHost is not a "+ ! "nest member of [Ljava.lang.Object;: nest-host is not an instance class"; try { ! Caller.invokeTargetNotInstanceHost(); ! 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.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_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 { ! Caller.invokeTargetNotOurHost(); ! 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.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_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 { ! P2.PackagedNestHost2.Member.doAccess(); ! throw new Error("Missing IllegalAccessError: " + msg); ! } ! catch (IllegalAccessError expected) { ! check_expected(expected, msg); } ! } ! ! static void check_expected(Throwable expected, String msg) { if (!expected.getMessage().contains(msg)) ! throw new Error("Wrong " + expected.getClass().getSimpleName() +": \"" + expected.getMessage() + "\" does not contain \"" + msg + "\""); System.out.println("OK - got expected exception: " + expected); } }
< prev index next >