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