< prev index next >
test/hotspot/jtreg/runtime/Nestmates/membership/TestNestmateMembership.java
Print this page
*** 22,32 ****
*/
/*
* @test
* @bug 8046171
! * @summary Test the various rules for nest members and nest-hosts
* @compile TestNestmateMembership.java
* PackagedNestHost.java
* PackagedNestHost2.java
*
* @compile TargetNoHost.jcod
--- 22,33 ----
*/
/*
* @test
* @bug 8046171
! * @summary Test the various rules for nest members and nest-hosts by
! * triggering nestmate access checks on all possible paths
* @compile TestNestmateMembership.java
* PackagedNestHost.java
* PackagedNestHost2.java
*
* @compile TargetNoHost.jcod
*** 39,49 ****
* 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
--- 40,54 ----
* TargetNotOurHost.jcod
* PackagedNestHost.jcod
* PackagedNestHost2Member.jcod
* PackagedNestHostMember.jcod
*
! * @run main/othervm TestNestmateMembership method
! * @run main/othervm TestNestmateMembership constructor
! * @run main/othervm TestNestmateMembership getField
! * @run main/othervm TestNestmateMembership putField
! * @run main/othervm -Xcomp TestNestmateMembership getField
*/
// 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
*** 52,77 ****
--- 57,106 ----
// 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.
+ // We test all the different nestmate access check paths: method invocation, constructor
+ // invocations, field get and field put. The test is invoked four times with each using
+ // a different test mode. Plus an extra Xcomp run for field access to hit ciField path.
+ //
// 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
+ //
+ // To provide coverage for reflection and MethodHandle paths through
+ // JVM_AreNestmates, we add reflection/MH accesses to a subset of the tests.
+ // We only need to test one case (for Caller.xxx) as all cases use the same path; further
+ // we don't need to test all failure cases, as all exceptions are equivalent in that regard,
+ // but for good measure we test the four basic error situations (eliding the different
+ // package test for simplicity).
+ //
+
+ import java.lang.invoke.*;
+ import static java.lang.invoke.MethodHandles.*;
+ import static java.lang.invoke.MethodType.*;
public class TestNestmateMembership {
+ static final MethodType VOID_T = MethodType.methodType(void.class);
+
static class Caller {
+
+ private Caller() {}
+
private static void m() {
System.out.println("Caller.m()");
}
+
+ // direct static method invocations
+
public static void invokeTarget() {
Target.m();
}
public static void invokeTargetNoHost() {
TargetNoHost.m();
*** 83,195 ****
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 {
--- 112,572 ----
TargetNotInstanceHost.m();
}
public static void invokeTargetNotOurHost() {
TargetNotOurHost.m();
}
+
+ // reflective static method invocations
+
+ public static void invokeTargetNoHostReflectively() throws Throwable {
+ TargetNoHost.class.getDeclaredMethod("m", new Class<?>[0]).invoke(null, new Object[0]);
+ }
+ public static void invokeTargetMissingHostReflectively() throws Throwable {
+ TargetMissingHost.class.getDeclaredMethod("m", new Class<?>[0]).invoke(null, new Object[0]);
+ }
+ public static void invokeTargetNotInstanceHostReflectively() throws Throwable {
+ TargetNotInstanceHost.class.getDeclaredMethod("m", new Class<?>[0]).invoke(null, new Object[0]);
+ }
+ public static void invokeTargetNotOurHostReflectively() throws Throwable {
+ TargetNotOurHost.class.getDeclaredMethod("m", new Class<?>[0]).invoke(null, new Object[0]);
+ }
+
+ // MethodHandle static method lookup (no invoke as the lookup should fail)
+
+ public static void invokeTargetNoHostMH() throws Throwable {
+ MethodHandle mh = lookup().findStatic(TargetNoHost.class, "m", VOID_T);
+ }
+ public static void invokeTargetMissingHostMH() throws Throwable {
+ MethodHandle mh = lookup().findStatic(TargetMissingHost.class, "m", VOID_T);
+ }
+ public static void invokeTargetNotInstanceHostMH() throws Throwable {
+ MethodHandle mh = lookup().findStatic(TargetNotInstanceHost.class, "m", VOID_T);
+ }
+ public static void invokeTargetNotOurHostMH() throws Throwable {
+ MethodHandle mh = lookup().findStatic(TargetNotOurHost.class, "m", VOID_T);
+ }
+
+
+ // direct constructor invocations
+
+ public static void newTarget() {
+ Object o = new Target();
+ }
+ public static void newTargetNoHost() {
+ Object o = new TargetNoHost();
+ }
+ public static void newTargetMissingHost() {
+ Object o = new TargetMissingHost();
+ }
+ public static void newTargetNotInstanceHost() {
+ Object o = new TargetNotInstanceHost();
+ }
+ public static void newTargetNotOurHost() {
+ Object o = new TargetNotOurHost();
+ }
+
+ // reflective constructor invocations
+
+ public static void newTargetNoHostReflectively() throws Throwable {
+ Object o = TargetNoHost.class.getDeclaredConstructor(new Class<?>[0]).newInstance(new Object[0]);
+ }
+ public static void newTargetMissingHostReflectively() throws Throwable {
+ Object o = TargetMissingHost.class.getDeclaredConstructor(new Class<?>[0]).newInstance(new Object[0]);
+ }
+ public static void newTargetNotInstanceHostReflectively() throws Throwable {
+ Object o = TargetNotInstanceHost.class.getDeclaredConstructor(new Class<?>[0]).newInstance(new Object[0]);
+ }
+ public static void newTargetNotOurHostReflectively() throws Throwable {
+ Object o = TargetNotOurHost.class.getDeclaredConstructor(new Class<?>[0]).newInstance(new Object[0]);
+ }
+
+ // MethodHandle constructor lookup (no invoke as the lookup should fail)
+
+ public static void newTargetNoHostMH() throws Throwable {
+ MethodHandle mh = lookup().findConstructor(TargetNoHost.class, VOID_T);
+ }
+ public static void newTargetMissingHostMH() throws Throwable {
+ MethodHandle mh = lookup().findConstructor(TargetMissingHost.class, VOID_T);
+ }
+ public static void newTargetNotInstanceHostMH() throws Throwable {
+ MethodHandle mh = lookup().findConstructor(TargetNotInstanceHost.class, VOID_T);
+ }
+ public static void newTargetNotOurHostMH() throws Throwable {
+ MethodHandle mh = lookup().findConstructor(TargetNotOurHost.class, VOID_T);
+ }
+
+ private static int f;
+
+ // direct field accesses
+
+ public static void getFieldTarget() {
+ int x = Target.f;
+ }
+ public static void getFieldTargetNoHost() {
+ int x = TargetNoHost.f;
+ }
+ public static void getFieldTargetMissingHost() {
+ int x = TargetMissingHost.f;
+ }
+ public static void getFieldTargetNotInstanceHost() {
+ int x = TargetNotInstanceHost.f;
+ }
+ public static void getFieldTargetNotOurHost() {
+ int x = TargetNotOurHost.f;
+ }
+
+ public static void putFieldTarget() {
+ Target.f = 42;
+ }
+ public static void putFieldTargetNoHost() {
+ TargetNoHost.f = 42;
+ }
+ public static void putFieldTargetMissingHost() {
+ TargetMissingHost.f = 42;
+ }
+ public static void putFieldTargetNotInstanceHost() {
+ TargetNotInstanceHost.f = 42;
+ }
+ public static void putFieldTargetNotOurHost() {
+ TargetNotOurHost.f = 42;
+ }
+
+ // reflective field accesses
+
+ public static void getFieldTargetNoHostReflectively() throws Throwable {
+ int x = TargetNoHost.class.getDeclaredField("f").getInt(null);
+ }
+ public static void getFieldTargetMissingHostReflectively() throws Throwable {
+ int x = TargetMissingHost.class.getDeclaredField("f").getInt(null);
+ }
+ public static void getFieldTargetNotInstanceHostReflectively() throws Throwable {
+ int x = TargetNotInstanceHost.class.getDeclaredField("f").getInt(null);
+ }
+ public static void getFieldTargetNotOurHostReflectively() throws Throwable {
+ int x = TargetNotOurHost.class.getDeclaredField("f").getInt(null);
+ }
+
+ public static void putFieldTargetNoHostReflectively() throws Throwable {
+ TargetNoHost.class.getDeclaredField("f").setInt(null, 42);
+ }
+ public static void putFieldTargetMissingHostReflectively() throws Throwable {
+ TargetMissingHost.class.getDeclaredField("f").setInt(null, 42);
+ }
+ public static void putFieldTargetNotInstanceHostReflectively() throws Throwable {
+ TargetNotInstanceHost.class.getDeclaredField("f").setInt(null, 42);
+ }
+ public static void putFieldTargetNotOurHostReflectively() throws Throwable {
+ TargetNotOurHost.class.getDeclaredField("f").setInt(null, 42);
+ }
+
+ // MethodHandle field lookup (no access as the lookup will fail)
+
+ public static void getFieldTargetNoHostMH() throws Throwable {
+ MethodHandle mh = lookup().findStaticGetter(TargetNoHost.class, "f", int.class);
+ }
+ public static void getFieldTargetMissingHostMH() throws Throwable {
+ MethodHandle mh = lookup().findStaticGetter(TargetMissingHost.class, "f", int.class);
+ }
+ public static void getFieldTargetNotInstanceHostMH() throws Throwable {
+ MethodHandle mh = lookup().findStaticGetter(TargetNotInstanceHost.class, "f", int.class);
+ }
+ public static void getFieldTargetNotOurHostMH() throws Throwable {
+ MethodHandle mh = lookup().findStaticGetter(TargetNotOurHost.class, "f", int.class);
+ }
+
+ public static void putFieldTargetNoHostMH() throws Throwable {
+ MethodHandle mh = lookup().findStaticSetter(TargetNoHost.class, "f", int.class);
+ }
+ public static void putFieldTargetMissingHostMH() throws Throwable {
+ MethodHandle mh = lookup().findStaticSetter(TargetMissingHost.class, "f", int.class);
+ }
+ public static void putFieldTargetNotInstanceHostMH() throws Throwable {
+ MethodHandle mh = lookup().findStaticSetter(TargetNotInstanceHost.class, "f", int.class);
+ }
+ public static void putFieldTargetNotOurHostMH() throws Throwable {
+ MethodHandle mh = lookup().findStaticSetter(TargetNotOurHost.class, "f", int.class);
+ }
+
}
static class CallerNoHost {
+
+ // method invocations
+
private static void m() {
System.out.println("CallerNoHost.m() - java version");
}
public static void invokeTarget() {
Target.m();
}
public static void invokeTargetNoHost() {
TargetNoHost.m();
}
+
+ // constructor invocations
+
+ private CallerNoHost() {}
+
+ public static void newTarget() {
+ Object o = new Target();
+ }
+ public static void newTargetNoHost() {
+ Object o = new TargetNoHost();
+ }
+
+ // field accesses
+
+ private static int f;
+
+ public static void getFieldTarget() {
+ int x = Target.f;
+ }
+ public static void getFieldTargetNoHost() {
+ int x = TargetNoHost.f;
+ }
+
+ public static void putFieldTarget() {
+ Target.f = 42;
+ }
+ public static void putFieldTargetNoHost() {
+ TargetNoHost.f = 42;
+ }
+
}
static class CallerMissingHost {
String msg = "NoCallerMissingHost"; // for cp entry
+
+ // method invocations
+
private static void m() {
System.out.println("CallerMissingHost.m() - java version");
}
public static void invokeTarget() {
Target.m();
}
public static void invokeTargetMissingHost() {
TargetMissingHost.m();
}
+
+ // constructor invocations
+
+ private CallerMissingHost() {}
+
+ public static void newTarget() {
+ Object o = new Target();
+ }
+ public static void newTargetMissingHost() {
+ Object o = new TargetMissingHost();
+ }
+
+ // field accesses
+
+ private static int f;
+
+ public static void getFieldTarget() {
+ int x = Target.f;
+ }
+ public static void getFieldTargetMissingHost() {
+ int x = TargetMissingHost.f;
+ }
+ public static void putFieldTarget() {
+ Target.f = 42;
+ }
+ public static void putFieldTargetMissingHost() {
+ TargetMissingHost.f = 42;
+ }
+
}
static class CallerNotInstanceHost {
Object[] oa; // create CP entry to use in jcod change
+
+ // method invocations
+
private static void m() {
System.out.println("CallerNotInstanceHost.m() - java version");
}
public static void invokeTarget() {
Target.m();
}
public static void invokeTargetNotInstanceHost() {
TargetNotInstanceHost.m();
}
+
+ // constructor invocations
+
+ private CallerNotInstanceHost() {}
+
+ public static void newTarget() {
+ Object o = new Target();
+ }
+ public static void newTargetNotInstanceHost() {
+ Object o = new TargetNotInstanceHost();
+ }
+
+ // field accesses
+
+ private static int f;
+
+ public static void getFieldTarget() {
+ int x = Target.f;
+ }
+ public static void getFieldTargetNotInstanceHost() {
+ int x = TargetNotInstanceHost.f;
+ }
+ public static void putFieldTarget() {
+ Target.f = 42;
+ }
+ public static void putFieldTargetNotInstanceHost() {
+ TargetNotInstanceHost.f = 42;
+ }
}
static class CallerNotOurHost {
+
+ // method invocations
+
private static void m() {
System.out.println("CallerNotOurHost.m() - java version");
}
public static void invokeTarget() {
Target.m();
}
public static void invokeTargetNotOurHost() {
TargetNotOurHost.m();
}
+
+ // constructor invocations
+
+ private CallerNotOurHost() {}
+
+ public static void newTarget() {
+ Object o = new Target();
+ }
+ public static void newTargetNotOurHost() {
+ Object o = new TargetNotOurHost();
+ }
+
+ // field accesses
+
+ private static int f;
+
+ public static void getFieldTarget() {
+ int x = Target.f;
+ }
+ public static void getFieldTargetNotOurHost() {
+ int x = TargetNotOurHost.f;
+ }
+ public static void putFieldTarget() {
+ Target.f = 42;
+ }
+ public static void putFieldTargetNotOurHost() {
+ TargetNotOurHost.f = 42;
+ }
+
}
static class Target {
+ private Target() {}
+ private static int f;
private static void m() {
System.out.println("Target.m()");
}
}
static class TargetNoHost {
+ private TargetNoHost() {}
+ private static int f;
private static void m() {
System.out.println("TargetNoHost.m() - java version");
}
}
static class TargetMissingHost {
String msg = "NoTargetMissingHost"; // for cp entry
+ private TargetMissingHost() {}
+ private static int f;
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 TargetNotInstanceHost() {}
+ private static int f;
private static void m() {
System.out.println("TargetNotInstanceHost.m() - java version");
}
}
static class TargetNotOurHost {
+ private TargetNotOurHost() {}
+ private static int f;
private static void m() {
System.out.println("TargetNotOurHost.m() - java version");
}
}
public static void main(String[] args) throws Throwable {
! if (args.length < 1) {
! throw new Error("Test mode argument must be one of: method, constructor, getField or putField");
! }
! switch(args[0]) {
! case "method":
! System.out.println("TESTING METHOD INVOCATIONS:");
! test_GoodInvoke();
! test_NoHostInvoke();
! test_MissingHostInvoke();
! test_NotInstanceHostInvoke();
! test_NotOurHostInvoke();
! test_WrongPackageHostInvoke();
! break;
! case "constructor":
! System.out.println("TESTING CONSTRUCTOR INVOCATIONS:");
! test_GoodConstruct();
! test_NoHostConstruct();
! test_MissingHostConstruct();
! test_NotInstanceHostConstruct();
! test_NotOurHostConstruct();
! test_WrongPackageHostConstruct();
! break;
! case "getField":
! System.out.println("TESTING GETFIELD INVOCATIONS:");
! test_GoodGetField();
! test_NoHostGetField();
! test_MissingHostGetField();
! test_NotInstanceHostGetField();
! test_NotOurHostGetField();
! test_WrongPackageHostGetField();
! break;
! case "putField":
! System.out.println("TESTING PUTFIELD INVOCATIONS:");
! test_GoodPutField();
! test_NoHostPutField();
! test_MissingHostPutField();
! test_NotInstanceHostPutField();
! test_NotOurHostPutField();
! test_WrongPackageHostPutField();
! break;
! default:
! throw new Error("Uknown mode: " + args[0] +
! ". Must be one of: method, constructor, getField or putField");
! }
}
! static void test_GoodInvoke(){
try {
Caller.invokeTarget();
}
catch (Exception e) {
! throw new Error("Unexpected exception on good invocation " + e);
}
}
! static void test_NoHostInvoke() 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 {
*** 197,206 ****
--- 574,601 ----
throw new Error("Missing IllegalAccessError: " + msg);
}
catch (IllegalAccessError expected) {
check_expected(expected, msg);
}
+ msg = "TestNestmateMembership$Caller cannot access a member of class " +
+ "TestNestmateMembership$TargetNoHost with modifiers \"private static\"";
+ try {
+ Caller.invokeTargetNoHostReflectively();
+ throw new Error("Missing IllegalAccessException: " + msg);
+ }
+ catch (IllegalAccessException expected) {
+ check_expected(expected, msg);
+ }
+ msg = "no such method: TestNestmateMembership$TargetNoHost.m()void/invokeStatic";
+ try {
+ Caller.invokeTargetNoHostMH();
+ throw new Error("Missing IllegalAccessException: " + msg);
+ }
+ catch (IllegalAccessException 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);
*** 217,286 ****
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 (NoTargetMissingHost) 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 (NoCallerMissingHost) 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 (NoCallerMissingHost) 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);
--- 612,706 ----
catch (IllegalAccessError expected) {
check_expected(expected, msg);
}
}
! static void test_MissingHostInvoke() throws Throwable {
System.out.println("Testing for nest-host class that does not exist");
String msg = "Unable to load nest-host class (NoTargetMissingHost) of " +
"TestNestmateMembership$TargetMissingHost";
String cause_msg = "NoTargetMissingHost";
try {
Caller.invokeTargetMissingHost();
throw new Error("Missing NoClassDefFoundError: " + msg);
}
catch (NoClassDefFoundError expected) {
+ check_expected(expected, msg, cause_msg);
+ }
+ try {
+ Caller.invokeTargetMissingHostReflectively();
+ throw new Error("Missing NoClassDefFoundError: " + msg);
+ }
+ catch (NoClassDefFoundError expected) {
+ check_expected(expected, msg, cause_msg);
+ }
+ msg = "no such method: TestNestmateMembership$TargetMissingHost.m()void/invokeStatic";
+ try {
+ Caller.invokeTargetMissingHostMH();
+ throw new Error("Missing IllegalAccessException: " + msg);
+ }
+ catch (IllegalAccessException expected) {
check_expected(expected, msg);
}
! msg = "no such method: TestNestmateMembership$TargetMissingHost.m()void/invokeStatic";
! try {
! Caller.invokeTargetMissingHostMH();
! throw new Error("Missing IllegalAccessException: " + msg);
! }
! catch (IllegalAccessException expected) {
! check_expected(expected, msg);
}
+
msg = "Unable to load nest-host class (NoCallerMissingHost) of " +
"TestNestmateMembership$CallerMissingHost";
cause_msg = "NoCallerMissingHost";
try {
CallerMissingHost.invokeTarget();
throw new Error("Missing NoClassDefFoundError: " + msg);
}
catch (NoClassDefFoundError expected) {
! check_expected(expected, msg, cause_msg);
}
msg = "Unable to load nest-host class (NoCallerMissingHost) of "+
"TestNestmateMembership$CallerMissingHost";
cause_msg = "NoCallerMissingHost";
try {
CallerMissingHost.invokeTargetMissingHost();
throw new Error("Missing NoClassDefFoundError: " + msg);
}
catch (NoClassDefFoundError expected) {
! check_expected(expected, msg, cause_msg);
}
}
! static void test_NotInstanceHostInvoke() 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);
}
+ try {
+ Caller.invokeTargetNotInstanceHostReflectively();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ msg = "no such method: TestNestmateMembership$TargetNotInstanceHost.m()void/invokeStatic";
+ try {
+ Caller.invokeTargetNotInstanceHostMH();
+ throw new Error("Missing IllegalAccessException: " + msg);
+ }
+ catch (IllegalAccessException 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);
*** 297,317 ****
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);
--- 717,753 ----
catch (IllegalAccessError expected) {
check_expected(expected, msg);
}
}
! static void test_NotOurHostInvoke() 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);
}
+ try {
+ Caller.invokeTargetNotOurHostReflectively();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ msg = "no such method: TestNestmateMembership$TargetNotOurHost.m()void/invokeStatic";
+ try {
+ Caller.invokeTargetNotOurHostMH();
+ throw new Error("Missing IllegalAccessException: " + msg);
+ }
+ catch (IllegalAccessException 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);
*** 328,360 ****
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);
}
}
--- 764,1486 ----
catch (IllegalAccessError expected) {
check_expected(expected, msg);
}
}
! static void test_WrongPackageHostInvoke() {
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.doInvoke();
throw new Error("Missing IllegalAccessError: " + msg);
}
catch (IllegalAccessError expected) {
check_expected(expected, msg);
}
try {
! P2.PackagedNestHost2.Member.doInvoke();
throw new Error("Missing IllegalAccessError: " + msg);
}
catch (IllegalAccessError expected) {
check_expected(expected, msg);
}
}
! // constructor tests
!
! static void test_GoodConstruct(){
! try {
! Caller.newTarget();
! }
! catch (Exception e) {
! throw new Error("Unexpected exception on good construction: " + e);
! }
! }
!
! static void test_NoHostConstruct() throws Throwable {
! System.out.println("Testing for missing nest-host attribute");
! String msg = "tried to access method TestNestmateMembership$TargetNoHost.<init>()V" +
! " from class TestNestmateMembership$Caller";
! try {
! Caller.newTargetNoHost();
! throw new Error("Missing IllegalAccessError: " + msg);
! }
! catch (IllegalAccessError expected) {
! check_expected(expected, msg);
! }
! msg = "class TestNestmateMembership$Caller cannot access a member of class " +
! "TestNestmateMembership$TargetNoHost with modifiers \"private\"";
! try {
! Caller.newTargetNoHostReflectively();
! throw new Error("Missing IllegalAccessException: " + msg);
! }
! catch (IllegalAccessException expected) {
! check_expected(expected, msg);
! }
! msg = "no such constructor: TestNestmateMembership$TargetNoHost.<init>()void/newInvokeSpecial";
! try {
! Caller.newTargetNoHostMH();
! throw new Error("Missing IllegalAccessException: " + msg);
! }
! catch (IllegalAccessException expected) {
! check_expected(expected, msg);
! }
!
! msg = "tried to access method TestNestmateMembership$Target.<init>()V" +
! " from class TestNestmateMembership$CallerNoHost";
! try {
! CallerNoHost.newTarget();
! throw new Error("Missing IllegalAccessError: " + msg);
! }
! catch (IllegalAccessError expected) {
! check_expected(expected, msg);
! }
! msg = "tried to access method TestNestmateMembership$TargetNoHost.<init>()V" +
! " from class TestNestmateMembership$CallerNoHost";
! try {
! CallerNoHost.newTargetNoHost();
! throw new Error("Missing IllegalAccessError: " + msg);
! }
! catch (IllegalAccessError expected) {
! check_expected(expected, msg);
! }
! }
!
! static void test_MissingHostConstruct() throws Throwable {
! System.out.println("Testing for nest-host class that does not exist");
! String msg = "Unable to load nest-host class (NoTargetMissingHost) of " +
! "TestNestmateMembership$TargetMissingHost";
! String cause_msg = "NoTargetMissingHost";
! try {
! Caller.newTargetMissingHost();
! throw new Error("Missing NoClassDefFoundError: " + msg);
! }
! catch (NoClassDefFoundError expected) {
! check_expected(expected, msg, cause_msg);
! }
! try {
! Caller.newTargetMissingHostReflectively();
! throw new Error("Missing NoClassDefFoundError: " + msg);
! }
! catch (NoClassDefFoundError expected) {
! check_expected(expected, msg, cause_msg);
! }
! msg = "no such constructor: TestNestmateMembership$TargetMissingHost.<init>()void/newInvokeSpecial";
! try {
! Caller.newTargetMissingHostMH();
! throw new Error("Missing IllegalAccessException: " + msg);
}
+ catch (IllegalAccessException expected) {
+ check_expected(expected, msg);
+ }
+
+ msg = "Unable to load nest-host class (NoCallerMissingHost) of " +
+ "TestNestmateMembership$CallerMissingHost";
+ cause_msg = "NoCallerMissingHost";
+ try {
+ CallerMissingHost.newTarget();
+ throw new Error("Missing NoClassDefFoundError: " + msg);
+ }
+ catch (NoClassDefFoundError expected) {
+ check_expected(expected, msg, cause_msg);
+ }
+ msg = "Unable to load nest-host class (NoCallerMissingHost) of "+
+ "TestNestmateMembership$CallerMissingHost";
+ cause_msg = "NoCallerMissingHost";
+ try {
+ CallerMissingHost.newTargetMissingHost();
+ throw new Error("Missing NoClassDefFoundError: " + msg);
+ }
+ catch (NoClassDefFoundError expected) {
+ check_expected(expected, msg, cause_msg);
+ }
+ }
+
+ static void test_NotInstanceHostConstruct() 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.newTargetNotInstanceHost();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ try {
+ Caller.newTargetNotInstanceHostReflectively();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ msg = "no such constructor: TestNestmateMembership$TargetNotInstanceHost.<init>()void/newInvokeSpecial";
+ try {
+ Caller.newTargetNotInstanceHostMH();
+ throw new Error("Missing IllegalAccessException: " + msg);
+ }
+ catch (IllegalAccessException 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.newTarget();
+ 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.newTargetNotInstanceHost();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ }
+
+ static void test_NotOurHostConstruct() 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.newTargetNotOurHost();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ try {
+ Caller.newTargetNotOurHostReflectively();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ msg = "no such constructor: TestNestmateMembership$TargetNotOurHost.<init>()void/newInvokeSpecial";
+ try {
+ Caller.newTargetNotOurHostMH();
+ throw new Error("Missing IllegalAccessException: " + msg);
+ }
+ catch (IllegalAccessException 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.newTarget();
+ 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.newTargetNotOurHost();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ }
+
+ static void test_WrongPackageHostConstruct() {
+ 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.doConstruct();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ try {
+ P2.PackagedNestHost2.Member.doConstruct();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ }
+
+ // field tests
+
+ static void test_GoodGetField(){
+ try {
+ Caller.getFieldTarget();
+ }
+ catch (Exception e) {
+ throw new Error("Unexpected exception on good field access: " + e);
+ }
+ }
+
+ static void test_NoHostGetField() throws Throwable {
+ System.out.println("Testing for missing nest-host attribute");
+ String msg = "tried to access field TestNestmateMembership$TargetNoHost.f" +
+ " from class TestNestmateMembership$Caller";
+ try {
+ Caller.getFieldTargetNoHost();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ msg = "class TestNestmateMembership$Caller cannot access a member of class " +
+ "TestNestmateMembership$TargetNoHost with modifiers \"private static\"";
+ try {
+ Caller.getFieldTargetNoHostReflectively();
+ throw new Error("Missing IllegalAccessException: " + msg);
+ }
+ catch (IllegalAccessException expected) {
+ check_expected(expected, msg);
+ }
+ msg = "member is private: TestNestmateMembership$TargetNoHost.f/int/getStatic";
+ try {
+ Caller.getFieldTargetNoHostMH();
+ throw new Error("Missing IllegalAccessException: " + msg);
+ }
+ catch (IllegalAccessException expected) {
+ check_expected(expected, msg);
+ }
+
+ msg = "tried to access field TestNestmateMembership$Target.f" +
+ " from class TestNestmateMembership$CallerNoHost";
+ try {
+ CallerNoHost.getFieldTarget();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ msg = "tried to access field TestNestmateMembership$TargetNoHost.f" +
+ " from class TestNestmateMembership$CallerNoHost";
+ try {
+ CallerNoHost.getFieldTargetNoHost();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ }
+
+ static void test_MissingHostGetField() throws Throwable {
+ System.out.println("Testing for nest-host class that does not exist");
+ String msg = "Unable to load nest-host class (NoTargetMissingHost) of " +
+ "TestNestmateMembership$TargetMissingHost";
+ String cause_msg = "NoTargetMissingHost";
+ try {
+ Caller.getFieldTargetMissingHost();
+ throw new Error("Missing NoClassDefFoundError: " + msg);
+ }
+ catch (NoClassDefFoundError expected) {
+ check_expected(expected, msg, cause_msg);
+ }
+ try {
+ Caller.getFieldTargetMissingHostReflectively();
+ throw new Error("Missing NoClassDefFoundError: " + msg);
+ }
+ catch (NoClassDefFoundError expected) {
+ check_expected(expected, msg, cause_msg);
+ }
+ try {
+ Caller.getFieldTargetMissingHostMH();
+ throw new Error("Missing NoClassDefFoundError: " + msg);
+ }
+ catch (NoClassDefFoundError expected) {
+ check_expected(expected, msg, cause_msg);
+ }
+
+ msg = "Unable to load nest-host class (NoCallerMissingHost) of " +
+ "TestNestmateMembership$CallerMissingHost";
+ cause_msg = "NoCallerMissingHost";
+ try {
+ CallerMissingHost.getFieldTarget();
+ throw new Error("Missing NoClassDefFoundError: " + msg);
+ }
+ catch (NoClassDefFoundError expected) {
+ check_expected(expected, msg, cause_msg);
+ }
+ msg = "Unable to load nest-host class (NoCallerMissingHost) of "+
+ "TestNestmateMembership$CallerMissingHost";
+ cause_msg = "NoCallerMissingHost";
+ try {
+ CallerMissingHost.getFieldTargetMissingHost();
+ throw new Error("Missing NoClassDefFoundError: " + msg);
+ }
+ catch (NoClassDefFoundError expected) {
+ check_expected(expected, msg, cause_msg);
+ }
+ }
+
+ static void test_NotInstanceHostGetField() 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.getFieldTargetNotInstanceHost();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ try {
+ Caller.getFieldTargetNotInstanceHostReflectively();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ try {
+ Caller.getFieldTargetNotInstanceHostMH();
+ 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.getFieldTarget();
+ 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.getFieldTargetNotInstanceHost();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ }
+
+ static void test_NotOurHostGetField() 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.getFieldTargetNotOurHost();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ try {
+ Caller.getFieldTargetNotOurHostReflectively();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ try {
+ Caller.getFieldTargetNotOurHostMH();
+ 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.getFieldTarget();
+ 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.getFieldTargetNotOurHost();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ }
+
+ static void test_WrongPackageHostGetField() {
+ 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.doGetField();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ try {
+ P2.PackagedNestHost2.Member.doGetField();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ }
+
+ static void test_GoodPutField(){
+ try {
+ Caller.putFieldTarget();
+ }
+ catch (Exception e) {
+ throw new Error("Unexpected exception on good field access: " + e);
+ }
+ }
+
+ static void test_NoHostPutField() throws Throwable {
+ System.out.println("Testing for missing nest-host attribute");
+ String msg = "tried to access field TestNestmateMembership$TargetNoHost.f" +
+ " from class TestNestmateMembership$Caller";
+ try {
+ Caller.putFieldTargetNoHost();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ msg = "class TestNestmateMembership$Caller cannot access a member of class " +
+ "TestNestmateMembership$TargetNoHost with modifiers \"private static\"";
+ try {
+ Caller.putFieldTargetNoHostReflectively();
+ throw new Error("Missing IllegalAccessException: " + msg);
+ }
+ catch (IllegalAccessException expected) {
+ check_expected(expected, msg);
+ }
+ msg = "member is private: TestNestmateMembership$TargetNoHost.f/int/putStatic";
+ try {
+ Caller.putFieldTargetNoHostMH();
+ throw new Error("Missing IllegalAccessException: " + msg);
+ }
+ catch (IllegalAccessException expected) {
+ check_expected(expected, msg);
+ }
+
+ msg = "tried to access field TestNestmateMembership$Target.f" +
+ " from class TestNestmateMembership$CallerNoHost";
+ try {
+ CallerNoHost.putFieldTarget();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ msg = "tried to access field TestNestmateMembership$TargetNoHost.f" +
+ " from class TestNestmateMembership$CallerNoHost";
+ try {
+ CallerNoHost.putFieldTargetNoHost();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ }
+
+ static void test_MissingHostPutField() throws Throwable {
+ System.out.println("Testing for nest-host class that does not exist");
+ String msg = "Unable to load nest-host class (NoTargetMissingHost) of " +
+ "TestNestmateMembership$TargetMissingHost";
+ String cause_msg = "NoTargetMissingHost";
+ try {
+ Caller.putFieldTargetMissingHost();
+ throw new Error("Missing NoClassDefFoundError: " + msg);
+ }
+ catch (NoClassDefFoundError expected) {
+ check_expected(expected, msg, cause_msg);
+ }
+ try {
+ Caller.putFieldTargetMissingHostReflectively();
+ throw new Error("Missing NoClassDefFoundError: " + msg);
+ }
+ catch (NoClassDefFoundError expected) {
+ check_expected(expected, msg, cause_msg);
+ }
+ try {
+ Caller.putFieldTargetMissingHostMH();
+ throw new Error("Missing NoClassDefFoundError: " + msg);
+ }
+ catch (NoClassDefFoundError expected) {
+ check_expected(expected, msg, cause_msg);
+ }
+
+ msg = "Unable to load nest-host class (NoCallerMissingHost) of " +
+ "TestNestmateMembership$CallerMissingHost";
+ cause_msg = "NoCallerMissingHost";
+ try {
+ CallerMissingHost.putFieldTarget();
+ throw new Error("Missing NoClassDefFoundError: " + msg);
+ }
+ catch (NoClassDefFoundError expected) {
+ check_expected(expected, msg, cause_msg);
+ }
+ msg = "Unable to load nest-host class (NoCallerMissingHost) of "+
+ "TestNestmateMembership$CallerMissingHost";
+ cause_msg = "NoCallerMissingHost";
+ try {
+ CallerMissingHost.putFieldTargetMissingHost();
+ throw new Error("Missing NoClassDefFoundError: " + msg);
+ }
+ catch (NoClassDefFoundError expected) {
+ check_expected(expected, msg, cause_msg);
+ }
+ }
+
+ static void test_NotInstanceHostPutField() 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.putFieldTargetNotInstanceHost();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ try {
+ Caller.putFieldTargetNotInstanceHostReflectively();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ try {
+ Caller.putFieldTargetNotInstanceHostMH();
+ 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.putFieldTarget();
+ 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.putFieldTargetNotInstanceHost();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ }
+
+ static void test_NotOurHostPutField() 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.putFieldTargetNotOurHost();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ try {
+ Caller.putFieldTargetNotOurHostReflectively();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ try {
+ Caller.putFieldTargetNotOurHostMH();
+ 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.putFieldTarget();
+ 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.putFieldTargetNotOurHost();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ }
+
+ static void test_WrongPackageHostPutField() {
+ 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.doPutField();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ try {
+ P2.PackagedNestHost2.Member.doPutField();
+ throw new Error("Missing IllegalAccessError: " + msg);
+ }
+ catch (IllegalAccessError expected) {
+ check_expected(expected, msg);
+ }
+ }
+
+ // utilities
+
+ 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);
+ }
+
+ static void check_expected(Throwable expected, String msg, String cause_msg) {
+ if (!expected.getMessage().contains(msg)) {
+ throw new Error("Wrong " + expected.getClass().getSimpleName() +": \"" +
+ expected.getMessage() + "\" does not contain \"" +
+ msg + "\"");
+ }
+ Throwable cause = expected.getCause();
+ if (cause instanceof NoClassDefFoundError) {
+ if (!cause.getMessage().contains(cause_msg)) {
+ throw new Error(expected.getClass().getSimpleName() +
+ " has wrong cause " + cause.getClass().getSimpleName() +": \"" +
+ cause.getMessage() + "\" does not contain \"" +
+ cause_msg + "\"");
+ }
+ }
+ else throw new Error(expected.getClass().getSimpleName() +
+ " has wrong cause " + cause.getClass().getSimpleName());
+
+ System.out.println("OK - got expected exception: " + expected +
+ " with cause " + cause);
+ }
+
}
< prev index next >