xref: /aosp_15_r20/external/fbjni/test/FBJniTests.java (revision 65c59e023c5336bbd4a23be7af78407e3d80e7e7)
1*65c59e02SInna Palant /*
2*65c59e02SInna Palant  * Copyright (c) Facebook, Inc. and its affiliates.
3*65c59e02SInna Palant  *
4*65c59e02SInna Palant  * Licensed under the Apache License, Version 2.0 (the "License");
5*65c59e02SInna Palant  * you may not use this file except in compliance with the License.
6*65c59e02SInna Palant  * You may obtain a copy of the License at
7*65c59e02SInna Palant  *
8*65c59e02SInna Palant  *     http://www.apache.org/licenses/LICENSE-2.0
9*65c59e02SInna Palant  *
10*65c59e02SInna Palant  * Unless required by applicable law or agreed to in writing, software
11*65c59e02SInna Palant  * distributed under the License is distributed on an "AS IS" BASIS,
12*65c59e02SInna Palant  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*65c59e02SInna Palant  * See the License for the specific language governing permissions and
14*65c59e02SInna Palant  * limitations under the License.
15*65c59e02SInna Palant  */
16*65c59e02SInna Palant 
17*65c59e02SInna Palant package com.facebook.jni;
18*65c59e02SInna Palant 
19*65c59e02SInna Palant import static org.assertj.core.api.Assertions.assertThat;
20*65c59e02SInna Palant import static org.mockito.Mockito.verify;
21*65c59e02SInna Palant 
22*65c59e02SInna Palant import com.facebook.jni.annotations.DoNotStrip;
23*65c59e02SInna Palant import java.io.IOException;
24*65c59e02SInna Palant import java.util.ArrayList;
25*65c59e02SInna Palant import java.util.concurrent.Callable;
26*65c59e02SInna Palant import javax.annotation.Nullable;
27*65c59e02SInna Palant import org.assertj.core.api.Fail;
28*65c59e02SInna Palant import org.junit.Test;
29*65c59e02SInna Palant import org.junit.runner.RunWith;
30*65c59e02SInna Palant import org.mockito.Mock;
31*65c59e02SInna Palant import org.mockito.runners.MockitoJUnitRunner;
32*65c59e02SInna Palant 
33*65c59e02SInna Palant @RunWith(MockitoJUnitRunner.class)
34*65c59e02SInna Palant public class FBJniTests extends BaseFBJniTests {
35*65c59e02SInna Palant   class CustomException extends Throwable {
36*65c59e02SInna Palant     int mGetMessageCalls = 0;
37*65c59e02SInna Palant 
38*65c59e02SInna Palant     @Override
getMessage()39*65c59e02SInna Palant     public String getMessage() {
40*65c59e02SInna Palant       return "getMessages: " + (++mGetMessageCalls);
41*65c59e02SInna Palant     }
42*65c59e02SInna Palant   }
43*65c59e02SInna Palant 
44*65c59e02SInna Palant   public interface Callbacks {
voidFoo()45*65c59e02SInna Palant     void voidFoo();
46*65c59e02SInna Palant 
booleanFoo()47*65c59e02SInna Palant     boolean booleanFoo();
48*65c59e02SInna Palant 
byteFoo()49*65c59e02SInna Palant     byte byteFoo();
50*65c59e02SInna Palant 
charFoo()51*65c59e02SInna Palant     char charFoo();
52*65c59e02SInna Palant 
shortFoo()53*65c59e02SInna Palant     short shortFoo();
54*65c59e02SInna Palant 
intFoo()55*65c59e02SInna Palant     int intFoo();
56*65c59e02SInna Palant 
longFoo()57*65c59e02SInna Palant     long longFoo();
58*65c59e02SInna Palant 
floatFoo()59*65c59e02SInna Palant     float floatFoo();
60*65c59e02SInna Palant 
doubleFoo()61*65c59e02SInna Palant     double doubleFoo();
62*65c59e02SInna Palant 
objectFoo()63*65c59e02SInna Palant     Object objectFoo();
64*65c59e02SInna Palant 
stringFoo()65*65c59e02SInna Palant     String stringFoo();
66*65c59e02SInna Palant   }
67*65c59e02SInna Palant 
68*65c59e02SInna Palant   public static class TestThing {
69*65c59e02SInna Palant     int foo;
70*65c59e02SInna Palant   }
71*65c59e02SInna Palant 
72*65c59e02SInna Palant   @Mock private static Callbacks mCallbacksMock;
73*65c59e02SInna Palant 
74*65c59e02SInna Palant   private int mIntFieldTest;
75*65c59e02SInna Palant   private String mStringFieldTest;
76*65c59e02SInna Palant   private TestThing mReferenceFieldTest;
77*65c59e02SInna Palant   private static int sIntFieldTest;
78*65c59e02SInna Palant   private static String sStringFieldTest;
79*65c59e02SInna Palant   private static TestThing sReferenceFieldTest;
80*65c59e02SInna Palant 
81*65c59e02SInna Palant   @DoNotStrip // Resolved from fbjni_tests::TestFieldAccess
bar(double d)82*65c59e02SInna Palant   int bar(double d) {
83*65c59e02SInna Palant     return 42;
84*65c59e02SInna Palant   }
85*65c59e02SInna Palant 
86*65c59e02SInna Palant   // Test case for nonvirtual function
nonVirtualMethod(boolean s)87*65c59e02SInna Palant   public boolean nonVirtualMethod(boolean s) {
88*65c59e02SInna Palant     return s;
89*65c59e02SInna Palant   }
90*65c59e02SInna Palant 
verifyAllCallbacksCalled(Callbacks mock)91*65c59e02SInna Palant   private static void verifyAllCallbacksCalled(Callbacks mock) {
92*65c59e02SInna Palant     verify(mock).voidFoo();
93*65c59e02SInna Palant     verify(mock).booleanFoo();
94*65c59e02SInna Palant     verify(mock).byteFoo();
95*65c59e02SInna Palant     verify(mock).charFoo();
96*65c59e02SInna Palant     verify(mock).shortFoo();
97*65c59e02SInna Palant     verify(mock).intFoo();
98*65c59e02SInna Palant     verify(mock).longFoo();
99*65c59e02SInna Palant     verify(mock).floatFoo();
100*65c59e02SInna Palant     verify(mock).doubleFoo();
101*65c59e02SInna Palant     verify(mock).objectFoo();
102*65c59e02SInna Palant     verify(mock).stringFoo();
103*65c59e02SInna Palant   }
104*65c59e02SInna Palant 
105*65c59e02SInna Palant   // Instead of mocking, lets call non-static functions and verify them.
voidFooStatic()106*65c59e02SInna Palant   public static void voidFooStatic() {
107*65c59e02SInna Palant     mCallbacksMock.voidFoo();
108*65c59e02SInna Palant   }
109*65c59e02SInna Palant 
booleanFooStatic()110*65c59e02SInna Palant   public static boolean booleanFooStatic() {
111*65c59e02SInna Palant     return mCallbacksMock.booleanFoo();
112*65c59e02SInna Palant   }
113*65c59e02SInna Palant 
byteFooStatic()114*65c59e02SInna Palant   public static byte byteFooStatic() {
115*65c59e02SInna Palant     return mCallbacksMock.byteFoo();
116*65c59e02SInna Palant   }
117*65c59e02SInna Palant 
charFooStatic(char c, int s)118*65c59e02SInna Palant   public static char charFooStatic(char c, int s) {
119*65c59e02SInna Palant     return mCallbacksMock.charFoo();
120*65c59e02SInna Palant   }
121*65c59e02SInna Palant 
shortFooStatic(short s, short t)122*65c59e02SInna Palant   public static short shortFooStatic(short s, short t) {
123*65c59e02SInna Palant     return mCallbacksMock.shortFoo();
124*65c59e02SInna Palant   }
125*65c59e02SInna Palant 
intFooStatic(int s)126*65c59e02SInna Palant   public static int intFooStatic(int s) {
127*65c59e02SInna Palant     return mCallbacksMock.intFoo();
128*65c59e02SInna Palant   }
129*65c59e02SInna Palant 
longFooStatic()130*65c59e02SInna Palant   public static long longFooStatic() {
131*65c59e02SInna Palant     return mCallbacksMock.longFoo();
132*65c59e02SInna Palant   }
133*65c59e02SInna Palant 
floatFooStatic()134*65c59e02SInna Palant   public static float floatFooStatic() {
135*65c59e02SInna Palant     return mCallbacksMock.floatFoo();
136*65c59e02SInna Palant   }
137*65c59e02SInna Palant 
doubleFooStatic()138*65c59e02SInna Palant   public static double doubleFooStatic() {
139*65c59e02SInna Palant     return mCallbacksMock.doubleFoo();
140*65c59e02SInna Palant   }
141*65c59e02SInna Palant 
objectFooStatic()142*65c59e02SInna Palant   public static Object objectFooStatic() {
143*65c59e02SInna Palant     return mCallbacksMock.objectFoo();
144*65c59e02SInna Palant   }
145*65c59e02SInna Palant 
stringFooStatic()146*65c59e02SInna Palant   public static String stringFooStatic() {
147*65c59e02SInna Palant     return mCallbacksMock.stringFoo();
148*65c59e02SInna Palant   }
149*65c59e02SInna Palant 
150*65c59e02SInna Palant   @Test
resolveClass()151*65c59e02SInna Palant   public void resolveClass() throws ClassNotFoundException {
152*65c59e02SInna Palant     assertThat(nativeTestClassResolution("java/lang/Object")).isTrue();
153*65c59e02SInna Palant   }
154*65c59e02SInna Palant 
155*65c59e02SInna Palant   // Some versions of Android throw ClassNotFoundException while others throw NoClassDefFoundError.
156*65c59e02SInna Palant   // Flatten that to always be ClassNotFoundException.
wrapClassLoadingErrors(Callable<?> code)157*65c59e02SInna Palant   private static void wrapClassLoadingErrors(Callable<?> code) throws Exception {
158*65c59e02SInna Palant     try {
159*65c59e02SInna Palant       code.call();
160*65c59e02SInna Palant     } catch (NoClassDefFoundError ex) {
161*65c59e02SInna Palant       throw new ClassNotFoundException("chained NoClassDefFoundError", ex);
162*65c59e02SInna Palant     }
163*65c59e02SInna Palant   }
164*65c59e02SInna Palant 
165*65c59e02SInna Palant   @Test(expected = ClassNotFoundException.class)
failingToResolveClass()166*65c59e02SInna Palant   public void failingToResolveClass() throws Exception {
167*65c59e02SInna Palant     wrapClassLoadingErrors(
168*65c59e02SInna Palant         new Callable<Boolean>() {
169*65c59e02SInna Palant           @Override
170*65c59e02SInna Palant           public Boolean call() throws Exception {
171*65c59e02SInna Palant             return nativeTestClassResolution("ThisClassDoesNotExist");
172*65c59e02SInna Palant           }
173*65c59e02SInna Palant         });
174*65c59e02SInna Palant   }
175*65c59e02SInna Palant 
nativeTestClassResolution(String className)176*65c59e02SInna Palant   private native boolean nativeTestClassResolution(String className) throws ClassNotFoundException;
177*65c59e02SInna Palant 
178*65c59e02SInna Palant   @Test
lazyClassResolution()179*65c59e02SInna Palant   public void lazyClassResolution() throws ClassNotFoundException {
180*65c59e02SInna Palant     assertThat(nativeTestLazyClassResolution("java/lang/Object")).isTrue();
181*65c59e02SInna Palant   }
182*65c59e02SInna Palant 
183*65c59e02SInna Palant   @Test(expected = ClassNotFoundException.class)
failedLazyClassResolution()184*65c59e02SInna Palant   public void failedLazyClassResolution() throws Exception {
185*65c59e02SInna Palant     wrapClassLoadingErrors(
186*65c59e02SInna Palant         new Callable<Boolean>() {
187*65c59e02SInna Palant           @Override
188*65c59e02SInna Palant           public Boolean call() throws Exception {
189*65c59e02SInna Palant             return nativeTestLazyClassResolution("ThisClassDoesNotExist");
190*65c59e02SInna Palant           }
191*65c59e02SInna Palant         });
192*65c59e02SInna Palant   }
193*65c59e02SInna Palant 
nativeTestLazyClassResolution(String className)194*65c59e02SInna Palant   private native boolean nativeTestLazyClassResolution(String className)
195*65c59e02SInna Palant       throws ClassNotFoundException;
196*65c59e02SInna Palant 
197*65c59e02SInna Palant   @Test
instanceCreation()198*65c59e02SInna Palant   public void instanceCreation() {
199*65c59e02SInna Palant     assertThat(nativeCreateInstanceOf("java/lang/String"))
200*65c59e02SInna Palant         .isInstanceOf(String.class)
201*65c59e02SInna Palant         .isEqualTo("java/lang/String");
202*65c59e02SInna Palant   }
203*65c59e02SInna Palant 
nativeCreateInstanceOf(String className)204*65c59e02SInna Palant   private native Object nativeCreateInstanceOf(String className);
205*65c59e02SInna Palant 
206*65c59e02SInna Palant   @Test
typeDescriptors()207*65c59e02SInna Palant   public void typeDescriptors() {
208*65c59e02SInna Palant     assertThat(nativeTestTypeDescriptors()).isTrue();
209*65c59e02SInna Palant   }
210*65c59e02SInna Palant 
nativeTestTypeDescriptors()211*65c59e02SInna Palant   private native boolean nativeTestTypeDescriptors();
212*65c59e02SInna Palant 
213*65c59e02SInna Palant   @Test
resolveVirtualMethod()214*65c59e02SInna Palant   public void resolveVirtualMethod() throws ClassNotFoundException, NoSuchMethodException {
215*65c59e02SInna Palant     assertThat(nativeTestVirtualMethodResolution_I("java/lang/Object", "hashCode")).isTrue();
216*65c59e02SInna Palant   }
217*65c59e02SInna Palant 
218*65c59e02SInna Palant   @Test
resolveVirtualMethodWithArray()219*65c59e02SInna Palant   public void resolveVirtualMethodWithArray() throws ClassNotFoundException, NoSuchMethodException {
220*65c59e02SInna Palant     assertThat(nativeTestVirtualMethodResolution_arrB("java/lang/String", "getBytes")).isTrue();
221*65c59e02SInna Palant   }
222*65c59e02SInna Palant 
223*65c59e02SInna Palant   @Test
resolveVirtualMethodWithObjectArray()224*65c59e02SInna Palant   public void resolveVirtualMethodWithObjectArray()
225*65c59e02SInna Palant       throws ClassNotFoundException, NoSuchMethodException {
226*65c59e02SInna Palant     assertThat(nativeTestVirtualMethodResolution_S_arrS("java/lang/String", "split")).isTrue();
227*65c59e02SInna Palant   }
228*65c59e02SInna Palant 
229*65c59e02SInna Palant   @Test
resolveVirtualMethodWithObjectArrayArray()230*65c59e02SInna Palant   public void resolveVirtualMethodWithObjectArrayArray()
231*65c59e02SInna Palant       throws ClassNotFoundException, NoSuchMethodException {
232*65c59e02SInna Palant     assertThat(
233*65c59e02SInna Palant             nativeTestVirtualMethodResolution_arrarrS(
234*65c59e02SInna Palant                 "com/facebook/jni/FBJniTests", "returnMultidimensionalObjectArray"))
235*65c59e02SInna Palant         .isTrue();
236*65c59e02SInna Palant   }
237*65c59e02SInna Palant 
returnMultidimensionalObjectArray()238*65c59e02SInna Palant   public static String[][] returnMultidimensionalObjectArray() {
239*65c59e02SInna Palant     return null;
240*65c59e02SInna Palant   }
241*65c59e02SInna Palant 
242*65c59e02SInna Palant   @Test
resolveVirtualMethodWithPrimitiveArrayArray()243*65c59e02SInna Palant   public void resolveVirtualMethodWithPrimitiveArrayArray()
244*65c59e02SInna Palant       throws ClassNotFoundException, NoSuchMethodException {
245*65c59e02SInna Palant     assertThat(
246*65c59e02SInna Palant             nativeTestVirtualMethodResolution_arrarrI(
247*65c59e02SInna Palant                 "com/facebook/jni/FBJniTests", "returnMultidimensionalPrimitiveArray"))
248*65c59e02SInna Palant         .isTrue();
249*65c59e02SInna Palant   }
250*65c59e02SInna Palant 
returnMultidimensionalPrimitiveArray()251*65c59e02SInna Palant   public static int[][] returnMultidimensionalPrimitiveArray() {
252*65c59e02SInna Palant     return null;
253*65c59e02SInna Palant   }
254*65c59e02SInna Palant 
255*65c59e02SInna Palant   @Test(expected = NoSuchMethodError.class)
failingToResolveVirtualMethod()256*65c59e02SInna Palant   public void failingToResolveVirtualMethod() throws ClassNotFoundException, NoSuchMethodError {
257*65c59e02SInna Palant     nativeTestVirtualMethodResolution_I("java/lang/Object", "ThisMethodDoesNotExist");
258*65c59e02SInna Palant   }
259*65c59e02SInna Palant 
nativeTestVirtualMethodResolution_I(String className, String methodName)260*65c59e02SInna Palant   private native boolean nativeTestVirtualMethodResolution_I(String className, String methodName)
261*65c59e02SInna Palant       throws ClassNotFoundException, NoSuchMethodError;
262*65c59e02SInna Palant 
nativeTestVirtualMethodResolution_arrB(String className, String methodName)263*65c59e02SInna Palant   private native boolean nativeTestVirtualMethodResolution_arrB(String className, String methodName)
264*65c59e02SInna Palant       throws ClassNotFoundException, NoSuchMethodError;
265*65c59e02SInna Palant 
nativeTestVirtualMethodResolution_S_arrS( String className, String methodName)266*65c59e02SInna Palant   private native boolean nativeTestVirtualMethodResolution_S_arrS(
267*65c59e02SInna Palant       String className, String methodName) throws ClassNotFoundException, NoSuchMethodError;
268*65c59e02SInna Palant 
nativeTestVirtualMethodResolution_arrarrS( String className, String methodName)269*65c59e02SInna Palant   private native boolean nativeTestVirtualMethodResolution_arrarrS(
270*65c59e02SInna Palant       String className, String methodName) throws ClassNotFoundException, NoSuchMethodError;
271*65c59e02SInna Palant 
nativeTestVirtualMethodResolution_arrarrI( String className, String methodName)272*65c59e02SInna Palant   private native boolean nativeTestVirtualMethodResolution_arrarrI(
273*65c59e02SInna Palant       String className, String methodName) throws ClassNotFoundException, NoSuchMethodError;
274*65c59e02SInna Palant 
275*65c59e02SInna Palant   @Test
lazyMethodResolution()276*65c59e02SInna Palant   public void lazyMethodResolution() throws ClassNotFoundException, NoSuchMethodError {
277*65c59e02SInna Palant     assertThat(nativeTestLazyVirtualMethodResolution_I("java/lang/Object", "hashCode")).isTrue();
278*65c59e02SInna Palant   }
279*65c59e02SInna Palant 
280*65c59e02SInna Palant   @Test(expected = NoSuchMethodError.class)
failedLazyMethodResolution()281*65c59e02SInna Palant   public void failedLazyMethodResolution() throws ClassNotFoundException, NoSuchMethodError {
282*65c59e02SInna Palant     nativeTestLazyVirtualMethodResolution_I("java/lang/Object", "ThisMethodDoesNotExist");
283*65c59e02SInna Palant   }
284*65c59e02SInna Palant 
nativeTestLazyVirtualMethodResolution_I( String className, String methodName)285*65c59e02SInna Palant   private native boolean nativeTestLazyVirtualMethodResolution_I(
286*65c59e02SInna Palant       String className, String methodName);
287*65c59e02SInna Palant 
288*65c59e02SInna Palant   @Test
callbacksUsingJMethod()289*65c59e02SInna Palant   public void callbacksUsingJMethod() {
290*65c59e02SInna Palant     nativeTestJMethodCallbacks(mCallbacksMock);
291*65c59e02SInna Palant     verifyAllCallbacksCalled(mCallbacksMock);
292*65c59e02SInna Palant   }
293*65c59e02SInna Palant 
nativeTestJMethodCallbacks(Callbacks callbacks)294*65c59e02SInna Palant   private native void nativeTestJMethodCallbacks(Callbacks callbacks);
295*65c59e02SInna Palant 
296*65c59e02SInna Palant   @Test
callbacksUsingJStaticMethod()297*65c59e02SInna Palant   public void callbacksUsingJStaticMethod() {
298*65c59e02SInna Palant     nativeTestJStaticMethodCallbacks();
299*65c59e02SInna Palant     verifyAllCallbacksCalled(mCallbacksMock);
300*65c59e02SInna Palant   }
301*65c59e02SInna Palant 
nativeTestJStaticMethodCallbacks()302*65c59e02SInna Palant   private native void nativeTestJStaticMethodCallbacks();
303*65c59e02SInna Palant 
304*65c59e02SInna Palant   @Test
isAssignableFrom()305*65c59e02SInna Palant   public void isAssignableFrom() {
306*65c59e02SInna Palant     assertThat(nativeTestIsAssignableFrom(String.class, String.class)).isTrue();
307*65c59e02SInna Palant     assertThat(nativeTestIsAssignableFrom(String.class, Object.class)).isFalse();
308*65c59e02SInna Palant     assertThat(nativeTestIsAssignableFrom(Object.class, String.class)).isTrue();
309*65c59e02SInna Palant     assertThat(nativeTestIsAssignableFrom(ArrayList.class, Iterable.class)).isFalse();
310*65c59e02SInna Palant     assertThat(nativeTestIsAssignableFrom(Iterable.class, ArrayList.class)).isTrue();
311*65c59e02SInna Palant   }
312*65c59e02SInna Palant 
nativeTestIsAssignableFrom(Class cls1, Class cls2)313*65c59e02SInna Palant   private native boolean nativeTestIsAssignableFrom(Class cls1, Class cls2);
314*65c59e02SInna Palant 
315*65c59e02SInna Palant   @Test
isInstanceOf()316*65c59e02SInna Palant   public void isInstanceOf() {
317*65c59e02SInna Palant     assertThat(nativeTestIsInstanceOf("", String.class)).isTrue();
318*65c59e02SInna Palant     assertThat(nativeTestIsInstanceOf("", Object.class)).isTrue();
319*65c59e02SInna Palant     assertThat(nativeTestIsInstanceOf(new Object(), String.class)).isFalse();
320*65c59e02SInna Palant     assertThat(nativeTestIsInstanceOf(new ArrayList(), Iterable.class)).isTrue();
321*65c59e02SInna Palant     assertThat(nativeTestIsInstanceOf(null, Iterable.class)).isTrue();
322*65c59e02SInna Palant   }
323*65c59e02SInna Palant 
nativeTestIsInstanceOf(Object object, Class cls)324*65c59e02SInna Palant   private native boolean nativeTestIsInstanceOf(Object object, Class cls);
325*65c59e02SInna Palant 
326*65c59e02SInna Palant   @Test
isSameObject()327*65c59e02SInna Palant   public void isSameObject() {
328*65c59e02SInna Palant     Object anObject = new Object();
329*65c59e02SInna Palant     Object anotherObject = new Object();
330*65c59e02SInna Palant     assertThat(nativeTestIsSameObject(anObject, anObject)).isTrue();
331*65c59e02SInna Palant     assertThat(nativeTestIsSameObject(anObject, anotherObject)).isFalse();
332*65c59e02SInna Palant     assertThat(nativeTestIsSameObject(null, anObject)).isFalse();
333*65c59e02SInna Palant     assertThat(nativeTestIsSameObject(anObject, null)).isFalse();
334*65c59e02SInna Palant     assertThat(nativeTestIsSameObject(null, null)).isTrue();
335*65c59e02SInna Palant   }
336*65c59e02SInna Palant 
nativeTestIsSameObject(Object a, Object b)337*65c59e02SInna Palant   private native boolean nativeTestIsSameObject(Object a, Object b);
338*65c59e02SInna Palant 
339*65c59e02SInna Palant   @Test
testGetSuperClass()340*65c59e02SInna Palant   public void testGetSuperClass() {
341*65c59e02SInna Palant     Class testClass = String.class;
342*65c59e02SInna Palant     Class superClass = Object.class;
343*65c59e02SInna Palant     Class notSuperClass = Integer.class;
344*65c59e02SInna Palant 
345*65c59e02SInna Palant     assertThat(nativeTestGetSuperclass(testClass, superClass)).isTrue();
346*65c59e02SInna Palant     assertThat(nativeTestGetSuperclass(testClass, notSuperClass)).isFalse();
347*65c59e02SInna Palant   }
348*65c59e02SInna Palant 
nativeTestGetSuperclass(Class testClass, Class superOfTest)349*65c59e02SInna Palant   private native boolean nativeTestGetSuperclass(Class testClass, Class superOfTest);
350*65c59e02SInna Palant 
351*65c59e02SInna Palant   @Test
testWeakRefs()352*65c59e02SInna Palant   public void testWeakRefs() {
353*65c59e02SInna Palant     assertThat(nativeTestWeakRefs()).isTrue();
354*65c59e02SInna Palant   }
355*65c59e02SInna Palant 
nativeTestWeakRefs()356*65c59e02SInna Palant   private native boolean nativeTestWeakRefs();
357*65c59e02SInna Palant 
358*65c59e02SInna Palant   @Test
testAliasRefs()359*65c59e02SInna Palant   public void testAliasRefs() {
360*65c59e02SInna Palant     assertThat(nativeTestAlias()).isTrue();
361*65c59e02SInna Palant   }
362*65c59e02SInna Palant 
nativeTestAlias()363*65c59e02SInna Palant   private native boolean nativeTestAlias();
364*65c59e02SInna Palant 
365*65c59e02SInna Palant   @Test
testAliasRefConversions()366*65c59e02SInna Palant   public void testAliasRefConversions() {
367*65c59e02SInna Palant     assertThat(nativeTestAliasRefConversions()).isTrue();
368*65c59e02SInna Palant   }
369*65c59e02SInna Palant 
nativeTestAliasRefConversions()370*65c59e02SInna Palant   private native boolean nativeTestAliasRefConversions();
371*65c59e02SInna Palant 
372*65c59e02SInna Palant   @Test
testNullJString()373*65c59e02SInna Palant   public void testNullJString() {
374*65c59e02SInna Palant     assertThat(nativeTestNullJString()).isTrue();
375*65c59e02SInna Palant   }
376*65c59e02SInna Palant 
nativeTestNullJString()377*65c59e02SInna Palant   private native boolean nativeTestNullJString();
378*65c59e02SInna Palant 
379*65c59e02SInna Palant   @Test
testSwap()380*65c59e02SInna Palant   public void testSwap() {
381*65c59e02SInna Palant     assertThat(nativeTestSwap(new Object())).isTrue();
382*65c59e02SInna Palant   }
383*65c59e02SInna Palant 
nativeTestSwap(Object other)384*65c59e02SInna Palant   private native boolean nativeTestSwap(Object other);
385*65c59e02SInna Palant 
386*65c59e02SInna Palant   @Test
testEqualOperator()387*65c59e02SInna Palant   public void testEqualOperator() {
388*65c59e02SInna Palant     assertThat(nativeTestEqualOperator(new Object())).isTrue();
389*65c59e02SInna Palant   }
390*65c59e02SInna Palant 
nativeTestEqualOperator(Object other)391*65c59e02SInna Palant   private native boolean nativeTestEqualOperator(Object other);
392*65c59e02SInna Palant 
393*65c59e02SInna Palant   @Test
testRelaseAlias()394*65c59e02SInna Palant   public void testRelaseAlias() {
395*65c59e02SInna Palant     assertThat(nativeTestReleaseAlias()).isTrue();
396*65c59e02SInna Palant   }
397*65c59e02SInna Palant 
nativeTestReleaseAlias()398*65c59e02SInna Palant   private native boolean nativeTestReleaseAlias();
399*65c59e02SInna Palant 
400*65c59e02SInna Palant   @Test
testLockingWeakReferences()401*65c59e02SInna Palant   public void testLockingWeakReferences() {
402*65c59e02SInna Palant     assertThat(nativeTestLockingWeakReferences()).isTrue();
403*65c59e02SInna Palant   }
404*65c59e02SInna Palant 
nativeTestLockingWeakReferences()405*65c59e02SInna Palant   private native boolean nativeTestLockingWeakReferences();
406*65c59e02SInna Palant 
407*65c59e02SInna Palant   @Test
testCreatingReferences()408*65c59e02SInna Palant   public void testCreatingReferences() {
409*65c59e02SInna Palant     assertThat(nativeTestCreatingReferences()).isTrue();
410*65c59e02SInna Palant   }
411*65c59e02SInna Palant 
nativeTestCreatingReferences()412*65c59e02SInna Palant   private native boolean nativeTestCreatingReferences();
413*65c59e02SInna Palant 
414*65c59e02SInna Palant   @Test
testAssignmentAndCopyConstructors()415*65c59e02SInna Palant   public void testAssignmentAndCopyConstructors() {
416*65c59e02SInna Palant     assertThat(nativeTestAssignmentAndCopyConstructors()).isTrue();
417*65c59e02SInna Palant   }
418*65c59e02SInna Palant 
nativeTestAssignmentAndCopyConstructors()419*65c59e02SInna Palant   private native boolean nativeTestAssignmentAndCopyConstructors();
420*65c59e02SInna Palant 
421*65c59e02SInna Palant   @Test
testAssignmentAndCopyCrossTypes()422*65c59e02SInna Palant   public void testAssignmentAndCopyCrossTypes() {
423*65c59e02SInna Palant     assertThat(nativeTestAssignmentAndCopyCrossTypes()).isTrue();
424*65c59e02SInna Palant   }
425*65c59e02SInna Palant 
nativeTestAssignmentAndCopyCrossTypes()426*65c59e02SInna Palant   private native boolean nativeTestAssignmentAndCopyCrossTypes();
427*65c59e02SInna Palant 
428*65c59e02SInna Palant   @Test
testNullReferences()429*65c59e02SInna Palant   public void testNullReferences() {
430*65c59e02SInna Palant     assertThat(nativeTestNullReferences()).isTrue();
431*65c59e02SInna Palant   }
432*65c59e02SInna Palant 
nativeTestNullReferences()433*65c59e02SInna Palant   private native boolean nativeTestNullReferences();
434*65c59e02SInna Palant 
435*65c59e02SInna Palant   @Test
testAutoAliasRefReturningVoid()436*65c59e02SInna Palant   public void testAutoAliasRefReturningVoid() {
437*65c59e02SInna Palant     nativeTestAutoAliasRefReturningVoid();
438*65c59e02SInna Palant   }
439*65c59e02SInna Palant 
nativeTestAutoAliasRefReturningVoid()440*65c59e02SInna Palant   private native void nativeTestAutoAliasRefReturningVoid();
441*65c59e02SInna Palant 
442*65c59e02SInna Palant   @Test
testFieldAccess()443*65c59e02SInna Palant   public void testFieldAccess() {
444*65c59e02SInna Palant     mIntFieldTest = 17;
445*65c59e02SInna Palant     assertThat(nativeTestFieldAccess("mIntFieldTest", mIntFieldTest, 42)).isTrue();
446*65c59e02SInna Palant     assertThat(mIntFieldTest).isEqualTo(42);
447*65c59e02SInna Palant   }
448*65c59e02SInna Palant 
nativeTestFieldAccess(String name, int oldVal, int newVal)449*65c59e02SInna Palant   private native boolean nativeTestFieldAccess(String name, int oldVal, int newVal);
450*65c59e02SInna Palant 
451*65c59e02SInna Palant   @Test
testStringFieldAccess()452*65c59e02SInna Palant   public void testStringFieldAccess() {
453*65c59e02SInna Palant     mStringFieldTest = "initial";
454*65c59e02SInna Palant     assertThat(nativeTestStringFieldAccess("mStringFieldTest", mStringFieldTest, "final")).isTrue();
455*65c59e02SInna Palant     assertThat(mStringFieldTest).isEqualTo("final");
456*65c59e02SInna Palant   }
457*65c59e02SInna Palant 
nativeTestStringFieldAccess(String name, String oldVal, String newVal)458*65c59e02SInna Palant   private native boolean nativeTestStringFieldAccess(String name, String oldVal, String newVal);
459*65c59e02SInna Palant 
460*65c59e02SInna Palant   @Test
testReferenceFieldAccess()461*65c59e02SInna Palant   public void testReferenceFieldAccess() {
462*65c59e02SInna Palant     for (boolean useWrapper : new boolean[] {false, true}) {
463*65c59e02SInna Palant       mReferenceFieldTest = new TestThing();
464*65c59e02SInna Palant       TestThing newthing = new TestThing();
465*65c59e02SInna Palant 
466*65c59e02SInna Palant       assertThat(
467*65c59e02SInna Palant               nativeTestReferenceFieldAccess(
468*65c59e02SInna Palant                   "mReferenceFieldTest", mReferenceFieldTest, newthing, useWrapper))
469*65c59e02SInna Palant           .isTrue();
470*65c59e02SInna Palant       assertThat(mReferenceFieldTest).isEqualTo(newthing);
471*65c59e02SInna Palant     }
472*65c59e02SInna Palant   }
473*65c59e02SInna Palant 
nativeTestReferenceFieldAccess( String name, Object oldVal, Object newVal, boolean useWrapper)474*65c59e02SInna Palant   private native boolean nativeTestReferenceFieldAccess(
475*65c59e02SInna Palant       String name, Object oldVal, Object newVal, boolean useWrapper);
476*65c59e02SInna Palant 
477*65c59e02SInna Palant   @Test
testStaticFieldAccess()478*65c59e02SInna Palant   public void testStaticFieldAccess() {
479*65c59e02SInna Palant     sIntFieldTest = 17;
480*65c59e02SInna Palant     assertThat(nativeTestStaticFieldAccess("sIntFieldTest", sIntFieldTest, 42)).isTrue();
481*65c59e02SInna Palant     assertThat(sIntFieldTest).isEqualTo(42);
482*65c59e02SInna Palant   }
483*65c59e02SInna Palant 
nativeTestStaticFieldAccess(String name, int oldVal, int newVal)484*65c59e02SInna Palant   private native boolean nativeTestStaticFieldAccess(String name, int oldVal, int newVal);
485*65c59e02SInna Palant 
486*65c59e02SInna Palant   @Test
testStaticStringFieldAccess()487*65c59e02SInna Palant   public void testStaticStringFieldAccess() {
488*65c59e02SInna Palant     sStringFieldTest = "initial";
489*65c59e02SInna Palant     assertThat(nativeTestStaticStringFieldAccess("sStringFieldTest", sStringFieldTest, "final"))
490*65c59e02SInna Palant         .isTrue();
491*65c59e02SInna Palant     assertThat(sStringFieldTest).isEqualTo("final");
492*65c59e02SInna Palant   }
493*65c59e02SInna Palant 
nativeTestStaticStringFieldAccess(String name, String oVal, String nVal)494*65c59e02SInna Palant   private native boolean nativeTestStaticStringFieldAccess(String name, String oVal, String nVal);
495*65c59e02SInna Palant 
496*65c59e02SInna Palant   @Test
testStaticReferenceFieldAccess()497*65c59e02SInna Palant   public void testStaticReferenceFieldAccess() {
498*65c59e02SInna Palant     for (boolean useWrapper : new boolean[] {false, true}) {
499*65c59e02SInna Palant       sReferenceFieldTest = new TestThing();
500*65c59e02SInna Palant       TestThing newthing = new TestThing();
501*65c59e02SInna Palant 
502*65c59e02SInna Palant       assertThat(
503*65c59e02SInna Palant               nativeTestStaticReferenceFieldAccess(
504*65c59e02SInna Palant                   "sReferenceFieldTest", sReferenceFieldTest, newthing, useWrapper))
505*65c59e02SInna Palant           .isTrue();
506*65c59e02SInna Palant       assertThat(sReferenceFieldTest).isEqualTo(newthing);
507*65c59e02SInna Palant     }
508*65c59e02SInna Palant   }
509*65c59e02SInna Palant 
nativeTestStaticReferenceFieldAccess( String name, Object oldVal, Object newVal, boolean useWrapper)510*65c59e02SInna Palant   private native boolean nativeTestStaticReferenceFieldAccess(
511*65c59e02SInna Palant       String name, Object oldVal, Object newVal, boolean useWrapper);
512*65c59e02SInna Palant 
513*65c59e02SInna Palant   @Test
testNonVirtualMethod()514*65c59e02SInna Palant   public void testNonVirtualMethod() {
515*65c59e02SInna Palant     assertThat(nativeTestNonVirtualMethod(true)).isTrue();
516*65c59e02SInna Palant   }
517*65c59e02SInna Palant 
nativeTestNonVirtualMethod(boolean s)518*65c59e02SInna Palant   private native boolean nativeTestNonVirtualMethod(boolean s);
519*65c59e02SInna Palant 
520*65c59e02SInna Palant   @Test
testArrayCreation()521*65c59e02SInna Palant   public void testArrayCreation() {
522*65c59e02SInna Palant     String[] expectedStrings = {"one", "two", "three"};
523*65c59e02SInna Palant     String[] joinedStrings =
524*65c59e02SInna Palant         nativeTestArrayCreation(expectedStrings[0], expectedStrings[1], expectedStrings[2]);
525*65c59e02SInna Palant     assertThat(joinedStrings).isEqualTo(expectedStrings);
526*65c59e02SInna Palant   }
527*65c59e02SInna Palant 
nativeTestArrayCreation(String s0, String s1, String s2)528*65c59e02SInna Palant   private native String[] nativeTestArrayCreation(String s0, String s1, String s2);
529*65c59e02SInna Palant 
530*65c59e02SInna Palant   @Test
testMultidimensionalObjectArray()531*65c59e02SInna Palant   public void testMultidimensionalObjectArray() {
532*65c59e02SInna Palant     String[] strings = {"one", "two", "three"};
533*65c59e02SInna Palant     String[][] expectedStrings = {{"one", "two"}, {"three"}};
534*65c59e02SInna Palant     String[][] joinedStrings =
535*65c59e02SInna Palant         nativeTestMultidimensionalObjectArray(strings[0], strings[1], strings[2]);
536*65c59e02SInna Palant     assertThat(joinedStrings).isEqualTo(expectedStrings);
537*65c59e02SInna Palant   }
538*65c59e02SInna Palant 
nativeTestMultidimensionalObjectArray(String s0, String s1, String s2)539*65c59e02SInna Palant   private native String[][] nativeTestMultidimensionalObjectArray(String s0, String s1, String s2);
540*65c59e02SInna Palant 
541*65c59e02SInna Palant   @Test
testMultidimensionalPrimitiveArray()542*65c59e02SInna Palant   public void testMultidimensionalPrimitiveArray() {
543*65c59e02SInna Palant     int[] nums = {1, 2, 3};
544*65c59e02SInna Palant     int[][] expectedNums = {{1, 2}, {3}};
545*65c59e02SInna Palant     int[][] gotNums = nativeTestMultidimensionalPrimitiveArray(nums[0], nums[1], nums[2]);
546*65c59e02SInna Palant     assertThat(gotNums).isEqualTo(expectedNums);
547*65c59e02SInna Palant   }
548*65c59e02SInna Palant 
nativeTestMultidimensionalPrimitiveArray(int i0, int i1, int i2)549*65c59e02SInna Palant   private native int[][] nativeTestMultidimensionalPrimitiveArray(int i0, int i1, int i2);
550*65c59e02SInna Palant 
551*65c59e02SInna Palant   @Nullable private String[] mCapturedStringArray = null;
552*65c59e02SInna Palant 
553*65c59e02SInna Palant   @DoNotStrip
captureStringArray(String[] input)554*65c59e02SInna Palant   String captureStringArray(String[] input) {
555*65c59e02SInna Palant     mCapturedStringArray = input;
556*65c59e02SInna Palant     return "Stub";
557*65c59e02SInna Palant   }
558*65c59e02SInna Palant 
559*65c59e02SInna Palant   @Test
testBuildStringArray()560*65c59e02SInna Palant   public void testBuildStringArray() throws Exception {
561*65c59e02SInna Palant     String[] input = {"Four", "score", "and", "seven", "beers", "ago"};
562*65c59e02SInna Palant     nativeTestBuildStringArray(input);
563*65c59e02SInna Palant     assertThat(mCapturedStringArray).isEqualTo(input);
564*65c59e02SInna Palant   }
565*65c59e02SInna Palant 
nativeTestBuildStringArray(String... input)566*65c59e02SInna Palant   private native String nativeTestBuildStringArray(String... input);
567*65c59e02SInna Palant 
methodResolutionWithCxxTypes(String t, long val)568*65c59e02SInna Palant   public Object methodResolutionWithCxxTypes(String t, long val) {
569*65c59e02SInna Palant     if (!"test".equals(t) || val != 3) throw new RuntimeException();
570*65c59e02SInna Palant     return null;
571*65c59e02SInna Palant   }
572*65c59e02SInna Palant 
methodResolutionWithCxxTypesVoid(String t, long val)573*65c59e02SInna Palant   public void methodResolutionWithCxxTypesVoid(String t, long val) {
574*65c59e02SInna Palant     if (!"test".equals(t) || val != 3) throw new RuntimeException();
575*65c59e02SInna Palant   }
576*65c59e02SInna Palant 
methodResolutionWithCxxTypesInt(String t, long val)577*65c59e02SInna Palant   public int methodResolutionWithCxxTypesInt(String t, long val) {
578*65c59e02SInna Palant     if (!"test".equals(t) || val != 3) throw new RuntimeException();
579*65c59e02SInna Palant     return 0;
580*65c59e02SInna Palant   }
581*65c59e02SInna Palant 
methodResolutionWithCxxTypesStatic(String t, long val)582*65c59e02SInna Palant   public static Object methodResolutionWithCxxTypesStatic(String t, long val) {
583*65c59e02SInna Palant     if (!"test".equals(t) || val != 3) throw new RuntimeException();
584*65c59e02SInna Palant     return null;
585*65c59e02SInna Palant   }
586*65c59e02SInna Palant 
methodResolutionWithCxxTypesVoidStatic(String t, long val)587*65c59e02SInna Palant   public static void methodResolutionWithCxxTypesVoidStatic(String t, long val) {
588*65c59e02SInna Palant     if (!"test".equals(t) || val != 3) throw new RuntimeException();
589*65c59e02SInna Palant   }
590*65c59e02SInna Palant 
methodResolutionWithCxxTypesIntStatic(String t, long val)591*65c59e02SInna Palant   public static int methodResolutionWithCxxTypesIntStatic(String t, long val) {
592*65c59e02SInna Palant     if (!"test".equals(t) || val != 3) throw new RuntimeException();
593*65c59e02SInna Palant     return 0;
594*65c59e02SInna Palant   }
595*65c59e02SInna Palant 
596*65c59e02SInna Palant   @Test
testMethodResolutionWithCxxTypes()597*65c59e02SInna Palant   public void testMethodResolutionWithCxxTypes() {
598*65c59e02SInna Palant     testMethodResolutionWithCxxTypesNative("methodResolutionWithCxxTypes", "test", 3);
599*65c59e02SInna Palant   }
600*65c59e02SInna Palant 
testMethodResolutionWithCxxTypesNative( String callbackName, String str, long val)601*65c59e02SInna Palant   private native void testMethodResolutionWithCxxTypesNative(
602*65c59e02SInna Palant       String callbackName, String str, long val);
603*65c59e02SInna Palant 
604*65c59e02SInna Palant   @Test(expected = CustomException.class)
testHandleJavaCustomException()605*65c59e02SInna Palant   public void testHandleJavaCustomException() {
606*65c59e02SInna Palant     testHandleJavaCustomExceptionNative();
607*65c59e02SInna Palant   }
608*65c59e02SInna Palant 
testHandleJavaCustomExceptionNative()609*65c59e02SInna Palant   private native void testHandleJavaCustomExceptionNative();
610*65c59e02SInna Palant 
611*65c59e02SInna Palant   @Test
testHandleNullExceptionMessage()612*65c59e02SInna Palant   public void testHandleNullExceptionMessage() {
613*65c59e02SInna Palant     testHandleNullExceptionMessageNative();
614*65c59e02SInna Palant   }
615*65c59e02SInna Palant 
testHandleNullExceptionMessageNative()616*65c59e02SInna Palant   private native void testHandleNullExceptionMessageNative();
617*65c59e02SInna Palant 
618*65c59e02SInna Palant   @Test
testHandleNestedException()619*65c59e02SInna Palant   public void testHandleNestedException() {
620*65c59e02SInna Palant     try {
621*65c59e02SInna Palant       nativeTestHandleNestedException();
622*65c59e02SInna Palant     } catch (Throwable e) {
623*65c59e02SInna Palant       assertThat(e).isInstanceOf(ArrayIndexOutOfBoundsException.class);
624*65c59e02SInna Palant       e = e.getCause();
625*65c59e02SInna Palant       assertThat(e).isInstanceOf(RuntimeException.class);
626*65c59e02SInna Palant       e = e.getCause();
627*65c59e02SInna Palant       assertThat(e).isInstanceOf(CustomException.class).hasNoCause();
628*65c59e02SInna Palant     }
629*65c59e02SInna Palant   }
630*65c59e02SInna Palant 
nativeTestHandleNestedException()631*65c59e02SInna Palant   private native void nativeTestHandleNestedException();
632*65c59e02SInna Palant 
633*65c59e02SInna Palant   @Test(expected = CppException.class)
testHandleNoRttiException()634*65c59e02SInna Palant   public void testHandleNoRttiException() {
635*65c59e02SInna Palant     nativeTestHandleNoRttiException();
636*65c59e02SInna Palant   }
637*65c59e02SInna Palant 
nativeTestHandleNoRttiException()638*65c59e02SInna Palant   private native void nativeTestHandleNoRttiException();
639*65c59e02SInna Palant 
640*65c59e02SInna Palant   @Test
testCopyConstructor()641*65c59e02SInna Palant   public void testCopyConstructor() {
642*65c59e02SInna Palant     assertThat(nativeTestCopyConstructor())
643*65c59e02SInna Palant         .startsWith(
644*65c59e02SInna Palant             "com.facebook.jni.FBJniTests$CustomException: getMessages: 1\n"
645*65c59e02SInna Palant                 + "\tat com.facebook.jni.FBJniTests.customExceptionThrower(FBJniTests.java:")
646*65c59e02SInna Palant         .contains(
647*65c59e02SInna Palant             ")\n"
648*65c59e02SInna Palant                 + "\tat com.facebook.jni.FBJniTests.nativeTestCopyConstructor(Native Method)\n"
649*65c59e02SInna Palant                 + "\tat com.facebook.jni.FBJniTests.testCopyConstructor(FBJniTests.java:");
650*65c59e02SInna Palant   }
651*65c59e02SInna Palant 
nativeTestCopyConstructor()652*65c59e02SInna Palant   private native String nativeTestCopyConstructor();
653*65c59e02SInna Palant 
654*65c59e02SInna Palant   @Test
testMoveConstructorWithEmptyWhat()655*65c59e02SInna Palant   public void testMoveConstructorWithEmptyWhat() {
656*65c59e02SInna Palant     assertThat(nativeTestMoveConstructorWithEmptyWhat())
657*65c59e02SInna Palant         .startsWith(
658*65c59e02SInna Palant             "com.facebook.jni.FBJniTests$CustomException: getMessages: 1\n"
659*65c59e02SInna Palant                 + "\tat com.facebook.jni.FBJniTests.customExceptionThrower(FBJniTests.java:")
660*65c59e02SInna Palant         .contains(
661*65c59e02SInna Palant             ")\n"
662*65c59e02SInna Palant                 + "\tat com.facebook.jni.FBJniTests.nativeTestMoveConstructorWithEmptyWhat(Native"
663*65c59e02SInna Palant                 + " Method)\n"
664*65c59e02SInna Palant                 + "\tat com.facebook.jni.FBJniTests.testMoveConstructorWithEmptyWhat(FBJniTests.java:");
665*65c59e02SInna Palant   }
666*65c59e02SInna Palant 
nativeTestMoveConstructorWithEmptyWhat()667*65c59e02SInna Palant   private native String nativeTestMoveConstructorWithEmptyWhat();
668*65c59e02SInna Palant 
669*65c59e02SInna Palant   @Test
testMoveConstructorWithPopulatedWhat()670*65c59e02SInna Palant   public void testMoveConstructorWithPopulatedWhat() {
671*65c59e02SInna Palant     assertThat(nativeTestMoveConstructorWithPopulatedWhat())
672*65c59e02SInna Palant         .startsWith(
673*65c59e02SInna Palant             "com.facebook.jni.FBJniTests$CustomException: getMessages: 1\n"
674*65c59e02SInna Palant                 + "\tat com.facebook.jni.FBJniTests.customExceptionThrower(FBJniTests.java:")
675*65c59e02SInna Palant         .contains(
676*65c59e02SInna Palant             ")\n"
677*65c59e02SInna Palant                 + "\tat com.facebook.jni.FBJniTests.nativeTestMoveConstructorWithPopulatedWhat(Native"
678*65c59e02SInna Palant                 + " Method)\n"
679*65c59e02SInna Palant                 + "\tat com.facebook.jni.FBJniTests.testMoveConstructorWithPopulatedWhat(FBJniTests.java:");
680*65c59e02SInna Palant   }
681*65c59e02SInna Palant 
nativeTestMoveConstructorWithPopulatedWhat()682*65c59e02SInna Palant   private native String nativeTestMoveConstructorWithPopulatedWhat();
683*65c59e02SInna Palant 
684*65c59e02SInna Palant   @DoNotStrip // Used in native code.
customExceptionThrower()685*65c59e02SInna Palant   protected void customExceptionThrower() throws CustomException {
686*65c59e02SInna Palant     throw new CustomException();
687*65c59e02SInna Palant   }
688*65c59e02SInna Palant 
689*65c59e02SInna Palant   @DoNotStrip // Used in native code.
nullMessageThrower()690*65c59e02SInna Palant   protected void nullMessageThrower() throws NullPointerException {
691*65c59e02SInna Palant     // just like Preconditions.checkNotNull() does
692*65c59e02SInna Palant     throw new NullPointerException();
693*65c59e02SInna Palant   }
694*65c59e02SInna Palant 
695*65c59e02SInna Palant   @Test
testHandleCppRuntimeError()696*65c59e02SInna Palant   public void testHandleCppRuntimeError() {
697*65c59e02SInna Palant     String message = "Sample runtime error.";
698*65c59e02SInna Palant     thrown.expect(RuntimeException.class);
699*65c59e02SInna Palant     thrown.expectMessage(message);
700*65c59e02SInna Palant     nativeTestHandleCppRuntimeError(message);
701*65c59e02SInna Palant   }
702*65c59e02SInna Palant 
nativeTestHandleCppRuntimeError(String message)703*65c59e02SInna Palant   private native void nativeTestHandleCppRuntimeError(String message);
704*65c59e02SInna Palant 
705*65c59e02SInna Palant   @Test(expected = IOException.class)
testHandleCppIOBaseFailure()706*65c59e02SInna Palant   public void testHandleCppIOBaseFailure() {
707*65c59e02SInna Palant     nativeTestHandleCppIOBaseFailure();
708*65c59e02SInna Palant   }
709*65c59e02SInna Palant 
nativeTestHandleCppIOBaseFailure()710*65c59e02SInna Palant   private native void nativeTestHandleCppIOBaseFailure();
711*65c59e02SInna Palant 
712*65c59e02SInna Palant   @Test(expected = CppSystemErrorException.class)
testHandleCppSystemError()713*65c59e02SInna Palant   public void testHandleCppSystemError() {
714*65c59e02SInna Palant     nativeTestHandleCppSystemError();
715*65c59e02SInna Palant   }
716*65c59e02SInna Palant 
nativeTestHandleCppSystemError()717*65c59e02SInna Palant   private native void nativeTestHandleCppSystemError();
718*65c59e02SInna Palant 
719*65c59e02SInna Palant   @Test(expected = RuntimeException.class)
testInterDsoExceptionHandlingA()720*65c59e02SInna Palant   public void testInterDsoExceptionHandlingA() {
721*65c59e02SInna Palant     nativeTestInterDsoExceptionHandlingA();
722*65c59e02SInna Palant   }
723*65c59e02SInna Palant 
nativeTestInterDsoExceptionHandlingA()724*65c59e02SInna Palant   private native void nativeTestInterDsoExceptionHandlingA();
725*65c59e02SInna Palant 
726*65c59e02SInna Palant   @Test
testInterDsoExceptionHandlingB()727*65c59e02SInna Palant   public void testInterDsoExceptionHandlingB() {
728*65c59e02SInna Palant     assertThat(nativeTestInterDsoExceptionHandlingB()).isTrue();
729*65c59e02SInna Palant   }
730*65c59e02SInna Palant 
nativeTestInterDsoExceptionHandlingB()731*65c59e02SInna Palant   private native boolean nativeTestInterDsoExceptionHandlingB();
732*65c59e02SInna Palant 
733*65c59e02SInna Palant   @Test
testHandleNonStdExceptionThrow()734*65c59e02SInna Palant   public void testHandleNonStdExceptionThrow() {
735*65c59e02SInna Palant     try {
736*65c59e02SInna Palant       nativeTestHandleNonStdExceptionThrow();
737*65c59e02SInna Palant       Fail.failBecauseExceptionWasNotThrown(UnknownCppException.class);
738*65c59e02SInna Palant     } catch (UnknownCppException ex) {
739*65c59e02SInna Palant       if (System.getProperty("os.name").startsWith("Windows")) {
740*65c59e02SInna Palant         // Unknown exception types not supported on Windows.
741*65c59e02SInna Palant         assertThat(ex.getMessage()).isEqualTo("Unknown");
742*65c59e02SInna Palant         return;
743*65c59e02SInna Palant       }
744*65c59e02SInna Palant       // the actual string is implementation-defined and mangled, but in practice,
745*65c59e02SInna Palant       // it has the name of the C++ type in it somewhere.
746*65c59e02SInna Palant       assertThat(ex.getMessage()).startsWith("Unknown: ").contains("NonStdException");
747*65c59e02SInna Palant     }
748*65c59e02SInna Palant   }
749*65c59e02SInna Palant 
nativeTestHandleNonStdExceptionThrow()750*65c59e02SInna Palant   private native void nativeTestHandleNonStdExceptionThrow();
751*65c59e02SInna Palant 
752*65c59e02SInna Palant   @Test(expected = UnknownCppException.class)
testHandleCppCharPointerThrow()753*65c59e02SInna Palant   public void testHandleCppCharPointerThrow() {
754*65c59e02SInna Palant     nativeTestHandleCppCharPointerThrow();
755*65c59e02SInna Palant   }
756*65c59e02SInna Palant 
nativeTestHandleCppCharPointerThrow()757*65c59e02SInna Palant   private native void nativeTestHandleCppCharPointerThrow();
758*65c59e02SInna Palant 
759*65c59e02SInna Palant   @Test(expected = IllegalArgumentException.class)
testThrowJavaExceptionByName()760*65c59e02SInna Palant   public void testThrowJavaExceptionByName() {
761*65c59e02SInna Palant     nativeTestThrowJavaExceptionByName();
762*65c59e02SInna Palant   }
763*65c59e02SInna Palant 
nativeTestThrowJavaExceptionByName()764*65c59e02SInna Palant   private native void nativeTestThrowJavaExceptionByName();
765*65c59e02SInna Palant 
766*65c59e02SInna Palant   @Test(expected = UnknownCppException.class)
testHandleCppIntThrow()767*65c59e02SInna Palant   public void testHandleCppIntThrow() {
768*65c59e02SInna Palant     nativeTestHandleCppIntThrow();
769*65c59e02SInna Palant   }
770*65c59e02SInna Palant 
nativeTestHandleCppIntThrow()771*65c59e02SInna Palant   private native void nativeTestHandleCppIntThrow();
772*65c59e02SInna Palant 
773*65c59e02SInna Palant   @Test
testJThread()774*65c59e02SInna Palant   public void testJThread() {
775*65c59e02SInna Palant     assertThat(nativeTestJThread()).isEqualTo(1);
776*65c59e02SInna Palant   }
777*65c59e02SInna Palant 
nativeTestJThread()778*65c59e02SInna Palant   private native int nativeTestJThread();
779*65c59e02SInna Palant 
780*65c59e02SInna Palant   @Test
testThreadScopeGuard()781*65c59e02SInna Palant   public void testThreadScopeGuard() {
782*65c59e02SInna Palant     assertThat(nativeTestThreadScopeGuard(17)).isEqualTo(42);
783*65c59e02SInna Palant   }
784*65c59e02SInna Palant 
nativeTestThreadScopeGuard(double input)785*65c59e02SInna Palant   private native int nativeTestThreadScopeGuard(double input);
786*65c59e02SInna Palant 
787*65c59e02SInna Palant   @Test
testNestedThreadScopeGuard()788*65c59e02SInna Palant   public void testNestedThreadScopeGuard() {
789*65c59e02SInna Palant     assertThat(nativeTestNestedThreadScopeGuard(17)).isEqualTo(42);
790*65c59e02SInna Palant   }
791*65c59e02SInna Palant 
nativeTestNestedThreadScopeGuard(double input)792*65c59e02SInna Palant   private native int nativeTestNestedThreadScopeGuard(double input);
793*65c59e02SInna Palant 
794*65c59e02SInna Palant   @Test
testClassLoadInWorker()795*65c59e02SInna Palant   public void testClassLoadInWorker() {
796*65c59e02SInna Palant     assertThat(nativeTestClassLoadInWorker()).isEqualTo(1);
797*65c59e02SInna Palant   }
798*65c59e02SInna Palant 
nativeTestClassLoadInWorker()799*65c59e02SInna Palant   private native int nativeTestClassLoadInWorker();
800*65c59e02SInna Palant 
801*65c59e02SInna Palant   @Test
testClassLoadWorkerFastPath()802*65c59e02SInna Palant   public void testClassLoadWorkerFastPath() {
803*65c59e02SInna Palant     assertThat(nativeTestClassLoadWorkerFastPath()).isEqualTo(3);
804*65c59e02SInna Palant   }
805*65c59e02SInna Palant 
nativeTestClassLoadWorkerFastPath()806*65c59e02SInna Palant   private native int nativeTestClassLoadWorkerFastPath();
807*65c59e02SInna Palant 
808*65c59e02SInna Palant   @Test
testToString()809*65c59e02SInna Palant   public void testToString() {
810*65c59e02SInna Palant     assertThat(nativeTestToString()).isTrue();
811*65c59e02SInna Palant   }
812*65c59e02SInna Palant 
nativeTestToString()813*65c59e02SInna Palant   private native boolean nativeTestToString();
814*65c59e02SInna Palant 
815*65c59e02SInna Palant   // Casting alias_ref
816*65c59e02SInna Palant 
817*65c59e02SInna Palant   @Test
testCorrectStaticCastAliasRef()818*65c59e02SInna Palant   public void testCorrectStaticCastAliasRef() {
819*65c59e02SInna Palant     // Static cast can't fail at run time.  If the object isn't actually
820*65c59e02SInna Palant     // of that type, we just get undefined behaviour, which we can't
821*65c59e02SInna Palant     // check for.  So we only do a positive test.
822*65c59e02SInna Palant     assertThat(nativeStaticCastAliasRefToString("hello")).isTrue();
823*65c59e02SInna Palant   }
824*65c59e02SInna Palant 
825*65c59e02SInna Palant   @Test
testNullStaticCastAliasRef()826*65c59e02SInna Palant   public void testNullStaticCastAliasRef() {
827*65c59e02SInna Palant     assertThat(nativeStaticCastAliasRefToString(null)).isTrue();
828*65c59e02SInna Palant   }
829*65c59e02SInna Palant 
nativeStaticCastAliasRefToString(Object a)830*65c59e02SInna Palant   private native boolean nativeStaticCastAliasRefToString(Object a);
831*65c59e02SInna Palant 
832*65c59e02SInna Palant   @Test
testDynamicCastAliasRefToSame()833*65c59e02SInna Palant   public void testDynamicCastAliasRefToSame() {
834*65c59e02SInna Palant     assertThat(nativeDynamicCastAliasRefToThrowable(new Throwable())).isTrue();
835*65c59e02SInna Palant   }
836*65c59e02SInna Palant 
testDynamicCastAliasRefToBase()837*65c59e02SInna Palant   public void testDynamicCastAliasRefToBase() {
838*65c59e02SInna Palant     assertThat(nativeDynamicCastAliasRefToThrowable(new Exception())).isTrue();
839*65c59e02SInna Palant   }
840*65c59e02SInna Palant 
841*65c59e02SInna Palant   @Test(expected = ClassCastException.class)
testDynamicCastAliasRefToDerived()842*65c59e02SInna Palant   public void testDynamicCastAliasRefToDerived() {
843*65c59e02SInna Palant     nativeDynamicCastAliasRefToThrowable(new Object());
844*65c59e02SInna Palant   }
845*65c59e02SInna Palant 
846*65c59e02SInna Palant   @Test(expected = ClassCastException.class)
testDynamicCastAliasRefToUnrelated()847*65c59e02SInna Palant   public void testDynamicCastAliasRefToUnrelated() {
848*65c59e02SInna Palant     nativeDynamicCastAliasRefToThrowable(new Integer(23));
849*65c59e02SInna Palant   }
850*65c59e02SInna Palant 
851*65c59e02SInna Palant   @Test
testNullDynamicCastAliasRef()852*65c59e02SInna Palant   public void testNullDynamicCastAliasRef() {
853*65c59e02SInna Palant     assertThat(nativeDynamicCastAliasRefToThrowable(null)).isTrue();
854*65c59e02SInna Palant   }
855*65c59e02SInna Palant 
nativeDynamicCastAliasRefToThrowable(Object a)856*65c59e02SInna Palant   private native boolean nativeDynamicCastAliasRefToThrowable(Object a);
857*65c59e02SInna Palant 
858*65c59e02SInna Palant   // Casting local_ref
859*65c59e02SInna Palant 
860*65c59e02SInna Palant   @Test
testCorrectStaticCastLocalRef()861*65c59e02SInna Palant   public void testCorrectStaticCastLocalRef() {
862*65c59e02SInna Palant     // Static cast can't fail at run time.  If the object isn't actually
863*65c59e02SInna Palant     // of that type, we just get undefined behaviour, which we can't
864*65c59e02SInna Palant     // check for.  So we only do a positive test.
865*65c59e02SInna Palant     assertThat(nativeStaticCastLocalRefToString("hello")).isTrue();
866*65c59e02SInna Palant   }
867*65c59e02SInna Palant 
868*65c59e02SInna Palant   @Test
testNullStaticCastLocalRef()869*65c59e02SInna Palant   public void testNullStaticCastLocalRef() {
870*65c59e02SInna Palant     assertThat(nativeStaticCastLocalRefToString(null)).isTrue();
871*65c59e02SInna Palant   }
872*65c59e02SInna Palant 
nativeStaticCastLocalRefToString(Object a)873*65c59e02SInna Palant   private native boolean nativeStaticCastLocalRefToString(Object a);
874*65c59e02SInna Palant 
875*65c59e02SInna Palant   @Test
testCorrectDynamicCastLocalRef()876*65c59e02SInna Palant   public void testCorrectDynamicCastLocalRef() {
877*65c59e02SInna Palant     assertThat(nativeDynamicCastLocalRefToString("hello")).isTrue();
878*65c59e02SInna Palant   }
879*65c59e02SInna Palant 
880*65c59e02SInna Palant   @Test(expected = ClassCastException.class)
testIncorrectDynamicCastLocalRef()881*65c59e02SInna Palant   public void testIncorrectDynamicCastLocalRef() {
882*65c59e02SInna Palant     nativeDynamicCastLocalRefToString(new Integer(23));
883*65c59e02SInna Palant   }
884*65c59e02SInna Palant 
885*65c59e02SInna Palant   @Test
testNullDynamicCastLocalRef()886*65c59e02SInna Palant   public void testNullDynamicCastLocalRef() {
887*65c59e02SInna Palant     assertThat(nativeDynamicCastLocalRefToString(null)).isTrue();
888*65c59e02SInna Palant   }
889*65c59e02SInna Palant 
nativeDynamicCastLocalRefToString(Object a)890*65c59e02SInna Palant   private native boolean nativeDynamicCastLocalRefToString(Object a);
891*65c59e02SInna Palant 
892*65c59e02SInna Palant   // Casting global_ref
893*65c59e02SInna Palant 
894*65c59e02SInna Palant   @Test
testCorrectStaticCastGlobalRef()895*65c59e02SInna Palant   public void testCorrectStaticCastGlobalRef() {
896*65c59e02SInna Palant     // Static cast can't fail at run time.  If the object isn't actually
897*65c59e02SInna Palant     // of that type, we just get undefined behaviour, which we can't
898*65c59e02SInna Palant     // check for.  So we only do a positive test.
899*65c59e02SInna Palant     assertThat(nativeStaticCastGlobalRefToString("hello")).isTrue();
900*65c59e02SInna Palant   }
901*65c59e02SInna Palant 
902*65c59e02SInna Palant   @Test
testNullStaticCastGlobalRef()903*65c59e02SInna Palant   public void testNullStaticCastGlobalRef() {
904*65c59e02SInna Palant     assertThat(nativeStaticCastGlobalRefToString(null)).isTrue();
905*65c59e02SInna Palant   }
906*65c59e02SInna Palant 
nativeStaticCastGlobalRefToString(Object a)907*65c59e02SInna Palant   private native boolean nativeStaticCastGlobalRefToString(Object a);
908*65c59e02SInna Palant 
909*65c59e02SInna Palant   @Test
testCorrectDynamicCastGlobalRef()910*65c59e02SInna Palant   public void testCorrectDynamicCastGlobalRef() {
911*65c59e02SInna Palant     assertThat(nativeDynamicCastGlobalRefToString("hello")).isTrue();
912*65c59e02SInna Palant   }
913*65c59e02SInna Palant 
914*65c59e02SInna Palant   @Test(expected = ClassCastException.class)
testIncorrectDynamicCastGlobalRef()915*65c59e02SInna Palant   public void testIncorrectDynamicCastGlobalRef() {
916*65c59e02SInna Palant     nativeDynamicCastGlobalRefToString(new Integer(23));
917*65c59e02SInna Palant   }
918*65c59e02SInna Palant 
919*65c59e02SInna Palant   @Test
testNullDynamicCastGlobalRef()920*65c59e02SInna Palant   public void testNullDynamicCastGlobalRef() {
921*65c59e02SInna Palant     assertThat(nativeDynamicCastGlobalRefToString(null)).isTrue();
922*65c59e02SInna Palant   }
923*65c59e02SInna Palant 
nativeDynamicCastGlobalRefToString(Object a)924*65c59e02SInna Palant   private native boolean nativeDynamicCastGlobalRefToString(Object a);
925*65c59e02SInna Palant 
926*65c59e02SInna Palant   @Test
testCriticalNativeMethodBindsAndCanBeInvoked()927*65c59e02SInna Palant   public void testCriticalNativeMethodBindsAndCanBeInvoked() {
928*65c59e02SInna Palant     assertThat(nativeCriticalNativeMethodBindsAndCanBeInvoked(12, 3.45f)).isTrue();
929*65c59e02SInna Palant   }
930*65c59e02SInna Palant 
nativeCriticalNativeMethodBindsAndCanBeInvoked(int a, float b)931*65c59e02SInna Palant   private static native boolean nativeCriticalNativeMethodBindsAndCanBeInvoked(int a, float b);
932*65c59e02SInna Palant }
933