blob: 2cbfa81b9145a74d228aaaa10866d4c680a30b8c [file] [log] [blame]
Ian Rogersf4d4da12014-11-11 16:10:33 -08001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "jni_internal.h"
18
19#include <pthread.h>
20
21#include "common_runtime_test.h"
22#include "java_vm_ext.h"
23#include "runtime.h"
24
25namespace art {
26
27class JavaVmExtTest : public CommonRuntimeTest {
28 protected:
29 virtual void SetUp() {
30 CommonRuntimeTest::SetUp();
31
32 vm_ = Runtime::Current()->GetJavaVM();
33 }
34
35
36 virtual void TearDown() OVERRIDE {
37 CommonRuntimeTest::TearDown();
38 }
39
40 JavaVMExt* vm_;
41};
42
43TEST_F(JavaVmExtTest, JNI_GetDefaultJavaVMInitArgs) {
44 jint err = JNI_GetDefaultJavaVMInitArgs(nullptr);
45 EXPECT_EQ(JNI_ERR, err);
46}
47
48TEST_F(JavaVmExtTest, JNI_GetCreatedJavaVMs) {
49 JavaVM* vms_buf[1];
50 jsize num_vms;
51 jint ok = JNI_GetCreatedJavaVMs(vms_buf, arraysize(vms_buf), &num_vms);
52 EXPECT_EQ(JNI_OK, ok);
53 EXPECT_EQ(1, num_vms);
54 EXPECT_EQ(vms_buf[0], vm_);
55}
56
57static bool gSmallStack = false;
58static bool gAsDaemon = false;
59
60static void* attach_current_thread_callback(void* arg ATTRIBUTE_UNUSED) {
61 JavaVM* vms_buf[1];
62 jsize num_vms;
63 JNIEnv* env;
64 jint ok = JNI_GetCreatedJavaVMs(vms_buf, arraysize(vms_buf), &num_vms);
65 EXPECT_EQ(JNI_OK, ok);
66 if (ok == JNI_OK) {
67 if (!gAsDaemon) {
68 ok = vms_buf[0]->AttachCurrentThread(&env, nullptr);
69 } else {
70 ok = vms_buf[0]->AttachCurrentThreadAsDaemon(&env, nullptr);
71 }
Andreas Gampe12865492015-01-08 16:43:13 -080072 // TODO: Find a way to test with exact SMALL_STACK value, for which we would bail. The pthreads
73 // spec says that the stack size argument is a lower bound, and bionic currently gives us
74 // a chunk more on arm64.
75 if (!gSmallStack) {
76 EXPECT_EQ(JNI_OK, ok);
77 }
Ian Rogersf4d4da12014-11-11 16:10:33 -080078 if (ok == JNI_OK) {
79 ok = vms_buf[0]->DetachCurrentThread();
80 EXPECT_EQ(JNI_OK, ok);
81 }
82 }
83 return nullptr;
84}
85
86TEST_F(JavaVmExtTest, AttachCurrentThread) {
87 pthread_t pthread;
88 const char* reason = __PRETTY_FUNCTION__;
89 gSmallStack = false;
90 gAsDaemon = false;
91 CHECK_PTHREAD_CALL(pthread_create, (&pthread, nullptr, attach_current_thread_callback,
92 nullptr), reason);
93 void* ret_val;
94 CHECK_PTHREAD_CALL(pthread_join, (pthread, &ret_val), reason);
95 EXPECT_EQ(ret_val, nullptr);
96}
97
98TEST_F(JavaVmExtTest, AttachCurrentThreadAsDaemon) {
99 pthread_t pthread;
100 const char* reason = __PRETTY_FUNCTION__;
101 gSmallStack = false;
102 gAsDaemon = true;
103 CHECK_PTHREAD_CALL(pthread_create, (&pthread, nullptr, attach_current_thread_callback,
104 nullptr), reason);
105 void* ret_val;
106 CHECK_PTHREAD_CALL(pthread_join, (pthread, &ret_val), reason);
107 EXPECT_EQ(ret_val, nullptr);
108}
109
110TEST_F(JavaVmExtTest, AttachCurrentThread_SmallStack) {
111 pthread_t pthread;
112 pthread_attr_t attr;
113 const char* reason = __PRETTY_FUNCTION__;
114 gSmallStack = true;
115 gAsDaemon = false;
116 CHECK_PTHREAD_CALL(pthread_attr_init, (&attr), reason);
117 CHECK_PTHREAD_CALL(pthread_attr_setstacksize, (&attr, PTHREAD_STACK_MIN), reason);
118 CHECK_PTHREAD_CALL(pthread_create, (&pthread, &attr, attach_current_thread_callback,
119 nullptr), reason);
120 CHECK_PTHREAD_CALL(pthread_attr_destroy, (&attr), reason);
121 void* ret_val;
122 CHECK_PTHREAD_CALL(pthread_join, (pthread, &ret_val), reason);
123 EXPECT_EQ(ret_val, nullptr);
124}
125
126TEST_F(JavaVmExtTest, DetachCurrentThread) {
127 JNIEnv* env;
128 jint ok = vm_->AttachCurrentThread(&env, nullptr);
129 ASSERT_EQ(JNI_OK, ok);
130 ok = vm_->DetachCurrentThread();
131 EXPECT_EQ(JNI_OK, ok);
132
133 jint err = vm_->DetachCurrentThread();
134 EXPECT_EQ(JNI_ERR, err);
135}
136
137} // namespace art