< prev index next >

test/hotspot/jtreg/vmTestbase/vm/runtime/defmeth/PrivateMethodsTest.java

Print this page
rev 50606 : imported patch jep181-rev3


  31 import vm.runtime.defmeth.shared.data.*;
  32 import static vm.runtime.defmeth.shared.data.method.body.CallMethod.Invoke.*;
  33 import static vm.runtime.defmeth.shared.data.method.body.CallMethod.IndexbyteOp.*;
  34 import vm.runtime.defmeth.shared.builder.TestBuilder;
  35 import static vm.runtime.defmeth.shared.ExecutionMode.*;
  36 
  37 /**
  38  * Scenarios on private methods in interfaces.
  39  */
  40 public class PrivateMethodsTest extends DefMethTest {
  41 
  42     public static void main(String[] args) {
  43         TestBase.runTest(new PrivateMethodsTest(), args);
  44     }
  45 
  46     // invokevirtual & invokeinterface from same/subintf
  47     // Spec change July 2013 to not allow invokevirtual or invokeinterface
  48     // to even see an interface private method
  49     // Throw ICCE if method resolution returns interface private method
  50 

















  51     /*
  52      * testPrivateInvokeVirtual
  53      *
  54      * interface I {
  55      *   default private int privateM() { return 1; }
  56      *   default public  int m()        { return (I)this.privateM(); } // invokevirtual
  57      * }
  58      * class C implements I {}
  59      *
  60      * TEST: I o = new C(); o.m()I throws VerifyError
  61      * TEST: C o = new C(); o.m()I throws VerifyError
  62      */
  63     @NotApplicableFor(modes = { REDEFINITION }) // Can't redefine a class that gets error during loading
  64     public void testPrivateInvokeVirtual() {
  65         TestBuilder b = factory.getBuilder();
  66 
  67         Interface I = b.intf("I")
  68                 .defaultMethod("privateM", "()I")
  69                     .private_().returns(1).build()
  70 
  71                 // force an invokevirtual of an IMR to test verification code
  72                 .defaultMethod("m", "()I")
  73                     .invoke(VIRTUAL, b.intfByName("I"), null, "privateM", "()I", INTERFACEMETHODREF).build()
  74             .build();
  75 
  76         ConcreteClass C = b.clazz("C").implement(I).build();
  77 
  78         b.test().callSite(I, C, "m", "()I").throws_(VerifyError.class).done()
  79          .test().callSite(C, C, "m", "()I").throws_(VerifyError.class).done()
  80 
  81         .run();
  82     }
  83 
  84     /*
  85      * testPrivateInvokeIntf
  86      *
  87      * interface I {
  88      *   default private int privateM() { return 1; }
  89      *   default public  int m()        { return (I)this.privateM(); } // invokeinterface
  90      * }
  91      * class C implements I {}
  92      *
  93      * TEST: I o = new C(); o.m()I throws IncompatibleClassChangeError
  94      * TEST: C o = new C(); o.m()I throws IncompatibleClassChangeError
  95      */
  96     public void testPrivateInvokeIntf() {
  97         TestBuilder b = factory.getBuilder();
  98 
  99         Interface I = b.intf("I")
 100                 .defaultMethod("privateM", "()I")
 101                     .private_().returns(1).build()
 102                 .defaultMethod("m", "()I")
 103                     .invoke(INTERFACE, b.intfByName("I"), null, "privateM", "()I", CALLSITE).build()
 104             .build();
 105 
 106         ConcreteClass C = b.clazz("C").implement(I).build();
 107 
 108         b.test().callSite(I, C, "m", "()I").throws_(IncompatibleClassChangeError.class).done()
 109          .test().callSite(C, C, "m", "()I").throws_(IncompatibleClassChangeError.class).done()
 110 
 111         .run();
 112     }
 113 
 114     /*
 115      * testPrivateInvokeStatic
 116      *
 117      * interface I {
 118      *   default private int privateM() { return 1; }
 119      *   default public  int m()        { return I.privateM(); } // invokestatic
 120      * }
 121      * class C implements I {}
 122      *
 123      * TEST: I o = new C(); o.m()I throws LinkageError
 124      * TEST: C o = new C(); o.m()I throws LinkageError
 125      */
 126     public void testPrivateInvokeStatic() {
 127         TestBuilder b = factory.getBuilder();
 128 
 129         Interface I = b.intf("I")
 130                 .defaultMethod("privateM", "()I")
 131                     .private_().returns(1).build()
 132                 .defaultMethod("m", "()I")
 133                     .invoke(STATIC, b.intfByName("I"), null, "privateM", "()I", CALLSITE).build()
 134             .build();
 135 
 136         ConcreteClass C = b.clazz("C").implement(I).build();
 137 
 138         b.test().callSite(I, C, "m", "()I").throws_(LinkageError.class).done()
 139          .test().callSite(C, C, "m", "()I").throws_(LinkageError.class).done()
 140 
 141         .run();
 142     }
 143 
 144     // call from another default method in the same interface
 145     /*
 146      * testPrivateCallSameClass
 147      *
 148      * interface I {
 149      *   default private privateM()I { return 1; }
 150      *   default public int m() { return I.super.privateM(); }
 151      * }
 152      * class C implements I {}
 153      *
 154      * TEST: { I o = new C(); o.m()I  == 1; }
 155      * TEST: { C o = new C(); o.m()I  == 1; }
 156      */
 157     public void testPrivateCallSameClass() {
 158         TestBuilder b = factory.getBuilder();
 159 
 160         Interface I = b.intf("I")
 161                 .defaultMethod("privateM", "()I")
 162                     .private_().returns(1).build()
 163                 .defaultMethod("m", "()I")
 164                     .invokeSpecial(b.intfByName("I"), "privateM", "()I").build()
 165             .build();
 166 
 167         ConcreteClass C = b.clazz("C").implement(I).build();
 168 
 169         b.test().callSite(I, C, "m", "()I").returns(1).done()
 170          .test().callSite(C, C, "m", "()I").returns(1).done()
 171 
 172         .run();
 173     }
 174 
 175     /*
 176      * testPrivateCallSubIntf
 177      *
 178      * Attempt to call from subinterface fails
 179 
 180      * interface I {
 181      *   default private privateM()I { return 1; }
 182      * }
 183      * J, K, L use invokespecial
 184      * interface J extends I {
 185      *   default public int m() { return I.super.privateM(); }
 186      * }
 187      * interface K extends I {
 188      *   default public int m() { return K.super.privateM(); }
 189      * }
 190      * interface L extends J {
 191      *   default public int m() { return I.super.privateM(); }
 192      * }
 193      * class C implements J {}
 194      * class D implements K {}
 195      * class E implements L {}
 196      *
 197      * TEST: { J o = new C(); o.m()I throws IAE; }
 198      * TEST: { C o = new C(); o.m()I throws IAE; }
 199      * TEST: { K o = new D(); o.m()I throws NSME; } // does not see
 200      * TEST: { D o = new D(); o.m()I throws NSME; }
 201      * TEST: { L o = new E(); o.m()I throws VerifyError; } // VerifyError intfmethodref


 231         ConcreteClass D = b.clazz("D").implement(K).build();
 232 
 233         ConcreteClass E = b.clazz("E").implement(L).build();
 234 
 235         b.test().callSite(J, C, "m", "()I").throws_(IllegalAccessError.class).done()
 236          .test().callSite(C, C, "m", "()I").throws_(IllegalAccessError.class).done()
 237 
 238          .test().callSite(K, D, "m", "()I").throws_(NoSuchMethodError.class).done()
 239          .test().callSite(D, D, "m", "()I").throws_(NoSuchMethodError.class).done()
 240 
 241          .test().callSite(L, E, "m", "()I").throws_(VerifyError.class).done()
 242          .test().callSite(E, E, "m", "()I").throws_(VerifyError.class).done()
 243 
 244         .run();
 245     }
 246 
 247     /*
 248      * Attempt to call from subclass fails
 249      *
 250      * interface I {
 251      *   default private privateM()I { return 1; }
 252      * }
 253      * class C implements I {
 254      *   public int m() { return I.super.privateM(); }
 255      * }
 256      * class D extends C {
 257      *   public int m() { return I.super.privateM(); }
 258      * }
 259      * class E extends C {
 260      *   public int m() { return C.super.privateM(); }
 261      * }
 262      *
 263      * TEST: { C o = new C(); o.m()I throws LinkageError }
 264      * TEST: { D o = new D(); o.m()I throws LinkageError }
 265      * TEST: { E o = new E(); o.m()I throws NoSuchMethodError; }
 266      */
 267     @NotApplicableFor(modes = { REDEFINITION }) // Can't redefine a class that gets error during loading
 268     public void testPrivateCallImplClass() {
 269         TestBuilder b = factory.getBuilder();
 270 
 271         Interface I = b.intf("I")
 272                 .defaultMethod("privateM", "()I")
 273                     .private_().returns(1).build()
 274             .build();
 275 
 276         ConcreteClass C = b.clazz("C").implement(I)
 277                 .concreteMethod("m", "()I")
 278                     .invokeSpecial(I, "privateM", "()I").build()
 279             .build();
 280 
 281         ConcreteClass D = b.clazz("D").extend(C)
 282                 .concreteMethod("m", "()I")
 283                     .invokeSpecial(I, "privateM", "()I").build()
 284             .build();
 285 
 286         ConcreteClass E = b.clazz("E").extend(C)
 287                 .concreteMethod("m", "()I")
 288                     .invokeSpecial(C, "privateM", "()I").build()
 289             .build();
 290 
 291         Class eeExpectedClass;

 292         if (factory.getVer() >= 52) {
 293             eeExpectedClass = NoSuchMethodError.class;

 294         } else {
 295             // The test gets a VerifyError in this case due to an
 296             // invokespecial IMR bytecode.  This was not allowed
 297             // until class file version 52.  (See 8030249.)
 298             eeExpectedClass = VerifyError.class;

 299         }
 300         b.test().callSite(C, C, "m", "()I").throws_(LinkageError.class).done()
 301          .test().callSite(D, D, "m", "()I").throws_(LinkageError.class).done()
 302          .test().callSite(E, E, "m", "()I").throws_(eeExpectedClass).done()
 303 
 304         .run();
 305     }
 306 
 307     // doesn't participate in default method analysis
 308     //   method overriding
 309 
 310     /*
 311      * testPrivateDefault
 312      *
 313      * interface I {
 314      *   default private int m() { return 1; }
 315      * }
 316      * class C implements I {}
 317      *
 318      * TEST: { I o = new C(); o.m()I throws IllegalAccessError; }
 319      *                 -mode reflect throws NoSuchMethodException
 320      * TEST: { C o = new C(); o.m()I throws java/lang/NoSuchMethodError; }
 321      */
 322     public void testPrivateDefault() {
 323         TestBuilder b = factory.getBuilder();
 324 
 325         Interface I = b.intf("I")
 326                 .defaultMethod("m", "()I")
 327                     .private_().returns(1).build()
 328             .build();
 329 
 330         ConcreteClass C = b.clazz("C").implement(I).build();
 331 
 332         Class expectedClass;
 333         if (factory.getExecutionMode().equals("REFLECTION")) {
 334             expectedClass = NoSuchMethodException.class;
 335         } else {
 336             expectedClass = IllegalAccessError.class;
 337         }
 338 
 339         b.test().callSite(I, C, "m", "()I").throws_(expectedClass).done()
 340          .test().callSite(C, C, "m", "()I").throws_(NoSuchMethodError.class).done()
 341 
 342         .run();
 343     }
 344 
 345     /*
 346      * testPrivateDefaultVsConcrete
 347      *
 348      * interface I {
 349      *   default private int m() { return 1; }
 350      * }
 351      * class C implements I {
 352      *   public int m() { return 2; }
 353      * }
 354      *
 355      * TEST: { I o = new C(); o.m()I  == IllegalAccessError; }
 356      *                 -mode reflect throws NoSuchMethodException
 357      * TEST: { C o = new C(); o.m()I  == 2; }
 358      */
 359     public void testPrivateDefaultVsConcrete() {
 360         TestBuilder b = factory.getBuilder();
 361 
 362         Interface I = b.intf("I")
 363                 .defaultMethod("m", "()I")
 364                     .private_().returns(1).build()
 365             .build();
 366 
 367         ConcreteClass C = b.clazz("C").implement(I)
 368                 .concreteMethod("m", "()I").returns(2).build()
 369             .build();
 370 
 371         Class expectedClass;
 372         if (factory.getExecutionMode().equals("REFLECTION")) {
 373             expectedClass = NoSuchMethodException.class;
 374         } else {
 375             expectedClass = IllegalAccessError.class;
 376         }
 377 
 378         b.test().callSite(I, C, "m", "()I").throws_(expectedClass).done()
 379          .test().callSite(C, C, "m", "()I").returns(2).done()
 380 
 381         .run();
 382     }
 383 
 384     /*
 385      * testPublicOverridePrivate
 386      *
 387      * interface I {
 388      *   default private int m() { return 1; }
 389      * }
 390      * interface J extends I {
 391      *   default public int m() { return 2; }
 392      * }
 393      * class C implements J {}
 394      *
 395      * TEST: { I o = new C(); o.m()I throws IllegalAccessError; }
 396      *                 -mode reflect throws NoSuchMethodException
 397      * TEST: { J o = new C(); o.m()I  == 2; }
 398      * TEST: { C o = new C(); o.m()I  == 2; }
 399      */
 400     public void testPublicOverridePrivate() {
 401         TestBuilder b = factory.getBuilder();
 402 
 403         Interface I = b.intf("I")
 404                 .defaultMethod("m", "()I")
 405                     .private_().returns(1).build()
 406             .build();
 407 
 408         Interface J = b.intf("J").extend(I)


 416         if (factory.getExecutionMode().equals("REFLECTION")) {
 417             expectedClass = NoSuchMethodException.class;
 418         } else {
 419             expectedClass = IllegalAccessError.class;
 420         }
 421 
 422         b.test().callSite(I, C, "m", "()I").throws_(expectedClass).done()
 423          .test().callSite(J, C, "m", "()I").returns(2).done()
 424          .test().callSite(C, C, "m", "()I").returns(2).done()
 425 
 426         .run();
 427     }
 428 
 429     /*
 430      * testPrivateOverrideDefault
 431      *
 432      * interface I {
 433      *   default public int m() { return 1; }
 434      * }
 435      * interface J extends I {
 436      *   default private int m() { return 2; }
 437      * }
 438      * class C implements J {}
 439      *
 440      * TEST: { I o = new C(); o.m()I  == 1; }
 441      * TEST: { J o = new C(); o.m()I  == IllegalAccessError; } II J.m priv
 442      * TEST: { C o = new C(); o.m()I  == 1; }
 443      */
 444     /*
 445 
 446         REFLECTION:
 447   Test2_J_C_m                   : FAILED
 448     nsk.share.TestFailure: Caught exception as expected, but its type is wrong:
 449       expected: java.lang.IllegalAccessError;
 450       actual: java.lang.NoSuchMethodException.
 451      */
 452     public void testPrivateOverrideDefault() {
 453         TestBuilder b = factory.getBuilder();
 454 
 455         Interface I = b.intf("I")
 456                 .defaultMethod("m", "()I")
 457                     .returns(1).build()
 458             .build();
 459 
 460         Interface J = b.intf("J").extend(I)
 461                 .defaultMethod("m", "()I")
 462                     .private_().returns(2).build()
 463             .build();
 464 
 465         ConcreteClass C = b.clazz("C").implement(J).build();
 466 
 467         b.test().callSite(I, C, "m", "()I").returns(1).done()
 468          .test().privateCallSite(J, C, "m", "()I").throws_(IllegalAccessError.class).done()
 469          .test().callSite(C, C, "m", "()I").returns(1).done()
 470 
 471         .run();
 472     }
 473 
 474     /*
 475      * testPrivateReabstract
 476      *
 477      * interface I {
 478      *   default private int m() { return 1; }
 479      * }
 480      * interface J extends I {
 481      *   abstract public int m();
 482      * }
 483      * class C implements J {}
 484      *
 485      * TEST: { I o = new C(); o.m()I throws IllegalAccessError; } II I.m
 486      *                 -mode reflect throws NoSuchMethodException
 487      * TEST: { J o = new C(); o.m()I throws java/lang/AbstractMethodError; }
 488      * TEST: { C o = new C(); o.m()I throws java/lang/AbstractMethodError; }
 489      */
 490     public void testPrivateReabstract() {
 491         TestBuilder b = factory.getBuilder();
 492 
 493         Interface I = b.intf("I")
 494                 .defaultMethod("m", "()I")
 495                     .private_().returns(1).build()
 496             .build();
 497 
 498         Interface J = b.intf("J").extend(I)


 505         if (factory.getExecutionMode().equals("REFLECTION")) {
 506             expectedClass = NoSuchMethodException.class;
 507         } else {
 508             expectedClass = IllegalAccessError.class;
 509         }
 510 
 511         b.test().callSite(I, C, "m", "()I").throws_(expectedClass).done()
 512          .test().callSite(J, C, "m", "()I").throws_(AbstractMethodError.class).done()
 513          .test().callSite(C, C, "m", "()I").throws_(AbstractMethodError.class).done()
 514 
 515         .run();
 516     }
 517 
 518     /*
 519      * testPrivateOverrideAbstract
 520      *
 521      * interface I {
 522      *   abstract public int m();
 523      * }
 524      * interface J extends I {
 525      *   default private int m() { return 1; }
 526      * }
 527      * class C implements J {}
 528      *
 529      * TEST: { I o = new C(); o.m()I throws AbstractMethodError }
 530      * TEST: { J o = new C(); o.m()I throws IncompatibleClassChangeError }
 531      * TEST: { C o = new C(); o.m()I throws AbstractMethodError }
 532      */
 533     /*
 534          REFLECTION:
 535   Test1_I_C_m                   : FAILED
 536     nsk.share.TestFailure: No exception was thrown: java.lang.AbstractMethodError
 537   Test2_J_C_m                   : FAILED
 538     nsk.share.TestFailure: No exception was thrown: java.lang.AbstractMethodError
 539   Test3_C_C_m                   : FAILED
 540     nsk.share.TestFailure: No exception was thrown: java.lang.AbstractMethodError
 541      */
 542     public void testPrivateOverrideAbstract() {
 543         TestBuilder b = factory.getBuilder();
 544 
 545         Interface I = b.intf("I")
 546                 .abstractMethod("m", "()I").build()
 547             .build();
 548 
 549         Interface J = b.intf("J").extend(I)
 550                 .defaultMethod("m", "()I")
 551                     .private_().returns(1).build()
 552             .build();
 553 
 554         ConcreteClass C = b.clazz("C").implement(J).build();
 555 
 556         Class expectedClass;
 557         if (factory.getExecutionMode().equals("REFLECTION")) {
 558             expectedClass = IllegalAccessException.class;
 559         } else {
 560             expectedClass = IncompatibleClassChangeError.class;
 561         }
 562 
 563         b.test().callSite(I, C, "m", "()I").throws_(AbstractMethodError.class).done()
 564          .test().privateCallSite(J, C, "m", "()I").throws_(expectedClass).done()
 565          .test().callSite(C, C, "m", "()I").throws_(AbstractMethodError.class).done()
 566          .run();
 567     }
 568 
 569     /*
 570      * testPrivateInheritedDefault
 571      *
 572      * interface I {
 573      *   default private int m() { return 1; }
 574      * }
 575      * class B implements I {}
 576      * class C extends B {}
 577      *
 578      * TEST: { I o = new C(); o.m()I throws IllegalAccessError } II I.m
 579      *                 -mode reflect throws NoSuchMethodException
 580      * TEST: { B o = new C(); o.m()I throws NoSuchMethodError }
 581      * TEST: { C o = new C(); o.m()I throws NoSuchMethodError }
 582      */
 583     public void testPrivateInheritedDefault() {
 584         TestBuilder b = factory.getBuilder();
 585 
 586         Interface I = b.intf("I")
 587                 .defaultMethod("m", "()I")
 588                     .private_().returns(1).build()
 589             .build();
 590 
 591         ConcreteClass B = b.clazz("B").implement(I).build();
 592         ConcreteClass C = b.clazz("C").extend(B).build();
 593 
 594         Class expectedClass;
 595         if (factory.getExecutionMode().equals("REFLECTION")) {
 596             expectedClass = NoSuchMethodException.class;
 597         } else {
 598             expectedClass = IllegalAccessError.class;
 599         }
 600 
 601         b.test().callSite(I, C, "m","()I").throws_(expectedClass).done()
 602          .test().callSite(B, C, "m","()I").throws_(NoSuchMethodError.class).done()
 603          .test().callSite(C, C, "m","()I").throws_(NoSuchMethodError.class).done()
 604 
 605         .run();
 606 
 607     }
 608 
 609     /*
 610      * testPrivateDefaultVsConcreteInherited
 611      *
 612      * interface I {
 613      *    default private int m() { return 1; }
 614      * }
 615      * class B {
 616      *   public int m() { return 2; }
 617      * }
 618      * class C extends B implements I {}
 619      *
 620      * TEST: { I o = new C(); o.m()I  == throws IllegalAccessError; }
 621      *                     -mode reflect throws NoSuchMethodException
 622      * TEST: { B o = new C(); o.m()I  == 2; }
 623      * TEST: { C o = new C(); o.m()I  == 2; }
 624      */
 625     public void testPrivateDefaultVsConcreteInherited() {
 626         TestBuilder b = factory.getBuilder();
 627 
 628         Interface I = b.intf("I")
 629                 .defaultMethod("m", "()I")
 630                     .private_().returns(1).build()
 631             .build();
 632 
 633         ConcreteClass B = b.clazz("B")
 634                 .concreteMethod("m", "()I").returns(2).build()
 635                 .build();
 636 
 637         ConcreteClass C = b.clazz("C").extend(B).implement(I).build();
 638 
 639         Class expectedClass;
 640         if (factory.getExecutionMode().equals("REFLECTION")) {
 641             expectedClass = NoSuchMethodException.class;
 642         } else {
 643             expectedClass = IllegalAccessError.class;
 644         }
 645 
 646         b.test().callSite(I, C, "m","()I").throws_(expectedClass).done()
 647          .test().callSite(B, C, "m","()I").returns(2).done()
 648          .test().callSite(C, C, "m","()I").returns(2).done()
 649 
 650         .run();
 651     }
 652 
 653     /*
 654      * testPrivateConflict
 655      *
 656      * Conflicting default methods
 657      *
 658      * interface I {
 659      *   default private int m() { return 1; }
 660      * }
 661      * interface J {
 662      *   default public int m() { return 2; }
 663      * }
 664      * class C implements I, J {}
 665      *
 666      * TEST: { I o = new C(); o.m()I throws IllegalAccessError; }
 667      *                 -mode reflect throws NoSuchMethodException
 668      * TEST: { J o = new C(); o.m()I  == 2; }
 669      * TEST: { C o = new C(); o.m()I  == 2; }
 670      */
 671     public void testPrivateConflict() {
 672         TestBuilder b = factory.getBuilder();
 673 
 674         Interface I = b.intf("I")
 675                 .defaultMethod("m", "()I").private_().returns(1).build()
 676             .build();
 677 
 678         Interface J = b.intf("J")
 679                 .defaultMethod("m", "()I").returns(2).build()




  31 import vm.runtime.defmeth.shared.data.*;
  32 import static vm.runtime.defmeth.shared.data.method.body.CallMethod.Invoke.*;
  33 import static vm.runtime.defmeth.shared.data.method.body.CallMethod.IndexbyteOp.*;
  34 import vm.runtime.defmeth.shared.builder.TestBuilder;
  35 import static vm.runtime.defmeth.shared.ExecutionMode.*;
  36 
  37 /**
  38  * Scenarios on private methods in interfaces.
  39  */
  40 public class PrivateMethodsTest extends DefMethTest {
  41 
  42     public static void main(String[] args) {
  43         TestBase.runTest(new PrivateMethodsTest(), args);
  44     }
  45 
  46     // invokevirtual & invokeinterface from same/subintf
  47     // Spec change July 2013 to not allow invokevirtual or invokeinterface
  48     // to even see an interface private method
  49     // Throw ICCE if method resolution returns interface private method
  50 
  51     // Spec change JDK 11 - invokeinterface can be used for private interface
  52     // methods and is now the preferred invocation bytecode - so no ICCE.
  53     // Private methods are skipped during selection unless the resolved method
  54     // is private.
  55     // This change is not dependent on the classfile version.
  56 
  57     // Note on reflection testing:
  58     //   Reflection is only used for the initial callsite, which is not always
  59     //   the method of interest. For example where a default method m() calls
  60     //   the private interface method privateM(). It is the latter call we are
  61     //   really testing, but it is the call of the default method that occurs
  62     //   via reflection.
  63     //   In private cases reflection triggers a NoSuchMethodException instead of the
  64     //   expected IllegalAccessError. This indicates it is getDeclaredMethod() that is
  65     //   failing rather than the actual invoke(). Which in turn suggests the wrong class
  66     //   is being used, or that getMethod() is being used instead of getDeclaredMethod().
  67 
  68     /*
  69      * testPrivateInvokeVirtual
  70      *
  71      * interface I {
  72      *           private int privateM() { return 1; }
  73      *   default public  int m()        { return (I)this.privateM(); } // invokevirtual
  74      * }
  75      * class C implements I {}
  76      *
  77      * TEST: I o = new C(); o.m()I throws VerifyError
  78      * TEST: C o = new C(); o.m()I throws VerifyError
  79      */
  80     @NotApplicableFor(modes = { REDEFINITION }) // Can't redefine a class that gets error during loading
  81     public void testPrivateInvokeVirtual() {
  82         TestBuilder b = factory.getBuilder();
  83 
  84         Interface I = b.intf("I")
  85                 .defaultMethod("privateM", "()I")
  86                     .private_().returns(1).build()
  87 
  88                 // force an invokevirtual of an IMR to test verification code
  89                 .defaultMethod("m", "()I")
  90                     .invoke(VIRTUAL, b.intfByName("I"), null, "privateM", "()I", INTERFACEMETHODREF).build()
  91             .build();
  92 
  93         ConcreteClass C = b.clazz("C").implement(I).build();
  94 
  95         b.test().callSite(I, C, "m", "()I").throws_(VerifyError.class).done()
  96          .test().callSite(C, C, "m", "()I").throws_(VerifyError.class).done()
  97 
  98         .run();
  99     }
 100 
 101     /*
 102      * testPrivateInvokeIntf
 103      *
 104      * interface I {
 105      *           private int privateM() { return 1; }
 106      *   default public  int m()        { return (I)this.privateM(); } // invokeinterface
 107      * }
 108      * class C implements I {}
 109      *
 110      * TEST: I o = new C(); o.m()I returns 1
 111      * TEST: C o = new C(); o.m()I returns 1
 112      */
 113     public void testPrivateInvokeIntf() {
 114         TestBuilder b = factory.getBuilder();
 115 
 116         Interface I = b.intf("I")
 117                 .defaultMethod("privateM", "()I")
 118                     .private_().returns(1).build()
 119                 .defaultMethod("m", "()I")
 120                     .invoke(INTERFACE, b.intfByName("I"), null, "privateM", "()I", CALLSITE).build()
 121             .build();
 122 
 123         ConcreteClass C = b.clazz("C").implement(I).build();
 124 
 125         b.test().callSite(I, C, "m", "()I").returns(1).done()
 126          .test().callSite(C, C, "m", "()I").returns(1).done()
 127 
 128         .run();
 129     }
 130 
 131     /*
 132      * testPrivateInvokeStatic
 133      *
 134      * interface I {
 135      *           private int privateM() { return 1; }
 136      *   default public  int m()        { return I.privateM(); } // invokestatic
 137      * }
 138      * class C implements I {}
 139      *
 140      * TEST: I o = new C(); o.m()I throws IncompatibleClassChangeError
 141      * TEST: C o = new C(); o.m()I throws IncompatibleClassChangeError
 142      */
 143     public void testPrivateInvokeStatic() {
 144         TestBuilder b = factory.getBuilder();
 145 
 146         Interface I = b.intf("I")
 147                 .defaultMethod("privateM", "()I")
 148                     .private_().returns(1).build()
 149                 .defaultMethod("m", "()I")
 150                     .invoke(STATIC, b.intfByName("I"), null, "privateM", "()I", CALLSITE).build()
 151             .build();
 152 
 153         ConcreteClass C = b.clazz("C").implement(I).build();
 154 
 155         b.test().callSite(I, C, "m", "()I").throws_(IncompatibleClassChangeError.class).done()
 156          .test().callSite(C, C, "m", "()I").throws_(IncompatibleClassChangeError.class).done()
 157 
 158         .run();
 159     }
 160 
 161     // call from another default method in the same interface
 162     /*
 163      * testPrivateCallSameClass
 164      *
 165      * interface I {
 166      *           private privateM()I { return 1; }
 167      *   default public int m() { return I.super.privateM(); } // invokespecial
 168      * }
 169      * class C implements I {}
 170      *
 171      * TEST: { I o = new C(); o.m()I  == 1; }
 172      * TEST: { C o = new C(); o.m()I  == 1; }
 173      */
 174     public void testPrivateCallSameClass() {
 175         TestBuilder b = factory.getBuilder();
 176 
 177         Interface I = b.intf("I")
 178                 .defaultMethod("privateM", "()I")
 179                     .private_().returns(1).build()
 180                 .defaultMethod("m", "()I")
 181                     .invokeSpecial(b.intfByName("I"), "privateM", "()I").build()
 182             .build();
 183 
 184         ConcreteClass C = b.clazz("C").implement(I).build();
 185 
 186         b.test().callSite(I, C, "m", "()I").returns(1).done()
 187          .test().callSite(C, C, "m", "()I").returns(1).done()
 188 
 189         .run();
 190     }
 191 
 192     /*
 193      * testPrivateCallSubIntf
 194      *
 195      * Attempt to call from subinterface fails
 196 
 197      * interface I {
 198      *   private privateM()I { return 1; }
 199      * }
 200      * J, K, L use invokespecial
 201      * interface J extends I {
 202      *   default public int m() { return I.super.privateM(); }
 203      * }
 204      * interface K extends I {
 205      *   default public int m() { return K.super.privateM(); }
 206      * }
 207      * interface L extends J {
 208      *   default public int m() { return I.super.privateM(); }
 209      * }
 210      * class C implements J {}
 211      * class D implements K {}
 212      * class E implements L {}
 213      *
 214      * TEST: { J o = new C(); o.m()I throws IAE; }
 215      * TEST: { C o = new C(); o.m()I throws IAE; }
 216      * TEST: { K o = new D(); o.m()I throws NSME; } // does not see
 217      * TEST: { D o = new D(); o.m()I throws NSME; }
 218      * TEST: { L o = new E(); o.m()I throws VerifyError; } // VerifyError intfmethodref


 248         ConcreteClass D = b.clazz("D").implement(K).build();
 249 
 250         ConcreteClass E = b.clazz("E").implement(L).build();
 251 
 252         b.test().callSite(J, C, "m", "()I").throws_(IllegalAccessError.class).done()
 253          .test().callSite(C, C, "m", "()I").throws_(IllegalAccessError.class).done()
 254 
 255          .test().callSite(K, D, "m", "()I").throws_(NoSuchMethodError.class).done()
 256          .test().callSite(D, D, "m", "()I").throws_(NoSuchMethodError.class).done()
 257 
 258          .test().callSite(L, E, "m", "()I").throws_(VerifyError.class).done()
 259          .test().callSite(E, E, "m", "()I").throws_(VerifyError.class).done()
 260 
 261         .run();
 262     }
 263 
 264     /*
 265      * Attempt to call from subclass fails
 266      *
 267      * interface I {
 268      *   private privateM()I { return 1; }
 269      * }
 270      * class C implements I {
 271      *   public int m() { return I.super.privateM(); }
 272      * }
 273      * class D extends C {
 274      *   public int m() { return I.super.privateM(); }
 275      * }
 276      * class E extends C {
 277      *   public int m() { return C.super.privateM(); }
 278      * }
 279      *
 280      * TEST: { C o = new C(); o.m()I throws IllegalAccessError (or VerifyError) }
 281      * TEST: { D o = new D(); o.m()I throws VerifyError }
 282      * TEST: { E o = new E(); o.m()I throws NoSuchMethodError (or VerifyError); }
 283      */
 284     @NotApplicableFor(modes = { REDEFINITION }) // Can't redefine a class that gets error during loading
 285     public void testPrivateCallImplClass() {
 286         TestBuilder b = factory.getBuilder();
 287 
 288         Interface I = b.intf("I")
 289                 .defaultMethod("privateM", "()I")
 290                     .private_().returns(1).build()
 291             .build();
 292 
 293         ConcreteClass C = b.clazz("C").implement(I)
 294                 .concreteMethod("m", "()I")
 295                     .invokeSpecial(I, "privateM", "()I").build()
 296             .build();
 297 
 298         ConcreteClass D = b.clazz("D").extend(C)
 299                 .concreteMethod("m", "()I")
 300                     .invokeSpecial(I, "privateM", "()I").build()
 301             .build();
 302 
 303         ConcreteClass E = b.clazz("E").extend(C)
 304                 .concreteMethod("m", "()I")
 305                     .invokeSpecial(C, "privateM", "()I").build()
 306             .build();
 307 
 308         Class eeExpectedClass;
 309         Class ccExpectedClass;
 310         if (factory.getVer() >= 52) {
 311             eeExpectedClass = NoSuchMethodError.class;
 312             ccExpectedClass = IllegalAccessError.class;
 313         } else {
 314             // The test gets a VerifyError in this case due to an
 315             // invokespecial IMR bytecode.  This was not allowed
 316             // until class file version 52.  (See 8030249.)
 317             eeExpectedClass = VerifyError.class;
 318             ccExpectedClass = VerifyError.class;
 319         }
 320         b.test().callSite(C, C, "m", "()I").throws_(ccExpectedClass).done()
 321          .test().callSite(D, D, "m", "()I").throws_(VerifyError.class).done()
 322          .test().callSite(E, E, "m", "()I").throws_(eeExpectedClass).done()
 323 
 324         .run();
 325     }
 326 
 327     // doesn't participate in default method analysis
 328     //   method overriding
 329 
 330     /*
 331      * testPrivate
 332      *
 333      * interface I {
 334      *   private int m() { return 1; }
 335      * }
 336      * class C implements I {}
 337      *
 338      * TEST: { I o = new C(); o.m()I throws IllegalAccessError; }
 339      *                 -mode reflect throws NoSuchMethodException
 340      * TEST: { C o = new C(); o.m()I throws NoSuchMethodError; }
 341      */
 342     public void testPrivate() {
 343         TestBuilder b = factory.getBuilder();
 344 
 345         Interface I = b.intf("I")
 346                 .defaultMethod("m", "()I")
 347                     .private_().returns(1).build()
 348             .build();
 349 
 350         ConcreteClass C = b.clazz("C").implement(I).build();
 351 
 352         Class expectedClass;
 353         if (factory.getExecutionMode().equals("REFLECTION")) {
 354             expectedClass = NoSuchMethodException.class;
 355         } else {
 356             expectedClass = IllegalAccessError.class;
 357         }
 358 
 359         b.test().callSite(I, C, "m", "()I").throws_(expectedClass).done()
 360          .test().callSite(C, C, "m", "()I").throws_(NoSuchMethodError.class).done()
 361 
 362         .run();
 363     }
 364 
 365     /*
 366      * testPrivateVsConcrete
 367      *
 368      * interface I {
 369      *   private int m() { return 1; }
 370      * }
 371      * class C implements I {
 372      *   public int m() { return 2; }
 373      * }
 374      *
 375      * TEST: { I o = new C(); o.m()I  == IllegalAccessError; }
 376      *                 -mode reflect throws NoSuchMethodException
 377      * TEST: { C o = new C(); o.m()I  == 2; }
 378      */
 379     public void testPrivateVsConcrete() {
 380         TestBuilder b = factory.getBuilder();
 381 
 382         Interface I = b.intf("I")
 383                 .defaultMethod("m", "()I")
 384                     .private_().returns(1).build()
 385             .build();
 386 
 387         ConcreteClass C = b.clazz("C").implement(I)
 388                 .concreteMethod("m", "()I").returns(2).build()
 389             .build();
 390 
 391         Class expectedClass;
 392         if (factory.getExecutionMode().equals("REFLECTION")) {
 393             expectedClass = NoSuchMethodException.class;
 394         } else {
 395             expectedClass = IllegalAccessError.class;
 396         }
 397 
 398         b.test().callSite(I, C, "m", "()I").throws_(expectedClass).done()
 399          .test().callSite(C, C, "m", "()I").returns(2).done()
 400 
 401         .run();
 402     }
 403 
 404     /*
 405      * testPublicOverridePrivate
 406      *
 407      * interface I {
 408      *   private int m() { return 1; }
 409      * }
 410      * interface J extends I {
 411      *   default public int m() { return 2; }
 412      * }
 413      * class C implements J {}
 414      *
 415      * TEST: { I o = new C(); o.m()I throws IllegalAccessError; }
 416      *                 -mode reflect throws NoSuchMethodException
 417      * TEST: { J o = new C(); o.m()I  == 2; }
 418      * TEST: { C o = new C(); o.m()I  == 2; }
 419      */
 420     public void testPublicOverridePrivate() {
 421         TestBuilder b = factory.getBuilder();
 422 
 423         Interface I = b.intf("I")
 424                 .defaultMethod("m", "()I")
 425                     .private_().returns(1).build()
 426             .build();
 427 
 428         Interface J = b.intf("J").extend(I)


 436         if (factory.getExecutionMode().equals("REFLECTION")) {
 437             expectedClass = NoSuchMethodException.class;
 438         } else {
 439             expectedClass = IllegalAccessError.class;
 440         }
 441 
 442         b.test().callSite(I, C, "m", "()I").throws_(expectedClass).done()
 443          .test().callSite(J, C, "m", "()I").returns(2).done()
 444          .test().callSite(C, C, "m", "()I").returns(2).done()
 445 
 446         .run();
 447     }
 448 
 449     /*
 450      * testPrivateOverrideDefault
 451      *
 452      * interface I {
 453      *   default public int m() { return 1; }
 454      * }
 455      * interface J extends I {
 456      *   private int m() { return 2; }
 457      * }
 458      * class C implements J {}
 459      *
 460      * TEST: { I o = new C(); o.m()I  == 1; }
 461      * TEST: { J o = new C(); o.m()I  == IllegalAccessError; } II J.m priv
 462      * TEST: { C o = new C(); o.m()I  == 1; }
 463      */








 464     public void testPrivateOverrideDefault() {
 465         TestBuilder b = factory.getBuilder();
 466 
 467         Interface I = b.intf("I")
 468                 .defaultMethod("m", "()I")
 469                     .returns(1).build()
 470             .build();
 471 
 472         Interface J = b.intf("J").extend(I)
 473                 .defaultMethod("m", "()I")
 474                     .private_().returns(2).build()
 475             .build();
 476 
 477         ConcreteClass C = b.clazz("C").implement(J).build();
 478 
 479         b.test().callSite(I, C, "m", "()I").returns(1).done()
 480          .test().privateCallSite(J, C, "m", "()I").throws_(IllegalAccessError.class).done()
 481          .test().callSite(C, C, "m", "()I").returns(1).done()
 482 
 483         .run();
 484     }
 485 
 486     /*
 487      * testPrivateReabstract
 488      *
 489      * interface I {
 490      *   private int m() { return 1; }
 491      * }
 492      * interface J extends I {
 493      *   abstract public int m();
 494      * }
 495      * class C implements J {}
 496      *
 497      * TEST: { I o = new C(); o.m()I throws IllegalAccessError; } II I.m
 498      *                 -mode reflect throws NoSuchMethodException
 499      * TEST: { J o = new C(); o.m()I throws java/lang/AbstractMethodError; }
 500      * TEST: { C o = new C(); o.m()I throws java/lang/AbstractMethodError; }
 501      */
 502     public void testPrivateReabstract() {
 503         TestBuilder b = factory.getBuilder();
 504 
 505         Interface I = b.intf("I")
 506                 .defaultMethod("m", "()I")
 507                     .private_().returns(1).build()
 508             .build();
 509 
 510         Interface J = b.intf("J").extend(I)


 517         if (factory.getExecutionMode().equals("REFLECTION")) {
 518             expectedClass = NoSuchMethodException.class;
 519         } else {
 520             expectedClass = IllegalAccessError.class;
 521         }
 522 
 523         b.test().callSite(I, C, "m", "()I").throws_(expectedClass).done()
 524          .test().callSite(J, C, "m", "()I").throws_(AbstractMethodError.class).done()
 525          .test().callSite(C, C, "m", "()I").throws_(AbstractMethodError.class).done()
 526 
 527         .run();
 528     }
 529 
 530     /*
 531      * testPrivateOverrideAbstract
 532      *
 533      * interface I {
 534      *   abstract public int m();
 535      * }
 536      * interface J extends I {
 537      *   private int m() { return 1; }
 538      * }
 539      * class C implements J {}
 540      *
 541      * TEST: { I o = new C(); o.m()I throws AbstractMethodError }
 542      * TEST: { J o = new C(); o.m()I throws IllegalAccessError }
 543      * TEST: { C o = new C(); o.m()I throws AbstractMethodError }
 544      */









 545     public void testPrivateOverrideAbstract() {
 546         TestBuilder b = factory.getBuilder();
 547 
 548         Interface I = b.intf("I")
 549                 .abstractMethod("m", "()I").build()
 550             .build();
 551 
 552         Interface J = b.intf("J").extend(I)
 553                 .defaultMethod("m", "()I")
 554                     .private_().returns(1).build()
 555             .build();
 556 
 557         ConcreteClass C = b.clazz("C").implement(J).build();
 558 







 559         b.test().callSite(I, C, "m", "()I").throws_(AbstractMethodError.class).done()
 560          .test().privateCallSite(J, C, "m", "()I").throws_(IllegalAccessError.class).done()
 561          .test().callSite(C, C, "m", "()I").throws_(AbstractMethodError.class).done()
 562          .run();
 563     }
 564 
 565     /*
 566      * testPrivateInherited
 567      *
 568      * interface I {
 569      *   private int m() { return 1; }
 570      * }
 571      * class B implements I {}
 572      * class C extends B {}
 573      *
 574      * TEST: { I o = new C(); o.m()I throws IllegalAccessError } II I.m
 575      *                 -mode reflect throws NoSuchMethodException
 576      * TEST: { B o = new C(); o.m()I throws NoSuchMethodError }
 577      * TEST: { C o = new C(); o.m()I throws NoSuchMethodError }
 578      */
 579     public void testPrivateInherited() {
 580         TestBuilder b = factory.getBuilder();
 581 
 582         Interface I = b.intf("I")
 583                 .defaultMethod("m", "()I")
 584                     .private_().returns(1).build()
 585             .build();
 586 
 587         ConcreteClass B = b.clazz("B").implement(I).build();
 588         ConcreteClass C = b.clazz("C").extend(B).build();
 589 
 590         Class expectedClass;
 591         if (factory.getExecutionMode().equals("REFLECTION")) {
 592             expectedClass = NoSuchMethodException.class;
 593         } else {
 594             expectedClass = IllegalAccessError.class;
 595         }
 596 
 597         b.test().callSite(I, C, "m","()I").throws_(expectedClass).done()
 598          .test().callSite(B, C, "m","()I").throws_(NoSuchMethodError.class).done()
 599          .test().callSite(C, C, "m","()I").throws_(NoSuchMethodError.class).done()
 600 
 601         .run();
 602 
 603     }
 604 
 605     /*
 606      * testPrivateVsConcreteInherited
 607      *
 608      * interface I {
 609      *    private int m() { return 1; }
 610      * }
 611      * class B {
 612      *   public int m() { return 2; }
 613      * }
 614      * class C extends B implements I {}
 615      *
 616      * TEST: { I o = new C(); o.m()I  == throws IllegalAccessError; }
 617      *                     -mode reflect throws NoSuchMethodException
 618      * TEST: { B o = new C(); o.m()I  == 2; }
 619      * TEST: { C o = new C(); o.m()I  == 2; }
 620      */
 621     public void testPrivateVsConcreteInherited() {
 622         TestBuilder b = factory.getBuilder();
 623 
 624         Interface I = b.intf("I")
 625                 .defaultMethod("m", "()I")
 626                     .private_().returns(1).build()
 627             .build();
 628 
 629         ConcreteClass B = b.clazz("B")
 630                 .concreteMethod("m", "()I").returns(2).build()
 631                 .build();
 632 
 633         ConcreteClass C = b.clazz("C").extend(B).implement(I).build();
 634 
 635         Class expectedClass;
 636         if (factory.getExecutionMode().equals("REFLECTION")) {
 637             expectedClass = NoSuchMethodException.class;
 638         } else {
 639             expectedClass = IllegalAccessError.class;
 640         }
 641 
 642         b.test().callSite(I, C, "m","()I").throws_(expectedClass).done()
 643          .test().callSite(B, C, "m","()I").returns(2).done()
 644          .test().callSite(C, C, "m","()I").returns(2).done()
 645 
 646         .run();
 647     }
 648 
 649     /*
 650      * testPrivateConflict
 651      *
 652      * Conflicting methods
 653      *
 654      * interface I {
 655      *   private int m() { return 1; }
 656      * }
 657      * interface J {
 658      *   default public int m() { return 2; }
 659      * }
 660      * class C implements I, J {}
 661      *
 662      * TEST: { I o = new C(); o.m()I throws IllegalAccessError; }
 663      *                 -mode reflect throws NoSuchMethodException
 664      * TEST: { J o = new C(); o.m()I  == 2; }
 665      * TEST: { C o = new C(); o.m()I  == 2; }
 666      */
 667     public void testPrivateConflict() {
 668         TestBuilder b = factory.getBuilder();
 669 
 670         Interface I = b.intf("I")
 671                 .defaultMethod("m", "()I").private_().returns(1).build()
 672             .build();
 673 
 674         Interface J = b.intf("J")
 675                 .defaultMethod("m", "()I").returns(2).build()


< prev index next >