1ba5c3796Sopenharmony_ci/*
2ba5c3796Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3ba5c3796Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4ba5c3796Sopenharmony_ci * you may not use this file except in compliance with the License.
5ba5c3796Sopenharmony_ci * You may obtain a copy of the License at
6ba5c3796Sopenharmony_ci *
7ba5c3796Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8ba5c3796Sopenharmony_ci *
9ba5c3796Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10ba5c3796Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11ba5c3796Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12ba5c3796Sopenharmony_ci * See the License for the specific language governing permissions and
13ba5c3796Sopenharmony_ci * limitations under the License.
14ba5c3796Sopenharmony_ci */
15ba5c3796Sopenharmony_ci
16ba5c3796Sopenharmony_ci#include "gtest/gtest.h"
17ba5c3796Sopenharmony_ci
18ba5c3796Sopenharmony_ci#include "utils.h"
19ba5c3796Sopenharmony_ci
20ba5c3796Sopenharmony_ci#define private public
21ba5c3796Sopenharmony_ci#define protected public
22ba5c3796Sopenharmony_ci#include "reclaim_priority_constants.h"
23ba5c3796Sopenharmony_ci#include "default_multi_account_strategy.h"
24ba5c3796Sopenharmony_ci#include "multi_account_manager.h"
25ba5c3796Sopenharmony_ci#undef private
26ba5c3796Sopenharmony_ci#undef protected
27ba5c3796Sopenharmony_ci
28ba5c3796Sopenharmony_cinamespace OHOS {
29ba5c3796Sopenharmony_cinamespace Memory {
30ba5c3796Sopenharmony_ciusing namespace testing;
31ba5c3796Sopenharmony_ciusing namespace testing::ext;
32ba5c3796Sopenharmony_ci
33ba5c3796Sopenharmony_ciclass MultiAccountManagerTest : public testing::Test {
34ba5c3796Sopenharmony_cipublic:
35ba5c3796Sopenharmony_ci    static void SetUpTestCase();
36ba5c3796Sopenharmony_ci    static void TearDownTestCase();
37ba5c3796Sopenharmony_ci    void SetUp();
38ba5c3796Sopenharmony_ci    void TearDown();
39ba5c3796Sopenharmony_ci};
40ba5c3796Sopenharmony_ci
41ba5c3796Sopenharmony_civoid MultiAccountManagerTest::SetUpTestCase()
42ba5c3796Sopenharmony_ci{
43ba5c3796Sopenharmony_ci}
44ba5c3796Sopenharmony_ci
45ba5c3796Sopenharmony_civoid MultiAccountManagerTest::TearDownTestCase()
46ba5c3796Sopenharmony_ci{
47ba5c3796Sopenharmony_ci}
48ba5c3796Sopenharmony_ci
49ba5c3796Sopenharmony_civoid MultiAccountManagerTest::SetUp()
50ba5c3796Sopenharmony_ci{
51ba5c3796Sopenharmony_ci}
52ba5c3796Sopenharmony_ci
53ba5c3796Sopenharmony_civoid MultiAccountManagerTest::TearDown()
54ba5c3796Sopenharmony_ci{
55ba5c3796Sopenharmony_ci}
56ba5c3796Sopenharmony_ci
57ba5c3796Sopenharmony_ciHWTEST_F(MultiAccountManagerTest, InitTest, TestSize.Level1)
58ba5c3796Sopenharmony_ci{
59ba5c3796Sopenharmony_ci    MultiAccountManager::GetInstance().Init();
60ba5c3796Sopenharmony_ci}
61ba5c3796Sopenharmony_ci
62ba5c3796Sopenharmony_ciHWTEST_F(MultiAccountManagerTest, SetAccountPrority, TestSize.Level1)
63ba5c3796Sopenharmony_ci{
64ba5c3796Sopenharmony_ci    int accountId = 2;
65ba5c3796Sopenharmony_ci    std::string accountName = "admin";
66ba5c3796Sopenharmony_ci    AccountSA::OsAccountType accountType = AccountSA::OsAccountType::ADMIN;
67ba5c3796Sopenharmony_ci    bool isActived = true;
68ba5c3796Sopenharmony_ci
69ba5c3796Sopenharmony_ci    MultiAccountManager::GetInstance().SetAccountPriority(accountId, accountName, accountType, isActived);
70ba5c3796Sopenharmony_ci    std::shared_ptr<AccountPriorityInfo> info = MultiAccountManager::GetInstance().GetAccountPriorityInfo(accountId);
71ba5c3796Sopenharmony_ci
72ba5c3796Sopenharmony_ci    EXPECT_EQ(info->GetId(), accountId);
73ba5c3796Sopenharmony_ci    EXPECT_STREQ(info->GetName().c_str(), accountName.c_str());
74ba5c3796Sopenharmony_ci    EXPECT_EQ(info->GetType(), accountType);
75ba5c3796Sopenharmony_ci    EXPECT_EQ(info->GetIsActived(), isActived);
76ba5c3796Sopenharmony_ci    EXPECT_EQ(info->GetPriority(), static_cast<int>(DefaultMultiAccountPriority::HIGH_PRIORITY));
77ba5c3796Sopenharmony_ci}
78ba5c3796Sopenharmony_ci
79ba5c3796Sopenharmony_ciHWTEST_F(MultiAccountManagerTest, RecalcBundlePriortiy, TestSize.Level1)
80ba5c3796Sopenharmony_ci{
81ba5c3796Sopenharmony_ci    int accountId = 2;
82ba5c3796Sopenharmony_ci    std::string accountName = "admin";
83ba5c3796Sopenharmony_ci    AccountSA::OsAccountType accountType = AccountSA::OsAccountType::ADMIN;
84ba5c3796Sopenharmony_ci    bool isActived = false;
85ba5c3796Sopenharmony_ci    int bundlePriority = RECLAIM_PRIORITY_FOREGROUND;
86ba5c3796Sopenharmony_ci
87ba5c3796Sopenharmony_ci    MultiAccountManager::GetInstance().SetAccountPriority(accountId, accountName, accountType, isActived);
88ba5c3796Sopenharmony_ci    int recalcPriority = MultiAccountManager::GetInstance().RecalcBundlePriority(accountId, bundlePriority);
89ba5c3796Sopenharmony_ci
90ba5c3796Sopenharmony_ci    EXPECT_EQ(recalcPriority, RECLAIM_PRIORITY_FOREGROUND + 50);
91ba5c3796Sopenharmony_ci}
92ba5c3796Sopenharmony_ci
93ba5c3796Sopenharmony_ciHWTEST_F(MultiAccountManagerTest, AccountColdSwitch, TestSize.Level1)
94ba5c3796Sopenharmony_ci{
95ba5c3796Sopenharmony_ci    int accountId = 100;
96ba5c3796Sopenharmony_ci    std::shared_ptr<AccountBundleInfo> account = std::make_shared<AccountBundleInfo>(accountId);
97ba5c3796Sopenharmony_ci    std::shared_ptr<BundlePriorityInfo> bundle = std::make_shared<BundlePriorityInfo>("app",
98ba5c3796Sopenharmony_ci            accountId * USER_ID_SHIFT + 1, 100);
99ba5c3796Sopenharmony_ci    ProcessPriorityInfo proc1(1001, bundle->uid_, bundle->priority_);
100ba5c3796Sopenharmony_ci    ProcessPriorityInfo proc2(1002, bundle->uid_, bundle->priority_);
101ba5c3796Sopenharmony_ci    ProcessPriorityInfo proc3(1003, bundle->uid_, bundle->priority_);
102ba5c3796Sopenharmony_ci    ProcessPriorityInfo proc4(1004, bundle->uid_, bundle->priority_);
103ba5c3796Sopenharmony_ci
104ba5c3796Sopenharmony_ci    std::map<int, std::shared_ptr<AccountBundleInfo>> osAccountsInfoMap;
105ba5c3796Sopenharmony_ci    bundle->AddProc(proc1);
106ba5c3796Sopenharmony_ci    bundle->AddProc(proc2);
107ba5c3796Sopenharmony_ci    bundle->AddProc(proc3);
108ba5c3796Sopenharmony_ci    bundle->AddProc(proc4);
109ba5c3796Sopenharmony_ci    account->AddBundleToOsAccount(bundle);
110ba5c3796Sopenharmony_ci    osAccountsInfoMap.insert(std::make_pair(account->id_, account));
111ba5c3796Sopenharmony_ci
112ba5c3796Sopenharmony_ci    std::vector<int> switchedIds { accountId };
113ba5c3796Sopenharmony_ci    MultiAccountManager::GetInstance().HandleAccountColdSwitch(switchedIds, osAccountsInfoMap);
114ba5c3796Sopenharmony_ci}
115ba5c3796Sopenharmony_ci
116ba5c3796Sopenharmony_ciHWTEST_F(MultiAccountManagerTest, AccountHotSwitch, TestSize.Level1)
117ba5c3796Sopenharmony_ci{
118ba5c3796Sopenharmony_ci    int accountId = 100;
119ba5c3796Sopenharmony_ci    std::shared_ptr<AccountBundleInfo> account = std::make_shared<AccountBundleInfo>(accountId);
120ba5c3796Sopenharmony_ci    std::shared_ptr<BundlePriorityInfo> bundle = std::make_shared<BundlePriorityInfo>("app",
121ba5c3796Sopenharmony_ci            accountId * USER_ID_SHIFT + 1, 100);
122ba5c3796Sopenharmony_ci    ProcessPriorityInfo proc1(1001, bundle->uid_, bundle->priority_);
123ba5c3796Sopenharmony_ci    ProcessPriorityInfo proc2(1002, bundle->uid_, bundle->priority_);
124ba5c3796Sopenharmony_ci    ProcessPriorityInfo proc3(1003, bundle->uid_, bundle->priority_);
125ba5c3796Sopenharmony_ci    ProcessPriorityInfo proc4(1004, bundle->uid_, bundle->priority_);
126ba5c3796Sopenharmony_ci
127ba5c3796Sopenharmony_ci    std::map<int, std::shared_ptr<AccountBundleInfo>> osAccountsInfoMap;
128ba5c3796Sopenharmony_ci    bundle->AddProc(proc1);
129ba5c3796Sopenharmony_ci    bundle->AddProc(proc2);
130ba5c3796Sopenharmony_ci    bundle->AddProc(proc3);
131ba5c3796Sopenharmony_ci    bundle->AddProc(proc4);
132ba5c3796Sopenharmony_ci    account->AddBundleToOsAccount(bundle);
133ba5c3796Sopenharmony_ci    osAccountsInfoMap.insert(std::make_pair(account->id_, account));
134ba5c3796Sopenharmony_ci
135ba5c3796Sopenharmony_ci    std::string accountName = "admin";
136ba5c3796Sopenharmony_ci    AccountSA::OsAccountType accountType = AccountSA::OsAccountType::ADMIN;
137ba5c3796Sopenharmony_ci    bool isActived = false;
138ba5c3796Sopenharmony_ci    MultiAccountManager::GetInstance().SetAccountPriority(accountId, accountName, accountType, isActived);
139ba5c3796Sopenharmony_ci
140ba5c3796Sopenharmony_ci    std::vector<int> switchedIds { accountId };
141ba5c3796Sopenharmony_ci    MultiAccountManager::GetInstance().HandleAccountHotSwitch(switchedIds, osAccountsInfoMap);
142ba5c3796Sopenharmony_ci
143ba5c3796Sopenharmony_ci    EXPECT_EQ(bundle->priority_, 150);
144ba5c3796Sopenharmony_ci}
145ba5c3796Sopenharmony_ci
146ba5c3796Sopenharmony_ci/**
147ba5c3796Sopenharmony_ci * @tc.name: AddAccountPriorityInfo
148ba5c3796Sopenharmony_ci * @tc.desc: Test add value include id_  name_  type_  isActived_
149ba5c3796Sopenharmony_ci * @tc.type: FUNC
150ba5c3796Sopenharmony_ci */
151ba5c3796Sopenharmony_ciHWTEST_F(MultiAccountManagerTest, AddAccountPriorityInfoTest, TestSize.Level1)
152ba5c3796Sopenharmony_ci{
153ba5c3796Sopenharmony_ci    int accountId = 3;
154ba5c3796Sopenharmony_ci    std::string accountName = "admin";
155ba5c3796Sopenharmony_ci    AccountSA::OsAccountType accountType = AccountSA::OsAccountType::ADMIN;
156ba5c3796Sopenharmony_ci    bool isActived = true;
157ba5c3796Sopenharmony_ci
158ba5c3796Sopenharmony_ci    MultiAccountManager::GetInstance().SetAccountPriority(accountId, accountName, accountType, isActived);
159ba5c3796Sopenharmony_ci    std::shared_ptr<AccountPriorityInfo> accountInfo =
160ba5c3796Sopenharmony_ci        MultiAccountManager::GetInstance().GetAccountPriorityInfo(accountId);
161ba5c3796Sopenharmony_ci    MultiAccountManager::GetInstance().AddAccountPriorityInfo(accountInfo);
162ba5c3796Sopenharmony_ci    EXPECT_EQ(accountInfo->GetId(), accountId);
163ba5c3796Sopenharmony_ci    EXPECT_STREQ(accountInfo->GetName().c_str(), accountName.c_str());
164ba5c3796Sopenharmony_ci    EXPECT_EQ(accountInfo->GetType(), accountType);
165ba5c3796Sopenharmony_ci    EXPECT_EQ(accountInfo->GetIsActived(), isActived);
166ba5c3796Sopenharmony_ci}
167ba5c3796Sopenharmony_ci
168ba5c3796Sopenharmony_ci/**
169ba5c3796Sopenharmony_ci * @tc.name: SetMultiAccountStrategy and GetMultiAccountStratgy
170ba5c3796Sopenharmony_ci * @tc.desc: Test set value of strategy_ equals to nullptr
171ba5c3796Sopenharmony_ci * @tc.desc: Test get value of strategy_
172ba5c3796Sopenharmony_ci * @tc.type: FUNC
173ba5c3796Sopenharmony_ci */
174ba5c3796Sopenharmony_ciHWTEST_F(MultiAccountManagerTest, SetMultiAccountStrategyTest, TestSize.Level1)
175ba5c3796Sopenharmony_ci{
176ba5c3796Sopenharmony_ci    // strategy_ equals to nullptr
177ba5c3796Sopenharmony_ci    std::shared_ptr<MultiAccountStrategy> strategy = nullptr;
178ba5c3796Sopenharmony_ci    bool retMul = MultiAccountManager::GetInstance().SetMultiAccountStrategy(strategy);
179ba5c3796Sopenharmony_ci    EXPECT_EQ(retMul, false);
180ba5c3796Sopenharmony_ci
181ba5c3796Sopenharmony_ci    // set and get value of strategy_
182ba5c3796Sopenharmony_ci    strategy = MultiAccountManager::GetInstance().GetMultiAccountStratgy();
183ba5c3796Sopenharmony_ci    retMul = MultiAccountManager::GetInstance().SetMultiAccountStrategy(strategy);
184ba5c3796Sopenharmony_ci    EXPECT_EQ(retMul, true);
185ba5c3796Sopenharmony_ci}
186ba5c3796Sopenharmony_ci
187ba5c3796Sopenharmony_ci/**
188ba5c3796Sopenharmony_ci * @tc.name: GetSwitchedAccountIds
189ba5c3796Sopenharmony_ci * @tc.desc: test GetSwitchedAccountIds into for and if branch
190ba5c3796Sopenharmony_ci * @tc.type: FUNC
191ba5c3796Sopenharmony_ci */
192ba5c3796Sopenharmony_ciHWTEST_F(MultiAccountManagerTest, GetSwitchedAccountIdsTest, TestSize.Level1)
193ba5c3796Sopenharmony_ci{
194ba5c3796Sopenharmony_ci    MultiAccountManager oldAct;
195ba5c3796Sopenharmony_ci    oldAct.oldActiveAccountIds_ = {1, 3, 5, 7, 9};
196ba5c3796Sopenharmony_ci    std::vector<int> accountIds;
197ba5c3796Sopenharmony_ci    std::vector<int> accountIds1 = {1, 3, 5, 7, 9};
198ba5c3796Sopenharmony_ci    oldAct.GetSwitchedAccountIds(accountIds);
199ba5c3796Sopenharmony_ci    EXPECT_EQ(accountIds, accountIds1);
200ba5c3796Sopenharmony_ci}
201ba5c3796Sopenharmony_ci
202ba5c3796Sopenharmony_ci/**
203ba5c3796Sopenharmony_ci * @tc.name: UpdateAccountPriorityInfo
204ba5c3796Sopenharmony_ci * @tc.desc: test UpdateAccountPriorityInfoTest into for and if branch
205ba5c3796Sopenharmony_ci * @tc.type: FUNC
206ba5c3796Sopenharmony_ci */
207ba5c3796Sopenharmony_ciHWTEST_F(MultiAccountManagerTest, UpdateAccountPriorityInfoTest, TestSize.Level1)
208ba5c3796Sopenharmony_ci{
209ba5c3796Sopenharmony_ci    std::vector<int> accountIds;
210ba5c3796Sopenharmony_ci    EXPECT_EQ(MultiAccountManager::GetInstance().UpdateAccountPriorityInfo(accountIds), true);
211ba5c3796Sopenharmony_ci    std::vector<int> accountIds1 = {1, 3, 5, 7, 9};
212ba5c3796Sopenharmony_ci    EXPECT_EQ(MultiAccountManager::GetInstance().UpdateAccountPriorityInfo(accountIds1), false);
213ba5c3796Sopenharmony_ci}
214ba5c3796Sopenharmony_ci
215ba5c3796Sopenharmony_ci/**
216ba5c3796Sopenharmony_ci * @tc.name: HandleOsAccountsChanged
217ba5c3796Sopenharmony_ci * @tc.desc: test initialized_ == false
218ba5c3796Sopenharmony_ci * @tc.desc: test the branch of UpdateAccountPriorityInfo(updatedAccountIds) equals to false
219ba5c3796Sopenharmony_ci * @tc.desc: test the branch of switchMod equals to AccountSA::COLD_SWITCH
220ba5c3796Sopenharmony_ci * @tc.desc: test the branch of switchMod equals to AccountSA::HOT_SWITCH
221ba5c3796Sopenharmony_ci * @tc.type: FUNC
222ba5c3796Sopenharmony_ci */
223ba5c3796Sopenharmony_ciHWTEST_F(MultiAccountManagerTest, HandleOsAccountsChangedTest, TestSize.Level1)
224ba5c3796Sopenharmony_ci{
225ba5c3796Sopenharmony_ci    MultiAccountManager mulAcc;
226ba5c3796Sopenharmony_ci    mulAcc.initialized_ = false;
227ba5c3796Sopenharmony_ci    int accountId = 100;
228ba5c3796Sopenharmony_ci    AccountSA::OS_ACCOUNT_SWITCH_MOD switchMod1 = AccountSA::OsAccountManager::GetOsAccountSwitchMod();
229ba5c3796Sopenharmony_ci    AccountSA::OS_ACCOUNT_SWITCH_MOD switchMod2 = AccountSA::COLD_SWITCH;
230ba5c3796Sopenharmony_ci    AccountSA::OS_ACCOUNT_SWITCH_MOD switchMod3 = AccountSA::HOT_SWITCH;
231ba5c3796Sopenharmony_ci    std::map<int, std::shared_ptr<AccountBundleInfo>> osAccountsInfoMap;
232ba5c3796Sopenharmony_ci
233ba5c3796Sopenharmony_ci    // the branch of test initialized_ equals to false
234ba5c3796Sopenharmony_ci    bool ret = mulAcc.HandleOsAccountsChanged(accountId, switchMod1, osAccountsInfoMap);
235ba5c3796Sopenharmony_ci    EXPECT_EQ(ret, false);
236ba5c3796Sopenharmony_ci
237ba5c3796Sopenharmony_ci    // the branch of UpdateAccountPriorityInfo(updatedAccountIds) equals to false
238ba5c3796Sopenharmony_ci    ret = mulAcc.HandleOsAccountsChanged(accountId, switchMod1, osAccountsInfoMap);
239ba5c3796Sopenharmony_ci    EXPECT_EQ(ret, false);
240ba5c3796Sopenharmony_ci
241ba5c3796Sopenharmony_ci    // the branch of switchMod equals to AccountSA::COLD_SWITCH
242ba5c3796Sopenharmony_ci    ret = MultiAccountManager::GetInstance().HandleOsAccountsChanged(accountId, switchMod2, osAccountsInfoMap);
243ba5c3796Sopenharmony_ci    EXPECT_EQ(ret, true);
244ba5c3796Sopenharmony_ci
245ba5c3796Sopenharmony_ci    // the branch of switchMod equals to AccountSA::HOT_SWITCH
246ba5c3796Sopenharmony_ci    ret = MultiAccountManager::GetInstance().HandleOsAccountsChanged(accountId, switchMod3, osAccountsInfoMap);
247ba5c3796Sopenharmony_ci    EXPECT_EQ(ret, true);
248ba5c3796Sopenharmony_ci}
249ba5c3796Sopenharmony_ci
250ba5c3796Sopenharmony_ci}
251ba5c3796Sopenharmony_ci}
252