blob: b57505302cc82fe8944bae8e6701b874102cec20 [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
Jooyung Hance94b752022-11-14 18:55:06 +090017#include <android-base/properties.h>
18#include <android-base/strings.h>
Steven Moreland27cfab02019-08-12 14:34:16 -070019#include <android/os/BnServiceCallback.h>
20#include <binder/Binder.h>
Steven Moreland27cfab02019-08-12 14:34:16 -070021#include <binder/IServiceManager.h>
Jooyung Hance94b752022-11-14 18:55:06 +090022#include <binder/ProcessState.h>
Steven Moreland80e1e6d2019-06-21 12:35:59 -070023#include <cutils/android_filesystem_config.h>
Steven Moreland80e1e6d2019-06-21 12:35:59 -070024#include <gmock/gmock.h>
Jooyung Hance94b752022-11-14 18:55:06 +090025#include <gtest/gtest.h>
Steven Moreland80e1e6d2019-06-21 12:35:59 -070026
27#include "Access.h"
28#include "ServiceManager.h"
29
Steven Moreland80e1e6d2019-06-21 12:35:59 -070030using android::Access;
Steven Moreland27cfab02019-08-12 14:34:16 -070031using android::BBinder;
Steven Moreland80e1e6d2019-06-21 12:35:59 -070032using android::IBinder;
33using android::ServiceManager;
Jooyung Hande196982023-05-08 15:01:12 +090034using android::sp;
35using android::base::EndsWith;
36using android::base::GetProperty;
37using android::base::StartsWith;
Steven Moreland27cfab02019-08-12 14:34:16 -070038using android::binder::Status;
39using android::os::BnServiceCallback;
Steven Moreland80e1e6d2019-06-21 12:35:59 -070040using android::os::IServiceManager;
41using testing::_;
42using testing::ElementsAre;
43using testing::NiceMock;
44using testing::Return;
45
46static sp<IBinder> getBinder() {
Steven Moreland27cfab02019-08-12 14:34:16 -070047 class LinkableBinder : public BBinder {
48 android::status_t linkToDeath(const sp<DeathRecipient>&, void*, uint32_t) override {
49 // let SM linkToDeath
50 return android::OK;
51 }
52 };
53
Steven Morelandb0983182021-04-02 03:14:04 +000054 return sp<LinkableBinder>::make();
Steven Moreland80e1e6d2019-06-21 12:35:59 -070055}
56
57class MockAccess : public Access {
58public:
Steven Morelanda9fe4742019-07-18 14:45:20 -070059 MOCK_METHOD0(getCallingContext, CallingContext());
60 MOCK_METHOD2(canAdd, bool(const CallingContext&, const std::string& name));
61 MOCK_METHOD2(canFind, bool(const CallingContext&, const std::string& name));
Steven Moreland80e1e6d2019-06-21 12:35:59 -070062 MOCK_METHOD1(canList, bool(const CallingContext&));
63};
64
Jon Spivack0d844302019-07-22 18:40:34 -070065class MockServiceManager : public ServiceManager {
66 public:
67 MockServiceManager(std::unique_ptr<Access>&& access) : ServiceManager(std::move(access)) {}
Steven Morelandaa33e852023-05-10 16:42:15 +000068 MOCK_METHOD2(tryStartService, void(const Access::CallingContext&, const std::string& name));
Jon Spivack0d844302019-07-22 18:40:34 -070069};
70
Steven Moreland80e1e6d2019-06-21 12:35:59 -070071static sp<ServiceManager> getPermissiveServiceManager() {
72 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
73
Steven Morelanda9fe4742019-07-18 14:45:20 -070074 ON_CALL(*access, getCallingContext()).WillByDefault(Return(Access::CallingContext{}));
75 ON_CALL(*access, canAdd(_, _)).WillByDefault(Return(true));
76 ON_CALL(*access, canFind(_, _)).WillByDefault(Return(true));
Steven Moreland80e1e6d2019-06-21 12:35:59 -070077 ON_CALL(*access, canList(_)).WillByDefault(Return(true));
78
Steven Morelandb0983182021-04-02 03:14:04 +000079 sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
Steven Moreland80e1e6d2019-06-21 12:35:59 -070080 return sm;
81}
82
Jooyung Hande196982023-05-08 15:01:12 +090083// Determines if test device is a cuttlefish phone device
84static bool isCuttlefishPhone() {
85 auto device = GetProperty("ro.product.vendor.device", "");
86 auto product = GetProperty("ro.product.vendor.name", "");
87 return StartsWith(device, "vsoc_") && EndsWith(product, "_phone");
Jooyung Hance94b752022-11-14 18:55:06 +090088}
89
Steven Moreland80e1e6d2019-06-21 12:35:59 -070090TEST(AddService, HappyHappy) {
91 auto sm = getPermissiveServiceManager();
92 EXPECT_TRUE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
93 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
94}
95
96TEST(AddService, EmptyNameDisallowed) {
97 auto sm = getPermissiveServiceManager();
98 EXPECT_FALSE(sm->addService("", getBinder(), false /*allowIsolated*/,
99 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
100}
101
102TEST(AddService, JustShortEnoughServiceNameHappy) {
103 auto sm = getPermissiveServiceManager();
104 EXPECT_TRUE(sm->addService(std::string(127, 'a'), getBinder(), false /*allowIsolated*/,
105 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
106}
107
108TEST(AddService, TooLongNameDisallowed) {
109 auto sm = getPermissiveServiceManager();
110 EXPECT_FALSE(sm->addService(std::string(128, 'a'), getBinder(), false /*allowIsolated*/,
111 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
112}
113
Steven Moreland905e2e82019-07-17 11:05:45 -0700114TEST(AddService, WeirdCharactersDisallowed) {
115 auto sm = getPermissiveServiceManager();
116 EXPECT_FALSE(sm->addService("happy$foo$foo", getBinder(), false /*allowIsolated*/,
117 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
118}
119
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700120TEST(AddService, AddNullServiceDisallowed) {
121 auto sm = getPermissiveServiceManager();
122 EXPECT_FALSE(sm->addService("foo", nullptr, false /*allowIsolated*/,
123 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
124}
125
126TEST(AddService, AddDisallowedFromApp) {
127 for (uid_t uid : { AID_APP_START, AID_APP_START + 1, AID_APP_END }) {
128 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
Steven Morelanda9fe4742019-07-18 14:45:20 -0700129 EXPECT_CALL(*access, getCallingContext()).WillOnce(Return(Access::CallingContext{
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700130 .debugPid = 1337,
131 .uid = uid,
132 }));
Steven Morelanda9fe4742019-07-18 14:45:20 -0700133 EXPECT_CALL(*access, canAdd(_, _)).Times(0);
Steven Morelandb0983182021-04-02 03:14:04 +0000134 sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700135
136 EXPECT_FALSE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
137 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
138 }
139
140}
141
142TEST(AddService, HappyOverExistingService) {
143 auto sm = getPermissiveServiceManager();
144 EXPECT_TRUE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
145 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
146 EXPECT_TRUE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
147 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
148}
149
Devin Moore05ffe522020-08-06 13:58:29 -0700150TEST(AddService, OverwriteExistingService) {
151 auto sm = getPermissiveServiceManager();
152 sp<IBinder> serviceA = getBinder();
153 EXPECT_TRUE(sm->addService("foo", serviceA, false /*allowIsolated*/,
154 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
155
156 sp<IBinder> outA;
157 EXPECT_TRUE(sm->getService("foo", &outA).isOk());
158 EXPECT_EQ(serviceA, outA);
159
160 // serviceA should be overwritten by serviceB
161 sp<IBinder> serviceB = getBinder();
162 EXPECT_TRUE(sm->addService("foo", serviceB, false /*allowIsolated*/,
163 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
164
165 sp<IBinder> outB;
166 EXPECT_TRUE(sm->getService("foo", &outB).isOk());
167 EXPECT_EQ(serviceB, outB);
168}
169
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700170TEST(AddService, NoPermissions) {
171 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
172
Steven Morelanda9fe4742019-07-18 14:45:20 -0700173 EXPECT_CALL(*access, getCallingContext()).WillOnce(Return(Access::CallingContext{}));
174 EXPECT_CALL(*access, canAdd(_, _)).WillOnce(Return(false));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700175
Steven Morelandb0983182021-04-02 03:14:04 +0000176 sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700177
178 EXPECT_FALSE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
179 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
180}
181
182TEST(GetService, HappyHappy) {
183 auto sm = getPermissiveServiceManager();
Steven Moreland27cfab02019-08-12 14:34:16 -0700184 sp<IBinder> service = getBinder();
185
186 EXPECT_TRUE(sm->addService("foo", service, false /*allowIsolated*/,
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700187 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
188
189 sp<IBinder> out;
190 EXPECT_TRUE(sm->getService("foo", &out).isOk());
Steven Moreland27cfab02019-08-12 14:34:16 -0700191 EXPECT_EQ(service, out);
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700192}
193
194TEST(GetService, NonExistant) {
195 auto sm = getPermissiveServiceManager();
196
197 sp<IBinder> out;
198 EXPECT_TRUE(sm->getService("foo", &out).isOk());
199 EXPECT_EQ(nullptr, out.get());
200}
201
202TEST(GetService, NoPermissionsForGettingService) {
203 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
204
Steven Morelanda9fe4742019-07-18 14:45:20 -0700205 EXPECT_CALL(*access, getCallingContext()).WillRepeatedly(Return(Access::CallingContext{}));
206 EXPECT_CALL(*access, canAdd(_, _)).WillOnce(Return(true));
207 EXPECT_CALL(*access, canFind(_, _)).WillOnce(Return(false));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700208
Steven Morelandb0983182021-04-02 03:14:04 +0000209 sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700210
211 EXPECT_TRUE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
212 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
213
214 sp<IBinder> out;
215 // returns nullptr but has OK status for legacy compatibility
216 EXPECT_TRUE(sm->getService("foo", &out).isOk());
217 EXPECT_EQ(nullptr, out.get());
218}
219
220TEST(GetService, AllowedFromIsolated) {
221 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
222
Steven Morelanda9fe4742019-07-18 14:45:20 -0700223 EXPECT_CALL(*access, getCallingContext())
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700224 // something adds it
225 .WillOnce(Return(Access::CallingContext{}))
226 // next call is from isolated app
227 .WillOnce(Return(Access::CallingContext{
228 .uid = AID_ISOLATED_START,
229 }));
Steven Morelanda9fe4742019-07-18 14:45:20 -0700230 EXPECT_CALL(*access, canAdd(_, _)).WillOnce(Return(true));
231 EXPECT_CALL(*access, canFind(_, _)).WillOnce(Return(true));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700232
Steven Morelandb0983182021-04-02 03:14:04 +0000233 sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700234
Steven Moreland27cfab02019-08-12 14:34:16 -0700235 sp<IBinder> service = getBinder();
236 EXPECT_TRUE(sm->addService("foo", service, true /*allowIsolated*/,
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700237 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
238
239 sp<IBinder> out;
240 EXPECT_TRUE(sm->getService("foo", &out).isOk());
Steven Moreland27cfab02019-08-12 14:34:16 -0700241 EXPECT_EQ(service, out.get());
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700242}
243
244TEST(GetService, NotAllowedFromIsolated) {
245 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
246
Steven Morelanda9fe4742019-07-18 14:45:20 -0700247 EXPECT_CALL(*access, getCallingContext())
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700248 // something adds it
249 .WillOnce(Return(Access::CallingContext{}))
250 // next call is from isolated app
251 .WillOnce(Return(Access::CallingContext{
252 .uid = AID_ISOLATED_START,
253 }));
Steven Morelanda9fe4742019-07-18 14:45:20 -0700254 EXPECT_CALL(*access, canAdd(_, _)).WillOnce(Return(true));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700255
256 // TODO(b/136023468): when security check is first, this should be called first
Steven Morelanda9fe4742019-07-18 14:45:20 -0700257 // EXPECT_CALL(*access, canFind(_, _)).WillOnce(Return(true));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700258
Steven Morelandb0983182021-04-02 03:14:04 +0000259 sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700260
261 EXPECT_TRUE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
262 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
263
264 sp<IBinder> out;
265 // returns nullptr but has OK status for legacy compatibility
266 EXPECT_TRUE(sm->getService("foo", &out).isOk());
267 EXPECT_EQ(nullptr, out.get());
268}
269
270TEST(ListServices, NoPermissions) {
271 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
272
Steven Morelanda9fe4742019-07-18 14:45:20 -0700273 EXPECT_CALL(*access, getCallingContext()).WillOnce(Return(Access::CallingContext{}));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700274 EXPECT_CALL(*access, canList(_)).WillOnce(Return(false));
275
Steven Morelandb0983182021-04-02 03:14:04 +0000276 sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700277
278 std::vector<std::string> out;
279 EXPECT_FALSE(sm->listServices(IServiceManager::DUMP_FLAG_PRIORITY_ALL, &out).isOk());
280 EXPECT_TRUE(out.empty());
281}
282
283TEST(ListServices, AllServices) {
284 auto sm = getPermissiveServiceManager();
285
286 EXPECT_TRUE(sm->addService("sd", getBinder(), false /*allowIsolated*/,
287 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
288 EXPECT_TRUE(sm->addService("sc", getBinder(), false /*allowIsolated*/,
289 IServiceManager::DUMP_FLAG_PRIORITY_NORMAL).isOk());
290 EXPECT_TRUE(sm->addService("sb", getBinder(), false /*allowIsolated*/,
291 IServiceManager::DUMP_FLAG_PRIORITY_HIGH).isOk());
292 EXPECT_TRUE(sm->addService("sa", getBinder(), false /*allowIsolated*/,
293 IServiceManager::DUMP_FLAG_PRIORITY_CRITICAL).isOk());
294
295 std::vector<std::string> out;
296 EXPECT_TRUE(sm->listServices(IServiceManager::DUMP_FLAG_PRIORITY_ALL, &out).isOk());
297
298 // all there and in the right order
299 EXPECT_THAT(out, ElementsAre("sa", "sb", "sc", "sd"));
300}
301
302TEST(ListServices, CriticalServices) {
303 auto sm = getPermissiveServiceManager();
304
305 EXPECT_TRUE(sm->addService("sd", getBinder(), false /*allowIsolated*/,
306 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
307 EXPECT_TRUE(sm->addService("sc", getBinder(), false /*allowIsolated*/,
308 IServiceManager::DUMP_FLAG_PRIORITY_NORMAL).isOk());
309 EXPECT_TRUE(sm->addService("sb", getBinder(), false /*allowIsolated*/,
310 IServiceManager::DUMP_FLAG_PRIORITY_HIGH).isOk());
311 EXPECT_TRUE(sm->addService("sa", getBinder(), false /*allowIsolated*/,
312 IServiceManager::DUMP_FLAG_PRIORITY_CRITICAL).isOk());
313
314 std::vector<std::string> out;
315 EXPECT_TRUE(sm->listServices(IServiceManager::DUMP_FLAG_PRIORITY_CRITICAL, &out).isOk());
316
317 // all there and in the right order
318 EXPECT_THAT(out, ElementsAre("sa"));
319}
Steven Moreland27cfab02019-08-12 14:34:16 -0700320
Jooyung Hance94b752022-11-14 18:55:06 +0900321TEST(Vintf, UpdatableViaApex) {
Jooyung Hande196982023-05-08 15:01:12 +0900322 if (!isCuttlefishPhone()) GTEST_SKIP() << "Skipping non-Cuttlefish-phone devices";
Jooyung Hance94b752022-11-14 18:55:06 +0900323
324 auto sm = getPermissiveServiceManager();
325 std::optional<std::string> updatableViaApex;
326 EXPECT_TRUE(sm->updatableViaApex("android.hardware.camera.provider.ICameraProvider/internal/0",
327 &updatableViaApex)
328 .isOk());
329 EXPECT_EQ(std::make_optional<std::string>("com.google.emulated.camera.provider.hal"),
330 updatableViaApex);
331}
332
333TEST(Vintf, UpdatableViaApex_InvalidNameReturnsNullOpt) {
Jooyung Hande196982023-05-08 15:01:12 +0900334 if (!isCuttlefishPhone()) GTEST_SKIP() << "Skipping non-Cuttlefish-phone devices";
Jooyung Hance94b752022-11-14 18:55:06 +0900335
336 auto sm = getPermissiveServiceManager();
337 std::optional<std::string> updatableViaApex;
338 EXPECT_TRUE(sm->updatableViaApex("android.hardware.camera.provider.ICameraProvider",
339 &updatableViaApex)
340 .isOk()); // missing instance name
341 EXPECT_EQ(std::nullopt, updatableViaApex);
342}
343
344TEST(Vintf, GetUpdatableNames) {
Jooyung Hande196982023-05-08 15:01:12 +0900345 if (!isCuttlefishPhone()) GTEST_SKIP() << "Skipping non-Cuttlefish-phone devices";
Jooyung Hance94b752022-11-14 18:55:06 +0900346
347 auto sm = getPermissiveServiceManager();
348 std::vector<std::string> names;
349 EXPECT_TRUE(sm->getUpdatableNames("com.google.emulated.camera.provider.hal", &names).isOk());
350 EXPECT_EQ(std::vector<
351 std::string>{"android.hardware.camera.provider.ICameraProvider/internal/0"},
352 names);
353}
354
355TEST(Vintf, GetUpdatableNames_InvalidApexNameReturnsEmpty) {
Jooyung Hande196982023-05-08 15:01:12 +0900356 if (!isCuttlefishPhone()) GTEST_SKIP() << "Skipping non-Cuttlefish-phone devices";
Jooyung Hance94b752022-11-14 18:55:06 +0900357
358 auto sm = getPermissiveServiceManager();
359 std::vector<std::string> names;
360 EXPECT_TRUE(sm->getUpdatableNames("non.existing.apex.name", &names).isOk());
361 EXPECT_EQ(std::vector<std::string>{}, names);
362}
363
Jooyung Han205e2822023-12-19 16:59:39 +0900364TEST(Vintf, IsDeclared_native) {
365 if (!isCuttlefishPhone()) GTEST_SKIP() << "Skipping non-Cuttlefish-phone devices";
366
367 auto sm = getPermissiveServiceManager();
368 bool declared = false;
369 EXPECT_TRUE(sm->isDeclared("mapper/minigbm", &declared).isOk());
370 EXPECT_TRUE(declared);
371}
372
373TEST(Vintf, GetDeclaredInstances_native) {
374 if (!isCuttlefishPhone()) GTEST_SKIP() << "Skipping non-Cuttlefish-phone devices";
375
376 auto sm = getPermissiveServiceManager();
377 std::vector<std::string> instances;
378 EXPECT_TRUE(sm->getDeclaredInstances("mapper", &instances).isOk());
379 EXPECT_EQ(std::vector<std::string>{"minigbm"}, instances);
380}
381
Steven Moreland27cfab02019-08-12 14:34:16 -0700382class CallbackHistorian : public BnServiceCallback {
383 Status onRegistration(const std::string& name, const sp<IBinder>& binder) override {
384 registrations.push_back(name);
385 binders.push_back(binder);
386 return Status::ok();
387 }
388
389 android::status_t linkToDeath(const sp<DeathRecipient>&, void*, uint32_t) override {
390 // let SM linkToDeath
391 return android::OK;
392 }
393
394public:
395 std::vector<std::string> registrations;
396 std::vector<sp<IBinder>> binders;
397};
398
399TEST(ServiceNotifications, NoPermissionsRegister) {
400 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
401
402 EXPECT_CALL(*access, getCallingContext()).WillOnce(Return(Access::CallingContext{}));
403 EXPECT_CALL(*access, canFind(_,_)).WillOnce(Return(false));
404
Steven Morelandb0983182021-04-02 03:14:04 +0000405 sp<ServiceManager> sm = sp<ServiceManager>::make(std::move(access));
Steven Moreland27cfab02019-08-12 14:34:16 -0700406
Steven Morelandb0983182021-04-02 03:14:04 +0000407 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700408
Steven Morelandb9e1cbe2023-02-01 22:44:45 +0000409 EXPECT_EQ(sm->registerForNotifications("foofoo", cb).exceptionCode(), Status::EX_SECURITY);
410}
411
412TEST(GetService, IsolatedCantRegister) {
413 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
414
415 EXPECT_CALL(*access, getCallingContext())
416 .WillOnce(Return(Access::CallingContext{
417 .uid = AID_ISOLATED_START,
418 }));
419 EXPECT_CALL(*access, canFind(_, _)).WillOnce(Return(true));
420
421 sp<ServiceManager> sm = sp<ServiceManager>::make(std::move(access));
422
423 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
424
Steven Moreland27cfab02019-08-12 14:34:16 -0700425 EXPECT_EQ(sm->registerForNotifications("foofoo", cb).exceptionCode(),
426 Status::EX_SECURITY);
427}
428
429TEST(ServiceNotifications, NoPermissionsUnregister) {
430 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
431
432 EXPECT_CALL(*access, getCallingContext()).WillOnce(Return(Access::CallingContext{}));
433 EXPECT_CALL(*access, canFind(_,_)).WillOnce(Return(false));
434
Steven Morelandb0983182021-04-02 03:14:04 +0000435 sp<ServiceManager> sm = sp<ServiceManager>::make(std::move(access));
Steven Moreland27cfab02019-08-12 14:34:16 -0700436
Steven Morelandb0983182021-04-02 03:14:04 +0000437 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700438
439 // should always hit security error first
440 EXPECT_EQ(sm->unregisterForNotifications("foofoo", cb).exceptionCode(),
441 Status::EX_SECURITY);
442}
443
444TEST(ServiceNotifications, InvalidName) {
445 auto sm = getPermissiveServiceManager();
446
Steven Morelandb0983182021-04-02 03:14:04 +0000447 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700448
449 EXPECT_EQ(sm->registerForNotifications("foo@foo", cb).exceptionCode(),
450 Status::EX_ILLEGAL_ARGUMENT);
451}
452
453TEST(ServiceNotifications, NullCallback) {
454 auto sm = getPermissiveServiceManager();
455
456 EXPECT_EQ(sm->registerForNotifications("foofoo", nullptr).exceptionCode(),
457 Status::EX_NULL_POINTER);
458}
459
460TEST(ServiceNotifications, Unregister) {
461 auto sm = getPermissiveServiceManager();
462
Steven Morelandb0983182021-04-02 03:14:04 +0000463 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700464
465 EXPECT_TRUE(sm->registerForNotifications("foofoo", cb).isOk());
466 EXPECT_EQ(sm->unregisterForNotifications("foofoo", cb).exceptionCode(), 0);
467}
468
469TEST(ServiceNotifications, UnregisterWhenNoRegistrationExists) {
470 auto sm = getPermissiveServiceManager();
471
Steven Morelandb0983182021-04-02 03:14:04 +0000472 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700473
474 EXPECT_EQ(sm->unregisterForNotifications("foofoo", cb).exceptionCode(),
475 Status::EX_ILLEGAL_STATE);
476}
477
478TEST(ServiceNotifications, NoNotification) {
479 auto sm = getPermissiveServiceManager();
480
Steven Morelandb0983182021-04-02 03:14:04 +0000481 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700482
483 EXPECT_TRUE(sm->registerForNotifications("foofoo", cb).isOk());
484 EXPECT_TRUE(sm->addService("otherservice", getBinder(),
485 false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
486
487 EXPECT_THAT(cb->registrations, ElementsAre());
488 EXPECT_THAT(cb->binders, ElementsAre());
489}
490
491TEST(ServiceNotifications, GetNotification) {
492 auto sm = getPermissiveServiceManager();
493
Steven Morelandb0983182021-04-02 03:14:04 +0000494 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700495
496 sp<IBinder> service = getBinder();
497
498 EXPECT_TRUE(sm->registerForNotifications("asdfasdf", cb).isOk());
499 EXPECT_TRUE(sm->addService("asdfasdf", service,
500 false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
501
502 EXPECT_THAT(cb->registrations, ElementsAre("asdfasdf"));
503 EXPECT_THAT(cb->binders, ElementsAre(service));
504}
505
506TEST(ServiceNotifications, GetNotificationForAlreadyRegisteredService) {
507 auto sm = getPermissiveServiceManager();
508
Steven Morelandb0983182021-04-02 03:14:04 +0000509 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700510
511 sp<IBinder> service = getBinder();
512
513 EXPECT_TRUE(sm->addService("asdfasdf", service,
514 false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
515
516 EXPECT_TRUE(sm->registerForNotifications("asdfasdf", cb).isOk());
517
518 EXPECT_THAT(cb->registrations, ElementsAre("asdfasdf"));
519 EXPECT_THAT(cb->binders, ElementsAre(service));
520}
521
522TEST(ServiceNotifications, GetMultipleNotification) {
523 auto sm = getPermissiveServiceManager();
524
Steven Morelandb0983182021-04-02 03:14:04 +0000525 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700526
527 sp<IBinder> binder1 = getBinder();
528 sp<IBinder> binder2 = getBinder();
529
530 EXPECT_TRUE(sm->registerForNotifications("asdfasdf", cb).isOk());
531 EXPECT_TRUE(sm->addService("asdfasdf", binder1,
532 false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
533 EXPECT_TRUE(sm->addService("asdfasdf", binder2,
534 false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
535
536 EXPECT_THAT(cb->registrations, ElementsAre("asdfasdf", "asdfasdf"));
537 EXPECT_THAT(cb->registrations, ElementsAre("asdfasdf", "asdfasdf"));
538}