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.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown; 21*65c59e02SInna Palant 22*65c59e02SInna Palant import com.facebook.soloader.nativeloader.NativeLoader; 23*65c59e02SInna Palant import java.nio.ByteBuffer; 24*65c59e02SInna Palant import java.util.Arrays; 25*65c59e02SInna Palant import java.util.HashSet; 26*65c59e02SInna Palant import java.util.List; 27*65c59e02SInna Palant import java.util.Map; 28*65c59e02SInna Palant import java.util.TreeMap; 29*65c59e02SInna Palant import org.junit.BeforeClass; 30*65c59e02SInna Palant import org.junit.Test; 31*65c59e02SInna Palant 32*65c59e02SInna Palant public class DocTests extends BaseFBJniTests { 33*65c59e02SInna Palant @BeforeClass setup()34*65c59e02SInna Palant public static void setup() { 35*65c59e02SInna Palant BaseFBJniTests.setup(); 36*65c59e02SInna Palant NativeLoader.loadLibrary("doc_tests"); 37*65c59e02SInna Palant } 38*65c59e02SInna Palant toString()39*65c59e02SInna Palant public String toString() { 40*65c59e02SInna Palant return "instance of DocTests"; 41*65c59e02SInna Palant } 42*65c59e02SInna Palant 43*65c59e02SInna Palant // SECTION basic_methods nativeVoidMethod()44*65c59e02SInna Palant native void nativeVoidMethod(); staticNativeVoidMethod()45*65c59e02SInna Palant static native void staticNativeVoidMethod(); voidMethod()46*65c59e02SInna Palant void voidMethod() {} staticVoidMethod()47*65c59e02SInna Palant static void staticVoidMethod() {} 48*65c59e02SInna Palant // END 49*65c59e02SInna Palant 50*65c59e02SInna Palant @Test testVoids()51*65c59e02SInna Palant public void testVoids() { 52*65c59e02SInna Palant nativeVoidMethod(); 53*65c59e02SInna Palant staticNativeVoidMethod(); 54*65c59e02SInna Palant } 55*65c59e02SInna Palant 56*65c59e02SInna Palant // SECTION primitives addSomeNumbers(byte b, short s, int i)57*65c59e02SInna Palant static native long addSomeNumbers(byte b, short s, int i); doubler(int i)58*65c59e02SInna Palant static long doubler(int i) { return i + i; } 59*65c59e02SInna Palant // END 60*65c59e02SInna Palant 61*65c59e02SInna Palant @Test testNumbers()62*65c59e02SInna Palant public void testNumbers() { 63*65c59e02SInna Palant assertThat(addSomeNumbers((byte) 1, (short) 2, 3)).isEqualTo(14); 64*65c59e02SInna Palant } 65*65c59e02SInna Palant 66*65c59e02SInna Palant // SECTION strings 67*65c59e02SInna Palant // Java methods used by the C++ code below. fancyCat(String s1, String s2)68*65c59e02SInna Palant static native String fancyCat(String s1, String s2); getCString()69*65c59e02SInna Palant static native String getCString(); doubler(String s)70*65c59e02SInna Palant static String doubler(String s) { return s + s; } 71*65c59e02SInna Palant // END 72*65c59e02SInna Palant 73*65c59e02SInna Palant @Test testStrings()74*65c59e02SInna Palant public void testStrings() { 75*65c59e02SInna Palant assertThat(fancyCat("a", "b")).isEqualTo("aaabbbb"); 76*65c59e02SInna Palant assertThat(getCString()).isEqualTo("Watch your memory."); 77*65c59e02SInna Palant } 78*65c59e02SInna Palant 79*65c59e02SInna Palant // SECTION primitive_arrays primitiveArrays(int[] arr)80*65c59e02SInna Palant static native int[] primitiveArrays(int[] arr); 81*65c59e02SInna Palant // END 82*65c59e02SInna Palant 83*65c59e02SInna Palant @Test testPrimitiveArrays()84*65c59e02SInna Palant public void testPrimitiveArrays() { 85*65c59e02SInna Palant assertThat(primitiveArrays(new int[] {1, 2})).contains(1, 2, 3); 86*65c59e02SInna Palant } 87*65c59e02SInna Palant convertReferences(MyDerivedClass derived)88*65c59e02SInna Palant static native Object convertReferences(MyDerivedClass derived); 89*65c59e02SInna Palant 90*65c59e02SInna Palant @Test testConvertReferences()91*65c59e02SInna Palant public void testConvertReferences() { 92*65c59e02SInna Palant MyDerivedClass derived = new MyDerivedClass(); 93*65c59e02SInna Palant Object obj = convertReferences(derived); 94*65c59e02SInna Palant assertThat(obj).isSameAs(derived); 95*65c59e02SInna Palant } 96*65c59e02SInna Palant castReferences(MyBaseClass base)97*65c59e02SInna Palant static native void castReferences(MyBaseClass base); 98*65c59e02SInna Palant 99*65c59e02SInna Palant @Test testCastReferences()100*65c59e02SInna Palant public void testCastReferences() { 101*65c59e02SInna Palant castReferences(new MyDerivedClass()); 102*65c59e02SInna Palant try { 103*65c59e02SInna Palant castReferences(new MyBaseClass()); 104*65c59e02SInna Palant failBecauseExceptionWasNotThrown(ClassCastException.class); 105*65c59e02SInna Palant } catch (ClassCastException e) { 106*65c59e02SInna Palant assertThat(e).hasMessageContaining("MyBaseClass"); 107*65c59e02SInna Palant assertThat(e).hasMessageContaining("MyDerivedClass"); 108*65c59e02SInna Palant } 109*65c59e02SInna Palant } 110*65c59e02SInna Palant runConstructor()111*65c59e02SInna Palant static native DataHolder runConstructor(); 112*65c59e02SInna Palant 113*65c59e02SInna Palant @Test testRunConstructor()114*65c59e02SInna Palant public void testRunConstructor() { 115*65c59e02SInna Palant DataHolder d = runConstructor(); 116*65c59e02SInna Palant assertThat(d.i).isEqualTo(1); 117*65c59e02SInna Palant assertThat(d.s).isEqualTo("hi"); 118*65c59e02SInna Palant } 119*65c59e02SInna Palant callGetAndSetFields(DataHolder data)120*65c59e02SInna Palant static native void callGetAndSetFields(DataHolder data); 121*65c59e02SInna Palant 122*65c59e02SInna Palant @Test testCallGetAndSetFields()123*65c59e02SInna Palant public void testCallGetAndSetFields() { 124*65c59e02SInna Palant synchronized (DataHolder.class) { 125*65c59e02SInna Palant DataHolder dh1 = new DataHolder(1, "1"); 126*65c59e02SInna Palant DataHolder dh2 = new DataHolder(3, "3"); 127*65c59e02SInna Palant DataHolder.someInstance = null; 128*65c59e02SInna Palant callGetAndSetFields(dh1); 129*65c59e02SInna Palant assertThat(dh1.i).isEqualTo(2); 130*65c59e02SInna Palant assertThat(dh1.s).isEqualTo("11"); 131*65c59e02SInna Palant assertThat(DataHolder.someInstance).isSameAs(dh1); 132*65c59e02SInna Palant callGetAndSetFields(dh2); 133*65c59e02SInna Palant assertThat(dh2.i).isEqualTo(4); 134*65c59e02SInna Palant assertThat(dh2.s).isEqualTo("31"); 135*65c59e02SInna Palant assertThat(DataHolder.someInstance).isSameAs(dh1); 136*65c59e02SInna Palant DataHolder.someInstance = null; 137*65c59e02SInna Palant } 138*65c59e02SInna Palant } 139*65c59e02SInna Palant showJObject(Object obj, DataHolder data)140*65c59e02SInna Palant static native String showJObject(Object obj, DataHolder data); 141*65c59e02SInna Palant 142*65c59e02SInna Palant @Test testShowJObject()143*65c59e02SInna Palant public void testShowJObject() { 144*65c59e02SInna Palant String str = showJObject(new Object(), new DataHolder(1, "hi")); 145*65c59e02SInna Palant assertThat(str).startsWith("data=com.facebook.jni.DataHolder@"); 146*65c59e02SInna Palant } 147*65c59e02SInna Palant catchAndThrow()148*65c59e02SInna Palant static native void catchAndThrow(); 149*65c59e02SInna Palant 150*65c59e02SInna Palant @Test testCatchAndThrow()151*65c59e02SInna Palant public void testCatchAndThrow() { 152*65c59e02SInna Palant try { 153*65c59e02SInna Palant catchAndThrow(); 154*65c59e02SInna Palant failBecauseExceptionWasNotThrown(RuntimeException.class); 155*65c59e02SInna Palant } catch (RuntimeException e) { 156*65c59e02SInna Palant assertThat(e) 157*65c59e02SInna Palant .hasMessageStartingWith("Caught 'java.lang.NoSuchMethodError:") 158*65c59e02SInna Palant .hasMessageContaining("doesNotExist") 159*65c59e02SInna Palant ; 160*65c59e02SInna Palant } 161*65c59e02SInna Palant } 162*65c59e02SInna Palant 163*65c59e02SInna Palant // SECTION boxed scaleUp(Integer number)164*65c59e02SInna Palant static native Double scaleUp(Integer number); 165*65c59e02SInna Palant // END 166*65c59e02SInna Palant 167*65c59e02SInna Palant @Test testScaleUp()168*65c59e02SInna Palant public void testScaleUp() { 169*65c59e02SInna Palant assertThat(scaleUp(5)).isEqualTo(7.5); 170*65c59e02SInna Palant } 171*65c59e02SInna Palant 172*65c59e02SInna Palant // SECTION iterables concatMatches(List<Integer> values, Map<String, Integer> names)173*65c59e02SInna Palant static native String concatMatches(List<Integer> values, Map<String, Integer> names); 174*65c59e02SInna Palant // END 175*65c59e02SInna Palant 176*65c59e02SInna Palant @Test testConcatMatches()177*65c59e02SInna Palant public void testConcatMatches() { 178*65c59e02SInna Palant Map<String, Integer> names = new TreeMap<>(); 179*65c59e02SInna Palant names.put("a", 1); 180*65c59e02SInna Palant names.put("b", 3); 181*65c59e02SInna Palant names.put("c", 3); 182*65c59e02SInna Palant names.put("d", 7); 183*65c59e02SInna Palant assertThat(concatMatches(Arrays.asList(1, 2), names)).isEqualTo("bc"); 184*65c59e02SInna Palant } 185*65c59e02SInna Palant 186*65c59e02SInna Palant // SECTION collections buildCollections()187*65c59e02SInna Palant static native Map<String, List<Integer>> buildCollections(); 188*65c59e02SInna Palant // END 189*65c59e02SInna Palant 190*65c59e02SInna Palant @Test testBuildCollections()191*65c59e02SInna Palant public void testBuildCollections() { 192*65c59e02SInna Palant Map<String, List<Integer>> ret = buildCollections(); 193*65c59e02SInna Palant assertThat(ret.keySet()).isEqualTo(new HashSet<>(Arrays.asList("primes"))); 194*65c59e02SInna Palant assertThat(ret.get("primes")).isEqualTo(Arrays.asList(2, 3)); 195*65c59e02SInna Palant } 196*65c59e02SInna Palant 197*65c59e02SInna Palant // SECTION byte_buffer transformBuffer(ByteBuffer data)198*65c59e02SInna Palant static native ByteBuffer transformBuffer(ByteBuffer data); receiveBuffer(ByteBuffer buffer)199*65c59e02SInna Palant static void receiveBuffer(ByteBuffer buffer) { 200*65c59e02SInna Palant assertThat(buffer.capacity()).isEqualTo(2); 201*65c59e02SInna Palant assertThat(buffer.get(0)).isEqualTo((byte)2); 202*65c59e02SInna Palant assertThat(buffer.get(1)).isEqualTo((byte)3); 203*65c59e02SInna Palant } 204*65c59e02SInna Palant @Test testByteBuffers()205*65c59e02SInna Palant public void testByteBuffers() { 206*65c59e02SInna Palant ByteBuffer data = ByteBuffer.allocateDirect(2); 207*65c59e02SInna Palant data.put(new byte[] {1, 2}); 208*65c59e02SInna Palant ByteBuffer transformed = transformBuffer(data); 209*65c59e02SInna Palant receiveBuffer(transformed); 210*65c59e02SInna Palant } 211*65c59e02SInna Palant // END 212*65c59e02SInna Palant } 213*65c59e02SInna Palant 214*65c59e02SInna Palant // SECTION inheritance 215*65c59e02SInna Palant class MyBaseClass {} 216*65c59e02SInna Palant class MyDerivedClass extends MyBaseClass {} 217*65c59e02SInna Palant // END 218*65c59e02SInna Palant 219*65c59e02SInna Palant // SECTION nested_class 220*65c59e02SInna Palant class Outer { 221*65c59e02SInna Palant class Nested {} 222*65c59e02SInna Palant } 223*65c59e02SInna Palant // END 224*65c59e02SInna Palant 225*65c59e02SInna Palant // SECTION constructor 226*65c59e02SInna Palant class DataHolder { 227*65c59e02SInna Palant int i; 228*65c59e02SInna Palant String s; DataHolder(int i, String s)229*65c59e02SInna Palant DataHolder(int i, String s) { 230*65c59e02SInna Palant this.i = i; 231*65c59e02SInna Palant this.s = s; 232*65c59e02SInna Palant } 233*65c59e02SInna Palant static DataHolder someInstance; 234*65c59e02SInna Palant } 235*65c59e02SInna Palant // END 236