blob: 5d5a75e174582f6be9e4340d29962fa9f59e5afa [file] [log] [blame]
Steven Moreland80e1e6d2019-06-21 12:35:59 -07001/*
2 * Copyright (C) 2019 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
Steven Moreland27cfab02019-08-12 14:34:16 -070017#include <android/os/BnServiceCallback.h>
18#include <binder/Binder.h>
Steven Moreland80e1e6d2019-06-21 12:35:59 -070019#include <binder/ProcessState.h>
Steven Moreland27cfab02019-08-12 14:34:16 -070020#include <binder/IServiceManager.h>
Steven Moreland80e1e6d2019-06-21 12:35:59 -070021#include <cutils/android_filesystem_config.h>
22#include <gtest/gtest.h>
23#include <gmock/gmock.h>
24
25#include "Access.h"
26#include "ServiceManager.h"
27
28using android::sp;
29using android::Access;
Steven Moreland27cfab02019-08-12 14:34:16 -070030using android::BBinder;
Steven Moreland80e1e6d2019-06-21 12:35:59 -070031using android::IBinder;
32using android::ServiceManager;
Steven Moreland27cfab02019-08-12 14:34:16 -070033using android::binder::Status;
34using android::os::BnServiceCallback;
Steven Moreland80e1e6d2019-06-21 12:35:59 -070035using android::os::IServiceManager;
36using testing::_;
37using testing::ElementsAre;
38using testing::NiceMock;
39using testing::Return;
40
41static sp<IBinder> getBinder() {
Steven Moreland27cfab02019-08-12 14:34:16 -070042 class LinkableBinder : public BBinder {
43 android::status_t linkToDeath(const sp<DeathRecipient>&, void*, uint32_t) override {
44 // let SM linkToDeath
45 return android::OK;
46 }
47 };
48
Steven Morelandb0983182021-04-02 03:14:04 +000049 return sp<LinkableBinder>::make();
Steven Moreland80e1e6d2019-06-21 12:35:59 -070050}
51
52class MockAccess : public Access {
53public:
Steven Morelanda9fe4742019-07-18 14:45:20 -070054 MOCK_METHOD0(getCallingContext, CallingContext());
55 MOCK_METHOD2(canAdd, bool(const CallingContext&, const std::string& name));
56 MOCK_METHOD2(canFind, bool(const CallingContext&, const std::string& name));
Steven Moreland80e1e6d2019-06-21 12:35:59 -070057 MOCK_METHOD1(canList, bool(const CallingContext&));
58};
59
Jon Spivack0d844302019-07-22 18:40:34 -070060class MockServiceManager : public ServiceManager {
61 public:
62 MockServiceManager(std::unique_ptr<Access>&& access) : ServiceManager(std::move(access)) {}
63 MOCK_METHOD1(tryStartService, void(const std::string& name));
64};
65
Steven Moreland80e1e6d2019-06-21 12:35:59 -070066static sp<ServiceManager> getPermissiveServiceManager() {
67 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
68
Steven Morelanda9fe4742019-07-18 14:45:20 -070069 ON_CALL(*access, getCallingContext()).WillByDefault(Return(Access::CallingContext{}));
70 ON_CALL(*access, canAdd(_, _)).WillByDefault(Return(true));
71 ON_CALL(*access, canFind(_, _)).WillByDefault(Return(true));
Steven Moreland80e1e6d2019-06-21 12:35:59 -070072 ON_CALL(*access, canList(_)).WillByDefault(Return(true));
73
Steven Morelandb0983182021-04-02 03:14:04 +000074 sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
Steven Moreland80e1e6d2019-06-21 12:35:59 -070075 return sm;
76}
77
78TEST(AddService, HappyHappy) {
79 auto sm = getPermissiveServiceManager();
80 EXPECT_TRUE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
81 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
82}
83
84TEST(AddService, EmptyNameDisallowed) {
85 auto sm = getPermissiveServiceManager();
86 EXPECT_FALSE(sm->addService("", getBinder(), false /*allowIsolated*/,
87 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
88}
89
90TEST(AddService, JustShortEnoughServiceNameHappy) {
91 auto sm = getPermissiveServiceManager();
92 EXPECT_TRUE(sm->addService(std::string(127, 'a'), getBinder(), false /*allowIsolated*/,
93 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
94}
95
96TEST(AddService, TooLongNameDisallowed) {
97 auto sm = getPermissiveServiceManager();
98 EXPECT_FALSE(sm->addService(std::string(128, 'a'), getBinder(), false /*allowIsolated*/,
99 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
100}
101
Steven Moreland905e2e82019-07-17 11:05:45 -0700102TEST(AddService, WeirdCharactersDisallowed) {
103 auto sm = getPermissiveServiceManager();
104 EXPECT_FALSE(sm->addService("happy$foo$foo", getBinder(), false /*allowIsolated*/,
105 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
106}
107
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700108TEST(AddService, AddNullServiceDisallowed) {
109 auto sm = getPermissiveServiceManager();
110 EXPECT_FALSE(sm->addService("foo", nullptr, false /*allowIsolated*/,
111 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
112}
113
114TEST(AddService, AddDisallowedFromApp) {
115 for (uid_t uid : { AID_APP_START, AID_APP_START + 1, AID_APP_END }) {
116 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
Steven Morelanda9fe4742019-07-18 14:45:20 -0700117 EXPECT_CALL(*access, getCallingContext()).WillOnce(Return(Access::CallingContext{
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700118 .debugPid = 1337,
119 .uid = uid,
120 }));
Steven Morelanda9fe4742019-07-18 14:45:20 -0700121 EXPECT_CALL(*access, canAdd(_, _)).Times(0);
Steven Morelandb0983182021-04-02 03:14:04 +0000122 sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700123
124 EXPECT_FALSE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
125 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
126 }
127
128}
129
130TEST(AddService, HappyOverExistingService) {
131 auto sm = getPermissiveServiceManager();
132 EXPECT_TRUE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
133 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
134 EXPECT_TRUE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
135 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
136}
137
Devin Moore05ffe522020-08-06 13:58:29 -0700138TEST(AddService, OverwriteExistingService) {
139 auto sm = getPermissiveServiceManager();
140 sp<IBinder> serviceA = getBinder();
141 EXPECT_TRUE(sm->addService("foo", serviceA, false /*allowIsolated*/,
142 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
143
144 sp<IBinder> outA;
145 EXPECT_TRUE(sm->getService("foo", &outA).isOk());
146 EXPECT_EQ(serviceA, outA);
147
148 // serviceA should be overwritten by serviceB
149 sp<IBinder> serviceB = getBinder();
150 EXPECT_TRUE(sm->addService("foo", serviceB, false /*allowIsolated*/,
151 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
152
153 sp<IBinder> outB;
154 EXPECT_TRUE(sm->getService("foo", &outB).isOk());
155 EXPECT_EQ(serviceB, outB);
156}
157
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700158TEST(AddService, NoPermissions) {
159 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
160
Steven Morelanda9fe4742019-07-18 14:45:20 -0700161 EXPECT_CALL(*access, getCallingContext()).WillOnce(Return(Access::CallingContext{}));
162 EXPECT_CALL(*access, canAdd(_, _)).WillOnce(Return(false));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700163
Steven Morelandb0983182021-04-02 03:14:04 +0000164 sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700165
166 EXPECT_FALSE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
167 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
168}
169
170TEST(GetService, HappyHappy) {
171 auto sm = getPermissiveServiceManager();
Steven Moreland27cfab02019-08-12 14:34:16 -0700172 sp<IBinder> service = getBinder();
173
174 EXPECT_TRUE(sm->addService("foo", service, false /*allowIsolated*/,
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700175 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
176
177 sp<IBinder> out;
178 EXPECT_TRUE(sm->getService("foo", &out).isOk());
Steven Moreland27cfab02019-08-12 14:34:16 -0700179 EXPECT_EQ(service, out);
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700180}
181
182TEST(GetService, NonExistant) {
183 auto sm = getPermissiveServiceManager();
184
185 sp<IBinder> out;
186 EXPECT_TRUE(sm->getService("foo", &out).isOk());
187 EXPECT_EQ(nullptr, out.get());
188}
189
190TEST(GetService, NoPermissionsForGettingService) {
191 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
192
Steven Morelanda9fe4742019-07-18 14:45:20 -0700193 EXPECT_CALL(*access, getCallingContext()).WillRepeatedly(Return(Access::CallingContext{}));
194 EXPECT_CALL(*access, canAdd(_, _)).WillOnce(Return(true));
195 EXPECT_CALL(*access, canFind(_, _)).WillOnce(Return(false));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700196
Steven Morelandb0983182021-04-02 03:14:04 +0000197 sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700198
199 EXPECT_TRUE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
200 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
201
202 sp<IBinder> out;
203 // returns nullptr but has OK status for legacy compatibility
204 EXPECT_TRUE(sm->getService("foo", &out).isOk());
205 EXPECT_EQ(nullptr, out.get());
206}
207
208TEST(GetService, AllowedFromIsolated) {
209 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
210
Steven Morelanda9fe4742019-07-18 14:45:20 -0700211 EXPECT_CALL(*access, getCallingContext())
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700212 // something adds it
213 .WillOnce(Return(Access::CallingContext{}))
214 // next call is from isolated app
215 .WillOnce(Return(Access::CallingContext{
216 .uid = AID_ISOLATED_START,
217 }));
Steven Morelanda9fe4742019-07-18 14:45:20 -0700218 EXPECT_CALL(*access, canAdd(_, _)).WillOnce(Return(true));
219 EXPECT_CALL(*access, canFind(_, _)).WillOnce(Return(true));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700220
Steven Morelandb0983182021-04-02 03:14:04 +0000221 sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700222
Steven Moreland27cfab02019-08-12 14:34:16 -0700223 sp<IBinder> service = getBinder();
224 EXPECT_TRUE(sm->addService("foo", service, true /*allowIsolated*/,
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700225 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
226
227 sp<IBinder> out;
228 EXPECT_TRUE(sm->getService("foo", &out).isOk());
Steven Moreland27cfab02019-08-12 14:34:16 -0700229 EXPECT_EQ(service, out.get());
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700230}
231
232TEST(GetService, NotAllowedFromIsolated) {
233 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
234
Steven Morelanda9fe4742019-07-18 14:45:20 -0700235 EXPECT_CALL(*access, getCallingContext())
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700236 // something adds it
237 .WillOnce(Return(Access::CallingContext{}))
238 // next call is from isolated app
239 .WillOnce(Return(Access::CallingContext{
240 .uid = AID_ISOLATED_START,
241 }));
Steven Morelanda9fe4742019-07-18 14:45:20 -0700242 EXPECT_CALL(*access, canAdd(_, _)).WillOnce(Return(true));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700243
244 // TODO(b/136023468): when security check is first, this should be called first
Steven Morelanda9fe4742019-07-18 14:45:20 -0700245 // EXPECT_CALL(*access, canFind(_, _)).WillOnce(Return(true));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700246
Steven Morelandb0983182021-04-02 03:14:04 +0000247 sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700248
249 EXPECT_TRUE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
250 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
251
252 sp<IBinder> out;
253 // returns nullptr but has OK status for legacy compatibility
254 EXPECT_TRUE(sm->getService("foo", &out).isOk());
255 EXPECT_EQ(nullptr, out.get());
256}
257
258TEST(ListServices, NoPermissions) {
259 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
260
Steven Morelanda9fe4742019-07-18 14:45:20 -0700261 EXPECT_CALL(*access, getCallingContext()).WillOnce(Return(Access::CallingContext{}));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700262 EXPECT_CALL(*access, canList(_)).WillOnce(Return(false));
263
Steven Morelandb0983182021-04-02 03:14:04 +0000264 sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700265
266 std::vector<std::string> out;
267 EXPECT_FALSE(sm->listServices(IServiceManager::DUMP_FLAG_PRIORITY_ALL, &out).isOk());
268 EXPECT_TRUE(out.empty());
269}
270
271TEST(ListServices, AllServices) {
272 auto sm = getPermissiveServiceManager();
273
274 EXPECT_TRUE(sm->addService("sd", getBinder(), false /*allowIsolated*/,
275 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
276 EXPECT_TRUE(sm->addService("sc", getBinder(), false /*allowIsolated*/,
277 IServiceManager::DUMP_FLAG_PRIORITY_NORMAL).isOk());
278 EXPECT_TRUE(sm->addService("sb", getBinder(), false /*allowIsolated*/,
279 IServiceManager::DUMP_FLAG_PRIORITY_HIGH).isOk());
280 EXPECT_TRUE(sm->addService("sa", getBinder(), false /*allowIsolated*/,
281 IServiceManager::DUMP_FLAG_PRIORITY_CRITICAL).isOk());
282
283 std::vector<std::string> out;
284 EXPECT_TRUE(sm->listServices(IServiceManager::DUMP_FLAG_PRIORITY_ALL, &out).isOk());
285
286 // all there and in the right order
287 EXPECT_THAT(out, ElementsAre("sa", "sb", "sc", "sd"));
288}
289
290TEST(ListServices, CriticalServices) {
291 auto sm = getPermissiveServiceManager();
292
293 EXPECT_TRUE(sm->addService("sd", getBinder(), false /*allowIsolated*/,
294 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
295 EXPECT_TRUE(sm->addService("sc", getBinder(), false /*allowIsolated*/,
296 IServiceManager::DUMP_FLAG_PRIORITY_NORMAL).isOk());
297 EXPECT_TRUE(sm->addService("sb", getBinder(), false /*allowIsolated*/,
298 IServiceManager::DUMP_FLAG_PRIORITY_HIGH).isOk());
299 EXPECT_TRUE(sm->addService("sa", getBinder(), false /*allowIsolated*/,
300 IServiceManager::DUMP_FLAG_PRIORITY_CRITICAL).isOk());
301
302 std::vector<std::string> out;
303 EXPECT_TRUE(sm->listServices(IServiceManager::DUMP_FLAG_PRIORITY_CRITICAL, &out).isOk());
304
305 // all there and in the right order
306 EXPECT_THAT(out, ElementsAre("sa"));
307}
Steven Moreland27cfab02019-08-12 14:34:16 -0700308
309class CallbackHistorian : public BnServiceCallback {
310 Status onRegistration(const std::string& name, const sp<IBinder>& binder) override {
311 registrations.push_back(name);
312 binders.push_back(binder);
313 return Status::ok();
314 }
315
316 android::status_t linkToDeath(const sp<DeathRecipient>&, void*, uint32_t) override {
317 // let SM linkToDeath
318 return android::OK;
319 }
320
321public:
322 std::vector<std::string> registrations;
323 std::vector<sp<IBinder>> binders;
324};
325
326TEST(ServiceNotifications, NoPermissionsRegister) {
327 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
328
329 EXPECT_CALL(*access, getCallingContext()).WillOnce(Return(Access::CallingContext{}));
330 EXPECT_CALL(*access, canFind(_,_)).WillOnce(Return(false));
331
Steven Morelandb0983182021-04-02 03:14:04 +0000332 sp<ServiceManager> sm = sp<ServiceManager>::make(std::move(access));
Steven Moreland27cfab02019-08-12 14:34:16 -0700333
Steven Morelandb0983182021-04-02 03:14:04 +0000334 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700335
336 EXPECT_EQ(sm->registerForNotifications("foofoo", cb).exceptionCode(),
337 Status::EX_SECURITY);
338}
339
340TEST(ServiceNotifications, NoPermissionsUnregister) {
341 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
342
343 EXPECT_CALL(*access, getCallingContext()).WillOnce(Return(Access::CallingContext{}));
344 EXPECT_CALL(*access, canFind(_,_)).WillOnce(Return(false));
345
Steven Morelandb0983182021-04-02 03:14:04 +0000346 sp<ServiceManager> sm = sp<ServiceManager>::make(std::move(access));
Steven Moreland27cfab02019-08-12 14:34:16 -0700347
Steven Morelandb0983182021-04-02 03:14:04 +0000348 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700349
350 // should always hit security error first
351 EXPECT_EQ(sm->unregisterForNotifications("foofoo", cb).exceptionCode(),
352 Status::EX_SECURITY);
353}
354
355TEST(ServiceNotifications, InvalidName) {
356 auto sm = getPermissiveServiceManager();
357
Steven Morelandb0983182021-04-02 03:14:04 +0000358 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700359
360 EXPECT_EQ(sm->registerForNotifications("foo@foo", cb).exceptionCode(),
361 Status::EX_ILLEGAL_ARGUMENT);
362}
363
364TEST(ServiceNotifications, NullCallback) {
365 auto sm = getPermissiveServiceManager();
366
367 EXPECT_EQ(sm->registerForNotifications("foofoo", nullptr).exceptionCode(),
368 Status::EX_NULL_POINTER);
369}
370
371TEST(ServiceNotifications, Unregister) {
372 auto sm = getPermissiveServiceManager();
373
Steven Morelandb0983182021-04-02 03:14:04 +0000374 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700375
376 EXPECT_TRUE(sm->registerForNotifications("foofoo", cb).isOk());
377 EXPECT_EQ(sm->unregisterForNotifications("foofoo", cb).exceptionCode(), 0);
378}
379
380TEST(ServiceNotifications, UnregisterWhenNoRegistrationExists) {
381 auto sm = getPermissiveServiceManager();
382
Steven Morelandb0983182021-04-02 03:14:04 +0000383 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700384
385 EXPECT_EQ(sm->unregisterForNotifications("foofoo", cb).exceptionCode(),
386 Status::EX_ILLEGAL_STATE);
387}
388
389TEST(ServiceNotifications, NoNotification) {
390 auto sm = getPermissiveServiceManager();
391
Steven Morelandb0983182021-04-02 03:14:04 +0000392 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700393
394 EXPECT_TRUE(sm->registerForNotifications("foofoo", cb).isOk());
395 EXPECT_TRUE(sm->addService("otherservice", getBinder(),
396 false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
397
398 EXPECT_THAT(cb->registrations, ElementsAre());
399 EXPECT_THAT(cb->binders, ElementsAre());
400}
401
402TEST(ServiceNotifications, GetNotification) {
403 auto sm = getPermissiveServiceManager();
404
Steven Morelandb0983182021-04-02 03:14:04 +0000405 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700406
407 sp<IBinder> service = getBinder();
408
409 EXPECT_TRUE(sm->registerForNotifications("asdfasdf", cb).isOk());
410 EXPECT_TRUE(sm->addService("asdfasdf", service,
411 false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
412
413 EXPECT_THAT(cb->registrations, ElementsAre("asdfasdf"));
414 EXPECT_THAT(cb->binders, ElementsAre(service));
415}
416
417TEST(ServiceNotifications, GetNotificationForAlreadyRegisteredService) {
418 auto sm = getPermissiveServiceManager();
419
Steven Morelandb0983182021-04-02 03:14:04 +0000420 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700421
422 sp<IBinder> service = getBinder();
423
424 EXPECT_TRUE(sm->addService("asdfasdf", service,
425 false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
426
427 EXPECT_TRUE(sm->registerForNotifications("asdfasdf", cb).isOk());
428
429 EXPECT_THAT(cb->registrations, ElementsAre("asdfasdf"));
430 EXPECT_THAT(cb->binders, ElementsAre(service));
431}
432
433TEST(ServiceNotifications, GetMultipleNotification) {
434 auto sm = getPermissiveServiceManager();
435
Steven Morelandb0983182021-04-02 03:14:04 +0000436 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700437
438 sp<IBinder> binder1 = getBinder();
439 sp<IBinder> binder2 = getBinder();
440
441 EXPECT_TRUE(sm->registerForNotifications("asdfasdf", cb).isOk());
442 EXPECT_TRUE(sm->addService("asdfasdf", binder1,
443 false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
444 EXPECT_TRUE(sm->addService("asdfasdf", binder2,
445 false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
446
447 EXPECT_THAT(cb->registrations, ElementsAre("asdfasdf", "asdfasdf"));
448 EXPECT_THAT(cb->registrations, ElementsAre("asdfasdf", "asdfasdf"));
449}