jni_internal_test.cc revision 00f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abac
12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/*
22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2011 The Android Open Source Project
32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License.
62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at
72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software
112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and
142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License.
152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */
160c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes
179b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro#include "jni_internal.h"
189b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
190cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers#include <cmath>
200cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers
219b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro#include "common_test.h"
22726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes#include "ScopedLocalRef.h"
230c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes
240c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughesnamespace art {
250c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes
26f734cf55d510976f4862b15e35fc86eae2a3daf8Brian Carlstromclass JniInternalTest : public CommonTest {
27c7ac37f0b8b64cfb53d8b9cc8dddbb34be3dd5eeElliott Hughes protected:
28c7ac37f0b8b64cfb53d8b9cc8dddbb34be3dd5eeElliott Hughes  virtual void SetUp() {
29f734cf55d510976f4862b15e35fc86eae2a3daf8Brian Carlstrom    CommonTest::SetUp();
305174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes
31a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes    vm_ = Runtime::Current()->GetJavaVM();
32a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes
335174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes    // Turn on -verbose:jni for the JNI tests.
344dd9b4d95eec9db5338fb9bf132f9bb8facf6cf4Elliott Hughes    gLogVerbosity.jni = true;
355174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes
364d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom    vm_->AttachCurrentThread(&env_, NULL);
37b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes
38726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes    ScopedLocalRef<jclass> aioobe(env_, env_->FindClass("java/lang/ArrayIndexOutOfBoundsException"));
39726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes    CHECK(aioobe.get() != NULL);
40726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes    aioobe_ = reinterpret_cast<jclass>(env_->NewGlobalRef(aioobe.get()));
41b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes
42b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes    ScopedLocalRef<jclass> ase(env_, env_->FindClass("java/lang/ArrayStoreException"));
43b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes    CHECK(ase.get() != NULL);
44b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes    ase_ = reinterpret_cast<jclass>(env_->NewGlobalRef(ase.get()));
45b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes
46726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes    ScopedLocalRef<jclass> sioobe(env_, env_->FindClass("java/lang/StringIndexOutOfBoundsException"));
47726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes    CHECK(sioobe.get() != NULL);
48726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes    sioobe_ = reinterpret_cast<jclass>(env_->NewGlobalRef(sioobe.get()));
49726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes  }
50726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes
514d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom  void CleanUpJniEnv() {
524d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom    if (aioobe_ != NULL) {
534d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom      env_->DeleteGlobalRef(aioobe_);
544d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom      aioobe_ = NULL;
554d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom    }
564d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom    if (ase_ != NULL) {
574d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom      env_->DeleteGlobalRef(ase_);
584d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom      ase_ = NULL;
594d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom    }
604d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom    if (sioobe_ != NULL) {
614d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom      env_->DeleteGlobalRef(sioobe_);
624d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom      sioobe_ = NULL;
634d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom    }
644d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom  }
654d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom
66726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes  virtual void TearDown() {
674d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom    CleanUpJniEnv();
68726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes    CommonTest::TearDown();
69c7ac37f0b8b64cfb53d8b9cc8dddbb34be3dd5eeElliott Hughes  }
70b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes
7100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  Method::InvokeStub* DoCompile(Method*& method, Object*& receiver, bool is_static,
7200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers                                const char* method_name, const char* method_signature)
7300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) {
7477405796564c6c1353807cda18b28678a719bd68Elliott Hughes    const char* class_name = is_static ? "StaticLeafMethods" : "NonStaticLeafMethods";
7500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers    jobject jclass_loader(LoadDex(class_name));
7600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers    SirtRef<ClassLoader> class_loader(ScopedObjectAccessUnchecked(Thread::Current()).Decode<ClassLoader*>(jclass_loader));
7777405796564c6c1353807cda18b28678a719bd68Elliott Hughes    if (is_static) {
7877405796564c6c1353807cda18b28678a719bd68Elliott Hughes      CompileDirectMethod(class_loader.get(), class_name, method_name, method_signature);
7977405796564c6c1353807cda18b28678a719bd68Elliott Hughes    } else {
8077405796564c6c1353807cda18b28678a719bd68Elliott Hughes      CompileVirtualMethod(NULL, "java.lang.Class", "isFinalizable", "()Z");
8177405796564c6c1353807cda18b28678a719bd68Elliott Hughes      CompileDirectMethod(NULL, "java.lang.Object", "<init>", "()V");
8277405796564c6c1353807cda18b28678a719bd68Elliott Hughes      CompileVirtualMethod(class_loader.get(), class_name, method_name, method_signature);
8377405796564c6c1353807cda18b28678a719bd68Elliott Hughes    }
8477405796564c6c1353807cda18b28678a719bd68Elliott Hughes
8577405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Class* c = class_linker_->FindClass(DotToDescriptor(class_name).c_str(), class_loader.get());
8677405796564c6c1353807cda18b28678a719bd68Elliott Hughes    CHECK(c != NULL);
8777405796564c6c1353807cda18b28678a719bd68Elliott Hughes
8800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers    method = is_static ? c->FindDirectMethod(method_name, method_signature)
8900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers                       : c->FindVirtualMethod(method_name, method_signature);
9077405796564c6c1353807cda18b28678a719bd68Elliott Hughes    CHECK(method != NULL);
9177405796564c6c1353807cda18b28678a719bd68Elliott Hughes
9277405796564c6c1353807cda18b28678a719bd68Elliott Hughes    receiver = (is_static ? NULL : c->AllocObject());
9377405796564c6c1353807cda18b28678a719bd68Elliott Hughes
9477405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Method::InvokeStub* stub = method->GetInvokeStub();
9577405796564c6c1353807cda18b28678a719bd68Elliott Hughes    CHECK(stub != NULL);
9677405796564c6c1353807cda18b28678a719bd68Elliott Hughes
9777405796564c6c1353807cda18b28678a719bd68Elliott Hughes    return stub;
9877405796564c6c1353807cda18b28678a719bd68Elliott Hughes  }
9977405796564c6c1353807cda18b28678a719bd68Elliott Hughes
10000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void InvokeNopMethod(bool is_static) SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) {
10177405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Method* method;
10277405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Object* receiver;
10377405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Method::InvokeStub* stub = DoCompile(method, receiver, is_static, "nop", "()V");
10477405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, receiver, Thread::Current(), NULL, NULL);
10577405796564c6c1353807cda18b28678a719bd68Elliott Hughes  }
10677405796564c6c1353807cda18b28678a719bd68Elliott Hughes
10700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void InvokeIdentityByteMethod(bool is_static)
10800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) {
10977405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Method* method;
11077405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Object* receiver;
11177405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Method::InvokeStub* stub = DoCompile(method, receiver, is_static, "identity", "(B)B");
11277405796564c6c1353807cda18b28678a719bd68Elliott Hughes
11377405796564c6c1353807cda18b28678a719bd68Elliott Hughes    JValue args[1];
11477405796564c6c1353807cda18b28678a719bd68Elliott Hughes    JValue result;
11577405796564c6c1353807cda18b28678a719bd68Elliott Hughes
116f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetB(0);
117f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetB(-1);
11877405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, receiver, Thread::Current(), args, &result);
119f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(0, result.GetB());
12077405796564c6c1353807cda18b28678a719bd68Elliott Hughes
121f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetB(-1);
122f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetB(0);
12377405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, receiver, Thread::Current(), args, &result);
124f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(-1, result.GetB());
12577405796564c6c1353807cda18b28678a719bd68Elliott Hughes
126f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetB(SCHAR_MAX);
127f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetB(0);
12877405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, receiver, Thread::Current(), args, &result);
129f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(SCHAR_MAX, result.GetB());
13077405796564c6c1353807cda18b28678a719bd68Elliott Hughes
131f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetB(SCHAR_MIN);
132f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetB(0);
13377405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, receiver, Thread::Current(), args, &result);
134f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(SCHAR_MIN, result.GetB());
13577405796564c6c1353807cda18b28678a719bd68Elliott Hughes  }
13677405796564c6c1353807cda18b28678a719bd68Elliott Hughes
13700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void InvokeIdentityIntMethod(bool is_static)
13800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) {
13977405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Method* method;
14077405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Object* receiver;
14177405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Method::InvokeStub* stub = DoCompile(method, receiver, is_static, "identity", "(I)I");
14277405796564c6c1353807cda18b28678a719bd68Elliott Hughes
14377405796564c6c1353807cda18b28678a719bd68Elliott Hughes    JValue args[1];
14477405796564c6c1353807cda18b28678a719bd68Elliott Hughes    JValue result;
14577405796564c6c1353807cda18b28678a719bd68Elliott Hughes
146f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetI(0);
147f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetI(-1);
14877405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, receiver, Thread::Current(), args, &result);
149f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(0, result.GetI());
15077405796564c6c1353807cda18b28678a719bd68Elliott Hughes
151f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetI(-1);
152f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetI(0);
15377405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, receiver, Thread::Current(), args, &result);
154f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(-1, result.GetI());
15577405796564c6c1353807cda18b28678a719bd68Elliott Hughes
156f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetI(INT_MAX);
157f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetI(0);
15877405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, receiver, Thread::Current(), args, &result);
159f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(INT_MAX, result.GetI());
16077405796564c6c1353807cda18b28678a719bd68Elliott Hughes
161f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetI(INT_MIN);
162f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetI(0);
16377405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, receiver, Thread::Current(), args, &result);
164f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(INT_MIN, result.GetI());
16577405796564c6c1353807cda18b28678a719bd68Elliott Hughes  }
16677405796564c6c1353807cda18b28678a719bd68Elliott Hughes
16700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void InvokeIdentityDoubleMethod(bool is_static)
16800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) {
16977405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Method* method;
17077405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Object* receiver;
17177405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Method::InvokeStub* stub = DoCompile(method, receiver, is_static, "identity", "(D)D");
17277405796564c6c1353807cda18b28678a719bd68Elliott Hughes
17377405796564c6c1353807cda18b28678a719bd68Elliott Hughes    JValue args[1];
17477405796564c6c1353807cda18b28678a719bd68Elliott Hughes    JValue result;
17577405796564c6c1353807cda18b28678a719bd68Elliott Hughes
176f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetD(0.0);
177f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetD(-1.0);
17877405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, receiver, Thread::Current(), args, &result);
179f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(0.0, result.GetD());
18077405796564c6c1353807cda18b28678a719bd68Elliott Hughes
181f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetD(-1.0);
182f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetD(0.0);
18377405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, receiver, Thread::Current(), args, &result);
184f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(-1.0, result.GetD());
18577405796564c6c1353807cda18b28678a719bd68Elliott Hughes
186f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetD(DBL_MAX);
187f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetD(0.0);
18877405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, receiver, Thread::Current(), args, &result);
189f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(DBL_MAX, result.GetD());
19077405796564c6c1353807cda18b28678a719bd68Elliott Hughes
191f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetD(DBL_MIN);
192f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetD(0.0);
19377405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, receiver, Thread::Current(), args, &result);
194f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(DBL_MIN, result.GetD());
19577405796564c6c1353807cda18b28678a719bd68Elliott Hughes  }
19677405796564c6c1353807cda18b28678a719bd68Elliott Hughes
19700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void InvokeSumIntIntMethod(bool is_static)
19800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) {
19977405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Method* method;
20077405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Object* receiver;
20177405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Method::InvokeStub* stub = DoCompile(method, receiver, is_static, "sum", "(II)I");
20277405796564c6c1353807cda18b28678a719bd68Elliott Hughes
20377405796564c6c1353807cda18b28678a719bd68Elliott Hughes    JValue result;
204f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetI(-1);
20577405796564c6c1353807cda18b28678a719bd68Elliott Hughes    JValue args[2];
206f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetI(0);
207f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetI(0);
20877405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
209f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(0, result.GetI());
21077405796564c6c1353807cda18b28678a719bd68Elliott Hughes
211f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetI(0);
212f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetI(1);
213f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetI(2);
21477405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
215f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(3, result.GetI());
21677405796564c6c1353807cda18b28678a719bd68Elliott Hughes
217f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetI(0);
218f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetI(-2);
219f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetI(5);
22077405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
221f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(3, result.GetI());
22277405796564c6c1353807cda18b28678a719bd68Elliott Hughes
223f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetI(1234);
224f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetI(INT_MAX);
225f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetI(INT_MIN);
22677405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
227f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(-1, result.GetI());
22877405796564c6c1353807cda18b28678a719bd68Elliott Hughes
229f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetI(INT_MIN);
230f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetI(INT_MAX);
231f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetI(INT_MAX);
23277405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
233f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(-2, result.GetI());
23477405796564c6c1353807cda18b28678a719bd68Elliott Hughes  }
23577405796564c6c1353807cda18b28678a719bd68Elliott Hughes
23600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void InvokeSumIntIntIntMethod(bool is_static)
23700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) {
23877405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Method* method;
23977405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Object* receiver;
24077405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Method::InvokeStub* stub = DoCompile(method, receiver, is_static, "sum", "(III)I");
24177405796564c6c1353807cda18b28678a719bd68Elliott Hughes
24277405796564c6c1353807cda18b28678a719bd68Elliott Hughes    JValue result;
243f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetI(-1);
24477405796564c6c1353807cda18b28678a719bd68Elliott Hughes    JValue args[3];
245f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetI(0);
246f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetI(0);
247f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[2].SetI(0);
24877405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
249f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(0, result.GetI());
25077405796564c6c1353807cda18b28678a719bd68Elliott Hughes
251f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetI(0);
252f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetI(1);
253f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetI(2);
254f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[2].SetI(3);
25577405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
256f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(6, result.GetI());
25777405796564c6c1353807cda18b28678a719bd68Elliott Hughes
258f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetI(0);
259f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetI(-1);
260f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetI(2);
261f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[2].SetI(-3);
26277405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
263f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(-2, result.GetI());
26477405796564c6c1353807cda18b28678a719bd68Elliott Hughes
265f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetI(1234);
266f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetI(INT_MAX);
267f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetI(INT_MIN);
268f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[2].SetI(INT_MAX);
26977405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
270f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(2147483646, result.GetI());
27177405796564c6c1353807cda18b28678a719bd68Elliott Hughes
272f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetI(INT_MIN);
273f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetI(INT_MAX);
274f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetI(INT_MAX);
275f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[2].SetI(INT_MAX);
27677405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
277f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(2147483645, result.GetI());
27877405796564c6c1353807cda18b28678a719bd68Elliott Hughes  }
27977405796564c6c1353807cda18b28678a719bd68Elliott Hughes
28000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void InvokeSumIntIntIntIntMethod(bool is_static)
28100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) {
28277405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Method* method;
28377405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Object* receiver;
28477405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Method::InvokeStub* stub = DoCompile(method, receiver, is_static, "sum", "(IIII)I");
28577405796564c6c1353807cda18b28678a719bd68Elliott Hughes
28677405796564c6c1353807cda18b28678a719bd68Elliott Hughes    JValue result;
287f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetI(-1);
28877405796564c6c1353807cda18b28678a719bd68Elliott Hughes    JValue args[4];
289f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetI(0);
290f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetI(0);
291f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[2].SetI(0);
292f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[3].SetI(0);
29377405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
294f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(0, result.GetI());
29577405796564c6c1353807cda18b28678a719bd68Elliott Hughes
296f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetI(0);
297f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetI(1);
298f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetI(2);
299f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[2].SetI(3);
300f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[3].SetI(4);
30177405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
302f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(10, result.GetI());
30377405796564c6c1353807cda18b28678a719bd68Elliott Hughes
304f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetI(0);
305f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetI(-1);
306f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetI(2);
307f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[2].SetI(-3);
308f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[3].SetI(4);
30977405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
310f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(2, result.GetI());
31177405796564c6c1353807cda18b28678a719bd68Elliott Hughes
312f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetI(1234);
313f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetI(INT_MAX);
314f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetI(INT_MIN);
315f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[2].SetI(INT_MAX);
316f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[3].SetI(INT_MIN);
31777405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
318f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(-2, result.GetI());
31977405796564c6c1353807cda18b28678a719bd68Elliott Hughes
320f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetI(INT_MIN);
321f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetI(INT_MAX);
322f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetI(INT_MAX);
323f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[2].SetI(INT_MAX);
324f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[3].SetI(INT_MAX);
32577405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
326f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(-4, result.GetI());
32777405796564c6c1353807cda18b28678a719bd68Elliott Hughes  }
32877405796564c6c1353807cda18b28678a719bd68Elliott Hughes
32900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void InvokeSumIntIntIntIntIntMethod(bool is_static)
33000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) {
33177405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Method* method;
33277405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Object* receiver;
33377405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Method::InvokeStub* stub = DoCompile(method, receiver, is_static, "sum", "(IIIII)I");
33477405796564c6c1353807cda18b28678a719bd68Elliott Hughes
33577405796564c6c1353807cda18b28678a719bd68Elliott Hughes    JValue result;
336f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetI(-1.0);
33777405796564c6c1353807cda18b28678a719bd68Elliott Hughes    JValue args[5];
338f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetI(0);
339f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetI(0);
340f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[2].SetI(0);
341f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[3].SetI(0);
342f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[4].SetI(0);
34377405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
344f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(0, result.GetI());
345f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes
346f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetI(0);
347f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetI(1);
348f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetI(2);
349f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[2].SetI(3);
350f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[3].SetI(4);
351f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[4].SetI(5);
35277405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
353f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(15, result.GetI());
354f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes
355f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetI(0);
356f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetI(-1);
357f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetI(2);
358f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[2].SetI(-3);
359f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[3].SetI(4);
360f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[4].SetI(-5);
36177405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
362f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(-3, result.GetI());
363f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes
364f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetI(1234);
365f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetI(INT_MAX);
366f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetI(INT_MIN);
367f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[2].SetI(INT_MAX);
368f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[3].SetI(INT_MIN);
369f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[4].SetI(INT_MAX);
37077405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
371f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(2147483645, result.GetI());
372f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes
373f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetI(INT_MIN);
374f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetI(INT_MAX);
375f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetI(INT_MAX);
376f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[2].SetI(INT_MAX);
377f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[3].SetI(INT_MAX);
378f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[4].SetI(INT_MAX);
37977405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
380f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(2147483643, result.GetI());
38177405796564c6c1353807cda18b28678a719bd68Elliott Hughes  }
38277405796564c6c1353807cda18b28678a719bd68Elliott Hughes
38300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void InvokeSumDoubleDoubleMethod(bool is_static)
38400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) {
38577405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Method* method;
38677405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Object* receiver;
38777405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Method::InvokeStub* stub = DoCompile(method, receiver, is_static, "sum", "(DD)D");
38877405796564c6c1353807cda18b28678a719bd68Elliott Hughes
38977405796564c6c1353807cda18b28678a719bd68Elliott Hughes    JValue args[2];
39077405796564c6c1353807cda18b28678a719bd68Elliott Hughes    JValue result;
39177405796564c6c1353807cda18b28678a719bd68Elliott Hughes
392f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetD(0.0);
393f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetD(0.0);
394f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetD(-1.0);
39577405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
396f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(0.0, result.GetD());
39777405796564c6c1353807cda18b28678a719bd68Elliott Hughes
398f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetD(1.0);
399f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetD(2.0);
400f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetD(0.0);
40177405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
402f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(3.0, result.GetD());
40377405796564c6c1353807cda18b28678a719bd68Elliott Hughes
404f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetD(1.0);
405f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetD(-2.0);
406f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetD(0.0);
40777405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
408f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(-1.0, result.GetD());
40977405796564c6c1353807cda18b28678a719bd68Elliott Hughes
410f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetD(DBL_MAX);
411f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetD(DBL_MIN);
412f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetD(0.0);
41377405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
414f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(1.7976931348623157e308, result.GetD());
41577405796564c6c1353807cda18b28678a719bd68Elliott Hughes
416f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetD(DBL_MAX);
417f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetD(DBL_MAX);
418f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetD(0.0);
41977405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
420f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(INFINITY, result.GetD());
42177405796564c6c1353807cda18b28678a719bd68Elliott Hughes  }
42277405796564c6c1353807cda18b28678a719bd68Elliott Hughes
42300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void InvokeSumDoubleDoubleDoubleMethod(bool is_static)
42400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) {
42577405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Method* method;
42677405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Object* receiver;
42777405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Method::InvokeStub* stub = DoCompile(method, receiver, is_static, "sum", "(DDD)D");
42877405796564c6c1353807cda18b28678a719bd68Elliott Hughes
42977405796564c6c1353807cda18b28678a719bd68Elliott Hughes    JValue args[3];
43077405796564c6c1353807cda18b28678a719bd68Elliott Hughes    JValue result;
43177405796564c6c1353807cda18b28678a719bd68Elliott Hughes
432f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetD(0.0);
433f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetD(0.0);
434f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[2].SetD(0.0);
435f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetD(-1.0);
43677405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
437f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(0.0, result.GetD());
43877405796564c6c1353807cda18b28678a719bd68Elliott Hughes
439f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetD(1.0);
440f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetD(2.0);
441f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[2].SetD(3.0);
442f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetD(0.0);
44377405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
444f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(6.0, result.GetD());
44577405796564c6c1353807cda18b28678a719bd68Elliott Hughes
446f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetD(1.0);
447f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetD(-2.0);
448f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[2].SetD(3.0);
449f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetD(0.0);
45077405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
451f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(2.0, result.GetD());
45277405796564c6c1353807cda18b28678a719bd68Elliott Hughes  }
45377405796564c6c1353807cda18b28678a719bd68Elliott Hughes
45400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void InvokeSumDoubleDoubleDoubleDoubleMethod(bool is_static)
45500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) {
45677405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Method* method;
45777405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Object* receiver;
45877405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Method::InvokeStub* stub = DoCompile(method, receiver, is_static, "sum", "(DDDD)D");
45977405796564c6c1353807cda18b28678a719bd68Elliott Hughes
46077405796564c6c1353807cda18b28678a719bd68Elliott Hughes    JValue args[4];
46177405796564c6c1353807cda18b28678a719bd68Elliott Hughes    JValue result;
46277405796564c6c1353807cda18b28678a719bd68Elliott Hughes
463f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetD(0.0);
464f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetD(0.0);
465f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[2].SetD(0.0);
466f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[3].SetD(0.0);
467f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetD(-1.0);
46877405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
469f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(0.0, result.GetD());
47077405796564c6c1353807cda18b28678a719bd68Elliott Hughes
471f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetD(1.0);
472f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetD(2.0);
473f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[2].SetD(3.0);
474f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[3].SetD(4.0);
475f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetD(0.0);
47677405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
477f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(10.0, result.GetD());
47877405796564c6c1353807cda18b28678a719bd68Elliott Hughes
479f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetD(1.0);
480f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetD(-2.0);
481f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[2].SetD(3.0);
482f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[3].SetD(-4.0);
483f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetD(0.0);
48477405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
485f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(-2.0, result.GetD());
48677405796564c6c1353807cda18b28678a719bd68Elliott Hughes  }
48777405796564c6c1353807cda18b28678a719bd68Elliott Hughes
48800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void InvokeSumDoubleDoubleDoubleDoubleDoubleMethod(bool is_static)
48900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) {
49077405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Method* method;
49177405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Object* receiver;
49277405796564c6c1353807cda18b28678a719bd68Elliott Hughes    Method::InvokeStub* stub = DoCompile(method, receiver, is_static, "sum", "(DDDDD)D");
49377405796564c6c1353807cda18b28678a719bd68Elliott Hughes
49477405796564c6c1353807cda18b28678a719bd68Elliott Hughes    JValue args[5];
49577405796564c6c1353807cda18b28678a719bd68Elliott Hughes    JValue result;
49677405796564c6c1353807cda18b28678a719bd68Elliott Hughes
497f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetD(0.0);
498f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetD(0.0);
499f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[2].SetD(0.0);
500f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[3].SetD(0.0);
501f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[4].SetD(0.0);
502f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetD(-1.0);
50377405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
504f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(0.0, result.GetD());
505f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes
506f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetD(1.0);
507f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetD(2.0);
508f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[2].SetD(3.0);
509f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[3].SetD(4.0);
510f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[4].SetD(5.0);
511f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetD(0.0);
51277405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
513f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(15.0, result.GetD());
514f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes
515f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[0].SetD(1.0);
516f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[1].SetD(-2.0);
517f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[2].SetD(3.0);
518f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[3].SetD(-4.0);
519f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    args[4].SetD(5.0);
520f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    result.SetD(0.0);
52177405796564c6c1353807cda18b28678a719bd68Elliott Hughes    (*stub)(method, NULL, Thread::Current(), args, &result);
522f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes    EXPECT_EQ(3.0, result.GetD());
52377405796564c6c1353807cda18b28678a719bd68Elliott Hughes  }
52477405796564c6c1353807cda18b28678a719bd68Elliott Hughes
525a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes  JavaVMExt* vm_;
5264d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom  JNIEnv* env_;
527814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  jclass aioobe_;
528b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes  jclass ase_;
529b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  jclass sioobe_;
5300c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes};
5310c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes
532885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott HughesTEST_F(JniInternalTest, AllocObject) {
533885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  jclass c = env_->FindClass("java/lang/String");
534885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  ASSERT_TRUE(c != NULL);
535885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  jobject o = env_->AllocObject(c);
536885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  ASSERT_TRUE(o != NULL);
537885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes
538885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  // We have an instance of the class we asked for...
539885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  ASSERT_TRUE(env_->IsInstanceOf(o, c));
540885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  // ...whose fields haven't been initialized because
541885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  // we didn't call a constructor.
542885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  ASSERT_EQ(0, env_->GetIntField(o, env_->GetFieldID(c, "count", "I")));
543885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  ASSERT_EQ(0, env_->GetIntField(o, env_->GetFieldID(c, "offset", "I")));
544885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  ASSERT_TRUE(env_->GetObjectField(o, env_->GetFieldID(c, "value", "[C")) == NULL);
545885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes}
546885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes
547c7ac37f0b8b64cfb53d8b9cc8dddbb34be3dd5eeElliott HughesTEST_F(JniInternalTest, GetVersion) {
548c7ac37f0b8b64cfb53d8b9cc8dddbb34be3dd5eeElliott Hughes  ASSERT_EQ(JNI_VERSION_1_6, env_->GetVersion());
549c7ac37f0b8b64cfb53d8b9cc8dddbb34be3dd5eeElliott Hughes}
550c7ac37f0b8b64cfb53d8b9cc8dddbb34be3dd5eeElliott Hughes
5510c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes#define EXPECT_CLASS_FOUND(NAME) \
552bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes  EXPECT_TRUE(env_->FindClass(NAME) != NULL); \
553bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes  EXPECT_FALSE(env_->ExceptionCheck())
5540c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes
5550c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes#define EXPECT_CLASS_NOT_FOUND(NAME) \
556bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes  EXPECT_TRUE(env_->FindClass(NAME) == NULL); \
557bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes  EXPECT_TRUE(env_->ExceptionCheck()); \
558bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes  env_->ExceptionClear()
5590c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes
5600c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott HughesTEST_F(JniInternalTest, FindClass) {
5610c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes  // Reference types...
5620c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes  EXPECT_CLASS_FOUND("java/lang/String");
5630c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes  // ...for arrays too, where you must include "L;".
5640c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes  EXPECT_CLASS_FOUND("[Ljava/lang/String;");
5653f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes  // Primitive arrays are okay too, if the primitive type is valid.
5663f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes  EXPECT_CLASS_FOUND("[C");
567a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes
568b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes  {
569b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes    // We support . as well as / for compatibility, if -Xcheck:jni is off.
5703f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes    CheckJniAbortCatcher check_jni_abort_catcher;
571b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes    EXPECT_CLASS_FOUND("java.lang.String");
57256ef042065ce282f8f01a0f31f5cce868a60ede8Elliott Hughes    check_jni_abort_catcher.Check("illegal class name 'java.lang.String'");
573b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes    EXPECT_CLASS_NOT_FOUND("Ljava.lang.String;");
57456ef042065ce282f8f01a0f31f5cce868a60ede8Elliott Hughes    check_jni_abort_catcher.Check("illegal class name 'Ljava.lang.String;'");
575b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes    EXPECT_CLASS_FOUND("[Ljava.lang.String;");
57656ef042065ce282f8f01a0f31f5cce868a60ede8Elliott Hughes    check_jni_abort_catcher.Check("illegal class name '[Ljava.lang.String;'");
577b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes    EXPECT_CLASS_NOT_FOUND("[java.lang.String");
57856ef042065ce282f8f01a0f31f5cce868a60ede8Elliott Hughes    check_jni_abort_catcher.Check("illegal class name '[java.lang.String'");
579b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes
580b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes    // You can't include the "L;" in a JNI class descriptor.
581b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes    EXPECT_CLASS_NOT_FOUND("Ljava/lang/String;");
58256ef042065ce282f8f01a0f31f5cce868a60ede8Elliott Hughes    check_jni_abort_catcher.Check("illegal class name 'Ljava/lang/String;'");
5833f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes
584b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes    // But you must include it for an array of any reference type.
585b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes    EXPECT_CLASS_NOT_FOUND("[java/lang/String");
58656ef042065ce282f8f01a0f31f5cce868a60ede8Elliott Hughes    check_jni_abort_catcher.Check("illegal class name '[java/lang/String'");
587a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes
588b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes    EXPECT_CLASS_NOT_FOUND("[K");
58956ef042065ce282f8f01a0f31f5cce868a60ede8Elliott Hughes    check_jni_abort_catcher.Check("illegal class name '[K'");
590b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes  }
5913f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes
5920c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes  // But primitive types aren't allowed...
5930c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes  EXPECT_CLASS_NOT_FOUND("C");
5940c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes  EXPECT_CLASS_NOT_FOUND("K");
5950c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes}
5960c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes
597cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes#define EXPECT_EXCEPTION(exception_class) \
598cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  do { \
599cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes    EXPECT_TRUE(env_->ExceptionCheck()); \
600cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes    jthrowable exception = env_->ExceptionOccurred(); \
601cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes    EXPECT_NE(static_cast<jthrowable>(NULL), exception); \
602cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes    env_->ExceptionClear(); \
603a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes    EXPECT_TRUE(env_->IsInstanceOf(exception, exception_class)); \
604cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  } while (false)
605cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes
606cdf53120cd5a73cbedc1654e22542848468c0d2fElliott HughesTEST_F(JniInternalTest, GetFieldID) {
607cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  jclass jlnsfe = env_->FindClass("java/lang/NoSuchFieldError");
608cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  ASSERT_TRUE(jlnsfe != NULL);
609cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  jclass c = env_->FindClass("java/lang/String");
610cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  ASSERT_TRUE(c != NULL);
611cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes
612cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  // Wrong type.
613cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  jfieldID fid = env_->GetFieldID(c, "count", "J");
614cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  EXPECT_EQ(static_cast<jfieldID>(NULL), fid);
615cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  EXPECT_EXCEPTION(jlnsfe);
616cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes
617b17d08b6ef0d36038e408dd79960293bb62ec1d9Ian Rogers  // Wrong type where type doesn't exist.
618b17d08b6ef0d36038e408dd79960293bb62ec1d9Ian Rogers  fid = env_->GetFieldID(c, "count", "Lrod/jane/freddy;");
619b17d08b6ef0d36038e408dd79960293bb62ec1d9Ian Rogers  EXPECT_EQ(static_cast<jfieldID>(NULL), fid);
620b17d08b6ef0d36038e408dd79960293bb62ec1d9Ian Rogers  EXPECT_EXCEPTION(jlnsfe);
621b17d08b6ef0d36038e408dd79960293bb62ec1d9Ian Rogers
622cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  // Wrong name.
623cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  fid = env_->GetFieldID(c, "Count", "I");
624cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  EXPECT_EQ(static_cast<jfieldID>(NULL), fid);
625cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  EXPECT_EXCEPTION(jlnsfe);
626cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes
627cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  // Good declared field lookup.
628cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  fid = env_->GetFieldID(c, "count", "I");
629cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  EXPECT_NE(static_cast<jfieldID>(NULL), fid);
630cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  EXPECT_TRUE(fid != NULL);
631cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  EXPECT_FALSE(env_->ExceptionCheck());
632cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes
633cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  // Good superclass field lookup.
634cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  c = env_->FindClass("java/lang/StringBuilder");
635cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  fid = env_->GetFieldID(c, "count", "I");
636cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  EXPECT_NE(static_cast<jfieldID>(NULL), fid);
637cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  EXPECT_TRUE(fid != NULL);
638cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  EXPECT_FALSE(env_->ExceptionCheck());
639cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes
640cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  // Not instance.
641cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  fid = env_->GetFieldID(c, "CASE_INSENSITIVE_ORDER", "Ljava/util/Comparator;");
642cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  EXPECT_EQ(static_cast<jfieldID>(NULL), fid);
643cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  EXPECT_EXCEPTION(jlnsfe);
644cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes}
645cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes
646cdf53120cd5a73cbedc1654e22542848468c0d2fElliott HughesTEST_F(JniInternalTest, GetStaticFieldID) {
647cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  jclass jlnsfe = env_->FindClass("java/lang/NoSuchFieldError");
648cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  ASSERT_TRUE(jlnsfe != NULL);
649cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  jclass c = env_->FindClass("java/lang/String");
650cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  ASSERT_TRUE(c != NULL);
651cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes
652cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  // Wrong type.
653cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  jfieldID fid = env_->GetStaticFieldID(c, "CASE_INSENSITIVE_ORDER", "J");
654cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  EXPECT_EQ(static_cast<jfieldID>(NULL), fid);
655cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  EXPECT_EXCEPTION(jlnsfe);
656cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes
657b17d08b6ef0d36038e408dd79960293bb62ec1d9Ian Rogers  // Wrong type where type doesn't exist.
658b17d08b6ef0d36038e408dd79960293bb62ec1d9Ian Rogers  fid = env_->GetStaticFieldID(c, "CASE_INSENSITIVE_ORDER", "Lrod/jane/freddy;");
659b17d08b6ef0d36038e408dd79960293bb62ec1d9Ian Rogers  EXPECT_EQ(static_cast<jfieldID>(NULL), fid);
660b17d08b6ef0d36038e408dd79960293bb62ec1d9Ian Rogers  EXPECT_EXCEPTION(jlnsfe);
661b17d08b6ef0d36038e408dd79960293bb62ec1d9Ian Rogers
662cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  // Wrong name.
663cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  fid = env_->GetStaticFieldID(c, "cASE_INSENSITIVE_ORDER", "Ljava/util/Comparator;");
664cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  EXPECT_EQ(static_cast<jfieldID>(NULL), fid);
665cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  EXPECT_EXCEPTION(jlnsfe);
666cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes
667cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  // Good declared field lookup.
668cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  fid = env_->GetStaticFieldID(c, "CASE_INSENSITIVE_ORDER", "Ljava/util/Comparator;");
669cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  EXPECT_NE(static_cast<jfieldID>(NULL), fid);
670cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  EXPECT_TRUE(fid != NULL);
671cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  EXPECT_FALSE(env_->ExceptionCheck());
672cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes
673cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  // Not static.
674cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  fid = env_->GetStaticFieldID(c, "count", "I");
675cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  EXPECT_EQ(static_cast<jfieldID>(NULL), fid);
676cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  EXPECT_EXCEPTION(jlnsfe);
677cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes}
678cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes
6794dd71f1538a8d788c56c77378a59ce32afa519d7Ian RogersTEST_F(JniInternalTest, GetMethodID) {
6804dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  jclass jlobject = env_->FindClass("java/lang/Object");
6814dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  jclass jlstring = env_->FindClass("java/lang/String");
6824dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  jclass jlnsme = env_->FindClass("java/lang/NoSuchMethodError");
6834dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers
6844dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  // Sanity check that no exceptions are pending
685cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  ASSERT_FALSE(env_->ExceptionCheck());
6864dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers
6874dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  // Check that java.lang.Object.foo() doesn't exist and NoSuchMethodError is
6884dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  // a pending exception
6894dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  jmethodID method = env_->GetMethodID(jlobject, "foo", "()V");
6904dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  EXPECT_EQ(static_cast<jmethodID>(NULL), method);
691cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  EXPECT_EXCEPTION(jlnsme);
6924dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers
6934dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  // Check that java.lang.Object.equals() does exist
6944dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  method = env_->GetMethodID(jlobject, "equals", "(Ljava/lang/Object;)Z");
6954dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  EXPECT_NE(static_cast<jmethodID>(NULL), method);
6964dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  EXPECT_FALSE(env_->ExceptionCheck());
6974dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers
6984dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  // Check that GetMethodID for java.lang.String.valueOf(int) fails as the
6994dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  // method is static
7004dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  method = env_->GetMethodID(jlstring, "valueOf", "(I)Ljava/lang/String;");
7014dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  EXPECT_EQ(static_cast<jmethodID>(NULL), method);
702cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  EXPECT_EXCEPTION(jlnsme);
7034dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers}
7044dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers
7054dd71f1538a8d788c56c77378a59ce32afa519d7Ian RogersTEST_F(JniInternalTest, GetStaticMethodID) {
7064dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  jclass jlobject = env_->FindClass("java/lang/Object");
7074dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  jclass jlnsme = env_->FindClass("java/lang/NoSuchMethodError");
7084dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers
7094dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  // Sanity check that no exceptions are pending
710cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  ASSERT_FALSE(env_->ExceptionCheck());
7114dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers
7124dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  // Check that java.lang.Object.foo() doesn't exist and NoSuchMethodError is
7134dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  // a pending exception
7144dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  jmethodID method = env_->GetStaticMethodID(jlobject, "foo", "()V");
7154dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  EXPECT_EQ(static_cast<jmethodID>(NULL), method);
716cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  EXPECT_EXCEPTION(jlnsme);
7174dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers
7184dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  // Check that GetStaticMethodID for java.lang.Object.equals(Object) fails as
7194dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  // the method is not static
7204dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  method = env_->GetStaticMethodID(jlobject, "equals", "(Ljava/lang/Object;)Z");
7214dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  EXPECT_EQ(static_cast<jmethodID>(NULL), method);
722cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  EXPECT_EXCEPTION(jlnsme);
7234dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers
7244dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  // Check that java.lang.String.valueOf(int) does exist
7254dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  jclass jlstring = env_->FindClass("java/lang/String");
7264dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  method = env_->GetStaticMethodID(jlstring, "valueOf",
7274dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers                                   "(I)Ljava/lang/String;");
7284dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  EXPECT_NE(static_cast<jmethodID>(NULL), method);
7294dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  EXPECT_FALSE(env_->ExceptionCheck());
7304dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers}
7314dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers
732cdf53120cd5a73cbedc1654e22542848468c0d2fElliott HughesTEST_F(JniInternalTest, FromReflectedField_ToReflectedField) {
733cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  jclass jlrField = env_->FindClass("java/lang/reflect/Field");
734cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  jclass c = env_->FindClass("java/lang/String");
735cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  ASSERT_TRUE(c != NULL);
736cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  jfieldID fid = env_->GetFieldID(c, "count", "I");
737cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  ASSERT_TRUE(fid != NULL);
738cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  // Turn the fid into a java.lang.reflect.Field...
739cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  jobject field = env_->ToReflectedField(c, fid, JNI_FALSE);
740cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  ASSERT_TRUE(c != NULL);
741cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  ASSERT_TRUE(env_->IsInstanceOf(field, jlrField));
742cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  // ...and back again.
743cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  jfieldID fid2 = env_->FromReflectedField(field);
744cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  ASSERT_TRUE(fid2 != NULL);
745cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes}
746cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes
747cdf53120cd5a73cbedc1654e22542848468c0d2fElliott HughesTEST_F(JniInternalTest, FromReflectedMethod_ToReflectedMethod) {
748cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  jclass jlrMethod = env_->FindClass("java/lang/reflect/Method");
749cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  jclass c = env_->FindClass("java/lang/String");
750cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  ASSERT_TRUE(c != NULL);
751cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  jmethodID mid = env_->GetMethodID(c, "length", "()I");
752cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  ASSERT_TRUE(mid != NULL);
753cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  // Turn the mid into a java.lang.reflect.Method...
754cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  jobject method = env_->ToReflectedMethod(c, mid, JNI_FALSE);
755cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  ASSERT_TRUE(c != NULL);
756cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  ASSERT_TRUE(env_->IsInstanceOf(method, jlrMethod));
757cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  // ...and back again.
758cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  jmethodID mid2 = env_->FromReflectedMethod(method);
759cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  ASSERT_TRUE(mid2 != NULL);
760cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes}
761cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes
7625174fe6e4e931c423e910366ff22ce0838567940Elliott Hughesvoid BogusMethod() {
7635174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes  // You can't pass NULL function pointers to RegisterNatives.
7645174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes}
7655174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes
7664dd71f1538a8d788c56c77378a59ce32afa519d7Ian RogersTEST_F(JniInternalTest, RegisterNatives) {
7674dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  jclass jlobject = env_->FindClass("java/lang/Object");
7684dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  jclass jlnsme = env_->FindClass("java/lang/NoSuchMethodError");
7694dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers
7704dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  // Sanity check that no exceptions are pending
771cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  ASSERT_FALSE(env_->ExceptionCheck());
7724dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers
7734dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  // Check that registering to a non-existent java.lang.Object.foo() causes a
7744dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  // NoSuchMethodError
7754dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  {
776b25c3f6a86dc634ce44fb2849385b49465caa84dElliott Hughes    JNINativeMethod methods[] = { { "foo", "()V", NULL } };
7774dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers    env_->RegisterNatives(jlobject, methods, 1);
7784dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  }
779cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  EXPECT_EXCEPTION(jlnsme);
7804dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers
7814dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  // Check that registering non-native methods causes a NoSuchMethodError
7824dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  {
783b25c3f6a86dc634ce44fb2849385b49465caa84dElliott Hughes    JNINativeMethod methods[] = { { "equals", "(Ljava/lang/Object;)Z", NULL } };
7844dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers    env_->RegisterNatives(jlobject, methods, 1);
7854dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  }
786cdf53120cd5a73cbedc1654e22542848468c0d2fElliott Hughes  EXPECT_EXCEPTION(jlnsme);
7874dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers
7884dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  // Check that registering native methods is successful
7894dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  {
790b25c3f6a86dc634ce44fb2849385b49465caa84dElliott Hughes    JNINativeMethod methods[] = { { "notify", "()V", reinterpret_cast<void*>(BogusMethod) } };
7914dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers    env_->RegisterNatives(jlobject, methods, 1);
7924dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  }
7934dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers  EXPECT_FALSE(env_->ExceptionCheck());
7945174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes
7955174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes  env_->UnregisterNatives(jlobject);
7964dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers}
7974dd71f1538a8d788c56c77378a59ce32afa519d7Ian Rogers
7987577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes#define EXPECT_PRIMITIVE_ARRAY(new_fn, get_region_fn, set_region_fn, get_elements_fn, release_elements_fn, scalar_type, expected_class_descriptor) \
799814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  jsize size = 4; \
800814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  /* Allocate an array and check it has the right type and length. */ \
801814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  scalar_type ## Array a = env_->new_fn(size); \
802814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  EXPECT_TRUE(a != NULL); \
803814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  EXPECT_TRUE(env_->IsInstanceOf(a, env_->FindClass(expected_class_descriptor))); \
804814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  EXPECT_EQ(size, env_->GetArrayLength(a)); \
805814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  /* AIOOBE for negative start offset. */ \
806814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  env_->get_region_fn(a, -1, 1, NULL); \
807814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  EXPECT_EXCEPTION(aioobe_); \
808814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  env_->set_region_fn(a, -1, 1, NULL); \
809814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  EXPECT_EXCEPTION(aioobe_); \
810814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  /* AIOOBE for negative length. */ \
811814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  env_->get_region_fn(a, 0, -1, NULL); \
812814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  EXPECT_EXCEPTION(aioobe_); \
813814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  env_->set_region_fn(a, 0, -1, NULL); \
814814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  EXPECT_EXCEPTION(aioobe_); \
815814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  /* AIOOBE for buffer overrun. */ \
816814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  env_->get_region_fn(a, size - 1, size, NULL); \
817814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  EXPECT_EXCEPTION(aioobe_); \
818814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  env_->set_region_fn(a, size - 1, size, NULL); \
819814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  EXPECT_EXCEPTION(aioobe_); \
820814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  /* Prepare a couple of buffers. */ \
821ee0fa76b2e5d39ad36d1ff144b2d0270df81e606Elliott Hughes  UniquePtr<scalar_type[]> src_buf(new scalar_type[size]); \
822ee0fa76b2e5d39ad36d1ff144b2d0270df81e606Elliott Hughes  UniquePtr<scalar_type[]> dst_buf(new scalar_type[size]); \
823814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  for (jsize i = 0; i < size; ++i) { src_buf[i] = scalar_type(i); } \
824814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  for (jsize i = 0; i < size; ++i) { dst_buf[i] = scalar_type(-1); } \
825814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  /* Copy all of src_buf onto the heap. */ \
826ee0fa76b2e5d39ad36d1ff144b2d0270df81e606Elliott Hughes  env_->set_region_fn(a, 0, size, &src_buf[0]); \
827814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  /* Copy back only part. */ \
828814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  env_->get_region_fn(a, 1, size - 2, &dst_buf[1]); \
829ee0fa76b2e5d39ad36d1ff144b2d0270df81e606Elliott Hughes  EXPECT_NE(memcmp(&src_buf[0], &dst_buf[0], size * sizeof(scalar_type)), 0) << "short copy equal"; \
830814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  /* Copy the missing pieces. */ \
831ee0fa76b2e5d39ad36d1ff144b2d0270df81e606Elliott Hughes  env_->get_region_fn(a, 0, 1, &dst_buf[0]); \
832814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  env_->get_region_fn(a, size - 1, 1, &dst_buf[size - 1]); \
833ee0fa76b2e5d39ad36d1ff144b2d0270df81e606Elliott Hughes  EXPECT_EQ(memcmp(&src_buf[0], &dst_buf[0], size * sizeof(scalar_type)), 0) << "fixed copy not equal"; \
834814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  /* Copy back the whole array. */ \
835ee0fa76b2e5d39ad36d1ff144b2d0270df81e606Elliott Hughes  env_->get_region_fn(a, 0, size, &dst_buf[0]); \
836ee0fa76b2e5d39ad36d1ff144b2d0270df81e606Elliott Hughes  EXPECT_EQ(memcmp(&src_buf[0], &dst_buf[0], size * sizeof(scalar_type)), 0) << "full copy not equal"; \
8377577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  /* GetPrimitiveArrayCritical */ \
8387577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  void* v = env_->GetPrimitiveArrayCritical(a, NULL); \
839ee0fa76b2e5d39ad36d1ff144b2d0270df81e606Elliott Hughes  EXPECT_EQ(memcmp(&src_buf[0], v, size * sizeof(scalar_type)), 0) << "GetPrimitiveArrayCritical not equal"; \
8407577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  env_->ReleasePrimitiveArrayCritical(a, v, 0); \
8417577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  /* GetXArrayElements */ \
8427577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  scalar_type* xs = env_->get_elements_fn(a, NULL); \
843ee0fa76b2e5d39ad36d1ff144b2d0270df81e606Elliott Hughes  EXPECT_EQ(memcmp(&src_buf[0], xs, size * sizeof(scalar_type)), 0) << # get_elements_fn " not equal"; \
8447577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  env_->release_elements_fn(a, xs, 0); \
8457577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_EQ(reinterpret_cast<uintptr_t>(v), reinterpret_cast<uintptr_t>(xs))
846814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes
847814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott HughesTEST_F(JniInternalTest, BooleanArrays) {
8487577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_PRIMITIVE_ARRAY(NewBooleanArray, GetBooleanArrayRegion, SetBooleanArrayRegion, GetBooleanArrayElements, ReleaseBooleanArrayElements, jboolean, "[Z");
849814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes}
850814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott HughesTEST_F(JniInternalTest, ByteArrays) {
8517577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_PRIMITIVE_ARRAY(NewByteArray, GetByteArrayRegion, SetByteArrayRegion, GetByteArrayElements, ReleaseByteArrayElements, jbyte, "[B");
852814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes}
853814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott HughesTEST_F(JniInternalTest, CharArrays) {
8547577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_PRIMITIVE_ARRAY(NewCharArray, GetCharArrayRegion, SetCharArrayRegion, GetCharArrayElements, ReleaseCharArrayElements, jchar, "[C");
855814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes}
856814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott HughesTEST_F(JniInternalTest, DoubleArrays) {
8577577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_PRIMITIVE_ARRAY(NewDoubleArray, GetDoubleArrayRegion, SetDoubleArrayRegion, GetDoubleArrayElements, ReleaseDoubleArrayElements, jdouble, "[D");
858814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes}
859814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott HughesTEST_F(JniInternalTest, FloatArrays) {
8607577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_PRIMITIVE_ARRAY(NewFloatArray, GetFloatArrayRegion, SetFloatArrayRegion, GetFloatArrayElements, ReleaseFloatArrayElements, jfloat, "[F");
861814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes}
862814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott HughesTEST_F(JniInternalTest, IntArrays) {
8637577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_PRIMITIVE_ARRAY(NewIntArray, GetIntArrayRegion, SetIntArrayRegion, GetIntArrayElements, ReleaseIntArrayElements, jint, "[I");
864814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes}
865814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott HughesTEST_F(JniInternalTest, LongArrays) {
8667577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_PRIMITIVE_ARRAY(NewLongArray, GetLongArrayRegion, SetLongArrayRegion, GetLongArrayElements, ReleaseLongArrayElements, jlong, "[J");
867814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes}
868814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott HughesTEST_F(JniInternalTest, ShortArrays) {
8697577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_PRIMITIVE_ARRAY(NewShortArray, GetShortArrayRegion, SetShortArrayRegion, GetShortArrayElements, ReleaseShortArrayElements, jshort, "[S");
870d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes}
871d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes
872f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott HughesTEST_F(JniInternalTest, NewObjectArray) {
873f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes  // TODO: death tests for negative array sizes.
874f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes
875bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes  // TODO: check non-NULL initial elements.
876f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes
877bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes  jclass element_class = env_->FindClass("java/lang/String");
878bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes  ASSERT_TRUE(element_class != NULL);
879bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes  jclass array_class = env_->FindClass("[Ljava/lang/String;");
880bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes  ASSERT_TRUE(array_class != NULL);
881f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes
882bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes  jobjectArray a;
883f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes
884bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes  a = env_->NewObjectArray(0, element_class, NULL);
885bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes  EXPECT_TRUE(a != NULL);
886bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes  EXPECT_TRUE(env_->IsInstanceOf(a, array_class));
887bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes  EXPECT_EQ(0, env_->GetArrayLength(a));
888f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes
889bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes  a = env_->NewObjectArray(1, element_class, NULL);
890bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes  EXPECT_TRUE(a != NULL);
891bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes  EXPECT_TRUE(env_->IsInstanceOf(a, array_class));
892bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes  EXPECT_EQ(1, env_->GetArrayLength(a));
8937577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_TRUE(env_->IsSameObject(env_->GetObjectArrayElement(a, 0), NULL));
8947577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes
8957577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  jstring s = env_->NewStringUTF("poop");
8967577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  a = env_->NewObjectArray(2, element_class, s);
8977577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_TRUE(a != NULL);
8987577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_TRUE(env_->IsInstanceOf(a, array_class));
8997577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_EQ(2, env_->GetArrayLength(a));
9007577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_TRUE(env_->IsSameObject(env_->GetObjectArrayElement(a, 0), s));
9017577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_TRUE(env_->IsSameObject(env_->GetObjectArrayElement(a, 1), s));
902bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes}
903f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes
904bd9359912e5398799f60649b86ae80644ec72627Elliott HughesTEST_F(JniInternalTest, GetArrayLength) {
905bd9359912e5398799f60649b86ae80644ec72627Elliott Hughes  // Already tested in NewObjectArray/NewPrimitiveArray.
9068a26c5c4c74b09e2887593c733a22652a9f80d7cElliott Hughes}
9078a26c5c4c74b09e2887593c733a22652a9f80d7cElliott Hughes
90837f7a40f6789bb287f287a9af00777af9d6428eeElliott HughesTEST_F(JniInternalTest, GetObjectClass) {
90937f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  jclass string_class = env_->FindClass("java/lang/String");
91037f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  ASSERT_TRUE(string_class != NULL);
91137f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  jclass class_class = env_->FindClass("java/lang/Class");
91237f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  ASSERT_TRUE(class_class != NULL);
91337f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes
91437f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  jstring s = env_->NewStringUTF("poop");
91537f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  jclass c = env_->GetObjectClass(s);
91637f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  ASSERT_TRUE(env_->IsSameObject(string_class, c));
91737f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes
91837f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  jclass c2 = env_->GetObjectClass(c);
91937f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  ASSERT_TRUE(env_->IsSameObject(class_class, env_->GetObjectClass(c2)));
92037f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes}
92137f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes
922885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott HughesTEST_F(JniInternalTest, GetSuperclass) {
923885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  jclass object_class = env_->FindClass("java/lang/Object");
924885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  ASSERT_TRUE(object_class != NULL);
925885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  jclass string_class = env_->FindClass("java/lang/String");
926885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  ASSERT_TRUE(string_class != NULL);
927dc18020e83aa1261d4f661f1f9330bda20dffd71Ian Rogers  jclass runnable_interface = env_->FindClass("java/lang/Runnable");
928dc18020e83aa1261d4f661f1f9330bda20dffd71Ian Rogers  ASSERT_TRUE(runnable_interface != NULL);
929885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  ASSERT_TRUE(env_->IsSameObject(object_class, env_->GetSuperclass(string_class)));
930885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  ASSERT_TRUE(env_->GetSuperclass(object_class) == NULL);
931dc18020e83aa1261d4f661f1f9330bda20dffd71Ian Rogers  ASSERT_TRUE(env_->IsSameObject(object_class, env_->GetSuperclass(runnable_interface)));
932885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes}
933885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes
93437f7a40f6789bb287f287a9af00777af9d6428eeElliott HughesTEST_F(JniInternalTest, IsAssignableFrom) {
93537f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  jclass object_class = env_->FindClass("java/lang/Object");
93637f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  ASSERT_TRUE(object_class != NULL);
93737f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  jclass string_class = env_->FindClass("java/lang/String");
93837f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  ASSERT_TRUE(string_class != NULL);
93937f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes
94037f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  ASSERT_TRUE(env_->IsAssignableFrom(object_class, string_class));
94137f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  ASSERT_FALSE(env_->IsAssignableFrom(string_class, object_class));
94237f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes}
94337f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes
944b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott HughesTEST_F(JniInternalTest, GetObjectRefType) {
945b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  jclass local = env_->FindClass("java/lang/Object");
946b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  ASSERT_TRUE(local != NULL);
947b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(local));
948b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes
949b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  jobject global = env_->NewGlobalRef(local);
950b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  EXPECT_EQ(JNIGlobalRefType, env_->GetObjectRefType(global));
951b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes
952b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  jweak weak_global = env_->NewWeakGlobalRef(local);
953b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  EXPECT_EQ(JNIWeakGlobalRefType, env_->GetObjectRefType(weak_global));
954b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes
955b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  jobject invalid = reinterpret_cast<jobject>(this);
956b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  EXPECT_EQ(JNIInvalidRefType, env_->GetObjectRefType(invalid));
957b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes
958b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  // TODO: invoke a native method and test that its arguments are considered local references.
959b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes}
960b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes
9618a26c5c4c74b09e2887593c733a22652a9f80d7cElliott HughesTEST_F(JniInternalTest, NewStringUTF) {
9628a26c5c4c74b09e2887593c733a22652a9f80d7cElliott Hughes  EXPECT_TRUE(env_->NewStringUTF(NULL) == NULL);
963814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  jstring s;
964814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes
965814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  s = env_->NewStringUTF("");
966814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  EXPECT_TRUE(s != NULL);
967814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  EXPECT_EQ(0, env_->GetStringLength(s));
968814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  EXPECT_EQ(0, env_->GetStringUTFLength(s));
969814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  s = env_->NewStringUTF("hello");
970814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  EXPECT_TRUE(s != NULL);
971814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  EXPECT_EQ(5, env_->GetStringLength(s));
972814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  EXPECT_EQ(5, env_->GetStringUTFLength(s));
973814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes
974814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  // TODO: check some non-ASCII strings.
975814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes}
976814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes
977814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott HughesTEST_F(JniInternalTest, NewString) {
978814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  jchar chars[] = { 'h', 'i' };
979814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  jstring s;
980814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  s = env_->NewString(chars, 0);
981814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  EXPECT_TRUE(s != NULL);
982814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  EXPECT_EQ(0, env_->GetStringLength(s));
983814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  EXPECT_EQ(0, env_->GetStringUTFLength(s));
984814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  s = env_->NewString(chars, 2);
985814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  EXPECT_TRUE(s != NULL);
986814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  EXPECT_EQ(2, env_->GetStringLength(s));
987814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  EXPECT_EQ(2, env_->GetStringUTFLength(s));
988814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes
9898a26c5c4c74b09e2887593c733a22652a9f80d7cElliott Hughes  // TODO: check some non-ASCII strings.
990f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes}
991f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes
99225e79a5e9ecd4bf30e0ea90a7dd4313f7f44bc3cJesse WilsonTEST_F(JniInternalTest, NewStringNullCharsZeroLength) {
99325e79a5e9ecd4bf30e0ea90a7dd4313f7f44bc3cJesse Wilson  jstring s = env_->NewString(NULL, 0);
99425e79a5e9ecd4bf30e0ea90a7dd4313f7f44bc3cJesse Wilson  EXPECT_TRUE(s != NULL);
99525e79a5e9ecd4bf30e0ea90a7dd4313f7f44bc3cJesse Wilson  EXPECT_EQ(0, env_->GetStringLength(s));
99625e79a5e9ecd4bf30e0ea90a7dd4313f7f44bc3cJesse Wilson}
99725e79a5e9ecd4bf30e0ea90a7dd4313f7f44bc3cJesse Wilson
9983625812ec5673193bc67ee52b1377fe39b536c9aBrian Carlstrom// TODO: fix gtest death tests on host http://b/5690440 (and target)
9993625812ec5673193bc67ee52b1377fe39b536c9aBrian CarlstromTEST_F(JniInternalTest, DISABLED_NewStringNullCharsNonzeroLength) {
100025e79a5e9ecd4bf30e0ea90a7dd4313f7f44bc3cJesse Wilson  ASSERT_DEATH(env_->NewString(NULL, 1), "");
100125e79a5e9ecd4bf30e0ea90a7dd4313f7f44bc3cJesse Wilson}
100225e79a5e9ecd4bf30e0ea90a7dd4313f7f44bc3cJesse Wilson
1003b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott HughesTEST_F(JniInternalTest, GetStringLength_GetStringUTFLength) {
1004b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  // Already tested in the NewString/NewStringUTF tests.
1005b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes}
1006b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes
1007b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott HughesTEST_F(JniInternalTest, GetStringRegion_GetStringUTFRegion) {
1008b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  jstring s = env_->NewStringUTF("hello");
1009b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  ASSERT_TRUE(s != NULL);
1010b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes
1011b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  env_->GetStringRegion(s, -1, 0, NULL);
1012b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  EXPECT_EXCEPTION(sioobe_);
1013b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  env_->GetStringRegion(s, 0, -1, NULL);
1014b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  EXPECT_EXCEPTION(sioobe_);
1015b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  env_->GetStringRegion(s, 0, 10, NULL);
1016b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  EXPECT_EXCEPTION(sioobe_);
1017b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  env_->GetStringRegion(s, 10, 1, NULL);
1018b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  EXPECT_EXCEPTION(sioobe_);
1019b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes
1020b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  jchar chars[4] = { 'x', 'x', 'x', 'x' };
1021b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  env_->GetStringRegion(s, 1, 2, &chars[1]);
1022b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  EXPECT_EQ('x', chars[0]);
1023b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  EXPECT_EQ('e', chars[1]);
1024b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  EXPECT_EQ('l', chars[2]);
1025b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  EXPECT_EQ('x', chars[3]);
1026b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes
1027b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  env_->GetStringUTFRegion(s, -1, 0, NULL);
1028b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  EXPECT_EXCEPTION(sioobe_);
1029b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  env_->GetStringUTFRegion(s, 0, -1, NULL);
1030b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  EXPECT_EXCEPTION(sioobe_);
1031b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  env_->GetStringUTFRegion(s, 0, 10, NULL);
1032b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  EXPECT_EXCEPTION(sioobe_);
1033b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  env_->GetStringUTFRegion(s, 10, 1, NULL);
1034b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  EXPECT_EXCEPTION(sioobe_);
1035b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes
1036b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  char bytes[4] = { 'x', 'x', 'x', 'x' };
1037b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  env_->GetStringUTFRegion(s, 1, 2, &bytes[1]);
1038b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  EXPECT_EQ('x', bytes[0]);
1039b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  EXPECT_EQ('e', bytes[1]);
1040b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  EXPECT_EQ('l', bytes[2]);
1041b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  EXPECT_EQ('x', bytes[3]);
1042b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes}
1043b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes
10447577075b147fd8fa37ca41e7a32d1124676776ceElliott HughesTEST_F(JniInternalTest, GetStringUTFChars_ReleaseStringUTFChars) {
10453f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes  // Passing in a NULL jstring is ignored normally, but caught by -Xcheck:jni.
1046b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes  {
1047b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes    CheckJniAbortCatcher check_jni_abort_catcher;
1048b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes    EXPECT_TRUE(env_->GetStringUTFChars(NULL, NULL) == NULL);
104956ef042065ce282f8f01a0f31f5cce868a60ede8Elliott Hughes    check_jni_abort_catcher.Check("GetStringUTFChars received null jstring");
1050b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes  }
10517577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes
10527577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  jstring s = env_->NewStringUTF("hello");
10537577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  ASSERT_TRUE(s != NULL);
10547577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes
10557577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  const char* utf = env_->GetStringUTFChars(s, NULL);
10567577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_STREQ("hello", utf);
10577577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  env_->ReleaseStringUTFChars(s, utf);
10587577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes
10597577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  jboolean is_copy = JNI_FALSE;
10607577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  utf = env_->GetStringUTFChars(s, &is_copy);
10617577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_EQ(JNI_TRUE, is_copy);
10627577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_STREQ("hello", utf);
10637577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  env_->ReleaseStringUTFChars(s, utf);
10647577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes}
10657577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes
10667577075b147fd8fa37ca41e7a32d1124676776ceElliott HughesTEST_F(JniInternalTest, GetStringChars_ReleaseStringChars) {
10677577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  jstring s = env_->NewStringUTF("hello");
10687577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  ASSERT_TRUE(s != NULL);
10697577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes
10707577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  jchar expected[] = { 'h', 'e', 'l', 'l', 'o' };
10717577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  const jchar* chars = env_->GetStringChars(s, NULL);
10727577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_EQ(expected[0], chars[0]);
10737577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_EQ(expected[1], chars[1]);
10747577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_EQ(expected[2], chars[2]);
10757577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_EQ(expected[3], chars[3]);
10767577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_EQ(expected[4], chars[4]);
10777577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  env_->ReleaseStringChars(s, chars);
10787577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes
10797577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  jboolean is_copy = JNI_FALSE;
10807577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  chars = env_->GetStringChars(s, &is_copy);
10817577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_EQ(JNI_FALSE, is_copy);
10827577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_EQ(expected[0], chars[0]);
10837577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_EQ(expected[1], chars[1]);
10847577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_EQ(expected[2], chars[2]);
10857577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_EQ(expected[3], chars[3]);
10867577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_EQ(expected[4], chars[4]);
10877577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  env_->ReleaseStringChars(s, chars);
10887577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes}
10897577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes
10907577075b147fd8fa37ca41e7a32d1124676776ceElliott HughesTEST_F(JniInternalTest, GetStringCritical_ReleaseStringCritical) {
10917577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  jstring s = env_->NewStringUTF("hello");
10927577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  ASSERT_TRUE(s != NULL);
10937577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes
10947577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  jchar expected[] = { 'h', 'e', 'l', 'l', 'o' };
10957577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  const jchar* chars = env_->GetStringCritical(s, NULL);
10967577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_EQ(expected[0], chars[0]);
10977577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_EQ(expected[1], chars[1]);
10987577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_EQ(expected[2], chars[2]);
10997577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_EQ(expected[3], chars[3]);
11007577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_EQ(expected[4], chars[4]);
11017577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  env_->ReleaseStringCritical(s, chars);
11027577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes
11037577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  jboolean is_copy = JNI_FALSE;
11047577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  chars = env_->GetStringCritical(s, &is_copy);
11057577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_EQ(JNI_FALSE, is_copy);
11067577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_EQ(expected[0], chars[0]);
11077577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_EQ(expected[1], chars[1]);
11087577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_EQ(expected[2], chars[2]);
11097577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_EQ(expected[3], chars[3]);
11107577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  EXPECT_EQ(expected[4], chars[4]);
11117577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes  env_->ReleaseStringCritical(s, chars);
11127577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes}
11137577075b147fd8fa37ca41e7a32d1124676776ceElliott Hughes
1114814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott HughesTEST_F(JniInternalTest, GetObjectArrayElement_SetObjectArrayElement) {
1115b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes  jclass java_lang_Class = env_->FindClass("java/lang/Class");
1116b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes  ASSERT_TRUE(java_lang_Class != NULL);
1117289da82ae82438ab3aed1898c82fd87c16846e74Elliott Hughes
1118b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes  jobjectArray array = env_->NewObjectArray(1, java_lang_Class, NULL);
1119289da82ae82438ab3aed1898c82fd87c16846e74Elliott Hughes  EXPECT_TRUE(array != NULL);
1120814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  EXPECT_TRUE(env_->GetObjectArrayElement(array, 0) == NULL);
1121b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes  env_->SetObjectArrayElement(array, 0, java_lang_Class);
1122b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes  EXPECT_TRUE(env_->IsSameObject(env_->GetObjectArrayElement(array, 0), java_lang_Class));
1123a5b897eae4b6f9f9608faa9eada7ddf42bf1bfd2Elliott Hughes
1124a5b897eae4b6f9f9608faa9eada7ddf42bf1bfd2Elliott Hughes  // ArrayIndexOutOfBounds for negative index.
1125b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes  env_->SetObjectArrayElement(array, -1, java_lang_Class);
1126814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  EXPECT_EXCEPTION(aioobe_);
1127a5b897eae4b6f9f9608faa9eada7ddf42bf1bfd2Elliott Hughes
1128a5b897eae4b6f9f9608faa9eada7ddf42bf1bfd2Elliott Hughes  // ArrayIndexOutOfBounds for too-large index.
1129b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes  env_->SetObjectArrayElement(array, 1, java_lang_Class);
1130814e40397fe6c8a2c645bae99f356dbddd6dbe18Elliott Hughes  EXPECT_EXCEPTION(aioobe_);
1131a5b897eae4b6f9f9608faa9eada7ddf42bf1bfd2Elliott Hughes
1132b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes  // ArrayStoreException thrown for bad types.
1133b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes  env_->SetObjectArrayElement(array, 0, env_->NewStringUTF("not a jclass!"));
1134b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes  EXPECT_EXCEPTION(ase_);
1135289da82ae82438ab3aed1898c82fd87c16846e74Elliott Hughes}
1136289da82ae82438ab3aed1898c82fd87c16846e74Elliott Hughes
1137885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes#define EXPECT_STATIC_PRIMITIVE_FIELD(type, field_name, sig, value1, value2) \
1138885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  do { \
1139885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes    jfieldID fid = env_->GetStaticFieldID(c, field_name, sig); \
1140885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes    EXPECT_TRUE(fid != NULL); \
1141885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes    env_->SetStatic ## type ## Field(c, fid, value1); \
11422e3d1b262af0839380e1d60e86d8b281943ef944Brian Carlstrom    EXPECT_TRUE(value1 == env_->GetStatic ## type ## Field(c, fid)); \
1143885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes    env_->SetStatic ## type ## Field(c, fid, value2); \
11442e3d1b262af0839380e1d60e86d8b281943ef944Brian Carlstrom    EXPECT_TRUE(value2 == env_->GetStatic ## type ## Field(c, fid)); \
1145885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  } while (false)
1146885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes
1147885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes#define EXPECT_PRIMITIVE_FIELD(instance, type, field_name, sig, value1, value2) \
1148885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  do { \
1149885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes    jfieldID fid = env_->GetFieldID(c, field_name, sig); \
1150885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes    EXPECT_TRUE(fid != NULL); \
1151885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes    env_->Set ## type ## Field(instance, fid, value1); \
11522e3d1b262af0839380e1d60e86d8b281943ef944Brian Carlstrom    EXPECT_TRUE(value1 == env_->Get ## type ## Field(instance, fid)); \
1153885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes    env_->Set ## type ## Field(instance, fid, value2); \
11542e3d1b262af0839380e1d60e86d8b281943ef944Brian Carlstrom    EXPECT_TRUE(value2 == env_->Get ## type ## Field(instance, fid)); \
1155885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  } while (false)
1156885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes
1157885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes
11585b8b1edc803a85bb3172560826d6a23fb23c3452Shih-wei Liao#if !defined(ART_USE_LLVM_COMPILER)
1159885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott HughesTEST_F(JniInternalTest, GetPrimitiveField_SetPrimitiveField) {
116000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  Thread::Current()->TransitionFromSuspendedToRunnable();
116100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  LoadDex("AllFields");
116225c3325bf95036bf325fc7cb21b4fd6d40282857Brian Carlstrom  runtime_->Start();
1163885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes
1164885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  jclass c = env_->FindClass("AllFields");
1165885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  ASSERT_TRUE(c != NULL);
1166885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  jobject o = env_->AllocObject(c);
1167885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  ASSERT_TRUE(o != NULL);
1168885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes
1169885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  EXPECT_STATIC_PRIMITIVE_FIELD(Boolean, "sZ", "Z", true, false);
1170885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  EXPECT_STATIC_PRIMITIVE_FIELD(Byte, "sB", "B", 1, 2);
1171885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  EXPECT_STATIC_PRIMITIVE_FIELD(Char, "sC", "C", 'a', 'b');
1172885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  EXPECT_STATIC_PRIMITIVE_FIELD(Double, "sD", "D", 1.0, 2.0);
1173885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  EXPECT_STATIC_PRIMITIVE_FIELD(Float, "sF", "F", 1.0, 2.0);
1174885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  EXPECT_STATIC_PRIMITIVE_FIELD(Int, "sI", "I", 1, 2);
1175885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  EXPECT_STATIC_PRIMITIVE_FIELD(Long, "sJ", "J", 1, 2);
1176885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  EXPECT_STATIC_PRIMITIVE_FIELD(Short, "sS", "S", 1, 2);
1177885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes
1178885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  EXPECT_PRIMITIVE_FIELD(o, Boolean, "iZ", "Z", true, false);
1179885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  EXPECT_PRIMITIVE_FIELD(o, Byte, "iB", "B", 1, 2);
1180885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  EXPECT_PRIMITIVE_FIELD(o, Char, "iC", "C", 'a', 'b');
1181885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  EXPECT_PRIMITIVE_FIELD(o, Double, "iD", "D", 1.0, 2.0);
1182885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  EXPECT_PRIMITIVE_FIELD(o, Float, "iF", "F", 1.0, 2.0);
1183885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  EXPECT_PRIMITIVE_FIELD(o, Int, "iI", "I", 1, 2);
1184885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  EXPECT_PRIMITIVE_FIELD(o, Long, "iJ", "J", 1, 2);
1185885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  EXPECT_PRIMITIVE_FIELD(o, Short, "iS", "S", 1, 2);
1186885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes}
1187885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes
1188885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott HughesTEST_F(JniInternalTest, GetObjectField_SetObjectField) {
118900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  Thread::Current()->TransitionFromSuspendedToRunnable();
119000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  LoadDex("AllFields");
119125c3325bf95036bf325fc7cb21b4fd6d40282857Brian Carlstrom  runtime_->Start();
1192885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes
1193885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  jclass c = env_->FindClass("AllFields");
1194885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  ASSERT_TRUE(c != NULL);
1195885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  jobject o = env_->AllocObject(c);
1196885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  ASSERT_TRUE(o != NULL);
1197885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes
1198885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  jstring s1 = env_->NewStringUTF("hello");
1199885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  ASSERT_TRUE(s1 != NULL);
1200885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  jstring s2 = env_->NewStringUTF("world");
1201885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  ASSERT_TRUE(s2 != NULL);
1202885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes
1203885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  jfieldID s_fid = env_->GetStaticFieldID(c, "sObject", "Ljava/lang/Object;");
1204885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  ASSERT_TRUE(s_fid != NULL);
1205885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  jfieldID i_fid = env_->GetFieldID(c, "iObject", "Ljava/lang/Object;");
1206885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  ASSERT_TRUE(i_fid != NULL);
1207885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes
1208885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  env_->SetStaticObjectField(c, s_fid, s1);
1209885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  ASSERT_TRUE(env_->IsSameObject(s1, env_->GetStaticObjectField(c, s_fid)));
1210885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  env_->SetStaticObjectField(c, s_fid, s2);
1211885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  ASSERT_TRUE(env_->IsSameObject(s2, env_->GetStaticObjectField(c, s_fid)));
1212885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes
1213885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  env_->SetObjectField(o, i_fid, s1);
1214885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  ASSERT_TRUE(env_->IsSameObject(s1, env_->GetObjectField(o, i_fid)));
1215885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  env_->SetObjectField(o, i_fid, s2);
1216885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes  ASSERT_TRUE(env_->IsSameObject(s2, env_->GetObjectField(o, i_fid)));
1217885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes}
12185b8b1edc803a85bb3172560826d6a23fb23c3452Shih-wei Liao#endif
1219885c3bd4d7adcc7f60f656b4f7247e7065feadf3Elliott Hughes
122018c0753c1659629021b4becdaa3f6ea81aecce35Elliott HughesTEST_F(JniInternalTest, NewLocalRef_NULL) {
122118c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  EXPECT_TRUE(env_->NewLocalRef(NULL) == NULL);
122218c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes}
122318c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes
122418c0753c1659629021b4becdaa3f6ea81aecce35Elliott HughesTEST_F(JniInternalTest, NewLocalRef) {
122518c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  jstring s = env_->NewStringUTF("");
122618c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  ASSERT_TRUE(s != NULL);
122718c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  jobject o = env_->NewLocalRef(s);
122818c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  EXPECT_TRUE(o != NULL);
122918c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  EXPECT_TRUE(o != s);
123018c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes
12312ced6a534157d5d963693346904389c19775d2daElliott Hughes  EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(o));
123218c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes}
123318c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes
123418c0753c1659629021b4becdaa3f6ea81aecce35Elliott HughesTEST_F(JniInternalTest, DeleteLocalRef_NULL) {
123518c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  env_->DeleteLocalRef(NULL);
123618c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes}
123718c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes
123818c0753c1659629021b4becdaa3f6ea81aecce35Elliott HughesTEST_F(JniInternalTest, DeleteLocalRef) {
123918c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  jstring s = env_->NewStringUTF("");
124018c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  ASSERT_TRUE(s != NULL);
124118c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  env_->DeleteLocalRef(s);
124218c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes
12433f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes  // Currently, deleting an already-deleted reference is just a CheckJNI warning.
1244b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes  {
1245b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes    CheckJniAbortCatcher check_jni_abort_catcher;
1246b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes    env_->DeleteLocalRef(s);
124700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers    check_jni_abort_catcher.Check("native code passing in reference to invalid local reference: 0x1400001");
1248b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes  }
124918c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes
125018c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  s = env_->NewStringUTF("");
125118c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  ASSERT_TRUE(s != NULL);
125218c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  jobject o = env_->NewLocalRef(s);
125318c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  ASSERT_TRUE(o != NULL);
125418c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes
125518c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  env_->DeleteLocalRef(s);
125618c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  env_->DeleteLocalRef(o);
125718c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes}
125818c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes
12592ced6a534157d5d963693346904389c19775d2daElliott HughesTEST_F(JniInternalTest, PushLocalFrame_PopLocalFrame) {
12602ced6a534157d5d963693346904389c19775d2daElliott Hughes  jobject original = env_->NewStringUTF("");
12612ced6a534157d5d963693346904389c19775d2daElliott Hughes  ASSERT_TRUE(original != NULL);
12622ced6a534157d5d963693346904389c19775d2daElliott Hughes
12632ced6a534157d5d963693346904389c19775d2daElliott Hughes  jobject outer;
12642ced6a534157d5d963693346904389c19775d2daElliott Hughes  jobject inner1, inner2;
126500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedObjectAccess soa(env_);
12662ced6a534157d5d963693346904389c19775d2daElliott Hughes  Object* inner2_direct_pointer;
12672ced6a534157d5d963693346904389c19775d2daElliott Hughes  {
12682ced6a534157d5d963693346904389c19775d2daElliott Hughes    env_->PushLocalFrame(4);
12692ced6a534157d5d963693346904389c19775d2daElliott Hughes    outer = env_->NewLocalRef(original);
12702ced6a534157d5d963693346904389c19775d2daElliott Hughes
12712ced6a534157d5d963693346904389c19775d2daElliott Hughes    {
12722ced6a534157d5d963693346904389c19775d2daElliott Hughes      env_->PushLocalFrame(4);
12732ced6a534157d5d963693346904389c19775d2daElliott Hughes      inner1 = env_->NewLocalRef(outer);
12742ced6a534157d5d963693346904389c19775d2daElliott Hughes      inner2 = env_->NewStringUTF("survivor");
127500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      inner2_direct_pointer = soa.Decode<Object*>(inner2);
12762ced6a534157d5d963693346904389c19775d2daElliott Hughes      env_->PopLocalFrame(inner2);
12772ced6a534157d5d963693346904389c19775d2daElliott Hughes    }
12782ced6a534157d5d963693346904389c19775d2daElliott Hughes
12792ced6a534157d5d963693346904389c19775d2daElliott Hughes    EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(original));
12802ced6a534157d5d963693346904389c19775d2daElliott Hughes    EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(outer));
12812ced6a534157d5d963693346904389c19775d2daElliott Hughes    EXPECT_EQ(JNIInvalidRefType, env_->GetObjectRefType(inner1));
12822ced6a534157d5d963693346904389c19775d2daElliott Hughes
12832ced6a534157d5d963693346904389c19775d2daElliott Hughes    // Our local reference for the survivor is invalid because the survivor
12842ced6a534157d5d963693346904389c19775d2daElliott Hughes    // gets a new local reference...
12852ced6a534157d5d963693346904389c19775d2daElliott Hughes    EXPECT_EQ(JNIInvalidRefType, env_->GetObjectRefType(inner2));
12862ced6a534157d5d963693346904389c19775d2daElliott Hughes    // ...but the survivor should be in the local reference table.
12874d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom    JNIEnvExt* env = reinterpret_cast<JNIEnvExt*>(env_);
12884d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom    EXPECT_TRUE(env->locals.ContainsDirectPointer(inner2_direct_pointer));
12892ced6a534157d5d963693346904389c19775d2daElliott Hughes
12902ced6a534157d5d963693346904389c19775d2daElliott Hughes    env_->PopLocalFrame(NULL);
12912ced6a534157d5d963693346904389c19775d2daElliott Hughes  }
12922ced6a534157d5d963693346904389c19775d2daElliott Hughes  EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(original));
12932ced6a534157d5d963693346904389c19775d2daElliott Hughes  EXPECT_EQ(JNIInvalidRefType, env_->GetObjectRefType(outer));
12942ced6a534157d5d963693346904389c19775d2daElliott Hughes  EXPECT_EQ(JNIInvalidRefType, env_->GetObjectRefType(inner1));
12952ced6a534157d5d963693346904389c19775d2daElliott Hughes  EXPECT_EQ(JNIInvalidRefType, env_->GetObjectRefType(inner2));
12962ced6a534157d5d963693346904389c19775d2daElliott Hughes}
12972ced6a534157d5d963693346904389c19775d2daElliott Hughes
129818c0753c1659629021b4becdaa3f6ea81aecce35Elliott HughesTEST_F(JniInternalTest, NewGlobalRef_NULL) {
129918c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  EXPECT_TRUE(env_->NewGlobalRef(NULL) == NULL);
130018c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes}
130118c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes
130218c0753c1659629021b4becdaa3f6ea81aecce35Elliott HughesTEST_F(JniInternalTest, NewGlobalRef) {
130318c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  jstring s = env_->NewStringUTF("");
130418c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  ASSERT_TRUE(s != NULL);
130518c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  jobject o = env_->NewGlobalRef(s);
130618c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  EXPECT_TRUE(o != NULL);
130718c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  EXPECT_TRUE(o != s);
130818c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes
130918c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  // TODO: check that o is a global reference.
131018c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes}
131118c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes
131218c0753c1659629021b4becdaa3f6ea81aecce35Elliott HughesTEST_F(JniInternalTest, DeleteGlobalRef_NULL) {
131318c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  env_->DeleteGlobalRef(NULL);
131418c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes}
131518c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes
131618c0753c1659629021b4becdaa3f6ea81aecce35Elliott HughesTEST_F(JniInternalTest, DeleteGlobalRef) {
131718c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  jstring s = env_->NewStringUTF("");
131818c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  ASSERT_TRUE(s != NULL);
131918c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes
132018c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  jobject o = env_->NewGlobalRef(s);
132118c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  ASSERT_TRUE(o != NULL);
132218c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  env_->DeleteGlobalRef(o);
132318c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes
13243f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes  // Currently, deleting an already-deleted reference is just a CheckJNI warning.
1325b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes  {
1326b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes    CheckJniAbortCatcher check_jni_abort_catcher;
1327b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes    env_->DeleteGlobalRef(o);
132800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers    check_jni_abort_catcher.Check("native code passing in reference to invalid global reference: 0x100056");
1329b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes  }
133018c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes
133118c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  jobject o1 = env_->NewGlobalRef(s);
133218c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  ASSERT_TRUE(o1 != NULL);
133318c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  jobject o2 = env_->NewGlobalRef(s);
133418c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  ASSERT_TRUE(o2 != NULL);
133518c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes
133618c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  env_->DeleteGlobalRef(o1);
133718c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  env_->DeleteGlobalRef(o2);
133818c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes}
133918c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes
134018c0753c1659629021b4becdaa3f6ea81aecce35Elliott HughesTEST_F(JniInternalTest, NewWeakGlobalRef_NULL) {
134118c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  EXPECT_TRUE(env_->NewWeakGlobalRef(NULL) == NULL);
134218c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes}
134318c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes
134418c0753c1659629021b4becdaa3f6ea81aecce35Elliott HughesTEST_F(JniInternalTest, NewWeakGlobalRef) {
134518c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  jstring s = env_->NewStringUTF("");
134618c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  ASSERT_TRUE(s != NULL);
134718c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  jobject o = env_->NewWeakGlobalRef(s);
134818c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  EXPECT_TRUE(o != NULL);
134918c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  EXPECT_TRUE(o != s);
135018c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes
135118c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  // TODO: check that o is a weak global reference.
135218c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes}
135318c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes
135418c0753c1659629021b4becdaa3f6ea81aecce35Elliott HughesTEST_F(JniInternalTest, DeleteWeakGlobalRef_NULL) {
135518c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  env_->DeleteWeakGlobalRef(NULL);
135618c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes}
135718c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes
135818c0753c1659629021b4becdaa3f6ea81aecce35Elliott HughesTEST_F(JniInternalTest, DeleteWeakGlobalRef) {
135918c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  jstring s = env_->NewStringUTF("");
136018c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  ASSERT_TRUE(s != NULL);
136118c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes
136218c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  jobject o = env_->NewWeakGlobalRef(s);
136318c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  ASSERT_TRUE(o != NULL);
136418c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  env_->DeleteWeakGlobalRef(o);
136518c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes
13663f6635a2c84d645002f651c312d53f8348646c1fElliott Hughes  // Currently, deleting an already-deleted reference is just a CheckJNI warning.
1367b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes  {
1368b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes    CheckJniAbortCatcher check_jni_abort_catcher;
1369b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes    env_->DeleteWeakGlobalRef(o);
137056ef042065ce282f8f01a0f31f5cce868a60ede8Elliott Hughes    check_jni_abort_catcher.Check("native code passing in reference to invalid weak global reference: 0x100003");
1371b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes  }
137218c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes
137318c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  jobject o1 = env_->NewWeakGlobalRef(s);
137418c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  ASSERT_TRUE(o1 != NULL);
137518c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  jobject o2 = env_->NewWeakGlobalRef(s);
137618c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  ASSERT_TRUE(o2 != NULL);
137718c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes
137818c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  env_->DeleteWeakGlobalRef(o1);
137918c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes  env_->DeleteWeakGlobalRef(o2);
138018c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes}
138118c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes
13829b9ba28b1277b4ddb967c5a968c6d550febce6afCarl ShapiroTEST_F(JniInternalTest, StaticMainMethod) {
138300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedObjectAccess soa(Thread::Current());
138400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  jobject jclass_loader = LoadDex("Main");
138500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  SirtRef<ClassLoader> class_loader(soa.Decode<ClassLoader*>(jclass_loader));
138640381fb9dc4b4cf274f1e58b2cdf4396202c6189Brian Carlstrom  CompileDirectMethod(class_loader.get(), "Main", "main", "([Ljava/lang/String;)V");
13879b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
138840381fb9dc4b4cf274f1e58b2cdf4396202c6189Brian Carlstrom  Class* klass = class_linker_->FindClass("LMain;", class_loader.get());
13899b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  ASSERT_TRUE(klass != NULL);
13909b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
13919b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  Method* method = klass->FindDirectMethod("main", "([Ljava/lang/String;)V");
13929b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  ASSERT_TRUE(method != NULL);
13939b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
13949baa4aefc370f48774b6104680193d9a7e4fb631Brian Carlstrom  Method::InvokeStub* stub = method->GetInvokeStub();
13959b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
139677405796564c6c1353807cda18b28678a719bd68Elliott Hughes  JValue args[1];
1397f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes  args[0].SetL(NULL);
13989b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
139977405796564c6c1353807cda18b28678a719bd68Elliott Hughes  (*stub)(method, NULL, Thread::Current(), args, NULL);
14009b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro}
14019b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
14029b9ba28b1277b4ddb967c5a968c6d550febce6afCarl ShapiroTEST_F(JniInternalTest, StaticNopMethod) {
140300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedObjectAccess soa(Thread::Current());
140477405796564c6c1353807cda18b28678a719bd68Elliott Hughes  InvokeNopMethod(true);
140577405796564c6c1353807cda18b28678a719bd68Elliott Hughes}
14069b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
140777405796564c6c1353807cda18b28678a719bd68Elliott HughesTEST_F(JniInternalTest, NonStaticNopMethod) {
140800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedObjectAccess soa(Thread::Current());
140977405796564c6c1353807cda18b28678a719bd68Elliott Hughes  InvokeNopMethod(false);
14109b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro}
14119b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
14129b9ba28b1277b4ddb967c5a968c6d550febce6afCarl ShapiroTEST_F(JniInternalTest, StaticIdentityByteMethod) {
141300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedObjectAccess soa(Thread::Current());
141477405796564c6c1353807cda18b28678a719bd68Elliott Hughes  InvokeIdentityByteMethod(true);
141577405796564c6c1353807cda18b28678a719bd68Elliott Hughes}
14169b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
141777405796564c6c1353807cda18b28678a719bd68Elliott HughesTEST_F(JniInternalTest, NonStaticIdentityByteMethod) {
141800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedObjectAccess soa(Thread::Current());
141977405796564c6c1353807cda18b28678a719bd68Elliott Hughes  InvokeIdentityByteMethod(false);
14209b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro}
14219b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
14229b9ba28b1277b4ddb967c5a968c6d550febce6afCarl ShapiroTEST_F(JniInternalTest, StaticIdentityIntMethod) {
142300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedObjectAccess soa(Thread::Current());
142477405796564c6c1353807cda18b28678a719bd68Elliott Hughes  InvokeIdentityIntMethod(true);
142577405796564c6c1353807cda18b28678a719bd68Elliott Hughes}
14269b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
142777405796564c6c1353807cda18b28678a719bd68Elliott HughesTEST_F(JniInternalTest, NonStaticIdentityIntMethod) {
142800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedObjectAccess soa(Thread::Current());
142977405796564c6c1353807cda18b28678a719bd68Elliott Hughes  InvokeIdentityIntMethod(false);
14309b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro}
14319b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
14329b9ba28b1277b4ddb967c5a968c6d550febce6afCarl ShapiroTEST_F(JniInternalTest, StaticIdentityDoubleMethod) {
143300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedObjectAccess soa(Thread::Current());
143477405796564c6c1353807cda18b28678a719bd68Elliott Hughes  InvokeIdentityDoubleMethod(true);
143577405796564c6c1353807cda18b28678a719bd68Elliott Hughes}
14369b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
143777405796564c6c1353807cda18b28678a719bd68Elliott HughesTEST_F(JniInternalTest, NonStaticIdentityDoubleMethod) {
143800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedObjectAccess soa(Thread::Current());
143977405796564c6c1353807cda18b28678a719bd68Elliott Hughes  InvokeIdentityDoubleMethod(false);
14405b8b1edc803a85bb3172560826d6a23fb23c3452Shih-wei Liao}
14415b8b1edc803a85bb3172560826d6a23fb23c3452Shih-wei Liao
14429b9ba28b1277b4ddb967c5a968c6d550febce6afCarl ShapiroTEST_F(JniInternalTest, StaticSumIntIntMethod) {
144300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedObjectAccess soa(Thread::Current());
144477405796564c6c1353807cda18b28678a719bd68Elliott Hughes  InvokeSumIntIntMethod(true);
144577405796564c6c1353807cda18b28678a719bd68Elliott Hughes}
14469b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
144777405796564c6c1353807cda18b28678a719bd68Elliott HughesTEST_F(JniInternalTest, NonStaticSumIntIntMethod) {
144800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedObjectAccess soa(Thread::Current());
144977405796564c6c1353807cda18b28678a719bd68Elliott Hughes  InvokeSumIntIntMethod(false);
14509b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro}
14519b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
14529b9ba28b1277b4ddb967c5a968c6d550febce6afCarl ShapiroTEST_F(JniInternalTest, StaticSumIntIntIntMethod) {
145300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedObjectAccess soa(Thread::Current());
145477405796564c6c1353807cda18b28678a719bd68Elliott Hughes  InvokeSumIntIntIntMethod(true);
145577405796564c6c1353807cda18b28678a719bd68Elliott Hughes}
14569b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
145777405796564c6c1353807cda18b28678a719bd68Elliott HughesTEST_F(JniInternalTest, NonStaticSumIntIntIntMethod) {
145800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedObjectAccess soa(Thread::Current());
145977405796564c6c1353807cda18b28678a719bd68Elliott Hughes  InvokeSumIntIntIntMethod(false);
14609b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro}
14619b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
14629b9ba28b1277b4ddb967c5a968c6d550febce6afCarl ShapiroTEST_F(JniInternalTest, StaticSumIntIntIntIntMethod) {
146300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedObjectAccess soa(Thread::Current());
146477405796564c6c1353807cda18b28678a719bd68Elliott Hughes  InvokeSumIntIntIntIntMethod(true);
146577405796564c6c1353807cda18b28678a719bd68Elliott Hughes}
14669b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
146777405796564c6c1353807cda18b28678a719bd68Elliott HughesTEST_F(JniInternalTest, NonStaticSumIntIntIntIntMethod) {
146800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedObjectAccess soa(Thread::Current());
146977405796564c6c1353807cda18b28678a719bd68Elliott Hughes  InvokeSumIntIntIntIntMethod(false);
14709b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro}
14719b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
14729b9ba28b1277b4ddb967c5a968c6d550febce6afCarl ShapiroTEST_F(JniInternalTest, StaticSumIntIntIntIntIntMethod) {
147300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedObjectAccess soa(Thread::Current());
147477405796564c6c1353807cda18b28678a719bd68Elliott Hughes  InvokeSumIntIntIntIntIntMethod(true);
147577405796564c6c1353807cda18b28678a719bd68Elliott Hughes}
14769b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
147777405796564c6c1353807cda18b28678a719bd68Elliott HughesTEST_F(JniInternalTest, NonStaticSumIntIntIntIntIntMethod) {
147800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedObjectAccess soa(Thread::Current());
147977405796564c6c1353807cda18b28678a719bd68Elliott Hughes  InvokeSumIntIntIntIntIntMethod(false);
14809b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro}
14819b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
14829b9ba28b1277b4ddb967c5a968c6d550febce6afCarl ShapiroTEST_F(JniInternalTest, StaticSumDoubleDoubleMethod) {
148300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedObjectAccess soa(Thread::Current());
148477405796564c6c1353807cda18b28678a719bd68Elliott Hughes  InvokeSumDoubleDoubleMethod(true);
148577405796564c6c1353807cda18b28678a719bd68Elliott Hughes}
14869b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
148777405796564c6c1353807cda18b28678a719bd68Elliott HughesTEST_F(JniInternalTest, NonStaticSumDoubleDoubleMethod) {
148800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedObjectAccess soa(Thread::Current());
148977405796564c6c1353807cda18b28678a719bd68Elliott Hughes  InvokeSumDoubleDoubleMethod(false);
14909b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro}
14919b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
14929b9ba28b1277b4ddb967c5a968c6d550febce6afCarl ShapiroTEST_F(JniInternalTest, StaticSumDoubleDoubleDoubleMethod) {
149300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedObjectAccess soa(Thread::Current());
149477405796564c6c1353807cda18b28678a719bd68Elliott Hughes  InvokeSumDoubleDoubleDoubleMethod(true);
149577405796564c6c1353807cda18b28678a719bd68Elliott Hughes}
14969b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
149777405796564c6c1353807cda18b28678a719bd68Elliott HughesTEST_F(JniInternalTest, NonStaticSumDoubleDoubleDoubleMethod) {
149800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedObjectAccess soa(Thread::Current());
149977405796564c6c1353807cda18b28678a719bd68Elliott Hughes  InvokeSumDoubleDoubleDoubleMethod(false);
15009b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro}
15019b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
15029b9ba28b1277b4ddb967c5a968c6d550febce6afCarl ShapiroTEST_F(JniInternalTest, StaticSumDoubleDoubleDoubleDoubleMethod) {
150300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedObjectAccess soa(Thread::Current());
150477405796564c6c1353807cda18b28678a719bd68Elliott Hughes  InvokeSumDoubleDoubleDoubleDoubleMethod(true);
150577405796564c6c1353807cda18b28678a719bd68Elliott Hughes}
15069b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
150777405796564c6c1353807cda18b28678a719bd68Elliott HughesTEST_F(JniInternalTest, NonStaticSumDoubleDoubleDoubleDoubleMethod) {
150800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedObjectAccess soa(Thread::Current());
150977405796564c6c1353807cda18b28678a719bd68Elliott Hughes  InvokeSumDoubleDoubleDoubleDoubleMethod(false);
15109b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro}
15119b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
15129b9ba28b1277b4ddb967c5a968c6d550febce6afCarl ShapiroTEST_F(JniInternalTest, StaticSumDoubleDoubleDoubleDoubleDoubleMethod) {
151300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedObjectAccess soa(Thread::Current());
151477405796564c6c1353807cda18b28678a719bd68Elliott Hughes  InvokeSumDoubleDoubleDoubleDoubleDoubleMethod(true);
151577405796564c6c1353807cda18b28678a719bd68Elliott Hughes}
15169b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
151777405796564c6c1353807cda18b28678a719bd68Elliott HughesTEST_F(JniInternalTest, NonStaticSumDoubleDoubleDoubleDoubleDoubleMethod) {
151800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedObjectAccess soa(Thread::Current());
151977405796564c6c1353807cda18b28678a719bd68Elliott Hughes  InvokeSumDoubleDoubleDoubleDoubleDoubleMethod(false);
15209b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro}
15219b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
152237f7a40f6789bb287f287a9af00777af9d6428eeElliott HughesTEST_F(JniInternalTest, Throw) {
152337f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  EXPECT_EQ(JNI_ERR, env_->Throw(NULL));
152437f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes
152537f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  jclass exception_class = env_->FindClass("java/lang/RuntimeException");
152637f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  ASSERT_TRUE(exception_class != NULL);
152737f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  jthrowable exception = reinterpret_cast<jthrowable>(env_->AllocObject(exception_class));
152837f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  ASSERT_TRUE(exception != NULL);
152937f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes
153037f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  EXPECT_EQ(JNI_OK, env_->Throw(exception));
153137f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  EXPECT_TRUE(env_->ExceptionCheck());
1532a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes  jthrowable thrown_exception = env_->ExceptionOccurred();
153337f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  env_->ExceptionClear();
1534a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes  EXPECT_TRUE(env_->IsSameObject(exception, thrown_exception));
153537f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes}
153637f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes
153737f7a40f6789bb287f287a9af00777af9d6428eeElliott HughesTEST_F(JniInternalTest, ThrowNew) {
153837f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  EXPECT_EQ(JNI_ERR, env_->Throw(NULL));
153937f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes
154037f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  jclass exception_class = env_->FindClass("java/lang/RuntimeException");
154137f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  ASSERT_TRUE(exception_class != NULL);
154237f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes
15435cb5ad27944efb08d4556b3c0d362302e37e832bElliott Hughes  jthrowable thrown_exception;
15445cb5ad27944efb08d4556b3c0d362302e37e832bElliott Hughes
154537f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  EXPECT_EQ(JNI_OK, env_->ThrowNew(exception_class, "hello world"));
154637f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  EXPECT_TRUE(env_->ExceptionCheck());
15475cb5ad27944efb08d4556b3c0d362302e37e832bElliott Hughes  thrown_exception = env_->ExceptionOccurred();
15485cb5ad27944efb08d4556b3c0d362302e37e832bElliott Hughes  env_->ExceptionClear();
15495cb5ad27944efb08d4556b3c0d362302e37e832bElliott Hughes  EXPECT_TRUE(env_->IsInstanceOf(thrown_exception, exception_class));
15505cb5ad27944efb08d4556b3c0d362302e37e832bElliott Hughes
15515cb5ad27944efb08d4556b3c0d362302e37e832bElliott Hughes  EXPECT_EQ(JNI_OK, env_->ThrowNew(exception_class, NULL));
15525cb5ad27944efb08d4556b3c0d362302e37e832bElliott Hughes  EXPECT_TRUE(env_->ExceptionCheck());
15535cb5ad27944efb08d4556b3c0d362302e37e832bElliott Hughes  thrown_exception = env_->ExceptionOccurred();
155437f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes  env_->ExceptionClear();
1555a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes  EXPECT_TRUE(env_->IsInstanceOf(thrown_exception, exception_class));
155637f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes}
155737f7a40f6789bb287f287a9af00777af9d6428eeElliott Hughes
1558b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes// TODO: this test is DISABLED until we can actually run java.nio.Buffer's <init>.
1559b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott HughesTEST_F(JniInternalTest, DISABLED_NewDirectBuffer_GetDirectBufferAddress_GetDirectBufferCapacity) {
1560b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  jclass buffer_class = env_->FindClass("java/nio/Buffer");
1561b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  ASSERT_TRUE(buffer_class != NULL);
1562b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes
1563b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  char bytes[1024];
1564b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  jobject buffer = env_->NewDirectByteBuffer(bytes, sizeof(bytes));
1565b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  ASSERT_TRUE(buffer != NULL);
1566b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  ASSERT_TRUE(env_->IsInstanceOf(buffer, buffer_class));
1567b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  ASSERT_TRUE(env_->GetDirectBufferAddress(buffer) == bytes);
1568b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes  ASSERT_TRUE(env_->GetDirectBufferCapacity(buffer) == sizeof(bytes));
1569b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes}
1570b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes
15716d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian RogersTEST_F(JniInternalTest, MonitorEnterExit) {
15726d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  // Create an object to torture
15736d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  jclass object_class = env_->FindClass("java/lang/Object");
15746d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  ASSERT_TRUE(object_class != NULL);
15756d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  jobject object = env_->AllocObject(object_class);
15766d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  ASSERT_TRUE(object != NULL);
15776d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers
15786d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  // Expected class of exceptions
15796d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  jclass imse_class = env_->FindClass("java/lang/IllegalMonitorStateException");
15806d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  ASSERT_TRUE(imse_class != NULL);
15816d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers
15826d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  jthrowable thrown_exception;
15836d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers
15846d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  // Unlock of unowned monitor
15856d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  env_->MonitorExit(object);
15866d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  EXPECT_TRUE(env_->ExceptionCheck());
15876d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  thrown_exception = env_->ExceptionOccurred();
15886d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  env_->ExceptionClear();
15896d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  EXPECT_TRUE(env_->IsInstanceOf(thrown_exception, imse_class));
15906d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers
15916d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  // Lock of unowned monitor
15926d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  env_->MonitorEnter(object);
15936d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  EXPECT_FALSE(env_->ExceptionCheck());
15946d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  // Regular unlock
15956d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  env_->MonitorExit(object);
15966d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  EXPECT_FALSE(env_->ExceptionCheck());
15976d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers
15986d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  // Recursively lock a lot
15996d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  size_t max_recursive_lock = 1024;
16006d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  for (size_t i = 0; i < max_recursive_lock; i++) {
16016d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers    env_->MonitorEnter(object);
16026d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers    EXPECT_FALSE(env_->ExceptionCheck());
16036d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  }
16046d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  // Recursively unlock a lot
16056d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  for (size_t i = 0; i < max_recursive_lock; i++) {
16066d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers    env_->MonitorExit(object);
16076d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers    EXPECT_FALSE(env_->ExceptionCheck());
16086d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  }
16096d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers
16106d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  // Unlock of unowned monitor
16116d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  env_->MonitorExit(object);
16126d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  EXPECT_TRUE(env_->ExceptionCheck());
16136d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  thrown_exception = env_->ExceptionOccurred();
16146d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  env_->ExceptionClear();
16156d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers  EXPECT_TRUE(env_->IsInstanceOf(thrown_exception, imse_class));
1616a92853eb60fbce1fa6d3bbd6a6013fb514fdf5cbElliott Hughes
1617a92853eb60fbce1fa6d3bbd6a6013fb514fdf5cbElliott Hughes  // It's an error to call MonitorEnter or MonitorExit on NULL.
1618b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes  {
1619b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes    CheckJniAbortCatcher check_jni_abort_catcher;
1620b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes    env_->MonitorEnter(NULL);
1621b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes    check_jni_abort_catcher.Check("in call to MonitorEnter");
1622b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes
1623b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes    env_->MonitorExit(NULL);
1624b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes    check_jni_abort_catcher.Check("in call to MonitorExit");
1625b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes  }
16266d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers}
16276d0b13e931fb73d5e964d14b0a7ecd1f3f5db547Ian Rogers
16284d5714378c3433ba7e351cbf6a6713fb49c31784Brian CarlstromTEST_F(JniInternalTest, DetachCurrentThread) {
16294d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom  CleanUpJniEnv();  // cleanup now so TearDown won't have junk from wrong JNIEnv
16304d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom  jint ok = vm_->DetachCurrentThread();
16314d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom  EXPECT_EQ(JNI_OK, ok);
16324d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom
16334d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom  jint err = vm_->DetachCurrentThread();
16344d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom  EXPECT_EQ(JNI_ERR, err);
16354d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom  vm_->AttachCurrentThread(&env_, NULL);  // need attached thread for CommonTest::TearDown
16364d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom}
16374d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom
16380cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers}  // namespace art
1639