1 /*
2  * Copyright (c) 2016, 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 /*
25  * @test
26  * @summary Test of method selection and resolution cases that
27  * generate IncompatibleClassChangeError
28  * @requires vm.opt.final.ClassUnloading
29  * @modules java.base/jdk.internal.org.objectweb.asm
30  * @library /runtime/SelectionResolution/classes
31  * @run main/othervm/timeout=500 -XX:+IgnoreUnrecognizedVMOptions -XX:-VerifyDependencies InvokeInterfaceICCE
32  */
33 
34 import java.util.Arrays;
35 import java.util.Collection;
36 import java.util.EnumSet;
37 import selectionresolution.ClassData;
38 import selectionresolution.MethodData;
39 import selectionresolution.Result;
40 import selectionresolution.SelectionResolutionTest;
41 import selectionresolution.SelectionResolutionTestCase;
42 import selectionresolution.Template;
43 
44 public class InvokeInterfaceICCE extends SelectionResolutionTest {
45 
46     private static final SelectionResolutionTestCase.Builder initBuilder =
47         new SelectionResolutionTestCase.Builder();
48 
49     static {
50         initBuilder.setResult(Result.ICCE);
51     }
52 
53     private static final Collection<TestGroup> testgroups =
54         Arrays.asList(
55                 /* invokeinterface tests */
56 
57                 /* resolved method is static*/
58                 /* Group 168: methodref = expected */
59                 new TestGroup.Simple(initBuilder,
60                         Template.SetInvoke(SelectionResolutionTestCase.InvokeInstruction.INVOKEINTERFACE),
61                         Template.ResultCombo(EnumSet.of(Template.Kind.INTERFACE),
62                                              EnumSet.of(MethodData.Access.PUBLIC),
63                                              EnumSet.of(MethodData.Context.STATIC),
64                                              EnumSet.of(ClassData.Package.SAME,
65                                                         ClassData.Package.DIFFERENT)),
66                         Template.OverrideAbstractExpectedIface,
67                         Template.MethodrefEqualsExpected,
68                         Template.IgnoredAbstract,
69                         Template.AllCallsiteCases,
70                         Template.IfaceMethodrefSelection),
71                 /* Group 169: methodref != expected */
72                 new TestGroup.Simple(initBuilder,
73                         Template.SetInvoke(SelectionResolutionTestCase.InvokeInstruction.INVOKEINTERFACE),
74                         Template.ResultCombo(EnumSet.of(Template.Kind.INTERFACE),
75                                              EnumSet.of(MethodData.Access.PUBLIC),
76                                              EnumSet.of(MethodData.Context.STATIC),
77                                              EnumSet.of(ClassData.Package.SAME,
78                                                         ClassData.Package.DIFFERENT)),
79                         Template.OverrideAbstractExpectedIface,
80                         Template.IfaceMethodrefNotEqualsExpected,
81                         Template.IgnoredAbstract,
82                         Template.AllCallsiteCases,
83                         Template.IfaceMethodrefSelection),
84 
85                 /* methodref is a class */
86                 /* Group 170: methodref = expected */
87                 new TestGroup.Simple(initBuilder,
88                         Template.SetInvoke(SelectionResolutionTestCase.InvokeInstruction.INVOKEINTERFACE),
89                         Template.ResultCombo(EnumSet.of(Template.Kind.CLASS),
90                                              EnumSet.of(MethodData.Access.PUBLIC,
91                                                         MethodData.Access.PACKAGE,
92                                                         MethodData.Access.PROTECTED,
93                                                         MethodData.Access.PRIVATE),
94                                              EnumSet.of(MethodData.Context.STATIC),
95                                              EnumSet.of(ClassData.Package.SAME,
96                                                         ClassData.Package.DIFFERENT)),
97                         Template.OverrideAbstractExpectedClass,
98                         Template.MethodrefEqualsExpected,
99                         Template.IgnoredAbstract,
100                         Template.AllCallsiteCases,
101                         Template.MethodrefSelectionResolvedIsClass),
102                 /* Group 171: methodref != expected, expected is class */
103                 new TestGroup.Simple(initBuilder,
104                         Template.SetInvoke(SelectionResolutionTestCase.InvokeInstruction.INVOKEINTERFACE),
105                         Template.ResultCombo(EnumSet.of(Template.Kind.CLASS),
106                                              EnumSet.of(MethodData.Access.PUBLIC,
107                                                         MethodData.Access.PACKAGE,
108                                                         MethodData.Access.PROTECTED,
109                                                         MethodData.Access.PRIVATE),
110                                              EnumSet.of(MethodData.Context.STATIC),
111                                              EnumSet.of(ClassData.Package.SAME,
112                                                         ClassData.Package.DIFFERENT)),
113                         Template.OverrideAbstractExpectedClass,
114                         Template.MethodrefNotEqualsExpectedClass,
115                         Template.IgnoredAbstract,
116                         Template.AllCallsiteCases,
117                         Template.MethodrefSelectionResolvedIsClass),
118                 /* Group 172: methodref != expected expected is interface */
119                 new TestGroup.Simple(initBuilder,
120                         Template.SetInvoke(SelectionResolutionTestCase.InvokeInstruction.INVOKEINTERFACE),
121                         Template.ResultCombo(EnumSet.of(Template.Kind.INTERFACE),
122                                              EnumSet.of(MethodData.Access.PUBLIC,
123                                                         MethodData.Access.PRIVATE),
124                                              EnumSet.of(MethodData.Context.STATIC),
125                                              EnumSet.of(ClassData.Package.SAME,
126                                                         ClassData.Package.DIFFERENT)),
127                         Template.OverrideAbstractExpectedIface,
128                         Template.MethodrefNotEqualsExpectedIface,
129                         Template.IgnoredAbstract,
130                         Template.AllCallsiteCases,
131                         Template.MethodrefSelectionResolvedIsIface),
132                 /* Group 173: ambiguous resolution */
133                 new TestGroup.Simple(initBuilder,
134                         Template.SetInvoke(SelectionResolutionTestCase.InvokeInstruction.INVOKEINTERFACE),
135                         Template.ResultCombo(EnumSet.of(Template.Kind.INTERFACE),
136                                              EnumSet.of(MethodData.Access.PUBLIC),
137                                              EnumSet.of(MethodData.Context.INSTANCE),
138                                              EnumSet.of(ClassData.Package.SAME,
139                                                         ClassData.Package.DIFFERENT)),
140                         Template.OverrideAbstractExpectedIface,
141                         Template.IfaceMethodrefAmbiguous,
142                         Template.IgnoredAbstract,
143                         Template.AllCallsiteCases,
144                         Template.IfaceMethodrefSelectionNoOverride),
145                 /* Group 174: ambiguous selection */
146                 new TestGroup.Simple(initBuilder,
147                         Template.SetInvoke(SelectionResolutionTestCase.InvokeInstruction.INVOKEINTERFACE),
148                         Template.ResultCombo(EnumSet.of(Template.Kind.INTERFACE),
149                                              EnumSet.of(MethodData.Access.PUBLIC),
150                                              EnumSet.of(MethodData.Context.INSTANCE),
151                                              EnumSet.of(ClassData.Package.SAME,
152                                                         ClassData.Package.DIFFERENT)),
153                         Template.OverrideAbstractExpectedIface,
154                         Template.IfaceMethodrefNotEqualsExpected,
155                         Template.IgnoredAbstract,
156                         Template.AllCallsiteCases,
157                         Template.IfaceMethodrefAmbiguousResolvedIsIface)
158             );
159 
InvokeInterfaceICCE()160     private InvokeInterfaceICCE() {
161         super(testgroups);
162     }
163 
main(final String... args)164     public static void main(final String... args) {
165         new InvokeInterfaceICCE().run();
166     }
167 }
168