1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package dot.junit.opcodes.invoke_super;
18 
19 import dot.junit.DxTestCase;
20 import dot.junit.DxUtil;
21 import dot.junit.opcodes.invoke_super.d.T_invoke_super_1;
22 import dot.junit.opcodes.invoke_super.d.T_invoke_super_10;
23 import dot.junit.opcodes.invoke_super.d.T_invoke_super_14;
24 import dot.junit.opcodes.invoke_super.d.T_invoke_super_15;
25 import dot.junit.opcodes.invoke_super.d.T_invoke_super_17;
26 import dot.junit.opcodes.invoke_super.d.T_invoke_super_18;
27 import dot.junit.opcodes.invoke_super.d.T_invoke_super_19;
28 import dot.junit.opcodes.invoke_super.d.T_invoke_super_2;
29 import dot.junit.opcodes.invoke_super.d.T_invoke_super_20;
30 import dot.junit.opcodes.invoke_super.d.T_invoke_super_24;
31 import dot.junit.opcodes.invoke_super.d.T_invoke_super_4;
32 import dot.junit.opcodes.invoke_super.d.T_invoke_super_5;
33 import dot.junit.opcodes.invoke_super.d.T_invoke_super_6;
34 import dot.junit.opcodes.invoke_super.d.T_invoke_super_7;
35 
36 public class Test_invoke_super extends DxTestCase {
37 
38     /**
39      * @title invoke method of superclass
40      */
testN1()41     public void testN1() {
42         //@uses dot.junit.opcodes.invoke_super.d.T_invoke_super_1
43         //@uses dot.junit.opcodes.invoke_super.d.TSuper
44         T_invoke_super_1 t = new T_invoke_super_1();
45         assertEquals(5, t.run());
46     }
47 
48 
49     /**
50      * @title Invoke protected method of superclass
51      */
testN3()52     public void testN3() {
53         //@uses dot.junit.opcodes.invoke_super.d.T_invoke_super_7
54         //@uses dot.junit.opcodes.invoke_super.d.TSuper
55         T_invoke_super_7 t = new T_invoke_super_7();
56         assertEquals(5, t.run());
57     }
58 
59     /**
60      * @title Check that new frame is created by invoke_super and
61      * arguments are passed to method
62      */
testN5()63     public void testN5() {
64         //@uses dot.junit.opcodes.invoke_super.d.T_invoke_super_14
65         //@uses dot.junit.opcodes.invoke_super.d.TSuper
66         T_invoke_super_14 t = new T_invoke_super_14();
67         assertTrue(t.run());
68     }
69 
70     /**
71      * @title Recursion of method lookup procedure
72      */
testN6()73     public void testN6() {
74         //@uses dot.junit.opcodes.invoke_super.d.T_invoke_super_17
75         //@uses dot.junit.opcodes.invoke_super.d.TSuper
76         //@uses dot.junit.opcodes.invoke_super.d.TSuper2
77         T_invoke_super_17 t = new T_invoke_super_17();
78         assertEquals(5, t.run());
79     }
80 
81     /**
82      * @title obj ref is null
83      */
testE1()84     public void testE1() {
85         //@uses dot.junit.opcodes.invoke_super.d.TSuper
86         loadAndRun("dot.junit.opcodes.invoke_super.d.T_invoke_super_2", NullPointerException.class);
87         T_invoke_super_2 t = new T_invoke_super_2();
88     }
89 
90     /**
91      * @title Native method can't be linked
92      */
testE2()93     public void testE2() {
94         //@uses dot.junit.opcodes.invoke_super.d.TSuper
95         loadAndRun("dot.junit.opcodes.invoke_super.d.T_invoke_super_4", UnsatisfiedLinkError.class);
96     }
97 
98     /**
99      * @title Attempt to invoke abstract method
100      */
testE4()101     public void testE4() {
102         //@uses dot.junit.opcodes.invoke_super.ATest
103         loadAndRun("dot.junit.opcodes.invoke_super.d.T_invoke_super_6", AbstractMethodError.class);
104     }
105 
106     /**
107      * @constraint A13
108      * @title invalid constant pool index
109      */
testVFE1()110     public void testVFE1() {
111         load("dot.junit.opcodes.invoke_super.d.T_invoke_super_8", ClassNotFoundException.class);
112     }
113 
114     /**
115      * @constraint A15
116      * @title <clinit> may not be called using invoke-super
117      */
testVFE3()118     public void testVFE3() {
119         load("dot.junit.opcodes.invoke_super.d.T_invoke_super_10", VerifyError.class);
120     }
121 
122     /**
123      * @constraint B1
124      * @title number of arguments passed to method
125      */
testVFE4()126     public void testVFE4() {
127         load("dot.junit.opcodes.invoke_super.d.T_invoke_super_11", VerifyError.class);
128     }
129 
130     /**
131      * @constraint B9
132      * @title types of arguments passed to method.
133      */
testVFE5()134     public void testVFE5() {
135         //@uses dot.junit.opcodes.invoke_super.d.TSuper
136         load("dot.junit.opcodes.invoke_super.d.T_invoke_super_12", VerifyError.class);
137     }
138 
139     /**
140      * @constraint A15
141      * @title <init> may not be called using invoke_super
142      */
testVFE6()143     public void testVFE6() {
144         load("dot.junit.opcodes.invoke_super.d.T_invoke_super_16", VerifyError.class);
145     }
146 
147     /**
148      * @constraint B10
149      * @title assignment incompatible references when accessing
150      *                  protected method
151      */
testVFE8()152     public void testVFE8() {
153         //@uses dot.junit.opcodes.invoke_super.d.TSuper
154         //@uses dot.junit.opcodes.invoke_super.d.TPlain
155         load("dot.junit.opcodes.invoke_super.d.T_invoke_super_22", VerifyError.class);
156     }
157 
158     /**
159      * @constraint B10
160      * @title assignment incompatible references when accessing
161      *                  public method
162      */
testVFE9()163     public void testVFE9() {
164         //@uses dot.junit.opcodes.invoke_super.d.TSuper
165         //@uses dot.junit.opcodes.invoke_super.d.TSuper2
166         load("dot.junit.opcodes.invoke_super.d.T_invoke_super_23", VerifyError.class);
167     }
168 
169     /**
170      * @constraint n/a
171      * @title Attempt to call static method.
172      */
testVFE10()173     public void testVFE10() {
174         //@uses dot.junit.opcodes.invoke_super.d.TSuper
175         loadAndRun("dot.junit.opcodes.invoke_super.d.T_invoke_super_5",
176                    IncompatibleClassChangeError.class);
177     }
178 
179 
180     /**
181      * @constraint n/a
182      * @title Attempt to invoke non-existing method.
183      */
testVFE12()184     public void testVFE12() {
185         loadAndRun("dot.junit.opcodes.invoke_super.d.T_invoke_super_15", NoSuchMethodError.class);
186     }
187 
188     /**
189      * @constraint n/a
190      * @title Attempt to invoke private method of other class.
191      */
testVFE13()192     public void testVFE13() {
193         //@uses dot.junit.opcodes.invoke_super.TestStubs
194         loadAndRun("dot.junit.opcodes.invoke_super.d.T_invoke_super_18", IllegalAccessError.class,
195                    new TestStubs());
196     }
197 
198     /**
199      * @constraint B12
200      * @title Attempt to invoke protected method of unrelated class.
201      */
testVFE14()202     public void testVFE14() {
203         //@uses dot.junit.opcodes.invoke_super.TestStubs
204         loadAndRun("dot.junit.opcodes.invoke_super.d.T_invoke_super_20", IllegalAccessError.class,
205                    new TestStubs());
206     }
207 
208     /**
209      * @constraint n/a
210      * @title Method has different signature.
211      */
testVFE15()212     public void testVFE15() {
213         //@uses dot.junit.opcodes.invoke_super.d.TSuper
214         loadAndRun("dot.junit.opcodes.invoke_super.d.T_invoke_super_19", NoSuchMethodError.class);
215     }
216 
217     /**
218      * @constraint n/a
219      * @title invoke-super shall be used to invoke private methods
220      */
testVFE16()221     public void testVFE16() {
222         //@uses dot.junit.opcodes.invoke_super.d.TSuper
223         load("dot.junit.opcodes.invoke_super.d.T_invoke_super_13", VerifyError.class);
224     }
225 
226     /**
227      * @constraint A23
228      * @title number of registers
229      */
testVFE17()230     public void testVFE17() {
231         load("dot.junit.opcodes.invoke_super.d.T_invoke_super_9", VerifyError.class);
232     }
233 
234     /**
235      * @constraint A13
236      * @title attempt to invoke interface method
237      */
testVFE18()238     public void testVFE18() {
239         loadAndRun("dot.junit.opcodes.invoke_super.d.T_invoke_super_24",
240                    IncompatibleClassChangeError.class);
241     }
242 
243     /**
244      * @constraint B6
245      * @title instance methods may only be invoked on already initialized instances.
246      */
testVFE19()247     public void testVFE19() {
248         //@uses dot.junit.opcodes.invoke_super.d.TSuper
249         load("dot.junit.opcodes.invoke_super.d.T_invoke_super_25", VerifyError.class);
250     }
251 }
252