1 /*
2 * Copyright (c) 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 #include <gtest/gtest.h>
17
18 #define private public
19 #include "ability_manager_service.h"
20 #include "ability_event_handler.h"
21 #include "free_install_manager.h"
22 #undef private
23 #include "mock_bundle_manager.h"
24 #include "mock_app_thread.h"
25 #include "ability_record.h"
26 #include "token.h"
27 #include "sa_mgr_client.h"
28
29 using namespace testing::ext;
30 using namespace OHOS::AAFwk;
31
32 namespace OHOS {
33 namespace AppExecFwk {
34 namespace {
35 const int BUNDLE_MGR_SERVICE_SYS_ABILITY_ID = 401;
36 }
37 class FreeInstallTest : public testing::Test {
38 public:
FreeInstallTest()39 FreeInstallTest()
40 {}
~FreeInstallTest()41 ~FreeInstallTest()
42 {}
43 static void SetUpTestCase(void);
44 static void TearDownTestCase(void);
45 void SetUp();
46 void TearDown();
47 sptr<Token> MockToken();
48 void WaitUntilTaskFinished();
49 std::shared_ptr<AbilityManagerService> abilityMs_ = DelayedSingleton<AbilityManagerService>::GetInstance();
50 std::shared_ptr<FreeInstallManager> freeInstallManager_ = nullptr;
51 };
52
SetUpTestCase(void)53 void FreeInstallTest::SetUpTestCase(void)
54 {
55 OHOS::DelayedSingleton<SaMgrClient>::GetInstance()->RegisterSystemAbility(
56 BUNDLE_MGR_SERVICE_SYS_ABILITY_ID, new BundleMgrService());
57 }
58
TearDownTestCase(void)59 void FreeInstallTest::TearDownTestCase(void)
60 {
61 OHOS::DelayedSingleton<SaMgrClient>::DestroyInstance();
62 }
63
SetUp(void)64 void FreeInstallTest::SetUp(void)
65 {
66 freeInstallManager_ = std::make_shared<FreeInstallManager>(abilityMs_);
67 abilityMs_->eventLoop_ = AppExecFwk::EventRunner::Create(AbilityConfig::NAME_ABILITY_MGR_SERVICE);
68 abilityMs_->handler_ = std::make_shared<AbilityEventHandler>(abilityMs_->eventLoop_, abilityMs_);
69 }
70
TearDown(void)71 void FreeInstallTest::TearDown(void)
72 {}
73
MockToken()74 sptr<Token> FreeInstallTest::MockToken()
75 {
76 sptr<Token> token = nullptr;
77 AbilityRequest abilityRequest;
78 abilityRequest.appInfo.bundleName = "com.test.demo";
79 abilityRequest.abilityInfo.name = "MainAbility";
80 abilityRequest.abilityInfo.type = AbilityType::PAGE;
81 std::shared_ptr<AbilityRecord> abilityRecord = AbilityRecord::CreateAbilityRecord(abilityRequest);
82 if (!abilityRecord) {
83 return nullptr;
84 }
85 return abilityRecord->GetToken();
86 }
87
WaitUntilTaskFinished()88 void FreeInstallTest::WaitUntilTaskFinished()
89 {
90 const uint32_t maxRetryCount = 1000;
91 const uint32_t sleepTime = 1000;
92 uint32_t count = 0;
93 auto handler = abilityMs_->handler_;
94 std::atomic<bool> taskCalled(false);
95 auto f = [&taskCalled]() { taskCalled.store(true); };
96 if (handler->PostTask(f)) {
97 while (!taskCalled.load()) {
98 ++count;
99 if (count >= maxRetryCount) {
100 break;
101 }
102 usleep(sleepTime);
103 }
104 }
105 }
106
107 /**
108 * @tc.number: FreeInstall_StartFreeInstall_001
109 * @tc.name: StartFreeInstall
110 * @tc.desc: Test StartFreeInstall when callback is success.
111 */
112 HWTEST_F(FreeInstallTest, FreeInstall_StartFreeInstall_001, TestSize.Level1)
113 {
114 Want want;
115 ElementName element("", "com.test.demo", "MainAbility");
116 want.SetElement(element);
117 const int32_t userId = 100;
118 const int requestCode = 0;
119 int64_t startInstallTime = 0;
120 // mock callerToken
121 const sptr<IRemoteObject> callerToken = MockToken();
122 int res = 0;
__anon968dae4c0302()123 auto task = [manager = freeInstallManager_, want, userId, requestCode, callerToken, &res](){
124 res = manager->StartFreeInstall(want, userId, requestCode, callerToken);
125 };
126 abilityMs_->handler_->PostTask(task);
127
128 usleep(100000);
129 // from freeInstallManager_->freeInstallList_ find startInstallTime
130 for (auto it = freeInstallManager_->freeInstallList_.begin(); it != freeInstallManager_->freeInstallList_.end();) {
131 std::string bundleName = (*it).want.GetElement().GetBundleName();
132 std::string abilityName = (*it).want.GetElement().GetAbilityName();
133 if (want.GetElement().GetBundleName().compare(bundleName) != 0 ||
134 want.GetElement().GetAbilityName().compare(abilityName) != 0) {
135 startInstallTime = (*it).startInstallTime;
136 break;
137 }
138 }
139 freeInstallManager_->OnInstallFinished(0, want, userId, startInstallTime);
140 WaitUntilTaskFinished();
141
142 EXPECT_NE(res, 0);
143 }
144
145 /**
146 * @tc.number: FreeInstall_StartFreeInstall_002
147 * @tc.name: StartFreeInstall
148 * @tc.desc: Test StartFreeInstall when token is nullptr.
149 */
150 HWTEST_F(FreeInstallTest, FreeInstall_StartFreeInstall_002, TestSize.Level1)
151 {
152 Want want;
153 ElementName element("", "com.test.demo", "MainAbility");
154 want.SetElement(element);
155 const int32_t userId = 100;
156 const int requestCode = 0;
157 // token is nullptr, IsTopAbility failed
158 const sptr<IRemoteObject> callerToken = nullptr;
159 // NotTopAbility
160 int res = freeInstallManager_->StartFreeInstall(want, userId, requestCode, callerToken);
161 EXPECT_EQ(res, 0x500001);
162 }
163
164 /**
165 * @tc.number: FreeInstall_StartFreeInstall_003
166 * @tc.name: StartFreeInstall
167 * @tc.desc: Test StartFreeInstall when callback is failed.
168 */
169 HWTEST_F(FreeInstallTest, FreeInstall_StartFreeInstall_003, TestSize.Level1)
170 {
171 Want want;
172 ElementName element("", "com.test.demo", "MainAbility");
173 want.SetElement(element);
174 const int32_t userId = 1;
175 const int requestCode = 0;
176 int64_t startInstallTime = 0;
177 // mock callerToken
178 const sptr<IRemoteObject> callerToken = MockToken();
179 int res = 0;
__anon968dae4c0402()180 auto task = [manager = freeInstallManager_, want, userId, requestCode, callerToken, &res](){
181 res = manager->StartFreeInstall(want, userId, requestCode, callerToken);
182 };
183 abilityMs_->handler_->PostTask(task);
184
185 usleep(100000);
186 // from freeInstallManager_->freeInstallList_ find startInstallTime
187 for (auto it = freeInstallManager_->freeInstallList_.begin(); it != freeInstallManager_->freeInstallList_.end();) {
188 std::string bundleName = (*it).want.GetElement().GetBundleName();
189 std::string abilityName = (*it).want.GetElement().GetAbilityName();
190 if (want.GetElement().GetBundleName().compare(bundleName) != 0 ||
191 want.GetElement().GetAbilityName().compare(abilityName) != 0) {
192 startInstallTime = (*it).startInstallTime;
193 break;
194 }
195 }
196 freeInstallManager_->OnInstallFinished(1, want, userId, startInstallTime);
197 WaitUntilTaskFinished();
198
199 EXPECT_EQ(res, 5242881);
200 }
201
202 /**
203 * @tc.number: FreeInstall_OnInstallFinished_001
204 * @tc.name: OnInstallFinished
205 * @tc.desc: Test OnInstallFinished succeed.
206 */
207 HWTEST_F(FreeInstallTest, FreeInstall_OnInstallFinished_001, TestSize.Level1)
208 {
209 Want want;
210 ElementName element("", "com.test.demo", "MainAbility");
211 want.SetElement(element);
212 const int32_t userId = 1;
213 const int requestCode = 0;
214 int64_t startInstallTime = 0;
215
216 FreeInstallInfo info = freeInstallManager_->BuildFreeInstallInfo(want, userId, requestCode, nullptr);
217 freeInstallManager_->freeInstallList_.resize(0);
218 freeInstallManager_->freeInstallList_.emplace_back(info);
219 freeInstallManager_->OnInstallFinished(0, want, userId, startInstallTime);
220
221 for (auto it = freeInstallManager_->freeInstallList_.begin();
222 it != freeInstallManager_->freeInstallList_.end(); it++) {
223 std::string bundleName = (*it).want.GetElement().GetBundleName();
224 std::string abilityName = (*it).want.GetElement().GetAbilityName();
225 if (want.GetElement().GetBundleName().compare(bundleName) == 0 &&
226 want.GetElement().GetAbilityName().compare(abilityName) == 0 &&
227 startInstallTime == (*it).startInstallTime) {
228 EXPECT_EQ((*it).promise->get_future().get(), 0);
229 }
230 }
231 }
232
233 /**
234 * @tc.number: FreeInstall_StartFreeInstall_004
235 * @tc.name: OnInstallFinished
236 * @tc.desc: Test OnInstallFinished failed.
237 */
238 HWTEST_F(FreeInstallTest, FreeInstall_OnInstallFinished_002, TestSize.Level1)
239 {
240 Want want;
241 ElementName element("", "com.test.demo", "MainAbility");
242 want.SetElement(element);
243 const int32_t userId = 1;
244 const int requestCode = 0;
245 int64_t startInstallTime = 0;
246
247 FreeInstallInfo info = freeInstallManager_->BuildFreeInstallInfo(want, userId, requestCode, nullptr);
248 freeInstallManager_->freeInstallList_.resize(0);
249 freeInstallManager_->freeInstallList_.emplace_back(info);
250 freeInstallManager_->OnInstallFinished(1, want, userId, startInstallTime);
251
252 for (auto it = freeInstallManager_->freeInstallList_.begin();
253 it != freeInstallManager_->freeInstallList_.end(); it++) {
254 std::string bundleName = (*it).want.GetElement().GetBundleName();
255 std::string abilityName = (*it).want.GetElement().GetAbilityName();
256 if (want.GetElement().GetBundleName().compare(bundleName) == 0 &&
257 want.GetElement().GetAbilityName().compare(abilityName) == 0 &&
258 startInstallTime == (*it).startInstallTime) {
259 EXPECT_EQ((*it).promise->get_future().get(), 1);
260 }
261 }
262 }
263
264 /**
265 * @tc.number: FreeInstall_OnInstallFinished_003
266 * @tc.name: OnInstallFinished
267 * @tc.desc: Test OnInstallFinished failed.
268 */
269 HWTEST_F(FreeInstallTest, FreeInstall_OnInstallFinished_003, TestSize.Level1)
270 {
271 Want want;
272 ElementName element("", "com.test.demo", "MainAbility");
273 want.SetElement(element);
274 const int32_t userId = 1;
275 const int requestCode = 0;
276 int64_t startInstallTime = 0;
277
278 FreeInstallInfo info = freeInstallManager_->BuildFreeInstallInfo(want, userId, requestCode, nullptr);
279 info.isInstalled = true;
280 freeInstallManager_->freeInstallList_.resize(0);
281 freeInstallManager_->freeInstallList_.emplace_back(info);
282 freeInstallManager_->OnInstallFinished(0, want, userId, startInstallTime);
283
284 int size = freeInstallManager_->freeInstallList_.size();
285 EXPECT_EQ(size, 1);
286 }
287
288 /**
289 * @tc.number: FreeInstall_FreeInstallAbilityFromRemote_001
290 * @tc.name: FreeInstallAbilityFromRemote
291 * @tc.desc: Test FreeInstallAbilityFromRemote.
292 */
293 HWTEST_F(FreeInstallTest, FreeInstall_FreeInstallAbilityFromRemote_001, TestSize.Level1)
294 {
295 Want want;
296 ElementName element("", "com.test.demo", "MainAbility");
297 want.SetElement(element);
298 const int32_t userId = 1;
299 const int requestCode = 0;
300
301 int res = freeInstallManager_->FreeInstallAbilityFromRemote(want, nullptr, userId, requestCode);
302 EXPECT_EQ(res, 22);
303 }
304
305 /**
306 * @tc.number: FreeInstall_OnRemoteInstallFinished_001
307 * @tc.name: OnRemoteInstallFinished
308 * @tc.desc: Test OnRemoteInstallFinished.
309 */
310 HWTEST_F(FreeInstallTest, FreeInstall_OnRemoteInstallFinished_001, TestSize.Level1)
311 {
312 Want want;
313 ElementName element("", "com.test.demo", "MainAbility");
314 want.SetElement(element);
315 const int32_t userId = 1;
316 const int requestCode = 0;
317 int64_t startInstallTime = 0;
318
319 FreeInstallInfo info = freeInstallManager_->BuildFreeInstallInfo(want, userId, requestCode, nullptr);
320 freeInstallManager_->freeInstallList_.resize(0);
321 freeInstallManager_->freeInstallList_.emplace_back(info);
322 freeInstallManager_->OnRemoteInstallFinished(0, want, userId, startInstallTime);
323
324 for (auto it = freeInstallManager_->freeInstallList_.begin();
325 it != freeInstallManager_->freeInstallList_.end(); it++) {
326 std::string bundleName = (*it).want.GetElement().GetBundleName();
327 std::string abilityName = (*it).want.GetElement().GetAbilityName();
328 if (want.GetElement().GetBundleName().compare(bundleName) == 0 &&
329 want.GetElement().GetAbilityName().compare(abilityName) == 0 &&
330 startInstallTime == (*it).startInstallTime) {
331 EXPECT_EQ((*it).promise->get_future().get(), 0);
332 }
333 }
334 }
335
336 /**
337 * @tc.number: FreeInstall_ConnectFreeInstall_001
338 * @tc.name: ConnectFreeInstall
339 * @tc.desc: Test ConnectFreeInstall.
340 */
341 HWTEST_F(FreeInstallTest, FreeInstall_ConnectFreeInstall_001, TestSize.Level1)
342 {
343 Want want;
344 ElementName element("", "com.test.demo", "MainAbility");
345 want.SetElement(element);
346 const int32_t userId = 1;
347
348 int res = freeInstallManager_->ConnectFreeInstall(want, userId, nullptr, "");
349 EXPECT_NE(res, 0);
350 }
351 } // namespace AppExecFwk
352 } // namespace OHOS