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 dxc.junit.opcodes.invokevirtual; 18 19 import dxc.junit.DxTestCase; 20 import dxc.junit.DxUtil; 21 import dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_1; 22 import dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_13; 23 import dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_14; 24 import dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_15; 25 import dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_17; 26 import dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_18; 27 import dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_19; 28 import dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_2; 29 import dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_20; 30 import dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_3; 31 import dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_4; 32 import dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_5; 33 import dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_6; 34 import dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_7; 35 36 public class Test_invokevirtual extends DxTestCase { 37 38 /** 39 * @title normal test 40 */ 41 public void testN1() { 42 T_invokevirtual_1 t = new T_invokevirtual_1(); 43 int a = 1; 44 String sa = "a" + a; 45 String sb = "a1"; 46 assertTrue(t.run(sa, sb)); 47 assertFalse(t.run(this, sa)); 48 assertFalse(t.run(sb, this)); 49 } 50 51 /** 52 * @title Check that monitor is acquired if method is synchronized 53 */ 54 public void testN2() { 55 assertTrue(T_invokevirtual_2.execute()); 56 } 57 58 /** 59 * @title Invoke protected method of superclass 60 */ 61 public void testN3() { 62 // @uses dxc.junit.opcodes.invokevirtual.jm.TSuper 63 T_invokevirtual_7 t = new T_invokevirtual_7(); 64 assertEquals(5, t.run()); 65 } 66 67 /** 68 * @title Private method call 69 */ 70 public void testN4() { 71 T_invokevirtual_13 t = new T_invokevirtual_13(); 72 assertEquals(345, t.run()); 73 } 74 75 /** 76 * @title Check that new frame is created by invokevirtual and 77 * arguments are passed to method 78 */ 79 public void testN5() { 80 // @uses dxc.junit.opcodes.invokevirtual.jm.TSuper 81 T_invokevirtual_14 t = new T_invokevirtual_14(); 82 assertTrue(t.run()); 83 } 84 85 /** 86 * @title Recursion of method lookup procedure 87 */ 88 public void testN6() { 89 // @uses dxc.junit.opcodes.invokevirtual.jm.TSuper 90 T_invokevirtual_17 t = new T_invokevirtual_17(); 91 assertEquals(5, t.run()); 92 } 93 94 /** 95 * @title 96 */ 97 public void testE1() { 98 T_invokevirtual_3 t = new T_invokevirtual_3(); 99 String s = "s"; 100 try { 101 t.run(null, s); 102 fail("expected NullPointerException"); 103 } catch (NullPointerException npe) { 104 // expected 105 } 106 } 107 108 /** 109 * @title Native method can't be linked 110 */ 111 public void testE2() { 112 T_invokevirtual_4 t = new T_invokevirtual_4(); 113 try { 114 t.run(); 115 fail("expected UnsatisfiedLinkError"); 116 } catch (UnsatisfiedLinkError ule) { 117 // expected 118 } 119 } 120 121 /** 122 * @title Attempt to invoke static method 123 */ 124 public void testE3() { 125 try { 126 T_invokevirtual_5 t = new T_invokevirtual_5(); 127 t.run(); 128 fail("expected IncompatibleClassChangeError"); 129 } catch (IncompatibleClassChangeError icce) { 130 // expected 131 } catch (VerifyError vfe) { 132 // ok for dalvikvm; 133 System.out.print("dvmvfe:"); 134 } 135 } 136 137 /** 138 * @title Attempt to invoke abstract method 139 */ 140 public void testE4() { 141 // @uses dxc.junit.opcodes.invokevirtual.jm.ATest 142 T_invokevirtual_6 t = new T_invokevirtual_6(); 143 try { 144 t.run(); 145 fail("expected AbstractMethodError"); 146 } catch (AbstractMethodError iae) { 147 // expected 148 } 149 } 150 151 /** 152 * @title Attempt to invoke non-existing method 153 */ 154 public void testE5() { 155 try { 156 T_invokevirtual_15 t = new T_invokevirtual_15(); 157 t.run(); 158 fail("expected NoSuchMethodError"); 159 } catch (NoSuchMethodError iae) { 160 // expected 161 } catch (VerifyError vfe) { 162 // ok for dalvikvm; 163 System.out.print("dvmvfe:"); 164 } 165 } 166 167 /** 168 * @title Attempt to invoke private method of other class 169 */ 170 public void testE6() { 171 // @uses dxc.junit.opcodes.invokevirtual.jm.TSuper 172 // @uses dxc.junit.opcodes.invokevirtual.TProtected 173 try { 174 T_invokevirtual_18 t = new T_invokevirtual_18(); 175 t.run(new TProtected()); 176 fail("expected IllegalAccessError"); 177 } catch (IllegalAccessError iae) { 178 // expected 179 } catch (VerifyError vfe) { 180 // ok for dalvikvm; 181 System.out.print("dvmvfe:"); 182 } 183 } 184 185 /** 186 * @title Attempt to invoke protected method of other class 187 */ 188 public void testE7() { 189 // @uses dxc.junit.opcodes.invokevirtual.jm.TSuper 190 // @uses dxc.junit.opcodes.invokevirtual.TProtected 191 try { 192 T_invokevirtual_20 t = new T_invokevirtual_20(); 193 t.run(new TProtected()); 194 fail("expected IllegalAccessError"); 195 } catch (IllegalAccessError iae) { 196 // expected 197 } catch (VerifyError vfe) { 198 // ok for dalvikvm; 199 System.out.print("dvmvfe:"); 200 } 201 } 202 203 /** 204 * @title method has different signature 205 */ 206 public void testE8() { 207 // @uses dxc.junit.opcodes.invokevirtual.jm.TSuper 208 try { 209 T_invokevirtual_19 t = new T_invokevirtual_19(); 210 t.run(); 211 fail("expected NoSuchMethodError"); 212 } catch (NoSuchMethodError iae) { 213 // expected 214 } catch (VerifyError vfe) { 215 // ok for dalvikvm; 216 System.out.print("dvmvfe:"); 217 } 218 } 219 220 /** 221 * @constraint 4.8.1.13 222 * @title valid index into constant pool table 223 */ 224 public void testVFE1() { 225 try { 226 Class 227 .forName("dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_8"); 228 fail("expected a verification exception"); 229 } catch (Throwable t) { 230 DxUtil.checkVerifyException(t); 231 } 232 } 233 234 /** 235 * @constraint 4.8.1.13 236 * @title invalid index into constant pool table 237 */ 238 public void testVFE2() { 239 try { 240 Class 241 .forName("dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_9"); 242 fail("expected a verification exception"); 243 } catch (Throwable t) { 244 DxUtil.checkVerifyException(t); 245 } 246 } 247 248 /** 249 * @constraint 4.8.1.14 250 * @title <clinit> may not be called using invokevirtual 251 */ 252 public void testVFE3() { 253 try { 254 Class 255 .forName("dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_10"); 256 fail("expected a verification exception"); 257 } catch (Throwable t) { 258 DxUtil.checkVerifyException(t); 259 } 260 } 261 262 /** 263 * @constraint 4.8.2.1 264 * @title number of arguments passed to method 265 */ 266 public void testVFE4() { 267 try { 268 Class 269 .forName("dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_11"); 270 fail("expected a verification exception"); 271 } catch (Throwable t) { 272 DxUtil.checkVerifyException(t); 273 } 274 } 275 276 /** 277 * @constraint 4.8.2.1 278 * @title type of argument - int 279 */ 280 public void testVFE5() { 281 try { 282 Class 283 .forName("dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_12"); 284 fail("expected a verification exception"); 285 } catch (Throwable t) { 286 DxUtil.checkVerifyException(t); 287 } 288 } 289 290 /** 291 * @constraint 4.8.1.14 292 * @title <init> may not be called using invokevirtual 293 */ 294 public void testVFE6() { 295 try { 296 Class 297 .forName("dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_16"); 298 fail("expected a verification exception"); 299 } catch (Throwable t) { 300 DxUtil.checkVerifyException(t); 301 } 302 } 303 304 /** 305 * @constraint 4.8.2.12 306 * @title types of arguments passed to method 307 */ 308 public void testVFE7() { 309 // @uses dxc.junit.opcodes.invokevirtual.jm.TSuper 310 try { 311 Class 312 .forName("dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_21"); 313 fail("expected a verification exception"); 314 } catch (Throwable t) { 315 DxUtil.checkVerifyException(t); 316 } 317 } 318 319 /** 320 * @constraint 4.8.2.13 321 * @title assignment incompatible references when accessing 322 * protected method 323 */ 324 public void testVFE8() { 325 // @uses dxc.junit.opcodes.invokevirtual.jm.TSuper 326 // @uses dxc.junit.opcodes.invokevirtual.jm.TPlain 327 try { 328 Class 329 .forName("dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_22"); 330 fail("expected a verification exception"); 331 } catch (Throwable t) { 332 DxUtil.checkVerifyException(t); 333 } 334 } 335 336 /** 337 * @constraint 4.8.2.13 338 * @title assignment incompatible references when accessing 339 * public method 340 */ 341 public void testVFE9() { 342 // @uses dxc.junit.opcodes.invokevirtual.jm.TSuper 343 // @uses dxc.junit.opcodes.invokevirtual.jm.TSuper2 344 try { 345 Class 346 .forName("dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_23"); 347 fail("expected a verification exception"); 348 } catch (Throwable t) { 349 DxUtil.checkVerifyException(t); 350 } 351 } 352 } 353