1 /*
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef MODULETEST_OHOS_ABILITY_RUNTIME_MOCK_BUNDLE_MANAGER_H
17 #define MODULETEST_OHOS_ABILITY_RUNTIME_MOCK_BUNDLE_MANAGER_H
18 
19 #include <vector>
20 #include <gmock/gmock.h>
21 #include "ability_info.h"
22 #include "application_info.h"
23 #include "bundlemgr/bundle_mgr_interface.h"
24 #include "want.h"
25 #include "iremote_proxy.h"
26 #include "iremote_stub.h"
27 
28 namespace OHOS {
29 namespace AppExecFwk {
30 namespace {
31 const std::string COM_IX_HIWORLD = "com.ix.hiworld";
32 const std::string COM_IX_HIMUSIC = "com.ix.hiMusic";
33 const std::string COM_IX_HIRADIO = "com.ix.hiRadio";
34 const std::string COM_IX_HISERVICE = "com.ix.hiService";
35 const std::string COM_IX_MUSICSERVICE = "com.ix.musicService";
36 const std::string COM_IX_HIDATA = "com.ix.hiData";
37 const std::string COM_IX_PHONE = "com.ix.hiPhone";
38 const std::string COM_IX_TV = "com.ix.hiTV";
39 const std::string COM_IX_Film = "com.ix.hiFilm";
40 const std::string COM_IX_HIBACKGROUNDMUSIC = "com.ix.hiBackgroundMusic";
41 const std::string COM_IX_HIBACKGROUNDDATA = "com.ix.hiBackgroundData";
42 const std::string COM_IX_HISINGLEMUSIC = "com.ix.hiSingleMusicInfo";
43 const std::string COM_OHOS_Test = "com.ohos.test";
44 const std::string COM_IX_HIACCOUNT = "com.ix.hiAccount";
45 const std::string COM_IX_HIACCOUNTSERVICE = "com.ix.hiAccountService";
46 constexpr int32_t MAX_SYS_UID = 2899;
47 const int32_t BASE_USER_RANGE = 200000;
48 const int32_t MOCK_MAIN_UID = 20000000;
49 
50 auto HiWordInfo = [](std::string bundleName, AbilityInfo& abilityInfo, ElementName& elementTemp) {
51     abilityInfo.name = elementTemp.GetAbilityName();
52     abilityInfo.bundleName = elementTemp.GetBundleName();
53     abilityInfo.applicationInfo.bundleName = elementTemp.GetBundleName();
54     abilityInfo.applicationName = "Helloworld";
55     abilityInfo.applicationInfo.name = "Helloworld";
56     abilityInfo.type = AbilityType::PAGE;
57     abilityInfo.applicationInfo.isLauncherApp = true;
58 
59     if (elementTemp.GetAbilityName() == "luncher") {
60         abilityInfo.configChanges.push_back("fontSize");
61     }
62     return true;
63 };
64 
65 auto HiMusicInfo = [](std::string bundleName, AbilityInfo& abilityInfo, ElementName& elementTemp) {
66     abilityInfo.name = elementTemp.GetAbilityName();
67     abilityInfo.bundleName = elementTemp.GetBundleName();
68     abilityInfo.applicationInfo.bundleName = elementTemp.GetBundleName();
69     abilityInfo.applicationName = "hiMusic";
70     abilityInfo.applicationInfo.name = "hiMusic";
71     abilityInfo.type = AbilityType::PAGE;
72     abilityInfo.applicationInfo.isLauncherApp = false;
73 
74     if (elementTemp.GetAbilityName() == "MusicAbility") {
75         abilityInfo.process = "p1";
76         abilityInfo.launchMode = LaunchMode::STANDARD;
77     }
78     if (elementTemp.GetAbilityName() == "MusicTopAbility") {
79         abilityInfo.process = "p1";
80         abilityInfo.launchMode = LaunchMode::STANDARD;
81     }
82     if (elementTemp.GetAbilityName() == "MusicSAbility") {
83         abilityInfo.process = "p2";
84         abilityInfo.launchMode = LaunchMode::SINGLETON;
85     }
86     if (elementTemp.GetAbilityName() == "Music") {
87         abilityInfo.process = "p1";
88         abilityInfo.launchMode = LaunchMode::STANDARD;
89         abilityInfo.configChanges.push_back("layout");
90     }
91 
92     if (elementTemp.GetAbilityName() == "MusicTon") {
93         abilityInfo.process = "p1";
94         abilityInfo.launchMode = LaunchMode::SINGLETON;
95         abilityInfo.configChanges.push_back("layout");
96     }
97     return true;
98 };
99 
100 auto HiRadioInfo = [](std::string bundleName, AbilityInfo& abilityInfo, ElementName& elementTemp) {
101     abilityInfo.name = elementTemp.GetAbilityName();
102     abilityInfo.bundleName = elementTemp.GetBundleName();
103     abilityInfo.applicationInfo.bundleName = elementTemp.GetBundleName();
104     abilityInfo.applicationName = "hiRadio";
105     abilityInfo.applicationInfo.name = "hiRadio";
106     abilityInfo.type = AbilityType::PAGE;
107     abilityInfo.process = "p3";
108     if (elementTemp.GetAbilityName() == "RadioAbility") {
109         abilityInfo.launchMode = LaunchMode::STANDARD;
110     }
111     if (elementTemp.GetAbilityName() == "RadioTopAbility") {
112         abilityInfo.launchMode = LaunchMode::SINGLETON;
113     }
114     if (elementTemp.GetAbilityName() == "Radio") {
115         abilityInfo.launchMode = LaunchMode::STANDARD;
116         abilityInfo.configChanges.push_back("orientation");
117     }
118     return true;
119 };
120 
121 auto HiServiceInfo = [](std::string bundleName, AbilityInfo& abilityInfo, ElementName& elementTemp) {
122     abilityInfo.name = elementTemp.GetAbilityName();
123     abilityInfo.bundleName = elementTemp.GetBundleName();
124     abilityInfo.applicationInfo.bundleName = elementTemp.GetBundleName();
125     abilityInfo.applicationName = "hiService";
126     abilityInfo.applicationInfo.name = "hiService";
127     abilityInfo.type = AbilityType::SERVICE;
128     abilityInfo.process = "p4";
129     return true;
130 };
131 
132 auto MusicServiceInfo = [](std::string bundleName, AbilityInfo& abilityInfo, ElementName& elementTemp) {
133     abilityInfo.name = elementTemp.GetAbilityName();
134     abilityInfo.bundleName = elementTemp.GetBundleName();
135     abilityInfo.applicationInfo.bundleName = elementTemp.GetBundleName();
136     abilityInfo.applicationName = "musicService";
137     abilityInfo.applicationInfo.name = "musicService";
138     abilityInfo.type = AbilityType::SERVICE;
139     abilityInfo.process = "p5";
140     return true;
141 };
142 
143 auto HiDataInfo = [](std::string bundleName, AbilityInfo& abilityInfo, ElementName& elementTemp) {
144     abilityInfo.name = elementTemp.GetAbilityName();
145     abilityInfo.bundleName = elementTemp.GetBundleName();
146     abilityInfo.applicationInfo.bundleName = elementTemp.GetBundleName();
147     abilityInfo.applicationName = "hiData";
148     abilityInfo.applicationInfo.name = "hiData";
149     abilityInfo.type = AbilityType::DATA;
150     abilityInfo.process = "p6";
151     return true;
152 };
153 
154 auto HiPhoneInfo = [](std::string bundleName, AbilityInfo& abilityInfo, ElementName& elementTemp) {
155     abilityInfo.name = elementTemp.GetAbilityName();
156     abilityInfo.bundleName = elementTemp.GetBundleName();
157     abilityInfo.applicationInfo.bundleName = elementTemp.GetBundleName();
158     abilityInfo.applicationName = "hiPhone";
159     abilityInfo.applicationInfo.name = "hiPhone";
160     abilityInfo.type = AbilityType::PAGE;
161     abilityInfo.applicationInfo.isLauncherApp = false;
162     abilityInfo.process = "p7";
163     if (elementTemp.GetAbilityName() == "PhoneAbility1") {
164         abilityInfo.launchMode = LaunchMode::SINGLETON;
165     }
166     if (elementTemp.GetAbilityName() == "PhoneAbility2") {
167         abilityInfo.launchMode = LaunchMode::SINGLETON;
168     }
169     return true;
170 };
171 
172 auto HiTVInfo = [](std::string bundleName, AbilityInfo& abilityInfo, ElementName& elementTemp) {
173     abilityInfo.name = elementTemp.GetAbilityName();
174     abilityInfo.bundleName = elementTemp.GetBundleName();
175     abilityInfo.applicationInfo.bundleName = elementTemp.GetBundleName();
176     abilityInfo.applicationName = "hiTV";
177     abilityInfo.applicationInfo.name = "hiTV";
178     abilityInfo.type = AbilityType::PAGE;
179     abilityInfo.applicationInfo.isLauncherApp = false;
180     if (elementTemp.GetAbilityName() == "TVAbility") {
181         abilityInfo.process = "p8";
182         abilityInfo.launchMode = LaunchMode::SINGLETON;
183     }
184     return true;
185 };
186 
187 auto HiFilmInfo = [](std::string bundleName, AbilityInfo& abilityInfo, ElementName& elementTemp) {
188     abilityInfo.name = elementTemp.GetAbilityName();
189     abilityInfo.bundleName = elementTemp.GetBundleName();
190     abilityInfo.applicationInfo.bundleName = elementTemp.GetBundleName();
191     abilityInfo.applicationName = "hiFilm";
192     abilityInfo.applicationInfo.name = "hiFilm";
193     abilityInfo.type = AbilityType::PAGE;
194     abilityInfo.applicationInfo.isLauncherApp = false;
195     if (elementTemp.GetAbilityName() == "FilmAbility") {
196         abilityInfo.process = "p9";
197         abilityInfo.launchMode = LaunchMode::SINGLETON;
198     }
199     return true;
200 };
201 auto HiBAckgroundMusicInfo = [](std::string bundleName, AbilityInfo& abilityInfo, ElementName& elementTemp) {
202     abilityInfo.name = elementTemp.GetAbilityName();
203     abilityInfo.bundleName = elementTemp.GetBundleName();
204     abilityInfo.applicationInfo.bundleName = elementTemp.GetBundleName();
205     abilityInfo.applicationInfo.singleton = true;
206     abilityInfo.applicationName = "hiBackgroundMusic";
207     abilityInfo.applicationInfo.name = "hiBackgroundMusic";
208     abilityInfo.type = AbilityType::SERVICE;
209     abilityInfo.process = "p4";
210     return true;
211 };
212 
213 auto HiBAckgroundDataInfo = [](std::string bundleName, AbilityInfo& abilityInfo, ElementName& elementTemp) {
214     abilityInfo.name = elementTemp.GetAbilityName();
215     abilityInfo.bundleName = elementTemp.GetBundleName();
216     abilityInfo.applicationInfo.bundleName = elementTemp.GetBundleName();
217     abilityInfo.applicationInfo.singleton = true;
218     abilityInfo.applicationName = "hiBackgroundData";
219     abilityInfo.applicationInfo.name = "hiBackgroundData";
220     abilityInfo.type = AbilityType::SERVICE;
221     abilityInfo.process = "p4";
222     return true;
223 };
224 
225 auto HiSingleMusicInfo = [](std::string bundleName, AbilityInfo& abilityInfo, ElementName& elementTemp) {
226     abilityInfo.name = elementTemp.GetAbilityName();
227     abilityInfo.bundleName = elementTemp.GetBundleName();
228     abilityInfo.applicationInfo.bundleName = elementTemp.GetBundleName();
229     abilityInfo.applicationInfo.singleton = true;
230     abilityInfo.applicationName = "hiSingleMusic";
231     abilityInfo.applicationInfo.name = "hiSingleMusic";
232     abilityInfo.type = AbilityType::PAGE;
233     abilityInfo.process = "p3";
234     if (elementTemp.GetAbilityName() == "SingleMusicAbility") {
235         abilityInfo.launchMode = LaunchMode::STANDARD;
236     }
237     if (elementTemp.GetAbilityName() == "SingleMusicTopAbility") {
238         abilityInfo.launchMode = LaunchMode::SINGLETON;
239     }
240     return true;
241 };
242 
243 auto TestInfo = [](std::string bundleName, AbilityInfo& abilityInfo, ElementName& elementTemp) {
244     abilityInfo.name = elementTemp.GetAbilityName();
245     abilityInfo.bundleName = elementTemp.GetBundleName();
246     abilityInfo.applicationInfo.bundleName = elementTemp.GetBundleName();
247     abilityInfo.applicationName = "com.ohos.test";
248     abilityInfo.applicationInfo.name = "com.ohos.test";
249     abilityInfo.moduleName = ".MyApplication";
250     abilityInfo.package = "com.ohos.test";
251     abilityInfo.type = AbilityType::PAGE;
252     abilityInfo.applicationInfo.isLauncherApp = false;
253     abilityInfo.kind = "page";
254     abilityInfo.process = "p10";
255     abilityInfo.labelId = 10001;
256     abilityInfo.label = "$string:label";
257     abilityInfo.descriptionId = 10002;
258     abilityInfo.description = "$string:mainability_description";
259     abilityInfo.iconId = 10003;
260     abilityInfo.iconPath = "$media:icon";
261     abilityInfo.theme = "mytheme";
262     abilityInfo.readPermission = "readPermission";
263     abilityInfo.writePermission = "writePermission";
264     abilityInfo.resourcePath = "/data/app/com.ohos.test";
265     abilityInfo.srcPath = "/resources/base/profile";
266     abilityInfo.srcLanguage = "C++";
267     abilityInfo.isLauncherAbility = false;
268     abilityInfo.isNativeAbility = false;
269     abilityInfo.enabled = false;
270     abilityInfo.supportPipMode = false;
271     abilityInfo.formEnabled = false;
272     return true;
273 };
274 auto HiAccountInfo = [](std::string bundleName, AbilityInfo& abilityInfo, ElementName& elementTemp) {
275     abilityInfo.name = elementTemp.GetAbilityName();
276     abilityInfo.bundleName = elementTemp.GetBundleName();
277     abilityInfo.applicationInfo.bundleName = elementTemp.GetBundleName();
278     abilityInfo.applicationInfo.uid = MOCK_MAIN_UID;
279     abilityInfo.applicationName = "AccountTest";
280     abilityInfo.applicationInfo.name = "AccountTest";
281     abilityInfo.type = AbilityType::PAGE;
282     abilityInfo.applicationInfo.isLauncherApp = true;
283     return true;
284 };
285 
286 auto HiAccountServiceInfo = [](std::string bundleName, AbilityInfo& abilityInfo, ElementName& elementTemp) {
287     abilityInfo.name = elementTemp.GetAbilityName();
288     abilityInfo.bundleName = elementTemp.GetBundleName();
289     abilityInfo.applicationInfo.bundleName = elementTemp.GetBundleName();
290     abilityInfo.applicationInfo.uid = MOCK_MAIN_UID;
291     abilityInfo.applicationName = "AccountServiceTest";
292     abilityInfo.applicationInfo.name = "AccountServiceTest";
293     abilityInfo.type = AbilityType::SERVICE;
294     abilityInfo.applicationInfo.isLauncherApp = true;
295     return true;
296 };
297 }  // namespace
298 class BundleMgrProxy : public IRemoteProxy<IBundleMgr> {
299 public:
BundleMgrProxy(const sptr<IRemoteObject> & impl)300     explicit BundleMgrProxy(const sptr<IRemoteObject>& impl) : IRemoteProxy<IBundleMgr>(impl)
301     {}
302 
303     int QueryWantAbility(const AAFwk::Want& want, std::vector<AbilityInfo>& abilityInfos);
304     bool QueryAbilityInfo(const AAFwk::Want& want, AbilityInfo& abilityInfo) override;
305     bool GetApplicationInfo(
306         const std::string& appName, const ApplicationFlag flag, const int userId, ApplicationInfo& appInfo) override;
307     bool GetBundleInfo(
308         const std::string& bundleName, const BundleFlag flag, BundleInfo& bundleInfo, int32_t userId) override;
GetBaseSharedBundleInfos(const std::string & bundleName,std::vector<BaseSharedBundleInfo> & baseSharedBundleInfos,AppExecFwk::GetDependentBundleInfoFlag flag)309     ErrCode GetBaseSharedBundleInfos(const std::string &bundleName,
310         std::vector<BaseSharedBundleInfo> &baseSharedBundleInfos,
311         AppExecFwk::GetDependentBundleInfoFlag flag) override
312     {
313         return ERR_OK;
314     }
315 };
316 
317 class BundleMgrStub : public IRemoteStub<IBundleMgr> {
318 public:
319     virtual int OnRemoteRequest(
320         uint32_t code, MessageParcel& data, MessageParcel& reply, MessageOption& option) override;
321 };
322 
323 class BundleMgrService : public BundleMgrStub {
324 public:
325     bool GetBundleInfo(
326         const std::string& bundleName, const BundleFlag flag, BundleInfo& bundleInfo, int32_t userId) override;
327     bool QueryAbilityInfo(const AAFwk::Want& want, AbilityInfo& abilityInfo) override;
328     bool QueryAbilityInfo(const AAFwk::Want& want, int32_t flags, int32_t userId, AbilityInfo& abilityInfo) override;
329 
330     bool GetApplicationInfo(
331         const std::string& appName, const ApplicationFlag flag, const int userId, ApplicationInfo& appInfo) override;
332 
333     bool ImplicitQueryInfos(const Want& want, int32_t flags, int32_t userId, bool withDefault,
334         std::vector<AbilityInfo>& abilityInfos, std::vector<ExtensionAbilityInfo>& extensionInfos) override;
335 
BundleMgrService()336     BundleMgrService()
337     {
338         abilityInfoMap_.emplace(COM_IX_HIWORLD, HiWordInfo);
339         abilityInfoMap_.emplace(COM_IX_HIMUSIC, HiMusicInfo);
340         abilityInfoMap_.emplace(COM_IX_HIRADIO, HiRadioInfo);
341         abilityInfoMap_.emplace(COM_IX_HISERVICE, HiServiceInfo);
342         abilityInfoMap_.emplace(COM_IX_MUSICSERVICE, MusicServiceInfo);
343         abilityInfoMap_.emplace(COM_IX_HIDATA, HiDataInfo);
344         abilityInfoMap_.emplace(COM_IX_PHONE, HiPhoneInfo);
345         abilityInfoMap_.emplace(COM_IX_TV, HiTVInfo);
346         abilityInfoMap_.emplace(COM_IX_Film, HiFilmInfo);
347         abilityInfoMap_.emplace(COM_IX_HIBACKGROUNDMUSIC, HiBAckgroundMusicInfo);
348         abilityInfoMap_.emplace(COM_IX_HIBACKGROUNDDATA, HiBAckgroundDataInfo);
349         abilityInfoMap_.emplace(COM_IX_HISINGLEMUSIC, HiSingleMusicInfo);
350         abilityInfoMap_.emplace(COM_OHOS_Test, TestInfo);
351         abilityInfoMap_.emplace(COM_IX_HIACCOUNT, HiAccountInfo);
352         abilityInfoMap_.emplace(COM_IX_HIACCOUNTSERVICE, HiAccountServiceInfo);
353     }
354 
~BundleMgrService()355     virtual ~BundleMgrService()
356     {}
357 
358     bool CheckWantEntity(const AAFwk::Want&, AbilityInfo&);
359 
GetBaseSharedBundleInfos(const std::string & bundleName,std::vector<BaseSharedBundleInfo> & baseSharedBundleInfos,AppExecFwk::GetDependentBundleInfoFlag flag)360     ErrCode GetBaseSharedBundleInfos(const std::string &bundleName,
361         std::vector<BaseSharedBundleInfo> &baseSharedBundleInfos,
362         AppExecFwk::GetDependentBundleInfoFlag flag) override
363     {
364         return ERR_OK;
365     }
366 
367 public:
368     using QueryAbilityInfoFunType =
369         std::function<bool(std::string bundleName, AbilityInfo& abilityInfo, ElementName& elementTemp)>;
370     std::map<std::string, QueryAbilityInfoFunType> abilityInfoMap_;
371 };
372 }  // namespace AppExecFwk
373 }  // namespace OHOS
374 
375 #endif  // MODULETEST_OHOS_ABILITY_RUNTIME_MOCK_BUNDLE_MANAGER_H
376