xref: /aosp_15_r20/external/fbjni/test/jni/byte_buffer_tests.cpp (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 #include <vector>
18*65c59e02SInna Palant 
19*65c59e02SInna Palant #include <fbjni/ByteBuffer.h>
20*65c59e02SInna Palant #include <fbjni/fbjni.h>
21*65c59e02SInna Palant 
22*65c59e02SInna Palant #include "expect.h"
23*65c59e02SInna Palant 
24*65c59e02SInna Palant using namespace facebook::jni;
25*65c59e02SInna Palant 
26*65c59e02SInna Palant namespace {
27*65c59e02SInna Palant 
28*65c59e02SInna Palant std::vector<uint8_t> vec{1, 0, 0, 0};
29*65c59e02SInna Palant 
ByteBufferCapacity(alias_ref<JByteBuffer> buffer)30*65c59e02SInna Palant size_t ByteBufferCapacity(alias_ref<JByteBuffer> buffer) {
31*65c59e02SInna Palant   static auto meth =
32*65c59e02SInna Palant       JByteBuffer::javaClassStatic()->getMethod<int()>("capacity");
33*65c59e02SInna Palant   return meth(buffer);
34*65c59e02SInna Palant }
35*65c59e02SInna Palant 
testDirectByteBuffer(JNIEnv *,jclass)36*65c59e02SInna Palant jboolean testDirectByteBuffer(JNIEnv*, jclass) {
37*65c59e02SInna Palant   std::vector<uint8_t> vec{5, 4, 3, 2, 1, 0};
38*65c59e02SInna Palant   auto nbb = JByteBuffer::wrapBytes(vec.data(), vec.size());
39*65c59e02SInna Palant 
40*65c59e02SInna Palant   EXPECT(ByteBufferCapacity(nbb) == vec.size());
41*65c59e02SInna Palant   EXPECT(nbb->isDirect());
42*65c59e02SInna Palant   EXPECT(nbb->getDirectSize() == vec.size());
43*65c59e02SInna Palant 
44*65c59e02SInna Palant   auto bytes = nbb->getDirectBytes();
45*65c59e02SInna Palant 
46*65c59e02SInna Palant   for (size_t i = 0; i < vec.size(); i++) {
47*65c59e02SInna Palant     EXPECT(bytes[i] == vec[i]);
48*65c59e02SInna Palant   }
49*65c59e02SInna Palant   return JNI_TRUE;
50*65c59e02SInna Palant }
51*65c59e02SInna Palant 
testEmptyDirectByteBuffer(JNIEnv *,jclass)52*65c59e02SInna Palant jboolean testEmptyDirectByteBuffer(JNIEnv*, jclass) {
53*65c59e02SInna Palant   uint8_t data;
54*65c59e02SInna Palant   auto nbb = JByteBuffer::wrapBytes(&data, 0);
55*65c59e02SInna Palant 
56*65c59e02SInna Palant   EXPECT(ByteBufferCapacity(nbb) == 0);
57*65c59e02SInna Palant   EXPECT(nbb->isDirect());
58*65c59e02SInna Palant   EXPECT(nbb->getDirectSize() == 0);
59*65c59e02SInna Palant 
60*65c59e02SInna Palant   return JNI_TRUE;
61*65c59e02SInna Palant }
62*65c59e02SInna Palant 
testRewindBuffer(alias_ref<jobject> self)63*65c59e02SInna Palant jboolean testRewindBuffer(alias_ref<jobject> self) {
64*65c59e02SInna Palant   std::vector<uint8_t> vec{0, 0, 0, 0, 0, 0, 0, 0};
65*65c59e02SInna Palant   auto nbb = JByteBuffer::wrapBytes(vec.data(), vec.size());
66*65c59e02SInna Palant 
67*65c59e02SInna Palant   auto cls = self->getClass();
68*65c59e02SInna Palant   auto writeBytes =
69*65c59e02SInna Palant       cls->getStaticMethod<void(JByteBuffer, jbyte, jbyte, jbyte, jbyte)>(
70*65c59e02SInna Palant           "writeBytes");
71*65c59e02SInna Palant 
72*65c59e02SInna Palant   writeBytes(cls, *nbb, 0, 1, 2, 3);
73*65c59e02SInna Palant   nbb->rewind();
74*65c59e02SInna Palant   writeBytes(cls, *nbb, 4, 5, 6, 7);
75*65c59e02SInna Palant 
76*65c59e02SInna Palant   EXPECT(vec[0] == 4);
77*65c59e02SInna Palant   EXPECT(vec[1] == 5);
78*65c59e02SInna Palant   EXPECT(vec[2] == 6);
79*65c59e02SInna Palant   EXPECT(vec[3] == 7);
80*65c59e02SInna Palant   EXPECT(vec[4] == 0);
81*65c59e02SInna Palant   EXPECT(vec[5] == 0);
82*65c59e02SInna Palant   EXPECT(vec[6] == 0);
83*65c59e02SInna Palant   EXPECT(vec[7] == 0);
84*65c59e02SInna Palant 
85*65c59e02SInna Palant   return JNI_TRUE;
86*65c59e02SInna Palant }
87*65c59e02SInna Palant 
nativeAllocateDirect(alias_ref<jobject> self,int size)88*65c59e02SInna Palant local_ref<JByteBuffer> nativeAllocateDirect(alias_ref<jobject> self, int size) {
89*65c59e02SInna Palant   return JByteBuffer::allocateDirect(size);
90*65c59e02SInna Palant }
91*65c59e02SInna Palant 
testFloatBuffer(alias_ref<jobject> self,alias_ref<facebook::jni::JBuffer> buffer)92*65c59e02SInna Palant jboolean testFloatBuffer(
93*65c59e02SInna Palant     alias_ref<jobject> self,
94*65c59e02SInna Palant     alias_ref<facebook::jni::JBuffer> buffer) {
95*65c59e02SInna Palant   EXPECT(buffer->isDirect());
96*65c59e02SInna Palant   EXPECT(buffer->getDirectCapacity() == 5);
97*65c59e02SInna Palant   float* raw = (float*)buffer->getDirectAddress();
98*65c59e02SInna Palant   EXPECT(raw);
99*65c59e02SInna Palant 
100*65c59e02SInna Palant   EXPECT(raw[0] == 1);
101*65c59e02SInna Palant   EXPECT(raw[1] == 2);
102*65c59e02SInna Palant   EXPECT(raw[2] == 2.5);
103*65c59e02SInna Palant   EXPECT(raw[3] == 2.75);
104*65c59e02SInna Palant   EXPECT(raw[4] == 3);
105*65c59e02SInna Palant 
106*65c59e02SInna Palant   return JNI_TRUE;
107*65c59e02SInna Palant }
108*65c59e02SInna Palant 
nativeByteBufferOrder(alias_ref<jobject> self)109*65c59e02SInna Palant local_ref<JByteBuffer> nativeByteBufferOrder(alias_ref<jobject> self) {
110*65c59e02SInna Palant   auto nbb = JByteBuffer::wrapBytes(vec.data(), vec.size());
111*65c59e02SInna Palant   return nbb->order(JByteOrder::nativeOrder());
112*65c59e02SInna Palant }
113*65c59e02SInna Palant 
114*65c59e02SInna Palant } // namespace
115*65c59e02SInna Palant 
RegisterByteBufferTests()116*65c59e02SInna Palant void RegisterByteBufferTests() {
117*65c59e02SInna Palant   registerNatives(
118*65c59e02SInna Palant       "com/facebook/jni/ByteBufferTests",
119*65c59e02SInna Palant       {
120*65c59e02SInna Palant           makeNativeMethod("nativeTestDirectByteBuffer", testDirectByteBuffer),
121*65c59e02SInna Palant           makeNativeMethod(
122*65c59e02SInna Palant               "nativeTestEmptyDirectByteBuffer", testEmptyDirectByteBuffer),
123*65c59e02SInna Palant           makeNativeMethod("nativeTestRewindBuffer", testRewindBuffer),
124*65c59e02SInna Palant           makeNativeMethod("nativeAllocateDirect", nativeAllocateDirect),
125*65c59e02SInna Palant           makeNativeMethod("nativeTestFloatBuffer", testFloatBuffer),
126*65c59e02SInna Palant           makeNativeMethod("nativeByteBufferOrder", nativeByteBufferOrder),
127*65c59e02SInna Palant       });
128*65c59e02SInna Palant }
129