1 /*
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 
17 #include <gtest/gtest.h>
18 #include <gmock/gmock.h>
19 
20 #include <binder/Binder.h>
21 #include <binder/ProcessState.h>
22 #include <binder/IServiceManager.h>
23 
24 #include "ServiceManager.h"
25 
26 using android::sp;
27 using android::BBinder;
28 using android::IBinder;
29 using android::OK;
30 using android::status_t;
31 using android::ServiceManager;
32 using android::String16;
33 using android::IServiceManager;
34 using testing::ElementsAre;
35 
getBinder()36 static sp<IBinder> getBinder() {
37     class LinkableBinder : public BBinder {
38         status_t linkToDeath(const sp<DeathRecipient>&, void*, uint32_t) override {
39             // let SM linkToDeath
40             return OK;
41         }
42     };
43 
44     return new LinkableBinder;
45 }
46 
TEST(AddService,HappyHappy)47 TEST(AddService, HappyHappy) {
48     auto sm = new ServiceManager();
49     EXPECT_EQ(sm->addService(String16("foo"), getBinder(), false /*allowIsolated*/,
50         IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT), OK);
51 }
52 
TEST(AddService,HappyOverExistingService)53 TEST(AddService, HappyOverExistingService) {
54     auto sm = new ServiceManager();
55     EXPECT_EQ(sm->addService(String16("foo"), getBinder(), false /*allowIsolated*/,
56         IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT), OK);
57     EXPECT_EQ(sm->addService(String16("foo"), getBinder(), false /*allowIsolated*/,
58         IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT), OK);
59 }
60 
TEST(GetService,HappyHappy)61 TEST(GetService, HappyHappy) {
62     auto sm = new ServiceManager();
63     sp<IBinder> service = getBinder();
64 
65     EXPECT_EQ(sm->addService(String16("foo"), service, false /*allowIsolated*/,
66         IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT), OK);
67 
68     EXPECT_EQ(sm->getService(String16("foo")), service);
69 }
70 
TEST(GetService,NonExistant)71 TEST(GetService, NonExistant) {
72     auto sm = new ServiceManager();
73 
74     EXPECT_EQ(sm->getService(String16("foo")), nullptr);
75 }
76 
TEST(ListServices,AllServices)77 TEST(ListServices, AllServices) {
78     auto sm = new ServiceManager();
79 
80     EXPECT_EQ(sm->addService(String16("sd"), getBinder(), false /*allowIsolated*/,
81         IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT), OK);
82     EXPECT_EQ(sm->addService(String16("sc"), getBinder(), false /*allowIsolated*/,
83         IServiceManager::DUMP_FLAG_PRIORITY_NORMAL), OK);
84     EXPECT_EQ(sm->addService(String16("sb"), getBinder(), false /*allowIsolated*/,
85         IServiceManager::DUMP_FLAG_PRIORITY_HIGH), OK);
86     EXPECT_EQ(sm->addService(String16("sa"), getBinder(), false /*allowIsolated*/,
87         IServiceManager::DUMP_FLAG_PRIORITY_CRITICAL), OK);
88 
89     android::Vector<String16> out = sm->listServices(IServiceManager::DUMP_FLAG_PRIORITY_ALL);
90 
91     // all there and in the right order
92     EXPECT_THAT(out, ElementsAre(String16("sa"), String16("sb"), String16("sc"),
93         String16("sd")));
94 }
95 
TEST(WaitForService,NonExistant)96 TEST(WaitForService, NonExistant) {
97     auto sm = new ServiceManager();
98 
99     EXPECT_EQ(sm->waitForService(String16("foo")), nullptr);
100 }
101 
TEST(WaitForService,HappyHappy)102 TEST(WaitForService, HappyHappy) {
103     auto sm = new ServiceManager();
104     sp<IBinder> service = getBinder();
105 
106     EXPECT_EQ(sm->addService(String16("foo"), service, false /*allowIsolated*/,
107         IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT), OK);
108 
109     EXPECT_EQ(sm->waitForService(String16("foo")), service);
110 }
111 
TEST(IsDeclared,NonExistant)112 TEST(IsDeclared, NonExistant) {
113     auto sm = new ServiceManager();
114 
115     EXPECT_FALSE(sm->isDeclared(String16("foo")));
116 }
117 
TEST(IsDeclared,HappyHappy)118 TEST(IsDeclared, HappyHappy) {
119     auto sm = new ServiceManager();
120     sp<IBinder> service = getBinder();
121 
122     EXPECT_EQ(sm->addService(String16("foo"), service, false /*allowIsolated*/,
123         IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT), OK);
124 
125     EXPECT_TRUE(sm->isDeclared(String16("foo")));
126 }
127