| Index: base/android/scoped_java_ref_unittest.cc
|
| diff --git a/base/android/scoped_java_ref_unittest.cc b/base/android/scoped_java_ref_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a6dfc7a6ef22f6cdf6b1247c4497da606ece6228
|
| --- /dev/null
|
| +++ b/base/android/scoped_java_ref_unittest.cc
|
| @@ -0,0 +1,114 @@
|
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "base/android/scoped_java_ref.h"
|
| +
|
| +#include "base/android/jni_android.h"
|
| +#include "base/android/jni_string.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace base {
|
| +namespace android {
|
| +
|
| +namespace {
|
| +int g_local_refs = 0;
|
| +int g_global_refs = 0;
|
| +
|
| +jobject NewGlobalRef(JNIEnv* env, jobject obj) {
|
| + ++g_global_refs;
|
| + return AttachCurrentThread()->NewGlobalRef(obj);
|
| +}
|
| +
|
| +void DeleteGlobalRef(JNIEnv* env, jobject obj) {
|
| + --g_global_refs;
|
| + return AttachCurrentThread()->DeleteGlobalRef(obj);
|
| +}
|
| +
|
| +jobject NewLocalRef(JNIEnv* env, jobject obj) {
|
| + ++g_local_refs;
|
| + return AttachCurrentThread()->NewLocalRef(obj);
|
| +}
|
| +
|
| +void DeleteLocalRef(JNIEnv* env, jobject obj) {
|
| + --g_local_refs;
|
| + return AttachCurrentThread()->DeleteLocalRef(obj);
|
| +}
|
| +} // namespace
|
| +
|
| +class ScopedJavaRefTest : public testing::Test {
|
| + protected:
|
| + virtual void SetUp() {
|
| + g_local_refs = 0;
|
| + g_global_refs = 0;
|
| + JNIEnv* env = AttachCurrentThread();
|
| + counting_env = *env;
|
| + counting_functions = *counting_env.functions;
|
| + counting_functions.NewGlobalRef = &NewGlobalRef;
|
| + counting_functions.DeleteGlobalRef = &DeleteGlobalRef;
|
| + counting_functions.NewLocalRef = &NewLocalRef;
|
| + counting_functions.DeleteLocalRef = &DeleteLocalRef;
|
| + counting_env.functions = &counting_functions;
|
| + }
|
| +
|
| + // Special JNI env configured in SetUp to count in and out all local & global
|
| + // reference instances. Be careful to only use this with the ScopedJavaRef
|
| + // classes under test, else it's easy to get system references counted in
|
| + // here too.
|
| + JNIEnv counting_env;
|
| + JNINativeInterface counting_functions;
|
| +};
|
| +
|
| +// The main purpose of this is testing the various conversions compile.
|
| +TEST_F(ScopedJavaRefTest, Conversions) {
|
| + JNIEnv* env = AttachCurrentThread();
|
| + ScopedJavaLocalRef<jstring> str(env, ConvertUTF8ToJavaString(env, "string"));
|
| + ScopedJavaGlobalRef<jstring> global(str);
|
| + {
|
| + ScopedJavaGlobalRef<jobject> global_obj(str);
|
| + ScopedJavaLocalRef<jobject> local_obj(global);
|
| + const JavaRef<jobject>& obj_ref1(str);
|
| + const JavaRef<jobject>& obj_ref2(global);
|
| + EXPECT_TRUE(env->IsSameObject(obj_ref1.obj(), obj_ref2.obj()));
|
| + EXPECT_TRUE(env->IsSameObject(global_obj.obj(), obj_ref2.obj()));
|
| + }
|
| + global.Reset(str);
|
| + const JavaRef<jstring>& str_ref = str;
|
| + EXPECT_EQ("string", ConvertJavaStringToUTF8(env, str_ref.obj()));
|
| + str.Reset();
|
| +}
|
| +
|
| +TEST_F(ScopedJavaRefTest, RefCounts) {
|
| + ScopedJavaLocalRef<jstring> str;
|
| + str.Reset(&counting_env, ConvertUTF8ToJavaString(AttachCurrentThread(),
|
| + "string"));
|
| + EXPECT_EQ(1, g_local_refs);
|
| + EXPECT_EQ(0, g_global_refs);
|
| +
|
| + {
|
| + ScopedJavaGlobalRef<jstring> global_str(str);
|
| + ScopedJavaGlobalRef<jobject> global_obj(global_str);
|
| + EXPECT_EQ(1, g_local_refs);
|
| + EXPECT_EQ(2, g_global_refs);
|
| +
|
| + ScopedJavaLocalRef<jstring> str2(&counting_env, str.Release());
|
| + EXPECT_EQ(1, g_local_refs);
|
| + {
|
| + ScopedJavaLocalRef<jstring> str3(str2);
|
| + EXPECT_EQ(2, g_local_refs);
|
| + }
|
| + EXPECT_EQ(1, g_local_refs);
|
| + str2.Reset();
|
| + EXPECT_EQ(0, g_local_refs);
|
| + global_str.Reset();
|
| + EXPECT_EQ(1, g_global_refs);
|
| + ScopedJavaGlobalRef<jobject> global_obj2(global_obj);
|
| + EXPECT_EQ(2, g_global_refs);
|
| + }
|
| +
|
| + EXPECT_EQ(0, g_local_refs);
|
| + EXPECT_EQ(0, g_global_refs);
|
| +}
|
| +
|
| +} // namespace android
|
| +} // namespace base
|
|
|