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()
|