Path: blob/master/test/hotspot/jtreg/vmTestbase/vm/runtime/defmeth/AccessibilityFlagsTest.java
41159 views
/*1* Copyright (c) 2013, 2021, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223/*24* @test25*26* @modules java.base/jdk.internal.org.objectweb.asm:+open java.base/jdk.internal.org.objectweb.asm.util:+open27* @library /vmTestbase /test/lib28*29* @comment build retransform.jar in current dir30* @run driver vm.runtime.defmeth.shared.BuildJar31*32* @run driver jdk.test.lib.FileInstaller . .33* @run main/othervm/native34* -agentlib:redefineClasses35* -javaagent:retransform.jar36* vm.runtime.defmeth.AccessibilityFlagsTest37*/38package vm.runtime.defmeth;3940import java.util.Set;4142import vm.runtime.defmeth.shared.DefMethTest;43import vm.runtime.defmeth.shared.data.*;44import vm.runtime.defmeth.shared.data.method.body.EmptyBody;45import vm.runtime.defmeth.shared.builder.TestBuilder;4647import static jdk.internal.org.objectweb.asm.Opcodes.*;48import static vm.runtime.defmeth.shared.ExecutionMode.*;4950/*51* Test allowed combinations of access flags on methods in interfaces.52* Based on assertions from JVMS.53*/54public class AccessibilityFlagsTest extends DefMethTest {55public static void main(String[] args) {56DefMethTest.runTest(AccessibilityFlagsTest.class,57/* majorVer */ Set.of(MAX_MAJOR_VER),58/* flags */ Set.of(0, ACC_SYNCHRONIZED),59/* redefine */ Set.of(false, true),60/* execMode */ Set.of(DIRECT, REFLECTION, INVOKE_EXACT, INVOKE_GENERIC, INVOKE_WITH_ARGS, INDY));61}6263/* ====================================================================== */6465// Methods of interfaces may set any of the flags in Table 4.5 except66// ACC_PROTECTED, ACC_FINAL, ACC_NATIVE, and ACC_SYNCHRONIZED (9.4);6768/**69* interface I { protected void m(); }70*71* TEST: ClassLoader.loadClass("I") ==> ClassFormatError72*/73public void testProtectedMethodAbstract() {74expectClassFormatError(75createAbstractMethodInterface(ACC_PROTECTED));7677expectClassFormatError(78createAbstractMethodInterface(ACC_PROTECTED | ACC_PUBLIC));7980expectClassFormatError(81createAbstractMethodInterface(ACC_PROTECTED | ACC_PRIVATE));8283}8485/**86* interface I { protected void m() default {}; }87*88* TEST: ClassLoader.loadClass("I") ==> ClassFormatError89*/90public void testProtectedMethodDefault() {91expectClassFormatError(92createDefaultMethodInterface(ACC_PROTECTED));9394expectClassFormatError(95createDefaultMethodInterface(ACC_PROTECTED | ACC_PUBLIC));9697expectClassFormatError(98createDefaultMethodInterface(ACC_PROTECTED | ACC_PRIVATE));99}100101/**102* interface I { final void m() default {}; }103*104* TEST: ClassLoader.loadClass("I") ==> ClassFormatError105*/106public void testFinalMethodDefault() {107expectClassFormatError(108createDefaultMethodInterface(ACC_FINAL));109110expectClassFormatError(111createDefaultMethodInterface(ACC_FINAL | ACC_PUBLIC));112113expectClassFormatError(114createDefaultMethodInterface(ACC_FINAL | ACC_PRIVATE));115}116117/**118* interface I { native void m() default {}; }119*120* TEST: ClassLoader.loadClass("I") ==> ClassFormatError121*/122public void testNativeMethodDefault() {123expectClassFormatError(124createDefaultMethodInterface(ACC_NATIVE));125126expectClassFormatError(127createDefaultMethodInterface(ACC_NATIVE | ACC_PUBLIC));128129expectClassFormatError(130createDefaultMethodInterface(ACC_NATIVE | ACC_PRIVATE));131}132133134/**135* interface I { synchronized void m(); }136*137* TEST: ClassLoader.loadClass("I") ==> ClassFormatError138*/139public void testSynchronizedMethodAbstract() {140expectClassFormatError(141createAbstractMethodInterface(ACC_SYNCHRONIZED));142143expectClassFormatError(144createAbstractMethodInterface(ACC_SYNCHRONIZED | ACC_PUBLIC));145146expectClassFormatError(147createAbstractMethodInterface(ACC_SYNCHRONIZED | ACC_PRIVATE));148}149150/**151* interface I { synchronized void m() default {}; }152*153* TEST: ClassLoader.loadClass("I") ==> ClassFormatError154*/155public void testSynchronizedMethodDefault() {156expectClassFormatError(157createDefaultMethodInterface(ACC_SYNCHRONIZED));158159expectClassFormatError(160createDefaultMethodInterface(ACC_SYNCHRONIZED | ACC_PUBLIC));161162expectClassFormatError(163createDefaultMethodInterface(ACC_SYNCHRONIZED | ACC_PRIVATE));164}165166/* ===================================================================== */167168// [methods of interfaces] must have exactly one of the ACC_PUBLIC or ACC_PRIVATE flags set.169170/**171* interface I { private void m() default {}; }172*173* TEST: ClassLoader.loadClass("I") == succeeds174*/175public void testPrivateMethodDefault() {176loadClass(177createDefaultMethodInterface(ACC_PRIVATE));178}179180/**181* interface I { public void m(); }182*183* TEST: ClassLoader.loadClass("I") == succeeds184*/185public void testPublicMethodAbstract() {186loadClass(187createAbstractMethodInterface(ACC_PUBLIC));188}189190/**191* interface I { public void m() default {}; }192*193*/194public void testPublicMethodDefault() {195loadClass(196createDefaultMethodInterface(ACC_PUBLIC));197}198199/**200* interface I { private public void m(); }201*202* TEST: ClassLoader.loadClass("I") ==> ClassFormatError203*/204public void testPrivatePublicMethodAbstract() {205expectClassFormatError(206createAbstractMethodInterface(ACC_PUBLIC | ACC_PRIVATE));207}208209/**210* interface I { private public void m() default {}; }211*212* TEST: ClassLoader.loadClass("I") ==> ClassFormatError213*/214public void testPrivatePublicMethodDefault() {215expectClassFormatError(216createDefaultMethodInterface(ACC_PUBLIC | ACC_PRIVATE));217}218219/* ===================================================================== */220221// Methods of classes may set any of the flags in Table 4.5 except222// ACC_PROTECTED, ACC_FINAL, ACC_NATIVE, and ACC_SYNCHRONIZED (9.4);223// they must have exactly one of the ACC_PUBLIC or ACC_PRIVATE flags set.224//225// The following flags are allowed:226// ACC_PUBLIC 0x0001 Declared public; may be accessed from outside its package.227// ACC_PRIVATE 0x0002 Declared private; accessible only within the defining class.228// ACC_STATIC 0x0008 Declared static.229// ACC_BRIDGE 0x0040 A bridge method, generated by the compiler.230// ACC_VARARGS 0x0080 Declared with variable number of arguments.231// ACC_SYNTHETIC 0x1000 Declared synthetic; not present in the source code.232233/**234* interface I { static void m() default {}; }235*236* TEST: ClassLoader.loadClass("I") == succeeds237*/238public void testStaticMethodDefault() {239loadClass(240createDefaultMethodInterface(ACC_STATIC | ACC_PUBLIC));241loadClass(242createDefaultMethodInterface(ACC_STATIC | ACC_PRIVATE));243}244245/* =============================================================================== */246247// If a specific method of a class or interface has its ACC_ABSTRACT flag set,248// it must not have any of its ACC_FINAL, ACC_NATIVE, ACC_PRIVATE, ACC_STATIC,249// or ACC_SYNCHRONIZED flags set (8.4.3.1, 8.4.3.3, 8.4.3.4).250251/**252* interface I { final void m(); }253* abstract class C { abstract final void m(); }254*255* TEST: ClassLoader.loadClass("I") ==> ClassFormatError256* TEST: ClassLoader.loadClass("C") ==> ClassFormatError257*/258public void testFinalMethodAbstract() {259/* interface I */260expectClassFormatError(261createAbstractMethodInterface(ACC_FINAL));262263expectClassFormatError(264createAbstractMethodInterface(ACC_FINAL | ACC_PUBLIC));265266/* abstract class C */267expectClassFormatError(268createAbstractMethodClass(ACC_FINAL));269}270271/**272* interface I { native void m(); }273* interface K { native void m() default {}; }274* abstract class C { abstract native m(); }275*276* TEST: ClassLoader.loadClass("I") ==> ClassFormatError277* TEST: ClassLoader.loadClass("K") ==> ClassFormatError278* TEST: ClassLoader.loadClass("C") ==> ClassFormatError279*/280public void testNativeMethodAbstract() {281/* interface I */282expectClassFormatError(283createDefaultMethodInterface(ACC_NATIVE));284285expectClassFormatError(286createDefaultMethodInterface(ACC_NATIVE | ACC_PUBLIC));287288/* interface K */289expectClassFormatError(290createAbstractMethodInterface(ACC_NATIVE));291292expectClassFormatError(293createAbstractMethodInterface(ACC_NATIVE | ACC_PUBLIC));294295/* abstract class C */296expectClassFormatError(297createAbstractMethodClass(ACC_NATIVE));298}299300/**301* interface I { private void m(); }302* abstract class C { abstract private void m(); }303*304* TEST: ClassLoader.loadClass("I") ==> ClassFormatError305* TEST: ClassLoader.loadClass("C") ==> ClassFormatError306*/307public void testPrivateMethodAbstract() {308/* interface I */309expectClassFormatError(310createAbstractMethodInterface(ACC_PRIVATE));311312/* abstract class C */313expectClassFormatError(314createAbstractMethodClass(ACC_PRIVATE));315}316317/**318* interface I { static void m(); }319* abstract class C { abstract static void m(); }320*321* TEST: ClassLoader.loadClass("I") ==> ClassFormatError322* TEST: ClassLoader.loadClass("C") ==> ClassFormatError323*/324public void testStaticMethodAbstract() {325/* interface I */326expectClassFormatError(327createAbstractMethodInterface(ACC_STATIC));328329expectClassFormatError(330createAbstractMethodInterface(ACC_STATIC | ACC_PUBLIC));331332/* abstract class C */333expectClassFormatError(334createAbstractMethodClass(ACC_STATIC));335}336337/* =============================================================================== */338339/**340* interface I { abstract void m() default {}; }341*342* TEST: ClassLoader.loadClass("I") ==> ClassFormatError343*/344public void testAbstractMethodDefault() {345expectClassFormatError(346createDefaultMethodInterface(ACC_ABSTRACT));347}348349/* ====================================================================== */350351// Helper methods352private Interface createAbstractMethodInterface(int acc) {353return factory.getBuilder()354.intf("I")355.abstractMethod("m", "()V").flags(acc)356.build()357.build();358}359360private Clazz createAbstractMethodClass(int acc) {361return factory.getBuilder()362.clazz("I")363.abstractMethod("m", "()V").flags(acc)364.build()365.build();366}367368private Interface createDefaultMethodInterface(int acc) {369return factory.getBuilder()370.intf("I")371.defaultMethod("m", "()V").flags(acc)372.body(new EmptyBody())373.build()374.build();375}376377private void expectException(Clazz clz, Class<? extends Throwable> exc) {378TestBuilder b = factory.getBuilder()379.register(clz);380381b.test().loadClass(clz).throws_(exc).done()382.run();383}384385private void loadClass(Clazz clz) {386TestBuilder b = factory.getBuilder()387.register(clz);388389b.test().loadClass(clz).ignoreResult().done()390.run();391}392393private void expectClassFormatError(Clazz clz) {394expectException(clz, ClassFormatError.class);395}396}397398399