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