• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_interface_range;
18 
19 import dot.junit.DxTestCase;
20 import dot.junit.DxUtil;
21 import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_1;
22 import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_11;
23 import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_12;
24 import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_13;
25 import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_14;
26 import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_17;
27 import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_3;
28 
29 public class Test_invoke_interface_range extends DxTestCase {
30 
31     /**
32      * @title invoke interface method
33      */
testN1()34     public void testN1() {
35         T_invoke_interface_range_1 t = new T_invoke_interface_range_1();
36         assertEquals(0, t.run("aa", "aa"));
37         assertEquals(-1, t.run("aa", "bb"));
38         assertEquals(1, t.run("bb", "aa"));
39     }
40 
41     /**
42      * @title Check that new frame is created by invoke_interface_range and
43      * arguments are passed to method
44      */
testN2()45     public void testN2() {
46         //@uses dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_14
47         //@uses dot.junit.opcodes.invoke_interface_range.ITest
48         //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
49         T_invoke_interface_range_14 t = new T_invoke_interface_range_14();
50         ITestImpl impl = new ITestImpl();
51         assertEquals(1, t.run(impl));
52     }
53 
54 
55 
56     /**
57      * @title objref is null
58      */
testE3()59     public void testE3() {
60         //@uses dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_3
61         //@uses dot.junit.opcodes.invoke_interface_range.ITest
62         try {
63             new T_invoke_interface_range_3(null);
64             fail("expected NullPointerException");
65         } catch (NullPointerException npe) {
66             // expected
67         }
68     }
69 
70     /**
71      * @title object doesn't implement interface
72      */
testE4()73     public void testE4() {
74         //@uses dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_11
75         //@uses dot.junit.opcodes.invoke_interface_range.ITest
76         //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
77         T_invoke_interface_range_11 t = new T_invoke_interface_range_11();
78         try {
79             t.run();
80             fail("expected IncompatibleClassChangeError");
81         } catch (IncompatibleClassChangeError e) {
82             // expected
83         }
84     }
85 
86     /**
87      * @title Native method can't be linked
88      */
testE5()89     public void testE5() {
90         //@uses dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_12
91         //@uses dot.junit.opcodes.invoke_interface_range.ITest
92         //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
93         T_invoke_interface_range_12 t = new T_invoke_interface_range_12();
94         ITestImpl impl = new ITestImpl();
95         try {
96             t.run(impl);
97             fail("expected UnsatisfiedLinkError");
98         } catch (UnsatisfiedLinkError e) {
99             // expected
100         }
101     }
102 
103     /**
104      * @title Attempt to invoke abstract method
105      */
testE6()106     public void testE6() {
107         //@uses dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_13
108         //@uses dot.junit.opcodes.invoke_interface_range.ITest
109         //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
110         //@uses dot.junit.opcodes.invoke_interface_range.ITestImplAbstract
111         T_invoke_interface_range_13 t = new T_invoke_interface_range_13();
112         try {
113             t.run();
114             fail("expected AbstractMethodError");
115         } catch (AbstractMethodError e) {
116             // expected
117         }
118     }
119 
120 
121     /**
122      * @title Attempt to invoke non-public interface method
123      */
testE8()124     public void testE8() {
125         //@uses dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_17
126         //@uses dot.junit.opcodes.invoke_interface_range.ITest
127         //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
128         //@uses dot.junit.opcodes.invoke_interface_range.ITestImplAbstract
129         try {
130             T_invoke_interface_range_17 t = new T_invoke_interface_range_17();
131             t.run();
132             fail("expected a verification exception");
133         } catch (IllegalAccessError e) {
134             // expected
135         } catch (VerifyError e) {
136             // expected
137         }
138     }
139 
140 
141     /**
142      * @constraint A17
143      * @title invalid constant pool index
144      */
testVFE1()145     public void testVFE1() {
146         try {
147             Class.forName("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_2");
148             fail("expected a verification exception");
149         } catch (Throwable t) {
150             DxUtil.checkVerifyException(t);
151         }
152     }
153 
154     /**
155      * @constraint A17
156      * @title The referenced method_id must belong to an interface (not a class).
157      */
testVFE2()158     public void testVFE2() {
159         try {
160             Class.forName("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_4");
161             fail("expected a verification exception");
162         } catch (Throwable t) {
163             DxUtil.checkVerifyException(t);
164         }
165     }
166 
167     /**
168      * @constraint B1
169      * @title number of arguments
170      */
testVFE5()171     public void testVFE5() {
172         try {
173             Class.forName("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_5");
174             fail("expected a verification exception");
175         } catch (Throwable t) {
176             DxUtil.checkVerifyException(t);
177         }
178     }
179 
180     /**
181      * @constraint B1
182      * @title int is passed instead of objref
183      */
testVFE6()184     public void testVFE6() {
185         try {
186             Class.forName("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_10");
187             fail("expected a verification exception");
188         } catch (Throwable t) {
189             DxUtil.checkVerifyException(t);
190         }
191     }
192 
193     /**
194      * @constraint B9
195      * @title number of arguments passed to method
196      */
testVFE9()197     public void testVFE9() {
198         try {
199             Class.forName("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_9");
200             fail("expected a verification exception");
201         } catch (Throwable t) {
202             DxUtil.checkVerifyException(t);
203         }
204     }
205 
206     /**
207      * @constraint A15
208      * @title invoke-interface may not be used to call <init>.
209      */
testVFE10()210     public void testVFE10() {
211         try {
212             Class.forName("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_18");
213             fail("expected a verification exception");
214         } catch (Throwable t) {
215             DxUtil.checkVerifyException(t);
216         }
217     }
218 
219     /**
220      * @constraint A15
221      * @title invoke-interface may not be used to call <clinit>.
222      */
testVFE11()223     public void testVFE11() {
224         try {
225             Class.forName("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_20");
226             fail("expected a verification exception");
227         } catch (Throwable t) {
228             DxUtil.checkVerifyException(t);
229         }
230     }
231 
232     /**
233      * @constraint B9
234      * @title types of arguments passed to method
235      */
testVFE12()236     public void testVFE12() {
237         try {
238             Class.forName("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_21");
239             fail("expected a verification exception");
240         } catch (Throwable t) {
241             DxUtil.checkVerifyException(t);
242         }
243     }
244 
245     /**
246      * @constraint A23
247      * @title number of registers
248      */
testVFE13()249     public void testVFE13() {
250         try {
251             Class.forName("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_8");
252             fail("expected a verification exception");
253         } catch (Throwable t) {
254             DxUtil.checkVerifyException(t);
255         }
256     }
257 
258     /**
259      * @constraint n/a
260      * @title Attempt to call undefined method. Java throws NoSuchMethodError
261      * on first access but Dalvik throws VerifyError on class loading.
262      */
testVFE14()263     public void testVFE14() {
264         //@uses dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_7
265         //@uses dot.junit.opcodes.invoke_interface_range.ITest
266         //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
267         try {
268             Class.forName("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_7");
269             fail("expected a verification exception");
270         } catch (Throwable t) {
271             DxUtil.checkVerifyException(t);
272         }
273     }
274 
275     /**
276      * @constraint n/a
277      * @title Method has different signature. Java throws NoSuchMethodError
278      * on first access but Dalvik throws VerifyError on class loading.
279      */
testVFE15()280     public void testVFE15() {
281         //@uses dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_16
282         //@uses dot.junit.opcodes.invoke_interface_range.ITest
283         //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
284         try {
285             Class.forName("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_16");
286             fail("expected a verification exception");
287         } catch (Throwable t) {
288             DxUtil.checkVerifyException(t);
289         }
290     }
291 
292     /**
293      * @constraint B6
294      * @title instance methods may only be invoked on already initialized instances.
295      */
testVFE21()296     public void testVFE21() {
297         //@uses dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_22
298         //@uses dot.junit.opcodes.invoke_interface_range.ITest
299         //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
300         try {
301             Class.forName("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_22");
302             fail("expected a verification exception");
303         } catch (Throwable t) {
304             DxUtil.checkVerifyException(t);
305         }
306     }
307 }
308