blob: 507daa29af358810760e93475681269ac9dba8bd [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
24using ::android::sp;
25
26constexpr char kExistingNonNdkService[] = "SurfaceFlinger";
27
28// This is too slow
29// TEST(NdkBinder, GetServiceThatDoesntExist) {
30// sp<IFoo> foo = IFoo::getService("asdfghkl;");
31// EXPECT_EQ(nullptr, foo.get());
32// }
33
34TEST(NdkBinder, DoubleNumber) {
35 sp<IFoo> foo = IFoo::getService(IFoo::kSomeInstanceName);
36 ASSERT_NE(foo, nullptr);
37 EXPECT_EQ(2, foo->doubleNumber(1));
38}
39
40TEST(NdkBinder, RetrieveNonNdkService) {
41 AIBinder* binder = AServiceManager_getService(kExistingNonNdkService);
42 ASSERT_NE(nullptr, binder);
Steven Moreland65867d72018-09-04 14:22:26 -070043 EXPECT_TRUE(AIBinder_isRemote(binder));
44 EXPECT_TRUE(AIBinder_isAlive(binder));
Steven Moreland5d62e442018-09-13 15:01:02 -070045 EXPECT_EQ(STATUS_OK, AIBinder_ping(binder));
Steven Moreland65867d72018-09-04 14:22:26 -070046
Steven Moreland2e87adc2018-08-20 19:47:00 -070047 AIBinder_decStrong(binder);
48}
49
Steven Moreland901c7452018-09-04 16:17:28 -070050void OnBinderDeath(void* cookie) {
51 LOG(ERROR) << "BINDER DIED. COOKIE: " << cookie;
52}
53
54TEST(NdkBinder, LinkToDeath) {
Steven Moreland6cf66ac2018-11-02 18:14:54 -070055 ABinderProcess_setThreadPoolMaxThreadCount(1); // to recieve death notifications
Steven Moreland901c7452018-09-04 16:17:28 -070056 ABinderProcess_startThreadPool();
57
58 AIBinder* binder = AServiceManager_getService(kExistingNonNdkService);
59 ASSERT_NE(nullptr, binder);
60
61 AIBinder_DeathRecipient* recipient = AIBinder_DeathRecipient_new(OnBinderDeath);
62 ASSERT_NE(nullptr, recipient);
63
Steven Moreland5d62e442018-09-13 15:01:02 -070064 EXPECT_EQ(STATUS_OK, AIBinder_linkToDeath(binder, recipient, nullptr));
65 EXPECT_EQ(STATUS_OK, AIBinder_linkToDeath(binder, recipient, nullptr));
66 EXPECT_EQ(STATUS_OK, AIBinder_unlinkToDeath(binder, recipient, nullptr));
67 EXPECT_EQ(STATUS_OK, AIBinder_unlinkToDeath(binder, recipient, nullptr));
68 EXPECT_EQ(STATUS_NAME_NOT_FOUND, AIBinder_unlinkToDeath(binder, recipient, nullptr));
Steven Moreland901c7452018-09-04 16:17:28 -070069
Steven Moreland9b80e282018-09-19 13:57:23 -070070 AIBinder_DeathRecipient_delete(recipient);
Steven Moreland901c7452018-09-04 16:17:28 -070071 AIBinder_decStrong(binder);
72}
73
Steven Moreland2e87adc2018-08-20 19:47:00 -070074class MyTestFoo : public IFoo {
75 int32_t doubleNumber(int32_t in) override {
76 LOG(INFO) << "doubleNumber " << in;
77 return 2 * in;
78 }
79};
80
81TEST(NdkBinder, GetServiceInProcess) {
82 static const char* kInstanceName = "test-get-service-in-process";
83
84 sp<IFoo> foo = new MyTestFoo;
Steven Moreland5d62e442018-09-13 15:01:02 -070085 EXPECT_EQ(STATUS_OK, foo->addService(kInstanceName));
Steven Moreland2e87adc2018-08-20 19:47:00 -070086
87 sp<IFoo> getFoo = IFoo::getService(kInstanceName);
88 EXPECT_EQ(foo.get(), getFoo.get());
89
90 EXPECT_EQ(2, getFoo->doubleNumber(1));
91}
92
Steven Moreland94968952018-09-05 14:42:59 -070093TEST(NdkBinder, EqualityOfRemoteBinderPointer) {
94 AIBinder* binderA = AServiceManager_getService(kExistingNonNdkService);
95 ASSERT_NE(nullptr, binderA);
96
97 AIBinder* binderB = AServiceManager_getService(kExistingNonNdkService);
98 ASSERT_NE(nullptr, binderB);
99
100 EXPECT_EQ(binderA, binderB);
101
102 AIBinder_decStrong(binderA);
103 AIBinder_decStrong(binderB);
104}
105
Steven Moreland02f75652018-09-18 14:08:30 -0700106TEST(NdkBinder, ToFromJavaNullptr) {
107 EXPECT_EQ(nullptr, AIBinder_toJavaBinder(nullptr, nullptr));
108 EXPECT_EQ(nullptr, AIBinder_fromJavaBinder(nullptr, nullptr));
109}
110
Steven Moreland94968952018-09-05 14:42:59 -0700111TEST(NdkBinder, ABpBinderRefCount) {
112 AIBinder* binder = AServiceManager_getService(kExistingNonNdkService);
113 AIBinder_Weak* wBinder = AIBinder_Weak_new(binder);
114
115 ASSERT_NE(nullptr, binder);
116 EXPECT_EQ(1, AIBinder_debugGetRefCount(binder));
117
118 AIBinder_decStrong(binder);
119
120 // assert because would need to decStrong if non-null and we shouldn't need to add a no-op here
121 ASSERT_NE(nullptr, AIBinder_Weak_promote(wBinder));
122
Steven Moreland9b80e282018-09-19 13:57:23 -0700123 AIBinder_Weak_delete(wBinder);
Steven Moreland94968952018-09-05 14:42:59 -0700124}
125
Steven Moreland2e87adc2018-08-20 19:47:00 -0700126TEST(NdkBinder, AddServiceMultipleTimes) {
127 static const char* kInstanceName1 = "test-multi-1";
128 static const char* kInstanceName2 = "test-multi-2";
129 sp<IFoo> foo = new MyTestFoo;
Steven Moreland5d62e442018-09-13 15:01:02 -0700130 EXPECT_EQ(STATUS_OK, foo->addService(kInstanceName1));
131 EXPECT_EQ(STATUS_OK, foo->addService(kInstanceName2));
Steven Moreland2e87adc2018-08-20 19:47:00 -0700132 EXPECT_EQ(IFoo::getService(kInstanceName1), IFoo::getService(kInstanceName2));
133}
Steven Moreland2648d202018-08-28 01:23:02 -0700134
135#include <android/binder_auto_utils.h>
136#include <android/binder_interface_utils.h>
Steven Morelanda8845662018-10-12 11:53:03 -0700137#include <android/binder_parcel_utils.h>