• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2025 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 #include <string>
19 
20 #include "access_token.h"
21 #include "accesstoken_kit.h"
22 
23 #include "constant.h"
24 #include "permission_record.h"
25 #include "permission_used_type_info.h"
26 #include "permission_used_request.h"
27 #include "permission_used_result.h"
28 #define private public
29 #include "permission_record_manager.h"
30 #include "privacy_manager_service.h"
31 #undef private
32 #include "privacy_error.h"
33 #include "privacy_field_const.h"
34 #include "privacy_kit.h"
35 #include "privacy_test_common.h"
36 
37 using namespace testing;
38 using namespace testing::ext;
39 using namespace OHOS;
40 
41 namespace OHOS {
42 namespace Security {
43 namespace AccessToken {
44 namespace {
45 static constexpr int32_t PID = -1;
46 static constexpr int32_t CALLER_PID = 11;
47 static constexpr int32_t NATIVE_TOKEN_WITH_PERM = 672000001;
48 static constexpr int32_t NATIVE_TOKEN_WITHOUT_PERM = 671999999;
49 static AccessTokenID g_selfTokenId = 0;
50 static AccessTokenID g_shellToken = 0;
51 static MockNativeToken* g_mock = nullptr;
52 static const char* INVALID_PERMISSION_NAME = "ohos.permission.READ_MEDIA";
53 constexpr const char* CAMERA_PERMISSION_NAME = "ohos.permission.CAMERA";
54 constexpr const char* MICROPHONE_PERMISSION_NAME = "ohos.permission.MICROPHONE";
55 }
56 class PermissionRecordManagerMockTest : public testing::Test {
57 public:
58     static void SetUpTestCase();
59     static void TearDownTestCase();
60     void SetUp();
61     void TearDown();
62 };
63 
SetUpTestCase()64 void PermissionRecordManagerMockTest::SetUpTestCase()
65 {
66     g_selfTokenId = GetSelfTokenID();
67     PrivacyTestCommon::SetTestEvironment(g_selfTokenId);
68     g_mock = new (std::nothrow) MockNativeToken("privacy_service");
69 
70     DelayedSingleton<PrivacyManagerService>::GetInstance()->Initialize();
71     PermissionRecordManager::GetInstance().Init();
72 
73     g_shellToken = PrivacyTestCommon::GetNativeTokenIdFromProcess("hdcd");
74 }
75 
TearDownTestCase()76 void PermissionRecordManagerMockTest::TearDownTestCase()
77 {
78     PrivacyTestCommon::ResetTestEvironment();
79     if (g_mock != nullptr) {
80         delete g_mock;
81         g_mock = nullptr;
82     }
83 }
84 
SetUp()85 void PermissionRecordManagerMockTest::SetUp()
86 {
87     PermissionRecordManager::GetInstance().Init();
88     PermissionRecordManager::GetInstance().Register();
89 }
90 
TearDown()91 void PermissionRecordManagerMockTest::TearDown()
92 {
93 }
94 
MakeInfo(AccessTokenID tokenId,int32_t pid,const std::string & permission,PermissionUsedType type=PermissionUsedType::NORMAL_TYPE)95 static PermissionUsedTypeInfo MakeInfo(AccessTokenID tokenId, int32_t pid, const std::string& permission,
96     PermissionUsedType type = PermissionUsedType::NORMAL_TYPE)
97 {
98     PermissionUsedTypeInfo info = {
99         .tokenId = tokenId,
100         .pid = pid,
101         .permissionName = permission,
102         .type = type
103     };
104     return info;
105 }
106 
107 /*
108  * @tc.name: AddPermissionUsedRecordMockTest001
109  * @tc.desc: PermissionRecordManager::AddPermissionUsedRecord function test
110  * @tc.type: FUNC
111  * @tc.require:
112  */
113 HWTEST_F(PermissionRecordManagerMockTest, AddPermissionUsedRecordMockTest001, TestSize.Level0)
114 {
115     AddPermParamInfo info;
116     info.tokenId = NATIVE_TOKEN_WITH_PERM;
117     info.permissionName = INVALID_PERMISSION_NAME;
118     info.successCount = 1;
119     info.failCount = 0;
120     info.type = NORMAL_TYPE;
121 
122     EXPECT_EQ(PrivacyError::ERR_PARAM_INVALID, PermissionRecordManager::GetInstance().AddPermissionUsedRecord(info));
123 
124     info.permissionName = MICROPHONE_PERMISSION_NAME;
125     EXPECT_EQ(Constant::SUCCESS, PermissionRecordManager::GetInstance().AddPermissionUsedRecord(info));
126 
127     PermissionUsedRequest request;
128     request.tokenId = NATIVE_TOKEN_WITH_PERM;
129     PermissionUsedResult result;
130 
131     EXPECT_EQ(Constant::SUCCESS, PermissionRecordManager::GetInstance().GetPermissionUsedRecords(request, result));
132 
133     EXPECT_EQ(result.bundleRecords.size(), 0);
134 
135     info.tokenId = NATIVE_TOKEN_WITHOUT_PERM;
136     EXPECT_EQ(PrivacyError::ERR_PARAM_INVALID, PermissionRecordManager::GetInstance().AddPermissionUsedRecord(info));
137 
138     info.permissionName = CAMERA_PERMISSION_NAME;
139     EXPECT_EQ(PrivacyError::ERR_PARAM_INVALID, PermissionRecordManager::GetInstance().AddPermissionUsedRecord(info));
140 
141     info.tokenId = NATIVE_TOKEN_WITH_PERM;
142     EXPECT_EQ(Constant::SUCCESS, PermissionRecordManager::GetInstance().AddPermissionUsedRecord(info));
143 
144     request.tokenId = NATIVE_TOKEN_WITH_PERM;
145     EXPECT_EQ(Constant::SUCCESS, PermissionRecordManager::GetInstance().GetPermissionUsedRecords(request, result));
146 
147     EXPECT_EQ(result.bundleRecords.size(), 0);
148 
149     info.tokenId = g_shellToken;
150     EXPECT_EQ(PrivacyError::ERR_TOKENID_NOT_EXIST,
151         PermissionRecordManager::GetInstance().AddPermissionUsedRecord(info));
152 }
153 
154 /*
155  * @tc.name: StartUsingPermissionMockTest001
156  * @tc.desc: StartUsingPermission function test
157  * @tc.type: FUNC
158  * @tc.require:
159  */
160 HWTEST_F(PermissionRecordManagerMockTest, StartUsingPermissionMockTest001, TestSize.Level0)
161 {
162     std::string permissionName = INVALID_PERMISSION_NAME;
163     AccessTokenID tokenId = NATIVE_TOKEN_WITH_PERM;
164 
165     EXPECT_EQ(PrivacyError::ERR_PARAM_INVALID, PermissionRecordManager::GetInstance().StartUsingPermission(
166         MakeInfo(tokenId, PID, permissionName), CALLER_PID));
167 
168     permissionName = MICROPHONE_PERMISSION_NAME;
169     EXPECT_EQ(Constant::SUCCESS, PermissionRecordManager::GetInstance().StartUsingPermission(
170         MakeInfo(tokenId, PID, permissionName), CALLER_PID));
171 
172     tokenId = NATIVE_TOKEN_WITHOUT_PERM;
173     EXPECT_EQ(PrivacyError::ERR_PARAM_INVALID, PermissionRecordManager::GetInstance().StartUsingPermission(
174         MakeInfo(tokenId, PID, permissionName), CALLER_PID));
175 
176     permissionName = CAMERA_PERMISSION_NAME;
177     EXPECT_EQ(PrivacyError::ERR_PARAM_INVALID, PermissionRecordManager::GetInstance().StartUsingPermission(
178         MakeInfo(tokenId, PID, permissionName), CALLER_PID));
179 
180     tokenId = NATIVE_TOKEN_WITH_PERM;
181     EXPECT_EQ(Constant::SUCCESS, PermissionRecordManager::GetInstance().StartUsingPermission(
182         MakeInfo(tokenId, PID, permissionName), CALLER_PID));
183 
184     tokenId = g_shellToken;
185     EXPECT_EQ(PrivacyError::ERR_PARAM_INVALID, PermissionRecordManager::GetInstance().StartUsingPermission(
186         MakeInfo(tokenId, PID, permissionName), CALLER_PID));
187 }
188 
189 /*
190  * @tc.name: StartUsingPermissionMockTest002
191  * @tc.desc: StartUsingPermission function test
192  * @tc.type: FUNC
193  * @tc.require:
194  */
195 HWTEST_F(PermissionRecordManagerMockTest, StartUsingPermissionMockTest002, TestSize.Level0)
196 {
197     std::string permissionName = INVALID_PERMISSION_NAME;
198     AccessTokenID tokenId = NATIVE_TOKEN_WITH_PERM;
199 
200     EXPECT_EQ(PrivacyError::ERR_PARAM_INVALID, PermissionRecordManager::GetInstance().StartUsingPermission(
201         MakeInfo(tokenId, PID, permissionName), nullptr, CALLER_PID));
202 
203     permissionName = MICROPHONE_PERMISSION_NAME;
204     EXPECT_EQ(Constant::SUCCESS, PermissionRecordManager::GetInstance().StartUsingPermission(
205         MakeInfo(tokenId, PID, permissionName), nullptr, CALLER_PID));
206 
207     tokenId = NATIVE_TOKEN_WITHOUT_PERM;
208     EXPECT_EQ(PrivacyError::ERR_PARAM_INVALID, PermissionRecordManager::GetInstance().StartUsingPermission(
209         MakeInfo(tokenId, PID, permissionName), nullptr, CALLER_PID));
210 
211     permissionName = CAMERA_PERMISSION_NAME;
212     EXPECT_EQ(PrivacyError::ERR_PARAM_INVALID, PermissionRecordManager::GetInstance().StartUsingPermission(
213         MakeInfo(tokenId, PID, permissionName), nullptr, CALLER_PID));
214 
215     tokenId = NATIVE_TOKEN_WITH_PERM;
216     EXPECT_EQ(Constant::SUCCESS, PermissionRecordManager::GetInstance().StartUsingPermission(
217         MakeInfo(tokenId, PID, permissionName), nullptr, CALLER_PID));
218 
219     tokenId = g_shellToken;
220     EXPECT_EQ(PrivacyError::ERR_PARAM_INVALID, PermissionRecordManager::GetInstance().StartUsingPermission(
221         MakeInfo(tokenId, PID, permissionName), nullptr, CALLER_PID));
222 }
223 
224 /*
225  * @tc.name: StopUsingPermissionMockTest001
226  * @tc.desc: PermissionRecordManager::StopUsingPermission function test
227  * @tc.type: FUNC
228  * @tc.require:
229  */
230 HWTEST_F(PermissionRecordManagerMockTest, StopUsingPermissionMockTest001, TestSize.Level0)
231 {
232     std::string permissionName = INVALID_PERMISSION_NAME;
233     AccessTokenID tokenId = NATIVE_TOKEN_WITH_PERM;
234 
235     EXPECT_EQ(PrivacyError::ERR_PARAM_INVALID, PermissionRecordManager::GetInstance().StopUsingPermission(
236         tokenId, PID, permissionName, CALLER_PID));
237 
238     permissionName = MICROPHONE_PERMISSION_NAME;
239     EXPECT_EQ(Constant::SUCCESS, PermissionRecordManager::GetInstance().StopUsingPermission(
240         tokenId, PID, permissionName, CALLER_PID));
241 
242     tokenId = NATIVE_TOKEN_WITHOUT_PERM;
243     EXPECT_EQ(PrivacyError::ERR_PARAM_INVALID, PermissionRecordManager::GetInstance().StopUsingPermission(
244         tokenId, PID, permissionName, CALLER_PID));
245 
246     permissionName = CAMERA_PERMISSION_NAME;
247     EXPECT_EQ(PrivacyError::ERR_PARAM_INVALID, PermissionRecordManager::GetInstance().StopUsingPermission(
248         tokenId, PID, permissionName, CALLER_PID));
249 
250     tokenId = NATIVE_TOKEN_WITH_PERM;
251     EXPECT_EQ(Constant::SUCCESS, PermissionRecordManager::GetInstance().StopUsingPermission(
252         tokenId, PID, permissionName, CALLER_PID));
253 
254     tokenId = g_shellToken;
255     EXPECT_EQ(PrivacyError::ERR_PARAM_INVALID, PermissionRecordManager::GetInstance().StopUsingPermission(
256         tokenId, PID, permissionName, CALLER_PID));
257 }
258 
259 /*
260  * @tc.name: IsAllowedUsingPermissionMockTest001
261  * @tc.desc: PermissionRecordManager::StopUsingPermission function test
262  * @tc.type: FUNC
263  * @tc.require:
264  */
265 HWTEST_F(PermissionRecordManagerMockTest, IsAllowedUsingPermissionMockTest001, TestSize.Level0)
266 {
267     std::string permissionName = INVALID_PERMISSION_NAME;
268     AccessTokenID tokenId = NATIVE_TOKEN_WITH_PERM;
269 
270     EXPECT_EQ(false, PermissionRecordManager::GetInstance().IsAllowedUsingPermission(tokenId, permissionName, PID));
271 
272     permissionName = MICROPHONE_PERMISSION_NAME;
273     EXPECT_EQ(true, PermissionRecordManager::GetInstance().IsAllowedUsingPermission(tokenId, permissionName, PID));
274 
275     tokenId = NATIVE_TOKEN_WITHOUT_PERM;
276     EXPECT_EQ(false, PermissionRecordManager::GetInstance().IsAllowedUsingPermission(tokenId, permissionName, PID));
277 
278     permissionName = CAMERA_PERMISSION_NAME;
279     EXPECT_EQ(false, PermissionRecordManager::GetInstance().IsAllowedUsingPermission(tokenId, permissionName, PID));
280 
281     tokenId = NATIVE_TOKEN_WITH_PERM;
282     EXPECT_EQ(true, PermissionRecordManager::GetInstance().IsAllowedUsingPermission(tokenId, permissionName, PID));
283 
284     tokenId = g_shellToken;
285     EXPECT_EQ(false, PermissionRecordManager::GetInstance().IsAllowedUsingPermission(tokenId, permissionName, PID));
286 }
287 } // namespace AccessToken
288 } // namespace Security
289 } // namespace OHOS