1*6777b538SAndroid Build Coastguard Worker // Copyright 2024 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/android/jni_bytebuffer.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
8*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard Worker #include <algorithm>
11*6777b538SAndroid Build Coastguard Worker #include <limits>
12*6777b538SAndroid Build Coastguard Worker
13*6777b538SAndroid Build Coastguard Worker #include "base/android/jni_android.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/android/jni_string.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/android/scoped_java_ref.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/containers/span.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/strings/utf_string_conversions.h"
18*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
19*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
20*6777b538SAndroid Build Coastguard Worker
21*6777b538SAndroid Build Coastguard Worker namespace base::android {
22*6777b538SAndroid Build Coastguard Worker
TEST(JniByteBuffer,ConversionDoesNotCopy)23*6777b538SAndroid Build Coastguard Worker TEST(JniByteBuffer, ConversionDoesNotCopy) {
24*6777b538SAndroid Build Coastguard Worker uint8_t bytes[] = {0, 1, 2, 3};
25*6777b538SAndroid Build Coastguard Worker JNIEnv* env = AttachCurrentThread();
26*6777b538SAndroid Build Coastguard Worker
27*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jobject> jbuffer(
28*6777b538SAndroid Build Coastguard Worker env, env->NewDirectByteBuffer(bytes, sizeof(bytes)));
29*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(jbuffer);
30*6777b538SAndroid Build Coastguard Worker
31*6777b538SAndroid Build Coastguard Worker base::span<const uint8_t> span = JavaByteBufferToSpan(env, jbuffer.obj());
32*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(span.data(), bytes);
33*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(span.size(), sizeof(bytes));
34*6777b538SAndroid Build Coastguard Worker }
35*6777b538SAndroid Build Coastguard Worker
36*6777b538SAndroid Build Coastguard Worker // Disabled pending diagnosis: https://crbug.com/1521406
37*6777b538SAndroid Build Coastguard Worker // Specifically, under test, env->GetDirectBufferAddress() is returning non-null
38*6777b538SAndroid Build Coastguard Worker // and env->GetDirectBufferCapacity() is returning >= 0, both of which they are
39*6777b538SAndroid Build Coastguard Worker // not supposed to do in this situation.
TEST(JniByteBuffer,DISABLED_ConversionFromNonBuffer)40*6777b538SAndroid Build Coastguard Worker TEST(JniByteBuffer, DISABLED_ConversionFromNonBuffer) {
41*6777b538SAndroid Build Coastguard Worker JNIEnv* env = AttachCurrentThread();
42*6777b538SAndroid Build Coastguard Worker jclass cls = env->FindClass("java/util/ArrayList");
43*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(cls);
44*6777b538SAndroid Build Coastguard Worker
45*6777b538SAndroid Build Coastguard Worker jmethodID init =
46*6777b538SAndroid Build Coastguard Worker base::android::MethodID::Get<base::android::MethodID::TYPE_INSTANCE>(
47*6777b538SAndroid Build Coastguard Worker env, cls, "<init>", "()V");
48*6777b538SAndroid Build Coastguard Worker
49*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jobject> jnonbuffer(env, env->NewObject(cls, init));
50*6777b538SAndroid Build Coastguard Worker
51*6777b538SAndroid Build Coastguard Worker std::optional<base::span<const uint8_t>> maybe_span =
52*6777b538SAndroid Build Coastguard Worker MaybeJavaByteBufferToSpan(env, jnonbuffer.obj());
53*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(maybe_span.has_value());
54*6777b538SAndroid Build Coastguard Worker }
55*6777b538SAndroid Build Coastguard Worker
TEST(JniByteBuffer,ZeroByteConversionSucceeds)56*6777b538SAndroid Build Coastguard Worker TEST(JniByteBuffer, ZeroByteConversionSucceeds) {
57*6777b538SAndroid Build Coastguard Worker JNIEnv* env = AttachCurrentThread();
58*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jobject> jbuffer(env,
59*6777b538SAndroid Build Coastguard Worker env->NewDirectByteBuffer(nullptr, 0));
60*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(jbuffer);
61*6777b538SAndroid Build Coastguard Worker
62*6777b538SAndroid Build Coastguard Worker base::span<const uint8_t> span = JavaByteBufferToSpan(env, jbuffer.obj());
63*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(span.data(), nullptr);
64*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(span.size(), 0u);
65*6777b538SAndroid Build Coastguard Worker }
66*6777b538SAndroid Build Coastguard Worker
67*6777b538SAndroid Build Coastguard Worker } // namespace base::android
68