xref: /aosp_15_r20/external/fbjni/test/DocTests.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.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