Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2014 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 import java.lang.reflect.InvocationTargetException;
     18 import java.lang.reflect.Method;
     19 
     20 // Note that $opt$ is a marker for the optimizing compiler to test
     21 // it does compile the method.
     22 
     23 public class Main extends TestCase {
     24   public static void main(String[] args) throws Exception {
     25     $opt$TestAllocations();
     26     $opt$TestWithInitializations();
     27     $opt$TestNegativeValueNewByteArray();
     28     $opt$TestNegativeValueNewCharArray();
     29     testNegativeArraySize();
     30     testSmaliFilledNewArray();
     31     testSmaliFillArrayData();
     32     testSmaliVerifyError();
     33   }
     34 
     35   static void $opt$TestAllocations() {
     36     float[] a = new float[1];
     37     assertEquals(1, a.length);
     38 
     39     double[] b = new double[2];
     40     assertEquals(2, b.length);
     41 
     42     long[] c = new long[3];
     43     assertEquals(3, c.length);
     44 
     45     int[] d = new int[4];
     46     assertEquals(4, d.length);
     47 
     48     short[] e = new short[5];
     49     assertEquals(5, e.length);
     50 
     51     char[] f = new char[6];
     52     assertEquals(6, f.length);
     53 
     54     byte[] g = new byte[7];
     55     assertEquals(7, g.length);
     56 
     57     boolean[] h = new boolean[8];
     58     assertEquals(8, h.length);
     59 
     60     Object[] i = new Object[9];
     61     assertEquals(9, i.length);
     62   }
     63 
     64   static void $opt$TestWithInitializations() {
     65     float[] a = { 1.2f };
     66     assertEquals(1, a.length);
     67     assertEquals(1.2f, a[0]);
     68 
     69     double[] b = { 4.3, 1.2 };
     70     assertEquals(2, b.length);
     71     assertEquals(4.3, b[0]);
     72     assertEquals(1.2, b[1]);
     73 
     74     long[] c = { 4L, 5L };
     75     assertEquals(2, c.length);
     76     assertEquals(4L, c[0]);
     77     assertEquals(5L, c[1]);
     78 
     79     int[] d = {1, 2, 3};
     80     assertEquals(3, d.length);
     81     assertEquals(1, d[0]);
     82     assertEquals(2, d[1]);
     83     assertEquals(3, d[2]);
     84 
     85     short[] e = {4, 5, 6};
     86     assertEquals(3, e.length);
     87     assertEquals(4, e[0]);
     88     assertEquals(5, e[1]);
     89     assertEquals(6, e[2]);
     90 
     91     char[] f = {'a', 'b'};
     92     assertEquals(2, f.length);
     93     assertEquals('a', f[0]);
     94     assertEquals('b', f[1]);
     95 
     96     byte[] g = {7, 8, 9};
     97     assertEquals(3, g.length);
     98     assertEquals(7, g[0]);
     99     assertEquals(8, g[1]);
    100     assertEquals(9, g[2]);
    101 
    102     boolean[] h = {true, false};
    103     assertEquals(2, h.length);
    104     assertEquals(true, h[0]);
    105     assertEquals(false, h[1]);
    106 
    107     Object obj1 = new Object();
    108     Object obj2 = new Object();
    109     Object[] i = {obj1, obj2};
    110     assertEquals(2, i.length);
    111     assertEquals(obj1, i[0]);
    112     assertEquals(obj2, i[1]);
    113   }
    114 
    115   static void $opt$TestNegativeValueNewByteArray() {
    116     // Use an array initializer to hint the use of filled-new-array.
    117     byte[] a = { (byte)0xa0, (byte)0xa1, (byte)0xa2, (byte)0xa3,
    118                  (byte)0xa4, (byte)0xa5, (byte)0xa6, (byte)0xa7 };
    119     for (int i = 0; i < a.length; i++) {
    120       assertEquals((byte)0xa0 + i, a[i]);
    121     }
    122   }
    123 
    124   static void $opt$TestNegativeValueNewCharArray() {
    125     // Use an array initializer to hint the use of filled-new-array.
    126     char[] a = { (char)0xa000, (char)0xa001, (char)0xa002, (char)0xa003,
    127                  (char)0xa004, (char)0xa005, (char)0xa006, (char)0xa007 };
    128     for (int i = 0; i < a.length; i++) {
    129       assertEquals((char)0xa000 + i, a[i]);
    130     }
    131   }
    132 
    133   static void testNegativeArraySize() {
    134     int i = 0;
    135     try {
    136       $opt$TestNegativeArraySize();
    137     } catch (NegativeArraySizeException e) {
    138       i = 1;
    139     }
    140     assertEquals(i, 1);
    141   }
    142 
    143   static int[] $opt$TestNegativeArraySize() {
    144     int[] array = new int[-1];
    145     return null;
    146   }
    147 
    148   public static void testSmaliFilledNewArray() throws Exception {
    149     Class<?> c = Class.forName("FilledNewArray");
    150 
    151     {
    152       Method m = c.getMethod("newInt", Integer.TYPE, Integer.TYPE, Integer.TYPE);
    153       Object[] args = {new Integer(1), new Integer(2), new Integer(3)};
    154       int[] result = (int[])m.invoke(null, args);
    155       assertEquals(3, result.length);
    156       assertEquals(1, result[0]);
    157       assertEquals(2, result[1]);
    158       assertEquals(3, result[2]);
    159     }
    160 
    161     {
    162       Method m = c.getMethod("newRef", Object.class, Object.class);
    163       Object[] args = {new Integer(1), new Integer(2)};
    164       Object[] result = (Object[])m.invoke(null, args);
    165       assertEquals(2, result.length);
    166       assertEquals(args[0], result[0]);
    167       assertEquals(args[1], result[1]);
    168     }
    169 
    170     {
    171       Method m = c.getMethod("newArray", int[].class, int[].class);
    172       Object[] args = {new int[0], new int[1]};
    173       Object[] result = (Object[])m.invoke(null, args);
    174       assertEquals(2, result.length);
    175       assertEquals(args[0], result[0]);
    176       assertEquals(args[1], result[1]);
    177     }
    178 
    179     {
    180       Method m = c.getMethod("newIntRange", Integer.TYPE, Integer.TYPE, Integer.TYPE);
    181       Object[] args = {new Integer(1), new Integer(2), new Integer(3)};
    182       int[] result = (int[])m.invoke(null, args);
    183       assertEquals(3, result.length);
    184       assertEquals(1, result[0]);
    185       assertEquals(2, result[1]);
    186       assertEquals(3, result[2]);
    187     }
    188 
    189     {
    190       Method m = c.getMethod("newRefRange", Object.class, Object.class);
    191       Object[] args = {new Integer(1), new Integer(2)};
    192       Object[] result = (Object[])m.invoke(null, args);
    193       assertEquals(2, result.length);
    194       assertEquals(args[0], result[0]);
    195       assertEquals(args[1], result[1]);
    196     }
    197 
    198     {
    199       Method m = c.getMethod("newArrayRange", int[].class, int[].class);
    200       Object[] args = {new int[0], new int[1]};
    201       Object[] result = (Object[])m.invoke(null, args);
    202       assertEquals(2, result.length);
    203       assertEquals(args[0], result[0]);
    204       assertEquals(args[1], result[1]);
    205     }
    206   }
    207 
    208   public static void testSmaliVerifyError() throws Exception {
    209     Error error = null;
    210     // Ensure the elements in filled-new-array must be assignable
    211     // to the array component type.
    212     try {
    213       Class.forName("FilledNewArrayVerifyError");
    214     } catch (VerifyError e) {
    215       error = e;
    216     }
    217     assertNotNull(error);
    218   }
    219 
    220   public static void testSmaliFillArrayData() throws Exception {
    221     Class<?> c = Class.forName("FillArrayData");
    222     {
    223       Method m = c.getMethod("emptyIntArray", int[].class);
    224       int[] array = new int[0];
    225       Object[] args = { array };
    226       m.invoke(null, args);
    227       assertEquals(0, array.length);
    228 
    229       array = new int[2];
    230       args[0] = array;
    231       m.invoke(null, args);
    232       // Test that nothing has been written to the array.
    233       assertEquals(0, array[0]);
    234       assertEquals(0, array[1]);
    235 
    236       array = new int[] { 42, -42 };
    237       args[0] = array;
    238       m.invoke(null, args);
    239       // Test that nothing has been written to the array.
    240       assertEquals(42, array[0]);
    241       assertEquals(-42, array[1]);
    242 
    243       Throwable exception = null;
    244       args[0] = null;
    245       try {
    246         m.invoke(null, args);
    247       } catch (InvocationTargetException e) {
    248         exception = e.getCause();
    249         assertTrue(exception instanceof NullPointerException);
    250       }
    251       assertNotNull(exception);
    252     }
    253 
    254     {
    255       Method m = c.getMethod("intArray", int[].class);
    256       int[] array = new int[7];
    257       Object[] args = { array };
    258       m.invoke(null, args);
    259       assertEquals(7, array.length);
    260       assertEquals(1, array[0]);
    261       assertEquals(2, array[1]);
    262       assertEquals(3, array[2]);
    263       assertEquals(4, array[3]);
    264       assertEquals(5, array[4]);
    265       assertEquals(0, array[5]);
    266       assertEquals(0, array[6]);
    267 
    268       array = new int[2];
    269       args[0] = array;
    270       Throwable exception = null;
    271       try {
    272         m.invoke(null, args);
    273       } catch (InvocationTargetException e) {
    274         exception = e.getCause();
    275         assertTrue(exception instanceof IndexOutOfBoundsException);
    276       }
    277       assertNotNull(exception);
    278       exception = null;
    279       // Test that nothing has been written to the array.
    280       assertEquals(0, array[0]);
    281       assertEquals(0, array[1]);
    282 
    283       args[0] = null;
    284       try {
    285         m.invoke(null, args);
    286       } catch (InvocationTargetException e) {
    287         exception = e.getCause();
    288         assertTrue(exception instanceof NullPointerException);
    289       }
    290       assertNotNull(exception);
    291     }
    292 
    293     {
    294       Method m = c.getMethod("intArrayFillInstructionAfterData", int[].class);
    295       int[] array = new int[7];
    296       Object[] args = { array };
    297       m.invoke(null, args);
    298       assertEquals(7, array.length);
    299       assertEquals(1, array[0]);
    300       assertEquals(2, array[1]);
    301       assertEquals(3, array[2]);
    302       assertEquals(4, array[3]);
    303       assertEquals(5, array[4]);
    304       assertEquals(0, array[5]);
    305       assertEquals(0, array[6]);
    306 
    307       array = new int[2];
    308       args[0] = array;
    309       Throwable exception = null;
    310       try {
    311         m.invoke(null, args);
    312       } catch (InvocationTargetException e) {
    313         exception = e.getCause();
    314         assertTrue(exception instanceof IndexOutOfBoundsException);
    315       }
    316       assertNotNull(exception);
    317       exception = null;
    318       // Test that nothing has been written to the array.
    319       assertEquals(0, array[0]);
    320       assertEquals(0, array[1]);
    321 
    322       args[0] = null;
    323       try {
    324         m.invoke(null, args);
    325       } catch (InvocationTargetException e) {
    326         exception = e.getCause();
    327         assertTrue(exception instanceof NullPointerException);
    328       }
    329       assertNotNull(exception);
    330     }
    331 
    332     {
    333       Method m = c.getMethod("shortArray", short[].class);
    334       short[] array = new short[7];
    335       Object[] args = { array };
    336       m.invoke(null, args);
    337       assertEquals(7, array.length);
    338       assertEquals(1, array[0]);
    339       assertEquals(2, array[1]);
    340       assertEquals(3, array[2]);
    341       assertEquals(4, array[3]);
    342       assertEquals(5, array[4]);
    343       assertEquals(0, array[5]);
    344       assertEquals(0, array[6]);
    345 
    346       array = new short[2];
    347       args[0] = array;
    348       Throwable exception = null;
    349       try {
    350         m.invoke(null, args);
    351       } catch (InvocationTargetException e) {
    352         exception = e.getCause();
    353         assertTrue(exception instanceof IndexOutOfBoundsException);
    354       }
    355       assertNotNull(exception);
    356       exception = null;
    357       // Test that nothing has been written to the array.
    358       assertEquals(0, array[0]);
    359       assertEquals(0, array[1]);
    360 
    361       args[0] = null;
    362       try {
    363         m.invoke(null, args);
    364       } catch (InvocationTargetException e) {
    365         exception = e.getCause();
    366         assertTrue(exception instanceof NullPointerException);
    367       }
    368       assertNotNull(exception);
    369     }
    370 
    371     {
    372       Method m = c.getMethod("longArray", long[].class);
    373       long[] array = new long[7];
    374       Object[] args = { array };
    375       m.invoke(null, args);
    376       assertEquals(7, array.length);
    377       assertEquals(1L, array[0]);
    378       assertEquals(2L, array[1]);
    379       assertEquals(3L, array[2]);
    380       assertEquals(4L, array[3]);
    381       assertEquals(5L, array[4]);
    382       assertEquals(0L, array[5]);
    383       assertEquals(0L, array[6]);
    384 
    385       array = new long[2];
    386       args[0] = array;
    387       Throwable exception = null;
    388       try {
    389         m.invoke(null, args);
    390       } catch (InvocationTargetException e) {
    391         exception = e.getCause();
    392         assertTrue(exception instanceof IndexOutOfBoundsException);
    393       }
    394       assertNotNull(exception);
    395       exception = null;
    396       // Test that nothing has been written to the array.
    397       assertEquals(0, array[0]);
    398       assertEquals(0, array[1]);
    399 
    400       args[0] = null;
    401       try {
    402         m.invoke(null, args);
    403       } catch (InvocationTargetException e) {
    404         exception = e.getCause();
    405         assertTrue(exception instanceof NullPointerException);
    406       }
    407       assertNotNull(exception);
    408     }
    409 
    410     {
    411       Method m = c.getMethod("charArray", char[].class);
    412       char[] array = new char[7];
    413       Object[] args = { array };
    414       m.invoke(null, args);
    415       assertEquals(7, array.length);
    416       assertEquals(1, array[0]);
    417       assertEquals(2, array[1]);
    418       assertEquals(3, array[2]);
    419       assertEquals(4, array[3]);
    420       assertEquals(5, array[4]);
    421       assertEquals(0, array[5]);
    422       assertEquals(0, array[6]);
    423 
    424       array = new char[2];
    425       args[0] = array;
    426       Throwable exception = null;
    427       try {
    428         m.invoke(null, args);
    429       } catch (InvocationTargetException e) {
    430         exception = e.getCause();
    431         assertTrue(exception instanceof IndexOutOfBoundsException);
    432       }
    433       assertNotNull(exception);
    434       exception = null;
    435       // Test that nothing has been written to the array.
    436       assertEquals(0, array[0]);
    437       assertEquals(0, array[1]);
    438 
    439       args[0] = null;
    440       try {
    441         m.invoke(null, args);
    442       } catch (InvocationTargetException e) {
    443         exception = e.getCause();
    444         assertTrue(exception instanceof NullPointerException);
    445       }
    446       assertNotNull(exception);
    447     }
    448 
    449     {
    450       Method m = c.getMethod("byteArray", byte[].class);
    451       byte[] array = new byte[7];
    452       Object[] args = { array };
    453       m.invoke(null, args);
    454       assertEquals(7, array.length);
    455       assertEquals(1, array[0]);
    456       assertEquals(2, array[1]);
    457       assertEquals(3, array[2]);
    458       assertEquals(4, array[3]);
    459       assertEquals(5, array[4]);
    460       assertEquals(0, array[5]);
    461       assertEquals(0, array[6]);
    462 
    463       array = new byte[2];
    464       args[0] = array;
    465       Throwable exception = null;
    466       try {
    467         m.invoke(null, args);
    468       } catch (InvocationTargetException e) {
    469         exception = e.getCause();
    470         assertTrue(exception instanceof IndexOutOfBoundsException);
    471       }
    472       assertNotNull(exception);
    473       exception = null;
    474       // Test that nothing has been written to the array.
    475       assertEquals(0, array[0]);
    476       assertEquals(0, array[1]);
    477 
    478       args[0] = null;
    479       try {
    480         m.invoke(null, args);
    481       } catch (InvocationTargetException e) {
    482         exception = e.getCause();
    483         assertTrue(exception instanceof NullPointerException);
    484       }
    485       assertNotNull(exception);
    486     }
    487 
    488     {
    489       Method m = c.getMethod("booleanArray", boolean[].class);
    490       boolean[] array = new boolean[5];
    491       Object[] args = { array };
    492       m.invoke(null, args);
    493       assertEquals(5, array.length);
    494       assertEquals(false, array[0]);
    495       assertEquals(true, array[1]);
    496       assertEquals(true, array[2]);
    497       assertEquals(false, array[3]);
    498       assertEquals(false, array[4]);
    499 
    500       array = new boolean[2];
    501       args[0] = array;
    502       Throwable exception = null;
    503       try {
    504         m.invoke(null, args);
    505       } catch (InvocationTargetException e) {
    506         exception = e.getCause();
    507         assertTrue(exception instanceof IndexOutOfBoundsException);
    508       }
    509       assertNotNull(exception);
    510       exception = null;
    511       // Test that nothing has been written to the array.
    512       assertEquals(false, array[0]);
    513       assertEquals(false, array[1]);
    514 
    515       args[0] = null;
    516       try {
    517         m.invoke(null, args);
    518       } catch (InvocationTargetException e) {
    519         exception = e.getCause();
    520         assertTrue(exception instanceof NullPointerException);
    521       }
    522       assertNotNull(exception);
    523     }
    524   }
    525 }
    526