1 /* 2 * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 package vm.runtime.defmeth; 25 26 import nsk.share.test.TestBase; 27 import vm.runtime.defmeth.shared.DefMethTest; 28 import vm.runtime.defmeth.shared.annotation.Crash; 29 import vm.runtime.defmeth.shared.data.*; 30 import vm.runtime.defmeth.shared.builder.TestBuilder; 31 import vm.runtime.defmeth.shared.annotation.NotApplicableFor; 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 static vm.runtime.defmeth.shared.ExecutionMode.*; 35 36 /* 37 * Scenarios on static methods in interfaces. 38 */ 39 public class StaticMethodsTest extends DefMethTest { 40 41 public static void main(String[] args) { 42 TestBase.runTest(new StaticMethodsTest(), args); 43 } 44 45 // static method in interface 46 /* 47 * testStaticMethod 48 * 49 * interface I { 50 * default static public int m() { return 1; } 51 * } 52 * 53 * class C implements I {} 54 */ 55 public void testStaticMethod() { 56 TestBuilder b = factory.getBuilder(); 57 58 Interface I = b.intf("I") 59 .defaultMethod("m", "()I") 60 .static_().public_().returns(1).build() 61 .build(); 62 63 ConcreteClass C = b.clazz("C").implement(I).build(); 64 65 b.test().staticCallSite(I, "m", "()I").returns(1).done() 66 67 .run(); 68 } 69 70 // invoke[virtual|interface|special] from same/subintf 71 /* 72 * testInvokeVirtual 73 * 74 * interface I { 75 * default static public int staticM() { return 1; } 76 * default public int m() { return ((I)this).staticM(); } 77 * } 78 * 79 * class C implements I {} 80 */ 81 public void testInvokeVirtual() { 82 TestBuilder b = factory.getBuilder(); 83 84 Interface I = b.intf("I") 85 .defaultMethod("staticM", "()I") 86 .static_().public_().returns(1).build() 87 88 // force an invokevirtual MR of staticM() 89 .defaultMethod("m", "()I") 90 .invoke(VIRTUAL, b.intfByName("I"), null, "staticM", "()I", METHODREF).build() 91 .build(); 92 93 ConcreteClass C = b.clazz("C").implement(I).build(); 94 95 b.test().staticCallSite(I, "staticM", "()I").returns(1).done() 96 97 .test().callSite(I, C, "m", "()I").throws_(IncompatibleClassChangeError.class).done() 98 .test().callSite(C, C, "m", "()I").throws_(IncompatibleClassChangeError.class).done() 99 100 .run(); 101 } 102 103 /* 104 * testInvokeIntf 105 * 106 * interface I { 107 * default static public int staticM() { return 1; } 108 * default public int m() { return ((I)this).staticM(); } 109 * } 110 * 111 * class C implements I {} 112 */ 113 public void testInvokeIntf() { 114 TestBuilder b = factory.getBuilder(); 115 116 Interface I = b.intf("I") 117 .defaultMethod("staticM", "()I") 118 .static_().public_().returns(1).build() 119 120 .defaultMethod("m", "()I") 121 .invoke(INTERFACE, b.intfByName("I"), null, "staticM", "()I", CALLSITE).build() 122 .build(); 123 124 ConcreteClass C = b.clazz("C").implement(I).build(); 125 126 b.test().staticCallSite(I, "staticM", "()I").returns(1).done() 127 128 .test().callSite(I, C, "m", "()I").throws_(IncompatibleClassChangeError.class).done() 129 .test().callSite(C, C, "m", "()I").throws_(IncompatibleClassChangeError.class).done() 130 131 .run(); 132 } 133 134 /* 135 * testInvokeSpecial 136 * 137 * interface I { 138 * default static public int staticM() { return 1; } 139 * default public int m() { return I.super.staticM(); } 140 * } 141 * 142 * class C implements I {} 143 */ 144 public void testInvokeSpecial() { 145 TestBuilder b = factory.getBuilder(); 146 147 Interface I = b.intf("I") 148 .defaultMethod("staticM", "()I") 149 .static_().public_().returns(1).build() 150 151 .defaultMethod("m", "()I") 152 .invoke(SPECIAL, b.intfByName("I"), null, "staticM", "()I", CALLSITE).build() 153 .build(); 154 155 ConcreteClass C = b.clazz("C").implement(I).build(); 156 157 b.test().staticCallSite(I, "staticM", "()I").returns(1).done() 158 159 .test().callSite(I, C, "m", "()I").throws_(IncompatibleClassChangeError.class).done() 160 .test().callSite(C, C, "m", "()I").throws_(IncompatibleClassChangeError.class).done() 161 162 .run(); 163 } 164 165 /* 166 * testStaticVsDefault 167 * 168 * interface I { 169 * default static public int m() { return 1; } 170 * default public int m() { return 2; } 171 * } 172 * 173 * class C implements I {} 174 */ 175 public void testStaticVsDefault() { 176 TestBuilder b = factory.getBuilder(); 177 178 Interface I = b.intf("I") 179 .defaultMethod("m", "()I") 180 .static_().public_().returns(1).build() 181 .defaultMethod("m", "()I") 182 .public_().returns(2).build() 183 .build(); 184 185 ConcreteClass C = b.clazz("C").implement(I).build(); 186 187 b.test().staticCallSite(I, "m", "()I").throws_(ClassFormatError.class).done() 188 189 // FIXME: throws exception during an attempt to lookup Test2.test() method 190 191 // Invalid test. ClassFormatError is thrown at verification time, rather 192 // than execution time. 193 // .test().callSite(I, C, "m", "()I").throws_(ClassFormatError.class).done() 194 .test().callSite(C, C, "m", "()I").throws_(ClassFormatError.class).done() 195 196 .run(); 197 } 198 199 // call static method from default method 200 /* 201 * testInvokeFromDefaultMethod 202 * 203 * interface I { 204 * default static public int staticPublicM() { return 1; } 205 * default public int invokePublic() { return I.staticPublicM(); } 206 * default static private int staticPrivateM() { return 1; } 207 * default public int invokePrivate() { return I.staticPrivateM(); } 208 * } 209 * 210 * class C implements I {} 211 */ 212 public void testInvokeFromDefaultMethod() throws Exception { 213 TestBuilder b = factory.getBuilder(); 214 215 Interface I = b.intf("I") 216 .defaultMethod("staticPublicM", "()I") 217 .static_().public_().returns(1).build() 218 .defaultMethod("invokePublic", "()I") 219 .invokeStatic(b.intfByName("I"), "staticPublicM", "()I").build() 220 221 .defaultMethod("staticPrivateM", "()I") 222 .static_().private_().returns(1).build() 223 .defaultMethod("invokePrivate", "()I") 224 .invokeStatic(b.intfByName("I"), "staticPrivateM", "()I").build() 225 .build(); 226 227 ConcreteClass C = b.clazz("C").implement(I).build(); 228 229 Class expectedClass; 230 if (factory.getExecutionMode().equals("REFLECTION")) { 231 expectedClass = NoSuchMethodException.class; 232 } else { 233 expectedClass = IllegalAccessError.class; 234 } 235 236 // call static method from another class 237 b.test().staticCallSite(I, "staticPublicM", "()I").returns(1).done() 238 .test().staticCallSite(I, "staticPrivateM", "()I").throws_(expectedClass).done() 239 240 // call public static method from default method 241 .test().callSite(I, C, "invokePublic", "()I").returns(1).done() 242 .test().callSite(C, C, "invokePublic", "()I").returns(1).done() 243 244 // call private static method from default method 245 .test().callSite(I, C, "invokePrivate", "()I").returns(1).done() 246 .test().callSite(C, C, "invokePrivate", "()I").returns(1).done() 247 248 .run(); 249 } 250 251 // call static method from implementing subclass 252 /* 253 * testInvokeFromSubclass 254 * 255 * interface I { 256 * default static public int staticPublicM() { return 1; } 257 * default static private int staticPrivateM() { return 1; } 258 * } 259 * 260 * class C implements I { 261 * public int invokePublic() { return I.staticPublicM(); } 262 * public int invokePrivate() { return I.staticPublicM(); } 263 * 264 * I.staticPublicM(); ==> returns 1; 265 * I.staticPrivateM(); ==> Either NSME or IAE depending on execution mode 266 * C c = new C(); c.invokePublic(); ==> returns 1 or if -ver < 52 IAE or VerifyError 267 * C c = new C(); c.invokePrivate() ==> IAE or if -ver < 52, IAE or VerifyError 268 * } 269 */ 270 271 @NotApplicableFor(modes = { REDEFINITION }) // Can't redefine a class that gets error during loading 272 public void testInvokeFromSubclass() throws Exception { 273 TestBuilder b = factory.getBuilder(); 274 275 Interface I = b.intf("I") 276 .defaultMethod("staticPublicM", "()I") 277 .static_().public_().returns(1).build() 278 279 .defaultMethod("staticPrivateM", "()I") 280 .static_().private_().returns(1).build() 281 .build(); 282 283 ConcreteClass C = b.clazz("C").implement(I) 284 .concreteMethod("invokePublic", "()I") 285 .invokeStatic(b.intfByName("I"), "staticPublicM", "()I").build() 286 .concreteMethod("invokePrivate", "()I") 287 .invokeStatic(b.intfByName("I"), "staticPrivateM", "()I").build() 288 .build(); 289 290 Class expectedError1; 291 if (factory.getExecutionMode().equals("REFLECTION")) { 292 expectedError1 = NoSuchMethodException.class; 293 } else { 294 expectedError1 = IllegalAccessError.class; 295 } 296 297 // Adjust for -ver < 52 298 if (factory.getVer() >=52) { 299 // call static method from another class 300 b.test().staticCallSite(I, "staticPublicM", "()I").returns(1).done() 301 .test().staticCallSite(I, "staticPrivateM", "()I").throws_(expectedError1).done() 302 303 // call static method from implementing subclass 304 .test().callSite(C, C, "invokePublic", "()I").returns(1).done() 305 .test().callSite(C, C, "invokePrivate", "()I").throws_(IllegalAccessError.class).done() 306 307 .run(); 308 } else { 309 // call static method from another class 310 b.test().staticCallSite(I, "staticPublicM", "()I").returns(1).done() 311 .test().staticCallSite(I, "staticPrivateM", "()I").throws_(expectedError1).done() 312 313 // call static method from implementing subclass 314 // invokestatic IMR - not supported for ver < 52 315 .test().callSite(C, C, "invokePublic", "()I").throws_(VerifyError.class).done() 316 .test().callSite(C, C, "invokePrivate", "()I").throws_(VerifyError.class).done() 317 318 .run(); 319 } 320 } 321 322 // static method doesn't participate in default method analysis: 323 // method overriding 324 /* 325 * testNotInherited 326 * 327 * interface I { 328 * default static public int m() { return 1; } 329 * } 330 * 331 * class C implements I {} 332 */ 333 public void testNotInherited() { 334 TestBuilder b = factory.getBuilder(); 335 336 Interface I = b.intf("I") 337 .defaultMethod("m", "()I") 338 .static_().public_().returns(1).build() 339 .build(); 340 341 ConcreteClass C = b.clazz("C").implement(I).build(); 342 343 if (!factory.getExecutionMode().equals("REFLECTION")) { 344 b.test().staticCallSite(I, "m", "()I").returns(1).done() 345 // invokeinterface to static method ==> ICCE 346 .test().callSite(I, C, "m", "()I").throws_(IncompatibleClassChangeError.class).done() 347 .test().callSite(C, C, "m", "()I").throws_(NoSuchMethodError.class).done() 348 .run(); 349 } else { 350 b.test().staticCallSite(I, "m", "()I").returns(1).done() 351 .test().callSite(I, C, "m", "()I").returns(1).done() 352 .test().callSite(C, C, "m", "()I").throws_(NoSuchMethodError.class).done() 353 .run(); 354 } 355 } 356 357 /* 358 * testDefaultVsConcrete 359 * 360 * interface I { 361 * default static public int m() { return 1; } 362 * } 363 * 364 * class C implements I { 365 * public int m() { return 2; } 366 * } 367 * TEST: I o = new C(); o.m()I throws ICCE 368 * TEST: C o = new C(); o.m()I == 2 369 */ 370 public void testDefaultVsConcrete() { 371 TestBuilder b = factory.getBuilder(); 372 373 Interface I = b.intf("I") 374 .defaultMethod("m", "()I") 375 .static_().public_().returns(1).build() 376 .build(); 377 378 ConcreteClass C = b.clazz("C").implement(I) 379 .concreteMethod("m", "()I").returns(2).build() 380 .build(); 381 382 if (!factory.getExecutionMode().equals("REFLECTION")) { 383 // invokeinterface to static method ==> ICCE 384 b.test().callSite(I, C, "m", "()I").throws_(IncompatibleClassChangeError.class).done() 385 .test().callSite(C, C, "m", "()I").returns(2).done().run(); 386 } else { 387 b.test().callSite(I, C, "m", "()I").returns(1).done() 388 .test().callSite(C, C, "m", "()I").returns(2).done().run(); 389 } 390 391 } 392 393 /* 394 * TEST: StaticMethodsTest.testOverrideStatic 395 * 396 * interface I { 397 * default static public int m() { return 1; } 398 * } 399 * 400 * interface J extends I { 401 * default public int m() { return 2; } 402 * } 403 * 404 * class C implements J { 405 * } 406 */ 407 public void testOverrideStatic() { 408 TestBuilder b = factory.getBuilder(); 409 410 Interface I = b.intf("I") 411 .defaultMethod("m", "()I") 412 .static_().public_().returns(1).build() 413 .build(); 414 415 Interface J = b.intf("J").extend(I) 416 .defaultMethod("m", "()I") 417 .returns(2).build() 418 .build(); 419 420 ConcreteClass C = b.clazz("C").implement(J).build(); 421 422 if (!factory.getExecutionMode().equals("REFLECTION")) { 423 b.test().staticCallSite(I, "m", "()I").returns(1).done() 424 .test().callSite(I, C, "m", "()I").throws_(IncompatibleClassChangeError.class).done() 425 .test().callSite(J, C, "m", "()I").returns(2).done() 426 .test().callSite(C, C, "m", "()I").returns(2).done() 427 .run(); 428 } else { 429 b.test().staticCallSite(I, "m", "()I").returns(1).done() 430 .test().callSite(I, C, "m", "()I").returns(1).done() 431 .test().callSite(J, C, "m", "()I").returns(2).done() 432 .test().callSite(C, C, "m", "()I").returns(2).done() 433 .run(); 434 } 435 436 } 437 438 /* 439 * testOverrideDefault 440 * 441 * interface I { 442 * default public int m() { return 1; } 443 * } 444 * 445 * interface J extends I { 446 * default static public int m() { return 2; } 447 * } 448 * 449 * class C implements J {} 450 * 451 * TEST: I o = new C(); o.m()I == 1 452 * TEST: J o = new C(); o.m()I == ICCE 453 * TEST: C o = new C(); o.m()I == 1 454 */ 455 public void testOverrideDefault() { 456 TestBuilder b = factory.getBuilder(); 457 458 Interface I = b.intf("I") 459 .defaultMethod("m", "()I") 460 .returns(1).build() 461 .build(); 462 463 Interface J = b.intf("J").extend(I) 464 .defaultMethod("m", "()I") 465 .static_().public_().returns(2).build() 466 .build(); 467 468 ConcreteClass C = b.clazz("C").implement(J).build(); 469 470 if (!factory.getExecutionMode().equals("REFLECTION")) { 471 b.test().callSite(I, C, "m", "()I").returns(1).done() 472 .test().callSite(J, C, "m", "()I").throws_(IncompatibleClassChangeError.class).done() 473 .test().callSite(C, C, "m", "()I").returns(1).done() 474 475 .run(); 476 477 } else { 478 // Reflection correctly finds the static method defined in J and 479 // calls it with invokestatic. 480 481 b.test().callSite(I, C, "m", "()I").returns(1).done() 482 .test().callSite(J, C, "m", "()I").returns(2).done() 483 .test().callSite(C, C, "m", "()I").returns(1).done() 484 485 .run(); 486 } 487 } 488 489 /* 490 * testReabstract 491 * 492 * interface I { 493 * default static public int m() { return 1; } 494 * } 495 * 496 * interface J extends I { 497 * abstract public int m(); 498 * } 499 * 500 * class C implements J {} 501 * 502 * TEST: I o = new C(); o.m()I throws ICCE 503 * -mode reflect returns 1 504 * TEST: J o = new C(); o.m()I throws AME 505 * TEST: C o = new C(); o.m()I throws AME 506 */ 507 public void testReabstract() { 508 TestBuilder b = factory.getBuilder(); 509 510 Interface I = b.intf("I") 511 .defaultMethod("m", "()I") 512 .static_().public_().returns(1).build() 513 .build(); 514 515 Interface J = b.intf("J").extend(I) 516 .abstractMethod("m", "()I").build() 517 .build(); 518 519 ConcreteClass C = b.clazz("C").implement(J).build(); 520 521 if (!factory.getExecutionMode().equals("REFLECTION")) { 522 b.test().callSite(I, C, "m", "()I").throws_(IncompatibleClassChangeError.class).done() 523 .test().callSite(J, C, "m", "()I").throws_(AbstractMethodError.class).done() 524 .test().callSite(C, C, "m", "()I").throws_(AbstractMethodError.class).done() 525 .run(); 526 } else { 527 b.test().callSite(I, C, "m", "()I").returns(1).done() 528 .test().callSite(J, C, "m", "()I").throws_(AbstractMethodError.class).done() 529 .test().callSite(C, C, "m", "()I").throws_(AbstractMethodError.class).done() 530 .run(); 531 } 532 } 533 534 /* 535 * testOverrideAbstract 536 * 537 * interface I { 538 * abstract public int m(); 539 * } 540 * 541 * interface J extends I { 542 * default static public int m() { return 1; } 543 * } 544 * 545 * class C implements J {} 546 * 547 * TEST: I o = new C(); o.m()I throws AME 548 * TEST: J o = new C(); o.m()I throws ICCE 549 * -mode reflect returns 1 550 * TEST: C o = new C(); o.m()I throws AME 551 */ 552 public void testOverrideAbstract() { 553 TestBuilder b = factory.getBuilder(); 554 555 Interface I = b.intf("I") 556 .abstractMethod("m", "()I").build() 557 .build(); 558 559 Interface J = b.intf("J").extend(I) 560 .defaultMethod("m", "()I") 561 .static_().public_().returns(1).build() 562 .build(); 563 564 ConcreteClass C = b.clazz("C").implement(J).build(); 565 566 if (!factory.getExecutionMode().equals("REFLECTION")) { 567 b.test().callSite(I, C, "m", "()I").throws_(AbstractMethodError.class).done() 568 .test().callSite(J, C, "m", "()I").throws_(IncompatibleClassChangeError.class).done() 569 .test().callSite(C, C, "m", "()I").throws_(AbstractMethodError.class).done() 570 571 .run(); 572 } else { 573 b.test().callSite(I, C, "m", "()I").throws_(AbstractMethodError.class).done() 574 .test().callSite(J, C, "m", "()I").returns(1).done() 575 .test().callSite(C, C, "m", "()I").throws_(AbstractMethodError.class).done() 576 577 .run(); 578 } 579 } 580 581 /* 582 * testInheritedDefault 583 * 584 * interface I { 585 * default static public int m() { return 1; } 586 * } 587 * 588 * class B implements I {} 589 * 590 * class C extends B {} 591 * 592 * TEST: I o = new C(); o.m()I throws IncompatibleClassChangeError 593 * -mode reflect returns 1 594 * TEST: B o = new C(); o.m()I throws NoSuchMethodError 595 * TEST: C o = new C(); o.m()I throws NoSuchMethodError 596 */ 597 public void testInheritedDefault() { 598 TestBuilder b = factory.getBuilder(); 599 600 Interface I = b.intf("I") 601 .defaultMethod("m", "()I") 602 .static_().public_().returns(1).build() 603 .build(); 604 605 ConcreteClass B = b.clazz("B").implement(I).build(); 606 ConcreteClass C = b.clazz("C").extend(B).build(); 607 608 if (!factory.getExecutionMode().equals("REFLECTION")) { 609 b.test().callSite(I, C, "m","()I").throws_(IncompatibleClassChangeError.class).done() 610 .test().callSite(B, C, "m","()I").throws_(NoSuchMethodError.class).done() 611 .test().callSite(C, C, "m","()I").throws_(NoSuchMethodError.class).done() 612 .run(); 613 } else { 614 b.test().callSite(I, C, "m","()I").returns(1).done() 615 .test().callSite(B, C, "m","()I").throws_(NoSuchMethodError.class).done() 616 .test().callSite(C, C, "m","()I").throws_(NoSuchMethodError.class).done() 617 .run(); 618 } 619 620 } 621 622 /* 623 * testDefaultVsConcreteInherited 624 * 625 * interface I { 626 * default static public int m() { return 1; } 627 * } 628 * 629 * class B { 630 * public int m() { return 2; } 631 * } 632 * 633 * class C extends B implements I {} 634 * 635 */ 636 public void testDefaultVsConcreteInherited() { 637 TestBuilder b = factory.getBuilder(); 638 639 Interface I = b.intf("I") 640 .defaultMethod("m", "()I") 641 .static_().public_().returns(1).build() 642 .build(); 643 644 ConcreteClass B = b.clazz("B") 645 .concreteMethod("m", "()I").returns(2).build() 646 .build(); 647 648 ConcreteClass C = b.clazz("C").extend(B).implement(I).build(); 649 650 if (!factory.getExecutionMode().equals("REFLECTION")) { 651 b.test().staticCallSite(I, "m","()I").returns(1).done() 652 .test().callSite(I, C, "m","()I").throws_(IncompatibleClassChangeError.class).done() 653 .test().callSite(B, C, "m","()I").returns(2).done() 654 .test().callSite(C, C, "m","()I").returns(2).done() 655 .run(); 656 } else { 657 b.test().staticCallSite(I, "m","()I").returns(1).done() 658 .test().callSite(I, C, "m","()I").returns(1).done() 659 .test().callSite(B, C, "m","()I").returns(2).done() 660 .test().callSite(C, C, "m","()I").returns(2).done() 661 .run(); 662 } 663 664 } 665 666 /* 667 * testDefaultVsStaticConflict 668 * 669 * interface I { 670 * default static public int m() { return 1; } 671 * } 672 * 673 * interface J { 674 * default public int m() { return 2; } 675 * } 676 * 677 * class C implements I, J {} 678 * 679 * TEST: I o = new C(); o.m()I throws ICCE 680 * -mode reflect returns 1 681 * TEST: J o = new C(); o.m()I == 2 682 * TEST: C o = new C(); o.m()I == 2 683 */ 684 public void testDefaultVsStaticConflict() { 685 TestBuilder b = factory.getBuilder(); 686 687 Interface I = b.intf("I") 688 .defaultMethod("m", "()I") 689 .static_().public_().returns(1).build() 690 .build(); 691 692 Interface J = b.intf("J") 693 .defaultMethod("m", "()I").returns(2).build() 694 .build(); 695 696 ConcreteClass C = b.clazz("C").implement(I,J).build(); 697 698 if (!factory.getExecutionMode().equals("REFLECTION")) { 699 b.test().callSite(I, C, "m", "()I").throws_(IncompatibleClassChangeError.class).done() 700 .test().callSite(J, C, "m", "()I").returns(2).done() 701 .test().callSite(C, C, "m", "()I").returns(2).done() 702 .run(); 703 } else { 704 b.test().callSite(I, C, "m", "()I").returns(1).done() 705 .test().callSite(J, C, "m", "()I").returns(2).done() 706 .test().callSite(C, C, "m", "()I").returns(2).done() 707 .run(); 708 } 709 710 } 711 /* 712 * testStaticSuperClassVsDefaultSuperInterface 713 * 714 * interface I { 715 * default public int m() { return 1; } 716 * } 717 * 718 * class A { 719 * public static int m() { return 2; } 720 * } 721 * 722 * class C extends A implements I {} 723 * 724 * TEST: C o = new C(); o.m()I throws ICCE 725 * -mode reflect returns 2 726 * TEST: I o = new C(); o.m()I == 1 727 */ 728 public void testStaticSuperClassVsDefaultSuperInterface() { 729 TestBuilder b = factory.getBuilder(); 730 731 Interface I = b.intf("I") 732 .defaultMethod("m", "()I") 733 .public_().returns(1).build() 734 .build(); 735 736 ConcreteClass A = b.clazz("A") 737 .concreteMethod("m", "()I") 738 .static_().public_().returns(2).build() 739 .build(); 740 741 ConcreteClass C = b.clazz("C").extend(A).implement(I).build(); 742 743 if (!factory.getExecutionMode().equals("REFLECTION")) { 744 b.test().callSite(C, C, "m", "()I").throws_(IncompatibleClassChangeError.class).done() 745 .test().callSite(I, C, "m", "()I").returns(1).done() 746 .run(); 747 } else { 748 b.test().callSite(C, C, "m", "()I").returns(2).done() 749 .test().callSite(I, C, "m", "()I").returns(1).done() 750 .run(); 751 } 752 } 753 /* 754 * testStaticLocalVsDefaultSuperInterface 755 * 756 * interface I { 757 * default public int m() { return 1; } 758 * } 759 * 760 * class A implements I { 761 * public static int m() { return 2; } 762 * } 763 * 764 * class C extends A implements I {} 765 * 766 * TEST: A o = new A(); o.m()I throws ICCE 767 * -mode reflect returns 2 768 * TEST: I o = new A(); o.m()I == 1 769 */ 770 public void testStaticLocalVsDefaultSuperInterface() { 771 TestBuilder b = factory.getBuilder(); 772 773 Interface I = b.intf("I") 774 .defaultMethod("m", "()I") 775 .public_().returns(1).build() 776 .build(); 777 778 ConcreteClass A = b.clazz("A").implement(I) 779 .concreteMethod("m", "()I") 780 .static_().public_().returns(2).build() 781 .build(); 782 783 ConcreteClass C = b.clazz("C").extend(A).implement(I).build(); 784 785 if (!factory.getExecutionMode().equals("REFLECTION")) { 786 b.test().callSite(A, A, "m", "()I").throws_(IncompatibleClassChangeError.class).done() 787 .test().callSite(I, A, "m", "()I").returns(1).done() 788 .run(); 789 } else { 790 b.test().callSite(A, A, "m", "()I").returns(2).done() 791 .test().callSite(I, A, "m", "()I").returns(1).done() 792 .run(); 793 } 794 } 795 /* 796 * testConflictingDefaultsandStaticMethod 797 * @bug 8033150 798 * 799 * interface I { 800 * default public int m() { return 1; } 801 * } 802 * 803 * interface J { 804 * default public int m() { return 2; } 805 * } 806 * 807 * class A implements I, J { 808 * public static int m() { return 3; } 809 * } 810 * 811 * class C extends A {} 812 * 813 * TEST: C.m(); should call A.m, return value = 3 814 */ 815 public void testConflictingDefaultsandStaticMethod() { 816 TestBuilder b = factory.getBuilder(); 817 818 Interface I = b.intf("I") 819 .defaultMethod("m", "()I") 820 .public_().returns(1).build() 821 .build(); 822 823 Interface J = b.intf("J") 824 .defaultMethod("m", "()I") 825 .public_().returns(2).build() 826 .build(); 827 828 ConcreteClass A = b.clazz("A").implement(I,J) 829 .concreteMethod("m", "()I") 830 .static_().public_().returns(3).build() 831 .build(); 832 833 ConcreteClass C = b.clazz("C").extend(A).build(); 834 835 b.test().staticCallSite(C, "m", "()I").returns(3).done() 836 .run(); 837 } 838 }