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