blob: e620770e18d203a13108053c0cfffdc95b1d3bb4 [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());
Parth Sane5e1b7e12024-11-29 10:40:41 +000095
96 EXPECT_TRUE(sm->addService("lazyfoo", getBinder(), false /*allowIsolated*/,
97 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT |
98 IServiceManager::FLAG_IS_LAZY_SERVICE)
99 .isOk());
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700100}
101
102TEST(AddService, EmptyNameDisallowed) {
103 auto sm = getPermissiveServiceManager();
104 EXPECT_FALSE(sm->addService("", getBinder(), false /*allowIsolated*/,
105 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
106}
107
108TEST(AddService, JustShortEnoughServiceNameHappy) {
109 auto sm = getPermissiveServiceManager();
110 EXPECT_TRUE(sm->addService(std::string(127, 'a'), getBinder(), false /*allowIsolated*/,
111 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
112}
113
114TEST(AddService, TooLongNameDisallowed) {
115 auto sm = getPermissiveServiceManager();
116 EXPECT_FALSE(sm->addService(std::string(128, 'a'), getBinder(), false /*allowIsolated*/,
117 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
118}
119
Steven Moreland905e2e82019-07-17 11:05:45 -0700120TEST(AddService, WeirdCharactersDisallowed) {
121 auto sm = getPermissiveServiceManager();
122 EXPECT_FALSE(sm->addService("happy$foo$foo", getBinder(), false /*allowIsolated*/,
123 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
124}
125
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700126TEST(AddService, AddNullServiceDisallowed) {
127 auto sm = getPermissiveServiceManager();
128 EXPECT_FALSE(sm->addService("foo", nullptr, false /*allowIsolated*/,
129 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
130}
131
132TEST(AddService, AddDisallowedFromApp) {
133 for (uid_t uid : { AID_APP_START, AID_APP_START + 1, AID_APP_END }) {
134 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
Steven Morelanda9fe4742019-07-18 14:45:20 -0700135 EXPECT_CALL(*access, getCallingContext()).WillOnce(Return(Access::CallingContext{
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700136 .debugPid = 1337,
137 .uid = uid,
138 }));
Steven Morelanda9fe4742019-07-18 14:45:20 -0700139 EXPECT_CALL(*access, canAdd(_, _)).Times(0);
Steven Morelandb0983182021-04-02 03:14:04 +0000140 sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700141
142 EXPECT_FALSE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
143 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
144 }
145
146}
147
148TEST(AddService, HappyOverExistingService) {
149 auto sm = getPermissiveServiceManager();
150 EXPECT_TRUE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
151 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
152 EXPECT_TRUE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
153 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
154}
155
Devin Moore05ffe522020-08-06 13:58:29 -0700156TEST(AddService, OverwriteExistingService) {
157 auto sm = getPermissiveServiceManager();
158 sp<IBinder> serviceA = getBinder();
159 EXPECT_TRUE(sm->addService("foo", serviceA, false /*allowIsolated*/,
160 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
161
Alice Wang8578f132024-05-03 09:01:56 +0000162 Service outA;
Alice Wang11da1502024-07-25 12:03:22 +0000163 EXPECT_TRUE(sm->getService2("foo", &outA).isOk());
Parth Sane5e1b7e12024-11-29 10:40:41 +0000164 EXPECT_EQ(serviceA, outA.get<Service::Tag::serviceWithMetadata>().service);
Alice Wang11da1502024-07-25 12:03:22 +0000165 sp<IBinder> outBinderA;
166 EXPECT_TRUE(sm->getService("foo", &outBinderA).isOk());
167 EXPECT_EQ(serviceA, outBinderA);
Devin Moore05ffe522020-08-06 13:58:29 -0700168
169 // serviceA should be overwritten by serviceB
170 sp<IBinder> serviceB = getBinder();
171 EXPECT_TRUE(sm->addService("foo", serviceB, false /*allowIsolated*/,
172 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
173
Alice Wang8578f132024-05-03 09:01:56 +0000174 Service outB;
Alice Wang11da1502024-07-25 12:03:22 +0000175 EXPECT_TRUE(sm->getService2("foo", &outB).isOk());
Parth Sane5e1b7e12024-11-29 10:40:41 +0000176 EXPECT_EQ(serviceB, outB.get<Service::Tag::serviceWithMetadata>().service);
Alice Wang11da1502024-07-25 12:03:22 +0000177 sp<IBinder> outBinderB;
178 EXPECT_TRUE(sm->getService("foo", &outBinderB).isOk());
179 EXPECT_EQ(serviceB, outBinderB);
Devin Moore05ffe522020-08-06 13:58:29 -0700180}
181
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700182TEST(AddService, NoPermissions) {
183 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
184
Steven Morelanda9fe4742019-07-18 14:45:20 -0700185 EXPECT_CALL(*access, getCallingContext()).WillOnce(Return(Access::CallingContext{}));
186 EXPECT_CALL(*access, canAdd(_, _)).WillOnce(Return(false));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700187
Steven Morelandb0983182021-04-02 03:14:04 +0000188 sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700189
190 EXPECT_FALSE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
191 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
192}
193
194TEST(GetService, HappyHappy) {
195 auto sm = getPermissiveServiceManager();
Steven Moreland27cfab02019-08-12 14:34:16 -0700196 sp<IBinder> service = getBinder();
197
198 EXPECT_TRUE(sm->addService("foo", service, false /*allowIsolated*/,
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700199 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
200
Alice Wang8578f132024-05-03 09:01:56 +0000201 Service out;
Alice Wang11da1502024-07-25 12:03:22 +0000202 EXPECT_TRUE(sm->getService2("foo", &out).isOk());
Parth Sane5e1b7e12024-11-29 10:40:41 +0000203 EXPECT_EQ(service, out.get<Service::Tag::serviceWithMetadata>().service);
Alice Wang11da1502024-07-25 12:03:22 +0000204 sp<IBinder> outBinder;
205 EXPECT_TRUE(sm->getService("foo", &outBinder).isOk());
206 EXPECT_EQ(service, outBinder);
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700207}
208
209TEST(GetService, NonExistant) {
210 auto sm = getPermissiveServiceManager();
211
Alice Wang8578f132024-05-03 09:01:56 +0000212 Service out;
Alice Wang11da1502024-07-25 12:03:22 +0000213 EXPECT_TRUE(sm->getService2("foo", &out).isOk());
Parth Sane5e1b7e12024-11-29 10:40:41 +0000214 EXPECT_EQ(nullptr, out.get<Service::Tag::serviceWithMetadata>().service);
Alice Wang11da1502024-07-25 12:03:22 +0000215 sp<IBinder> outBinder;
216 EXPECT_TRUE(sm->getService("foo", &outBinder).isOk());
217 EXPECT_EQ(nullptr, outBinder);
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700218}
219
220TEST(GetService, NoPermissionsForGettingService) {
221 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
222
Steven Morelanda9fe4742019-07-18 14:45:20 -0700223 EXPECT_CALL(*access, getCallingContext()).WillRepeatedly(Return(Access::CallingContext{}));
224 EXPECT_CALL(*access, canAdd(_, _)).WillOnce(Return(true));
Alice Wang11da1502024-07-25 12:03:22 +0000225 EXPECT_CALL(*access, canFind(_, _)).WillRepeatedly(Return(false));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700226
Steven Morelandb0983182021-04-02 03:14:04 +0000227 sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700228
229 EXPECT_TRUE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
230 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
231
Alice Wang8578f132024-05-03 09:01:56 +0000232 Service out;
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700233 // returns nullptr but has OK status for legacy compatibility
Alice Wang11da1502024-07-25 12:03:22 +0000234 EXPECT_TRUE(sm->getService2("foo", &out).isOk());
Parth Sane5e1b7e12024-11-29 10:40:41 +0000235 EXPECT_EQ(nullptr, out.get<Service::Tag::serviceWithMetadata>().service);
Alice Wang11da1502024-07-25 12:03:22 +0000236 sp<IBinder> outBinder;
237 EXPECT_TRUE(sm->getService("foo", &outBinder).isOk());
238 EXPECT_EQ(nullptr, outBinder);
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700239}
240
241TEST(GetService, AllowedFromIsolated) {
242 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
243
Steven Morelanda9fe4742019-07-18 14:45:20 -0700244 EXPECT_CALL(*access, getCallingContext())
Alice Wang11da1502024-07-25 12:03:22 +0000245 // something adds it
246 .WillOnce(Return(Access::CallingContext{}))
247 // next calls is from isolated app
248 .WillOnce(Return(Access::CallingContext{
249 .uid = AID_ISOLATED_START,
250 }))
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));
Alice Wang11da1502024-07-25 12:03:22 +0000255 EXPECT_CALL(*access, canFind(_, _)).WillRepeatedly(Return(true));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700256
Steven Morelandb0983182021-04-02 03:14:04 +0000257 sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700258
Steven Moreland27cfab02019-08-12 14:34:16 -0700259 sp<IBinder> service = getBinder();
260 EXPECT_TRUE(sm->addService("foo", service, true /*allowIsolated*/,
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700261 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
262
Alice Wang8578f132024-05-03 09:01:56 +0000263 Service out;
Alice Wang11da1502024-07-25 12:03:22 +0000264 EXPECT_TRUE(sm->getService2("foo", &out).isOk());
Parth Sane5e1b7e12024-11-29 10:40:41 +0000265 EXPECT_EQ(service, out.get<Service::Tag::serviceWithMetadata>().service);
Alice Wang11da1502024-07-25 12:03:22 +0000266 sp<IBinder> outBinder;
267 EXPECT_TRUE(sm->getService("foo", &outBinder).isOk());
268 EXPECT_EQ(service, outBinder);
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700269}
270
271TEST(GetService, NotAllowedFromIsolated) {
272 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
273
Steven Morelanda9fe4742019-07-18 14:45:20 -0700274 EXPECT_CALL(*access, getCallingContext())
Alice Wang11da1502024-07-25 12:03:22 +0000275 // something adds it
276 .WillOnce(Return(Access::CallingContext{}))
277 // next calls is from isolated app
278 .WillOnce(Return(Access::CallingContext{
279 .uid = AID_ISOLATED_START,
280 }))
281 .WillOnce(Return(Access::CallingContext{
282 .uid = AID_ISOLATED_START,
283 }));
Steven Morelanda9fe4742019-07-18 14:45:20 -0700284 EXPECT_CALL(*access, canAdd(_, _)).WillOnce(Return(true));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700285
286 // TODO(b/136023468): when security check is first, this should be called first
Steven Morelanda9fe4742019-07-18 14:45:20 -0700287 // EXPECT_CALL(*access, canFind(_, _)).WillOnce(Return(true));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700288
Steven Morelandb0983182021-04-02 03:14:04 +0000289 sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700290
291 EXPECT_TRUE(sm->addService("foo", getBinder(), false /*allowIsolated*/,
292 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
293
Alice Wang8578f132024-05-03 09:01:56 +0000294 Service out;
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700295 // returns nullptr but has OK status for legacy compatibility
Alice Wang11da1502024-07-25 12:03:22 +0000296 EXPECT_TRUE(sm->getService2("foo", &out).isOk());
Parth Sane5e1b7e12024-11-29 10:40:41 +0000297 EXPECT_EQ(nullptr, out.get<Service::Tag::serviceWithMetadata>().service);
Alice Wang11da1502024-07-25 12:03:22 +0000298 sp<IBinder> outBinder;
299 EXPECT_TRUE(sm->getService("foo", &outBinder).isOk());
300 EXPECT_EQ(nullptr, outBinder);
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700301}
302
303TEST(ListServices, NoPermissions) {
304 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
305
Steven Morelanda9fe4742019-07-18 14:45:20 -0700306 EXPECT_CALL(*access, getCallingContext()).WillOnce(Return(Access::CallingContext{}));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700307 EXPECT_CALL(*access, canList(_)).WillOnce(Return(false));
308
Steven Morelandb0983182021-04-02 03:14:04 +0000309 sp<ServiceManager> sm = sp<NiceMock<MockServiceManager>>::make(std::move(access));
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700310
311 std::vector<std::string> out;
312 EXPECT_FALSE(sm->listServices(IServiceManager::DUMP_FLAG_PRIORITY_ALL, &out).isOk());
313 EXPECT_TRUE(out.empty());
314}
315
316TEST(ListServices, AllServices) {
317 auto sm = getPermissiveServiceManager();
318
319 EXPECT_TRUE(sm->addService("sd", getBinder(), false /*allowIsolated*/,
320 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
321 EXPECT_TRUE(sm->addService("sc", getBinder(), false /*allowIsolated*/,
322 IServiceManager::DUMP_FLAG_PRIORITY_NORMAL).isOk());
323 EXPECT_TRUE(sm->addService("sb", getBinder(), false /*allowIsolated*/,
324 IServiceManager::DUMP_FLAG_PRIORITY_HIGH).isOk());
325 EXPECT_TRUE(sm->addService("sa", getBinder(), false /*allowIsolated*/,
326 IServiceManager::DUMP_FLAG_PRIORITY_CRITICAL).isOk());
327
328 std::vector<std::string> out;
329 EXPECT_TRUE(sm->listServices(IServiceManager::DUMP_FLAG_PRIORITY_ALL, &out).isOk());
330
331 // all there and in the right order
332 EXPECT_THAT(out, ElementsAre("sa", "sb", "sc", "sd"));
333}
334
335TEST(ListServices, CriticalServices) {
336 auto sm = getPermissiveServiceManager();
337
338 EXPECT_TRUE(sm->addService("sd", getBinder(), false /*allowIsolated*/,
339 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
340 EXPECT_TRUE(sm->addService("sc", getBinder(), false /*allowIsolated*/,
341 IServiceManager::DUMP_FLAG_PRIORITY_NORMAL).isOk());
342 EXPECT_TRUE(sm->addService("sb", getBinder(), false /*allowIsolated*/,
343 IServiceManager::DUMP_FLAG_PRIORITY_HIGH).isOk());
344 EXPECT_TRUE(sm->addService("sa", getBinder(), false /*allowIsolated*/,
345 IServiceManager::DUMP_FLAG_PRIORITY_CRITICAL).isOk());
346
347 std::vector<std::string> out;
348 EXPECT_TRUE(sm->listServices(IServiceManager::DUMP_FLAG_PRIORITY_CRITICAL, &out).isOk());
349
350 // all there and in the right order
351 EXPECT_THAT(out, ElementsAre("sa"));
352}
Steven Moreland27cfab02019-08-12 14:34:16 -0700353
Jooyung Hance94b752022-11-14 18:55:06 +0900354TEST(Vintf, UpdatableViaApex) {
Jooyung Hande196982023-05-08 15:01:12 +0900355 if (!isCuttlefishPhone()) GTEST_SKIP() << "Skipping non-Cuttlefish-phone devices";
Jooyung Hance94b752022-11-14 18:55:06 +0900356
357 auto sm = getPermissiveServiceManager();
358 std::optional<std::string> updatableViaApex;
359 EXPECT_TRUE(sm->updatableViaApex("android.hardware.camera.provider.ICameraProvider/internal/0",
360 &updatableViaApex)
361 .isOk());
362 EXPECT_EQ(std::make_optional<std::string>("com.google.emulated.camera.provider.hal"),
363 updatableViaApex);
364}
365
366TEST(Vintf, UpdatableViaApex_InvalidNameReturnsNullOpt) {
Jooyung Hande196982023-05-08 15:01:12 +0900367 if (!isCuttlefishPhone()) GTEST_SKIP() << "Skipping non-Cuttlefish-phone devices";
Jooyung Hance94b752022-11-14 18:55:06 +0900368
369 auto sm = getPermissiveServiceManager();
370 std::optional<std::string> updatableViaApex;
371 EXPECT_TRUE(sm->updatableViaApex("android.hardware.camera.provider.ICameraProvider",
372 &updatableViaApex)
373 .isOk()); // missing instance name
374 EXPECT_EQ(std::nullopt, updatableViaApex);
375}
376
377TEST(Vintf, GetUpdatableNames) {
Jooyung Hande196982023-05-08 15:01:12 +0900378 if (!isCuttlefishPhone()) GTEST_SKIP() << "Skipping non-Cuttlefish-phone devices";
Jooyung Hance94b752022-11-14 18:55:06 +0900379
380 auto sm = getPermissiveServiceManager();
381 std::vector<std::string> names;
382 EXPECT_TRUE(sm->getUpdatableNames("com.google.emulated.camera.provider.hal", &names).isOk());
383 EXPECT_EQ(std::vector<
384 std::string>{"android.hardware.camera.provider.ICameraProvider/internal/0"},
385 names);
386}
387
388TEST(Vintf, GetUpdatableNames_InvalidApexNameReturnsEmpty) {
Jooyung Hande196982023-05-08 15:01:12 +0900389 if (!isCuttlefishPhone()) GTEST_SKIP() << "Skipping non-Cuttlefish-phone devices";
Jooyung Hance94b752022-11-14 18:55:06 +0900390
391 auto sm = getPermissiveServiceManager();
392 std::vector<std::string> names;
393 EXPECT_TRUE(sm->getUpdatableNames("non.existing.apex.name", &names).isOk());
394 EXPECT_EQ(std::vector<std::string>{}, names);
395}
396
Jooyung Han205e2822023-12-19 16:59:39 +0900397TEST(Vintf, IsDeclared_native) {
398 if (!isCuttlefishPhone()) GTEST_SKIP() << "Skipping non-Cuttlefish-phone devices";
399
400 auto sm = getPermissiveServiceManager();
401 bool declared = false;
402 EXPECT_TRUE(sm->isDeclared("mapper/minigbm", &declared).isOk());
403 EXPECT_TRUE(declared);
404}
405
406TEST(Vintf, GetDeclaredInstances_native) {
407 if (!isCuttlefishPhone()) GTEST_SKIP() << "Skipping non-Cuttlefish-phone devices";
408
409 auto sm = getPermissiveServiceManager();
410 std::vector<std::string> instances;
411 EXPECT_TRUE(sm->getDeclaredInstances("mapper", &instances).isOk());
412 EXPECT_EQ(std::vector<std::string>{"minigbm"}, instances);
413}
414
Steven Moreland27cfab02019-08-12 14:34:16 -0700415class CallbackHistorian : public BnServiceCallback {
416 Status onRegistration(const std::string& name, const sp<IBinder>& binder) override {
417 registrations.push_back(name);
418 binders.push_back(binder);
419 return Status::ok();
420 }
421
422 android::status_t linkToDeath(const sp<DeathRecipient>&, void*, uint32_t) override {
423 // let SM linkToDeath
424 return android::OK;
425 }
426
427public:
428 std::vector<std::string> registrations;
429 std::vector<sp<IBinder>> binders;
430};
431
432TEST(ServiceNotifications, NoPermissionsRegister) {
433 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
434
435 EXPECT_CALL(*access, getCallingContext()).WillOnce(Return(Access::CallingContext{}));
436 EXPECT_CALL(*access, canFind(_,_)).WillOnce(Return(false));
437
Steven Morelandb0983182021-04-02 03:14:04 +0000438 sp<ServiceManager> sm = sp<ServiceManager>::make(std::move(access));
Steven Moreland27cfab02019-08-12 14:34:16 -0700439
Steven Morelandb0983182021-04-02 03:14:04 +0000440 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700441
Steven Morelandb9e1cbe2023-02-01 22:44:45 +0000442 EXPECT_EQ(sm->registerForNotifications("foofoo", cb).exceptionCode(), Status::EX_SECURITY);
443}
444
445TEST(GetService, IsolatedCantRegister) {
446 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
447
448 EXPECT_CALL(*access, getCallingContext())
449 .WillOnce(Return(Access::CallingContext{
450 .uid = AID_ISOLATED_START,
451 }));
452 EXPECT_CALL(*access, canFind(_, _)).WillOnce(Return(true));
453
454 sp<ServiceManager> sm = sp<ServiceManager>::make(std::move(access));
455
456 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
457
Steven Moreland27cfab02019-08-12 14:34:16 -0700458 EXPECT_EQ(sm->registerForNotifications("foofoo", cb).exceptionCode(),
459 Status::EX_SECURITY);
460}
461
462TEST(ServiceNotifications, NoPermissionsUnregister) {
463 std::unique_ptr<MockAccess> access = std::make_unique<NiceMock<MockAccess>>();
464
465 EXPECT_CALL(*access, getCallingContext()).WillOnce(Return(Access::CallingContext{}));
466 EXPECT_CALL(*access, canFind(_,_)).WillOnce(Return(false));
467
Steven Morelandb0983182021-04-02 03:14:04 +0000468 sp<ServiceManager> sm = sp<ServiceManager>::make(std::move(access));
Steven Moreland27cfab02019-08-12 14:34:16 -0700469
Steven Morelandb0983182021-04-02 03:14:04 +0000470 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700471
472 // should always hit security error first
473 EXPECT_EQ(sm->unregisterForNotifications("foofoo", cb).exceptionCode(),
474 Status::EX_SECURITY);
475}
476
477TEST(ServiceNotifications, InvalidName) {
478 auto sm = getPermissiveServiceManager();
479
Steven Morelandb0983182021-04-02 03:14:04 +0000480 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700481
482 EXPECT_EQ(sm->registerForNotifications("foo@foo", cb).exceptionCode(),
483 Status::EX_ILLEGAL_ARGUMENT);
484}
485
486TEST(ServiceNotifications, NullCallback) {
487 auto sm = getPermissiveServiceManager();
488
489 EXPECT_EQ(sm->registerForNotifications("foofoo", nullptr).exceptionCode(),
490 Status::EX_NULL_POINTER);
491}
492
493TEST(ServiceNotifications, Unregister) {
494 auto sm = getPermissiveServiceManager();
495
Steven Morelandb0983182021-04-02 03:14:04 +0000496 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700497
498 EXPECT_TRUE(sm->registerForNotifications("foofoo", cb).isOk());
499 EXPECT_EQ(sm->unregisterForNotifications("foofoo", cb).exceptionCode(), 0);
500}
501
502TEST(ServiceNotifications, UnregisterWhenNoRegistrationExists) {
503 auto sm = getPermissiveServiceManager();
504
Steven Morelandb0983182021-04-02 03:14:04 +0000505 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700506
507 EXPECT_EQ(sm->unregisterForNotifications("foofoo", cb).exceptionCode(),
508 Status::EX_ILLEGAL_STATE);
509}
510
511TEST(ServiceNotifications, NoNotification) {
512 auto sm = getPermissiveServiceManager();
513
Steven Morelandb0983182021-04-02 03:14:04 +0000514 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700515
516 EXPECT_TRUE(sm->registerForNotifications("foofoo", cb).isOk());
517 EXPECT_TRUE(sm->addService("otherservice", getBinder(),
518 false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
519
520 EXPECT_THAT(cb->registrations, ElementsAre());
521 EXPECT_THAT(cb->binders, ElementsAre());
522}
523
524TEST(ServiceNotifications, GetNotification) {
525 auto sm = getPermissiveServiceManager();
526
Steven Morelandb0983182021-04-02 03:14:04 +0000527 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700528
529 sp<IBinder> service = getBinder();
530
531 EXPECT_TRUE(sm->registerForNotifications("asdfasdf", cb).isOk());
532 EXPECT_TRUE(sm->addService("asdfasdf", service,
533 false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
534
535 EXPECT_THAT(cb->registrations, ElementsAre("asdfasdf"));
536 EXPECT_THAT(cb->binders, ElementsAre(service));
537}
538
539TEST(ServiceNotifications, GetNotificationForAlreadyRegisteredService) {
540 auto sm = getPermissiveServiceManager();
541
Steven Morelandb0983182021-04-02 03:14:04 +0000542 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700543
544 sp<IBinder> service = getBinder();
545
546 EXPECT_TRUE(sm->addService("asdfasdf", service,
547 false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
548
549 EXPECT_TRUE(sm->registerForNotifications("asdfasdf", cb).isOk());
550
551 EXPECT_THAT(cb->registrations, ElementsAre("asdfasdf"));
552 EXPECT_THAT(cb->binders, ElementsAre(service));
553}
554
555TEST(ServiceNotifications, GetMultipleNotification) {
556 auto sm = getPermissiveServiceManager();
557
Steven Morelandb0983182021-04-02 03:14:04 +0000558 sp<CallbackHistorian> cb = sp<CallbackHistorian>::make();
Steven Moreland27cfab02019-08-12 14:34:16 -0700559
560 sp<IBinder> binder1 = getBinder();
561 sp<IBinder> binder2 = getBinder();
562
563 EXPECT_TRUE(sm->registerForNotifications("asdfasdf", cb).isOk());
564 EXPECT_TRUE(sm->addService("asdfasdf", binder1,
565 false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
566 EXPECT_TRUE(sm->addService("asdfasdf", binder2,
567 false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk());
568
569 EXPECT_THAT(cb->registrations, ElementsAre("asdfasdf", "asdfasdf"));
570 EXPECT_THAT(cb->registrations, ElementsAre("asdfasdf", "asdfasdf"));
571}