• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
16 #include <cstdint>
17 #include <gtest/gtest.h>
18 
19 #include "access_token.h"
20 #include "accesstoken_kit.h"
21 #include "accesstoken_log.h"
22 #include "audio_manager_privacy_client.h"
23 #include "camera_manager_privacy_client.h"
24 #include "constant.h"
25 #include "data_translator.h"
26 #include "permission_record.h"
27 #define private public
28 #include "active_status_callback_manager.h"
29 #include "permission_record_manager.h"
30 #include "permission_record_repository.h"
31 #include "permission_used_record_cache.h"
32 #include "permission_used_record_db.h"
33 #undef private
34 #include "perm_active_status_change_callback_stub.h"
35 #include "privacy_error.h"
36 #include "privacy_field_const.h"
37 #include "privacy_kit.h"
38 #include "state_change_callback.h"
39 #include "time_util.h"
40 #include "token_setproc.h"
41 
42 using namespace testing;
43 using namespace testing::ext;
44 using namespace OHOS;
45 
46 namespace OHOS {
47 namespace Security {
48 namespace AccessToken {
49 namespace {
50 static AccessTokenID g_selfTokenId = 0;
51 constexpr const char* CAMERA_PERMISSION_NAME = "ohos.permission.CAMERA";
52 constexpr const char* MICROPHONE_PERMISSION_NAME = "ohos.permission.MICROPHONE";
53 constexpr const char* LOCATION_PERMISSION_NAME = "ohos.permission.LOCATION";
54 static constexpr uint32_t MAX_CALLBACK_SIZE = 1024;
55 static constexpr int32_t MAX_DETAIL_NUM = 500;
56 static constexpr int32_t DEEP_COPY_NUM = 10;
57 static constexpr int64_t ONE_SECOND = 1000;
58 static constexpr int64_t TWO_SECOND = 2000;
59 static constexpr int64_t THREE_SECOND = 3000;
60 static PermissionStateFull g_testState1 = {
61     .permissionName = "ohos.permission.CAMERA",
62     .isGeneral = true,
63     .resDeviceID = {"local"},
64     .grantStatus = {PermissionState::PERMISSION_GRANTED},
65     .grantFlags = {1}
66 };
67 
68 static PermissionStateFull g_testState2 = {
69     .permissionName = "ohos.permission.MANAGE_CAMERA_CONFIG",
70     .isGeneral = true,
71     .resDeviceID = {"local"},
72     .grantStatus = {PermissionState::PERMISSION_GRANTED},
73     .grantFlags = {1}
74 };
75 
76 static HapPolicyParams g_PolicyPrams1 = {
77     .apl = APL_NORMAL,
78     .domain = "test.domain.A",
79     .permList = {},
80     .permStateList = {g_testState1, g_testState2}
81 };
82 
83 static HapInfoParams g_InfoParms1 = {
84     .userID = 1,
85     .bundleName = "ohos.privacy_test.bundleA",
86     .instIndex = 0,
87     .appIDDesc = "privacy_test.bundleA"
88 };
89 
90 static HapPolicyParams g_PolicyPrams2 = {
91     .apl = APL_NORMAL,
92     .domain = "test.domain.B",
93     .permList = {},
94     .permStateList = {g_testState1}
95 };
96 
97 static HapInfoParams g_InfoParms2 = {
98     .userID = 1,
99     .bundleName = "ohos.privacy_test.bundleB",
100     .instIndex = 0,
101     .appIDDesc = "privacy_test.bundleB"
102 };
103 
104 static PermissionRecord g_recordA1 = {
105     .opCode = Constant::OP_CAMERA,
106     .status = ActiveChangeType::PERM_ACTIVE_IN_BACKGROUND,
107     .timestamp = 0L,
108     .accessDuration = 0L,
109     .accessCount = 1,
110     .rejectCount = 0,
111     .lockScreenStatus = LockScreenStatusChangeType::PERM_ACTIVE_IN_UNLOCKED
112 };
113 
114 static PermissionRecord g_recordA2 = {
115     .opCode = Constant::OP_MICROPHONE,
116     .status = ActiveChangeType::PERM_ACTIVE_IN_BACKGROUND,
117     .timestamp = 0L,
118     .accessDuration = 0L,
119     .accessCount = 1,
120     .rejectCount = 0,
121     .lockScreenStatus = LockScreenStatusChangeType::PERM_ACTIVE_IN_UNLOCKED
122 };
123 
124 static PermissionRecord g_recordB1 = {
125     .opCode = Constant::OP_CAMERA,
126     .status = ActiveChangeType::PERM_ACTIVE_IN_BACKGROUND,
127     .timestamp = 0L,
128     .accessDuration = 0L,
129     .accessCount = 1,
130     .rejectCount = 0,
131     .lockScreenStatus = LockScreenStatusChangeType::PERM_ACTIVE_IN_UNLOCKED
132 };
133 
134 static PermissionRecord g_recordB2 = {
135     .opCode = Constant::OP_MICROPHONE,
136     .status = ActiveChangeType::PERM_ACTIVE_IN_BACKGROUND,
137     .timestamp = 0L,
138     .accessDuration = 0L,
139     .accessCount = 1,
140     .rejectCount = 0,
141     .lockScreenStatus = LockScreenStatusChangeType::PERM_ACTIVE_IN_UNLOCKED
142 };
143 
144 static PermissionRecord g_record = {
145     .tokenId = 123,
146     .opCode = static_cast<int32_t>(Constant::OpCode::OP_READ_CALENDAR),
147     .status = static_cast<int32_t>(ActiveChangeType::PERM_ACTIVE_IN_FOREGROUND),
148     .lockScreenStatus = static_cast<int32_t>(LockScreenStatusChangeType::PERM_ACTIVE_IN_UNLOCKED),
149 };
150 }
151 class PermissionRecordManagerTest : public testing::Test {
152 public:
153     static void SetUpTestCase();
154 
155     static void TearDownTestCase();
156 
157     void SetUp();
158 
159     void TearDown();
160 };
161 
SetUpTestCase()162 void PermissionRecordManagerTest::SetUpTestCase()
163 {
164     g_selfTokenId = GetSelfTokenID();
165 }
166 
TearDownTestCase()167 void PermissionRecordManagerTest::TearDownTestCase() {}
168 
SetUp()169 void PermissionRecordManagerTest::SetUp()
170 {
171     PermissionRecordManager::GetInstance().Register();
172 
173     AccessTokenKit::AllocHapToken(g_InfoParms1, g_PolicyPrams1);
174     AccessTokenKit::AllocHapToken(g_InfoParms2, g_PolicyPrams2);
175 }
176 
TearDown()177 void PermissionRecordManagerTest::TearDown()
178 {
179     AccessTokenID tokenId = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
180         g_InfoParms1.instIndex);
181     AccessTokenKit::DeleteToken(tokenId);
182     tokenId = AccessTokenKit::GetHapTokenID(g_InfoParms2.userID, g_InfoParms2.bundleName,
183         g_InfoParms2.instIndex);
184     AccessTokenKit::DeleteToken(tokenId);
185     EXPECT_EQ(0, SetSelfTokenID(g_selfTokenId));
186 }
187 
188 class CbCustomizeTest1 : public StateCustomizedCbk {
189 public:
CbCustomizeTest1()190     CbCustomizeTest1()
191     {}
192 
~CbCustomizeTest1()193     ~CbCustomizeTest1()
194     {}
195 
StateChangeNotify(AccessTokenID tokenId,bool isShow)196     virtual void StateChangeNotify(AccessTokenID tokenId, bool isShow)
197     {}
198 
Stop()199     void Stop()
200     {}
201 };
202 
203 class CbCustomizeTest2 : public IRemoteObject {
204 public:
CbCustomizeTest2()205     CbCustomizeTest2()
206     {}
207 
~CbCustomizeTest2()208     ~CbCustomizeTest2()
209     {}
210 };
211 
212 
213 /**
214  * @tc.name: OnForegroundApplicationChanged001
215  * @tc.desc: RegisterPermActiveStatusCallback with invalid parameter.
216  * @tc.type: FUNC
217  * @tc.require: issueI5RWX8
218  */
219 HWTEST_F(PermissionRecordManagerTest, OnForegroundApplicationChanged001, TestSize.Level1)
220 {
221     PrivacyAppStateObserver observer;
222     AppStateData appStateData;
223     appStateData.state = static_cast<int32_t>(ApplicationState::APP_STATE_FOREGROUND);
224     observer.OnForegroundApplicationChanged(appStateData);
225     appStateData.state = static_cast<int32_t>(ApplicationState::APP_STATE_BACKGROUND);
226     observer.OnForegroundApplicationChanged(appStateData);
227     ASSERT_EQ(static_cast<int32_t>(ApplicationState::APP_STATE_BACKGROUND), appStateData.state);
228 }
229 
230 /**
231  * @tc.name: RegisterPermActiveStatusCallback001
232  * @tc.desc: RegisterPermActiveStatusCallback with invalid parameter.
233  * @tc.type: FUNC
234  * @tc.require: issueI5RWX8
235  */
236 HWTEST_F(PermissionRecordManagerTest, RegisterPermActiveStatusCallback001, TestSize.Level1)
237 {
238     std::vector<std::string> permList = {"ohos.permission.CAMERA"};
239     ASSERT_EQ(PrivacyError::ERR_PARAM_INVALID,
240             PermissionRecordManager::GetInstance().RegisterPermActiveStatusCallback(permList, nullptr));
241 }
242 
243 
244 class PermActiveStatusChangeCallback : public PermActiveStatusChangeCallbackStub {
245 public:
246     PermActiveStatusChangeCallback() = default;
247     virtual ~PermActiveStatusChangeCallback() = default;
248 
ActiveStatusChangeCallback(ActiveChangeResponse & result)249     void ActiveStatusChangeCallback(ActiveChangeResponse& result) {}
250 };
251 
252 /**
253  * @tc.name: RegisterPermActiveStatusCallback002
254  * @tc.desc: RegisterPermActiveStatusCallback with exceed limitation.
255  * @tc.type: FUNC
256  * @tc.require: issueI5RWX8
257  */
258 HWTEST_F(PermissionRecordManagerTest, RegisterPermActiveStatusCallback002, TestSize.Level1)
259 {
260     std::vector<std::string> permList = {"ohos.permission.CAMERA"};
261     std::vector<sptr<PermActiveStatusChangeCallback>> callbacks;
262 
263     for (size_t i = 0; i < MAX_CALLBACK_SIZE; ++i) {
264         sptr<PermActiveStatusChangeCallback> callback = new (std::nothrow) PermActiveStatusChangeCallback();
265         ASSERT_NE(nullptr, callback);
266         ASSERT_EQ(RET_SUCCESS,
267             PermissionRecordManager::GetInstance().RegisterPermActiveStatusCallback(permList, callback->AsObject()));
268         callbacks.emplace_back(callback);
269     }
270 
271     sptr<PermActiveStatusChangeCallback> callback = new (std::nothrow) PermActiveStatusChangeCallback();
272     ASSERT_NE(nullptr, callback);
273     ASSERT_EQ(PrivacyError::ERR_CALLBACKS_EXCEED_LIMITATION,
274         PermissionRecordManager::GetInstance().RegisterPermActiveStatusCallback(permList, callback->AsObject()));
275 
276     for (size_t i = 0; i < callbacks.size(); ++i) {
277         ASSERT_EQ(RET_SUCCESS,
278             PermissionRecordManager::GetInstance().UnRegisterPermActiveStatusCallback(callbacks[i]->AsObject()));
279     }
280 }
281 
282 /**
283  * @tc.name: UnRegisterPermActiveStatusCallback001
284  * @tc.desc: UnRegisterPermActiveStatusCallback with invalid parameter.
285  * @tc.type: FUNC
286  * @tc.require: issueI5RWX8
287  */
288 HWTEST_F(PermissionRecordManagerTest, UnRegisterPermActiveStatusCallback001, TestSize.Level1)
289 {
290     std::vector<std::string> permList = {"ohos.permission.CAMERA"};
291     ASSERT_EQ(PrivacyError::ERR_PARAM_INVALID,
292             PermissionRecordManager::GetInstance().RegisterPermActiveStatusCallback(permList, nullptr));
293 }
294 
295 /*
296  * @tc.name: AppStatusListener001
297  * @tc.desc: register and startusing permissions then use NotifyAppStateChange
298  * @tc.type: FUNC
299  * @tc.require: issueI5SZHG
300  */
301 HWTEST_F(PermissionRecordManagerTest, AppStatusListener001, TestSize.Level1)
302 {
303     AccessTokenID tokenId1 = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
304         g_InfoParms1.instIndex);
305     ASSERT_NE(static_cast<AccessTokenID>(0), tokenId1);
306     AccessTokenID tokenId2 = AccessTokenKit::GetHapTokenID(g_InfoParms2.userID, g_InfoParms2.bundleName,
307         g_InfoParms2.instIndex);
308     ASSERT_NE(static_cast<AccessTokenID>(0), tokenId2);
309 
310     g_recordA1.tokenId = tokenId1;
311     g_recordA2.tokenId = tokenId1;
312     g_recordB1.tokenId = tokenId2;
313     g_recordB2.tokenId = tokenId2;
314     PermissionRecordManager::GetInstance().startRecordList_.emplace_back(g_recordA1);
315     PermissionRecordManager::GetInstance().startRecordList_.emplace_back(g_recordA2);
316     PermissionRecordManager::GetInstance().startRecordList_.emplace_back(g_recordB1);
317     PermissionRecordManager::GetInstance().startRecordList_.emplace_back(g_recordB2);
318 
319     PermissionRecordManager::GetInstance().NotifyAppStateChange(tokenId1, PERM_ACTIVE_IN_FOREGROUND);
320     PermissionRecordManager::GetInstance().NotifyAppStateChange(tokenId2, PERM_ACTIVE_IN_FOREGROUND);
321     PermissionRecordManager::GetInstance().NotifyAppStateChange(tokenId1, PERM_ACTIVE_IN_FOREGROUND);
322     PermissionRecordManager::GetInstance().NotifyAppStateChange(tokenId2, PERM_ACTIVE_IN_FOREGROUND);
323     PermissionRecordManager::GetInstance().NotifyAppStateChange(tokenId1, PERM_ACTIVE_IN_BACKGROUND);
324     PermissionRecordManager::GetInstance().NotifyAppStateChange(tokenId2, PERM_ACTIVE_IN_BACKGROUND);
325     PermissionRecordManager::GetInstance().NotifyAppStateChange(tokenId1, PERM_ACTIVE_IN_BACKGROUND);
326     PermissionRecordManager::GetInstance().NotifyAppStateChange(tokenId2, PERM_ACTIVE_IN_BACKGROUND);
327 }
328 
329 /*
330  * @tc.name: FindRecordsToUpdateAndExecutedTest001
331  * @tc.desc: FindRecordsToUpdateAndExecuted function test with invaild tokenId or permissionName or callback.
332  * @tc.type: FUNC
333  * @tc.require: issueI5RWX5 issueI5RWX3 issueI5RWXA
334  */
335 HWTEST_F(PermissionRecordManagerTest, FindRecordsToUpdateAndExecutedTest001, TestSize.Level1)
336 {
337     AccessTokenID tokenId = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
338         g_InfoParms1.instIndex);
339     ASSERT_NE(INVALID_TOKENID, tokenId);
340 
341     EXPECT_EQ(0, SetSelfTokenID(tokenId));
342 
343     ActiveChangeType status = PERM_ACTIVE_IN_BACKGROUND;
344 
345     PermissionRecord record1 = {
346         .tokenId = tokenId,
347         .opCode = Constant::OP_CAMERA,
348     };
349     CameraManagerPrivacyClient::GetInstance().MuteCamera(false);
350     PermissionRecordManager::GetInstance().AddRecordToStartList(record1);
351 #ifdef CAMERA_FLOAT_WINDOW_ENABLE
352     PermissionRecordManager::GetInstance().NotifyCameraFloatWindowChange(tokenId, false);
353 #endif
354     PermissionRecordManager::GetInstance().FindRecordsToUpdateAndExecuted(tokenId, status);
355     PermissionRecordManager::GetInstance().NotifyAppStateChange(tokenId, status);
356 
357     PermissionRecord record;
358     PermissionRecordManager::GetInstance().GetRecordFromStartList(record1.tokenId, record1.opCode, record);
359 
360     ASSERT_EQ(record1.tokenId, tokenId);
361 }
362 
363 /*
364  * @tc.name: FindRecordsToUpdateAndExecutedTest002
365  * @tc.desc: FindRecordsToUpdateAndExecuted function test with invaild tokenId or permissionName or callback.
366  * @tc.type: FUNC
367  * @tc.require: issueI5RWX5 issueI5RWX3 issueI5RWXA
368  */
369 HWTEST_F(PermissionRecordManagerTest, FindRecordsToUpdateAndExecutedTest002, TestSize.Level1)
370 {
371     AccessTokenID tokenId = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
372         g_InfoParms1.instIndex);
373     ASSERT_NE(INVALID_TOKENID, tokenId);
374     ActiveChangeType status = PERM_ACTIVE_IN_BACKGROUND;
375 
376     PermissionRecord record1 = {
377         .tokenId = tokenId,
378         .opCode = Constant::OP_MICROPHONE,
379     };
380     PermissionRecordManager::GetInstance().AddRecordToStartList(record1);
381 #ifdef CAMERA_FLOAT_WINDOW_ENABLE
382     PermissionRecordManager::GetInstance().NotifyCameraFloatWindowChange(tokenId, false);
383 #endif
384     PermissionRecordManager::GetInstance().FindRecordsToUpdateAndExecuted(tokenId, status);
385     PermissionRecordManager::GetInstance().NotifyAppStateChange(tokenId, status);
386 
387     PermissionRecord record;
388     PermissionRecordManager::GetInstance().GetRecordFromStartList(record1.tokenId, record1.opCode, record);
389     ASSERT_EQ(record1.tokenId, tokenId);
390 }
391 
392 /*
393  * @tc.name: FindRecordsToUpdateAndExecutedTest003
394  * @tc.desc: FindRecordsToUpdateAndExecuted function test with invaild tokenId or permissionName or callback.
395  * @tc.type: FUNC
396  * @tc.require: issueI5RWX5 issueI5RWX3 issueI5RWXA
397  */
398 HWTEST_F(PermissionRecordManagerTest, FindRecordsToUpdateAndExecutedTest003, TestSize.Level1)
399 {
400     AccessTokenID tokenId = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
401         g_InfoParms1.instIndex);
402     ASSERT_NE(INVALID_TOKENID, tokenId);
403     ActiveChangeType status = PERM_ACTIVE_IN_FOREGROUND;
404 
405     PermissionRecord record1 = {
406         .tokenId = tokenId,
407         .opCode = Constant::OP_CAMERA,
408     };
409     PermissionRecordManager::GetInstance().AddRecordToStartList(record1);
410 #ifdef CAMERA_FLOAT_WINDOW_ENABLE
411     PermissionRecordManager::GetInstance().NotifyCameraFloatWindowChange(tokenId, false);
412 #endif
413     PermissionRecordManager::GetInstance().FindRecordsToUpdateAndExecuted(tokenId, status);
414 
415     PermissionRecord record;
416     PermissionRecordManager::GetInstance().GetRecordFromStartList(record1.tokenId, record1.opCode, record);
417 
418     ASSERT_EQ(record1.tokenId, tokenId);
419 }
420 
421 /*
422  * @tc.name: FindRecordsToUpdateAndExecutedTest004
423  * @tc.desc: FindRecordsToUpdateAndExecuted function test with invaild tokenId or permissionName or callback.
424  * @tc.type: FUNC
425  * @tc.require: issueI5RWX5 issueI5RWX3 issueI5RWXA
426  */
427 HWTEST_F(PermissionRecordManagerTest, FindRecordsToUpdateAndExecutedTest004, TestSize.Level1)
428 {
429     AccessTokenID tokenId = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
430         g_InfoParms1.instIndex);
431     ASSERT_NE(INVALID_TOKENID, tokenId);
432     ActiveChangeType status = PERM_ACTIVE_IN_BACKGROUND;
433 
434     PermissionRecord record1 = {
435         .tokenId = tokenId,
436         .opCode = Constant::OP_CAMERA,
437     };
438     PermissionRecordManager::GetInstance().AddRecordToStartList(record1);
439 #ifdef CAMERA_FLOAT_WINDOW_ENABLE
440     PermissionRecordManager::GetInstance().NotifyCameraFloatWindowChange(tokenId, true);
441 #endif
442     PermissionRecordManager::GetInstance().FindRecordsToUpdateAndExecuted(tokenId, status);
443 
444     PermissionRecord record;
445     PermissionRecordManager::GetInstance().GetRecordFromStartList(record1.tokenId, record1.opCode, record);
446     ASSERT_EQ(record1.tokenId, tokenId);
447 }
448 
449 /*
450  * @tc.name: FindRecordsToUpdateAndExecutedTest005
451  * @tc.desc: FindRecordsToUpdateAndExecuted function test with invaild tokenId or permissionName or callback.
452  * @tc.type: FUNC
453  * @tc.require: issueI5RWX5 issueI5RWX3 issueI5RWXA
454  */
455 HWTEST_F(PermissionRecordManagerTest, FindRecordsToUpdateAndExecutedTest005, TestSize.Level1)
456 {
457     AccessTokenID tokenId = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
458         g_InfoParms1.instIndex);
459     ASSERT_NE(INVALID_TOKENID, tokenId);
460     ActiveChangeType status = PERM_ACTIVE_IN_BACKGROUND;
461 
462     PermissionRecord record1 = {
463         .tokenId = tokenId,
464         .opCode = Constant::OP_MICROPHONE,
465         .status = PERM_ACTIVE_IN_FOREGROUND,
466         .timestamp = TimeUtil::GetCurrentTimestamp(),
467         .accessCount = 1,
468         .lockScreenStatus = PERM_ACTIVE_IN_LOCKED,
469     };
470     PermissionRecordManager::GetInstance().startRecordList_.emplace_back(record1);
471 
472     PermissionRecordManager::GetInstance().FindRecordsToUpdateAndExecuted(tokenId, status);
473 
474     std::string permissionName = MICROPHONE_PERMISSION_NAME;
475     std::vector<std::string> permissionList;
476     permissionList.emplace_back(permissionName);
477     PermissionUsedRequest request = {
478         .tokenId = tokenId,
479         .permissionList = permissionList,
480         .flag = FLAG_PERMISSION_USAGE_DETAIL
481     };
482 
483     PermissionUsedResult queryResult;
484     PermissionRecordManager::GetInstance().GetPermissionUsedRecords(request, queryResult);
485     ASSERT_NE(queryResult.bundleRecords.size(), static_cast<size_t>(0));
486     auto bundleRecordIter = std::find_if(queryResult.bundleRecords.begin(), queryResult.bundleRecords.end(),
__anon5b3ae2260202(const BundleUsedRecord& bur) 487         [tokenId](const BundleUsedRecord& bur) {
488             return tokenId == bur.tokenId;
489         });
490     ASSERT_NE(bundleRecordIter, queryResult.bundleRecords.end());
491 
492     auto permissionRecordIter = std::find_if(bundleRecordIter->permissionRecords.begin(),
493         bundleRecordIter->permissionRecords.end(),
__anon5b3ae2260302(const PermissionUsedRecord& prs) 494         [permissionName](const PermissionUsedRecord& prs) {
495             return permissionName == prs.permissionName;
496         });
497     ASSERT_NE(permissionRecordIter, bundleRecordIter->permissionRecords.end());
498 
499     ASSERT_EQ(static_cast<size_t>(1), permissionRecordIter->accessRecords.size());
500     ASSERT_EQ(PERM_ACTIVE_IN_BACKGROUND, permissionRecordIter->accessRecords[0].status);
501     ASSERT_EQ(PERM_ACTIVE_IN_UNLOCKED, permissionRecordIter->accessRecords[0].lockScreenStatus);
502 }
503 
GenerateRequest(AccessTokenID tokenId,std::string permissionName)504 PermissionUsedRequest GenerateRequest(AccessTokenID tokenId, std::string permissionName)
505 {
506     std::vector<std::string> permissionList;
507     permissionList.emplace_back(permissionName);
508     PermissionUsedRequest request = {
509         .tokenId = tokenId,
510         .permissionList = permissionList,
511         .flag = FLAG_PERMISSION_USAGE_DETAIL
512     };
513     return request;
514 }
515 
516 /*
517  * @tc.name: GenerateRecordsWhenScreenStatusChangedTest001
518  * @tc.desc: FindRecordsToUpdateAndExecuted function test with invaild tokenId or permissionName or callback.
519  * @tc.type: FUNC
520  * @tc.require: issueI5RWX5 issueI5RWX3 issueI5RWXA
521  */
522 HWTEST_F(PermissionRecordManagerTest, GenerateRecordsWhenScreenStatusChangedTest001, TestSize.Level1)
523 {
524     AccessTokenID tokenId = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
525         g_InfoParms1.instIndex);
526     ASSERT_NE(INVALID_TOKENID, tokenId);
527     EXPECT_EQ(0, SetSelfTokenID(tokenId));
528 
529     PermissionRecord record = {
530         .tokenId = tokenId,
531         .opCode = Constant::OP_MICROPHONE,
532         .status = PERM_ACTIVE_IN_FOREGROUND,
533         .timestamp = TimeUtil::GetCurrentTimestamp(),
534         .accessCount = 1,
535         .lockScreenStatus = PERM_ACTIVE_IN_UNLOCKED
536     };
537     PermissionRecordManager::GetInstance().startRecordList_.emplace_back(record);
538     LockScreenStatusChangeType screenLocked = PERM_ACTIVE_IN_LOCKED;
539     PermissionRecordManager::GetInstance().NotifyLockScreenStatusChange(screenLocked);
540 
541     std::string permissionName = MICROPHONE_PERMISSION_NAME;
542     PermissionUsedRequest request = GenerateRequest(tokenId, permissionName);
543 
544     PermissionUsedResult result;
545     PermissionRecordManager::GetInstance().GetPermissionUsedRecords(request, result);
546     auto bundleRecordIter = std::find_if(result.bundleRecords.begin(), result.bundleRecords.end(),
__anon5b3ae2260402(const BundleUsedRecord& bur) 547         [tokenId](const BundleUsedRecord& bur) {
548             return tokenId == bur.tokenId;
549         });
550     ASSERT_NE(bundleRecordIter, result.bundleRecords.end());
551 
552     auto permissionRecordIter = std::find_if(bundleRecordIter->permissionRecords.begin(),
553         bundleRecordIter->permissionRecords.end(),
__anon5b3ae2260502(const PermissionUsedRecord& prs) 554         [permissionName](const PermissionUsedRecord& prs) {
555             return permissionName == prs.permissionName;
556         });
557     ASSERT_NE(permissionRecordIter, bundleRecordIter->permissionRecords.end());
558 
559     ASSERT_EQ(static_cast<size_t>(1), permissionRecordIter->accessRecords.size());
560     ASSERT_EQ(PERM_ACTIVE_IN_FOREGROUND, permissionRecordIter->accessRecords[0].status);
561     ASSERT_EQ(PERM_ACTIVE_IN_UNLOCKED, permissionRecordIter->accessRecords[0].lockScreenStatus);
562 }
563 
GenerateLockScreenPerUsedRecord(AccessTokenID tokenId1,AccessTokenID tokenId2)564 void GenerateLockScreenPerUsedRecord(AccessTokenID tokenId1, AccessTokenID tokenId2)
565 {
566     PermissionRecord record1 = {
567         .tokenId = tokenId1,
568         .opCode = Constant::OP_MICROPHONE,
569         .status = PERM_ACTIVE_IN_FOREGROUND,
570         .timestamp = TimeUtil::GetCurrentTimestamp(),
571         .accessCount = 1,
572         .lockScreenStatus = PERM_ACTIVE_IN_UNLOCKED
573     };
574 
575     PermissionRecord record2 = {
576         .tokenId = tokenId2,
577         .opCode = Constant::OP_MICROPHONE,
578         .status = PERM_ACTIVE_IN_BACKGROUND,
579         .timestamp = TimeUtil::GetCurrentTimestamp(),
580         .accessCount = 1,
581         .lockScreenStatus = PERM_ACTIVE_IN_UNLOCKED
582     };
583     PermissionRecordManager::GetInstance().startRecordList_.emplace_back(record1);
584     PermissionRecordManager::GetInstance().startRecordList_.emplace_back(record2);
585     LockScreenStatusChangeType screenLocked = PERM_ACTIVE_IN_LOCKED;
586     PermissionRecordManager::GetInstance().GenerateRecordsWhenScreenStatusChanged(screenLocked);
587 }
588 
589 /*
590  * @tc.name: GenerateRecordsWhenScreenStatusChangedTest002
591  * @tc.desc: FindRecordsToUpdateAndExecuted function test with invaild tokenId or permissionName or callback.
592  * @tc.type: FUNC
593  * @tc.require: issueI5RWX5 issueI5RWX3 issueI5RWXA
594  */
595 HWTEST_F(PermissionRecordManagerTest, GenerateRecordsWhenScreenStatusChangedTest002, TestSize.Level1)
596 {
597     AccessTokenID tokenId1 = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
598         g_InfoParms1.instIndex);
599     ASSERT_NE(INVALID_TOKENID, tokenId1);
600     EXPECT_EQ(0, SetSelfTokenID(tokenId1));
601 
602     AccessTokenID tokenId2 = AccessTokenKit::GetHapTokenID(g_InfoParms2.userID, g_InfoParms2.bundleName,
603         g_InfoParms2.instIndex);
604     ASSERT_NE(INVALID_TOKENID, tokenId2);
605     EXPECT_EQ(0, SetSelfTokenID(tokenId2));
606 
607     GenerateLockScreenPerUsedRecord(tokenId1, tokenId2);
608 
609     std::string permissionName = MICROPHONE_PERMISSION_NAME;
610     PermissionUsedRequest request1 = GenerateRequest(tokenId1, permissionName);
611     PermissionUsedResult result1;
612     PermissionRecordManager::GetInstance().GetPermissionUsedRecords(request1, result1);
613     auto bundleRecordIter1 = std::find_if(result1.bundleRecords.begin(), result1.bundleRecords.end(),
__anon5b3ae2260602(const BundleUsedRecord& bur) 614         [tokenId1](const BundleUsedRecord& bur) {
615             return tokenId1 == bur.tokenId;
616         });
617     ASSERT_NE(bundleRecordIter1, result1.bundleRecords.end());
618 
619     auto permissionRecordIter1 = std::find_if(bundleRecordIter1->permissionRecords.begin(),
620         bundleRecordIter1->permissionRecords.end(),
__anon5b3ae2260702(const PermissionUsedRecord& prs) 621         [permissionName](const PermissionUsedRecord& prs) {
622             return permissionName == prs.permissionName;
623         });
624     ASSERT_NE(permissionRecordIter1, bundleRecordIter1->permissionRecords.end());
625 
626     ASSERT_EQ(static_cast<size_t>(1), permissionRecordIter1->accessRecords.size());
627     ASSERT_EQ(PERM_ACTIVE_IN_FOREGROUND, permissionRecordIter1->accessRecords[0].status);
628     ASSERT_EQ(PERM_ACTIVE_IN_UNLOCKED, permissionRecordIter1->accessRecords[0].lockScreenStatus);
629 
630     PermissionUsedRequest request2 = GenerateRequest(tokenId2, permissionName);
631     PermissionUsedResult result2;
632     PermissionRecordManager::GetInstance().GetPermissionUsedRecords(request2, result2);
633     auto bundleRecordIter2 = std::find_if(result2.bundleRecords.begin(), result2.bundleRecords.end(),
__anon5b3ae2260802(const BundleUsedRecord& bur) 634         [tokenId2](const BundleUsedRecord& bur) {
635             return tokenId2 == bur.tokenId;
636         });
637     ASSERT_NE(bundleRecordIter2, result2.bundleRecords.end());
638 
639     auto permissionRecordIter2 = std::find_if(bundleRecordIter2->permissionRecords.begin(),
640         bundleRecordIter2->permissionRecords.end(),
__anon5b3ae2260902(const PermissionUsedRecord& prs) 641         [permissionName](const PermissionUsedRecord& prs) {
642             return permissionName == prs.permissionName;
643         });
644     ASSERT_NE(permissionRecordIter2, bundleRecordIter2->permissionRecords.end());
645 
646     ASSERT_EQ(static_cast<size_t>(1), permissionRecordIter2->accessRecords.size());
647     ASSERT_EQ(PERM_ACTIVE_IN_BACKGROUND, permissionRecordIter2->accessRecords[0].status);
648     ASSERT_EQ(PERM_ACTIVE_IN_UNLOCKED, permissionRecordIter2->accessRecords[0].lockScreenStatus);
649 }
650 
651 /*
652  * @tc.name: GenerateRecordsWhenScreenStatusChangedTest003
653  * @tc.desc: FindRecordsToUpdateAndExecuted function test with invaild tokenId or permissionName or callback.
654  * @tc.type: FUNC
655  * @tc.require: issueI5RWX5 issueI5RWX3 issueI5RWXA
656  */
657 HWTEST_F(PermissionRecordManagerTest, GenerateRecordsWhenScreenStatusChangedTest003, TestSize.Level1)
658 {
659     AccessTokenID tokenId = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
660         g_InfoParms1.instIndex);
661     ASSERT_NE(INVALID_TOKENID, tokenId);
662     EXPECT_EQ(0, SetSelfTokenID(tokenId));
663 
664     PermissionRecord record = {
665         .tokenId = tokenId,
666         .opCode = Constant::OP_MICROPHONE,
667         .status = PERM_ACTIVE_IN_BACKGROUND,
668         .timestamp = TimeUtil::GetCurrentTimestamp(),
669         .accessCount = 1,
670         .lockScreenStatus = PERM_ACTIVE_IN_UNLOCKED
671     };
672 
673     PermissionRecordManager::GetInstance().startRecordList_.emplace_back(record);
674     LockScreenStatusChangeType screenLocked = PERM_ACTIVE_IN_LOCKED;
675     PermissionRecordManager::GetInstance().GenerateRecordsWhenScreenStatusChanged(screenLocked);
676 
677     std::string permissionName = MICROPHONE_PERMISSION_NAME;
678     PermissionUsedRequest request = GenerateRequest(tokenId, permissionName);
679     PermissionUsedResult result;
680     PermissionRecordManager::GetInstance().GetPermissionUsedRecords(request, result);
681     auto bundleRecordIter = std::find_if(result.bundleRecords.begin(), result.bundleRecords.end(),
__anon5b3ae2260a02(const BundleUsedRecord& bur) 682         [tokenId](const BundleUsedRecord& bur) {
683             return tokenId == bur.tokenId;
684         });
685     ASSERT_NE(bundleRecordIter, result.bundleRecords.end());
686 
687     auto permissionRecordIter = std::find_if(bundleRecordIter->permissionRecords.begin(),
688         bundleRecordIter->permissionRecords.end(),
__anon5b3ae2260b02(const PermissionUsedRecord& prs) 689         [permissionName](const PermissionUsedRecord& prs) {
690             return permissionName == prs.permissionName;
691         });
692     ASSERT_NE(permissionRecordIter, bundleRecordIter->permissionRecords.end());
693 
694     ASSERT_EQ(static_cast<size_t>(1), permissionRecordIter->accessRecords.size());
695     ASSERT_EQ(PERM_ACTIVE_IN_BACKGROUND, permissionRecordIter->accessRecords[0].status);
696     ASSERT_EQ(PERM_ACTIVE_IN_UNLOCKED, permissionRecordIter->accessRecords[0].lockScreenStatus);
697 }
698 
699 /*
700  * @tc.name: GenerateRecordsWhenScreenStatusChangedTest004
701  * @tc.desc: FindRecordsToUpdateAndExecuted function test with invaild tokenId or permissionName or callback.
702  * @tc.type: FUNC
703  * @tc.require: issueI5RWX5 issueI5RWX3 issueI5RWXA
704  */
705 HWTEST_F(PermissionRecordManagerTest, GenerateRecordsWhenScreenStatusChangedTest004, TestSize.Level1)
706 {
707     AccessTokenID tokenId = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
708         g_InfoParms1.instIndex);
709     ASSERT_NE(INVALID_TOKENID, tokenId);
710     EXPECT_EQ(0, SetSelfTokenID(tokenId));
711 
712     PermissionRecord record = {
713         .tokenId = tokenId,
714         .opCode = Constant::OP_MICROPHONE,
715         .status = PERM_ACTIVE_IN_FOREGROUND,
716         .timestamp = TimeUtil::GetCurrentTimestamp(),
717         .accessCount = 1,
718         .lockScreenStatus = PERM_ACTIVE_IN_LOCKED
719     };
720 
721     PermissionRecordManager::GetInstance().startRecordList_.emplace_back(record);
722     LockScreenStatusChangeType screenUnLocked = PERM_ACTIVE_IN_UNLOCKED;
723     PermissionRecordManager::GetInstance().GenerateRecordsWhenScreenStatusChanged(screenUnLocked);
724 
725     std::string permissionName = MICROPHONE_PERMISSION_NAME;
726     PermissionUsedRequest request = GenerateRequest(tokenId, permissionName);
727     PermissionUsedResult result;
728     PermissionRecordManager::GetInstance().GetPermissionUsedRecords(request, result);
729     auto bundleRecordIter = std::find_if(result.bundleRecords.begin(), result.bundleRecords.end(),
__anon5b3ae2260c02(const BundleUsedRecord& bur) 730         [tokenId](const BundleUsedRecord& bur) {
731             return tokenId == bur.tokenId;
732         });
733     ASSERT_NE(bundleRecordIter, result.bundleRecords.end());
734 
735     auto permissionRecordIter = std::find_if(bundleRecordIter->permissionRecords.begin(),
736         bundleRecordIter->permissionRecords.end(),
__anon5b3ae2260d02(const PermissionUsedRecord& prs) 737         [permissionName](const PermissionUsedRecord& prs) {
738             return permissionName == prs.permissionName;
739         });
740     ASSERT_NE(permissionRecordIter, bundleRecordIter->permissionRecords.end());
741 
742     ASSERT_EQ(static_cast<size_t>(1), permissionRecordIter->accessRecords.size());
743     ASSERT_EQ(PERM_ACTIVE_IN_BACKGROUND, permissionRecordIter->accessRecords[0].status);
744     ASSERT_EQ(PERM_ACTIVE_IN_UNLOCKED, permissionRecordIter->accessRecords[0].lockScreenStatus);
745 }
746 
GenerateUnLockScreenPerUsedRecord(AccessTokenID tokenId1,AccessTokenID tokenId2)747 void GenerateUnLockScreenPerUsedRecord(AccessTokenID tokenId1, AccessTokenID tokenId2)
748 {
749     PermissionRecord record1 = {
750         .tokenId = tokenId1,
751         .opCode = Constant::OP_MICROPHONE,
752         .status = PERM_ACTIVE_IN_FOREGROUND,
753         .timestamp = TimeUtil::GetCurrentTimestamp(),
754         .accessCount = 1,
755         .lockScreenStatus = PERM_ACTIVE_IN_LOCKED
756     };
757 
758     PermissionRecord record2 = {
759         .tokenId = tokenId2,
760         .opCode = Constant::OP_MICROPHONE,
761         .status = PERM_ACTIVE_IN_BACKGROUND,
762         .timestamp = TimeUtil::GetCurrentTimestamp(),
763         .accessCount = 1,
764         .lockScreenStatus = PERM_ACTIVE_IN_LOCKED
765     };
766     PermissionRecordManager::GetInstance().startRecordList_.emplace_back(record1);
767     PermissionRecordManager::GetInstance().startRecordList_.emplace_back(record2);
768     LockScreenStatusChangeType screenUnLocked = PERM_ACTIVE_IN_UNLOCKED;
769     PermissionRecordManager::GetInstance().GenerateRecordsWhenScreenStatusChanged(screenUnLocked);
770 }
771 
772 /*
773  * @tc.name: GenerateRecordsWhenScreenStatusChangedTest005
774  * @tc.desc: FindRecordsToUpdateAndExecuted function test with invaild tokenId or permissionName or callback.
775  * @tc.type: FUNC
776  * @tc.require: issueI5RWX5 issueI5RWX3 issueI5RWXA
777  */
778 HWTEST_F(PermissionRecordManagerTest, GenerateRecordsWhenScreenStatusChangedTest005, TestSize.Level1)
779 {
780     AccessTokenID tokenId1 = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
781         g_InfoParms1.instIndex);
782     ASSERT_NE(INVALID_TOKENID, tokenId1);
783     EXPECT_EQ(0, SetSelfTokenID(tokenId1));
784 
785     AccessTokenID tokenId2 = AccessTokenKit::GetHapTokenID(g_InfoParms2.userID, g_InfoParms2.bundleName,
786         g_InfoParms2.instIndex);
787     ASSERT_NE(INVALID_TOKENID, tokenId2);
788     EXPECT_EQ(0, SetSelfTokenID(tokenId2));
789 
790     GenerateUnLockScreenPerUsedRecord(tokenId1, tokenId2);
791     std::string permissionName = MICROPHONE_PERMISSION_NAME;
792     PermissionUsedRequest request1 = GenerateRequest(tokenId1, permissionName);
793     PermissionUsedResult result1;
794     PermissionRecordManager::GetInstance().GetPermissionUsedRecords(request1, result1);
795     auto bundleRecordIter1 = std::find_if(result1.bundleRecords.begin(), result1.bundleRecords.end(),
__anon5b3ae2260e02(const BundleUsedRecord& bur) 796         [tokenId1](const BundleUsedRecord& bur) {
797             return tokenId1 == bur.tokenId;
798         });
799     ASSERT_NE(bundleRecordIter1, result1.bundleRecords.end());
800 
801     auto permissionRecordIter1 = std::find_if(bundleRecordIter1->permissionRecords.begin(),
802         bundleRecordIter1->permissionRecords.end(),
__anon5b3ae2260f02(const PermissionUsedRecord& prs) 803         [permissionName](const PermissionUsedRecord& prs) {
804             return permissionName == prs.permissionName;
805         });
806     ASSERT_NE(permissionRecordIter1, bundleRecordIter1->permissionRecords.end());
807 
808     ASSERT_EQ(static_cast<size_t>(1), permissionRecordIter1->accessRecords.size());
809     ASSERT_EQ(PERM_ACTIVE_IN_BACKGROUND, permissionRecordIter1->accessRecords[0].status);
810     ASSERT_EQ(PERM_ACTIVE_IN_UNLOCKED, permissionRecordIter1->accessRecords[0].lockScreenStatus);
811 
812     PermissionUsedRequest request2 = GenerateRequest(tokenId2, permissionName);
813     PermissionUsedResult result2;
814     PermissionRecordManager::GetInstance().GetPermissionUsedRecords(request2, result2);
815     auto bundleRecordIter2 = std::find_if(result2.bundleRecords.begin(), result2.bundleRecords.end(),
__anon5b3ae2261002(const BundleUsedRecord& bur) 816         [tokenId2](const BundleUsedRecord& bur) {
817             return tokenId2 == bur.tokenId;
818         });
819     ASSERT_NE(bundleRecordIter2, result2.bundleRecords.end());
820 
821     auto permissionRecordIter2 = std::find_if(bundleRecordIter2->permissionRecords.begin(),
822         bundleRecordIter2->permissionRecords.end(),
__anon5b3ae2261102(const PermissionUsedRecord& prs) 823         [permissionName](const PermissionUsedRecord& prs) {
824             return permissionName == prs.permissionName;
825         });
826     ASSERT_NE(permissionRecordIter2, bundleRecordIter2->permissionRecords.end());
827 
828     ASSERT_EQ(static_cast<size_t>(1), permissionRecordIter2->accessRecords.size());
829     ASSERT_EQ(PERM_ACTIVE_IN_BACKGROUND, permissionRecordIter2->accessRecords[0].status);
830     ASSERT_EQ(PERM_ACTIVE_IN_LOCKED, permissionRecordIter2->accessRecords[0].lockScreenStatus);
831 }
832 
833 /*
834  * @tc.name: GenerateRecordsWhenScreenStatusChangedTest006
835  * @tc.desc: FindRecordsToUpdateAndExecuted function test with invaild tokenId or permissionName or callback.
836  * @tc.type: FUNC
837  * @tc.require: issueI5RWX5 issueI5RWX3 issueI5RWXA
838  */
839 HWTEST_F(PermissionRecordManagerTest, GenerateRecordsWhenScreenStatusChangedTest006, TestSize.Level1)
840 {
841     AccessTokenID tokenId = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
842         g_InfoParms1.instIndex);
843     ASSERT_NE(INVALID_TOKENID, tokenId);
844     EXPECT_EQ(0, SetSelfTokenID(tokenId));
845 
846     PermissionRecord record = {
847         .tokenId = tokenId,
848         .opCode = Constant::OP_MICROPHONE,
849         .status = PERM_ACTIVE_IN_BACKGROUND,
850         .timestamp = TimeUtil::GetCurrentTimestamp(),
851         .accessCount = 1,
852         .lockScreenStatus = PERM_ACTIVE_IN_LOCKED
853     };
854     PermissionRecordManager::GetInstance().startRecordList_.emplace_back(record);
855     LockScreenStatusChangeType screenUnLocked = PERM_ACTIVE_IN_UNLOCKED;
856     PermissionRecordManager::GetInstance().GenerateRecordsWhenScreenStatusChanged(screenUnLocked);
857 
858     std::string permissionName = MICROPHONE_PERMISSION_NAME;
859     PermissionUsedRequest request = GenerateRequest(tokenId, permissionName);
860     PermissionUsedResult result;
861     PermissionRecordManager::GetInstance().GetPermissionUsedRecords(request, result);
862     auto bundleRecordIter = std::find_if(result.bundleRecords.begin(), result.bundleRecords.end(),
__anon5b3ae2261202(const BundleUsedRecord& bur) 863         [tokenId](const BundleUsedRecord& bur) {
864             return tokenId == bur.tokenId;
865         });
866     ASSERT_NE(bundleRecordIter, result.bundleRecords.end());
867 
868     auto permissionRecordIter = std::find_if(bundleRecordIter->permissionRecords.begin(),
869         bundleRecordIter->permissionRecords.end(),
__anon5b3ae2261302(const PermissionUsedRecord& prs) 870         [permissionName](const PermissionUsedRecord& prs) {
871             return permissionName == prs.permissionName;
872         });
873     ASSERT_NE(permissionRecordIter, bundleRecordIter->permissionRecords.end());
874 
875     ASSERT_EQ(static_cast<size_t>(1), permissionRecordIter->accessRecords.size());
876     ASSERT_EQ(PERM_ACTIVE_IN_BACKGROUND, permissionRecordIter->accessRecords[0].status);
877     ASSERT_EQ(PERM_ACTIVE_IN_LOCKED, permissionRecordIter->accessRecords[0].lockScreenStatus);
878 }
879 
880 /*
881  * @tc.name: StartUsingPermissionTest001
882  * @tc.desc: StartUsingPermission function test with invaild tokenId.
883  * @tc.type: FUNC
884  * @tc.require: issueI5RWX5 issueI5RWX3 issueI5RWXA
885  */
886 HWTEST_F(PermissionRecordManagerTest, StartUsingPermissionTest001, TestSize.Level1)
887 {
888     std::string permissionName = "ohos.permission.CAMERA";
889     auto callbackPtr = std::make_shared<CbCustomizeTest1>();
890     auto callbackWrap = new (std::nothrow) StateChangeCallback(callbackPtr);
891     ASSERT_NE(nullptr, callbackPtr);
892     ASSERT_NE(nullptr, callbackWrap);
893     AccessTokenID tokenId = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
894         g_InfoParms1.instIndex);
895     ASSERT_NE(INVALID_TOKENID, tokenId);
896     ASSERT_EQ(ERR_TOKENID_NOT_EXIST,
897         PermissionRecordManager::GetInstance().StartUsingPermission(0, permissionName, callbackWrap->AsObject()));
898 }
899 
900 /*
901  * @tc.name: StartUsingPermissionTest002
902  * @tc.desc: StartUsingPermission function test with invaild permissionName.
903  * @tc.type: FUNC
904  * @tc.require: issueI5RWXF
905  */
906 HWTEST_F(PermissionRecordManagerTest, StartUsingPermissionTest002, TestSize.Level1)
907 {
908     AccessTokenID tokenID = AccessTokenKit::GetNativeTokenId("privacy_service");
909     ASSERT_NE(static_cast<AccessTokenID>(0), tokenID);
910     EXPECT_EQ(0, SetSelfTokenID(tokenID));
911 
912     auto callbackPtr = std::make_shared<CbCustomizeTest1>();
913     auto callbackWrap = new (std::nothrow) StateChangeCallback(callbackPtr);
914     ASSERT_NE(nullptr, callbackPtr);
915     ASSERT_NE(nullptr, callbackWrap);
916     AccessTokenID tokenId = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
917         g_InfoParms1.instIndex);
918     ASSERT_NE(INVALID_TOKENID, tokenId);
919     ASSERT_EQ(ERR_PARAM_INVALID, PermissionRecordManager::GetInstance().StartUsingPermission(
920         tokenId, "ohos.permission.LOCATION", callbackWrap->AsObject()));
921 
922     // tokenId invaild
923     ASSERT_EQ(PrivacyError::ERR_TOKENID_NOT_EXIST, PermissionRecordManager::GetInstance().StartUsingPermission(
924         static_cast<AccessTokenID>(123), "ohos.permission.CAMERA", nullptr));
925 
926     ASSERT_EQ(Constant::SUCCESS, PermissionRecordManager::GetInstance().StartUsingPermission(
927         tokenId, "ohos.permission.CAMERA", nullptr));
928     ASSERT_EQ(PrivacyError::ERR_PERMISSION_ALREADY_START_USING,
929         PermissionRecordManager::GetInstance().StartUsingPermission(tokenId, "ohos.permission.CAMERA", nullptr));
930 
931     ASSERT_EQ(Constant::SUCCESS,
932         PermissionRecordManager::GetInstance().StopUsingPermission(tokenId, "ohos.permission.CAMERA"));
933 }
934 
935 /*
936  * @tc.name: ExecuteCameraCallbackAsyncTest001
937  * @tc.desc: Verify the ExecuteCameraCallbackAsync abnormal branch function test with.
938  * @tc.type: FUNC
939  * @tc.require: issueI5RWX5 issueI5RWX3 issueI5RWXA
940  */
941 HWTEST_F(PermissionRecordManagerTest, ExecuteCameraCallbackAsyncTest001, TestSize.Level1)
942 {
943     AccessTokenID tokenId = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
944         g_InfoParms1.instIndex);
945     ASSERT_NE(INVALID_TOKENID, tokenId);
946 
947     auto callbackPtr = std::make_shared<CbCustomizeTest1>();
948     auto callbackWrap = new (std::nothrow) StateChangeCallback(callbackPtr);
949     ASSERT_NE(nullptr, callbackPtr);
950     ASSERT_NE(nullptr, callbackWrap);
951     PermissionRecordManager::GetInstance().SetCameraCallback(nullptr);
952     PermissionRecordManager::GetInstance().ExecuteCameraCallbackAsync(tokenId);
953 
954     PermissionRecordManager::GetInstance().SetCameraCallback(callbackWrap->AsObject());
955     PermissionRecordManager::GetInstance().ExecuteCameraCallbackAsync(tokenId);
956 }
957 
958 /*
959  * @tc.name: GetGlobalSwitchStatus001
960  * @tc.desc: GetGlobalSwitchStatus function test
961  * @tc.type: FUNC
962  * @tc.require: issueI5RWXF
963  */
964 HWTEST_F(PermissionRecordManagerTest, GetGlobalSwitchStatus001, TestSize.Level1)
965 {
966     bool isMuteMic = AudioManagerPrivacyClient::GetInstance().IsMicrophoneMute();
967     AudioManagerPrivacyClient::GetInstance().SetMicrophoneMute(false); // false means open
968     ASSERT_EQ(false, AudioManagerPrivacyClient::GetInstance().IsMicrophoneMute());
969     ASSERT_EQ(true, PermissionRecordManager::GetInstance().GetGlobalSwitchStatus(MICROPHONE_PERMISSION_NAME));
970     AudioManagerPrivacyClient::GetInstance().SetMicrophoneMute(isMuteMic);
971 
972     bool isMuteCam = CameraManagerPrivacyClient::GetInstance().IsCameraMuted();
973     CameraManagerPrivacyClient::GetInstance().MuteCamera(false);
974     ASSERT_EQ(false, CameraManagerPrivacyClient::GetInstance().IsCameraMuted());
975     ASSERT_EQ(true, PermissionRecordManager::GetInstance().GetGlobalSwitchStatus(CAMERA_PERMISSION_NAME));
976     CameraManagerPrivacyClient::GetInstance().MuteCamera(isMuteCam);
977 
978     // microphone is not sure
979     ASSERT_EQ(true, PermissionRecordManager::GetInstance().GetGlobalSwitchStatus(LOCATION_PERMISSION_NAME));
980 }
981 
982 /*
983  * @tc.name: ShowGlobalDialog001
984  * @tc.desc: ShowGlobalDialog function test
985  * @tc.type: FUNC
986  * @tc.require: issueI5RWXF
987  */
988 HWTEST_F(PermissionRecordManagerTest, ShowGlobalDialog001, TestSize.Level1)
989 {
990     AccessTokenID tokenID = AccessTokenKit::GetNativeTokenId("privacy_service");
991     ASSERT_NE(static_cast<AccessTokenID>(0), tokenID);
992     EXPECT_EQ(0, SetSelfTokenID(tokenID));
993 
994     ASSERT_EQ(true, PermissionRecordManager::GetInstance().ShowGlobalDialog(CAMERA_PERMISSION_NAME));
995     sleep(3); // wait for dialog disappear
996     ASSERT_EQ(true, PermissionRecordManager::GetInstance().ShowGlobalDialog(MICROPHONE_PERMISSION_NAME));
997     sleep(3); // wait for dialog disappear
998     ASSERT_EQ(true, PermissionRecordManager::GetInstance().ShowGlobalDialog(LOCATION_PERMISSION_NAME)); // no dialog
999 }
1000 
1001 /*
1002  * @tc.name: MicSwitchChangeListener001
1003  * @tc.desc: NotifyMicChange function test mic global switch is open
1004  * @tc.type: FUNC
1005  * @tc.require: issueI5RWXF
1006  */
1007 HWTEST_F(PermissionRecordManagerTest, MicSwitchChangeListener001, TestSize.Level1)
1008 {
1009     AccessTokenID tokenID = AccessTokenKit::GetNativeTokenId("privacy_service");
1010     ASSERT_NE(static_cast<AccessTokenID>(0), tokenID);
1011     EXPECT_EQ(0, SetSelfTokenID(tokenID));
1012 
1013     bool isMuteMic = AudioManagerPrivacyClient::GetInstance().IsMicrophoneMute();
1014     AudioManagerPrivacyClient::GetInstance().SetMicrophoneMute(false); // false means open
1015     AccessTokenID tokenId = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
1016         g_InfoParms1.instIndex);
1017     ASSERT_EQ(0, PermissionRecordManager::GetInstance().StartUsingPermission(tokenId, CAMERA_PERMISSION_NAME));
1018 
1019     PermissionRecordManager::GetInstance().NotifyMicChange(true); // fill opCode not mic branch
1020     ASSERT_EQ(0, PermissionRecordManager::GetInstance().StopUsingPermission(tokenId, CAMERA_PERMISSION_NAME));
1021     AudioManagerPrivacyClient::GetInstance().SetMicrophoneMute(isMuteMic);
1022 }
1023 
1024 /*
1025  * @tc.name: MicSwitchChangeListener002
1026  * @tc.desc: NotifyMicChange function test mic global switch is open
1027  * @tc.type: FUNC
1028  * @tc.require: issueI5RWXF
1029  */
1030 HWTEST_F(PermissionRecordManagerTest, MicSwitchChangeListener002, TestSize.Level1)
1031 {
1032     AccessTokenID tokenID = AccessTokenKit::GetNativeTokenId("privacy_service");
1033     ASSERT_NE(static_cast<AccessTokenID>(0), tokenID);
1034     EXPECT_EQ(0, SetSelfTokenID(tokenID));
1035 
1036     bool isMuteMic = AudioManagerPrivacyClient::GetInstance().IsMicrophoneMute();
1037     AudioManagerPrivacyClient::GetInstance().SetMicrophoneMute(false); // false means open
1038     AccessTokenID tokenId = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
1039         g_InfoParms1.instIndex);
1040     // status is background
1041     ASSERT_EQ(0, PermissionRecordManager::GetInstance().StartUsingPermission(tokenId, MICROPHONE_PERMISSION_NAME));
1042     PermissionRecordManager::GetInstance().NotifyMicChange(true); // fill true status is not inactive branch
1043     ASSERT_EQ(0, PermissionRecordManager::GetInstance().StopUsingPermission(tokenId, MICROPHONE_PERMISSION_NAME));
1044     AudioManagerPrivacyClient::GetInstance().SetMicrophoneMute(isMuteMic);
1045 }
1046 
1047 /*
1048  * @tc.name: MicSwitchChangeListener003
1049  * @tc.desc: NotifyMicChange function test mic global switch is close
1050  * @tc.type: FUNC
1051  * @tc.require: issueI5RWXF
1052  */
1053 HWTEST_F(PermissionRecordManagerTest, MicSwitchChangeListener003, TestSize.Level1)
1054 {
1055     AccessTokenID tokenID = AccessTokenKit::GetNativeTokenId("privacy_service");
1056     ASSERT_NE(static_cast<AccessTokenID>(0), tokenID);
1057     EXPECT_EQ(0, SetSelfTokenID(tokenID));
1058 
1059     bool isMuteMic = AudioManagerPrivacyClient::GetInstance().IsMicrophoneMute();
1060     AudioManagerPrivacyClient::GetInstance().SetMicrophoneMute(true); // true means close
1061     AccessTokenID tokenId = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
1062         g_InfoParms1.instIndex);
1063     // status is inactive
1064     ASSERT_EQ(0, PermissionRecordManager::GetInstance().StartUsingPermission(tokenId, MICROPHONE_PERMISSION_NAME));
1065     sleep(3); // wait for dialog disappear
1066     PermissionRecordManager::GetInstance().NotifyMicChange(true); // fill true status is inactive branch
1067     ASSERT_EQ(0, PermissionRecordManager::GetInstance().StopUsingPermission(tokenId, MICROPHONE_PERMISSION_NAME));
1068     AudioManagerPrivacyClient::GetInstance().SetMicrophoneMute(isMuteMic);
1069 }
1070 
1071 /*
1072  * @tc.name: MicSwitchChangeListener005
1073  * @tc.desc: NotifyMicChange function test mic global switch is close
1074  * @tc.type: FUNC
1075  * @tc.require: issueI5RWXF
1076  */
1077 HWTEST_F(PermissionRecordManagerTest, MicSwitchChangeListener005, TestSize.Level1)
1078 {
1079     AccessTokenID tokenID = AccessTokenKit::GetNativeTokenId("privacy_service");
1080     ASSERT_NE(static_cast<AccessTokenID>(0), tokenID);
1081     EXPECT_EQ(0, SetSelfTokenID(tokenID));
1082 
1083     bool isMuteMic = AudioManagerPrivacyClient::GetInstance().IsMicrophoneMute();
1084     AudioManagerPrivacyClient::GetInstance().SetMicrophoneMute(true); // true means close
1085     AccessTokenID tokenId = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
1086         g_InfoParms1.instIndex);
1087     // status is inactive
1088     ASSERT_EQ(0, PermissionRecordManager::GetInstance().StartUsingPermission(tokenId, MICROPHONE_PERMISSION_NAME));
1089     sleep(3); // wait for dialog disappear
1090     PermissionRecordManager::GetInstance().NotifyMicChange(false); // fill false status is inactive branch
1091     ASSERT_EQ(0, PermissionRecordManager::GetInstance().StopUsingPermission(tokenId, MICROPHONE_PERMISSION_NAME));
1092     AudioManagerPrivacyClient::GetInstance().SetMicrophoneMute(isMuteMic);
1093 }
1094 
1095 /*
1096  * @tc.name: TransferOpcodeToPermission001
1097  * @tc.desc: Constant::TransferOpcodeToPermission function test return false
1098  * @tc.type: FUNC
1099  * @tc.require:
1100  */
1101 HWTEST_F(PermissionRecordManagerTest, TransferOpcodeToPermission001, TestSize.Level1)
1102 {
1103     int32_t opCode = static_cast<int32_t>(Constant::OpCode::OP_INVALID);
1104     std::string permissionName;
1105     ASSERT_EQ(false, Constant::TransferOpcodeToPermission(opCode, permissionName));
1106 }
1107 
1108 class PermActiveStatusChangeCallbackTest : public PermActiveStatusChangeCallbackStub {
1109 public:
1110     PermActiveStatusChangeCallbackTest() = default;
1111     virtual ~PermActiveStatusChangeCallbackTest() = default;
1112 
1113     void ActiveStatusChangeCallback(ActiveChangeResponse& result) override;
1114 };
1115 
ActiveStatusChangeCallback(ActiveChangeResponse & result)1116 void PermActiveStatusChangeCallbackTest::ActiveStatusChangeCallback(ActiveChangeResponse& result)
1117 {
1118 }
1119 
1120 /*
1121  * @tc.name: OnRemoteDied001
1122  * @tc.desc: PermActiveStatusCallbackDeathRecipient::OnRemoteDied function test
1123  * @tc.type: FUNC
1124  * @tc.require:
1125  */
1126 HWTEST_F(PermissionRecordManagerTest, OnRemoteDied001, TestSize.Level1)
1127 {
1128     auto recipient = std::make_shared<PermActiveStatusCallbackDeathRecipient>();
1129     ASSERT_NE(nullptr, recipient);
1130 
1131     recipient->OnRemoteDied(nullptr); // remote is nullptr
1132 
1133     // backup
1134     std::vector<CallbackData> callbackDataList = ActiveStatusCallbackManager::GetInstance().callbackDataList_;
1135     ActiveStatusCallbackManager::GetInstance().callbackDataList_.clear();
1136 
1137     std::vector<std::string> permList;
1138     sptr<IRemoteObject> callback;
1139     permList.emplace_back("ohos.permission.CAMERA");
1140     wptr<IRemoteObject> remote = new (std::nothrow) PermActiveStatusChangeCallbackTest();
1141     callback = remote.promote();
1142     ActiveStatusCallbackManager::GetInstance().AddCallback(permList, callback);
1143     ASSERT_EQ(static_cast<uint32_t>(1), ActiveStatusCallbackManager::GetInstance().callbackDataList_.size());
1144     recipient->OnRemoteDied(remote); // remote is not nullptr
1145     ASSERT_EQ(static_cast<uint32_t>(0), ActiveStatusCallbackManager::GetInstance().callbackDataList_.size());
1146 
1147     // recovery
1148     ActiveStatusCallbackManager::GetInstance().callbackDataList_ = callbackDataList;
1149 }
1150 
1151 /*
1152  * @tc.name: RemoveCallback001
1153  * @tc.desc: ActiveStatusCallbackManager::RemoveCallback function test
1154  * @tc.type: FUNC
1155  * @tc.require:
1156  */
1157 HWTEST_F(PermissionRecordManagerTest, RemoveCallback001, TestSize.Level1)
1158 {
1159     std::vector<std::string> permList;
1160     sptr<IRemoteObject> callback;
1161 
1162     // callback is null
1163     ASSERT_EQ(PrivacyError::ERR_PARAM_INVALID, ActiveStatusCallbackManager::GetInstance().RemoveCallback(nullptr));
1164 
1165     // backup
1166     std::vector<CallbackData> callbackDataList = ActiveStatusCallbackManager::GetInstance().callbackDataList_;
1167     sptr<IRemoteObject::DeathRecipient> callbackDeathRecipient =
1168         ActiveStatusCallbackManager::GetInstance().callbackDeathRecipient_;
1169     ActiveStatusCallbackManager::GetInstance().callbackDataList_.clear();
1170     ActiveStatusCallbackManager::GetInstance().callbackDeathRecipient_ = nullptr;
1171 
1172     sptr<PermActiveStatusChangeCallbackTest> callback1 = new (std::nothrow) PermActiveStatusChangeCallbackTest();
1173     ASSERT_NE(nullptr, callback1);
1174     sptr<PermActiveStatusChangeCallbackTest> callback2 = new (std::nothrow) PermActiveStatusChangeCallbackTest();
1175     ASSERT_NE(nullptr, callback2);
1176     permList.emplace_back("ohos.permission.CAMERA");
1177     callback = callback1->AsObject();
1178     CallbackData data;
1179     data.permList_ = permList;
1180     data.callbackObject_ = callback;
1181     ActiveStatusCallbackManager::GetInstance().callbackDataList_.emplace_back(data);
1182     // callback != callbackObject_
1183     ASSERT_EQ(RET_SUCCESS, ActiveStatusCallbackManager::GetInstance().RemoveCallback(callback2->AsObject()));
1184 
1185     // callback == callbackObject_ + callbackDeathRecipient_ is null
1186     ASSERT_EQ(RET_SUCCESS, ActiveStatusCallbackManager::GetInstance().RemoveCallback(callback));
1187 
1188     // recovery
1189     ActiveStatusCallbackManager::GetInstance().callbackDataList_ = callbackDataList;
1190     ActiveStatusCallbackManager::GetInstance().callbackDeathRecipient_ = callbackDeathRecipient;
1191 }
1192 
1193 /*
1194  * @tc.name: AddPermissionUsedRecord001
1195  * @tc.desc: PermissionRecordManager::AddPermissionUsedRecord function test
1196  * @tc.type: FUNC
1197  * @tc.require:
1198  */
1199 HWTEST_F(PermissionRecordManagerTest, AddPermissionUsedRecord001, TestSize.Level1)
1200 {
1201     AccessTokenID tokenId = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
1202         g_InfoParms1.instIndex);
1203     ASSERT_NE(static_cast<AccessTokenID>(0), tokenId);
1204 
1205     std::string permissionName = "com.ohos.test";
1206     int32_t successCount = 1;
1207     int32_t failCount = 0;
1208 
1209     ASSERT_EQ(PrivacyError::ERR_PERMISSION_NOT_EXIST, PermissionRecordManager::GetInstance().AddPermissionUsedRecord(
1210         tokenId, permissionName, successCount, failCount)); // invaild permission error
1211 }
1212 
1213 /*
1214  * @tc.name: AddPermissionUsedRecord002
1215  * @tc.desc: PermissionRecordManager::AddPermissionUsedRecord function test
1216  * @tc.type: FUNC
1217  * @tc.require:
1218  */
1219 HWTEST_F(PermissionRecordManagerTest, AddPermissionUsedRecord002, TestSize.Level1)
1220 {
1221     AccessTokenID tokenId = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
1222         g_InfoParms1.instIndex);
1223     ASSERT_NE(static_cast<AccessTokenID>(0), tokenId);
1224 
1225     std::string permissionName = "ohos.permission.READ_MEDIA";
1226     int32_t successCount = 0;
1227     int32_t failCount = 0;
1228 
1229     ASSERT_EQ(PrivacyError::ERR_PARAM_INVALID, PermissionRecordManager::GetInstance().AddPermissionUsedRecord(
1230         tokenId, permissionName, successCount, failCount));
1231 }
1232 
1233 /*
1234  * @tc.name: RemovePermissionUsedRecords001
1235  * @tc.desc: PermissionRecordManager::RemovePermissionUsedRecords function test
1236  * @tc.type: FUNC
1237  * @tc.require:
1238  */
1239 HWTEST_F(PermissionRecordManagerTest, RemovePermissionUsedRecords001, TestSize.Level1)
1240 {
1241     AccessTokenID tokenId = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
1242         g_InfoParms1.instIndex);
1243     ASSERT_NE(static_cast<AccessTokenID>(0), tokenId);
1244 
1245     std::string deviceID;
1246     PermissionRecordManager::GetInstance().RemovePermissionUsedRecords(tokenId, deviceID); // deviceID is empty
1247 
1248     deviceID = "what's is";
1249     // deviceID is not empty, but device which deps on tokenID is empty not equals deviceID
1250     PermissionRecordManager::GetInstance().RemovePermissionUsedRecords(static_cast<AccessTokenID>(123), deviceID);
1251 
1252     deviceID = "0";
1253     // deviceID is not empty, device which deps on tokenID is not empty and equals deviceID
1254     PermissionRecordManager::GetInstance().RemovePermissionUsedRecords(tokenId, deviceID);
1255 }
1256 
1257 /*
1258  * @tc.name: UpdateRecords001
1259  * @tc.desc: PermissionRecordManager::UpdateRecords function test
1260  * @tc.type: FUNC
1261  * @tc.require:
1262  */
1263 HWTEST_F(PermissionRecordManagerTest, UpdateRecords001, TestSize.Level1)
1264 {
1265     AccessTokenID tokenId = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
1266         g_InfoParms1.instIndex);
1267     ASSERT_NE(static_cast<AccessTokenID>(0), tokenId);
1268 
1269     int32_t flag = 0;
1270     PermissionUsedRecord inBundleRecord;
1271     PermissionUsedRecord outBundleRecord;
1272 
1273     inBundleRecord.lastAccessTime = 1000;
1274     outBundleRecord.lastAccessTime = 900;
1275     // inBundleRecord.lastAccessTime > outBundleRecord.lastAccessTime && flag == 0
1276     PermissionRecordManager::GetInstance().UpdateRecords(flag, inBundleRecord, outBundleRecord);
1277 
1278     UsedRecordDetail detail;
1279     detail.accessDuration = 10;
1280     detail.status = PERM_ACTIVE_IN_FOREGROUND;
1281     detail.timestamp = 10000;
1282     flag = 1;
1283     inBundleRecord.lastRejectTime = 1000;
1284     inBundleRecord.accessRecords.emplace_back(detail);
1285     inBundleRecord.rejectRecords.emplace_back(detail);
1286     // flag != 0 && inBundleRecord.lastRejectTime > 0 && outBundleRecord.accessRecords.size() < 10
1287     // && inBundleRecord.lastRejectTime > 0 && outBundleRecord.rejectRecords.size() < 10
1288     PermissionRecordManager::GetInstance().UpdateRecords(flag, inBundleRecord, outBundleRecord);
1289 
1290     std::vector<UsedRecordDetail> accessRecords(11, detail);
1291     outBundleRecord.accessRecords = accessRecords;
1292     outBundleRecord.rejectRecords = accessRecords;
1293     // flag != 0 && inBundleRecord.lastRejectTime > 0 && outBundleRecord.accessRecords.size() >= 10
1294     // && inBundleRecord.lastRejectTime > 0 && outBundleRecord.rejectRecords.size() >= 10
1295     PermissionRecordManager::GetInstance().UpdateRecords(flag, inBundleRecord, outBundleRecord);
1296 
1297     inBundleRecord.lastAccessTime = 0;
1298     inBundleRecord.lastRejectTime = 0;
1299     // flag != 0 && inBundleRecord.lastRejectTime <= 0 && outBundleRecord.accessRecords.size() >= 10
1300     // && inBundleRecord.lastRejectTime <= 0 && outBundleRecord.rejectRecords.size() >= 10
1301     PermissionRecordManager::GetInstance().UpdateRecords(flag, inBundleRecord, outBundleRecord);
1302 }
1303 
1304 /*
1305  * @tc.name: RemoveRecordFromStartList001
1306  * @tc.desc: PermissionRecordManager::RemoveRecordFromStartList function test
1307  * @tc.type: FUNC
1308  * @tc.require:
1309  */
1310 HWTEST_F(PermissionRecordManagerTest, RemoveRecordFromStartList001, TestSize.Level1)
1311 {
1312     AccessTokenID tokenId = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
1313         g_InfoParms1.instIndex);
1314     ASSERT_NE(static_cast<AccessTokenID>(0), tokenId);
1315 
1316     ASSERT_EQ(Constant::SUCCESS,
1317         PermissionRecordManager::GetInstance().StartUsingPermission(tokenId, "ohos.permission.READ_MEDIA"));
1318     PermissionRecord record;
1319     record.tokenId = tokenId;
1320     record.opCode = Constant::OP_READ_MEDIA;
1321     // it->opcode == record.opcode && it->tokenId == record.tokenId
1322     PermissionRecordManager::GetInstance().RemoveRecordFromStartList(record); // record in cache has delete
1323 
1324     ASSERT_EQ(Constant::SUCCESS,
1325         PermissionRecordManager::GetInstance().StartUsingPermission(tokenId, "ohos.permission.READ_MEDIA"));
1326     record.tokenId = 123; // 123 is random input
1327     // it->opcode == record.opcode && it->tokenId != record.tokenId
1328     PermissionRecordManager::GetInstance().RemoveRecordFromStartList(record);
1329 
1330     record.opCode = Constant::OP_MICROPHONE;
1331     // it->opcode != record.opcode && it->tokenId != record.tokenId
1332     PermissionRecordManager::GetInstance().RemoveRecordFromStartList(record);
1333 
1334     ASSERT_EQ(Constant::SUCCESS,
1335         PermissionRecordManager::GetInstance().StopUsingPermission(tokenId, "ohos.permission.READ_MEDIA"));
1336 }
1337 
1338 /*
1339  * @tc.name: StartUsingPermission001
1340  * @tc.desc: PermissionRecordManager::StartUsingPermission function test
1341  * @tc.type: FUNC
1342  * @tc.require:
1343  */
1344 HWTEST_F(PermissionRecordManagerTest, StartUsingPermission001, TestSize.Level1)
1345 {
1346     AccessTokenID tokenId = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
1347         g_InfoParms1.instIndex);
1348     ASSERT_NE(static_cast<AccessTokenID>(0), tokenId);
1349 
1350     // tokenId invaild
1351     ASSERT_EQ(PrivacyError::ERR_TOKENID_NOT_EXIST, PermissionRecordManager::GetInstance().StartUsingPermission(
1352         static_cast<AccessTokenID>(123), "ohos.permission.READ_MEDIA"));
1353 
1354     ASSERT_EQ(Constant::SUCCESS, PermissionRecordManager::GetInstance().StartUsingPermission(
1355         tokenId, "ohos.permission.READ_MEDIA"));
1356     ASSERT_EQ(PrivacyError::ERR_PERMISSION_ALREADY_START_USING,
1357         PermissionRecordManager::GetInstance().StartUsingPermission(tokenId, "ohos.permission.READ_MEDIA"));
1358 
1359     ASSERT_EQ(Constant::SUCCESS,
1360         PermissionRecordManager::GetInstance().StopUsingPermission(tokenId, "ohos.permission.READ_MEDIA"));
1361 }
1362 
1363 /*
1364  * @tc.name: StopUsingPermission001
1365  * @tc.desc: PermissionRecordManager::StopUsingPermission function test
1366  * @tc.type: FUNC
1367  * @tc.require:
1368  */
1369 HWTEST_F(PermissionRecordManagerTest, StopUsingPermission001, TestSize.Level1)
1370 {
1371     AccessTokenID tokenId = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
1372         g_InfoParms1.instIndex);
1373     ASSERT_NE(static_cast<AccessTokenID>(0), tokenId);
1374 
1375     // tokenId invaild
1376     ASSERT_EQ(PrivacyError::ERR_TOKENID_NOT_EXIST, PermissionRecordManager::GetInstance().StopUsingPermission(
1377         static_cast<AccessTokenID>(0), "ohos.permission.READ_MEDIA"));
1378 
1379     // permission invaild
1380     ASSERT_EQ(PrivacyError::ERR_PERMISSION_NOT_EXIST, PermissionRecordManager::GetInstance().StopUsingPermission(
1381         tokenId, "ohos.permission.test"));
1382 
1383     // not start using
1384     ASSERT_EQ(PrivacyError::ERR_PERMISSION_NOT_START_USING,
1385         PermissionRecordManager::GetInstance().StopUsingPermission(tokenId, "ohos.permission.READ_MEDIA"));
1386 }
1387 
1388 /*
1389  * @tc.name: PermissionListFilter001
1390  * @tc.desc: PermissionRecordManager::PermissionListFilter function test
1391  * @tc.type: FUNC
1392  * @tc.require:
1393  */
1394 HWTEST_F(PermissionRecordManagerTest, PermissionListFilter001, TestSize.Level1)
1395 {
1396     std::vector<std::string> listSrc;
1397     std::vector<std::string> listRes;
1398 
1399     listSrc.emplace_back("com.ohos.TEST");
1400     // GetDefPermission != Constant::SUCCESS && listRes is empty && listSrc is not empty
1401     ASSERT_EQ(PrivacyError::ERR_PARAM_INVALID,
1402         PermissionRecordManager::GetInstance().PermissionListFilter(listSrc, listRes));
1403 
1404     listRes.emplace_back("com.ohos.TEST");
1405     // listRes is not empty
1406     ASSERT_EQ(Constant::SUCCESS, PermissionRecordManager::GetInstance().PermissionListFilter(listSrc, listRes));
1407 
1408     listSrc.clear();
1409     listRes.clear();
1410     // listRes is empty && listSrc is empty
1411     ASSERT_EQ(Constant::SUCCESS, PermissionRecordManager::GetInstance().PermissionListFilter(listSrc, listRes));
1412 }
1413 
1414 /*
1415  * @tc.name: RegisterPermActiveStatusCallback003
1416  * @tc.desc: PermissionRecordManager::RegisterPermActiveStatusCallback function test
1417  * @tc.type: FUNC
1418  * @tc.require:
1419  */
1420 HWTEST_F(PermissionRecordManagerTest, RegisterPermActiveStatusCallback003, TestSize.Level1)
1421 {
1422     std::vector<std::string> permList;
1423 
1424     permList.emplace_back("com.ohos.TEST");
1425     // GetDefPermission != Constant::SUCCESS && listRes is empty && listSrc is not empty
1426     ASSERT_EQ(PrivacyError::ERR_PARAM_INVALID,
1427         PermissionRecordManager::GetInstance().RegisterPermActiveStatusCallback(permList, nullptr));
1428 }
1429 
1430 /*
1431  * @tc.name: Unregister001
1432  * @tc.desc: PermissionRecordManager::Unregister function test
1433  * @tc.type: FUNC
1434  * @tc.require:
1435  */
1436 HWTEST_F(PermissionRecordManagerTest, Unregister001, TestSize.Level1)
1437 {
1438     AccessTokenID tokenId = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
1439         g_InfoParms1.instIndex);
1440     ASSERT_NE(static_cast<AccessTokenID>(0), tokenId);
1441 
1442     ASSERT_EQ(Constant::SUCCESS, PermissionRecordManager::GetInstance().StartUsingPermission(
1443         tokenId, "ohos.permission.READ_MEDIA"));
1444 
1445     PermissionRecordManager::GetInstance().Unregister();
1446     PermissionRecordManager::GetInstance().Unregister();
1447 
1448     ASSERT_EQ(Constant::SUCCESS, PermissionRecordManager::GetInstance().StopUsingPermission(
1449         tokenId, "ohos.permission.READ_MEDIA"));
1450 }
1451 
1452 /*
1453  * @tc.name: TranslationIntoPermissionRecord001
1454  * @tc.desc: PermissionRecord::TranslationIntoPermissionRecord function test
1455  * @tc.type: FUNC
1456  * @tc.require:
1457  */
1458 HWTEST_F(PermissionRecordManagerTest, TranslationIntoPermissionRecord001, TestSize.Level1)
1459 {
1460     GenericValues values;
1461     values.Put(PrivacyFiledConst::FIELD_TOKEN_ID, static_cast<int32_t>(10086));
1462     values.Put(PrivacyFiledConst::FIELD_OP_CODE, 0);
1463     values.Put(PrivacyFiledConst::FIELD_STATUS, 0);
1464     values.Put(PrivacyFiledConst::FIELD_TIMESTAMP, static_cast<int64_t>(20210109));
1465     values.Put(PrivacyFiledConst::FIELD_ACCESS_DURATION, static_cast<int64_t>(1));
1466     values.Put(PrivacyFiledConst::FIELD_ACCESS_COUNT, 10);
1467     values.Put(PrivacyFiledConst::FIELD_REJECT_COUNT, 100);
1468     values.Put(PrivacyFiledConst::FIELD_LOCKSCREEN_STATUS, LockScreenStatusChangeType::PERM_ACTIVE_IN_UNLOCKED);
1469     PermissionRecord record;
1470     PermissionRecord::TranslationIntoPermissionRecord(values, record);
1471     ASSERT_EQ(static_cast<int32_t>(10086), record.tokenId);
1472     ASSERT_EQ(10, record.accessCount);
1473     ASSERT_EQ(100, record.rejectCount);
1474     ASSERT_EQ(static_cast<int64_t>(20210109), record.timestamp);
1475     ASSERT_EQ(static_cast<int64_t>(1), record.accessDuration);
1476     ASSERT_EQ(LockScreenStatusChangeType::PERM_ACTIVE_IN_UNLOCKED, record.lockScreenStatus);
1477 }
1478 
1479 /*
1480  * @tc.name: RecordMergeCheck001
1481  * @tc.desc: PermissionUsedRecordCache::RecordMergeCheck function test
1482  * @tc.type: FUNC
1483  * @tc.require:
1484  */
1485 HWTEST_F(PermissionRecordManagerTest, RecordMergeCheck001, TestSize.Level1)
1486 {
1487     AccessTokenID tokenID1 = 123; // random input
1488     AccessTokenID tokenID2 = 124; // random input
1489     int32_t opCode1 = static_cast<int32_t>(Constant::OpCode::OP_READ_CALENDAR);
1490     int32_t opCode2 = static_cast<int32_t>(Constant::OpCode::OP_WRITE_CALENDAR);
1491     int32_t status1 = static_cast<int32_t>(ActiveChangeType::PERM_ACTIVE_IN_FOREGROUND);
1492     int32_t status2 = static_cast<int32_t>(ActiveChangeType::PERM_ACTIVE_IN_BACKGROUND);
1493     int32_t lockScreenStatus1 = static_cast<int32_t>(LockScreenStatusChangeType::PERM_ACTIVE_IN_UNLOCKED);
1494     int32_t lockScreenStatus2 = static_cast<int32_t>(LockScreenStatusChangeType::PERM_ACTIVE_IN_LOCKED);
1495 
1496     int64_t timestamp1 = TimeUtil::GetCurrentTimestamp();
1497     PermissionRecord record1 = {
1498         .timestamp = timestamp1,
1499     };
1500     int64_t timestamp2 = timestamp1 + 61 * 1000; // more than 1 min
1501     PermissionRecord record2 = {
1502         .timestamp = timestamp2,
1503     };
1504 
1505     // not in the same minute
1506     ASSERT_EQ(false, PermissionUsedRecordCache::GetInstance().RecordMergeCheck(record1, record2));
1507 
1508     record2.timestamp = timestamp1; // set the same timestamp to make sure the same minute
1509     record1.tokenId = tokenID1;
1510     record2.tokenId = tokenID2;
1511     // same minute + different tokenID
1512     ASSERT_EQ(false, PermissionUsedRecordCache::GetInstance().RecordMergeCheck(record1, record2));
1513 
1514     record2.tokenId = tokenID1;
1515     record1.opCode = opCode1;
1516     record2.opCode = opCode2;
1517     // same minute + same tokenID + different opcode
1518     ASSERT_EQ(false, PermissionUsedRecordCache::GetInstance().RecordMergeCheck(record1, record2));
1519 
1520     record2.opCode = opCode1;
1521     record1.status = status1;
1522     record2.status = status2;
1523     // same minute + same tokenID + same opcode + different status
1524     ASSERT_EQ(false, PermissionUsedRecordCache::GetInstance().RecordMergeCheck(record1, record2));
1525 
1526     record2.status = status1;
1527     record1.lockScreenStatus = lockScreenStatus1;
1528     record2.lockScreenStatus = lockScreenStatus2;
1529     // same minute + same tokenID + same opcode + same status + different lockScreenStatus
1530     ASSERT_EQ(false, PermissionUsedRecordCache::GetInstance().RecordMergeCheck(record1, record2));
1531 }
1532 
1533 /*
1534  * @tc.name: RecordMergeCheck002
1535  * @tc.desc: PermissionUsedRecordCache::RecordMergeCheck function test
1536  * @tc.type: FUNC
1537  * @tc.require:
1538  */
1539 HWTEST_F(PermissionRecordManagerTest, RecordMergeCheck002, TestSize.Level1)
1540 {
1541     int32_t accessCount1 = 10; // random input
1542     int32_t accessCount2 = 0;
1543     int32_t accessCount3 = 9; // random input, diff from accessCount1
1544     int32_t rejectCount1 = 11; // random input
1545     int32_t rejectCount2 = 0;
1546     int32_t rejectCount3 = 8; // random input, diff from accessCount1
1547 
1548     int64_t timestamp = TimeUtil::GetCurrentTimestamp();
1549 
1550     // same minute + same tokenID + same opcode + same status + same lockScreenStatus
1551     PermissionRecord record1 = g_record;
1552     record1.timestamp = timestamp;
1553     PermissionRecord record2 = g_record;
1554     record2.timestamp = timestamp + 1;
1555 
1556     record1.accessCount = accessCount1;
1557     record2.accessCount = accessCount2;
1558     // different accessCount type
1559     ASSERT_EQ(false, PermissionUsedRecordCache::GetInstance().RecordMergeCheck(record1, record2));
1560 
1561     record1.accessCount = accessCount2;
1562     record2.accessCount = accessCount1;
1563     // different accessCount type
1564     ASSERT_EQ(false, PermissionUsedRecordCache::GetInstance().RecordMergeCheck(record1, record2));
1565 
1566     record2.accessCount = accessCount2;
1567     record1.rejectCount = rejectCount1;
1568     record2.rejectCount = rejectCount2;
1569     // different rejectCount type
1570     ASSERT_EQ(false, PermissionUsedRecordCache::GetInstance().RecordMergeCheck(record1, record2));
1571 
1572     record1.rejectCount = rejectCount2;
1573     record2.rejectCount = rejectCount1;
1574     // different rejectCount type
1575     ASSERT_EQ(false, PermissionUsedRecordCache::GetInstance().RecordMergeCheck(record1, record2));
1576 
1577     record2.rejectCount = rejectCount2;
1578     // same accessCount type + same rejectCount type
1579     ASSERT_EQ(true, PermissionUsedRecordCache::GetInstance().RecordMergeCheck(record1, record2));
1580 
1581     record1.accessCount = accessCount1;
1582     record2.accessCount = accessCount3;
1583     record1.rejectCount = rejectCount2;
1584     record2.rejectCount = rejectCount2;
1585     // same accessCount type + same rejectCount type
1586     ASSERT_EQ(true, PermissionUsedRecordCache::GetInstance().RecordMergeCheck(record1, record2));
1587 
1588     record1.accessCount = accessCount2;
1589     record2.accessCount = accessCount2;
1590     record1.rejectCount = rejectCount1;
1591     record2.rejectCount = rejectCount3;
1592     // same accessCount type + same rejectCount type
1593     ASSERT_EQ(true, PermissionUsedRecordCache::GetInstance().RecordMergeCheck(record1, record2));
1594 
1595     record1.accessCount = accessCount1;
1596     record2.accessCount = accessCount3;
1597     record1.rejectCount = rejectCount1;
1598     record2.rejectCount = rejectCount3;
1599     // same accessCount type + same rejectCount type
1600     ASSERT_EQ(true, PermissionUsedRecordCache::GetInstance().RecordMergeCheck(record1, record2));
1601 }
1602 
1603 /*
1604  * @tc.name: GetRecords001
1605  * @tc.desc: PermissionUsedRecordCache::GetRecords function test
1606  * @tc.type: FUNC
1607  * @tc.require:
1608  */
1609 HWTEST_F(PermissionRecordManagerTest, GetRecords001, TestSize.Level1)
1610 {
1611     AccessTokenID tokenId = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
1612         g_InfoParms1.instIndex);
1613     ASSERT_NE(static_cast<AccessTokenID>(0), tokenId);
1614     g_record.tokenId = tokenId;
1615     PermissionUsedRecordCache::GetInstance().AddRecordToBuffer(g_record);
1616     std::vector<std::string> permissionList;
1617     GenericValues andConditionValues;
1618     std::vector<GenericValues> findRecordsValues;
1619     PermissionUsedRecordCache::GetInstance().GetRecords(permissionList, andConditionValues, findRecordsValues, 0);
1620     ASSERT_EQ(static_cast<size_t>(0), findRecordsValues.size());
1621 }
1622 
AddRecord(int32_t num,std::vector<GenericValues> & values)1623 void AddRecord(int32_t num, std::vector<GenericValues>& values)
1624 {
1625     for (int32_t i = 0; i < num; i++) {
1626         GenericValues value;
1627         value.Put(PrivacyFiledConst::FIELD_TOKEN_ID, i);
1628         value.Put(PrivacyFiledConst::FIELD_OP_CODE, Constant::OP_LOCATION);
1629         value.Put(PrivacyFiledConst::FIELD_STATUS, ActiveChangeType::PERM_ACTIVE_IN_BACKGROUND);
1630         value.Put(PrivacyFiledConst::FIELD_TIMESTAMP, i);
1631         value.Put(PrivacyFiledConst::FIELD_ACCESS_DURATION, i);
1632         value.Put(PrivacyFiledConst::FIELD_ACCESS_COUNT, 1);
1633         value.Put(PrivacyFiledConst::FIELD_REJECT_COUNT, 0);
1634         value.Put(PrivacyFiledConst::FIELD_LOCKSCREEN_STATUS, LockScreenStatusChangeType::PERM_ACTIVE_IN_UNLOCKED);
1635         values.emplace_back(value);
1636     }
1637 
1638     ASSERT_EQ(static_cast<size_t>(num), values.size());
1639     PermissionUsedRecordDb::DataType type = PermissionUsedRecordDb::PERMISSION_RECORD;
1640     ASSERT_EQ(0, PermissionUsedRecordDb::GetInstance().Add(type, values));
1641     sleep(1); // wait record store in database
1642 }
1643 
1644 /**
1645  * @tc.name: GetRecords003
1646  * @tc.desc: test query record return max count 500.
1647  * @tc.type: FUNC
1648  * @tc.require: issueI5P4IU
1649  */
1650 HWTEST_F(PermissionRecordManagerTest, GetRecords003, TestSize.Level1)
1651 {
1652     std::vector<GenericValues> values;
1653     int32_t num = MAX_DETAIL_NUM + 1;
1654     AddRecord(num, values);
1655 
1656     PermissionUsedRequest request;
1657     request.isRemote = false;
1658     request.flag = PermissionUsageFlag::FLAG_PERMISSION_USAGE_DETAIL;
1659 
1660     GenericValues andConditionValues;
1661     std::vector<GenericValues> findRecordsValues;
1662     PermissionUsedRecordCache::GetInstance().GetRecords(request.permissionList, andConditionValues, findRecordsValues,
1663         MAX_DETAIL_NUM);
1664     EXPECT_EQ(static_cast<size_t>(MAX_DETAIL_NUM), findRecordsValues.size());
1665 
1666     PermissionUsedRecordDb::DataType type = PermissionUsedRecordDb::PERMISSION_RECORD;
1667     for (const auto& value : values) {
1668         ASSERT_EQ(0, PermissionUsedRecordDb::GetInstance().Remove(type, value));
1669     }
1670 }
1671 
GeneratePermissionRecord(AccessTokenID tokenID)1672 static void GeneratePermissionRecord(AccessTokenID tokenID)
1673 {
1674     int64_t timestamp = TimeUtil::GetCurrentTimestamp();
1675 
1676     GenericValues value1;
1677     value1.Put(PrivacyFiledConst::FIELD_TOKEN_ID, static_cast<int32_t>(tokenID));
1678     value1.Put(PrivacyFiledConst::FIELD_OP_CODE, Constant::OP_LOCATION);
1679     value1.Put(PrivacyFiledConst::FIELD_STATUS, ActiveChangeType::PERM_ACTIVE_IN_BACKGROUND);
1680     value1.Put(PrivacyFiledConst::FIELD_TIMESTAMP, timestamp - THREE_SECOND);
1681     value1.Put(PrivacyFiledConst::FIELD_ACCESS_DURATION, 1);
1682     value1.Put(PrivacyFiledConst::FIELD_ACCESS_COUNT, 1);
1683     value1.Put(PrivacyFiledConst::FIELD_REJECT_COUNT, 0);
1684     value1.Put(PrivacyFiledConst::FIELD_LOCKSCREEN_STATUS, LockScreenStatusChangeType::PERM_ACTIVE_IN_UNLOCKED);
1685     GenericValues value2;
1686     value1.Put(PrivacyFiledConst::FIELD_TOKEN_ID, static_cast<int32_t>(tokenID));
1687     value2.Put(PrivacyFiledConst::FIELD_OP_CODE, Constant::OP_LOCATION);
1688     value2.Put(PrivacyFiledConst::FIELD_STATUS, ActiveChangeType::PERM_ACTIVE_IN_FOREGROUND);
1689     value2.Put(PrivacyFiledConst::FIELD_TIMESTAMP, timestamp - TWO_SECOND);
1690     value2.Put(PrivacyFiledConst::FIELD_ACCESS_DURATION, 1);
1691     value2.Put(PrivacyFiledConst::FIELD_ACCESS_COUNT, 1);
1692     value2.Put(PrivacyFiledConst::FIELD_REJECT_COUNT, 0);
1693     value2.Put(PrivacyFiledConst::FIELD_LOCKSCREEN_STATUS, LockScreenStatusChangeType::PERM_ACTIVE_IN_UNLOCKED);
1694     GenericValues value3;
1695     value1.Put(PrivacyFiledConst::FIELD_TOKEN_ID, static_cast<int32_t>(tokenID));
1696     value3.Put(PrivacyFiledConst::FIELD_OP_CODE, Constant::OP_LOCATION);
1697     value3.Put(PrivacyFiledConst::FIELD_STATUS, ActiveChangeType::PERM_ACTIVE_IN_BACKGROUND);
1698     value3.Put(PrivacyFiledConst::FIELD_TIMESTAMP, timestamp - ONE_SECOND);
1699     value3.Put(PrivacyFiledConst::FIELD_ACCESS_DURATION, 1);
1700     value3.Put(PrivacyFiledConst::FIELD_ACCESS_COUNT, 1);
1701     value3.Put(PrivacyFiledConst::FIELD_REJECT_COUNT, 0);
1702     value3.Put(PrivacyFiledConst::FIELD_LOCKSCREEN_STATUS, LockScreenStatusChangeType::PERM_ACTIVE_IN_LOCKED);
1703     GenericValues value4;
1704     value1.Put(PrivacyFiledConst::FIELD_TOKEN_ID, static_cast<int32_t>(tokenID));
1705     value4.Put(PrivacyFiledConst::FIELD_OP_CODE, Constant::OP_LOCATION);
1706     value4.Put(PrivacyFiledConst::FIELD_STATUS, ActiveChangeType::PERM_ACTIVE_IN_FOREGROUND);
1707     value4.Put(PrivacyFiledConst::FIELD_TIMESTAMP, timestamp);
1708     value4.Put(PrivacyFiledConst::FIELD_ACCESS_DURATION, 1);
1709     value4.Put(PrivacyFiledConst::FIELD_ACCESS_COUNT, 1);
1710     value4.Put(PrivacyFiledConst::FIELD_REJECT_COUNT, 0);
1711     value4.Put(PrivacyFiledConst::FIELD_LOCKSCREEN_STATUS, LockScreenStatusChangeType::PERM_ACTIVE_IN_LOCKED);
1712 
1713     std::vector<GenericValues> values;
1714     values.emplace_back(value1);
1715     values.emplace_back(value2);
1716     values.emplace_back(value3);
1717     values.emplace_back(value4);
1718 
1719     PermissionUsedRecordDb::DataType type = PermissionUsedRecordDb::PERMISSION_RECORD;
1720     ASSERT_EQ(0, PermissionUsedRecordDb::GetInstance().Add(type, values));
1721     sleep(1); // wait record store in database
1722 }
1723 
1724 /**
1725  * @tc.name: GetRecords004
1726  * @tc.desc: test query record flag 2 | 3 | 4 | 5
1727  * @tc.type: FUNC
1728  * @tc.require:
1729  */
1730 HWTEST_F(PermissionRecordManagerTest, GetRecords004, TestSize.Level1)
1731 {
1732     AccessTokenID tokenID = AccessTokenKit::GetHapTokenID(g_InfoParms1.userID, g_InfoParms1.bundleName,
1733         g_InfoParms1.instIndex);
1734     ASSERT_NE(static_cast<AccessTokenID>(0), tokenID);
1735 
1736     GeneratePermissionRecord(tokenID);
1737     PermissionRecordManager::GetInstance().SetDefaultConfigValue();
1738 
1739     PermissionUsedRequest request;
1740     request.tokenId = tokenID;
1741     request.isRemote = false;
1742     request.flag = PermissionUsageFlag::FLAG_PERMISSION_USAGE_SUMMARY_IN_SCREEN_LOCKED;
1743 
1744     PermissionUsedResult result1;
1745     EXPECT_EQ(Constant::SUCCESS, PermissionRecordManager::GetInstance().GetPermissionUsedRecords(request, result1));
1746     EXPECT_EQ(static_cast<size_t>(1), result1.bundleRecords.size());
1747     EXPECT_EQ(static_cast<uint32_t>(tokenID), result1.bundleRecords[0].tokenId);
1748     EXPECT_EQ(static_cast<size_t>(1), result1.bundleRecords[0].permissionRecords.size());
1749     EXPECT_EQ(2, result1.bundleRecords[0].permissionRecords[0].accessCount);
1750 
1751     PermissionUsedResult result2;
1752     request.flag = PermissionUsageFlag::FLAG_PERMISSION_USAGE_SUMMARY_IN_SCREEN_UNLOCKED;
1753     EXPECT_EQ(Constant::SUCCESS, PermissionRecordManager::GetInstance().GetPermissionUsedRecords(request, result2));
1754     EXPECT_EQ(static_cast<size_t>(1), result2.bundleRecords.size());
1755     EXPECT_EQ(static_cast<uint32_t>(tokenID), result2.bundleRecords[0].tokenId);
1756     EXPECT_EQ(static_cast<size_t>(1), result2.bundleRecords[0].permissionRecords.size());
1757     EXPECT_EQ(2, result2.bundleRecords[0].permissionRecords[0].accessCount);
1758 
1759     PermissionUsedResult result3;
1760     request.flag = PermissionUsageFlag::FLAG_PERMISSION_USAGE_SUMMARY_IN_APP_FOREGROUND;
1761     EXPECT_EQ(Constant::SUCCESS, PermissionRecordManager::GetInstance().GetPermissionUsedRecords(request, result3));
1762     EXPECT_EQ(static_cast<size_t>(1), result3.bundleRecords.size());
1763     EXPECT_EQ(static_cast<uint32_t>(tokenID), result3.bundleRecords[0].tokenId);
1764     EXPECT_EQ(static_cast<size_t>(1), result3.bundleRecords[0].permissionRecords.size());
1765     EXPECT_EQ(2, result3.bundleRecords[0].permissionRecords[0].accessCount);
1766 
1767     PermissionUsedResult result4;
1768     request.flag = PermissionUsageFlag::FLAG_PERMISSION_USAGE_SUMMARY_IN_APP_BACKGROUND;
1769     EXPECT_EQ(Constant::SUCCESS, PermissionRecordManager::GetInstance().GetPermissionUsedRecords(request, result4));
1770     EXPECT_EQ(static_cast<size_t>(1), result4.bundleRecords.size());
1771     EXPECT_EQ(static_cast<uint32_t>(tokenID), result4.bundleRecords[0].tokenId);
1772     EXPECT_EQ(static_cast<size_t>(1), result4.bundleRecords[0].permissionRecords.size());
1773     EXPECT_EQ(2, result4.bundleRecords[0].permissionRecords[0].accessCount);
1774 }
1775 
1776 /*
1777  * @tc.name: GetFromPersistQueueAndDatabase001
1778  * @tc.desc: PermissionUsedRecordCache::GetFromPersistQueueAndDatabase function test
1779  * @tc.type: FUNC
1780  * @tc.require:
1781  */
1782 HWTEST_F(PermissionRecordManagerTest, GetFromPersistQueueAndDatabase001, TestSize.Level1)
1783 {
1784     const std::set<int32_t> opCodeList;
1785     const GenericValues andConditionValues;
1786     std::vector<GenericValues> findRecordsValues;
1787     PermissionUsedRecordCache::GetInstance().GetFromPersistQueueAndDatabase(
1788         opCodeList, andConditionValues, findRecordsValues, 0);
1789     ASSERT_EQ(static_cast<size_t>(0), findRecordsValues.size());
1790 }
1791 
1792 /*
1793  * @tc.name: DeepCopyFromHead001
1794  * @tc.desc: PermissionUsedRecordCache::DeepCopyFromHead function test
1795  * @tc.type: FUNC
1796  * @tc.require:
1797  */
1798 HWTEST_F(PermissionRecordManagerTest, DeepCopyFromHead001, TestSize.Level1)
1799 {
1800     std::shared_ptr<PermissionUsedRecordNode> head = std::make_shared<PermissionUsedRecordNode>();
1801     std::shared_ptr<PermissionUsedRecordNode> node1 = std::make_shared<PermissionUsedRecordNode>();
1802     std::shared_ptr<PermissionUsedRecordNode> node2 = std::make_shared<PermissionUsedRecordNode>();
1803     std::shared_ptr<PermissionUsedRecordNode> node3 = std::make_shared<PermissionUsedRecordNode>();
1804     std::shared_ptr<PermissionUsedRecordNode> node4 = std::make_shared<PermissionUsedRecordNode>();
1805 
1806     head->next = node1;
1807 
1808     node1->pre.lock() = head;
1809     node1->next = node2;
1810     node1->record = g_recordA1;
1811 
1812     node2->pre.lock() = node1;
1813     node2->next = node3;
1814     node2->record = g_recordA2;
1815 
1816     node3->pre.lock() = node2;
1817     node3->next = node4;
1818     node3->record = g_recordB1;
1819 
1820     node4->pre.lock() = node3;
1821     node4->next = nullptr;
1822     node4->record = g_recordB2;
1823 
1824     ASSERT_EQ(head->next->record.opCode, g_recordA1.opCode);
1825     ASSERT_EQ(head->next->next->record.opCode, g_recordA2.opCode);
1826     ASSERT_EQ(head->next->next->next->record.opCode, g_recordB1.opCode);
1827     ASSERT_EQ(head->next->next->next->next->record.opCode, g_recordB2.opCode);
1828 
1829     std::shared_ptr<PermissionUsedRecordNode> copyHead = std::make_shared<PermissionUsedRecordNode>();
1830     PermissionUsedRecordCache::GetInstance().DeepCopyFromHead(nullptr, copyHead, DEEP_COPY_NUM);
1831     ASSERT_EQ(copyHead->next, nullptr);
1832     PermissionUsedRecordCache::GetInstance().DeepCopyFromHead(head, copyHead, 0);
1833     ASSERT_EQ(copyHead->next, nullptr);
1834 
1835     PermissionUsedRecordCache::GetInstance().DeepCopyFromHead(head, copyHead, DEEP_COPY_NUM);
1836 
1837     ASSERT_EQ(copyHead->record.opCode, head->record.opCode);
1838     ASSERT_EQ(copyHead->next->record.opCode, g_recordA1.opCode);
1839     ASSERT_EQ(copyHead->next->next->record.opCode, g_recordA2.opCode);
1840     ASSERT_EQ(copyHead->next->next->next->record.opCode, g_recordB1.opCode);
1841     ASSERT_EQ(copyHead->next->next->next->next->record.opCode, g_recordB2.opCode);
1842 }
1843 
1844 /*
1845  * @tc.name: RecordManagerTest001
1846  * @tc.desc: GetAllRecordValuesByKey normal case
1847  * @tc.type: FUNC
1848  * @tc.require:
1849  */
1850 HWTEST_F(PermissionRecordManagerTest, RecordManagerTest001, TestSize.Level1)
1851 {
1852     std::vector<GenericValues> resultValues;
1853     EXPECT_EQ(true, PermissionRecordRepository::GetInstance().GetAllRecordValuesByKey(
1854         PrivacyFiledConst::FIELD_TOKEN_ID, resultValues));
1855 }
1856 
1857 /*
1858  * @tc.name: PermissionUsedRecordCacheTest001
1859  * @tc.desc: PermissionUsedRecordCache Func test
1860  * @tc.type: FUNC
1861  * @tc.require:
1862  */
1863 HWTEST_F(PermissionRecordManagerTest, PermissionUsedRecordCacheTest001, TestSize.Level1)
1864 {
1865     std::set<AccessTokenID> tokenIdList;
1866     PermissionUsedRecordCache::GetInstance().FindTokenIdList(tokenIdList);
1867     PermissionRecordManager::GetInstance().GetLocalRecordTokenIdList(tokenIdList);
1868     std::set<int32_t> opCodeList;
1869     GenericValues andConditionValues;
1870     std::vector<GenericValues> findRecordsValues;
1871     int32_t cache2QueryCount = 0; // 0 is a invalid input
1872     PermissionUsedRecordCache::GetInstance().GetFromPersistQueueAndDatabase(opCodeList,
1873         andConditionValues, findRecordsValues, cache2QueryCount);
1874 
1875     opCodeList.insert(0); // 0 is a test opcode
1876     PermissionRecord record = {
1877         .tokenId = g_selfTokenId,
1878         .opCode = -1, // -1 is a test opcode
1879     };
1880     EXPECT_FALSE(PermissionUsedRecordCache::GetInstance().RecordCompare(g_selfTokenId,
1881         opCodeList, andConditionValues, record));
1882 }
1883 
1884 /**
1885  * @tc.name: GetRecordsFromLocalDBTest001
1886  * @tc.desc: test GetRecordsFromLocalDB: token = 0
1887  * @tc.type: FUNC
1888  * @tc.require:
1889  */
1890 HWTEST_F(PermissionRecordManagerTest, GetRecordsFromLocalDBTest001, TestSize.Level1)
1891 {
1892     PermissionUsedRequest request;
1893     request.tokenId = g_selfTokenId;
1894     request.isRemote = false;
1895     request.flag = PermissionUsageFlag::FLAG_PERMISSION_USAGE_SUMMARY_IN_SCREEN_LOCKED;
1896     PermissionUsedResult result;
1897     EXPECT_TRUE(PermissionRecordManager::GetInstance().GetRecordsFromLocalDB(request, result));
1898 }
1899 
1900 /**
1901  * @tc.name: GetRecordsFromLocalDBTest002
1902  * @tc.desc: test GetRecordsFromLocalDB: beginTimeMillis = -1
1903  * @tc.type: FUNC
1904  * @tc.require:
1905  */
1906 HWTEST_F(PermissionRecordManagerTest, GetRecordsFromLocalDBTest002, TestSize.Level1)
1907 {
1908     PermissionUsedRequest request;
1909     request.tokenId = g_selfTokenId;
1910     request.isRemote = false;
1911     request.flag = PermissionUsageFlag::FLAG_PERMISSION_USAGE_SUMMARY_IN_SCREEN_LOCKED;
1912     request.beginTimeMillis = -1; // -1 is a invalid input
1913     PermissionUsedResult result;
1914     EXPECT_EQ(false, PermissionRecordManager::GetInstance().GetRecordsFromLocalDB(request, result));
1915 }
1916 
1917 /**
1918  * @tc.name: GetRecordsFromLocalDBTest003
1919  * @tc.desc: test GetRecords: not exist OpCode
1920  * @tc.type: FUNC
1921  * @tc.require:
1922  */
1923 HWTEST_F(PermissionRecordManagerTest, RecordConverage011, TestSize.Level1)
1924 {
1925     PermissionUsedRequest request;
1926     request.tokenId = g_selfTokenId;
1927     request.isRemote = false;
1928     request.flag = PermissionUsageFlag::FLAG_PERMISSION_USAGE_SUMMARY_IN_SCREEN_LOCKED;
1929     request.beginTimeMillis = -1; // -1 is a invalid input
1930 
1931     std::vector<GenericValues> recordValues;
1932     GenericValues tmp;
1933     int64_t val = 1; // 1 is a test value
1934     int32_t notExistOpCode = -2; // -2 is a not exist OpCode
1935     tmp.Put(PrivacyFiledConst::FIELD_TIMESTAMP, val);
1936     tmp.Put(PrivacyFiledConst::FIELD_OP_CODE, notExistOpCode);
1937     recordValues.emplace_back(tmp);
1938     int32_t flag = 1; // 1 is a test flag
1939     BundleUsedRecord bundleRecord;
1940     PermissionUsedResult result;
1941     PermissionRecordManager::GetInstance().GetRecords(flag, recordValues, bundleRecord, result);
1942 }
1943 } // namespace AccessToken
1944 } // namespace Security
1945 } // namespace OHOS
1946