1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker * Copyright (C) 2019 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker *
4*38e8c45fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker *
8*38e8c45fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker *
10*38e8c45fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker */
16*38e8c45fSAndroid Build Coastguard Worker
17*38e8c45fSAndroid Build Coastguard Worker #include <gtest/gtest.h>
18*38e8c45fSAndroid Build Coastguard Worker #include <gmock/gmock.h>
19*38e8c45fSAndroid Build Coastguard Worker
20*38e8c45fSAndroid Build Coastguard Worker #include <binder/Binder.h>
21*38e8c45fSAndroid Build Coastguard Worker #include <binder/ProcessState.h>
22*38e8c45fSAndroid Build Coastguard Worker #include <binder/IServiceManager.h>
23*38e8c45fSAndroid Build Coastguard Worker
24*38e8c45fSAndroid Build Coastguard Worker #include "fakeservicemanager/FakeServiceManager.h"
25*38e8c45fSAndroid Build Coastguard Worker #include "rust/wrappers/FakeServiceManagerWrapper.hpp"
26*38e8c45fSAndroid Build Coastguard Worker
27*38e8c45fSAndroid Build Coastguard Worker using android::sp;
28*38e8c45fSAndroid Build Coastguard Worker using android::BBinder;
29*38e8c45fSAndroid Build Coastguard Worker using android::IBinder;
30*38e8c45fSAndroid Build Coastguard Worker using android::OK;
31*38e8c45fSAndroid Build Coastguard Worker using android::status_t;
32*38e8c45fSAndroid Build Coastguard Worker using android::FakeServiceManager;
33*38e8c45fSAndroid Build Coastguard Worker using android::String16;
34*38e8c45fSAndroid Build Coastguard Worker using android::IServiceManager;
35*38e8c45fSAndroid Build Coastguard Worker using android::defaultServiceManager;
36*38e8c45fSAndroid Build Coastguard Worker using testing::ElementsAre;
37*38e8c45fSAndroid Build Coastguard Worker
getBinder()38*38e8c45fSAndroid Build Coastguard Worker static sp<IBinder> getBinder() {
39*38e8c45fSAndroid Build Coastguard Worker class LinkableBinder : public BBinder {
40*38e8c45fSAndroid Build Coastguard Worker status_t linkToDeath(const sp<DeathRecipient>&, void*, uint32_t) override {
41*38e8c45fSAndroid Build Coastguard Worker // let SM linkToDeath
42*38e8c45fSAndroid Build Coastguard Worker return OK;
43*38e8c45fSAndroid Build Coastguard Worker }
44*38e8c45fSAndroid Build Coastguard Worker };
45*38e8c45fSAndroid Build Coastguard Worker
46*38e8c45fSAndroid Build Coastguard Worker return new LinkableBinder;
47*38e8c45fSAndroid Build Coastguard Worker }
48*38e8c45fSAndroid Build Coastguard Worker
TEST(AddService,HappyHappy)49*38e8c45fSAndroid Build Coastguard Worker TEST(AddService, HappyHappy) {
50*38e8c45fSAndroid Build Coastguard Worker auto sm = new FakeServiceManager();
51*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(sm->addService(String16("foo"), getBinder(), false /*allowIsolated*/,
52*38e8c45fSAndroid Build Coastguard Worker IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT), OK);
53*38e8c45fSAndroid Build Coastguard Worker }
54*38e8c45fSAndroid Build Coastguard Worker
TEST(AddService,SadNullBinder)55*38e8c45fSAndroid Build Coastguard Worker TEST(AddService, SadNullBinder) {
56*38e8c45fSAndroid Build Coastguard Worker auto sm = new FakeServiceManager();
57*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(sm->addService(String16("foo"), nullptr, false /*allowIsolated*/,
58*38e8c45fSAndroid Build Coastguard Worker IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT), android::UNEXPECTED_NULL);
59*38e8c45fSAndroid Build Coastguard Worker }
60*38e8c45fSAndroid Build Coastguard Worker
TEST(AddService,HappyOverExistingService)61*38e8c45fSAndroid Build Coastguard Worker TEST(AddService, HappyOverExistingService) {
62*38e8c45fSAndroid Build Coastguard Worker auto sm = new FakeServiceManager();
63*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(sm->addService(String16("foo"), getBinder(), false /*allowIsolated*/,
64*38e8c45fSAndroid Build Coastguard Worker IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT), OK);
65*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(sm->addService(String16("foo"), getBinder(), false /*allowIsolated*/,
66*38e8c45fSAndroid Build Coastguard Worker IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT), OK);
67*38e8c45fSAndroid Build Coastguard Worker }
68*38e8c45fSAndroid Build Coastguard Worker
TEST(AddService,HappyClearAddedService)69*38e8c45fSAndroid Build Coastguard Worker TEST(AddService, HappyClearAddedService) {
70*38e8c45fSAndroid Build Coastguard Worker auto sm = new FakeServiceManager();
71*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(sm->addService(String16("foo"), getBinder(), false /*allowIsolated*/,
72*38e8c45fSAndroid Build Coastguard Worker IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT), OK);
73*38e8c45fSAndroid Build Coastguard Worker EXPECT_NE(sm->getService(String16("foo")), nullptr);
74*38e8c45fSAndroid Build Coastguard Worker sm->clear();
75*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(sm->getService(String16("foo")), nullptr);
76*38e8c45fSAndroid Build Coastguard Worker }
77*38e8c45fSAndroid Build Coastguard Worker
TEST(GetService,HappyHappy)78*38e8c45fSAndroid Build Coastguard Worker TEST(GetService, HappyHappy) {
79*38e8c45fSAndroid Build Coastguard Worker auto sm = new FakeServiceManager();
80*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> service = getBinder();
81*38e8c45fSAndroid Build Coastguard Worker
82*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(sm->addService(String16("foo"), service, false /*allowIsolated*/,
83*38e8c45fSAndroid Build Coastguard Worker IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT), OK);
84*38e8c45fSAndroid Build Coastguard Worker
85*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(sm->getService(String16("foo")), service);
86*38e8c45fSAndroid Build Coastguard Worker }
87*38e8c45fSAndroid Build Coastguard Worker
TEST(GetService,NonExistent)88*38e8c45fSAndroid Build Coastguard Worker TEST(GetService, NonExistent) {
89*38e8c45fSAndroid Build Coastguard Worker auto sm = new FakeServiceManager();
90*38e8c45fSAndroid Build Coastguard Worker
91*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(sm->getService(String16("foo")), nullptr);
92*38e8c45fSAndroid Build Coastguard Worker }
93*38e8c45fSAndroid Build Coastguard Worker
TEST(ListServices,AllServices)94*38e8c45fSAndroid Build Coastguard Worker TEST(ListServices, AllServices) {
95*38e8c45fSAndroid Build Coastguard Worker auto sm = new FakeServiceManager();
96*38e8c45fSAndroid Build Coastguard Worker
97*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(sm->addService(String16("sd"), getBinder(), false /*allowIsolated*/,
98*38e8c45fSAndroid Build Coastguard Worker IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT), OK);
99*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(sm->addService(String16("sc"), getBinder(), false /*allowIsolated*/,
100*38e8c45fSAndroid Build Coastguard Worker IServiceManager::DUMP_FLAG_PRIORITY_NORMAL), OK);
101*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(sm->addService(String16("sb"), getBinder(), false /*allowIsolated*/,
102*38e8c45fSAndroid Build Coastguard Worker IServiceManager::DUMP_FLAG_PRIORITY_HIGH), OK);
103*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(sm->addService(String16("sa"), getBinder(), false /*allowIsolated*/,
104*38e8c45fSAndroid Build Coastguard Worker IServiceManager::DUMP_FLAG_PRIORITY_CRITICAL), OK);
105*38e8c45fSAndroid Build Coastguard Worker
106*38e8c45fSAndroid Build Coastguard Worker android::Vector<String16> out = sm->listServices(IServiceManager::DUMP_FLAG_PRIORITY_ALL);
107*38e8c45fSAndroid Build Coastguard Worker
108*38e8c45fSAndroid Build Coastguard Worker // all there and in the right order
109*38e8c45fSAndroid Build Coastguard Worker EXPECT_THAT(out, ElementsAre(String16("sa"), String16("sb"), String16("sc"),
110*38e8c45fSAndroid Build Coastguard Worker String16("sd")));
111*38e8c45fSAndroid Build Coastguard Worker }
112*38e8c45fSAndroid Build Coastguard Worker
TEST(WaitForService,NonExistent)113*38e8c45fSAndroid Build Coastguard Worker TEST(WaitForService, NonExistent) {
114*38e8c45fSAndroid Build Coastguard Worker auto sm = new FakeServiceManager();
115*38e8c45fSAndroid Build Coastguard Worker
116*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(sm->waitForService(String16("foo")), nullptr);
117*38e8c45fSAndroid Build Coastguard Worker }
118*38e8c45fSAndroid Build Coastguard Worker
TEST(WaitForService,HappyHappy)119*38e8c45fSAndroid Build Coastguard Worker TEST(WaitForService, HappyHappy) {
120*38e8c45fSAndroid Build Coastguard Worker auto sm = new FakeServiceManager();
121*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> service = getBinder();
122*38e8c45fSAndroid Build Coastguard Worker
123*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(sm->addService(String16("foo"), service, false /*allowIsolated*/,
124*38e8c45fSAndroid Build Coastguard Worker IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT), OK);
125*38e8c45fSAndroid Build Coastguard Worker
126*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(sm->waitForService(String16("foo")), service);
127*38e8c45fSAndroid Build Coastguard Worker }
128*38e8c45fSAndroid Build Coastguard Worker
TEST(IsDeclared,NonExistent)129*38e8c45fSAndroid Build Coastguard Worker TEST(IsDeclared, NonExistent) {
130*38e8c45fSAndroid Build Coastguard Worker auto sm = new FakeServiceManager();
131*38e8c45fSAndroid Build Coastguard Worker
132*38e8c45fSAndroid Build Coastguard Worker EXPECT_FALSE(sm->isDeclared(String16("foo")));
133*38e8c45fSAndroid Build Coastguard Worker }
134*38e8c45fSAndroid Build Coastguard Worker
TEST(IsDeclared,HappyHappy)135*38e8c45fSAndroid Build Coastguard Worker TEST(IsDeclared, HappyHappy) {
136*38e8c45fSAndroid Build Coastguard Worker auto sm = new FakeServiceManager();
137*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> service = getBinder();
138*38e8c45fSAndroid Build Coastguard Worker
139*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(sm->addService(String16("foo"), service, false /*allowIsolated*/,
140*38e8c45fSAndroid Build Coastguard Worker IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT), OK);
141*38e8c45fSAndroid Build Coastguard Worker
142*38e8c45fSAndroid Build Coastguard Worker EXPECT_TRUE(sm->isDeclared(String16("foo")));
143*38e8c45fSAndroid Build Coastguard Worker }
144*38e8c45fSAndroid Build Coastguard Worker
TEST(SetupFakeServiceManager,NonExistent)145*38e8c45fSAndroid Build Coastguard Worker TEST(SetupFakeServiceManager, NonExistent) {
146*38e8c45fSAndroid Build Coastguard Worker setupFakeServiceManager();
147*38e8c45fSAndroid Build Coastguard Worker
148*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(defaultServiceManager()->getService(String16("foo")), nullptr);
149*38e8c45fSAndroid Build Coastguard Worker }
150*38e8c45fSAndroid Build Coastguard Worker
TEST(SetupFakeServiceManager,GetExistingService)151*38e8c45fSAndroid Build Coastguard Worker TEST(SetupFakeServiceManager, GetExistingService) {
152*38e8c45fSAndroid Build Coastguard Worker setupFakeServiceManager();
153*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> service = getBinder();
154*38e8c45fSAndroid Build Coastguard Worker
155*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(defaultServiceManager()->addService(String16("foo"), service, false /*allowIsolated*/,
156*38e8c45fSAndroid Build Coastguard Worker IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT), OK);
157*38e8c45fSAndroid Build Coastguard Worker
158*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(defaultServiceManager()->getService(String16("foo")), service);
159*38e8c45fSAndroid Build Coastguard Worker clearFakeServiceManager();
160*38e8c45fSAndroid Build Coastguard Worker }
161*38e8c45fSAndroid Build Coastguard Worker
TEST(ClearFakeServiceManager,GetServiceAfterClear)162*38e8c45fSAndroid Build Coastguard Worker TEST(ClearFakeServiceManager, GetServiceAfterClear) {
163*38e8c45fSAndroid Build Coastguard Worker setupFakeServiceManager();
164*38e8c45fSAndroid Build Coastguard Worker
165*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> service = getBinder();
166*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(defaultServiceManager()->addService(String16("foo"), service, false /*allowIsolated*/,
167*38e8c45fSAndroid Build Coastguard Worker IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT), OK);
168*38e8c45fSAndroid Build Coastguard Worker
169*38e8c45fSAndroid Build Coastguard Worker clearFakeServiceManager();
170*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(defaultServiceManager()->getService(String16("foo")), nullptr);
171*38e8c45fSAndroid Build Coastguard Worker }