xref: /aosp_15_r20/frameworks/native/cmds/servicemanager/test_sm.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2019 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 
17*38e8c45fSAndroid Build Coastguard Worker #include <android-base/properties.h>
18*38e8c45fSAndroid Build Coastguard Worker #include <android-base/strings.h>
19*38e8c45fSAndroid Build Coastguard Worker #include <android/os/BnServiceCallback.h>
20*38e8c45fSAndroid Build Coastguard Worker #include <binder/Binder.h>
21*38e8c45fSAndroid Build Coastguard Worker #include <binder/IServiceManager.h>
22*38e8c45fSAndroid Build Coastguard Worker #include <binder/ProcessState.h>
23*38e8c45fSAndroid Build Coastguard Worker #include <cutils/android_filesystem_config.h>
24*38e8c45fSAndroid Build Coastguard Worker #include <gmock/gmock.h>
25*38e8c45fSAndroid Build Coastguard Worker #include <gtest/gtest.h>
26*38e8c45fSAndroid Build Coastguard Worker 
27*38e8c45fSAndroid Build Coastguard Worker #include "Access.h"
28*38e8c45fSAndroid Build Coastguard Worker #include "ServiceManager.h"
29*38e8c45fSAndroid Build Coastguard Worker 
30*38e8c45fSAndroid Build Coastguard Worker using android::Access;
31*38e8c45fSAndroid Build Coastguard Worker using android::BBinder;
32*38e8c45fSAndroid Build Coastguard Worker using android::IBinder;
33*38e8c45fSAndroid Build Coastguard Worker using android::ServiceManager;
34*38e8c45fSAndroid Build Coastguard Worker using android::sp;
35*38e8c45fSAndroid Build Coastguard Worker using android::base::EndsWith;
36*38e8c45fSAndroid Build Coastguard Worker using android::base::GetProperty;
37*38e8c45fSAndroid Build Coastguard Worker using android::base::StartsWith;
38*38e8c45fSAndroid Build Coastguard Worker using android::binder::Status;
39*38e8c45fSAndroid Build Coastguard Worker using android::os::BnServiceCallback;
40*38e8c45fSAndroid Build Coastguard Worker using android::os::IServiceManager;
41*38e8c45fSAndroid Build Coastguard Worker using android::os::Service;
42*38e8c45fSAndroid Build Coastguard Worker using testing::_;
43*38e8c45fSAndroid Build Coastguard Worker using testing::ElementsAre;
44*38e8c45fSAndroid Build Coastguard Worker using testing::NiceMock;
45*38e8c45fSAndroid Build Coastguard Worker using testing::Return;
46*38e8c45fSAndroid Build Coastguard Worker 
getBinder()47*38e8c45fSAndroid Build Coastguard Worker static sp<IBinder> getBinder() {
48*38e8c45fSAndroid Build Coastguard Worker     class LinkableBinder : public BBinder {
49*38e8c45fSAndroid Build Coastguard Worker         android::status_t linkToDeath(const sp<DeathRecipient>&, void*, uint32_t) override {
50*38e8c45fSAndroid Build Coastguard Worker             // let SM linkToDeath
51*38e8c45fSAndroid Build Coastguard Worker             return android::OK;
52*38e8c45fSAndroid Build Coastguard Worker         }
53*38e8c45fSAndroid Build Coastguard Worker     };
54*38e8c45fSAndroid Build Coastguard Worker 
55*38e8c45fSAndroid Build Coastguard Worker     return sp<LinkableBinder>::make();
56*38e8c45fSAndroid Build Coastguard Worker }
57*38e8c45fSAndroid Build Coastguard Worker 
58*38e8c45fSAndroid Build Coastguard Worker class MockAccess : public Access {
59*38e8c45fSAndroid Build Coastguard Worker public:
60*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD0(getCallingContext, CallingContext());
61*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD2(canAdd, bool(const CallingContext&, const std::string& name));
62*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD2(canFind, bool(const CallingContext&, const std::string& name));
63*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD1(canList, bool(const CallingContext&));
64*38e8c45fSAndroid Build Coastguard Worker };
65*38e8c45fSAndroid Build Coastguard Worker 
66*38e8c45fSAndroid Build Coastguard Worker class MockServiceManager : public ServiceManager {
67*38e8c45fSAndroid Build Coastguard Worker  public:
MockServiceManager(std::unique_ptr<Access> && access)68*38e8c45fSAndroid Build Coastguard Worker     MockServiceManager(std::unique_ptr<Access>&& access) : ServiceManager(std::move(access)) {}
69*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD2(tryStartService, void(const Access::CallingContext&, const std::string& name));
70*38e8c45fSAndroid Build Coastguard Worker };
71*38e8c45fSAndroid Build Coastguard Worker 
getPermissiveServiceManager()72*38e8c45fSAndroid Build Coastguard Worker static sp<ServiceManager> getPermissiveServiceManager() {
73*38e8c45fSAndroid Build Coastguard Worker     std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
74*38e8c45fSAndroid Build Coastguard Worker 
75*38e8c45fSAndroid Build Coastguard Worker     ON_CALL(*access, getCallingContext()).WillByDefault(Return(Access::CallingContext{}));
76*38e8c45fSAndroid Build Coastguard Worker     ON_CALL(*access, canAdd(_, _)).WillByDefault(Return(true));
77*38e8c45fSAndroid Build Coastguard Worker     ON_CALL(*access, canFind(_, _)).WillByDefault(Return(true));
78*38e8c45fSAndroid Build Coastguard Worker     ON_CALL(*access, canList(_)).WillByDefault(Return(true));
79*38e8c45fSAndroid Build Coastguard Worker 
80*38e8c45fSAndroid Build Coastguard Worker     sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
81*38e8c45fSAndroid Build Coastguard Worker     return sm;
82*38e8c45fSAndroid Build Coastguard Worker }
83*38e8c45fSAndroid Build Coastguard Worker 
84*38e8c45fSAndroid Build Coastguard Worker // Determines if test device is a cuttlefish phone device
isCuttlefishPhone()85*38e8c45fSAndroid Build Coastguard Worker static bool isCuttlefishPhone() {
86*38e8c45fSAndroid Build Coastguard Worker     auto device = GetProperty("ro.product.vendor.device", "");
87*38e8c45fSAndroid Build Coastguard Worker     auto product = GetProperty("ro.product.vendor.name", "");
88*38e8c45fSAndroid Build Coastguard Worker     return StartsWith(device, "vsoc_") && EndsWith(product, "_phone");
89*38e8c45fSAndroid Build Coastguard Worker }
90*38e8c45fSAndroid Build Coastguard Worker 
TEST(AddService,HappyHappy)91*38e8c45fSAndroid Build Coastguard Worker TEST(AddService, HappyHappy) {
92*38e8c45fSAndroid Build Coastguard Worker     auto sm = getPermissiveServiceManager();
93*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
94*38e8c45fSAndroid Build Coastguard Worker         IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
95*38e8c45fSAndroid Build Coastguard Worker 
96*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->addService("lazyfoo", getBinder(), false /*allowIsolated*/,
97*38e8c45fSAndroid Build Coastguard Worker                                IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT |
98*38e8c45fSAndroid Build Coastguard Worker                                        IServiceManager::FLAG_IS_LAZY_SERVICE)
99*38e8c45fSAndroid Build Coastguard Worker                         .isOk());
100*38e8c45fSAndroid Build Coastguard Worker }
101*38e8c45fSAndroid Build Coastguard Worker 
TEST(AddService,EmptyNameDisallowed)102*38e8c45fSAndroid Build Coastguard Worker TEST(AddService, EmptyNameDisallowed) {
103*38e8c45fSAndroid Build Coastguard Worker     auto sm = getPermissiveServiceManager();
104*38e8c45fSAndroid Build Coastguard Worker     EXPECT_FALSE(sm->addService("", getBinder(), false /*allowIsolated*/,
105*38e8c45fSAndroid Build Coastguard Worker         IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
106*38e8c45fSAndroid Build Coastguard Worker }
107*38e8c45fSAndroid Build Coastguard Worker 
TEST(AddService,JustShortEnoughServiceNameHappy)108*38e8c45fSAndroid Build Coastguard Worker TEST(AddService, JustShortEnoughServiceNameHappy) {
109*38e8c45fSAndroid Build Coastguard Worker     auto sm = getPermissiveServiceManager();
110*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->addService(std::string(127, 'a'), getBinder(), false /*allowIsolated*/,
111*38e8c45fSAndroid Build Coastguard Worker         IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
112*38e8c45fSAndroid Build Coastguard Worker }
113*38e8c45fSAndroid Build Coastguard Worker 
TEST(AddService,TooLongNameDisallowed)114*38e8c45fSAndroid Build Coastguard Worker TEST(AddService, TooLongNameDisallowed) {
115*38e8c45fSAndroid Build Coastguard Worker     auto sm = getPermissiveServiceManager();
116*38e8c45fSAndroid Build Coastguard Worker     EXPECT_FALSE(sm->addService(std::string(128, 'a'), getBinder(), false /*allowIsolated*/,
117*38e8c45fSAndroid Build Coastguard Worker         IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
118*38e8c45fSAndroid Build Coastguard Worker }
119*38e8c45fSAndroid Build Coastguard Worker 
TEST(AddService,WeirdCharactersDisallowed)120*38e8c45fSAndroid Build Coastguard Worker TEST(AddService, WeirdCharactersDisallowed) {
121*38e8c45fSAndroid Build Coastguard Worker     auto sm = getPermissiveServiceManager();
122*38e8c45fSAndroid Build Coastguard Worker     EXPECT_FALSE(sm->addService("happy$foo$foo", getBinder(), false /*allowIsolated*/,
123*38e8c45fSAndroid Build Coastguard Worker         IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
124*38e8c45fSAndroid Build Coastguard Worker }
125*38e8c45fSAndroid Build Coastguard Worker 
TEST(AddService,AddNullServiceDisallowed)126*38e8c45fSAndroid Build Coastguard Worker TEST(AddService, AddNullServiceDisallowed) {
127*38e8c45fSAndroid Build Coastguard Worker     auto sm = getPermissiveServiceManager();
128*38e8c45fSAndroid Build Coastguard Worker     EXPECT_FALSE(sm->addService("foo", nullptr, false /*allowIsolated*/,
129*38e8c45fSAndroid Build Coastguard Worker         IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
130*38e8c45fSAndroid Build Coastguard Worker }
131*38e8c45fSAndroid Build Coastguard Worker 
TEST(AddService,AddDisallowedFromApp)132*38e8c45fSAndroid Build Coastguard Worker TEST(AddService, AddDisallowedFromApp) {
133*38e8c45fSAndroid Build Coastguard Worker     for (uid_t uid : { AID_APP_START, AID_APP_START + 1, AID_APP_END }) {
134*38e8c45fSAndroid Build Coastguard Worker         std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
135*38e8c45fSAndroid Build Coastguard Worker         EXPECT_CALL(*access, getCallingContext()).WillOnce(Return(Access::CallingContext{
136*38e8c45fSAndroid Build Coastguard Worker             .debugPid = 1337,
137*38e8c45fSAndroid Build Coastguard Worker             .uid = uid,
138*38e8c45fSAndroid Build Coastguard Worker         }));
139*38e8c45fSAndroid Build Coastguard Worker         EXPECT_CALL(*access, canAdd(_, _)).Times(0);
140*38e8c45fSAndroid Build Coastguard Worker         sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
141*38e8c45fSAndroid Build Coastguard Worker 
142*38e8c45fSAndroid Build Coastguard Worker         EXPECT_FALSE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
143*38e8c45fSAndroid Build Coastguard Worker             IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
144*38e8c45fSAndroid Build Coastguard Worker     }
145*38e8c45fSAndroid Build Coastguard Worker 
146*38e8c45fSAndroid Build Coastguard Worker }
147*38e8c45fSAndroid Build Coastguard Worker 
TEST(AddService,HappyOverExistingService)148*38e8c45fSAndroid Build Coastguard Worker TEST(AddService, HappyOverExistingService) {
149*38e8c45fSAndroid Build Coastguard Worker     auto sm = getPermissiveServiceManager();
150*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
151*38e8c45fSAndroid Build Coastguard Worker         IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
152*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
153*38e8c45fSAndroid Build Coastguard Worker         IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
154*38e8c45fSAndroid Build Coastguard Worker }
155*38e8c45fSAndroid Build Coastguard Worker 
TEST(AddService,OverwriteExistingService)156*38e8c45fSAndroid Build Coastguard Worker TEST(AddService, OverwriteExistingService) {
157*38e8c45fSAndroid Build Coastguard Worker     auto sm = getPermissiveServiceManager();
158*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> serviceA = getBinder();
159*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->addService("foo", serviceA, false /*allowIsolated*/,
160*38e8c45fSAndroid Build Coastguard Worker         IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
161*38e8c45fSAndroid Build Coastguard Worker 
162*38e8c45fSAndroid Build Coastguard Worker     Service outA;
163*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->getService2("foo", &outA).isOk());
164*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(serviceA, outA.get<Service::Tag::serviceWithMetadata>().service);
165*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> outBinderA;
166*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->getService("foo", &outBinderA).isOk());
167*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(serviceA, outBinderA);
168*38e8c45fSAndroid Build Coastguard Worker 
169*38e8c45fSAndroid Build Coastguard Worker     // serviceA should be overwritten by serviceB
170*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> serviceB = getBinder();
171*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->addService("foo", serviceB, false /*allowIsolated*/,
172*38e8c45fSAndroid Build Coastguard Worker         IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
173*38e8c45fSAndroid Build Coastguard Worker 
174*38e8c45fSAndroid Build Coastguard Worker     Service outB;
175*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->getService2("foo", &outB).isOk());
176*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(serviceB, outB.get<Service::Tag::serviceWithMetadata>().service);
177*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> outBinderB;
178*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->getService("foo", &outBinderB).isOk());
179*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(serviceB, outBinderB);
180*38e8c45fSAndroid Build Coastguard Worker }
181*38e8c45fSAndroid Build Coastguard Worker 
TEST(AddService,NoPermissions)182*38e8c45fSAndroid Build Coastguard Worker TEST(AddService, NoPermissions) {
183*38e8c45fSAndroid Build Coastguard Worker     std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
184*38e8c45fSAndroid Build Coastguard Worker 
185*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*access, getCallingContext()).WillOnce(Return(Access::CallingContext{}));
186*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*access, canAdd(_, _)).WillOnce(Return(false));
187*38e8c45fSAndroid Build Coastguard Worker 
188*38e8c45fSAndroid Build Coastguard Worker     sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
189*38e8c45fSAndroid Build Coastguard Worker 
190*38e8c45fSAndroid Build Coastguard Worker     EXPECT_FALSE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
191*38e8c45fSAndroid Build Coastguard Worker         IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
192*38e8c45fSAndroid Build Coastguard Worker }
193*38e8c45fSAndroid Build Coastguard Worker 
TEST(GetService,HappyHappy)194*38e8c45fSAndroid Build Coastguard Worker TEST(GetService, HappyHappy) {
195*38e8c45fSAndroid Build Coastguard Worker     auto sm = getPermissiveServiceManager();
196*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> service = getBinder();
197*38e8c45fSAndroid Build Coastguard Worker 
198*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->addService("foo", service, false /*allowIsolated*/,
199*38e8c45fSAndroid Build Coastguard Worker         IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
200*38e8c45fSAndroid Build Coastguard Worker 
201*38e8c45fSAndroid Build Coastguard Worker     Service out;
202*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->getService2("foo", &out).isOk());
203*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(service, out.get<Service::Tag::serviceWithMetadata>().service);
204*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> outBinder;
205*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->getService("foo", &outBinder).isOk());
206*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(service, outBinder);
207*38e8c45fSAndroid Build Coastguard Worker }
208*38e8c45fSAndroid Build Coastguard Worker 
TEST(GetService,NonExistant)209*38e8c45fSAndroid Build Coastguard Worker TEST(GetService, NonExistant) {
210*38e8c45fSAndroid Build Coastguard Worker     auto sm = getPermissiveServiceManager();
211*38e8c45fSAndroid Build Coastguard Worker 
212*38e8c45fSAndroid Build Coastguard Worker     Service out;
213*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->getService2("foo", &out).isOk());
214*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(nullptr, out.get<Service::Tag::serviceWithMetadata>().service);
215*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> outBinder;
216*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->getService("foo", &outBinder).isOk());
217*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(nullptr, outBinder);
218*38e8c45fSAndroid Build Coastguard Worker }
219*38e8c45fSAndroid Build Coastguard Worker 
TEST(GetService,NoPermissionsForGettingService)220*38e8c45fSAndroid Build Coastguard Worker TEST(GetService, NoPermissionsForGettingService) {
221*38e8c45fSAndroid Build Coastguard Worker     std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
222*38e8c45fSAndroid Build Coastguard Worker 
223*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*access, getCallingContext()).WillRepeatedly(Return(Access::CallingContext{}));
224*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*access, canAdd(_, _)).WillOnce(Return(true));
225*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*access, canFind(_, _)).WillRepeatedly(Return(false));
226*38e8c45fSAndroid Build Coastguard Worker 
227*38e8c45fSAndroid Build Coastguard Worker     sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
228*38e8c45fSAndroid Build Coastguard Worker 
229*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
230*38e8c45fSAndroid Build Coastguard Worker         IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
231*38e8c45fSAndroid Build Coastguard Worker 
232*38e8c45fSAndroid Build Coastguard Worker     Service out;
233*38e8c45fSAndroid Build Coastguard Worker     // returns nullptr but has OK status for legacy compatibility
234*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->getService2("foo", &out).isOk());
235*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(nullptr, out.get<Service::Tag::serviceWithMetadata>().service);
236*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> outBinder;
237*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->getService("foo", &outBinder).isOk());
238*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(nullptr, outBinder);
239*38e8c45fSAndroid Build Coastguard Worker }
240*38e8c45fSAndroid Build Coastguard Worker 
TEST(GetService,AllowedFromIsolated)241*38e8c45fSAndroid Build Coastguard Worker TEST(GetService, AllowedFromIsolated) {
242*38e8c45fSAndroid Build Coastguard Worker     std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
243*38e8c45fSAndroid Build Coastguard Worker 
244*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*access, getCallingContext())
245*38e8c45fSAndroid Build Coastguard Worker             // something adds it
246*38e8c45fSAndroid Build Coastguard Worker             .WillOnce(Return(Access::CallingContext{}))
247*38e8c45fSAndroid Build Coastguard Worker             // next calls is from isolated app
248*38e8c45fSAndroid Build Coastguard Worker             .WillOnce(Return(Access::CallingContext{
249*38e8c45fSAndroid Build Coastguard Worker                     .uid = AID_ISOLATED_START,
250*38e8c45fSAndroid Build Coastguard Worker             }))
251*38e8c45fSAndroid Build Coastguard Worker             .WillOnce(Return(Access::CallingContext{
252*38e8c45fSAndroid Build Coastguard Worker                     .uid = AID_ISOLATED_START,
253*38e8c45fSAndroid Build Coastguard Worker             }));
254*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*access, canAdd(_, _)).WillOnce(Return(true));
255*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*access, canFind(_, _)).WillRepeatedly(Return(true));
256*38e8c45fSAndroid Build Coastguard Worker 
257*38e8c45fSAndroid Build Coastguard Worker     sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
258*38e8c45fSAndroid Build Coastguard Worker 
259*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> service = getBinder();
260*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->addService("foo", service, true /*allowIsolated*/,
261*38e8c45fSAndroid Build Coastguard Worker         IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
262*38e8c45fSAndroid Build Coastguard Worker 
263*38e8c45fSAndroid Build Coastguard Worker     Service out;
264*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->getService2("foo", &out).isOk());
265*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(service, out.get<Service::Tag::serviceWithMetadata>().service);
266*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> outBinder;
267*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->getService("foo", &outBinder).isOk());
268*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(service, outBinder);
269*38e8c45fSAndroid Build Coastguard Worker }
270*38e8c45fSAndroid Build Coastguard Worker 
TEST(GetService,NotAllowedFromIsolated)271*38e8c45fSAndroid Build Coastguard Worker TEST(GetService, NotAllowedFromIsolated) {
272*38e8c45fSAndroid Build Coastguard Worker     std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
273*38e8c45fSAndroid Build Coastguard Worker 
274*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*access, getCallingContext())
275*38e8c45fSAndroid Build Coastguard Worker             // something adds it
276*38e8c45fSAndroid Build Coastguard Worker             .WillOnce(Return(Access::CallingContext{}))
277*38e8c45fSAndroid Build Coastguard Worker             // next calls is from isolated app
278*38e8c45fSAndroid Build Coastguard Worker             .WillOnce(Return(Access::CallingContext{
279*38e8c45fSAndroid Build Coastguard Worker                     .uid = AID_ISOLATED_START,
280*38e8c45fSAndroid Build Coastguard Worker             }))
281*38e8c45fSAndroid Build Coastguard Worker             .WillOnce(Return(Access::CallingContext{
282*38e8c45fSAndroid Build Coastguard Worker                     .uid = AID_ISOLATED_START,
283*38e8c45fSAndroid Build Coastguard Worker             }));
284*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*access, canAdd(_, _)).WillOnce(Return(true));
285*38e8c45fSAndroid Build Coastguard Worker 
286*38e8c45fSAndroid Build Coastguard Worker     // TODO(b/136023468): when security check is first, this should be called first
287*38e8c45fSAndroid Build Coastguard Worker     // EXPECT_CALL(*access, canFind(_, _)).WillOnce(Return(true));
288*38e8c45fSAndroid Build Coastguard Worker 
289*38e8c45fSAndroid Build Coastguard Worker     sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
290*38e8c45fSAndroid Build Coastguard Worker 
291*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
292*38e8c45fSAndroid Build Coastguard Worker         IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
293*38e8c45fSAndroid Build Coastguard Worker 
294*38e8c45fSAndroid Build Coastguard Worker     Service out;
295*38e8c45fSAndroid Build Coastguard Worker     // returns nullptr but has OK status for legacy compatibility
296*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->getService2("foo", &out).isOk());
297*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(nullptr, out.get<Service::Tag::serviceWithMetadata>().service);
298*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> outBinder;
299*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->getService("foo", &outBinder).isOk());
300*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(nullptr, outBinder);
301*38e8c45fSAndroid Build Coastguard Worker }
302*38e8c45fSAndroid Build Coastguard Worker 
TEST(ListServices,NoPermissions)303*38e8c45fSAndroid Build Coastguard Worker TEST(ListServices, NoPermissions) {
304*38e8c45fSAndroid Build Coastguard Worker     std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
305*38e8c45fSAndroid Build Coastguard Worker 
306*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*access, getCallingContext()).WillOnce(Return(Access::CallingContext{}));
307*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*access, canList(_)).WillOnce(Return(false));
308*38e8c45fSAndroid Build Coastguard Worker 
309*38e8c45fSAndroid Build Coastguard Worker     sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
310*38e8c45fSAndroid Build Coastguard Worker 
311*38e8c45fSAndroid Build Coastguard Worker     std::vector<std::string> out;
312*38e8c45fSAndroid Build Coastguard Worker     EXPECT_FALSE(sm->listServices(IServiceManager::DUMP_FLAG_PRIORITY_ALL, &out).isOk());
313*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(out.empty());
314*38e8c45fSAndroid Build Coastguard Worker }
315*38e8c45fSAndroid Build Coastguard Worker 
TEST(ListServices,AllServices)316*38e8c45fSAndroid Build Coastguard Worker TEST(ListServices, AllServices) {
317*38e8c45fSAndroid Build Coastguard Worker     auto sm = getPermissiveServiceManager();
318*38e8c45fSAndroid Build Coastguard Worker 
319*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->addService("sd", getBinder(), false /*allowIsolated*/,
320*38e8c45fSAndroid Build Coastguard Worker         IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
321*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->addService("sc", getBinder(), false /*allowIsolated*/,
322*38e8c45fSAndroid Build Coastguard Worker         IServiceManager::DUMP_FLAG_PRIORITY_NORMAL).isOk());
323*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->addService("sb", getBinder(), false /*allowIsolated*/,
324*38e8c45fSAndroid Build Coastguard Worker         IServiceManager::DUMP_FLAG_PRIORITY_HIGH).isOk());
325*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->addService("sa", getBinder(), false /*allowIsolated*/,
326*38e8c45fSAndroid Build Coastguard Worker         IServiceManager::DUMP_FLAG_PRIORITY_CRITICAL).isOk());
327*38e8c45fSAndroid Build Coastguard Worker 
328*38e8c45fSAndroid Build Coastguard Worker     std::vector<std::string> out;
329*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->listServices(IServiceManager::DUMP_FLAG_PRIORITY_ALL, &out).isOk());
330*38e8c45fSAndroid Build Coastguard Worker 
331*38e8c45fSAndroid Build Coastguard Worker     // all there and in the right order
332*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(out, ElementsAre("sa", "sb", "sc", "sd"));
333*38e8c45fSAndroid Build Coastguard Worker }
334*38e8c45fSAndroid Build Coastguard Worker 
TEST(ListServices,CriticalServices)335*38e8c45fSAndroid Build Coastguard Worker TEST(ListServices, CriticalServices) {
336*38e8c45fSAndroid Build Coastguard Worker     auto sm = getPermissiveServiceManager();
337*38e8c45fSAndroid Build Coastguard Worker 
338*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->addService("sd", getBinder(), false /*allowIsolated*/,
339*38e8c45fSAndroid Build Coastguard Worker         IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
340*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->addService("sc", getBinder(), false /*allowIsolated*/,
341*38e8c45fSAndroid Build Coastguard Worker         IServiceManager::DUMP_FLAG_PRIORITY_NORMAL).isOk());
342*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->addService("sb", getBinder(), false /*allowIsolated*/,
343*38e8c45fSAndroid Build Coastguard Worker         IServiceManager::DUMP_FLAG_PRIORITY_HIGH).isOk());
344*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->addService("sa", getBinder(), false /*allowIsolated*/,
345*38e8c45fSAndroid Build Coastguard Worker         IServiceManager::DUMP_FLAG_PRIORITY_CRITICAL).isOk());
346*38e8c45fSAndroid Build Coastguard Worker 
347*38e8c45fSAndroid Build Coastguard Worker     std::vector<std::string> out;
348*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->listServices(IServiceManager::DUMP_FLAG_PRIORITY_CRITICAL, &out).isOk());
349*38e8c45fSAndroid Build Coastguard Worker 
350*38e8c45fSAndroid Build Coastguard Worker     // all there and in the right order
351*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(out, ElementsAre("sa"));
352*38e8c45fSAndroid Build Coastguard Worker }
353*38e8c45fSAndroid Build Coastguard Worker 
TEST(Vintf,UpdatableViaApex)354*38e8c45fSAndroid Build Coastguard Worker TEST(Vintf, UpdatableViaApex) {
355*38e8c45fSAndroid Build Coastguard Worker     if (!isCuttlefishPhone()) GTEST_SKIP() << "Skipping non-Cuttlefish-phone devices";
356*38e8c45fSAndroid Build Coastguard Worker 
357*38e8c45fSAndroid Build Coastguard Worker     auto sm = getPermissiveServiceManager();
358*38e8c45fSAndroid Build Coastguard Worker     std::optional<std::string> updatableViaApex;
359*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->updatableViaApex("android.hardware.camera.provider.ICameraProvider/internal/0",
360*38e8c45fSAndroid Build Coastguard Worker                                      &updatableViaApex)
361*38e8c45fSAndroid Build Coastguard Worker                         .isOk());
362*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(std::make_optional<std::string>("com.google.emulated.camera.provider.hal"),
363*38e8c45fSAndroid Build Coastguard Worker               updatableViaApex);
364*38e8c45fSAndroid Build Coastguard Worker }
365*38e8c45fSAndroid Build Coastguard Worker 
TEST(Vintf,UpdatableViaApex_InvalidNameReturnsNullOpt)366*38e8c45fSAndroid Build Coastguard Worker TEST(Vintf, UpdatableViaApex_InvalidNameReturnsNullOpt) {
367*38e8c45fSAndroid Build Coastguard Worker     if (!isCuttlefishPhone()) GTEST_SKIP() << "Skipping non-Cuttlefish-phone devices";
368*38e8c45fSAndroid Build Coastguard Worker 
369*38e8c45fSAndroid Build Coastguard Worker     auto sm = getPermissiveServiceManager();
370*38e8c45fSAndroid Build Coastguard Worker     std::optional<std::string> updatableViaApex;
371*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->updatableViaApex("android.hardware.camera.provider.ICameraProvider",
372*38e8c45fSAndroid Build Coastguard Worker                                      &updatableViaApex)
373*38e8c45fSAndroid Build Coastguard Worker                         .isOk()); // missing instance name
374*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(std::nullopt, updatableViaApex);
375*38e8c45fSAndroid Build Coastguard Worker }
376*38e8c45fSAndroid Build Coastguard Worker 
TEST(Vintf,GetUpdatableNames)377*38e8c45fSAndroid Build Coastguard Worker TEST(Vintf, GetUpdatableNames) {
378*38e8c45fSAndroid Build Coastguard Worker     if (!isCuttlefishPhone()) GTEST_SKIP() << "Skipping non-Cuttlefish-phone devices";
379*38e8c45fSAndroid Build Coastguard Worker 
380*38e8c45fSAndroid Build Coastguard Worker     auto sm = getPermissiveServiceManager();
381*38e8c45fSAndroid Build Coastguard Worker     std::vector<std::string> names;
382*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->getUpdatableNames("com.google.emulated.camera.provider.hal", &names).isOk());
383*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(std::vector<
384*38e8c45fSAndroid Build Coastguard Worker                       std::string>{"android.hardware.camera.provider.ICameraProvider/internal/0"},
385*38e8c45fSAndroid Build Coastguard Worker               names);
386*38e8c45fSAndroid Build Coastguard Worker }
387*38e8c45fSAndroid Build Coastguard Worker 
TEST(Vintf,GetUpdatableNames_InvalidApexNameReturnsEmpty)388*38e8c45fSAndroid Build Coastguard Worker TEST(Vintf, GetUpdatableNames_InvalidApexNameReturnsEmpty) {
389*38e8c45fSAndroid Build Coastguard Worker     if (!isCuttlefishPhone()) GTEST_SKIP() << "Skipping non-Cuttlefish-phone devices";
390*38e8c45fSAndroid Build Coastguard Worker 
391*38e8c45fSAndroid Build Coastguard Worker     auto sm = getPermissiveServiceManager();
392*38e8c45fSAndroid Build Coastguard Worker     std::vector<std::string> names;
393*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->getUpdatableNames("non.existing.apex.name", &names).isOk());
394*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(std::vector<std::string>{}, names);
395*38e8c45fSAndroid Build Coastguard Worker }
396*38e8c45fSAndroid Build Coastguard Worker 
TEST(Vintf,IsDeclared_native)397*38e8c45fSAndroid Build Coastguard Worker TEST(Vintf, IsDeclared_native) {
398*38e8c45fSAndroid Build Coastguard Worker     if (!isCuttlefishPhone()) GTEST_SKIP() << "Skipping non-Cuttlefish-phone devices";
399*38e8c45fSAndroid Build Coastguard Worker 
400*38e8c45fSAndroid Build Coastguard Worker     auto sm = getPermissiveServiceManager();
401*38e8c45fSAndroid Build Coastguard Worker     bool declared = false;
402*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->isDeclared("mapper/minigbm", &declared).isOk());
403*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(declared);
404*38e8c45fSAndroid Build Coastguard Worker }
405*38e8c45fSAndroid Build Coastguard Worker 
TEST(Vintf,GetDeclaredInstances_native)406*38e8c45fSAndroid Build Coastguard Worker TEST(Vintf, GetDeclaredInstances_native) {
407*38e8c45fSAndroid Build Coastguard Worker     if (!isCuttlefishPhone()) GTEST_SKIP() << "Skipping non-Cuttlefish-phone devices";
408*38e8c45fSAndroid Build Coastguard Worker 
409*38e8c45fSAndroid Build Coastguard Worker     auto sm = getPermissiveServiceManager();
410*38e8c45fSAndroid Build Coastguard Worker     std::vector<std::string> instances;
411*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->getDeclaredInstances("mapper", &instances).isOk());
412*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(std::vector<std::string>{"minigbm"}, instances);
413*38e8c45fSAndroid Build Coastguard Worker }
414*38e8c45fSAndroid Build Coastguard Worker 
415*38e8c45fSAndroid Build Coastguard Worker class CallbackHistorian : public BnServiceCallback {
onRegistration(const std::string & name,const sp<IBinder> & binder)416*38e8c45fSAndroid Build Coastguard Worker     Status onRegistration(const std::string& name, const sp<IBinder>& binder) override {
417*38e8c45fSAndroid Build Coastguard Worker         registrations.push_back(name);
418*38e8c45fSAndroid Build Coastguard Worker         binders.push_back(binder);
419*38e8c45fSAndroid Build Coastguard Worker         return Status::ok();
420*38e8c45fSAndroid Build Coastguard Worker     }
421*38e8c45fSAndroid Build Coastguard Worker 
linkToDeath(const sp<DeathRecipient> &,void *,uint32_t)422*38e8c45fSAndroid Build Coastguard Worker     android::status_t linkToDeath(const sp<DeathRecipient>&, void*, uint32_t) override {
423*38e8c45fSAndroid Build Coastguard Worker         // let SM linkToDeath
424*38e8c45fSAndroid Build Coastguard Worker         return android::OK;
425*38e8c45fSAndroid Build Coastguard Worker     }
426*38e8c45fSAndroid Build Coastguard Worker 
427*38e8c45fSAndroid Build Coastguard Worker public:
428*38e8c45fSAndroid Build Coastguard Worker     std::vector<std::string> registrations;
429*38e8c45fSAndroid Build Coastguard Worker     std::vector<sp<IBinder>> binders;
430*38e8c45fSAndroid Build Coastguard Worker };
431*38e8c45fSAndroid Build Coastguard Worker 
TEST(ServiceNotifications,NoPermissionsRegister)432*38e8c45fSAndroid Build Coastguard Worker TEST(ServiceNotifications, NoPermissionsRegister) {
433*38e8c45fSAndroid Build Coastguard Worker     std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
434*38e8c45fSAndroid Build Coastguard Worker 
435*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*access, getCallingContext()).WillOnce(Return(Access::CallingContext{}));
436*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*access, canFind(_,_)).WillOnce(Return(false));
437*38e8c45fSAndroid Build Coastguard Worker 
438*38e8c45fSAndroid Build Coastguard Worker     sp<ServiceManager> sm = sp<ServiceManager>::make(std::move(access));
439*38e8c45fSAndroid Build Coastguard Worker 
440*38e8c45fSAndroid Build Coastguard Worker     sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
441*38e8c45fSAndroid Build Coastguard Worker 
442*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(sm->registerForNotifications("foofoo", cb).exceptionCode(), Status::EX_SECURITY);
443*38e8c45fSAndroid Build Coastguard Worker }
444*38e8c45fSAndroid Build Coastguard Worker 
TEST(GetService,IsolatedCantRegister)445*38e8c45fSAndroid Build Coastguard Worker TEST(GetService, IsolatedCantRegister) {
446*38e8c45fSAndroid Build Coastguard Worker     std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
447*38e8c45fSAndroid Build Coastguard Worker 
448*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*access, getCallingContext())
449*38e8c45fSAndroid Build Coastguard Worker             .WillOnce(Return(Access::CallingContext{
450*38e8c45fSAndroid Build Coastguard Worker                     .uid = AID_ISOLATED_START,
451*38e8c45fSAndroid Build Coastguard Worker             }));
452*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*access, canFind(_, _)).WillOnce(Return(true));
453*38e8c45fSAndroid Build Coastguard Worker 
454*38e8c45fSAndroid Build Coastguard Worker     sp<ServiceManager> sm = sp<ServiceManager>::make(std::move(access));
455*38e8c45fSAndroid Build Coastguard Worker 
456*38e8c45fSAndroid Build Coastguard Worker     sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
457*38e8c45fSAndroid Build Coastguard Worker 
458*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(sm->registerForNotifications("foofoo", cb).exceptionCode(),
459*38e8c45fSAndroid Build Coastguard Worker         Status::EX_SECURITY);
460*38e8c45fSAndroid Build Coastguard Worker }
461*38e8c45fSAndroid Build Coastguard Worker 
TEST(ServiceNotifications,NoPermissionsUnregister)462*38e8c45fSAndroid Build Coastguard Worker TEST(ServiceNotifications, NoPermissionsUnregister) {
463*38e8c45fSAndroid Build Coastguard Worker     std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
464*38e8c45fSAndroid Build Coastguard Worker 
465*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*access, getCallingContext()).WillOnce(Return(Access::CallingContext{}));
466*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*access, canFind(_,_)).WillOnce(Return(false));
467*38e8c45fSAndroid Build Coastguard Worker 
468*38e8c45fSAndroid Build Coastguard Worker     sp<ServiceManager> sm = sp<ServiceManager>::make(std::move(access));
469*38e8c45fSAndroid Build Coastguard Worker 
470*38e8c45fSAndroid Build Coastguard Worker     sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
471*38e8c45fSAndroid Build Coastguard Worker 
472*38e8c45fSAndroid Build Coastguard Worker     // should always hit security error first
473*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(sm->unregisterForNotifications("foofoo", cb).exceptionCode(),
474*38e8c45fSAndroid Build Coastguard Worker         Status::EX_SECURITY);
475*38e8c45fSAndroid Build Coastguard Worker }
476*38e8c45fSAndroid Build Coastguard Worker 
TEST(ServiceNotifications,InvalidName)477*38e8c45fSAndroid Build Coastguard Worker TEST(ServiceNotifications, InvalidName) {
478*38e8c45fSAndroid Build Coastguard Worker     auto sm = getPermissiveServiceManager();
479*38e8c45fSAndroid Build Coastguard Worker 
480*38e8c45fSAndroid Build Coastguard Worker     sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
481*38e8c45fSAndroid Build Coastguard Worker 
482*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(sm->registerForNotifications("foo@foo", cb).exceptionCode(),
483*38e8c45fSAndroid Build Coastguard Worker         Status::EX_ILLEGAL_ARGUMENT);
484*38e8c45fSAndroid Build Coastguard Worker }
485*38e8c45fSAndroid Build Coastguard Worker 
TEST(ServiceNotifications,NullCallback)486*38e8c45fSAndroid Build Coastguard Worker TEST(ServiceNotifications, NullCallback) {
487*38e8c45fSAndroid Build Coastguard Worker     auto sm = getPermissiveServiceManager();
488*38e8c45fSAndroid Build Coastguard Worker 
489*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(sm->registerForNotifications("foofoo", nullptr).exceptionCode(),
490*38e8c45fSAndroid Build Coastguard Worker         Status::EX_NULL_POINTER);
491*38e8c45fSAndroid Build Coastguard Worker }
492*38e8c45fSAndroid Build Coastguard Worker 
TEST(ServiceNotifications,Unregister)493*38e8c45fSAndroid Build Coastguard Worker TEST(ServiceNotifications, Unregister) {
494*38e8c45fSAndroid Build Coastguard Worker     auto sm = getPermissiveServiceManager();
495*38e8c45fSAndroid Build Coastguard Worker 
496*38e8c45fSAndroid Build Coastguard Worker     sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
497*38e8c45fSAndroid Build Coastguard Worker 
498*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->registerForNotifications("foofoo", cb).isOk());
499*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(sm->unregisterForNotifications("foofoo", cb).exceptionCode(), 0);
500*38e8c45fSAndroid Build Coastguard Worker }
501*38e8c45fSAndroid Build Coastguard Worker 
TEST(ServiceNotifications,UnregisterWhenNoRegistrationExists)502*38e8c45fSAndroid Build Coastguard Worker TEST(ServiceNotifications, UnregisterWhenNoRegistrationExists) {
503*38e8c45fSAndroid Build Coastguard Worker     auto sm = getPermissiveServiceManager();
504*38e8c45fSAndroid Build Coastguard Worker 
505*38e8c45fSAndroid Build Coastguard Worker     sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
506*38e8c45fSAndroid Build Coastguard Worker 
507*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(sm->unregisterForNotifications("foofoo", cb).exceptionCode(),
508*38e8c45fSAndroid Build Coastguard Worker         Status::EX_ILLEGAL_STATE);
509*38e8c45fSAndroid Build Coastguard Worker }
510*38e8c45fSAndroid Build Coastguard Worker 
TEST(ServiceNotifications,NoNotification)511*38e8c45fSAndroid Build Coastguard Worker TEST(ServiceNotifications, NoNotification) {
512*38e8c45fSAndroid Build Coastguard Worker     auto sm = getPermissiveServiceManager();
513*38e8c45fSAndroid Build Coastguard Worker 
514*38e8c45fSAndroid Build Coastguard Worker     sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
515*38e8c45fSAndroid Build Coastguard Worker 
516*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->registerForNotifications("foofoo", cb).isOk());
517*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->addService("otherservice", getBinder(),
518*38e8c45fSAndroid Build Coastguard Worker         false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
519*38e8c45fSAndroid Build Coastguard Worker 
520*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(cb->registrations, ElementsAre());
521*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(cb->binders, ElementsAre());
522*38e8c45fSAndroid Build Coastguard Worker }
523*38e8c45fSAndroid Build Coastguard Worker 
TEST(ServiceNotifications,GetNotification)524*38e8c45fSAndroid Build Coastguard Worker TEST(ServiceNotifications, GetNotification) {
525*38e8c45fSAndroid Build Coastguard Worker     auto sm = getPermissiveServiceManager();
526*38e8c45fSAndroid Build Coastguard Worker 
527*38e8c45fSAndroid Build Coastguard Worker     sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
528*38e8c45fSAndroid Build Coastguard Worker 
529*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> service = getBinder();
530*38e8c45fSAndroid Build Coastguard Worker 
531*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->registerForNotifications("asdfasdf", cb).isOk());
532*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->addService("asdfasdf", service,
533*38e8c45fSAndroid Build Coastguard Worker         false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
534*38e8c45fSAndroid Build Coastguard Worker 
535*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(cb->registrations, ElementsAre("asdfasdf"));
536*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(cb->binders, ElementsAre(service));
537*38e8c45fSAndroid Build Coastguard Worker }
538*38e8c45fSAndroid Build Coastguard Worker 
TEST(ServiceNotifications,GetNotificationForAlreadyRegisteredService)539*38e8c45fSAndroid Build Coastguard Worker TEST(ServiceNotifications, GetNotificationForAlreadyRegisteredService) {
540*38e8c45fSAndroid Build Coastguard Worker     auto sm = getPermissiveServiceManager();
541*38e8c45fSAndroid Build Coastguard Worker 
542*38e8c45fSAndroid Build Coastguard Worker     sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
543*38e8c45fSAndroid Build Coastguard Worker 
544*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> service = getBinder();
545*38e8c45fSAndroid Build Coastguard Worker 
546*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->addService("asdfasdf", service,
547*38e8c45fSAndroid Build Coastguard Worker         false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
548*38e8c45fSAndroid Build Coastguard Worker 
549*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->registerForNotifications("asdfasdf", cb).isOk());
550*38e8c45fSAndroid Build Coastguard Worker 
551*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(cb->registrations, ElementsAre("asdfasdf"));
552*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(cb->binders, ElementsAre(service));
553*38e8c45fSAndroid Build Coastguard Worker }
554*38e8c45fSAndroid Build Coastguard Worker 
TEST(ServiceNotifications,GetMultipleNotification)555*38e8c45fSAndroid Build Coastguard Worker TEST(ServiceNotifications, GetMultipleNotification) {
556*38e8c45fSAndroid Build Coastguard Worker     auto sm = getPermissiveServiceManager();
557*38e8c45fSAndroid Build Coastguard Worker 
558*38e8c45fSAndroid Build Coastguard Worker     sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
559*38e8c45fSAndroid Build Coastguard Worker 
560*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> binder1 = getBinder();
561*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> binder2 = getBinder();
562*38e8c45fSAndroid Build Coastguard Worker 
563*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->registerForNotifications("asdfasdf", cb).isOk());
564*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->addService("asdfasdf", binder1,
565*38e8c45fSAndroid Build Coastguard Worker         false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
566*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(sm->addService("asdfasdf", binder2,
567*38e8c45fSAndroid Build Coastguard Worker         false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
568*38e8c45fSAndroid Build Coastguard Worker 
569*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(cb->registrations, ElementsAre("asdfasdf", "asdfasdf"));
570*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(cb->registrations, ElementsAre("asdfasdf", "asdfasdf"));
571*38e8c45fSAndroid Build Coastguard Worker }
572