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