1 /*
2 * Copyright (c) 2022-2024 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 #include "constant.h"
18 #include "data_translator.h"
19 #include "active_change_response_info.h"
20 #include "privacy_field_const.h"
21 #define private public
22 #include "permission_used_record_db.h"
23 #undef private
24 #include "permission_used_type.h"
25
26 using namespace testing::ext;
27
28 namespace OHOS {
29 namespace Security {
30 namespace AccessToken {
31 namespace {
32 static const int32_t NOT_EXSIT_TYPE = 9;
33 static const int32_t PERMISSION_USED_TYPE_VALUE = 1;
34 static const int32_t PICKER_TYPE_VALUE = 2;
35 static const int32_t RANDOM_TOKENID = 123;
36 }
37
38 class PermissionRecordDBTest : public testing::Test {
39 public:
40 static void SetUpTestCase();
41 static void TearDownTestCase();
42 void SetUp();
43 void TearDown();
44 };
45
SetUpTestCase()46 void PermissionRecordDBTest::SetUpTestCase()
47 {
48 }
49
TearDownTestCase()50 void PermissionRecordDBTest::TearDownTestCase()
51 {
52 }
53
SetUp()54 void PermissionRecordDBTest::SetUp()
55 {
56 }
57
TearDown()58 void PermissionRecordDBTest::TearDown()
59 {
60 }
61
62 /*
63 * @tc.name: CreateInsertPrepareSqlCmd001
64 * @tc.desc: PermissionUsedRecordDb::CreateInsertPrepareSqlCmd function test type not found
65 * @tc.type: FUNC
66 * @tc.require: issueI5YL6H
67 */
68 HWTEST_F(PermissionRecordDBTest, CreateInsertPrepareSqlCmd001, TestSize.Level0)
69 {
70 PermissionUsedRecordDb::DataType type = static_cast<PermissionUsedRecordDb::DataType>(100);
71 ASSERT_EQ("", PermissionUsedRecordDb::GetInstance().CreateInsertPrepareSqlCmd(type));
72 }
73
74 /*
75 * @tc.name: CreateInsertPrepareSqlCmd002
76 * @tc.desc: PermissionUsedRecordDb::CreateInsertPrepareSqlCmd function test
77 * @tc.type: FUNC
78 * @tc.require: issueI5YL6H
79 */
80 HWTEST_F(PermissionRecordDBTest, CreateInsertPrepareSqlCmd002, TestSize.Level0)
81 {
82 PermissionUsedRecordDb::DataType type = PermissionUsedRecordDb::PERMISSION_RECORD;
83 ASSERT_NE("", PermissionUsedRecordDb::GetInstance().CreateInsertPrepareSqlCmd(type));
84 }
85
86 /*
87 * @tc.name: CreateDeletePrepareSqlCmd001
88 * @tc.desc: PermissionUsedRecordDb::CreateDeletePrepareSqlCmd function test type not found
89 * @tc.type: FUNC
90 * @tc.require: issueI5YL6H
91 */
92 HWTEST_F(PermissionRecordDBTest, CreateDeletePrepareSqlCmd001, TestSize.Level0)
93 {
94 PermissionUsedRecordDb::DataType type = static_cast<PermissionUsedRecordDb::DataType>(100);
95 std::vector<std::string> columnNames;
96 ASSERT_EQ("", PermissionUsedRecordDb::GetInstance().CreateDeletePrepareSqlCmd(type, columnNames));
97 }
98
99 /*
100 * @tc.name: CreateUpdatePrepareSqlCmd001
101 * @tc.desc: PermissionUsedRecordDb::CreateUpdatePrepareSqlCmd function test modifyColumns empty
102 * @tc.type: FUNC
103 * @tc.require: issueI5YL6H
104 */
105 HWTEST_F(PermissionRecordDBTest, CreateUpdatePrepareSqlCmd001, TestSize.Level0)
106 {
107 PermissionUsedRecordDb::DataType type = PermissionUsedRecordDb::PERMISSION_RECORD;
108 std::vector<std::string> modifyColumns;
109 std::vector<std::string> conditionColumns;
110 ASSERT_EQ("", PermissionUsedRecordDb::GetInstance().CreateUpdatePrepareSqlCmd(type, modifyColumns,
111 conditionColumns));
112 }
113
114 /*
115 * @tc.name: CreateUpdatePrepareSqlCmd002
116 * @tc.desc: PermissionUsedRecordDb::CreateUpdatePrepareSqlCmd function test type not found
117 * @tc.type: FUNC
118 * @tc.require: issueI5YL6H
119 */
120 HWTEST_F(PermissionRecordDBTest, CreateUpdatePrepareSqlCmd002, TestSize.Level0)
121 {
122 PermissionUsedRecordDb::DataType type = static_cast<PermissionUsedRecordDb::DataType>(100);
123 std::vector<std::string> modifyColumns;
124 modifyColumns.emplace_back(PrivacyFiledConst::FIELD_TOKEN_ID);
125 std::vector<std::string> conditionColumns;
126 ASSERT_EQ("", PermissionUsedRecordDb::GetInstance().CreateUpdatePrepareSqlCmd(type, modifyColumns,
127 conditionColumns));
128 }
129
130 /*
131 * @tc.name: CreateUpdatePrepareSqlCmd003
132 * @tc.desc: PermissionUsedRecordDb::CreateUpdatePrepareSqlCmd function test conditionColumns empty
133 * @tc.type: FUNC
134 * @tc.require: issueI5YL6H
135 */
136 HWTEST_F(PermissionRecordDBTest, CreateUpdatePrepareSqlCmd003, TestSize.Level0)
137 {
138 PermissionUsedRecordDb::DataType type = PermissionUsedRecordDb::PERMISSION_RECORD;
139 std::vector<std::string> modifyColumns;
140 modifyColumns.emplace_back(PrivacyFiledConst::FIELD_TOKEN_ID);
141 modifyColumns.emplace_back(PrivacyFiledConst::FIELD_TIMESTAMP);
142 std::vector<std::string> conditionColumns;
143 ASSERT_NE("", PermissionUsedRecordDb::GetInstance().CreateUpdatePrepareSqlCmd(type, modifyColumns,
144 conditionColumns));
145 }
146
147 /*
148 * @tc.name: CreateUpdatePrepareSqlCmd004
149 * @tc.desc: PermissionUsedRecordDb::CreateUpdatePrepareSqlCmd function test conditionColumns empty
150 * @tc.type: FUNC
151 * @tc.require: issueI5YL6H
152 */
153 HWTEST_F(PermissionRecordDBTest, CreateUpdatePrepareSqlCmd004, TestSize.Level0)
154 {
155 PermissionUsedRecordDb::DataType type = PermissionUsedRecordDb::PERMISSION_RECORD;
156 std::vector<std::string> modifyColumns;
157 modifyColumns.emplace_back(PrivacyFiledConst::FIELD_TOKEN_ID);
158 modifyColumns.emplace_back(PrivacyFiledConst::FIELD_TIMESTAMP);
159 std::vector<std::string> conditionColumns;
160 ASSERT_NE("", PermissionUsedRecordDb::GetInstance().CreateUpdatePrepareSqlCmd(type, modifyColumns,
161 conditionColumns));
162 }
163
164 /*
165 * @tc.name: CreateUpdatePrepareSqlCmd005
166 * @tc.desc: PermissionUsedRecordDb::CreateUpdatePrepareSqlCmd function test
167 * @tc.type: FUNC
168 * @tc.require: issueI5YL6H
169 */
170 HWTEST_F(PermissionRecordDBTest, CreateUpdatePrepareSqlCmd005, TestSize.Level0)
171 {
172 PermissionUsedRecordDb::DataType type = PermissionUsedRecordDb::PERMISSION_RECORD;
173 std::vector<std::string> modifyColumns;
174 modifyColumns.emplace_back(PrivacyFiledConst::FIELD_TOKEN_ID);
175 modifyColumns.emplace_back(PrivacyFiledConst::FIELD_TIMESTAMP);
176 std::vector<std::string> conditionColumns;
177 conditionColumns.emplace_back(PrivacyFiledConst::FIELD_STATUS);
178 ASSERT_NE("", PermissionUsedRecordDb::GetInstance().CreateUpdatePrepareSqlCmd(type, modifyColumns,
179 conditionColumns));
180 }
181
182 /*
183 * @tc.name: CreateSelectByConditionPrepareSqlCmd001
184 * @tc.desc: PermissionUsedRecordDb::CreateSelectByConditionPrepareSqlCmd function test type not found
185 * @tc.type: FUNC
186 * @tc.require: issueI5YL6H
187 */
188 HWTEST_F(PermissionRecordDBTest, CreateSelectByConditionPrepareSqlCmd001, TestSize.Level0)
189 {
190 PermissionUsedRecordDb::DataType type = static_cast<PermissionUsedRecordDb::DataType>(100);
191 std::set<int32_t> opCodeList;
192 std::vector<std::string> andColumns;
193 ASSERT_EQ("", PermissionUsedRecordDb::GetInstance().CreateSelectByConditionPrepareSqlCmd(0, type, opCodeList,
194 andColumns, 10));
195 }
196
197 /*
198 * @tc.name: CreateSelectByConditionPrepareSqlCmd002
199 * @tc.desc: PermissionUsedRecordDb::CreateSelectByConditionPrepareSqlCmd function test
200 * @tc.type: FUNC
201 * @tc.require: issueI5YL6H
202 */
203 HWTEST_F(PermissionRecordDBTest, CreateSelectByConditionPrepareSqlCmd002, TestSize.Level0)
204 {
205 PermissionUsedRecordDb::DataType type = PermissionUsedRecordDb::PERMISSION_RECORD;
206 std::set<int32_t> opCodeList;
207 opCodeList.insert(static_cast<int32_t>(Constant::OP_LOCATION));
208 std::vector<std::string> andColumns;
209 andColumns.emplace_back(PrivacyFiledConst::FIELD_TIMESTAMP_BEGIN);
210 std::vector<std::string> orColumns;
211 orColumns.emplace_back(PrivacyFiledConst::FIELD_TIMESTAMP);
212 ASSERT_NE("", PermissionUsedRecordDb::GetInstance().CreateSelectByConditionPrepareSqlCmd(0, type, opCodeList,
213 andColumns, 10));
214 }
215
216 /*
217 * @tc.name: CreateCountPrepareSqlCmd001
218 * @tc.desc: PermissionUsedRecordDb::CreateCountPrepareSqlCmd function test type not found
219 * @tc.type: FUNC
220 * @tc.require: issueI5YL6H
221 */
222 HWTEST_F(PermissionRecordDBTest, CreateCountPrepareSqlCmd001, TestSize.Level0)
223 {
224 PermissionUsedRecordDb::DataType type = static_cast<PermissionUsedRecordDb::DataType>(100);
225 ASSERT_EQ("", PermissionUsedRecordDb::GetInstance().CreateCountPrepareSqlCmd(type));
226 }
227
228 /*
229 * @tc.name: CreateDeleteExpireRecordsPrepareSqlCmd001
230 * @tc.desc: PermissionUsedRecordDb::CreateDeleteExpireRecordsPrepareSqlCmd function test
231 * @tc.type: FUNC
232 * @tc.require: issueI5YL6H
233 */
234 HWTEST_F(PermissionRecordDBTest, CreateDeleteExpireRecordsPrepareSqlCmd001, TestSize.Level0)
235 {
236 PermissionUsedRecordDb::DataType type = static_cast<PermissionUsedRecordDb::DataType>(100); // type not found
237 std::vector<std::string> andColumns;
238 ASSERT_EQ("", PermissionUsedRecordDb::GetInstance().CreateDeleteExpireRecordsPrepareSqlCmd(type, andColumns));
239
240 type = PermissionUsedRecordDb::PERMISSION_RECORD; // field timestamp_begin and timestamp_end
241 andColumns.emplace_back(PrivacyFiledConst::FIELD_TIMESTAMP_BEGIN);
242 andColumns.emplace_back(PrivacyFiledConst::FIELD_TIMESTAMP_END);
243 ASSERT_NE("", PermissionUsedRecordDb::GetInstance().CreateDeleteExpireRecordsPrepareSqlCmd(type, andColumns));
244 }
245
246 /*
247 * @tc.name: DeleteHistoryRecordsInTables001
248 * @tc.desc: PermissionUsedRecordDb::DeleteHistoryRecordsInTables function test
249 * @tc.type: FUNC
250 * @tc.require:
251 */
252 HWTEST_F(PermissionRecordDBTest, DeleteHistoryRecordsInTables001, TestSize.Level0)
253 {
254 std::vector<PermissionUsedRecordDb::DataType> dataTypes;
255 dataTypes.emplace_back(PermissionUsedRecordDb::DataType::PERMISSION_RECORD);
256 dataTypes.emplace_back(PermissionUsedRecordDb::DataType::PERMISSION_USED_TYPE);
257 std::unordered_set<AccessTokenID> tokenIDList;
258 tokenIDList.emplace(RANDOM_TOKENID);
259 EXPECT_EQ(0, PermissionUsedRecordDb::GetInstance().DeleteHistoryRecordsInTables(dataTypes, tokenIDList));
260 }
261
262 /*
263 * @tc.name: CreateDeleteHistoryRecordsPrepareSqlCmd001
264 * @tc.desc: PermissionUsedRecordDb::CreateDeleteHistoryRecordsPrepareSqlCmd function test
265 * @tc.type: FUNC
266 * @tc.require:
267 */
268 HWTEST_F(PermissionRecordDBTest, CreateDeleteHistoryRecordsPrepareSqlCmd001, TestSize.Level0)
269 {
270 PermissionUsedRecordDb::DataType type = static_cast<PermissionUsedRecordDb::DataType>(100); // type not found
271 std::unordered_set<AccessTokenID> tokenIDList;
272 EXPECT_EQ("", PermissionUsedRecordDb::GetInstance().CreateDeleteHistoryRecordsPrepareSqlCmd(type, tokenIDList));
273
274 type = PermissionUsedRecordDb::PERMISSION_RECORD;
275 tokenIDList.emplace(RANDOM_TOKENID);
276 EXPECT_NE("", PermissionUsedRecordDb::GetInstance().CreateDeleteHistoryRecordsPrepareSqlCmd(type, tokenIDList));
277 }
278
279 /*
280 * @tc.name: CreateDeleteExcessiveRecordsPrepareSqlCmd001
281 * @tc.desc: PermissionUsedRecordDb::CreateDeleteExcessiveRecordsPrepareSqlCmd function test type not found
282 * @tc.type: FUNC
283 * @tc.require: issueI5YL6H
284 */
285 HWTEST_F(PermissionRecordDBTest, CreateDeleteExcessiveRecordsPrepareSqlCmd001, TestSize.Level0)
286 {
287 PermissionUsedRecordDb::DataType type = static_cast<PermissionUsedRecordDb::DataType>(100);
288 uint32_t excessiveSize = 10;
289 ASSERT_EQ("", PermissionUsedRecordDb::GetInstance().CreateDeleteExcessiveRecordsPrepareSqlCmd(type, excessiveSize));
290 }
291
292 /*
293 * @tc.name: CreateDeleteExcessiveRecordsPrepareSqlCmd002
294 * @tc.desc: PermissionUsedRecordDb::CreateDeleteExcessiveRecordsPrepareSqlCmd function test
295 * @tc.type: FUNC
296 * @tc.require: issueI5YL6H
297 */
298 HWTEST_F(PermissionRecordDBTest, CreateDeleteExcessiveRecordsPrepareSqlCmd002, TestSize.Level0)
299 {
300 PermissionUsedRecordDb::DataType type = PermissionUsedRecordDb::PERMISSION_RECORD;
301 uint32_t excessiveSize = 10;
302 ASSERT_NE("", PermissionUsedRecordDb::GetInstance().CreateDeleteExcessiveRecordsPrepareSqlCmd(type, excessiveSize));
303 }
304
305 /*
306 * @tc.name: CreatePermissionRecordTable001
307 * @tc.desc: PermissionUsedRecordDb::CreatePermissionRecordTable function test
308 * @tc.type: FUNC
309 * @tc.require: issueI5YL6H
310 */
311 HWTEST_F(PermissionRecordDBTest, CreatePermissionRecordTable001, TestSize.Level0)
312 {
313 ASSERT_EQ(0, PermissionUsedRecordDb::GetInstance().CreatePermissionRecordTable());
314
315 std::map<PermissionUsedRecordDb::DataType, SqliteTable> dataTypeToSqlTable;
316 dataTypeToSqlTable = PermissionUsedRecordDb::GetInstance().dataTypeToSqlTable_; // backup
317 PermissionUsedRecordDb::GetInstance().dataTypeToSqlTable_.clear();
318
319 ASSERT_EQ(Constant::FAILURE, PermissionUsedRecordDb::GetInstance().CreatePermissionRecordTable());
320 PermissionUsedRecordDb::GetInstance().dataTypeToSqlTable_ = dataTypeToSqlTable; // recovery
321 }
322
323 /*
324 * @tc.name: InsertLockScreenStatusColumn001
325 * @tc.desc: PermissionUsedRecordDb::InsertLockScreenStatusColumn function test
326 * @tc.type: FUNC
327 * @tc.require: issueI5YL6H
328 */
329 HWTEST_F(PermissionRecordDBTest, InsertLockScreenStatusColumn001, TestSize.Level0)
330 {
331 ASSERT_EQ(Constant::SUCCESS, PermissionUsedRecordDb::GetInstance().InsertLockScreenStatusColumn());
332
333 std::map<PermissionUsedRecordDb::DataType, SqliteTable> dataTypeToSqlTable;
334 dataTypeToSqlTable = PermissionUsedRecordDb::GetInstance().dataTypeToSqlTable_; // backup
335 PermissionUsedRecordDb::GetInstance().dataTypeToSqlTable_.clear();
336
337 ASSERT_EQ(Constant::FAILURE, PermissionUsedRecordDb::GetInstance().InsertLockScreenStatusColumn());
338 PermissionUsedRecordDb::GetInstance().dataTypeToSqlTable_ = dataTypeToSqlTable; // recovery
339 }
340
341 /*
342 * @tc.name: TranslationIntoGenericValues001
343 * @tc.desc: DataTranslator::TranslationIntoGenericValues function test
344 * @tc.type: FUNC
345 * @tc.require:
346 */
347 HWTEST_F(PermissionRecordDBTest, TranslationIntoGenericValues001, TestSize.Level0)
348 {
349 PermissionUsedRequest request;
350 GenericValues andGenericValues;
351
352 request.beginTimeMillis = -1;
353 // begin < 0
354 ASSERT_EQ(Constant::FAILURE,
355 DataTranslator::TranslationIntoGenericValues(request, andGenericValues));
356
357 request.beginTimeMillis = 10;
358 request.endTimeMillis = -1;
359 // begin > 0 + end < 0
360 ASSERT_EQ(Constant::FAILURE,
361 DataTranslator::TranslationIntoGenericValues(request, andGenericValues));
362
363 request.endTimeMillis = 1;
364 // begin > 0 + end > 0 + begin > end
365 ASSERT_EQ(Constant::FAILURE,
366 DataTranslator::TranslationIntoGenericValues(request, andGenericValues));
367
368 request.beginTimeMillis = 10; // begin != 0
369 request.endTimeMillis = 20; // end != 0
370 request.flag = static_cast<PermissionUsageFlag>(9);
371 // begin > 0 + end > 0 + begin < end + flag = 9
372 ASSERT_EQ(Constant::FAILURE,
373 DataTranslator::TranslationIntoGenericValues(request, andGenericValues));
374
375 request.flag = PermissionUsageFlag::FLAG_PERMISSION_USAGE_DETAIL;
376 request.permissionList.emplace_back("ohos.com.CAMERA");
377 // begin > 0 + end > 0 + begin < end + flag = 1 + TransferPermissionToOpcode true
378 ASSERT_EQ(Constant::SUCCESS,
379 DataTranslator::TranslationIntoGenericValues(request, andGenericValues));
380 }
381
382 /*
383 * @tc.name: TranslationGenericValuesIntoPermissionUsedRecord001
384 * @tc.desc: DataTranslator::TranslationGenericValuesIntoPermissionUsedRecord function test
385 * @tc.type: FUNC
386 * @tc.require:
387 */
388 HWTEST_F(PermissionRecordDBTest, TranslationGenericValuesIntoPermissionUsedRecord001, TestSize.Level0)
389 {
390 GenericValues inGenericValues;
391 PermissionUsedRecord permissionRecord;
392
393 int32_t opCode = static_cast<int32_t>(Constant::OpCode::OP_INVALID);
394 inGenericValues.Put(PrivacyFiledConst::FIELD_OP_CODE, opCode);
395 // TransferOpcodeToPermission fail
396 ASSERT_EQ(Constant::FAILURE, DataTranslator::TranslationGenericValuesIntoPermissionUsedRecord(
397 FLAG_PERMISSION_USAGE_SUMMARY, inGenericValues, permissionRecord));
398 inGenericValues.Remove(PrivacyFiledConst::FIELD_OP_CODE);
399
400 opCode = static_cast<int32_t>(Constant::OpCode::OP_CAMERA);
401 inGenericValues.Put(PrivacyFiledConst::FIELD_OP_CODE, opCode);
402 inGenericValues.Put(PrivacyFiledConst::FIELD_TIMESTAMP, 10);
403 inGenericValues.Put(PrivacyFiledConst::FIELD_REJECT_COUNT, 1);
404 inGenericValues.Put(PrivacyFiledConst::FIELD_FLAG, 1);
405 // lastRejectTime > 0
406 ASSERT_EQ(Constant::SUCCESS, DataTranslator::TranslationGenericValuesIntoPermissionUsedRecord(
407 FLAG_PERMISSION_USAGE_DETAIL, inGenericValues, permissionRecord));
408 }
409
410 /*
411 * @tc.name: Add001
412 * @tc.desc: PermissionUsedRecordDb::Add function test miss not null field
413 * @tc.type: FUNC
414 * @tc.require: issueI5YL6H
415 */
416 HWTEST_F(PermissionRecordDBTest, Add001, TestSize.Level0)
417 {
418 GenericValues value1;
419 value1.Put(PrivacyFiledConst::FIELD_TOKEN_ID, 0);
420 value1.Put(PrivacyFiledConst::FIELD_OP_CODE, Constant::OP_MICROPHONE);
421 value1.Put(PrivacyFiledConst::FIELD_STATUS, ActiveChangeType::PERM_ACTIVE_IN_FOREGROUND);
422 value1.Put(PrivacyFiledConst::FIELD_TIMESTAMP, 123); // 123 is random input
423 value1.Put(PrivacyFiledConst::FIELD_REJECT_COUNT, 0);
424 value1.Put(PrivacyFiledConst::FIELD_LOCKSCREEN_STATUS, LockScreenStatusChangeType::PERM_ACTIVE_IN_UNLOCKED);
425 value1.Put(PrivacyFiledConst::FIELD_USED_TYPE, static_cast<int>(PermissionUsedType::NORMAL_TYPE));
426
427 GenericValues value2;
428 value2.Put(PrivacyFiledConst::FIELD_TOKEN_ID, 0);
429 value2.Put(PrivacyFiledConst::FIELD_OP_CODE, Constant::OP_MICROPHONE);
430 value2.Put(PrivacyFiledConst::FIELD_STATUS, ActiveChangeType::PERM_ACTIVE_IN_FOREGROUND);
431 value2.Put(PrivacyFiledConst::FIELD_TIMESTAMP, 123); // 123 is random input
432 value2.Put(PrivacyFiledConst::FIELD_ACCESS_COUNT, 1);
433 value2.Put(PrivacyFiledConst::FIELD_LOCKSCREEN_STATUS, LockScreenStatusChangeType::PERM_ACTIVE_IN_UNLOCKED);
434 value2.Put(PrivacyFiledConst::FIELD_USED_TYPE, static_cast<int>(PermissionUsedType::NORMAL_TYPE));
435
436 PermissionUsedRecordDb::DataType type = PermissionUsedRecordDb::PERMISSION_RECORD;
437 std::vector<GenericValues> values;
438 values.emplace_back(value1);
439 values.emplace_back(value2);
440 ASSERT_NE(0, PermissionUsedRecordDb::GetInstance().Add(type, values));
441 }
442
443 /*
444 * @tc.name: Add002
445 * @tc.desc: PermissionUsedRecordDb::Add function test
446 * @tc.type: FUNC
447 * @tc.require: issueI5YL6H
448 */
449 HWTEST_F(PermissionRecordDBTest, Add002, TestSize.Level0)
450 {
451 GenericValues value1;
452 value1.Put(PrivacyFiledConst::FIELD_TOKEN_ID, 0);
453 value1.Put(PrivacyFiledConst::FIELD_OP_CODE, Constant::OP_MICROPHONE);
454 value1.Put(PrivacyFiledConst::FIELD_STATUS, ActiveChangeType::PERM_ACTIVE_IN_FOREGROUND);
455 value1.Put(PrivacyFiledConst::FIELD_TIMESTAMP, 123); // 123 is random input
456 value1.Put(PrivacyFiledConst::FIELD_ACCESS_DURATION, 123); // 123 is random input
457 value1.Put(PrivacyFiledConst::FIELD_ACCESS_COUNT, 1);
458 value1.Put(PrivacyFiledConst::FIELD_REJECT_COUNT, 0);
459 value1.Put(PrivacyFiledConst::FIELD_LOCKSCREEN_STATUS, LockScreenStatusChangeType::PERM_ACTIVE_IN_UNLOCKED);
460 value1.Put(PrivacyFiledConst::FIELD_USED_TYPE, static_cast<int>(PermissionUsedType::NORMAL_TYPE));
461
462 GenericValues value2;
463 value2.Put(PrivacyFiledConst::FIELD_TOKEN_ID, 1);
464 value2.Put(PrivacyFiledConst::FIELD_OP_CODE, Constant::OP_MICROPHONE);
465 value2.Put(PrivacyFiledConst::FIELD_STATUS, ActiveChangeType::PERM_ACTIVE_IN_FOREGROUND);
466 value2.Put(PrivacyFiledConst::FIELD_TIMESTAMP, 123); // 123 is random input
467 value2.Put(PrivacyFiledConst::FIELD_ACCESS_DURATION, 123); // 123 is random input
468 value2.Put(PrivacyFiledConst::FIELD_ACCESS_COUNT, 1);
469 value2.Put(PrivacyFiledConst::FIELD_REJECT_COUNT, 0);
470 value2.Put(PrivacyFiledConst::FIELD_LOCKSCREEN_STATUS, LockScreenStatusChangeType::PERM_ACTIVE_IN_UNLOCKED);
471 value2.Put(PrivacyFiledConst::FIELD_USED_TYPE, static_cast<int>(PermissionUsedType::NORMAL_TYPE));
472
473 PermissionUsedRecordDb::DataType type = PermissionUsedRecordDb::PERMISSION_RECORD;
474 std::vector<GenericValues> values;
475 values.emplace_back(value1);
476 values.emplace_back(value2);
477 ASSERT_EQ(0, PermissionUsedRecordDb::GetInstance().Add(type, values));
478 ASSERT_EQ(0, PermissionUsedRecordDb::GetInstance().Remove(type, value1));
479 ASSERT_EQ(0, PermissionUsedRecordDb::GetInstance().Remove(type, value2));
480 }
481
482 /*
483 * @tc.name: Add003
484 * @tc.desc: PermissionUsedRecordDb::Add function test
485 * @tc.type: FUNC
486 * @tc.require: issueI5RWXF
487 */
488 HWTEST_F(PermissionRecordDBTest, Add003, TestSize.Level0)
489 {
490 std::vector<GenericValues> values;
491 PermissionUsedRecordDb::DataType type = PermissionUsedRecordDb::PERMISSION_RECORD;
492 ASSERT_EQ(0, PermissionUsedRecordDb::GetInstance().Add(type, values));
493 }
494
495 /*
496 * @tc.name: Add004
497 * @tc.desc: PermissionUsedRecordDb::Add function test
498 * @tc.type: FUNC
499 * @tc.require: issueI5RWXF
500 */
501 HWTEST_F(PermissionRecordDBTest, Add004, TestSize.Level0)
502 {
503 GenericValues value1;
504 value1.Put(PrivacyFiledConst::FIELD_TOKEN_ID, 0);
505 value1.Put(PrivacyFiledConst::FIELD_OP_CODE, Constant::OP_MICROPHONE);
506 value1.Put(PrivacyFiledConst::FIELD_STATUS, ActiveChangeType::PERM_ACTIVE_IN_FOREGROUND);
507 value1.Put(PrivacyFiledConst::FIELD_TIMESTAMP, 123); // 123 is random input
508 value1.Put(PrivacyFiledConst::FIELD_ACCESS_DURATION, 123); // 123 is random input
509 value1.Put(PrivacyFiledConst::FIELD_ACCESS_COUNT, 1);
510 value1.Put(PrivacyFiledConst::FIELD_REJECT_COUNT, 0);
511 value1.Put(PrivacyFiledConst::FIELD_LOCKSCREEN_STATUS, LockScreenStatusChangeType::PERM_ACTIVE_IN_UNLOCKED);
512 value1.Put(PrivacyFiledConst::FIELD_USED_TYPE, static_cast<int>(PermissionUsedType::NORMAL_TYPE));
513
514 GenericValues value2; // only used_type diff from value1
515 value2.Put(PrivacyFiledConst::FIELD_TOKEN_ID, 0);
516 value2.Put(PrivacyFiledConst::FIELD_OP_CODE, Constant::OP_MICROPHONE);
517 value2.Put(PrivacyFiledConst::FIELD_STATUS, ActiveChangeType::PERM_ACTIVE_IN_FOREGROUND);
518 value2.Put(PrivacyFiledConst::FIELD_TIMESTAMP, 123); // 123 is random input
519 value2.Put(PrivacyFiledConst::FIELD_ACCESS_DURATION, 123); // 123 is random input
520 value2.Put(PrivacyFiledConst::FIELD_ACCESS_COUNT, 1);
521 value2.Put(PrivacyFiledConst::FIELD_REJECT_COUNT, 0);
522 value2.Put(PrivacyFiledConst::FIELD_LOCKSCREEN_STATUS, LockScreenStatusChangeType::PERM_ACTIVE_IN_UNLOCKED);
523 value2.Put(PrivacyFiledConst::FIELD_USED_TYPE, static_cast<int>(PermissionUsedType::PICKER_TYPE));
524
525 PermissionUsedRecordDb::DataType type = PermissionUsedRecordDb::PERMISSION_RECORD;
526 std::vector<GenericValues> values;
527 values.emplace_back(value1);
528 values.emplace_back(value2);
529
530 // if primary key do not add used_type, this place should be wrong
531 ASSERT_EQ(0, PermissionUsedRecordDb::GetInstance().Add(type, values));
532 ASSERT_EQ(0, PermissionUsedRecordDb::GetInstance().Remove(type, value1));
533 ASSERT_EQ(0, PermissionUsedRecordDb::GetInstance().Remove(type, value2));
534 }
535
536 /*
537 * @tc.name: FindByConditions001
538 * @tc.desc: PermissionUsedRecordDb::FindByConditions function test
539 * @tc.type: FUNC
540 * @tc.require: issueI5YL6H
541 */
542 HWTEST_F(PermissionRecordDBTest, FindByConditions001, TestSize.Level0)
543 {
544 GenericValues value;
545 std::set<int32_t> opCodeList;
546 value.Put(PrivacyFiledConst::FIELD_TOKEN_ID, 0);
547 value.Put(PrivacyFiledConst::FIELD_OP_CODE, Constant::OP_MICROPHONE);
548 value.Put(PrivacyFiledConst::FIELD_STATUS, ActiveChangeType::PERM_ACTIVE_IN_FOREGROUND);
549 value.Put(PrivacyFiledConst::FIELD_TIMESTAMP, 123); // 123 is random input
550 value.Put(PrivacyFiledConst::FIELD_ACCESS_DURATION, 123); // 123 is random input
551 value.Put(PrivacyFiledConst::FIELD_ACCESS_COUNT, 1);
552 value.Put(PrivacyFiledConst::FIELD_REJECT_COUNT, 0);
553 value.Put(PrivacyFiledConst::FIELD_LOCKSCREEN_STATUS, LockScreenStatusChangeType::PERM_ACTIVE_IN_LOCKED);
554 value.Put(PrivacyFiledConst::FIELD_USED_TYPE, static_cast<int>(PermissionUsedType::NORMAL_TYPE));
555
556 PermissionUsedRecordDb::DataType type = PermissionUsedRecordDb::PERMISSION_RECORD;
557 std::vector<GenericValues> values;
558 values.emplace_back(value);
559 ASSERT_EQ(0, PermissionUsedRecordDb::GetInstance().Add(type, values));
560
561 GenericValues orConditions;
562 std::vector<GenericValues> results;
563
564 GenericValues andConditions; // no column
565 ASSERT_EQ(0, PermissionUsedRecordDb::GetInstance().FindByConditions(type, opCodeList, andConditions, results, 10));
566
567 GenericValues andConditions1; // field timestamp
568 andConditions1.Put(PrivacyFiledConst::FIELD_TIMESTAMP, 0);
569
570 ASSERT_EQ(0, PermissionUsedRecordDb::GetInstance().FindByConditions(type, opCodeList, andConditions1, results, 10));
571
572 GenericValues andConditions2; // field access_duration
573 andConditions2.Put(PrivacyFiledConst::FIELD_ACCESS_DURATION, 0);
574 ASSERT_EQ(0, PermissionUsedRecordDb::GetInstance().FindByConditions(type, opCodeList, andConditions2, results, 10));
575
576 GenericValues andConditions3; // field not timestamp or access_duration
577 andConditions3.Put(PrivacyFiledConst::FIELD_STATUS, ActiveChangeType::PERM_ACTIVE_IN_FOREGROUND);
578 ASSERT_EQ(0, PermissionUsedRecordDb::GetInstance().FindByConditions(type, opCodeList, andConditions3, results, 10));
579
580 GenericValues andConditions4;
581 andConditions4.Put(PrivacyFiledConst::FIELD_LOCKSCREEN_STATUS, LockScreenStatusChangeType::PERM_ACTIVE_IN_LOCKED);
582 ASSERT_EQ(0, PermissionUsedRecordDb::GetInstance().FindByConditions(type, opCodeList, andConditions4, results, 10));
583
584 ASSERT_EQ(0, PermissionUsedRecordDb::GetInstance().Remove(type, value));
585 }
586
587 /*
588 * @tc.name: FindByConditions002
589 * @tc.desc: PermissionUsedRecordDb::FindByConditions function test
590 * @tc.type: FUNC
591 * @tc.require: issueI5YL6H
592 */
593 HWTEST_F(PermissionRecordDBTest, FindByConditions002, TestSize.Level0)
594 {
595 GenericValues value1;
596 value1.Put(PrivacyFiledConst::FIELD_TOKEN_ID, 1);
597 value1.Put(PrivacyFiledConst::FIELD_OP_CODE, Constant::OP_MICROPHONE);
598 value1.Put(PrivacyFiledConst::FIELD_STATUS, ActiveChangeType::PERM_ACTIVE_IN_FOREGROUND);
599 value1.Put(PrivacyFiledConst::FIELD_TIMESTAMP, 123); // 123 is random input
600 value1.Put(PrivacyFiledConst::FIELD_ACCESS_DURATION, 123); // 123 is random input
601 value1.Put(PrivacyFiledConst::FIELD_ACCESS_COUNT, 1);
602 value1.Put(PrivacyFiledConst::FIELD_REJECT_COUNT, 0);
603 value1.Put(PrivacyFiledConst::FIELD_LOCKSCREEN_STATUS, LockScreenStatusChangeType::PERM_ACTIVE_IN_LOCKED);
604 value1.Put(PrivacyFiledConst::FIELD_USED_TYPE, static_cast<int>(PermissionUsedType::NORMAL_TYPE));
605
606 GenericValues value2;
607 value2.Put(PrivacyFiledConst::FIELD_TOKEN_ID, 2); // random input
608 value2.Put(PrivacyFiledConst::FIELD_OP_CODE, Constant::OP_MICROPHONE);
609 value2.Put(PrivacyFiledConst::FIELD_STATUS, ActiveChangeType::PERM_ACTIVE_IN_FOREGROUND);
610 value2.Put(PrivacyFiledConst::FIELD_TIMESTAMP, 123); // 123 is random input
611 value2.Put(PrivacyFiledConst::FIELD_ACCESS_DURATION, 123); // 123 is random input
612 value2.Put(PrivacyFiledConst::FIELD_ACCESS_COUNT, 1);
613 value2.Put(PrivacyFiledConst::FIELD_REJECT_COUNT, 0);
614 value2.Put(PrivacyFiledConst::FIELD_LOCKSCREEN_STATUS, LockScreenStatusChangeType::PERM_ACTIVE_IN_LOCKED);
615 value2.Put(PrivacyFiledConst::FIELD_USED_TYPE, static_cast<int>(PermissionUsedType::NORMAL_TYPE));
616
617 GenericValues value3;
618 value3.Put(PrivacyFiledConst::FIELD_TOKEN_ID, 3); // random input
619 value3.Put(PrivacyFiledConst::FIELD_OP_CODE, Constant::OP_MICROPHONE);
620 value3.Put(PrivacyFiledConst::FIELD_STATUS, ActiveChangeType::PERM_ACTIVE_IN_FOREGROUND);
621 value3.Put(PrivacyFiledConst::FIELD_TIMESTAMP, 123); // 123 is random input
622 value3.Put(PrivacyFiledConst::FIELD_ACCESS_DURATION, 123); // 123 is random input
623 value3.Put(PrivacyFiledConst::FIELD_ACCESS_COUNT, 1);
624 value3.Put(PrivacyFiledConst::FIELD_REJECT_COUNT, 0);
625 value3.Put(PrivacyFiledConst::FIELD_LOCKSCREEN_STATUS, LockScreenStatusChangeType::PERM_ACTIVE_IN_LOCKED);
626 value3.Put(PrivacyFiledConst::FIELD_USED_TYPE, static_cast<int>(PermissionUsedType::NORMAL_TYPE));
627
628 PermissionUsedRecordDb::DataType type = PermissionUsedRecordDb::PERMISSION_RECORD;
629 std::vector<GenericValues> values;
630 values.emplace_back(value1);
631 values.emplace_back(value2);
632 values.emplace_back(value3);
633 ASSERT_EQ(0, PermissionUsedRecordDb::GetInstance().Add(type, values));
634
635 std::set<int32_t> opCodeList;
636 GenericValues andConditions;
637 std::vector<GenericValues> results;
638 andConditions.Put(PrivacyFiledConst::FIELD_OP_CODE, Constant::OP_MICROPHONE);
639 andConditions.Put(PrivacyFiledConst::FIELD_STATUS, ActiveChangeType::PERM_ACTIVE_IN_FOREGROUND);
640 ASSERT_EQ(0, PermissionUsedRecordDb::GetInstance().FindByConditions(type, opCodeList, andConditions, results, 2));
641 ASSERT_EQ(static_cast<size_t>(2), results.size());
642
643 ASSERT_EQ(0, PermissionUsedRecordDb::GetInstance().Remove(type, value1));
644 ASSERT_EQ(0, PermissionUsedRecordDb::GetInstance().Remove(type, value2));
645 ASSERT_EQ(0, PermissionUsedRecordDb::GetInstance().Remove(type, value3));
646 }
647
648 /*
649 * @tc.name: DeleteExpireRecords001
650 * @tc.desc: PermissionUsedRecordDb::DeleteExpireRecords function test andColumns empty
651 * @tc.type: FUNC
652 * @tc.require: issueI5YL6H
653 */
654 HWTEST_F(PermissionRecordDBTest, DeleteExpireRecords001, TestSize.Level0)
655 {
656 PermissionUsedRecordDb::DataType type = PermissionUsedRecordDb::PERMISSION_RECORD;
657 GenericValues andConditions;
658 ASSERT_EQ(0, PermissionUsedRecordDb::GetInstance().DeleteExpireRecords(type, andConditions));
659 }
660
661 /*
662 * @tc.name: DeleteExcessiveRecords001
663 * @tc.desc: PermissionUsedRecordDb::DeleteExcessiveRecords function test
664 * @tc.type: FUNC
665 * @tc.require: issueI5YL6H
666 */
667 HWTEST_F(PermissionRecordDBTest, DeleteExcessiveRecords001, TestSize.Level0)
668 {
669 PermissionUsedRecordDb::DataType type = PermissionUsedRecordDb::PERMISSION_RECORD;
670 uint32_t excessiveSize = 10;
671 ASSERT_EQ(0, PermissionUsedRecordDb::GetInstance().DeleteExcessiveRecords(type, excessiveSize));
672 }
673
674 /*
675 * @tc.name: CreateQueryPrepareSqlCmd001
676 * @tc.desc: PermissionUsedRecordDb::CreateQueryPrepareSqlCmd function test
677 * @tc.type: FUNC
678 * @tc.require:
679 */
680 HWTEST_F(PermissionRecordDBTest, CreateQueryPrepareSqlCmd001, TestSize.Level0)
681 {
682 PermissionUsedRecordDb::DataType type = PermissionUsedRecordDb::PERMISSION_USED_TYPE;
683 std::vector<std::string> conditionColumns;
684 ASSERT_NE("", PermissionUsedRecordDb::GetInstance().CreateQueryPrepareSqlCmd(
685 type, conditionColumns));
686
687 type = static_cast<PermissionUsedRecordDb::DataType>(NOT_EXSIT_TYPE);
688 ASSERT_EQ("", PermissionUsedRecordDb::GetInstance().CreateQueryPrepareSqlCmd(
689 type, conditionColumns));
690 }
691
692 /*
693 * @tc.name: Query001
694 * @tc.desc: PermissionUsedRecordDb::Query function test
695 * @tc.type: FUNC
696 * @tc.require:
697 */
698 HWTEST_F(PermissionRecordDBTest, Query001, TestSize.Level0)
699 {
700 PermissionUsedRecordDb::DataType type = PermissionUsedRecordDb::PERMISSION_USED_TYPE;
701 GenericValues conditionValue;
702 conditionValue.Put(PrivacyFiledConst::FIELD_TOKEN_ID, RANDOM_TOKENID);
703 conditionValue.Put(PrivacyFiledConst::FIELD_PERMISSION_CODE,
704 static_cast<int32_t>(Constant::OpCode::OP_ANSWER_CALL));
705 std::vector<GenericValues> results;
706 ASSERT_EQ(PermissionUsedRecordDb::ExecuteResult::SUCCESS,
707 PermissionUsedRecordDb::GetInstance().Query(type, conditionValue, results));
708 for (const auto& result : results) {
709 // no record with token 123 before add
710 ASSERT_NE(RANDOM_TOKENID, result.GetInt(PrivacyFiledConst::FIELD_TOKEN_ID));
711 }
712 results.clear();
713
714 GenericValues value;
715 value.Put(PrivacyFiledConst::FIELD_TOKEN_ID, RANDOM_TOKENID);
716 value.Put(PrivacyFiledConst::FIELD_PERMISSION_CODE, static_cast<int32_t>(Constant::OpCode::OP_ANSWER_CALL));
717 value.Put(PrivacyFiledConst::FIELD_USED_TYPE, PERMISSION_USED_TYPE_VALUE);
718 std::vector<GenericValues> values;
719 values.emplace_back(value);
720 // add a record: 123-0-1
721 ASSERT_EQ(PermissionUsedRecordDb::ExecuteResult::SUCCESS, PermissionUsedRecordDb::GetInstance().Add(type, values));
722
723 ASSERT_EQ(PermissionUsedRecordDb::ExecuteResult::SUCCESS,
724 PermissionUsedRecordDb::GetInstance().Query(type, conditionValue, results));
725 ASSERT_EQ(false, results.empty());
726 for (const auto& result : results) {
727 // query result success, when tokenId is 123, permission_code is 0 and used_type is 1
728 if (RANDOM_TOKENID == result.GetInt(PrivacyFiledConst::FIELD_TOKEN_ID)) {
729 ASSERT_EQ(static_cast<int32_t>(Constant::OpCode::OP_ANSWER_CALL),
730 result.GetInt(PrivacyFiledConst::FIELD_PERMISSION_CODE));
731 ASSERT_EQ(PERMISSION_USED_TYPE_VALUE, result.GetInt(PrivacyFiledConst::FIELD_USED_TYPE));
732 break;
733 }
734 }
735
736 ASSERT_EQ(PermissionUsedRecordDb::ExecuteResult::SUCCESS, PermissionUsedRecordDb::GetInstance().Remove(
737 type, conditionValue));
738 }
739
740 /*
741 * @tc.name: Update001
742 * @tc.desc: PermissionUsedRecordDb::Update function test
743 * @tc.type: FUNC
744 * @tc.require:
745 */
746 HWTEST_F(PermissionRecordDBTest, Update001, TestSize.Level0)
747 {
748 PermissionUsedRecordDb::DataType type = PermissionUsedRecordDb::PERMISSION_USED_TYPE;
749 GenericValues conditionValue;
750 conditionValue.Put(PrivacyFiledConst::FIELD_TOKEN_ID, RANDOM_TOKENID);
751 conditionValue.Put(PrivacyFiledConst::FIELD_PERMISSION_CODE,
752 static_cast<int32_t>(Constant::OpCode::OP_ANSWER_CALL));
753
754 GenericValues value;
755 value.Put(PrivacyFiledConst::FIELD_TOKEN_ID, RANDOM_TOKENID);
756 value.Put(PrivacyFiledConst::FIELD_PERMISSION_CODE, static_cast<int32_t>(Constant::OpCode::OP_ANSWER_CALL));
757 value.Put(PrivacyFiledConst::FIELD_USED_TYPE, PERMISSION_USED_TYPE_VALUE);
758 std::vector<GenericValues> values;
759 values.emplace_back(value);
760 // add a record: 123-0-1
761 ASSERT_EQ(PermissionUsedRecordDb::ExecuteResult::SUCCESS, PermissionUsedRecordDb::GetInstance().Add(type, values));
762
763 std::vector<GenericValues> results;
764 ASSERT_EQ(PermissionUsedRecordDb::ExecuteResult::SUCCESS,
765 PermissionUsedRecordDb::GetInstance().Query(type, conditionValue, results));
766 ASSERT_EQ(false, results.empty());
767 for (const auto& result : results) {
768 // query result success, when tokenId is 123, permission_code is 0 and used_type is 1
769 if (RANDOM_TOKENID == result.GetInt(PrivacyFiledConst::FIELD_TOKEN_ID)) {
770 ASSERT_EQ(static_cast<int32_t>(Constant::OpCode::OP_ANSWER_CALL),
771 result.GetInt(PrivacyFiledConst::FIELD_PERMISSION_CODE));
772 ASSERT_EQ(PERMISSION_USED_TYPE_VALUE, result.GetInt(PrivacyFiledConst::FIELD_USED_TYPE));
773 break;
774 }
775 }
776 results.clear();
777
778 GenericValues modifyValue;
779 modifyValue.Put(PrivacyFiledConst::FIELD_USED_TYPE, PICKER_TYPE_VALUE);
780 // update record 123-0-1 to 123-0-2
781 ASSERT_EQ(PermissionUsedRecordDb::ExecuteResult::SUCCESS, PermissionUsedRecordDb::GetInstance().Update(
782 type, modifyValue, conditionValue));
783 ASSERT_EQ(PermissionUsedRecordDb::ExecuteResult::SUCCESS,
784 PermissionUsedRecordDb::GetInstance().Query(type, conditionValue, results));
785 ASSERT_EQ(false, results.empty());
786 for (const auto& result : results) {
787 // query result success, when tokenId is 123, permission_code is 0 and used_type is 2
788 if (RANDOM_TOKENID == result.GetInt(PrivacyFiledConst::FIELD_TOKEN_ID)) {
789 ASSERT_EQ(static_cast<int32_t>(Constant::OpCode::OP_ANSWER_CALL),
790 result.GetInt(PrivacyFiledConst::FIELD_PERMISSION_CODE));
791 ASSERT_EQ(PICKER_TYPE_VALUE, result.GetInt(PrivacyFiledConst::FIELD_USED_TYPE));
792 break;
793 }
794 }
795
796 ASSERT_EQ(PermissionUsedRecordDb::ExecuteResult::SUCCESS, PermissionUsedRecordDb::GetInstance().Remove(
797 type, conditionValue));
798 }
799 } // namespace AccessToken
800 } // namespace Security
801 } // namespace OHOS
802