1 package runtime.valhalla.nestmates;
   2 
   3 import jdk.test.lib.Asserts;
   4 
   5 import runtime.valhalla.nestmates.p2.MethodHandleSubTop;
   6 
   7 /*
   8  * @test MethodHandleInheritTest
   9  * @summary Verify parent's protected and private methods access from children classes using MethodHandles
  10  * @library /testlibrary /
  11  * @run main runtime.valhalla.nestmates.MethodHandleInheritTest positive
  12  * @run main runtime.valhalla.nestmates.MethodHandleInheritTest negative
  13  */
  14 public class MethodHandleInheritTest {
  15 
  16     private static final String METHOD_NAME_PROTECTED = "getField";
  17     private static final String FIELD_NAME_PROTECTED = "field";
  18     private static final String METHOD_NAME_PRIVATE = "privateGetField";
  19     private static final String FIELD_NAME_PRIVATE = "privateField";
  20 
  21     public static void main(String[] args) throws Throwable {
  22         MethodHandleInheritTest methodHandleInheritTest = new MethodHandleInheritTest();
  23         if (args.length != 1) {
  24             throw new Error("TESTBUG: invalid number of input arguments");
  25         }
  26 
  27         switch (args[0]) {
  28             case "positive":
  29                 methodHandleInheritTest.testPositive();
  30                 break;
  31             case "negative":
  32                 methodHandleInheritTest.testNegative();
  33                 break;
  34             default:
  35                 throw new Error("TESTBUG: unknown input argument");
  36         }
  37     }
  38 
  39     public void testPositive() throws Throwable {
  40         MethodHandleSubTop methodHandleSubTop = new MethodHandleSubTop();
  41         Asserts.assertEquals((int) methodHandleSubTop.getSuperMethodMH(METHOD_NAME_PROTECTED).invokeExact(methodHandleSubTop), 1, "top -> parent method");
  42         Asserts.assertEquals((int) methodHandleSubTop.getSuperFieldMH(FIELD_NAME_PROTECTED).invokeExact(methodHandleSubTop), 1, "top -> parent field");
  43 
  44         MethodHandleSubTop.Inner inner = methodHandleSubTop.new Inner();
  45         Asserts.assertEquals((int) inner.getSuperProtectedMethodMH().invokeExact(methodHandleSubTop), 1, "inner -> top -> parent method");
  46         Asserts.assertEquals((int) inner.getSuperProtectedFieldMH().invokeExact(methodHandleSubTop), 1, "inner -> top -> parent field");
  47 
  48         MethodHandleSubTop.Inner.InnerInner innerInner = inner.new InnerInner();
  49         Asserts.assertEquals((int) innerInner.getSuperProtectedMethodMH().invokeExact(methodHandleSubTop), 1, "innerInner -> inner -> top -> parent method");
  50         Asserts.assertEquals((int) innerInner.getSuperProtectedFieldMH().invokeExact(methodHandleSubTop), 1, "innerInner -> inner -> top -> parent field");
  51     }
  52 
  53     public void testNegative() throws NoSuchMethodException, NoSuchFieldException, IllegalAccessException {
  54         boolean hasExceptionBeenThrown = true;
  55         MethodHandleSubTop methodHandleSubTop = new MethodHandleSubTop();
  56         MethodHandleSubTop.Inner inner = methodHandleSubTop.new Inner();
  57         MethodHandleSubTop.Inner.InnerInner innerInner = inner.new InnerInner();
  58 
  59         try {
  60             inner.getSuperMethodMH(METHOD_NAME_PROTECTED);
  61             hasExceptionBeenThrown = false;
  62         } catch (NoSuchMethodException ex) {
  63             System.out.println("Expected exception");
  64         }
  65 
  66         try {
  67             inner.getSuperFieldMH(FIELD_NAME_PROTECTED);
  68             hasExceptionBeenThrown = false;
  69         } catch (NoSuchFieldException ex) {
  70             System.out.println("Expected exception");
  71         }
  72 
  73         try {
  74             innerInner.getSuperMethodMH(METHOD_NAME_PROTECTED);
  75             hasExceptionBeenThrown = false;
  76         } catch (NoSuchMethodException ex) {
  77             System.out.println("Expected exception");
  78         }
  79 
  80         try {
  81             innerInner.getSuperFieldMH(FIELD_NAME_PROTECTED);
  82             hasExceptionBeenThrown = false;
  83         } catch (NoSuchFieldException ex) {
  84             System.out.println("Expected exception");
  85         }
  86 
  87         try {
  88             methodHandleSubTop.getSuperMethodMH(METHOD_NAME_PRIVATE);
  89             hasExceptionBeenThrown = false;
  90         } catch (IllegalAccessException ex) {
  91             System.out.println("Expected exception");
  92         }
  93 
  94         try {
  95             methodHandleSubTop.getSuperFieldMH(FIELD_NAME_PRIVATE);
  96             hasExceptionBeenThrown = false;
  97         } catch (IllegalAccessException ex) {
  98             System.out.println("Expected exception");
  99         }
 100 
 101         if (!hasExceptionBeenThrown) {
 102             throw new Error("Expected exception have not been thrown");
 103         }
 104     }
 105 }