blob: 95f459f7f06ef52eccf304cbd1f47065dd47d29a [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;
Alice Wang8578f132024-05-03 09:01:56 +000041using android::os::Service;
Steven Moreland80e1e6d2019-06-21 12:35:59 -070042using testing::_;
43using testing::ElementsAre;
44using testing::NiceMock;
45using testing::Return;
46
47static sp<IBinder> getBinder() {
Steven Moreland27cfab02019-08-12 14:34:16 -070048 class LinkableBinder : public BBinder {
49 android::status_t linkToDeath(const sp<DeathRecipient>&, void*, uint32_t) override {
50 // let SM linkToDeath
51 return android::OK;
52 }
53 };
54
Steven Morelandb0983182021-04-02 03:14:04 +000055 return sp<LinkableBinder>::make();
Steven Moreland80e1e6d2019-06-21 12:35:59 -070056}
57
58class MockAccess : public Access {
59public:
Steven Morelanda9fe4742019-07-18 14:45:20 -070060 MOCK_METHOD0(getCallingContext, CallingContext());
61 MOCK_METHOD2(canAdd, bool(const CallingContext&, const std::string& name));
62 MOCK_METHOD2(canFind, bool(const CallingContext&, const std::string& name));
Steven Moreland80e1e6d2019-06-21 12:35:59 -070063 MOCK_METHOD1(canList, bool(const CallingContext&));
64};
65
Jon Spivack0d844302019-07-22 18:40:34 -070066class MockServiceManager : public ServiceManager {
67 public:
68 MockServiceManager(std::unique_ptr<Access>&& access) : ServiceManager(std::move(access)) {}
Steven Morelandaa33e852023-05-10 16:42:15 +000069 MOCK_METHOD2(tryStartService, void(const Access::CallingContext&, const std::string& name));
Jon Spivack0d844302019-07-22 18:40:34 -070070};
71
Steven Moreland80e1e6d2019-06-21 12:35:59 -070072static sp<ServiceManager> getPermissiveServiceManager() {
73 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
74
Steven Morelanda9fe4742019-07-18 14:45:20 -070075 ON_CALL(*access, getCallingContext()).WillByDefault(Return(Access::CallingContext{}));
76 ON_CALL(*access, canAdd(_, _)).WillByDefault(Return(true));
77 ON_CALL(*access, canFind(_, _)).WillByDefault(Return(true));
Steven Moreland80e1e6d2019-06-21 12:35:59 -070078 ON_CALL(*access, canList(_)).WillByDefault(Return(true));
79
Steven Morelandb0983182021-04-02 03:14:04 +000080 sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
Steven Moreland80e1e6d2019-06-21 12:35:59 -070081 return sm;
82}
83
Jooyung Hande196982023-05-08 15:01:12 +090084// Determines if test device is a cuttlefish phone device
85static bool isCuttlefishPhone() {
86 auto device = GetProperty("ro.product.vendor.device", "");
87 auto product = GetProperty("ro.product.vendor.name", "");
88 return StartsWith(device, "vsoc_") && EndsWith(product, "_phone");
Jooyung Hance94b752022-11-14 18:55:06 +090089}
90
Steven Moreland80e1e6d2019-06-21 12:35:59 -070091TEST(AddService, HappyHappy) {
92 auto sm = getPermissiveServiceManager();
93 EXPECT_TRUE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
94 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
95}
96
97TEST(AddService, EmptyNameDisallowed) {
98 auto sm = getPermissiveServiceManager();
99 EXPECT_FALSE(sm->addService("", getBinder(), false /*allowIsolated*/,
100 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
101}
102
103TEST(AddService, JustShortEnoughServiceNameHappy) {
104 auto sm = getPermissiveServiceManager();
105 EXPECT_TRUE(sm->addService(std::string(127, 'a'), getBinder(), false /*allowIsolated*/,
106 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
107}
108
109TEST(AddService, TooLongNameDisallowed) {
110 auto sm = getPermissiveServiceManager();
111 EXPECT_FALSE(sm->addService(std::string(128, 'a'), getBinder(), false /*allowIsolated*/,
112 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
113}
114
Steven Moreland905e2e82019-07-17 11:05:45 -0700115TEST(AddService, WeirdCharactersDisallowed) {
116 auto sm = getPermissiveServiceManager();
117 EXPECT_FALSE(sm->addService("happy$foo$foo", getBinder(), false /*allowIsolated*/,
118 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
119}
120
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700121TEST(AddService, AddNullServiceDisallowed) {
122 auto sm = getPermissiveServiceManager();
123 EXPECT_FALSE(sm->addService("foo", nullptr, false /*allowIsolated*/,
124 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
125}
126
127TEST(AddService, AddDisallowedFromApp) {
128 for (uid_t uid : { AID_APP_START, AID_APP_START + 1, AID_APP_END }) {
129 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
Steven Morelanda9fe4742019-07-18 14:45:20 -0700130 EXPECT_CALL(*access, getCallingContext()).WillOnce(Return(Access::CallingContext{
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700131 .debugPid = 1337,
132 .uid = uid,
133 }));
Steven Morelanda9fe4742019-07-18 14:45:20 -0700134 EXPECT_CALL(*access, canAdd(_, _)).Times(0);
Steven Morelandb0983182021-04-02 03:14:04 +0000135 sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700136
137 EXPECT_FALSE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
138 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
139 }
140
141}
142
143TEST(AddService, HappyOverExistingService) {
144 auto sm = getPermissiveServiceManager();
145 EXPECT_TRUE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
146 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
147 EXPECT_TRUE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
148 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
149}
150
Devin Moore05ffe522020-08-06 13:58:29 -0700151TEST(AddService, OverwriteExistingService) {
152 auto sm = getPermissiveServiceManager();
153 sp<IBinder> serviceA = getBinder();
154 EXPECT_TRUE(sm->addService("foo", serviceA, false /*allowIsolated*/,
155 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
156
Alice Wang8578f132024-05-03 09:01:56 +0000157 Service outA;
Alice Wang11da1502024-07-25 12:03:22 +0000158 EXPECT_TRUE(sm->getService2("foo", &outA).isOk());
Alice Wang8578f132024-05-03 09:01:56 +0000159 EXPECT_EQ(serviceA, outA.get<Service::Tag::binder>());
Alice Wang11da1502024-07-25 12:03:22 +0000160 sp<IBinder> outBinderA;
161 EXPECT_TRUE(sm->getService("foo", &outBinderA).isOk());
162 EXPECT_EQ(serviceA, outBinderA);
Devin Moore05ffe522020-08-06 13:58:29 -0700163
164 // serviceA should be overwritten by serviceB
165 sp<IBinder> serviceB = getBinder();
166 EXPECT_TRUE(sm->addService("foo", serviceB, false /*allowIsolated*/,
167 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
168
Alice Wang8578f132024-05-03 09:01:56 +0000169 Service outB;
Alice Wang11da1502024-07-25 12:03:22 +0000170 EXPECT_TRUE(sm->getService2("foo", &outB).isOk());
Alice Wang8578f132024-05-03 09:01:56 +0000171 EXPECT_EQ(serviceB, outB.get<Service::Tag::binder>());
Alice Wang11da1502024-07-25 12:03:22 +0000172 sp<IBinder> outBinderB;
173 EXPECT_TRUE(sm->getService("foo", &outBinderB).isOk());
174 EXPECT_EQ(serviceB, outBinderB);
Devin Moore05ffe522020-08-06 13:58:29 -0700175}
176
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700177TEST(AddService, NoPermissions) {
178 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
179
Steven Morelanda9fe4742019-07-18 14:45:20 -0700180 EXPECT_CALL(*access, getCallingContext()).WillOnce(Return(Access::CallingContext{}));
181 EXPECT_CALL(*access, canAdd(_, _)).WillOnce(Return(false));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700182
Steven Morelandb0983182021-04-02 03:14:04 +0000183 sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700184
185 EXPECT_FALSE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
186 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
187}
188
189TEST(GetService, HappyHappy) {
190 auto sm = getPermissiveServiceManager();
Steven Moreland27cfab02019-08-12 14:34:16 -0700191 sp<IBinder> service = getBinder();
192
193 EXPECT_TRUE(sm->addService("foo", service, false /*allowIsolated*/,
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700194 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
195
Alice Wang8578f132024-05-03 09:01:56 +0000196 Service out;
Alice Wang11da1502024-07-25 12:03:22 +0000197 EXPECT_TRUE(sm->getService2("foo", &out).isOk());
Alice Wang8578f132024-05-03 09:01:56 +0000198 EXPECT_EQ(service, out.get<Service::Tag::binder>());
Alice Wang11da1502024-07-25 12:03:22 +0000199 sp<IBinder> outBinder;
200 EXPECT_TRUE(sm->getService("foo", &outBinder).isOk());
201 EXPECT_EQ(service, outBinder);
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700202}
203
204TEST(GetService, NonExistant) {
205 auto sm = getPermissiveServiceManager();
206
Alice Wang8578f132024-05-03 09:01:56 +0000207 Service out;
Alice Wang11da1502024-07-25 12:03:22 +0000208 EXPECT_TRUE(sm->getService2("foo", &out).isOk());
Alice Wang8578f132024-05-03 09:01:56 +0000209 EXPECT_EQ(nullptr, out.get<Service::Tag::binder>());
Alice Wang11da1502024-07-25 12:03:22 +0000210 sp<IBinder> outBinder;
211 EXPECT_TRUE(sm->getService("foo", &outBinder).isOk());
212 EXPECT_EQ(nullptr, outBinder);
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700213}
214
215TEST(GetService, NoPermissionsForGettingService) {
216 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
217
Steven Morelanda9fe4742019-07-18 14:45:20 -0700218 EXPECT_CALL(*access, getCallingContext()).WillRepeatedly(Return(Access::CallingContext{}));
219 EXPECT_CALL(*access, canAdd(_, _)).WillOnce(Return(true));
Alice Wang11da1502024-07-25 12:03:22 +0000220 EXPECT_CALL(*access, canFind(_, _)).WillRepeatedly(Return(false));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700221
Steven Morelandb0983182021-04-02 03:14:04 +0000222 sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700223
224 EXPECT_TRUE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
225 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
226
Alice Wang8578f132024-05-03 09:01:56 +0000227 Service out;
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700228 // returns nullptr but has OK status for legacy compatibility
Alice Wang11da1502024-07-25 12:03:22 +0000229 EXPECT_TRUE(sm->getService2("foo", &out).isOk());
Alice Wang8578f132024-05-03 09:01:56 +0000230 EXPECT_EQ(nullptr, out.get<Service::Tag::binder>());
Alice Wang11da1502024-07-25 12:03:22 +0000231 sp<IBinder> outBinder;
232 EXPECT_TRUE(sm->getService("foo", &outBinder).isOk());
233 EXPECT_EQ(nullptr, outBinder);
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700234}
235
236TEST(GetService, AllowedFromIsolated) {
237 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
238
Steven Morelanda9fe4742019-07-18 14:45:20 -0700239 EXPECT_CALL(*access, getCallingContext())
Alice Wang11da1502024-07-25 12:03:22 +0000240 // something adds it
241 .WillOnce(Return(Access::CallingContext{}))
242 // next calls is from isolated app
243 .WillOnce(Return(Access::CallingContext{
244 .uid = AID_ISOLATED_START,
245 }))
246 .WillOnce(Return(Access::CallingContext{
247 .uid = AID_ISOLATED_START,
248 }));
Steven Morelanda9fe4742019-07-18 14:45:20 -0700249 EXPECT_CALL(*access, canAdd(_, _)).WillOnce(Return(true));
Alice Wang11da1502024-07-25 12:03:22 +0000250 EXPECT_CALL(*access, canFind(_, _)).WillRepeatedly(Return(true));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700251
Steven Morelandb0983182021-04-02 03:14:04 +0000252 sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700253
Steven Moreland27cfab02019-08-12 14:34:16 -0700254 sp<IBinder> service = getBinder();
255 EXPECT_TRUE(sm->addService("foo", service, true /*allowIsolated*/,
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700256 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
257
Alice Wang8578f132024-05-03 09:01:56 +0000258 Service out;
Alice Wang11da1502024-07-25 12:03:22 +0000259 EXPECT_TRUE(sm->getService2("foo", &out).isOk());
Alice Wang8578f132024-05-03 09:01:56 +0000260 EXPECT_EQ(service, out.get<Service::Tag::binder>());
Alice Wang11da1502024-07-25 12:03:22 +0000261 sp<IBinder> outBinder;
262 EXPECT_TRUE(sm->getService("foo", &outBinder).isOk());
263 EXPECT_EQ(service, outBinder);
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700264}
265
266TEST(GetService, NotAllowedFromIsolated) {
267 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
268
Steven Morelanda9fe4742019-07-18 14:45:20 -0700269 EXPECT_CALL(*access, getCallingContext())
Alice Wang11da1502024-07-25 12:03:22 +0000270 // something adds it
271 .WillOnce(Return(Access::CallingContext{}))
272 // next calls is from isolated app
273 .WillOnce(Return(Access::CallingContext{
274 .uid = AID_ISOLATED_START,
275 }))
276 .WillOnce(Return(Access::CallingContext{
277 .uid = AID_ISOLATED_START,
278 }));
Steven Morelanda9fe4742019-07-18 14:45:20 -0700279 EXPECT_CALL(*access, canAdd(_, _)).WillOnce(Return(true));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700280
281 // TODO(b/136023468): when security check is first, this should be called first
Steven Morelanda9fe4742019-07-18 14:45:20 -0700282 // EXPECT_CALL(*access, canFind(_, _)).WillOnce(Return(true));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700283
Steven Morelandb0983182021-04-02 03:14:04 +0000284 sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700285
286 EXPECT_TRUE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
287 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
288
Alice Wang8578f132024-05-03 09:01:56 +0000289 Service out;
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700290 // returns nullptr but has OK status for legacy compatibility
Alice Wang11da1502024-07-25 12:03:22 +0000291 EXPECT_TRUE(sm->getService2("foo", &out).isOk());
Alice Wang8578f132024-05-03 09:01:56 +0000292 EXPECT_EQ(nullptr, out.get<Service::Tag::binder>());
Alice Wang11da1502024-07-25 12:03:22 +0000293 sp<IBinder> outBinder;
294 EXPECT_TRUE(sm->getService("foo", &outBinder).isOk());
295 EXPECT_EQ(nullptr, outBinder);
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700296}
297
298TEST(ListServices, NoPermissions) {
299 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
300
Steven Morelanda9fe4742019-07-18 14:45:20 -0700301 EXPECT_CALL(*access, getCallingContext()).WillOnce(Return(Access::CallingContext{}));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700302 EXPECT_CALL(*access, canList(_)).WillOnce(Return(false));
303
Steven Morelandb0983182021-04-02 03:14:04 +0000304 sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700305
306 std::vector<std::string> out;
307 EXPECT_FALSE(sm->listServices(IServiceManager::DUMP_FLAG_PRIORITY_ALL, &out).isOk());
308 EXPECT_TRUE(out.empty());
309}
310
311TEST(ListServices, AllServices) {
312 auto sm = getPermissiveServiceManager();
313
314 EXPECT_TRUE(sm->addService("sd", getBinder(), false /*allowIsolated*/,
315 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
316 EXPECT_TRUE(sm->addService("sc", getBinder(), false /*allowIsolated*/,
317 IServiceManager::DUMP_FLAG_PRIORITY_NORMAL).isOk());
318 EXPECT_TRUE(sm->addService("sb", getBinder(), false /*allowIsolated*/,
319 IServiceManager::DUMP_FLAG_PRIORITY_HIGH).isOk());
320 EXPECT_TRUE(sm->addService("sa", getBinder(), false /*allowIsolated*/,
321 IServiceManager::DUMP_FLAG_PRIORITY_CRITICAL).isOk());
322
323 std::vector<std::string> out;
324 EXPECT_TRUE(sm->listServices(IServiceManager::DUMP_FLAG_PRIORITY_ALL, &out).isOk());
325
326 // all there and in the right order
327 EXPECT_THAT(out, ElementsAre("sa", "sb", "sc", "sd"));
328}
329
330TEST(ListServices, CriticalServices) {
331 auto sm = getPermissiveServiceManager();
332
333 EXPECT_TRUE(sm->addService("sd", getBinder(), false /*allowIsolated*/,
334 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
335 EXPECT_TRUE(sm->addService("sc", getBinder(), false /*allowIsolated*/,
336 IServiceManager::DUMP_FLAG_PRIORITY_NORMAL).isOk());
337 EXPECT_TRUE(sm->addService("sb", getBinder(), false /*allowIsolated*/,
338 IServiceManager::DUMP_FLAG_PRIORITY_HIGH).isOk());
339 EXPECT_TRUE(sm->addService("sa", getBinder(), false /*allowIsolated*/,
340 IServiceManager::DUMP_FLAG_PRIORITY_CRITICAL).isOk());
341
342 std::vector<std::string> out;
343 EXPECT_TRUE(sm->listServices(IServiceManager::DUMP_FLAG_PRIORITY_CRITICAL, &out).isOk());
344
345 // all there and in the right order
346 EXPECT_THAT(out, ElementsAre("sa"));
347}
Steven Moreland27cfab02019-08-12 14:34:16 -0700348
Jooyung Hance94b752022-11-14 18:55:06 +0900349TEST(Vintf, UpdatableViaApex) {
Jooyung Hande196982023-05-08 15:01:12 +0900350 if (!isCuttlefishPhone()) GTEST_SKIP() << "Skipping non-Cuttlefish-phone devices";
Jooyung Hance94b752022-11-14 18:55:06 +0900351
352 auto sm = getPermissiveServiceManager();
353 std::optional<std::string> updatableViaApex;
354 EXPECT_TRUE(sm->updatableViaApex("android.hardware.camera.provider.ICameraProvider/internal/0",
355 &updatableViaApex)
356 .isOk());
357 EXPECT_EQ(std::make_optional<std::string>("com.google.emulated.camera.provider.hal"),
358 updatableViaApex);
359}
360
361TEST(Vintf, UpdatableViaApex_InvalidNameReturnsNullOpt) {
Jooyung Hande196982023-05-08 15:01:12 +0900362 if (!isCuttlefishPhone()) GTEST_SKIP() << "Skipping non-Cuttlefish-phone devices";
Jooyung Hance94b752022-11-14 18:55:06 +0900363
364 auto sm = getPermissiveServiceManager();
365 std::optional<std::string> updatableViaApex;
366 EXPECT_TRUE(sm->updatableViaApex("android.hardware.camera.provider.ICameraProvider",
367 &updatableViaApex)
368 .isOk()); // missing instance name
369 EXPECT_EQ(std::nullopt, updatableViaApex);
370}
371
372TEST(Vintf, GetUpdatableNames) {
Jooyung Hande196982023-05-08 15:01:12 +0900373 if (!isCuttlefishPhone()) GTEST_SKIP() << "Skipping non-Cuttlefish-phone devices";
Jooyung Hance94b752022-11-14 18:55:06 +0900374
375 auto sm = getPermissiveServiceManager();
376 std::vector<std::string> names;
377 EXPECT_TRUE(sm->getUpdatableNames("com.google.emulated.camera.provider.hal", &names).isOk());
378 EXPECT_EQ(std::vector<
379 std::string>{"android.hardware.camera.provider.ICameraProvider/internal/0"},
380 names);
381}
382
383TEST(Vintf, GetUpdatableNames_InvalidApexNameReturnsEmpty) {
Jooyung Hande196982023-05-08 15:01:12 +0900384 if (!isCuttlefishPhone()) GTEST_SKIP() << "Skipping non-Cuttlefish-phone devices";
Jooyung Hance94b752022-11-14 18:55:06 +0900385
386 auto sm = getPermissiveServiceManager();
387 std::vector<std::string> names;
388 EXPECT_TRUE(sm->getUpdatableNames("non.existing.apex.name", &names).isOk());
389 EXPECT_EQ(std::vector<std::string>{}, names);
390}
391
Jooyung Han205e2822023-12-19 16:59:39 +0900392TEST(Vintf, IsDeclared_native) {
393 if (!isCuttlefishPhone()) GTEST_SKIP() << "Skipping non-Cuttlefish-phone devices";
394
395 auto sm = getPermissiveServiceManager();
396 bool declared = false;
397 EXPECT_TRUE(sm->isDeclared("mapper/minigbm", &declared).isOk());
398 EXPECT_TRUE(declared);
399}
400
401TEST(Vintf, GetDeclaredInstances_native) {
402 if (!isCuttlefishPhone()) GTEST_SKIP() << "Skipping non-Cuttlefish-phone devices";
403
404 auto sm = getPermissiveServiceManager();
405 std::vector<std::string> instances;
406 EXPECT_TRUE(sm->getDeclaredInstances("mapper", &instances).isOk());
407 EXPECT_EQ(std::vector<std::string>{"minigbm"}, instances);
408}
409
Steven Moreland27cfab02019-08-12 14:34:16 -0700410class CallbackHistorian : public BnServiceCallback {
411 Status onRegistration(const std::string& name, const sp<IBinder>& binder) override {
412 registrations.push_back(name);
413 binders.push_back(binder);
414 return Status::ok();
415 }
416
417 android::status_t linkToDeath(const sp<DeathRecipient>&, void*, uint32_t) override {
418 // let SM linkToDeath
419 return android::OK;
420 }
421
422public:
423 std::vector<std::string> registrations;
424 std::vector<sp<IBinder>> binders;
425};
426
427TEST(ServiceNotifications, NoPermissionsRegister) {
428 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
429
430 EXPECT_CALL(*access, getCallingContext()).WillOnce(Return(Access::CallingContext{}));
431 EXPECT_CALL(*access, canFind(_,_)).WillOnce(Return(false));
432
Steven Morelandb0983182021-04-02 03:14:04 +0000433 sp<ServiceManager> sm = sp<ServiceManager>::make(std::move(access));
Steven Moreland27cfab02019-08-12 14:34:16 -0700434
Steven Morelandb0983182021-04-02 03:14:04 +0000435 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700436
Steven Morelandb9e1cbe2023-02-01 22:44:45 +0000437 EXPECT_EQ(sm->registerForNotifications("foofoo", cb).exceptionCode(), Status::EX_SECURITY);
438}
439
440TEST(GetService, IsolatedCantRegister) {
441 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
442
443 EXPECT_CALL(*access, getCallingContext())
444 .WillOnce(Return(Access::CallingContext{
445 .uid = AID_ISOLATED_START,
446 }));
447 EXPECT_CALL(*access, canFind(_, _)).WillOnce(Return(true));
448
449 sp<ServiceManager> sm = sp<ServiceManager>::make(std::move(access));
450
451 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
452
Steven Moreland27cfab02019-08-12 14:34:16 -0700453 EXPECT_EQ(sm->registerForNotifications("foofoo", cb).exceptionCode(),
454 Status::EX_SECURITY);
455}
456
457TEST(ServiceNotifications, NoPermissionsUnregister) {
458 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
459
460 EXPECT_CALL(*access, getCallingContext()).WillOnce(Return(Access::CallingContext{}));
461 EXPECT_CALL(*access, canFind(_,_)).WillOnce(Return(false));
462
Steven Morelandb0983182021-04-02 03:14:04 +0000463 sp<ServiceManager> sm = sp<ServiceManager>::make(std::move(access));
Steven Moreland27cfab02019-08-12 14:34:16 -0700464
Steven Morelandb0983182021-04-02 03:14:04 +0000465 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700466
467 // should always hit security error first
468 EXPECT_EQ(sm->unregisterForNotifications("foofoo", cb).exceptionCode(),
469 Status::EX_SECURITY);
470}
471
472TEST(ServiceNotifications, InvalidName) {
473 auto sm = getPermissiveServiceManager();
474
Steven Morelandb0983182021-04-02 03:14:04 +0000475 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700476
477 EXPECT_EQ(sm->registerForNotifications("foo@foo", cb).exceptionCode(),
478 Status::EX_ILLEGAL_ARGUMENT);
479}
480
481TEST(ServiceNotifications, NullCallback) {
482 auto sm = getPermissiveServiceManager();
483
484 EXPECT_EQ(sm->registerForNotifications("foofoo", nullptr).exceptionCode(),
485 Status::EX_NULL_POINTER);
486}
487
488TEST(ServiceNotifications, Unregister) {
489 auto sm = getPermissiveServiceManager();
490
Steven Morelandb0983182021-04-02 03:14:04 +0000491 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700492
493 EXPECT_TRUE(sm->registerForNotifications("foofoo", cb).isOk());
494 EXPECT_EQ(sm->unregisterForNotifications("foofoo", cb).exceptionCode(), 0);
495}
496
497TEST(ServiceNotifications, UnregisterWhenNoRegistrationExists) {
498 auto sm = getPermissiveServiceManager();
499
Steven Morelandb0983182021-04-02 03:14:04 +0000500 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700501
502 EXPECT_EQ(sm->unregisterForNotifications("foofoo", cb).exceptionCode(),
503 Status::EX_ILLEGAL_STATE);
504}
505
506TEST(ServiceNotifications, NoNotification) {
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 EXPECT_TRUE(sm->registerForNotifications("foofoo", cb).isOk());
512 EXPECT_TRUE(sm->addService("otherservice", getBinder(),
513 false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
514
515 EXPECT_THAT(cb->registrations, ElementsAre());
516 EXPECT_THAT(cb->binders, ElementsAre());
517}
518
519TEST(ServiceNotifications, GetNotification) {
520 auto sm = getPermissiveServiceManager();
521
Steven Morelandb0983182021-04-02 03:14:04 +0000522 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700523
524 sp<IBinder> service = getBinder();
525
526 EXPECT_TRUE(sm->registerForNotifications("asdfasdf", cb).isOk());
527 EXPECT_TRUE(sm->addService("asdfasdf", service,
528 false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
529
530 EXPECT_THAT(cb->registrations, ElementsAre("asdfasdf"));
531 EXPECT_THAT(cb->binders, ElementsAre(service));
532}
533
534TEST(ServiceNotifications, GetNotificationForAlreadyRegisteredService) {
535 auto sm = getPermissiveServiceManager();
536
Steven Morelandb0983182021-04-02 03:14:04 +0000537 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700538
539 sp<IBinder> service = getBinder();
540
541 EXPECT_TRUE(sm->addService("asdfasdf", service,
542 false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
543
544 EXPECT_TRUE(sm->registerForNotifications("asdfasdf", cb).isOk());
545
546 EXPECT_THAT(cb->registrations, ElementsAre("asdfasdf"));
547 EXPECT_THAT(cb->binders, ElementsAre(service));
548}
549
550TEST(ServiceNotifications, GetMultipleNotification) {
551 auto sm = getPermissiveServiceManager();
552
Steven Morelandb0983182021-04-02 03:14:04 +0000553 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700554
555 sp<IBinder> binder1 = getBinder();
556 sp<IBinder> binder2 = getBinder();
557
558 EXPECT_TRUE(sm->registerForNotifications("asdfasdf", cb).isOk());
559 EXPECT_TRUE(sm->addService("asdfasdf", binder1,
560 false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
561 EXPECT_TRUE(sm->addService("asdfasdf", binder2,
562 false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
563
564 EXPECT_THAT(cb->registrations, ElementsAre("asdfasdf", "asdfasdf"));
565 EXPECT_THAT(cb->registrations, ElementsAre("asdfasdf", "asdfasdf"));
566}