1 /* 2 * Copyright (c) 2022-2023 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 #include "securec.h" 19 20 #include "adaptor_memory.h" 21 #include "coauth.h" 22 23 extern "C" { 24 extern LinkedList *g_poolList; 25 extern LinkedList *g_scheduleList; 26 extern bool IsScheduleMatch(const void *data, const void *condition); 27 extern bool IsScheduleIdDuplicate(uint64_t scheduleId); 28 extern ResultCode GenerateValidScheduleId(uint64_t *scheduleId); 29 extern ResultCode MountExecutorOnce(const LinkedList *executors, CoAuthSchedule *coAuthSchedule, 30 uint32_t sensorHint, uint32_t executorRole, Uint8Array deviceUdid); 31 extern void DestroyExecutorInfo(void *data); 32 extern ResultCode MountExecutor(const ScheduleParam *param, CoAuthSchedule *coAuthSchedule); 33 } 34 35 namespace OHOS { 36 namespace UserIam { 37 namespace UserAuth { 38 using namespace testing; 39 using namespace testing::ext; 40 41 class CoAuthTest : public testing::Test { 42 public: SetUpTestCase()43 static void SetUpTestCase() {}; 44 TearDownTestCase()45 static void TearDownTestCase() {}; 46 SetUp()47 void SetUp() {}; 48 TearDown()49 void TearDown() {}; 50 }; 51 52 HWTEST_F(CoAuthTest, TestDestroyScheduleNode, TestSize.Level0) 53 { 54 DestroyScheduleNode(nullptr); 55 CoAuthSchedule *schedule = (CoAuthSchedule *)Malloc(sizeof(CoAuthSchedule)); 56 EXPECT_NE(schedule, nullptr); 57 ASSERT_NE(schedule, nullptr); 58 (void)memset_s(schedule, sizeof(CoAuthSchedule), 0, sizeof(CoAuthSchedule)); 59 schedule->templateIds.data = (uint64_t *)Malloc(sizeof(uint64_t)); 60 EXPECT_NE(schedule->templateIds.data, nullptr); 61 ASSERT_NE(schedule->templateIds.data, nullptr); 62 schedule->templateIds.len = 1; 63 DestroyScheduleNode(schedule); 64 } 65 66 HWTEST_F(CoAuthTest, TestCopyCoAuthSchedule, TestSize.Level0) 67 { 68 EXPECT_EQ(CopyCoAuthSchedule(nullptr), nullptr); 69 CoAuthSchedule schedule = {}; 70 schedule.templateIds.len = 1; 71 schedule.templateIds.data = nullptr; 72 EXPECT_EQ(CopyCoAuthSchedule(&schedule), nullptr); 73 } 74 75 HWTEST_F(CoAuthTest, TestDestroyCoAuthSchedule, TestSize.Level0) 76 { 77 DestroyCoAuthSchedule(nullptr); 78 CoAuthSchedule *schedule = (CoAuthSchedule *)Malloc(sizeof(CoAuthSchedule)); 79 EXPECT_NE(schedule, nullptr); 80 ASSERT_NE(schedule, nullptr); 81 (void)memset_s(schedule, sizeof(CoAuthSchedule), 0, sizeof(CoAuthSchedule)); 82 schedule->templateIds.data = (uint64_t *)Malloc(sizeof(uint64_t)); 83 EXPECT_NE(schedule->templateIds.data, nullptr); 84 ASSERT_NE(schedule->templateIds.data, nullptr); 85 schedule->templateIds.len = 1; 86 DestroyCoAuthSchedule(schedule); 87 } 88 89 HWTEST_F(CoAuthTest, TestInitCoAuth, TestSize.Level0) 90 { 91 InitCoAuth(); 92 EXPECT_EQ(InitCoAuth(), RESULT_SUCCESS); 93 DestoryCoAuth(); 94 } 95 96 HWTEST_F(CoAuthTest, TestAddCoAuthSchedule, TestSize.Level0) 97 { 98 g_scheduleList = nullptr; 99 EXPECT_EQ(AddCoAuthSchedule(nullptr), RESULT_NEED_INIT); 100 InitCoAuth(); 101 EXPECT_EQ(AddCoAuthSchedule(nullptr), RESULT_BAD_PARAM); 102 CoAuthSchedule schedule = {}; 103 schedule.templateIds.len = 1; 104 schedule.templateIds.data = nullptr; 105 EXPECT_EQ(AddCoAuthSchedule(&schedule), RESULT_NO_MEMORY); 106 DestoryCoAuth(); 107 } 108 109 HWTEST_F(CoAuthTest, TestIsScheduleMatch, TestSize.Level0) 110 { 111 EXPECT_FALSE(IsScheduleMatch(nullptr, nullptr)); 112 } 113 114 HWTEST_F(CoAuthTest, TestRemoveCoAuthSchedule, TestSize.Level0) 115 { 116 g_scheduleList = nullptr; 117 constexpr uint64_t scheduleId = 32565; 118 EXPECT_EQ(RemoveCoAuthSchedule(scheduleId), RESULT_NEED_INIT); 119 } 120 121 HWTEST_F(CoAuthTest, TestGetCoAuthSchedule, TestSize.Level0) 122 { 123 g_scheduleList = nullptr; 124 constexpr uint64_t scheduleId1 = 32565; 125 constexpr uint64_t scheduleId2 = 3200; 126 EXPECT_EQ(GetCoAuthSchedule(scheduleId1), nullptr); 127 InitCoAuth(); 128 CoAuthSchedule schedule1 = {}; 129 schedule1.scheduleId = scheduleId1; 130 g_scheduleList->insert(g_scheduleList, static_cast<void *>(&schedule1)); 131 CoAuthSchedule schedule2 = {}; 132 schedule2.scheduleId = scheduleId2; 133 g_scheduleList->insert(g_scheduleList, static_cast<void *>(&schedule2)); 134 g_scheduleList->insert(g_scheduleList, nullptr); 135 EXPECT_NE(GetCoAuthSchedule(scheduleId1), nullptr); 136 } 137 138 HWTEST_F(CoAuthTest, TestIsScheduleIdDuplicate, TestSize.Level0) 139 { 140 g_scheduleList = nullptr; 141 constexpr uint64_t scheduleId1 = 36163; 142 constexpr uint64_t scheduleId2 = 3200; 143 InitCoAuth(); 144 EXPECT_FALSE(IsScheduleIdDuplicate(scheduleId1)); 145 CoAuthSchedule schedule1 = {}; 146 schedule1.scheduleId = scheduleId1; 147 g_scheduleList->insert(g_scheduleList, static_cast<void *>(&schedule1)); 148 CoAuthSchedule schedule2 = {}; 149 schedule2.scheduleId = scheduleId2; 150 g_scheduleList->insert(g_scheduleList, static_cast<void *>(&schedule2)); 151 g_scheduleList->insert(g_scheduleList, nullptr); 152 EXPECT_TRUE(IsScheduleIdDuplicate(scheduleId1)); 153 } 154 155 HWTEST_F(CoAuthTest, TestGenerateValidScheduleId, TestSize.Level0) 156 { 157 g_scheduleList = nullptr; 158 uint64_t scheduleId = 0; 159 EXPECT_EQ(GenerateValidScheduleId(&scheduleId), RESULT_BAD_PARAM); 160 } 161 162 HWTEST_F(CoAuthTest, TestMountExecutorOnce_001, TestSize.Level0) 163 { 164 LinkedList *executor = CreateLinkedList(DestroyExecutorInfo); 165 CoAuthSchedule schedule = {}; 166 constexpr uint32_t sensorHint = 3565; 167 constexpr uint32_t excutorRole = 6636; 168 uint8_t deviceUdidBuffer[64] = { 0 }; 169 Uint8Array deviceUdid = { deviceUdidBuffer, 64 }; 170 EXPECT_EQ(MountExecutorOnce(executor, &schedule, sensorHint, excutorRole, deviceUdid), RESULT_NOT_FOUND); 171 executor->insert(executor, nullptr); 172 EXPECT_EQ(MountExecutorOnce(executor, &schedule, sensorHint, excutorRole, deviceUdid), RESULT_UNKNOWN); 173 } 174 175 HWTEST_F(CoAuthTest, TestMountExecutorOnce_002, TestSize.Level0) 176 { 177 LinkedList *executor = CreateLinkedList(DestroyExecutorInfo); 178 CoAuthSchedule schedule = {}; 179 constexpr uint32_t excutorSensorHint1 = 10; 180 constexpr uint32_t excutorSensorHint2 = 20; 181 constexpr uint32_t excutorRole1 = 6636; 182 constexpr uint32_t excutorRole2 = 6110; 183 uint32_t sensorHint = 0; 184 uint32_t executorRole = excutorRole1; 185 ExecutorInfoHal info1 = {}; 186 info1.executorRole = excutorRole1; 187 info1.executorSensorHint = excutorSensorHint1; 188 executor->insert(executor, static_cast<void *>(&info1)); 189 ExecutorInfoHal info2 = {}; 190 info2.executorRole = excutorRole1; 191 info2.executorSensorHint = excutorSensorHint2; 192 executor->insert(executor, static_cast<void *>(&info2)); 193 ExecutorInfoHal info3 = {}; 194 info3.executorRole = excutorRole2; 195 executor->insert(executor, static_cast<void *>(&info3)); 196 uint8_t deviceUdidBuffer[64] = { 0 }; 197 Uint8Array deviceUdid = { deviceUdidBuffer, 64 }; 198 EXPECT_EQ(MountExecutorOnce(executor, &schedule, sensorHint, executorRole, deviceUdid), RESULT_SUCCESS); 199 sensorHint = 10; 200 EXPECT_EQ(MountExecutorOnce(executor, &schedule, sensorHint, executorRole, deviceUdid), RESULT_SUCCESS); 201 } 202 203 HWTEST_F(CoAuthTest, TestMountExecutor_001, TestSize.Level0) 204 { 205 constexpr uint32_t collectorSensorHint = 1012; 206 g_poolList = nullptr; 207 ScheduleParam param = {}; 208 param.collectorSensorHint = collectorSensorHint; 209 CoAuthSchedule schedule = {}; 210 EXPECT_EQ(MountExecutor(¶m, &schedule), RESULT_UNKNOWN); 211 InitResourcePool(); 212 EXPECT_EQ(MountExecutor(¶m, &schedule), RESULT_NOT_FOUND); 213 DestroyResourcePool(); 214 } 215 216 HWTEST_F(CoAuthTest, TestMountExecutor_002, TestSize.Level0) 217 { 218 constexpr uint32_t verifierSensorHint = 1024; 219 InitResourcePool(); 220 ScheduleParam param = {}; 221 param.collectorSensorHint = 0; 222 param.verifierSensorHint = 0; 223 CoAuthSchedule schedule = {}; 224 EXPECT_EQ(MountExecutor(¶m, &schedule), RESULT_NOT_FOUND); 225 param.verifierSensorHint = verifierSensorHint; 226 EXPECT_EQ(MountExecutor(¶m, &schedule), RESULT_NOT_FOUND); 227 DestroyResourcePool(); 228 } 229 230 HWTEST_F(CoAuthTest, TestMountExecutor_003, TestSize.Level0) 231 { 232 constexpr uint32_t collectorSensorHint = 10; 233 constexpr uint32_t verifierSensorHint_1 = 10; 234 constexpr uint32_t verifierSensorHint_2 = 20; 235 InitResourcePool(); 236 ScheduleParam param = {}; 237 param.collectorSensorHint = 0; 238 CoAuthSchedule schedule = {}; 239 EXPECT_EQ(MountExecutor(¶m, &schedule), RESULT_NOT_FOUND); 240 param.collectorSensorHint = collectorSensorHint; 241 param.verifierSensorHint = 0; 242 EXPECT_EQ(MountExecutor(¶m, &schedule), RESULT_NOT_FOUND); 243 param.verifierSensorHint = verifierSensorHint_1; 244 EXPECT_EQ(MountExecutor(¶m, &schedule), RESULT_NOT_FOUND); 245 param.verifierSensorHint = verifierSensorHint_2; 246 EXPECT_EQ(MountExecutor(¶m, &schedule), RESULT_NOT_FOUND); 247 DestroyResourcePool(); 248 } 249 250 HWTEST_F(CoAuthTest, TestMountExecutor_004, TestSize.Level0) 251 { 252 constexpr uint32_t authType = 1; 253 constexpr uint32_t excutorRole = 3; 254 constexpr uint32_t executorSensorHint = 10; 255 g_poolList = nullptr; 256 InitResourcePool(); 257 ExecutorInfoHal info = {}; 258 info.authType = authType; 259 info.executorRole = excutorRole; 260 info.executorSensorHint = executorSensorHint; 261 g_poolList->insert(g_poolList, static_cast<void *>(&info)); 262 263 ScheduleParam param = {}; 264 param.authType = authType; 265 param.collectorSensorHint = 0; 266 param.verifierSensorHint = 0; 267 CoAuthSchedule schedule = {}; 268 EXPECT_EQ(MountExecutor(¶m, &schedule), RESULT_SUCCESS); 269 } 270 271 HWTEST_F(CoAuthTest, TestMountExecutor_005, TestSize.Level0) 272 { 273 constexpr uint32_t authType = 1; 274 constexpr uint32_t excutorRole1 = 3; 275 constexpr uint32_t executorSensorHint_1 = 10; 276 constexpr uint32_t excutorRole2 = 101; 277 constexpr uint32_t executorSensorHint_2 = 201; 278 g_poolList = nullptr; 279 InitResourcePool(); 280 ExecutorInfoHal info = {}; 281 info.authType = authType; 282 info.executorRole = excutorRole1; 283 info.executorSensorHint = executorSensorHint_1; 284 g_poolList->insert(g_poolList, static_cast<void *>(&info)); 285 286 ScheduleParam param = {}; 287 param.authType = authType; 288 param.collectorSensorHint = excutorRole2; 289 param.verifierSensorHint = executorSensorHint_2; 290 param.scheduleMode = SCHEDULE_MODE_IDENTIFY; 291 CoAuthSchedule schedule = {}; 292 EXPECT_EQ(MountExecutor(¶m, &schedule), RESULT_GENERAL_ERROR); 293 param.scheduleMode = SCHEDULE_MODE_AUTH; 294 EXPECT_EQ(MountExecutor(¶m, &schedule), RESULT_NOT_FOUND); 295 param.verifierSensorHint = executorSensorHint_1; 296 EXPECT_EQ(MountExecutor(¶m, &schedule), RESULT_NOT_FOUND); 297 param.collectorSensorHint = executorSensorHint_1; 298 EXPECT_EQ(MountExecutor(¶m, &schedule), RESULT_SUCCESS); 299 } 300 301 HWTEST_F(CoAuthTest, TestGetScheduleVerifierSensorHint_001, TestSize.Level0) 302 { 303 constexpr uint32_t executorSensorHint = 10; 304 EXPECT_EQ(GetScheduleVerifierSensorHint(nullptr), INVALID_SENSOR_HINT); 305 CoAuthSchedule schedule = {}; 306 ExecutorInfoHal info = {}; 307 info.executorSensorHint = executorSensorHint; 308 info.executorRole = VERIFIER; 309 schedule.executorSize = 1; 310 schedule.executors[0] = info; 311 EXPECT_EQ(GetScheduleVerifierSensorHint(&schedule), info.executorSensorHint); 312 } 313 314 HWTEST_F(CoAuthTest, TestGetScheduleVerifierSensorHint_002, TestSize.Level0) 315 { 316 constexpr uint32_t executorSensorHint = 10; 317 constexpr uint32_t excutorSize = 1; 318 CoAuthSchedule schedule = {}; 319 ExecutorInfoHal info = {}; 320 info.executorSensorHint = executorSensorHint; 321 info.executorRole = COLLECTOR; 322 schedule.executorSize = excutorSize; 323 schedule.executors[0] = info; 324 EXPECT_EQ(GetScheduleVerifierSensorHint(&schedule), INVALID_SENSOR_HINT); 325 schedule.executors[0].executorRole = ALL_IN_ONE; 326 EXPECT_EQ(GetScheduleVerifierSensorHint(&schedule), info.executorSensorHint); 327 } 328 329 HWTEST_F(CoAuthTest, TestGenerateSchedule_001, TestSize.Level0) 330 { 331 EXPECT_EQ(GenerateSchedule(nullptr), nullptr); 332 g_scheduleList = nullptr; 333 ScheduleParam param = {}; 334 EXPECT_EQ(GenerateSchedule(¶m), nullptr); 335 } 336 337 HWTEST_F(CoAuthTest, TestGenerateSchedule_002, TestSize.Level0) 338 { 339 constexpr uint32_t arrayLen = 1; 340 constexpr uint32_t data = 1024; 341 g_scheduleList = nullptr; 342 InitCoAuth(); 343 ScheduleParam param = {}; 344 param.templateIds = nullptr; 345 EXPECT_EQ(GenerateSchedule(¶m), nullptr); 346 Uint64Array array = {}; 347 array.len = arrayLen; 348 array.data = nullptr; 349 param.templateIds = &array; 350 EXPECT_EQ(GenerateSchedule(¶m), nullptr); 351 uint64_t temp = data; 352 array.data = &temp; 353 EXPECT_EQ(GenerateSchedule(¶m), nullptr); 354 } 355 356 HWTEST_F(CoAuthTest, TestIsTemplateArraysValid, TestSize.Level0) 357 { 358 constexpr uint32_t arrayLen = 200; 359 constexpr uint32_t data = 1024; 360 EXPECT_FALSE(IsTemplateArraysValid(nullptr)); 361 Uint64Array array = {}; 362 array.len = arrayLen; 363 array.data = nullptr; 364 EXPECT_FALSE(IsTemplateArraysValid(&array)); 365 array.len = 1; 366 EXPECT_FALSE(IsTemplateArraysValid(&array)); 367 uint64_t temp = data; 368 array.data = &temp; 369 EXPECT_TRUE(IsTemplateArraysValid(&array)); 370 array.len = 0; 371 EXPECT_TRUE(IsTemplateArraysValid(&array)); 372 } 373 374 HWTEST_F(CoAuthTest, TestCopyTemplateArrays, TestSize.Level0) 375 { 376 constexpr uint32_t arrayLen = 1; 377 constexpr uint32_t data = 1024; 378 EXPECT_EQ(CopyTemplateArrays(nullptr, nullptr), RESULT_BAD_PARAM); 379 Uint64Array inArray = {}; 380 inArray.len = arrayLen; 381 uint64_t temp = data; 382 inArray.data = &temp; 383 EXPECT_EQ(CopyTemplateArrays(&inArray, nullptr), RESULT_BAD_PARAM); 384 Uint64Array outArray = {}; 385 uint64_t num = 0; 386 outArray.data = # 387 EXPECT_EQ(CopyTemplateArrays(&inArray, &outArray), RESULT_BAD_PARAM); 388 outArray.data = nullptr; 389 EXPECT_EQ(CopyTemplateArrays(&inArray, &outArray), RESULT_SUCCESS); 390 inArray.len = 0; 391 outArray.data = nullptr; 392 EXPECT_EQ(CopyTemplateArrays(&inArray, &outArray), RESULT_SUCCESS); 393 } 394 } // namespace UserAuth 395 } // namespace UserIam 396 } // namespace OHOS 397