• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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