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 }