• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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