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 #define LOG_TAG "AccountDelegateTest"
17 #include <gtest/gtest.h>
18 #include <memory.h>
19 #include "account_delegate.h"
20 #include "account_delegate_impl.h"
21 #include "account_delegate_normal_impl.h"
22 #include "ipc_skeleton.h"
23 #include "ohos_account_kits.h"
24 #include "os_account_manager.h"
25 #include "log_print.h"
26 namespace {
27 using namespace OHOS::DistributedKv;
28 using namespace testing::ext;
29 class AccountObserver : public AccountDelegate::Observer {
30 public:
OnAccountChanged(const AccountEventInfo & info)31     void OnAccountChanged(const AccountEventInfo &info) override
32     {
33     }
34     // must specify unique name for observer
Name()35     std::string Name() override
36     {
37         return name_;
38     }
39 
GetLevel()40     LevelType GetLevel() override
41     {
42         return LevelType::LOW;
43     }
44 
SetName(const std::string & name)45     void SetName(const std::string &name)
46     {
47         name_ = name;
48     }
49 private:
50     std::string name_ = "accountTestObserver";
51 };
52 
53 class AccountDelegateTest : public testing::Test {
54 public:
SetUpTestCase(void)55     static void SetUpTestCase(void) {}
TearDownTestCase(void)56     static void TearDownTestCase(void) {}
SetUp()57     void SetUp() {}
TearDown()58     void TearDown() {}
59 
60 protected:
61     static const std::string DEFAULT_OHOS_ACCOUNT_UID;
62     static const uint32_t INVALID_TOKEN_ID;
63     static const int32_t INVALID_USER;
64     static const int userId;
65 };
66 const std::string AccountDelegateTest::DEFAULT_OHOS_ACCOUNT_UID = "ohosAnonymousUid";
67 const uint32_t AccountDelegateTest::INVALID_TOKEN_ID = -1;
68 const int32_t AccountDelegateTest::INVALID_USER = -1;
69 const int AccountDelegateTest::userId = 100;
70 
71 /**
72 * @tc.name: Subscribe001
73 * @tc.desc: subscribe user change, the observer is invalid
74 * @tc.type: FUNC
75 * @tc.require: AR000D08K2 AR000CQDUM
76 * @tc.author: hongbo
77 */
78 HWTEST_F(AccountDelegateTest, Subscribe001, TestSize.Level0)
79 {
80     auto account = AccountDelegate::GetInstance();
81     EXPECT_NE(account, nullptr);
82     auto status = account->Subscribe(nullptr);
83     EXPECT_EQ(status, Status::INVALID_ARGUMENT);
84     auto observer = std::make_shared<AccountObserver>();
85     observer->SetName("");
86     status = account->Subscribe(observer);
87     EXPECT_EQ(status, Status::INVALID_ARGUMENT);
88 }
89 
90 /**
91 * @tc.name: Subscribe002
92 * @tc.desc: subscribe user change
93 * @tc.type: FUNC
94 * @tc.require:
95 * @tc.author: zuojiangjiang
96 */
97 HWTEST_F(AccountDelegateTest, Subscribe002, TestSize.Level0)
98 {
99     auto account = AccountDelegate::GetInstance();
100     EXPECT_NE(account, nullptr);
101     auto observer = std::make_shared<AccountObserver>();
102     auto status = account->Subscribe(observer);
103     EXPECT_EQ(status, Status::SUCCESS);
104     observer->SetName("Subscribe002Observer");
105     status = account->Subscribe(observer);
106     EXPECT_EQ(status, Status::SUCCESS);
107 }
108 
109 /**
110 * @tc.name: Subscribe003
111 * @tc.desc: subscribe user change, the observer is invalid
112 * @tc.type: FUNC
113 * @tc.author: nhj
114 */
115 HWTEST_F(AccountDelegateTest, Subscribe003, TestSize.Level0)
116 {
117     auto account = AccountDelegate::GetInstance();
118     EXPECT_NE(account, nullptr);
119     auto observer = std::make_shared<AccountObserver>();
120     auto status = account->Subscribe(observer);
121     EXPECT_EQ(status, Status::INVALID_ARGUMENT);
122     observer->SetName("Subscribe003Observer");
123     status = account->Subscribe(observer);
124     EXPECT_EQ(status, Status::SUCCESS);
125     observer->SetName("Subscribe002ObserverAfter");
126     status = account->Subscribe(observer);
127     EXPECT_EQ(status, Status::SUCCESS);
128 }
129 
130 /**
131 * @tc.name: Unsubscribe001
132 * @tc.desc: unsubscribe user change, the observer is invalid
133 * @tc.type: FUNC
134 * @tc.require:
135 * @tc.author: zuojiangjiang
136 */
137 HWTEST_F(AccountDelegateTest, Unsubscribe001, TestSize.Level0)
138 {
139     auto account = AccountDelegate::GetInstance();
140     EXPECT_NE(account, nullptr);
141     auto status = account->Unsubscribe(nullptr);
142     EXPECT_EQ(status, Status::INVALID_ARGUMENT);
143     auto observer = std::make_shared<AccountObserver>();
144     observer->SetName("");
145     status = account->Unsubscribe(observer);
146     EXPECT_EQ(status, Status::INVALID_ARGUMENT);
147     observer->SetName("Unsubscribe001Observer");
148     status = account->Unsubscribe(observer);
149     EXPECT_EQ(status, Status::INVALID_ARGUMENT);
150 }
151 
152 /**
153 * @tc.name: Unsubscribe002
154 * @tc.desc: unsubscribe user change
155 * @tc.type: FUNC
156 * @tc.require:
157 * @tc.author: zuojiangjiang
158 */
159 HWTEST_F(AccountDelegateTest, Unsubscribe002, TestSize.Level0)
160 {
161     auto account = AccountDelegate::GetInstance();
162     EXPECT_NE(account, nullptr);
163     auto observer = std::make_shared<AccountObserver>();
164     account->Subscribe(observer);
165     auto status = account->Unsubscribe(observer);
166     EXPECT_EQ(status, Status::SUCCESS);
167     observer->SetName("Unsubscribe002ObserverPre");
168     status = account->Subscribe(observer);
169     EXPECT_EQ(status, Status::SUCCESS);
170     observer->SetName("Unsubscribe002ObserverAfter");
171     status = account->Subscribe(observer);
172     EXPECT_EQ(status, Status::SUCCESS);
173     status = account->Unsubscribe(observer);
174     EXPECT_EQ(status, Status::SUCCESS);
175     observer->SetName("Unsubscribe002ObserverPre");
176     status = account->Unsubscribe(observer);
177     EXPECT_EQ(status, Status::SUCCESS);
178 }
179 
180 /**
181 * @tc.name: GetCurrentAccountId
182 * @tc.desc: get current account Id
183 * @tc.type: FUNC
184 * @tc.require:
185 * @tc.author: zuojiangjiang
186 */
187 HWTEST_F(AccountDelegateTest, GetCurrentAccountId, TestSize.Level0)
188 {
189     auto accountId = AccountDelegate::GetInstance()->GetCurrentAccountId();
190     EXPECT_EQ(accountId, DEFAULT_OHOS_ACCOUNT_UID);
191 }
192 
193 /**
194 * @tc.name: GetUserByToken
195 * @tc.desc: get user by token
196 * @tc.type: FUNC
197 * @tc.require:
198 * @tc.author: zuojiangjiang
199 */
200 HWTEST_F(AccountDelegateTest, GetUserByToken, TestSize.Level0)
201 {
202     auto user = AccountDelegate::GetInstance()->GetUserByToken(INVALID_TOKEN_ID);
203     EXPECT_EQ(user, INVALID_USER);
204     user = AccountDelegate::GetInstance()->GetUserByToken(OHOS::IPCSkeleton::GetCallingTokenID());
205     EXPECT_EQ(user, 0);
206 }
207 
208 /**
209 * @tc.name: QueryUsers
210 * @tc.desc: query users
211 * @tc.type: FUNC
212 * @tc.require:
213 * @tc.author: zuojiangjiang
214 */
215 HWTEST_F(AccountDelegateTest, QueryUsers, TestSize.Level0)
216 {
217     std::vector<int32_t> users;
218     AccountDelegate::GetInstance()->QueryUsers(users);
219     EXPECT_GT(users.size(), 0);
220 }
221 
222 /**
223 * @tc.name: IsVerified
224 * @tc.desc: query users
225 * @tc.type: FUNC
226 * @tc.author: nhj
227 */
228 HWTEST_F(AccountDelegateTest, IsVerified, TestSize.Level0)
229 {
230     auto user = AccountDelegate::GetInstance()->IsVerified(userId);
231     EXPECT_EQ(user, true);
232 }
233 
234 /**
235 * @tc.name: UnsubscribeAccountEvent
236 * @tc.desc: get current account Id
237 * @tc.type: FUNC
238 * @tc.author: nhj
239 */
240 HWTEST_F(AccountDelegateTest, UnsubscribeAccountEvent, TestSize.Level0)
241 {
242     auto account = AccountDelegate::GetInstance();
243     auto observer = std::make_shared<AccountObserver>();
244     account->Subscribe(observer);
245     auto executor = std::make_shared<OHOS::ExecutorPool>(12, 5);
246     AccountDelegate::GetInstance()->UnsubscribeAccountEvent();
247     AccountDelegate::GetInstance()->BindExecutor(executor);
248     auto status = account->Unsubscribe(observer);
249     EXPECT_EQ(status, Status::SUCCESS);
250 }
251 
252 /**
253 * @tc.name: QueryForegroundUsers
254 * @tc.desc: query foreground users
255 * @tc.type: FUNC
256 * @tc.require:
257 * @tc.author: ht
258 */
259 HWTEST_F(AccountDelegateTest, QueryForegroundUsers, TestSize.Level0)
260 {
261     std::vector<int32_t> users;
262     EXPECT_TRUE(AccountDelegate::GetInstance()->QueryForegroundUsers(users));
263     std::vector<OHOS::AccountSA::ForegroundOsAccount> accounts;
264     OHOS::AccountSA::OsAccountManager::GetForegroundOsAccounts(accounts);
265     EXPECT_EQ(accounts.size(), users.size());
266     for (int i = 0; i < users.size(); i++) {
267         EXPECT_EQ(users[i], accounts[i].localId);
268     }
269 }
270 } // namespace
271