blob: c159d71b593b22a3afcada8f5807a827fe720481 [file] [log] [blame]
Steven Moreland2e87adc2018-08-20 19:47:00 -07001/*
2 * Copyright (C) 2018 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 <android-base/logging.h>
Steven Moreland02f75652018-09-18 14:08:30 -070018#include <android/binder_ibinder_jni.h>
Steven Moreland2e87adc2018-08-20 19:47:00 -070019#include <android/binder_manager.h>
Steven Moreland901c7452018-09-04 16:17:28 -070020#include <android/binder_process.h>
Steven Moreland2e87adc2018-08-20 19:47:00 -070021#include <gtest/gtest.h>
22#include <iface/iface.h>
23
Steven Moreland507547f2018-11-06 15:58:05 -080024#include <chrono>
25#include <condition_variable>
26#include <mutex>
27
Steven Moreland2e87adc2018-08-20 19:47:00 -070028using ::android::sp;
29
30constexpr char kExistingNonNdkService[] = "SurfaceFlinger";
31
32// This is too slow
33// TEST(NdkBinder, GetServiceThatDoesntExist) {
34// sp<IFoo> foo = IFoo::getService("asdfghkl;");
35// EXPECT_EQ(nullptr, foo.get());
36// }
37
38TEST(NdkBinder, DoubleNumber) {
39 sp<IFoo> foo = IFoo::getService(IFoo::kSomeInstanceName);
40 ASSERT_NE(foo, nullptr);
Steven Moreland507547f2018-11-06 15:58:05 -080041
42 int32_t out;
43 EXPECT_EQ(STATUS_OK, foo->doubleNumber(1, &out));
44 EXPECT_EQ(2, out);
45}
46
47void LambdaOnDeath(void* cookie) {
48 auto onDeath = static_cast<std::function<void(void)>*>(cookie);
49 (*onDeath)();
50};
51TEST(NdkBinder, DeathRecipient) {
52 using namespace std::chrono_literals;
53
54 AIBinder* binder;
55 sp<IFoo> foo = IFoo::getService(IFoo::kInstanceNameToDieFor, &binder);
56 ASSERT_NE(nullptr, foo.get());
57 ASSERT_NE(nullptr, binder);
58
59 std::mutex deathMutex;
60 std::condition_variable deathCv;
61 bool deathRecieved = false;
62
63 std::function<void(void)> onDeath = [&] {
64 std::cerr << "Binder died (as requested)." << std::endl;
65 deathRecieved = true;
66 deathCv.notify_one();
67 };
68
69 AIBinder_DeathRecipient* recipient = AIBinder_DeathRecipient_new(LambdaOnDeath);
70
71 EXPECT_EQ(STATUS_OK, AIBinder_linkToDeath(binder, recipient, static_cast<void*>(&onDeath)));
72
73 // the binder driver should return this if the service dies during the transaction
74 EXPECT_EQ(STATUS_DEAD_OBJECT, foo->die());
75
76 std::unique_lock<std::mutex> lock(deathMutex);
77 EXPECT_TRUE(deathCv.wait_for(lock, 1s, [&] { return deathRecieved; }));
78 EXPECT_TRUE(deathRecieved);
79
80 AIBinder_DeathRecipient_delete(recipient);
81 AIBinder_decStrong(binder);
Steven Moreland2e87adc2018-08-20 19:47:00 -070082}
83
84TEST(NdkBinder, RetrieveNonNdkService) {
85 AIBinder* binder = AServiceManager_getService(kExistingNonNdkService);
86 ASSERT_NE(nullptr, binder);
Steven Moreland65867d72018-09-04 14:22:26 -070087 EXPECT_TRUE(AIBinder_isRemote(binder));
88 EXPECT_TRUE(AIBinder_isAlive(binder));
Steven Moreland5d62e442018-09-13 15:01:02 -070089 EXPECT_EQ(STATUS_OK, AIBinder_ping(binder));
Steven Moreland65867d72018-09-04 14:22:26 -070090
Steven Moreland2e87adc2018-08-20 19:47:00 -070091 AIBinder_decStrong(binder);
92}
93
Steven Moreland901c7452018-09-04 16:17:28 -070094void OnBinderDeath(void* cookie) {
95 LOG(ERROR) << "BINDER DIED. COOKIE: " << cookie;
96}
97
98TEST(NdkBinder, LinkToDeath) {
Steven Moreland901c7452018-09-04 16:17:28 -070099 AIBinder* binder = AServiceManager_getService(kExistingNonNdkService);
100 ASSERT_NE(nullptr, binder);
101
102 AIBinder_DeathRecipient* recipient = AIBinder_DeathRecipient_new(OnBinderDeath);
103 ASSERT_NE(nullptr, recipient);
104
Steven Moreland5d62e442018-09-13 15:01:02 -0700105 EXPECT_EQ(STATUS_OK, AIBinder_linkToDeath(binder, recipient, nullptr));
106 EXPECT_EQ(STATUS_OK, AIBinder_linkToDeath(binder, recipient, nullptr));
107 EXPECT_EQ(STATUS_OK, AIBinder_unlinkToDeath(binder, recipient, nullptr));
108 EXPECT_EQ(STATUS_OK, AIBinder_unlinkToDeath(binder, recipient, nullptr));
109 EXPECT_EQ(STATUS_NAME_NOT_FOUND, AIBinder_unlinkToDeath(binder, recipient, nullptr));
Steven Moreland901c7452018-09-04 16:17:28 -0700110
Steven Moreland9b80e282018-09-19 13:57:23 -0700111 AIBinder_DeathRecipient_delete(recipient);
Steven Moreland901c7452018-09-04 16:17:28 -0700112 AIBinder_decStrong(binder);
113}
114
Steven Moreland2e87adc2018-08-20 19:47:00 -0700115class MyTestFoo : public IFoo {
Steven Moreland507547f2018-11-06 15:58:05 -0800116 binder_status_t doubleNumber(int32_t in, int32_t* out) override {
117 *out = 2 * in;
118 LOG(INFO) << "doubleNumber (" << in << ") => " << *out;
119 return STATUS_OK;
120 }
121 binder_status_t die() override {
122 ADD_FAILURE() << "die called on local instance";
123 return STATUS_OK;
Steven Moreland2e87adc2018-08-20 19:47:00 -0700124 }
125};
126
127TEST(NdkBinder, GetServiceInProcess) {
128 static const char* kInstanceName = "test-get-service-in-process";
129
130 sp<IFoo> foo = new MyTestFoo;
Steven Moreland5d62e442018-09-13 15:01:02 -0700131 EXPECT_EQ(STATUS_OK, foo->addService(kInstanceName));
Steven Moreland2e87adc2018-08-20 19:47:00 -0700132
133 sp<IFoo> getFoo = IFoo::getService(kInstanceName);
134 EXPECT_EQ(foo.get(), getFoo.get());
135
Steven Moreland507547f2018-11-06 15:58:05 -0800136 int32_t out;
137 EXPECT_EQ(STATUS_OK, getFoo->doubleNumber(1, &out));
138 EXPECT_EQ(2, out);
Steven Moreland2e87adc2018-08-20 19:47:00 -0700139}
140
Steven Moreland94968952018-09-05 14:42:59 -0700141TEST(NdkBinder, EqualityOfRemoteBinderPointer) {
142 AIBinder* binderA = AServiceManager_getService(kExistingNonNdkService);
143 ASSERT_NE(nullptr, binderA);
144
145 AIBinder* binderB = AServiceManager_getService(kExistingNonNdkService);
146 ASSERT_NE(nullptr, binderB);
147
148 EXPECT_EQ(binderA, binderB);
149
150 AIBinder_decStrong(binderA);
151 AIBinder_decStrong(binderB);
152}
153
Steven Moreland02f75652018-09-18 14:08:30 -0700154TEST(NdkBinder, ToFromJavaNullptr) {
155 EXPECT_EQ(nullptr, AIBinder_toJavaBinder(nullptr, nullptr));
156 EXPECT_EQ(nullptr, AIBinder_fromJavaBinder(nullptr, nullptr));
157}
158
Steven Moreland94968952018-09-05 14:42:59 -0700159TEST(NdkBinder, ABpBinderRefCount) {
160 AIBinder* binder = AServiceManager_getService(kExistingNonNdkService);
161 AIBinder_Weak* wBinder = AIBinder_Weak_new(binder);
162
163 ASSERT_NE(nullptr, binder);
164 EXPECT_EQ(1, AIBinder_debugGetRefCount(binder));
165
166 AIBinder_decStrong(binder);
167
168 // assert because would need to decStrong if non-null and we shouldn't need to add a no-op here
169 ASSERT_NE(nullptr, AIBinder_Weak_promote(wBinder));
170
Steven Moreland9b80e282018-09-19 13:57:23 -0700171 AIBinder_Weak_delete(wBinder);
Steven Moreland94968952018-09-05 14:42:59 -0700172}
173
Steven Moreland2e87adc2018-08-20 19:47:00 -0700174TEST(NdkBinder, AddServiceMultipleTimes) {
175 static const char* kInstanceName1 = "test-multi-1";
176 static const char* kInstanceName2 = "test-multi-2";
177 sp<IFoo> foo = new MyTestFoo;
Steven Moreland5d62e442018-09-13 15:01:02 -0700178 EXPECT_EQ(STATUS_OK, foo->addService(kInstanceName1));
179 EXPECT_EQ(STATUS_OK, foo->addService(kInstanceName2));
Steven Moreland2e87adc2018-08-20 19:47:00 -0700180 EXPECT_EQ(IFoo::getService(kInstanceName1), IFoo::getService(kInstanceName2));
181}
Steven Moreland2648d202018-08-28 01:23:02 -0700182
Steven Moreland507547f2018-11-06 15:58:05 -0800183int main(int argc, char* argv[]) {
184 ::testing::InitGoogleTest(&argc, argv);
185
186 ABinderProcess_setThreadPoolMaxThreadCount(1); // to recieve death notifications/callbacks
187 ABinderProcess_startThreadPool();
188
189 return RUN_ALL_TESTS();
190}
191
Steven Moreland2648d202018-08-28 01:23:02 -0700192#include <android/binder_auto_utils.h>
193#include <android/binder_interface_utils.h>
Steven Morelanda8845662018-10-12 11:53:03 -0700194#include <android/binder_parcel_utils.h>