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 #include "user_idm_database_test.h"
16
17 #include "mock_iuser_auth_interface.h"
18 #include "user_idm_database_impl.h"
19 namespace OHOS {
20 namespace UserIam {
21 namespace UserAuth {
22 using namespace testing;
23 using namespace testing::ext;
24
25 using HdiCredentialInfo = OHOS::HDI::UserAuth::V1_0::CredentialInfo;
26 using HDIEnrolledInfo = OHOS::HDI::UserAuth::V1_0::EnrolledInfo;
27 using HdiAuthType = OHOS::HDI::UserAuth::V1_0::AuthType;
28
SetUpTestCase()29 void UserIdmDatabaseTest::SetUpTestCase()
30 {
31 }
32
TearDownTestCase()33 void UserIdmDatabaseTest::TearDownTestCase()
34 {
35 }
36
SetUp()37 void UserIdmDatabaseTest::SetUp()
38 {
39 MockIUserAuthInterface::Holder::GetInstance().Reset();
40 }
41
TearDown()42 void UserIdmDatabaseTest::TearDown()
43 {
44 MockIUserAuthInterface::Holder::GetInstance().Reset();
45 }
46
47 HWTEST_F(UserIdmDatabaseTest, FailedGetSecUserInfo, TestSize.Level0)
48 {
49 auto mock = MockIUserAuthInterface::Holder::GetInstance().Get();
50 EXPECT_CALL(*mock, GetUserInfo(_, _, _, _)).WillRepeatedly(Return(1));
51 auto &database = UserIdmDatabase::Instance();
52 constexpr int32_t USER_ID = 100;
53 auto secUserInfo = database.GetSecUserInfo(USER_ID);
54 EXPECT_EQ(secUserInfo, nullptr);
55 }
56
57 HWTEST_F(UserIdmDatabaseTest, FailedGetSecUserInfoNoPin, TestSize.Level0)
58 {
59 auto mock = MockIUserAuthInterface::Holder::GetInstance().Get();
60 constexpr int32_t USER_ID = 100;
61 constexpr uint64_t SECURE_UID = 200;
__anon68fd97e90102(std::vector<HDIEnrolledInfo> &list) 62 auto fillUpInfos = [](std::vector<HDIEnrolledInfo> &list) {
63 std::vector<HDIEnrolledInfo> infos = {};
64 HDIEnrolledInfo info1 = {
65 .enrolledId = 0,
66 .authType = static_cast<HdiAuthType>(2),
67 };
68 infos.emplace_back((info1));
69 list.swap(infos);
70 };
71
72 EXPECT_CALL(*mock, GetUserInfo(USER_ID, _, _, _))
73 .WillRepeatedly(DoAll(SetArgReferee<1>(SECURE_UID), WithArg<3>(fillUpInfos), Return(0)));
74
75 auto &database = UserIdmDatabase::Instance();
76 auto secUserInfo = database.GetSecUserInfo(USER_ID);
77
78 EXPECT_NE(secUserInfo, nullptr);
79 }
80
81 HWTEST_F(UserIdmDatabaseTest, FailedGetSecUserInfoNoEnrolledInfo, TestSize.Level0)
82 {
83 auto mock = MockIUserAuthInterface::Holder::GetInstance().Get();
84 constexpr int32_t USER_ID = 100;
85 constexpr uint64_t SECURE_UID = 200;
__anon68fd97e90202(std::vector<HDIEnrolledInfo> &list) 86 auto fillUpInfos = [](std::vector<HDIEnrolledInfo> &list) {
87 std::vector<HDIEnrolledInfo> infos = {};
88 list.swap(infos);
89 };
90
91 EXPECT_CALL(*mock, GetUserInfo(USER_ID, _, _, _))
92 .WillRepeatedly(DoAll(SetArgReferee<1>(SECURE_UID), WithArg<3>(fillUpInfos), Return(0)));
93
94 auto secUserInfo = UserIdmDatabase::Instance().GetSecUserInfo(USER_ID);
95
96 // test EnrolledInfo is null
97 EXPECT_NE(secUserInfo, nullptr);
98 }
99
100 HWTEST_F(UserIdmDatabaseTest, SuccessfulGetSecUserInfo, TestSize.Level0)
101 {
102 auto mock = MockIUserAuthInterface::Holder::GetInstance().Get();
103 constexpr int32_t USER_ID = 100;
104 constexpr uint64_t SECURE_UID = 200;
105 constexpr PinSubType PIN_SUB_TYPE = PIN_NUMBER;
__anon68fd97e90302(std::vector<HDIEnrolledInfo> &list) 106 auto fillUpInfos = [](std::vector<HDIEnrolledInfo> &list) {
107 std::vector<HDIEnrolledInfo> infos = {};
108 HDIEnrolledInfo info1 = {
109 .enrolledId = 0,
110 .authType = static_cast<HdiAuthType>(1),
111 };
112 infos.emplace_back((info1));
113 HDIEnrolledInfo info2 = {
114 .enrolledId = 1,
115 .authType = static_cast<HdiAuthType>(2),
116 };
117 infos.emplace_back((info2));
118 list.swap(infos);
119 };
120
121 using HdiPinSubType = OHOS::HDI::UserAuth::V1_0::PinSubType;
122 EXPECT_CALL(*mock, GetUserInfo(USER_ID, _, _, _))
123 .WillRepeatedly(DoAll(SetArgReferee<1>(SECURE_UID), SetArgReferee<2>(static_cast<HdiPinSubType>(PIN_SUB_TYPE)),
124 WithArg<3>(fillUpInfos), Return(0)));
125
126 auto &database = UserIdmDatabase::Instance();
127 auto secUserInfo = database.GetSecUserInfo(USER_ID);
128 EXPECT_NE(secUserInfo, nullptr);
129 EXPECT_EQ(USER_ID, secUserInfo->GetUserId());
130 EXPECT_EQ(SECURE_UID, secUserInfo->GetSecUserId());
131 EXPECT_EQ(PIN_SUB_TYPE, secUserInfo->GetPinSubType());
132 EXPECT_EQ(2U, secUserInfo->GetEnrolledInfo().size());
133 }
134
135 HWTEST_F(UserIdmDatabaseTest, FailedGetCredentialInfoVector, TestSize.Level0)
136 {
137 auto mock = MockIUserAuthInterface::Holder::GetInstance().Get();
138 // mock hdi interface return 1
139 constexpr int32_t USER_ID = 100;
140 AuthType authType = PIN;
141 EXPECT_CALL(*mock, GetCredential(_, _, _)).WillRepeatedly(Return(1));
142 auto &database = UserIdmDatabase::Instance();
143 std::vector<std::shared_ptr<CredentialInfo>> info = {};
144 auto infoRet = database.GetCredentialInfo(USER_ID, authType);
145 EXPECT_EQ(infoRet.size(), 0U);
146 }
147
148 HWTEST_F(UserIdmDatabaseTest, SuccessfulGetCredentialInfoVector, TestSize.Level0)
149 {
150 auto mock = MockIUserAuthInterface::Holder::GetInstance().Get();
151 constexpr int32_t USER_ID = 100;
152 HdiAuthType authType = HdiAuthType::PIN;
153 // mock hdi interface return 0
__anon68fd97e90402(std::vector<HdiCredentialInfo> &list) 154 auto fillUpInfos = [](std::vector<HdiCredentialInfo> &list) {
155 std::vector<HdiCredentialInfo> infos = {};
156 HdiCredentialInfo temp1 = {
157 .credentialId = 1,
158 .executorIndex = 2,
159 .templateId = 3,
160 .authType = static_cast<HdiAuthType>(1),
161 .executorMatcher = 2,
162 .executorSensorHint = 3,
163 };
164 infos.push_back(temp1);
165 HdiCredentialInfo temp2 = {
166 .credentialId = 2,
167 .executorIndex = 3,
168 .templateId = 4,
169 .authType = static_cast<HdiAuthType>(1),
170 .executorMatcher = 3,
171 .executorSensorHint = 2,
172 };
173 infos.push_back(temp2);
174 list.swap(infos);
175 };
176 EXPECT_CALL(*mock, GetCredential(USER_ID, authType, _)).WillRepeatedly(DoAll(WithArg<2>(fillUpInfos), Return(0)));
177 auto &database = UserIdmDatabase::Instance();
178 AuthType authType1 = PIN;
179 auto info = database.GetCredentialInfo(USER_ID, authType1);
180
181 // test return result
182 EXPECT_EQ(info.size(), 2U);
183
184 // test temp1
185 EXPECT_EQ(USER_ID, info[0]->GetUserId());
186 EXPECT_EQ(1U, info[0]->GetCredentialId());
187 EXPECT_EQ(2U, info[0]->GetExecutorIndex());
188 EXPECT_EQ(3U, info[0]->GetTemplateId());
189 EXPECT_EQ(static_cast<AuthType>(1), info[0]->GetAuthType());
190 EXPECT_EQ(3U, info[0]->GetExecutorSensorHint());
191 EXPECT_EQ(2U, info[0]->GetExecutorMatcher());
192
193 // test temp2
194 EXPECT_EQ(USER_ID, info[1]->GetUserId());
195 EXPECT_EQ(2U, info[1]->GetCredentialId());
196 EXPECT_EQ(3U, info[1]->GetExecutorIndex());
197 EXPECT_EQ(4U, info[1]->GetTemplateId());
198 EXPECT_EQ(static_cast<AuthType>(1), info[1]->GetAuthType());
199 EXPECT_EQ(2U, info[1]->GetExecutorSensorHint());
200 EXPECT_EQ(3U, info[1]->GetExecutorMatcher());
201 }
202
203 HWTEST_F(UserIdmDatabaseTest, DeleteCredentialInfo001, TestSize.Level0)
204 {
205 int32_t testUserId = 4501;
206 uint64_t testCredentialId = 87841;
207 std::vector<uint8_t> testAuthToken = {1, 2, 3, 4};
208 std::shared_ptr<CredentialInfo> testCredInfo = nullptr;
209
210 auto mockHdi = MockIUserAuthInterface::Holder::GetInstance().Get();
211 EXPECT_NE(mockHdi, nullptr);
212 EXPECT_CALL(*mockHdi, DeleteCredential(_, _, _, _)).WillRepeatedly(Return(1));
213 int32_t result = UserIdmDatabase::Instance().DeleteCredentialInfo(testUserId, testCredentialId,
214 testAuthToken, testCredInfo);
215 EXPECT_EQ(result, 1);
216 }
217
218 HWTEST_F(UserIdmDatabaseTest, DeleteCredentialInfo002, TestSize.Level0)
219 {
220 int32_t testUserId = 4501;
221 uint64_t testCredentialId = 87841;
222 std::vector<uint8_t> testAuthToken = {1, 2, 3, 4};
223 std::shared_ptr<CredentialInfo> testCredInfo = nullptr;
224
225 auto mockHdi = MockIUserAuthInterface::Holder::GetInstance().Get();
226 EXPECT_NE(mockHdi, nullptr);
227 EXPECT_CALL(*mockHdi, DeleteCredential(_, _, _, _)).Times(1);
228 ON_CALL(*mockHdi, DeleteCredential)
229 .WillByDefault(
__anon68fd97e90502(int32_t userId, uint64_t credentialId, const std::vector<uint8_t> &authToken, HdiCredentialInfo &info) 230 [](int32_t userId, uint64_t credentialId, const std::vector<uint8_t> &authToken, HdiCredentialInfo &info) {
231 info.authType = static_cast<HdiAuthType>(1);
232 info.credentialId = 10;
233 info.executorIndex = 20;
234 info.executorMatcher = 30;
235 info.executorSensorHint = 40;
236 info.templateId = 50;
237 return HDF_SUCCESS;
238 }
239 );
240 int32_t result = UserIdmDatabase::Instance().DeleteCredentialInfo(testUserId, testCredentialId,
241 testAuthToken, testCredInfo);
242 EXPECT_EQ(result, SUCCESS);
243 EXPECT_NE(testCredInfo, nullptr);
244 EXPECT_EQ(testCredInfo->GetAuthType(), PIN);
245 EXPECT_EQ(testCredInfo->GetCredentialId(), 10);
246 EXPECT_EQ(testCredInfo->GetExecutorIndex(), 20);
247 EXPECT_EQ(testCredInfo->GetExecutorMatcher(), 30);
248 EXPECT_EQ(testCredInfo->GetExecutorSensorHint(), 40);
249 EXPECT_EQ(testCredInfo->GetTemplateId(), 50);
250 EXPECT_EQ(testCredInfo->GetUserId(), testUserId);
251 }
252
253 HWTEST_F(UserIdmDatabaseTest, DeleteUser001, TestSize.Level0)
254 {
255 int32_t testUserId = 4501;
256 std::vector<uint8_t> testAuthToken = {1, 2, 3, 4};
257 std::vector<std::shared_ptr<CredentialInfo>> testCredInfos;
258
259 auto mockHdi = MockIUserAuthInterface::Holder::GetInstance().Get();
260 EXPECT_NE(mockHdi, nullptr);
261 EXPECT_CALL(*mockHdi, DeleteUser(_, _, _)).WillRepeatedly(Return(1));
262 int32_t result = UserIdmDatabase::Instance().DeleteUser(testUserId, testAuthToken, testCredInfos);
263 EXPECT_EQ(result, 1);
264 }
265
266 HWTEST_F(UserIdmDatabaseTest, DeleteUser002, TestSize.Level0)
267 {
268 int32_t testUserId = 4501;
269 std::vector<uint8_t> testAuthToken = {1, 2, 3, 4};
270 std::vector<std::shared_ptr<CredentialInfo>> testCredInfos;
271
272 auto mockHdi = MockIUserAuthInterface::Holder::GetInstance().Get();
273 EXPECT_NE(mockHdi, nullptr);
274 EXPECT_CALL(*mockHdi, DeleteUser(_, _, _)).Times(1);
275 ON_CALL(*mockHdi, DeleteUser)
276 .WillByDefault(
__anon68fd97e90602(int32_t userId, const std::vector<uint8_t> &authToken, std::vector<HdiCredentialInfo> &deletedInfos) 277 [](int32_t userId, const std::vector<uint8_t> &authToken, std::vector<HdiCredentialInfo> &deletedInfos) {
278 HdiCredentialInfo info = {};
279 info.authType = static_cast<HdiAuthType>(1);
280 info.credentialId = 10;
281 info.executorIndex = 20;
282 info.executorMatcher = 30;
283 info.executorSensorHint = 40;
284 info.templateId = 50;
285 deletedInfos.emplace_back(info);
286 return HDF_SUCCESS;
287 }
288 );
289 int32_t result = UserIdmDatabase::Instance().DeleteUser(testUserId, testAuthToken, testCredInfos);
290 EXPECT_EQ(result, SUCCESS);
291 EXPECT_EQ(testCredInfos.size(), 1);
292 EXPECT_NE(testCredInfos[0], nullptr);
293 EXPECT_EQ(testCredInfos[0]->GetAuthType(), PIN);
294 EXPECT_EQ(testCredInfos[0]->GetCredentialId(), 10);
295 EXPECT_EQ(testCredInfos[0]->GetExecutorIndex(), 20);
296 EXPECT_EQ(testCredInfos[0]->GetExecutorMatcher(), 30);
297 EXPECT_EQ(testCredInfos[0]->GetExecutorSensorHint(), 40);
298 EXPECT_EQ(testCredInfos[0]->GetTemplateId(), 50);
299 EXPECT_EQ(testCredInfos[0]->GetUserId(), testUserId);
300 }
301
302 HWTEST_F(UserIdmDatabaseTest, DeleteUserEnforce001, TestSize.Level0)
303 {
304 int32_t testUserId = 4501;
305 std::vector<std::shared_ptr<CredentialInfo>> testCredInfos;
306
307 auto mockHdi = MockIUserAuthInterface::Holder::GetInstance().Get();
308 EXPECT_NE(mockHdi, nullptr);
309 EXPECT_CALL(*mockHdi, EnforceDeleteUser(_, _)).WillRepeatedly(Return(1));
310 int32_t result = UserIdmDatabase::Instance().DeleteUserEnforce(testUserId, testCredInfos);
311 EXPECT_EQ(result, 1);
312 }
313
314 HWTEST_F(UserIdmDatabaseTest, DeleteUserEnforce002, TestSize.Level0)
315 {
316 int32_t testUserId = 4501;
317 std::vector<std::shared_ptr<CredentialInfo>> testCredInfos;
318
319 auto mockHdi = MockIUserAuthInterface::Holder::GetInstance().Get();
320 EXPECT_NE(mockHdi, nullptr);
321 EXPECT_CALL(*mockHdi, EnforceDeleteUser(_, _)).Times(1);
322 ON_CALL(*mockHdi, EnforceDeleteUser)
323 .WillByDefault(
__anon68fd97e90702(int32_t userId, std::vector<HdiCredentialInfo> &deletedInfos) 324 [](int32_t userId, std::vector<HdiCredentialInfo> &deletedInfos) {
325 HdiCredentialInfo info = {};
326 info.authType = static_cast<HdiAuthType>(1);
327 info.credentialId = 10;
328 info.executorIndex = 20;
329 info.executorMatcher = 30;
330 info.executorSensorHint = 40;
331 info.templateId = 50;
332 deletedInfos.emplace_back(info);
333 return HDF_SUCCESS;
334 }
335 );
336 int32_t result = UserIdmDatabase::Instance().DeleteUserEnforce(testUserId, testCredInfos);
337 EXPECT_EQ(result, SUCCESS);
338 EXPECT_EQ(testCredInfos.size(), 1);
339 EXPECT_NE(testCredInfos[0], nullptr);
340 EXPECT_EQ(testCredInfos[0]->GetAuthType(), PIN);
341 EXPECT_EQ(testCredInfos[0]->GetCredentialId(), 10);
342 EXPECT_EQ(testCredInfos[0]->GetExecutorIndex(), 20);
343 EXPECT_EQ(testCredInfos[0]->GetExecutorMatcher(), 30);
344 EXPECT_EQ(testCredInfos[0]->GetExecutorSensorHint(), 40);
345 EXPECT_EQ(testCredInfos[0]->GetTemplateId(), 50);
346 EXPECT_EQ(testCredInfos[0]->GetUserId(), testUserId);
347 }
348 } // namespace UserAuth
349 } // namespace UserIam
350 } // namespace OHOS