xref: /aosp_15_r20/frameworks/native/libs/binder/tests/binderCacheUnitTest.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2024 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker #include <gtest/gtest.h>
17*38e8c45fSAndroid Build Coastguard Worker 
18*38e8c45fSAndroid Build Coastguard Worker #include <android-base/logging.h>
19*38e8c45fSAndroid Build Coastguard Worker #include <android/os/IServiceManager.h>
20*38e8c45fSAndroid Build Coastguard Worker #include <binder/IBinder.h>
21*38e8c45fSAndroid Build Coastguard Worker #include <binder/IPCThreadState.h>
22*38e8c45fSAndroid Build Coastguard Worker #include <binder/IServiceManager.h>
23*38e8c45fSAndroid Build Coastguard Worker #include <binder/IServiceManagerUnitTestHelper.h>
24*38e8c45fSAndroid Build Coastguard Worker #include "fakeservicemanager/FakeServiceManager.h"
25*38e8c45fSAndroid Build Coastguard Worker 
26*38e8c45fSAndroid Build Coastguard Worker #include <sys/prctl.h>
27*38e8c45fSAndroid Build Coastguard Worker #include <thread>
28*38e8c45fSAndroid Build Coastguard Worker 
29*38e8c45fSAndroid Build Coastguard Worker using namespace android;
30*38e8c45fSAndroid Build Coastguard Worker 
31*38e8c45fSAndroid Build Coastguard Worker #ifdef LIBBINDER_CLIENT_CACHE
32*38e8c45fSAndroid Build Coastguard Worker constexpr bool kUseLibbinderCache = true;
33*38e8c45fSAndroid Build Coastguard Worker #else
34*38e8c45fSAndroid Build Coastguard Worker constexpr bool kUseLibbinderCache = false;
35*38e8c45fSAndroid Build Coastguard Worker #endif
36*38e8c45fSAndroid Build Coastguard Worker 
37*38e8c45fSAndroid Build Coastguard Worker #ifdef LIBBINDER_ADDSERVICE_CACHE
38*38e8c45fSAndroid Build Coastguard Worker constexpr bool kUseCacheInAddService = true;
39*38e8c45fSAndroid Build Coastguard Worker #else
40*38e8c45fSAndroid Build Coastguard Worker constexpr bool kUseCacheInAddService = false;
41*38e8c45fSAndroid Build Coastguard Worker #endif
42*38e8c45fSAndroid Build Coastguard Worker 
43*38e8c45fSAndroid Build Coastguard Worker #ifdef LIBBINDER_REMOVE_CACHE_STATIC_LIST
44*38e8c45fSAndroid Build Coastguard Worker constexpr bool kRemoveStaticList = true;
45*38e8c45fSAndroid Build Coastguard Worker #else
46*38e8c45fSAndroid Build Coastguard Worker constexpr bool kRemoveStaticList = false;
47*38e8c45fSAndroid Build Coastguard Worker #endif
48*38e8c45fSAndroid Build Coastguard Worker 
49*38e8c45fSAndroid Build Coastguard Worker // A service name which is in the static list of cachable services
50*38e8c45fSAndroid Build Coastguard Worker const String16 kCachedServiceName = String16("isub");
51*38e8c45fSAndroid Build Coastguard Worker 
52*38e8c45fSAndroid Build Coastguard Worker #define EXPECT_OK(status)                 \
53*38e8c45fSAndroid Build Coastguard Worker     do {                                  \
54*38e8c45fSAndroid Build Coastguard Worker         binder::Status stat = (status);   \
55*38e8c45fSAndroid Build Coastguard Worker         EXPECT_TRUE(stat.isOk()) << stat; \
56*38e8c45fSAndroid Build Coastguard Worker     } while (false)
57*38e8c45fSAndroid Build Coastguard Worker 
58*38e8c45fSAndroid Build Coastguard Worker const String16 kServerName = String16("binderCacheUnitTest");
59*38e8c45fSAndroid Build Coastguard Worker 
60*38e8c45fSAndroid Build Coastguard Worker class FooBar : public BBinder {
61*38e8c45fSAndroid Build Coastguard Worker public:
onTransact(uint32_t,const Parcel &,Parcel *,uint32_t)62*38e8c45fSAndroid Build Coastguard Worker     status_t onTransact(uint32_t, const Parcel&, Parcel*, uint32_t) {
63*38e8c45fSAndroid Build Coastguard Worker         // exit the server
64*38e8c45fSAndroid Build Coastguard Worker         std::thread([] { exit(EXIT_FAILURE); }).detach();
65*38e8c45fSAndroid Build Coastguard Worker         return OK;
66*38e8c45fSAndroid Build Coastguard Worker     }
killServer(sp<IBinder> binder)67*38e8c45fSAndroid Build Coastguard Worker     void killServer(sp<IBinder> binder) {
68*38e8c45fSAndroid Build Coastguard Worker         Parcel data, reply;
69*38e8c45fSAndroid Build Coastguard Worker         binder->transact(0, data, &reply, 0);
70*38e8c45fSAndroid Build Coastguard Worker     }
71*38e8c45fSAndroid Build Coastguard Worker };
72*38e8c45fSAndroid Build Coastguard Worker 
73*38e8c45fSAndroid Build Coastguard Worker class MockAidlServiceManager : public os::IServiceManagerDefault {
74*38e8c45fSAndroid Build Coastguard Worker public:
MockAidlServiceManager()75*38e8c45fSAndroid Build Coastguard Worker     MockAidlServiceManager() : innerSm() {}
76*38e8c45fSAndroid Build Coastguard Worker 
checkService(const::std::string & name,os::Service * _out)77*38e8c45fSAndroid Build Coastguard Worker     binder::Status checkService(const ::std::string& name, os::Service* _out) override {
78*38e8c45fSAndroid Build Coastguard Worker         os::ServiceWithMetadata serviceWithMetadata = os::ServiceWithMetadata();
79*38e8c45fSAndroid Build Coastguard Worker         serviceWithMetadata.service = innerSm.getService(String16(name.c_str()));
80*38e8c45fSAndroid Build Coastguard Worker         serviceWithMetadata.isLazyService = false;
81*38e8c45fSAndroid Build Coastguard Worker         *_out = os::Service::make<os::Service::Tag::serviceWithMetadata>(serviceWithMetadata);
82*38e8c45fSAndroid Build Coastguard Worker         return binder::Status::ok();
83*38e8c45fSAndroid Build Coastguard Worker     }
84*38e8c45fSAndroid Build Coastguard Worker 
addService(const std::string & name,const sp<IBinder> & service,bool allowIsolated,int32_t dumpPriority)85*38e8c45fSAndroid Build Coastguard Worker     binder::Status addService(const std::string& name, const sp<IBinder>& service,
86*38e8c45fSAndroid Build Coastguard Worker                               bool allowIsolated, int32_t dumpPriority) override {
87*38e8c45fSAndroid Build Coastguard Worker         return binder::Status::fromStatusT(
88*38e8c45fSAndroid Build Coastguard Worker                 innerSm.addService(String16(name.c_str()), service, allowIsolated, dumpPriority));
89*38e8c45fSAndroid Build Coastguard Worker     }
90*38e8c45fSAndroid Build Coastguard Worker 
clearServices()91*38e8c45fSAndroid Build Coastguard Worker     void clearServices() { innerSm.clear(); }
92*38e8c45fSAndroid Build Coastguard Worker 
93*38e8c45fSAndroid Build Coastguard Worker     FakeServiceManager innerSm;
94*38e8c45fSAndroid Build Coastguard Worker };
95*38e8c45fSAndroid Build Coastguard Worker 
96*38e8c45fSAndroid Build Coastguard Worker // Returns services with isLazyService flag as true.
97*38e8c45fSAndroid Build Coastguard Worker class MockAidlServiceManager2 : public os::IServiceManagerDefault {
98*38e8c45fSAndroid Build Coastguard Worker public:
MockAidlServiceManager2()99*38e8c45fSAndroid Build Coastguard Worker     MockAidlServiceManager2() : innerSm() {}
100*38e8c45fSAndroid Build Coastguard Worker 
checkService(const::std::string & name,os::Service * _out)101*38e8c45fSAndroid Build Coastguard Worker     binder::Status checkService(const ::std::string& name, os::Service* _out) override {
102*38e8c45fSAndroid Build Coastguard Worker         os::ServiceWithMetadata serviceWithMetadata = os::ServiceWithMetadata();
103*38e8c45fSAndroid Build Coastguard Worker         serviceWithMetadata.service = innerSm.getService(String16(name.c_str()));
104*38e8c45fSAndroid Build Coastguard Worker         serviceWithMetadata.isLazyService = true;
105*38e8c45fSAndroid Build Coastguard Worker         *_out = os::Service::make<os::Service::Tag::serviceWithMetadata>(serviceWithMetadata);
106*38e8c45fSAndroid Build Coastguard Worker         return binder::Status::ok();
107*38e8c45fSAndroid Build Coastguard Worker     }
108*38e8c45fSAndroid Build Coastguard Worker 
addService(const std::string & name,const sp<IBinder> & service,bool allowIsolated,int32_t dumpPriority)109*38e8c45fSAndroid Build Coastguard Worker     binder::Status addService(const std::string& name, const sp<IBinder>& service,
110*38e8c45fSAndroid Build Coastguard Worker                               bool allowIsolated, int32_t dumpPriority) override {
111*38e8c45fSAndroid Build Coastguard Worker         return binder::Status::fromStatusT(
112*38e8c45fSAndroid Build Coastguard Worker                 innerSm.addService(String16(name.c_str()), service, allowIsolated, dumpPriority));
113*38e8c45fSAndroid Build Coastguard Worker     }
114*38e8c45fSAndroid Build Coastguard Worker 
clearServices()115*38e8c45fSAndroid Build Coastguard Worker     void clearServices() { innerSm.clear(); }
116*38e8c45fSAndroid Build Coastguard Worker 
117*38e8c45fSAndroid Build Coastguard Worker     FakeServiceManager innerSm;
118*38e8c45fSAndroid Build Coastguard Worker };
119*38e8c45fSAndroid Build Coastguard Worker 
120*38e8c45fSAndroid Build Coastguard Worker class LibbinderCacheRemoveStaticList : public ::testing::Test {
121*38e8c45fSAndroid Build Coastguard Worker protected:
SetUp()122*38e8c45fSAndroid Build Coastguard Worker     void SetUp() override {
123*38e8c45fSAndroid Build Coastguard Worker         fakeServiceManager = sp<MockAidlServiceManager2>::make();
124*38e8c45fSAndroid Build Coastguard Worker         mServiceManager = getServiceManagerShimFromAidlServiceManagerForTests(fakeServiceManager);
125*38e8c45fSAndroid Build Coastguard Worker         mServiceManager->enableAddServiceCache(true);
126*38e8c45fSAndroid Build Coastguard Worker     }
TearDown()127*38e8c45fSAndroid Build Coastguard Worker     void TearDown() override {}
128*38e8c45fSAndroid Build Coastguard Worker 
129*38e8c45fSAndroid Build Coastguard Worker public:
cacheAddServiceAndConfirmCacheMiss(const sp<IBinder> & binder1)130*38e8c45fSAndroid Build Coastguard Worker     void cacheAddServiceAndConfirmCacheMiss(const sp<IBinder>& binder1) {
131*38e8c45fSAndroid Build Coastguard Worker         // Add a service. This shouldn't cache it.
132*38e8c45fSAndroid Build Coastguard Worker         EXPECT_EQ(OK,
133*38e8c45fSAndroid Build Coastguard Worker                   mServiceManager->addService(kCachedServiceName, binder1,
134*38e8c45fSAndroid Build Coastguard Worker                                               /*allowIsolated = */ false,
135*38e8c45fSAndroid Build Coastguard Worker                                               android::os::IServiceManager::FLAG_IS_LAZY_SERVICE));
136*38e8c45fSAndroid Build Coastguard Worker         // Try to populate cache. Cache shouldn't be updated.
137*38e8c45fSAndroid Build Coastguard Worker         EXPECT_EQ(binder1, mServiceManager->checkService(kCachedServiceName));
138*38e8c45fSAndroid Build Coastguard Worker         fakeServiceManager->clearServices();
139*38e8c45fSAndroid Build Coastguard Worker         EXPECT_EQ(nullptr, mServiceManager->checkService(kCachedServiceName));
140*38e8c45fSAndroid Build Coastguard Worker     }
141*38e8c45fSAndroid Build Coastguard Worker 
142*38e8c45fSAndroid Build Coastguard Worker     sp<MockAidlServiceManager2> fakeServiceManager;
143*38e8c45fSAndroid Build Coastguard Worker     sp<android::IServiceManager> mServiceManager;
144*38e8c45fSAndroid Build Coastguard Worker };
145*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(LibbinderCacheRemoveStaticList,AddLocalServiceAndConfirmCacheMiss)146*38e8c45fSAndroid Build Coastguard Worker TEST_F(LibbinderCacheRemoveStaticList, AddLocalServiceAndConfirmCacheMiss) {
147*38e8c45fSAndroid Build Coastguard Worker     if (!kRemoveStaticList) {
148*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP() << "Skipping as feature is not enabled";
149*38e8c45fSAndroid Build Coastguard Worker         return;
150*38e8c45fSAndroid Build Coastguard Worker     }
151*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> binder1 = sp<BBinder>::make();
152*38e8c45fSAndroid Build Coastguard Worker     cacheAddServiceAndConfirmCacheMiss(binder1);
153*38e8c45fSAndroid Build Coastguard Worker }
154*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(LibbinderCacheRemoveStaticList,AddRemoteServiceAndConfirmCacheMiss)155*38e8c45fSAndroid Build Coastguard Worker TEST_F(LibbinderCacheRemoveStaticList, AddRemoteServiceAndConfirmCacheMiss) {
156*38e8c45fSAndroid Build Coastguard Worker     if (!kRemoveStaticList) {
157*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP() << "Skipping as feature is not enabled";
158*38e8c45fSAndroid Build Coastguard Worker         return;
159*38e8c45fSAndroid Build Coastguard Worker     }
160*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> binder1 = defaultServiceManager()->checkService(kServerName);
161*38e8c45fSAndroid Build Coastguard Worker     ASSERT_NE(binder1, nullptr);
162*38e8c45fSAndroid Build Coastguard Worker     cacheAddServiceAndConfirmCacheMiss(binder1);
163*38e8c45fSAndroid Build Coastguard Worker }
164*38e8c45fSAndroid Build Coastguard Worker 
165*38e8c45fSAndroid Build Coastguard Worker class LibbinderCacheAddServiceTest : public ::testing::Test {
166*38e8c45fSAndroid Build Coastguard Worker protected:
SetUp()167*38e8c45fSAndroid Build Coastguard Worker     void SetUp() override {
168*38e8c45fSAndroid Build Coastguard Worker         fakeServiceManager = sp<MockAidlServiceManager>::make();
169*38e8c45fSAndroid Build Coastguard Worker         mServiceManager = getServiceManagerShimFromAidlServiceManagerForTests(fakeServiceManager);
170*38e8c45fSAndroid Build Coastguard Worker         mServiceManager->enableAddServiceCache(true);
171*38e8c45fSAndroid Build Coastguard Worker     }
172*38e8c45fSAndroid Build Coastguard Worker 
TearDown()173*38e8c45fSAndroid Build Coastguard Worker     void TearDown() override {}
174*38e8c45fSAndroid Build Coastguard Worker 
175*38e8c45fSAndroid Build Coastguard Worker public:
cacheAddServiceAndConfirmCacheHit(const sp<IBinder> & binder1)176*38e8c45fSAndroid Build Coastguard Worker     void cacheAddServiceAndConfirmCacheHit(const sp<IBinder>& binder1) {
177*38e8c45fSAndroid Build Coastguard Worker         // Add a service. This also caches it.
178*38e8c45fSAndroid Build Coastguard Worker         EXPECT_EQ(OK, mServiceManager->addService(kCachedServiceName, binder1));
179*38e8c45fSAndroid Build Coastguard Worker         // remove services from fakeservicemanager
180*38e8c45fSAndroid Build Coastguard Worker         fakeServiceManager->clearServices();
181*38e8c45fSAndroid Build Coastguard Worker 
182*38e8c45fSAndroid Build Coastguard Worker         sp<IBinder> result = mServiceManager->checkService(kCachedServiceName);
183*38e8c45fSAndroid Build Coastguard Worker         if (kUseCacheInAddService && kUseLibbinderCache) {
184*38e8c45fSAndroid Build Coastguard Worker             // If cache is enabled, we should get the binder.
185*38e8c45fSAndroid Build Coastguard Worker             EXPECT_EQ(binder1, result);
186*38e8c45fSAndroid Build Coastguard Worker         } else {
187*38e8c45fSAndroid Build Coastguard Worker             // If cache is disabled, then we should get the null binder
188*38e8c45fSAndroid Build Coastguard Worker             EXPECT_EQ(nullptr, result);
189*38e8c45fSAndroid Build Coastguard Worker         }
190*38e8c45fSAndroid Build Coastguard Worker     }
191*38e8c45fSAndroid Build Coastguard Worker     sp<MockAidlServiceManager> fakeServiceManager;
192*38e8c45fSAndroid Build Coastguard Worker     sp<android::IServiceManager> mServiceManager;
193*38e8c45fSAndroid Build Coastguard Worker };
194*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(LibbinderCacheAddServiceTest,AddLocalServiceAndConfirmCacheHit)195*38e8c45fSAndroid Build Coastguard Worker TEST_F(LibbinderCacheAddServiceTest, AddLocalServiceAndConfirmCacheHit) {
196*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> binder1 = sp<BBinder>::make();
197*38e8c45fSAndroid Build Coastguard Worker     cacheAddServiceAndConfirmCacheHit(binder1);
198*38e8c45fSAndroid Build Coastguard Worker }
199*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(LibbinderCacheAddServiceTest,AddRemoteServiceAndConfirmCacheHit)200*38e8c45fSAndroid Build Coastguard Worker TEST_F(LibbinderCacheAddServiceTest, AddRemoteServiceAndConfirmCacheHit) {
201*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> binder1 = defaultServiceManager()->checkService(kServerName);
202*38e8c45fSAndroid Build Coastguard Worker     ASSERT_NE(binder1, nullptr);
203*38e8c45fSAndroid Build Coastguard Worker     cacheAddServiceAndConfirmCacheHit(binder1);
204*38e8c45fSAndroid Build Coastguard Worker }
205*38e8c45fSAndroid Build Coastguard Worker 
206*38e8c45fSAndroid Build Coastguard Worker class LibbinderCacheTest : public ::testing::Test {
207*38e8c45fSAndroid Build Coastguard Worker protected:
SetUp()208*38e8c45fSAndroid Build Coastguard Worker     void SetUp() override {
209*38e8c45fSAndroid Build Coastguard Worker         fakeServiceManager = sp<MockAidlServiceManager>::make();
210*38e8c45fSAndroid Build Coastguard Worker         mServiceManager = getServiceManagerShimFromAidlServiceManagerForTests(fakeServiceManager);
211*38e8c45fSAndroid Build Coastguard Worker         mServiceManager->enableAddServiceCache(false);
212*38e8c45fSAndroid Build Coastguard Worker     }
213*38e8c45fSAndroid Build Coastguard Worker 
TearDown()214*38e8c45fSAndroid Build Coastguard Worker     void TearDown() override {}
215*38e8c45fSAndroid Build Coastguard Worker 
216*38e8c45fSAndroid Build Coastguard Worker public:
cacheAndConfirmCacheHit(const sp<IBinder> & binder1,const sp<IBinder> & binder2)217*38e8c45fSAndroid Build Coastguard Worker     void cacheAndConfirmCacheHit(const sp<IBinder>& binder1, const sp<IBinder>& binder2) {
218*38e8c45fSAndroid Build Coastguard Worker         // Add a service
219*38e8c45fSAndroid Build Coastguard Worker         EXPECT_EQ(OK, mServiceManager->addService(kCachedServiceName, binder1));
220*38e8c45fSAndroid Build Coastguard Worker         // Get the service. This caches it.
221*38e8c45fSAndroid Build Coastguard Worker         sp<IBinder> result = mServiceManager->checkService(kCachedServiceName);
222*38e8c45fSAndroid Build Coastguard Worker         ASSERT_EQ(binder1, result);
223*38e8c45fSAndroid Build Coastguard Worker 
224*38e8c45fSAndroid Build Coastguard Worker         // Add the different binder and replace the service.
225*38e8c45fSAndroid Build Coastguard Worker         // The cache should still hold the original binder.
226*38e8c45fSAndroid Build Coastguard Worker         EXPECT_EQ(OK, mServiceManager->addService(kCachedServiceName, binder2));
227*38e8c45fSAndroid Build Coastguard Worker 
228*38e8c45fSAndroid Build Coastguard Worker         result = mServiceManager->checkService(kCachedServiceName);
229*38e8c45fSAndroid Build Coastguard Worker         if (kUseLibbinderCache) {
230*38e8c45fSAndroid Build Coastguard Worker             // If cache is enabled, we should get the binder to Service Manager.
231*38e8c45fSAndroid Build Coastguard Worker             EXPECT_EQ(binder1, result);
232*38e8c45fSAndroid Build Coastguard Worker         } else {
233*38e8c45fSAndroid Build Coastguard Worker             // If cache is disabled, then we should get the newer binder
234*38e8c45fSAndroid Build Coastguard Worker             EXPECT_EQ(binder2, result);
235*38e8c45fSAndroid Build Coastguard Worker         }
236*38e8c45fSAndroid Build Coastguard Worker     }
237*38e8c45fSAndroid Build Coastguard Worker 
238*38e8c45fSAndroid Build Coastguard Worker     sp<MockAidlServiceManager> fakeServiceManager;
239*38e8c45fSAndroid Build Coastguard Worker     sp<android::IServiceManager> mServiceManager;
240*38e8c45fSAndroid Build Coastguard Worker };
241*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(LibbinderCacheTest,AddLocalServiceAndConfirmCacheHit)242*38e8c45fSAndroid Build Coastguard Worker TEST_F(LibbinderCacheTest, AddLocalServiceAndConfirmCacheHit) {
243*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> binder1 = sp<BBinder>::make();
244*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> binder2 = sp<BBinder>::make();
245*38e8c45fSAndroid Build Coastguard Worker 
246*38e8c45fSAndroid Build Coastguard Worker     cacheAndConfirmCacheHit(binder1, binder2);
247*38e8c45fSAndroid Build Coastguard Worker }
248*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(LibbinderCacheTest,AddRemoteServiceAndConfirmCacheHit)249*38e8c45fSAndroid Build Coastguard Worker TEST_F(LibbinderCacheTest, AddRemoteServiceAndConfirmCacheHit) {
250*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> binder1 = defaultServiceManager()->checkService(kServerName);
251*38e8c45fSAndroid Build Coastguard Worker     ASSERT_NE(binder1, nullptr);
252*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> binder2 = IInterface::asBinder(mServiceManager);
253*38e8c45fSAndroid Build Coastguard Worker 
254*38e8c45fSAndroid Build Coastguard Worker     cacheAndConfirmCacheHit(binder1, binder2);
255*38e8c45fSAndroid Build Coastguard Worker }
256*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(LibbinderCacheTest,RemoveFromCacheOnServerDeath)257*38e8c45fSAndroid Build Coastguard Worker TEST_F(LibbinderCacheTest, RemoveFromCacheOnServerDeath) {
258*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> binder1 = defaultServiceManager()->checkService(kServerName);
259*38e8c45fSAndroid Build Coastguard Worker     FooBar foo = FooBar();
260*38e8c45fSAndroid Build Coastguard Worker 
261*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(OK, mServiceManager->addService(kCachedServiceName, binder1));
262*38e8c45fSAndroid Build Coastguard Worker 
263*38e8c45fSAndroid Build Coastguard Worker     // Check Service, this caches the binder
264*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> result = mServiceManager->checkService(kCachedServiceName);
265*38e8c45fSAndroid Build Coastguard Worker     ASSERT_EQ(binder1, result);
266*38e8c45fSAndroid Build Coastguard Worker 
267*38e8c45fSAndroid Build Coastguard Worker     // Kill the server, this should remove from cache.
268*38e8c45fSAndroid Build Coastguard Worker     pid_t pid;
269*38e8c45fSAndroid Build Coastguard Worker     ASSERT_EQ(OK, binder1->getDebugPid(&pid));
270*38e8c45fSAndroid Build Coastguard Worker     foo.killServer(binder1);
271*38e8c45fSAndroid Build Coastguard Worker     system(("kill -9 " + std::to_string(pid)).c_str());
272*38e8c45fSAndroid Build Coastguard Worker 
273*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> binder2 = sp<BBinder>::make();
274*38e8c45fSAndroid Build Coastguard Worker 
275*38e8c45fSAndroid Build Coastguard Worker     // Add new service with the same name.
276*38e8c45fSAndroid Build Coastguard Worker     // This will replace the service in FakeServiceManager.
277*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(OK, mServiceManager->addService(kCachedServiceName, binder2));
278*38e8c45fSAndroid Build Coastguard Worker 
279*38e8c45fSAndroid Build Coastguard Worker     // Confirm that new service is returned instead of old.
280*38e8c45fSAndroid Build Coastguard Worker     int retry_count = 20;
281*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> result2;
282*38e8c45fSAndroid Build Coastguard Worker     do {
283*38e8c45fSAndroid Build Coastguard Worker         std::this_thread::sleep_for(std::chrono::milliseconds(50));
284*38e8c45fSAndroid Build Coastguard Worker         if (retry_count-- == 0) {
285*38e8c45fSAndroid Build Coastguard Worker             break;
286*38e8c45fSAndroid Build Coastguard Worker         }
287*38e8c45fSAndroid Build Coastguard Worker         result2 = mServiceManager->checkService(kCachedServiceName);
288*38e8c45fSAndroid Build Coastguard Worker     } while (result2 != binder2);
289*38e8c45fSAndroid Build Coastguard Worker 
290*38e8c45fSAndroid Build Coastguard Worker     ASSERT_EQ(binder2, result2);
291*38e8c45fSAndroid Build Coastguard Worker }
292*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(LibbinderCacheTest,NullBinderNotCached)293*38e8c45fSAndroid Build Coastguard Worker TEST_F(LibbinderCacheTest, NullBinderNotCached) {
294*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> binder1 = nullptr;
295*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> binder2 = sp<BBinder>::make();
296*38e8c45fSAndroid Build Coastguard Worker 
297*38e8c45fSAndroid Build Coastguard Worker     // Check for a cacheble service which isn't registered.
298*38e8c45fSAndroid Build Coastguard Worker     // FakeServiceManager should return nullptr.
299*38e8c45fSAndroid Build Coastguard Worker     // This shouldn't be cached.
300*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> result = mServiceManager->checkService(kCachedServiceName);
301*38e8c45fSAndroid Build Coastguard Worker     ASSERT_EQ(binder1, result);
302*38e8c45fSAndroid Build Coastguard Worker 
303*38e8c45fSAndroid Build Coastguard Worker     // Add the same service
304*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(OK, mServiceManager->addService(kCachedServiceName, binder2));
305*38e8c45fSAndroid Build Coastguard Worker 
306*38e8c45fSAndroid Build Coastguard Worker     // This should return the newly added service.
307*38e8c45fSAndroid Build Coastguard Worker     result = mServiceManager->checkService(kCachedServiceName);
308*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(binder2, result);
309*38e8c45fSAndroid Build Coastguard Worker }
310*38e8c45fSAndroid Build Coastguard Worker 
311*38e8c45fSAndroid Build Coastguard Worker // TODO(b/333854840): Remove this test removing the static list
TEST_F(LibbinderCacheTest,DoNotCacheServiceNotInList)312*38e8c45fSAndroid Build Coastguard Worker TEST_F(LibbinderCacheTest, DoNotCacheServiceNotInList) {
313*38e8c45fSAndroid Build Coastguard Worker     if (kRemoveStaticList) {
314*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP() << "Skipping test as static list is disabled";
315*38e8c45fSAndroid Build Coastguard Worker         return;
316*38e8c45fSAndroid Build Coastguard Worker     }
317*38e8c45fSAndroid Build Coastguard Worker 
318*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> binder1 = sp<BBinder>::make();
319*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> binder2 = sp<BBinder>::make();
320*38e8c45fSAndroid Build Coastguard Worker     String16 serviceName = String16("NewLibbinderCacheTest");
321*38e8c45fSAndroid Build Coastguard Worker     // Add a service
322*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(OK, mServiceManager->addService(serviceName, binder1));
323*38e8c45fSAndroid Build Coastguard Worker     // Get the service. This shouldn't caches it.
324*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> result = mServiceManager->checkService(serviceName);
325*38e8c45fSAndroid Build Coastguard Worker     ASSERT_EQ(binder1, result);
326*38e8c45fSAndroid Build Coastguard Worker 
327*38e8c45fSAndroid Build Coastguard Worker     // Add the different binder and replace the service.
328*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(OK, mServiceManager->addService(serviceName, binder2));
329*38e8c45fSAndroid Build Coastguard Worker 
330*38e8c45fSAndroid Build Coastguard Worker     // Confirm that we get the new service
331*38e8c45fSAndroid Build Coastguard Worker     result = mServiceManager->checkService(serviceName);
332*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(binder2, result);
333*38e8c45fSAndroid Build Coastguard Worker }
334*38e8c45fSAndroid Build Coastguard Worker 
main(int argc,char ** argv)335*38e8c45fSAndroid Build Coastguard Worker int main(int argc, char** argv) {
336*38e8c45fSAndroid Build Coastguard Worker     ::testing::InitGoogleTest(&argc, argv);
337*38e8c45fSAndroid Build Coastguard Worker 
338*38e8c45fSAndroid Build Coastguard Worker     if (fork() == 0) {
339*38e8c45fSAndroid Build Coastguard Worker         prctl(PR_SET_PDEATHSIG, SIGHUP);
340*38e8c45fSAndroid Build Coastguard Worker 
341*38e8c45fSAndroid Build Coastguard Worker         // Start a FooBar service and add it to the servicemanager.
342*38e8c45fSAndroid Build Coastguard Worker         sp<IBinder> server = new FooBar();
343*38e8c45fSAndroid Build Coastguard Worker         defaultServiceManager()->addService(kServerName, server);
344*38e8c45fSAndroid Build Coastguard Worker 
345*38e8c45fSAndroid Build Coastguard Worker         IPCThreadState::self()->joinThreadPool(true);
346*38e8c45fSAndroid Build Coastguard Worker         exit(1); // should not reach
347*38e8c45fSAndroid Build Coastguard Worker     }
348*38e8c45fSAndroid Build Coastguard Worker 
349*38e8c45fSAndroid Build Coastguard Worker     status_t err = ProcessState::self()->setThreadPoolMaxThreadCount(3);
350*38e8c45fSAndroid Build Coastguard Worker     ProcessState::self()->startThreadPool();
351*38e8c45fSAndroid Build Coastguard Worker     CHECK_EQ(ProcessState::self()->isThreadPoolStarted(), true);
352*38e8c45fSAndroid Build Coastguard Worker     CHECK_GT(ProcessState::self()->getThreadPoolMaxTotalThreadCount(), 0);
353*38e8c45fSAndroid Build Coastguard Worker 
354*38e8c45fSAndroid Build Coastguard Worker     auto binder = defaultServiceManager()->waitForService(kServerName);
355*38e8c45fSAndroid Build Coastguard Worker     CHECK_NE(nullptr, binder.get());
356*38e8c45fSAndroid Build Coastguard Worker     return RUN_ALL_TESTS();
357*38e8c45fSAndroid Build Coastguard Worker }
358