1ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom/*
2ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * Copyright (C) 2013 The Android Open Source Project
3ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom *
4ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * Licensed under the Apache License, Version 2.0 (the "License");
5ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * you may not use this file except in compliance with the License.
6ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * You may obtain a copy of the License at
7ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom *
8ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom *      http://www.apache.org/licenses/LICENSE-2.0
9ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom *
10ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * Unless required by applicable law or agreed to in writing, software
11ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * distributed under the License is distributed on an "AS IS" BASIS,
12ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * See the License for the specific language governing permissions and
14ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * limitations under the License.
15ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom */
16ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom
17201803fb1acd15b9daae51d816e1b08aededdc41Jeff Haoimport java.lang.reflect.Method;
18201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao
191c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampepublic class Main {
20ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom    public static void main(String[] args) {
21ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom        System.loadLibrary("arttest");
22ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom        testFindClassOnAttachedNativeThread();
2362509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao        testFindFieldOnAttachedNativeThread();
243bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko        testReflectFieldGetFromAttachedNativeThreadNative();
2567fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom        testCallStaticVoidMethodOnSubClass();
26201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao        testGetMirandaMethod();
27ef809d09cf0d28d999ac69969e4506d8afa4624dNarayan Kamath        testZeroLengthByteBuffers();
28d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe        testByteMethod();
29d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe        testShortMethod();
30d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe        testBooleanMethod();
31d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe        testCharMethod();
321268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath        testIsAssignableFromOnPrimitiveTypes();
3361bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe        testShallowGetCallingClassLoader();
34ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe        testShallowGetStackClass2();
35ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom    }
36ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom
37ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom    private static native void testFindClassOnAttachedNativeThread();
3867fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom
3962509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao    private static boolean testFindFieldOnAttachedNativeThreadField;
4062509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao
413bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko    private static native void testReflectFieldGetFromAttachedNativeThreadNative();
423bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko
433bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko    public static boolean testReflectFieldGetFromAttachedNativeThreadField;
443bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko
4562509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao    private static void testFindFieldOnAttachedNativeThread() {
4662509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao      testFindFieldOnAttachedNativeThreadNative();
4762509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao      if (!testFindFieldOnAttachedNativeThreadField) {
4862509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao            throw new AssertionError();
4962509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao        }
5062509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao    }
5162509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao
5262509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao    private static native void testFindFieldOnAttachedNativeThreadNative();
5362509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao
5467fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom    private static void testCallStaticVoidMethodOnSubClass() {
5567fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom        testCallStaticVoidMethodOnSubClassNative();
5667fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom        if (!testCallStaticVoidMethodOnSubClass_SuperClass.executed) {
5767fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom            throw new AssertionError();
5867fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom        }
5967fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom    }
6067fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom
6167fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom    private static native void testCallStaticVoidMethodOnSubClassNative();
6267fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom
6367fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom    private static class testCallStaticVoidMethodOnSubClass_SuperClass {
6467fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom        private static boolean executed = false;
6567fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom        private static void execute() {
6667fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom            executed = true;
6767fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom        }
6867fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom    }
6967fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom
7067fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom    private static class testCallStaticVoidMethodOnSubClass_SubClass
7167fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom        extends testCallStaticVoidMethodOnSubClass_SuperClass {
7267fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom    }
73201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao
74201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao    private static native Method testGetMirandaMethodNative();
75201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao
76201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao    private static void testGetMirandaMethod() {
77201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao        Method m = testGetMirandaMethodNative();
78201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao        if (m.getDeclaringClass() != testGetMirandaMethod_MirandaInterface.class) {
79201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao            throw new AssertionError();
80201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao        }
81201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao    }
82201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao
83ef809d09cf0d28d999ac69969e4506d8afa4624dNarayan Kamath    private static native void testZeroLengthByteBuffers();
84ef809d09cf0d28d999ac69969e4506d8afa4624dNarayan Kamath
85201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao    private static abstract class testGetMirandaMethod_MirandaAbstract implements testGetMirandaMethod_MirandaInterface {
86201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao        public boolean inAbstract() {
87201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao            return true;
88201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao        }
89201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao    }
90201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao
91201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao    private static interface testGetMirandaMethod_MirandaInterface {
92201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao        public boolean inInterface();
93201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao    }
94d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe
95d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe    // Test sign-extension for values < 32b
96d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe
97d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe    native static byte byteMethod(byte b1, byte b2, byte b3, byte b4, byte b5, byte b6, byte b7,
98d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe        byte b8, byte b9, byte b10);
99d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe
100d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe    private static void testByteMethod() {
101d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe      byte returns[] = { 0, 1, 2, 127, -1, -2, -128 };
102d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe      for (int i = 0; i < returns.length; i++) {
103d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe        byte result = byteMethod((byte)i, (byte)2, (byte)(-3), (byte)4, (byte)(-5), (byte)6,
104d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe            (byte)(-7), (byte)8, (byte)(-9), (byte)10);
105d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe        if (returns[i] != result) {
106d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe          System.out.println("Run " + i + " with " + returns[i] + " vs " + result);
107d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe          throw new AssertionError();
108d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe        }
109d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe      }
110d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe    }
111d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe
112d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe    native static short shortMethod(short s1, short s2, short s3, short s4, short s5, short s6, short s7,
113d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe        short s8, short s9, short s10);
114d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe
115d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe    private static void testShortMethod() {
116d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe      short returns[] = { 0, 1, 2, 127, 32767, -1, -2, -128, -32768 };
117d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe      for (int i = 0; i < returns.length; i++) {
118d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe        short result = shortMethod((short)i, (short)2, (short)(-3), (short)4, (short)(-5), (short)6,
119d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe            (short)(-7), (short)8, (short)(-9), (short)10);
120d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe        if (returns[i] != result) {
121d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe          System.out.println("Run " + i + " with " + returns[i] + " vs " + result);
122d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe          throw new AssertionError();
123d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe        }
124d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe      }
125d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe    }
126d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe
127d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe    // Test zero-extension for values < 32b
128d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe
129d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe    native static boolean booleanMethod(boolean b1, boolean b2, boolean b3, boolean b4, boolean b5, boolean b6, boolean b7,
130d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe        boolean b8, boolean b9, boolean b10);
131d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe
132d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe    private static void testBooleanMethod() {
133d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe      if (booleanMethod(false, true, false, true, false, true, false, true, false, true)) {
134d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe        throw new AssertionError();
135d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe      }
136d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe
137d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe      if (!booleanMethod(true, true, false, true, false, true, false, true, false, true)) {
138d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe        throw new AssertionError();
139d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe      }
140d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe    }
141d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe
142d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe    native static char charMethod(char c1, char c2, char c3, char c4, char c5, char c6, char c7,
143d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe        char c8, char c9, char c10);
144d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe
145d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe    private static void testCharMethod() {
146d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe      char returns[] = { (char)0, (char)1, (char)2, (char)127, (char)255, (char)256, (char)15000,
147d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe          (char)34000 };
148d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe      for (int i = 0; i < returns.length; i++) {
149d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe        char result = charMethod((char)i, 'a', 'b', 'c', '0', '1', '2', (char)1234, (char)2345,
150d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe            (char)3456);
151d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe        if (returns[i] != result) {
152d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe          System.out.println("Run " + i + " with " + (int)returns[i] + " vs " + (int)result);
153d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe          throw new AssertionError();
154d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe        }
155d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe      }
156d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe    }
1571268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath
1581268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath    // http://b/16531674
1591268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath    private static void testIsAssignableFromOnPrimitiveTypes() {
1601268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath      if (!nativeIsAssignableFrom(int.class, Integer.TYPE)) {
1611268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath        System.out.println("IsAssignableFrom(int.class, Integer.TYPE) returned false, expected true");
1621268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath        throw new AssertionError();
1631268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath      }
1641268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath
1651268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath      if (!nativeIsAssignableFrom(Integer.TYPE, int.class)) {
1661268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath        System.out.println("IsAssignableFrom(Integer.TYPE, int.class) returned false, expected true");
1671268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath        throw new AssertionError();
1681268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath      }
1691268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath    }
1701268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath
1711268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath    native static boolean nativeIsAssignableFrom(Class<?> from, Class<?> to);
17261bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe
17361bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe    static void testShallowGetCallingClassLoader() {
17461bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe        nativeTestShallowGetCallingClassLoader();
17561bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe    }
17661bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe
17761bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe    native static void nativeTestShallowGetCallingClassLoader();
178ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe
179ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe    static void testShallowGetStackClass2() {
180ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe        nativeTestShallowGetStackClass2();
181ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe    }
182ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe
183ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe    native static void nativeTestShallowGetStackClass2();
184ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom}
185