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.Method;
     18 import java.lang.System;
     19 
     20 // This is named Main as it is a copy of JniTest, so that we can re-use the native implementations
     21 // from libarttest.
     22 class Main {
     23     public static void main(String[] args) {
     24         testFindClassOnAttachedNativeThread();
     25         testFindFieldOnAttachedNativeThread();
     26         testCallStaticVoidMethodOnSubClass();
     27         testGetMirandaMethod();
     28         testZeroLengthByteBuffers();
     29         testByteMethod();
     30         testShortMethod();
     31         testBooleanMethod();
     32         testCharMethod();
     33         testEnvironment();
     34         testNewStringObject();
     35         testSignalHandler();
     36     }
     37 
     38     public static native void testFindClassOnAttachedNativeThread();
     39 
     40     public static boolean testFindFieldOnAttachedNativeThreadField;
     41 
     42     public static void testFindFieldOnAttachedNativeThread() {
     43       testFindFieldOnAttachedNativeThreadNative();
     44       if (!testFindFieldOnAttachedNativeThreadField) {
     45             throw new AssertionError();
     46         }
     47     }
     48 
     49     private static native void testFindFieldOnAttachedNativeThreadNative();
     50 
     51     private static void testCallStaticVoidMethodOnSubClass() {
     52         testCallStaticVoidMethodOnSubClassNative();
     53         if (!testCallStaticVoidMethodOnSubClass_SuperClass.executed) {
     54             throw new AssertionError();
     55         }
     56     }
     57 
     58     private static native void testCallStaticVoidMethodOnSubClassNative();
     59 
     60     private static class testCallStaticVoidMethodOnSubClass_SuperClass {
     61         private static boolean executed = false;
     62         private static void execute() {
     63             executed = true;
     64         }
     65     }
     66 
     67     private static class testCallStaticVoidMethodOnSubClass_SubClass
     68         extends testCallStaticVoidMethodOnSubClass_SuperClass {
     69     }
     70 
     71     private static native Method testGetMirandaMethodNative();
     72 
     73     private static void testGetMirandaMethod() {
     74         Method m = testGetMirandaMethodNative();
     75         if (m.getDeclaringClass() != testGetMirandaMethod_MirandaInterface.class) {
     76             throw new AssertionError();
     77         }
     78     }
     79 
     80     private static native void testZeroLengthByteBuffers();
     81 
     82     private static abstract class testGetMirandaMethod_MirandaAbstract implements testGetMirandaMethod_MirandaInterface {
     83         public boolean inAbstract() {
     84             return true;
     85         }
     86     }
     87 
     88     private static interface testGetMirandaMethod_MirandaInterface {
     89         public boolean inInterface();
     90     }
     91 
     92     // Test sign-extension for values < 32b
     93 
     94     native static byte byteMethod(byte b1, byte b2, byte b3, byte b4, byte b5, byte b6, byte b7,
     95         byte b8, byte b9, byte b10);
     96 
     97     public static void testByteMethod() {
     98       byte returns[] = { 0, 1, 2, 127, -1, -2, -128 };
     99       for (int i = 0; i < returns.length; i++) {
    100         byte result = byteMethod((byte)i, (byte)2, (byte)(-3), (byte)4, (byte)(-5), (byte)6,
    101             (byte)(-7), (byte)8, (byte)(-9), (byte)10);
    102         if (returns[i] != result) {
    103           System.out.println("Run " + i + " with " + returns[i] + " vs " + result);
    104           throw new AssertionError();
    105         }
    106       }
    107     }
    108 
    109     native static short shortMethod(short s1, short s2, short s3, short s4, short s5, short s6, short s7,
    110         short s8, short s9, short s10);
    111 
    112     private static void testShortMethod() {
    113       short returns[] = { 0, 1, 2, 127, 32767, -1, -2, -128, -32768 };
    114       for (int i = 0; i < returns.length; i++) {
    115         short result = shortMethod((short)i, (short)2, (short)(-3), (short)4, (short)(-5), (short)6,
    116             (short)(-7), (short)8, (short)(-9), (short)10);
    117         if (returns[i] != result) {
    118           System.out.println("Run " + i + " with " + returns[i] + " vs " + result);
    119           throw new AssertionError();
    120         }
    121       }
    122     }
    123 
    124     // Test zero-extension for values < 32b
    125 
    126     native static boolean booleanMethod(boolean b1, boolean b2, boolean b3, boolean b4, boolean b5, boolean b6, boolean b7,
    127         boolean b8, boolean b9, boolean b10);
    128 
    129     public static void testBooleanMethod() {
    130       if (booleanMethod(false, true, false, true, false, true, false, true, false, true)) {
    131         throw new AssertionError();
    132       }
    133 
    134       if (!booleanMethod(true, true, false, true, false, true, false, true, false, true)) {
    135         throw new AssertionError();
    136       }
    137     }
    138 
    139     native static char charMethod(char c1, char c2, char c3, char c4, char c5, char c6, char c7,
    140         char c8, char c9, char c10);
    141 
    142     private static void testCharMethod() {
    143       char returns[] = { (char)0, (char)1, (char)2, (char)127, (char)255, (char)256, (char)15000,
    144           (char)34000 };
    145       for (int i = 0; i < returns.length; i++) {
    146         char result = charMethod((char)i, 'a', 'b', 'c', '0', '1', '2', (char)1234, (char)2345,
    147             (char)3456);
    148         if (returns[i] != result) {
    149           System.out.println("Run " + i + " with " + (int)returns[i] + " vs " + (int)result);
    150           throw new AssertionError();
    151         }
    152       }
    153     }
    154 
    155     private static void testEnvironment() {
    156       String osArch = System.getProperty("os.arch");
    157       if (!"os.arch".equals(osArch)) {
    158         throw new AssertionError("unexpected value for os.arch: " + osArch);
    159       }
    160       // TODO: improve the build script to get these running as well.
    161       // if (!"cpu_abi".equals(Build.CPU_ABI)) {
    162       //   throw new AssertionError("unexpected value for cpu_abi");
    163       // }
    164       // if (!"cpu_abi2".equals(Build.CPU_ABI2)) {
    165       //   throw new AssertionError("unexpected value for cpu_abi2");
    166       // }
    167       // String[] expectedSupportedAbis = {"supported1", "supported2", "supported3"};
    168       // if (Arrays.equals(expectedSupportedAbis, Build.SUPPORTED_ABIS)) {
    169       //   throw new AssertionError("unexpected value for supported_abis");
    170       // }
    171     }
    172 
    173     private static native void testNewStringObject();
    174 
    175     // Test v2 special signal handlers. This uses the native code from 004-SignalTest to cause
    176     // a non-managed segfault.
    177     private static void testSignalHandler() {
    178         // This uses code from 004-SignalTest.
    179         int x = testSignal();
    180         if (x != 1234) {
    181             throw new AssertionError();
    182         }
    183     }
    184 
    185     private static native int testSignal();
    186 }
    187 
    188 public class NativeBridgeMain {
    189     static public void main(String[] args) throws Exception {
    190         System.out.println("Ready for native bridge tests.");
    191 
    192         System.loadLibrary("arttest");
    193 
    194         Main.main(null);
    195     }
    196 }
    197