1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "permission_request_toggle_status_test.h"
17 #include "gtest/gtest.h"
18 #include <thread>
19 #include <unistd.h>
20
21 #include "access_token.h"
22 #include "access_token_error.h"
23 #include "accesstoken_common_log.h"
24 #include "iaccess_token_manager.h"
25 #include "permission_grant_info.h"
26 #include "permission_state_change_info_parcel.h"
27 #include "string_ex.h"
28 #include "test_common.h"
29 #include "tokenid_kit.h"
30 #include "token_setproc.h"
31
32 using namespace testing::ext;
33 namespace OHOS {
34 namespace Security {
35 namespace AccessToken {
36 namespace {
37 static uint64_t g_selfTokenId = 0;
38 static const std::string TEST_BUNDLE_NAME = "ohos";
39 static const int TEST_USER_ID = 0;
40 static constexpr int32_t DEFAULT_API_VERSION = 8;
41 static MockHapToken* g_mock = nullptr;
42 HapInfoParams g_infoManagerTestNormalInfoParms = TestCommon::GetInfoManagerTestNormalInfoParms();
43 HapInfoParams g_infoManagerTestSystemInfoParms = TestCommon::GetInfoManagerTestSystemInfoParms();
44 HapPolicyParams g_infoManagerTestPolicyPrams = TestCommon::GetInfoManagerTestPolicyPrams();
45 };
46
SetUpTestCase()47 void PermissionRequestToggleStatusTest::SetUpTestCase()
48 {
49 g_selfTokenId = GetSelfTokenID();
50 TestCommon::SetTestEvironment(g_selfTokenId);
51
52 // clean up test cases
53 AccessTokenIDEx tokenIdEx = TestCommon::GetHapTokenIdFromBundle(TEST_USER_ID, TEST_BUNDLE_NAME, 0);
54 AccessTokenID tokenID = tokenIdEx.tokenIdExStruct.tokenID;
55 TestCommon::DeleteTestHapToken(tokenID);
56
57 std::vector<std::string> reqPerm;
58 reqPerm.emplace_back("ohos.permission.GET_SENSITIVE_PERMISSIONS");
59 reqPerm.emplace_back("ohos.permission.DISABLE_PERMISSION_DIALOG");
60 g_mock = new (std::nothrow) MockHapToken("PermissionRequestToggleStatusTest", reqPerm, true);
61 }
62
TearDownTestCase()63 void PermissionRequestToggleStatusTest::TearDownTestCase()
64 {
65 AccessTokenIDEx tokenIdEx = TestCommon::GetHapTokenIdFromBundle(TEST_USER_ID, TEST_BUNDLE_NAME, 0);
66 AccessTokenID tokenID = tokenIdEx.tokenIdExStruct.tokenID;
67 TestCommon::DeleteTestHapToken(tokenID);
68
69 if (g_mock != nullptr) {
70 delete g_mock;
71 g_mock = nullptr;
72 }
73 EXPECT_EQ(0, SetSelfTokenID(g_selfTokenId));
74 TestCommon::ResetTestEvironment();
75 }
76
SetUp()77 void PermissionRequestToggleStatusTest::SetUp()
78 {
79 LOGI(ATM_DOMAIN, ATM_TAG, "SetUp ok.");
80
81 setuid(0);
82 HapInfoParams info = {
83 .userID = TEST_USER_ID,
84 .bundleName = TEST_BUNDLE_NAME,
85 .instIndex = 0,
86 .appIDDesc = "appIDDesc",
87 .apiVersion = DEFAULT_API_VERSION
88 };
89
90 HapPolicyParams policy = {
91 .apl = APL_NORMAL,
92 .domain = "domain"
93 };
94 TestCommon::TestPreparePermStateList(policy);
95
96 AccessTokenIDEx tokenIdEx = {0};
97 EXPECT_EQ(RET_SUCCESS, TestCommon::AllocTestHapToken(info, policy, tokenIdEx));
98 EXPECT_NE(INVALID_TOKENID, tokenIdEx.tokenIdExStruct.tokenID);
99 }
100
TearDown()101 void PermissionRequestToggleStatusTest::TearDown()
102 {
103 AccessTokenIDEx tokenIdEx = TestCommon::GetHapTokenIdFromBundle(TEST_USER_ID, TEST_BUNDLE_NAME, 0);
104 AccessTokenID tokenID = tokenIdEx.tokenIdExStruct.tokenID;
105 TestCommon::DeleteTestHapToken(tokenID);
106 }
107
108 /**
109 * @tc.name: SetPermissionRequestToggleStatusAbnormalTest001
110 * @tc.desc: Set permission request toggle status that userId, permission or status is invalid.
111 * @tc.type: FUNC
112 * @tc.require: Issue Number
113 */
114 HWTEST_F(PermissionRequestToggleStatusTest, SetPermissionRequestToggleStatusAbnormalTest001, TestSize.Level0)
115 {
116 LOGI(ATM_DOMAIN, ATM_TAG, "SetPermissionRequestToggleStatusAbnormalTest001");
117
118 int32_t userID = 100;
119 uint32_t status = PermissionRequestToggleStatus::CLOSED;
120
121 // Permission name is invalid.
122 int32_t ret = AccessTokenKit::SetPermissionRequestToggleStatus("", status, userID);
123 EXPECT_EQ(AccessTokenError::ERR_PARAM_INVALID, ret);
124
125 // Status is invalid.
126 status = 2;
127 ret = AccessTokenKit::SetPermissionRequestToggleStatus("ohos.permission.MICROPHONE", status, userID);
128 EXPECT_EQ(AccessTokenError::ERR_PARAM_INVALID, ret);
129
130 // UserID is invalid.
131 userID = -1;
132 status = PermissionRequestToggleStatus::CLOSED;
133 ret = AccessTokenKit::SetPermissionRequestToggleStatus("ohos.permission.MICROPHONE", status, userID);
134 EXPECT_EQ(AccessTokenError::ERR_PARAM_INVALID, ret);
135 }
136
137 /**
138 * @tc.name: SetPermissionRequestToggleStatus001
139 * @tc.desc: SetPermissionRequestToggleStatus caller is a normal app, not a system app.
140 * @tc.type: FUNC
141 * @tc.require: Issue Number
142 */
143 HWTEST_F(PermissionRequestToggleStatusTest, SetPermissionRequestToggleStatus001, TestSize.Level0)
144 {
145 LOGI(ATM_DOMAIN, ATM_TAG, "SetPermissionRequestToggleStatus001");
146 std::vector<std::string> reqPerm;
147 reqPerm.emplace_back("ohos.permission.DISABLE_PERMISSION_DIALOG");
148 MockHapToken mock("SetPermissionRequestToggleStatus001", reqPerm, false);
149
150 uint32_t status = PermissionRequestToggleStatus::CLOSED;
151 int32_t ret = AccessTokenKit::SetPermissionRequestToggleStatus("ohos.permission.MICROPHONE", status,
152 g_infoManagerTestNormalInfoParms.userID);
153 EXPECT_EQ(ERR_NOT_SYSTEM_APP, ret);
154 }
155
156 /**
157 * @tc.name: SetPermissionRequestToggleStatus002
158 * @tc.desc: SetPermissionRequestToggleStatus caller is a system app without permissions.
159 * @tc.type: FUNC
160 * @tc.require: Issue Number
161 */
162 HWTEST_F(PermissionRequestToggleStatusTest, SetPermissionRequestToggleStatus002, TestSize.Level0)
163 {
164 LOGI(ATM_DOMAIN, ATM_TAG, "SetPermissionRequestToggleStatus002");
165 std::vector<std::string> reqPerm;
166 MockHapToken mock("SetPermissionRequestToggleStatus002", reqPerm, true);
167
168 int32_t selfUid = getuid();
169 setuid(10001); // 10001: UID
170 uint32_t status = PermissionRequestToggleStatus::CLOSED;
171 int32_t ret = AccessTokenKit::SetPermissionRequestToggleStatus("ohos.permission.MICROPHONE", status,
172 g_infoManagerTestSystemInfoParms.userID);
173 EXPECT_EQ(AccessTokenError::ERR_PERMISSION_DENIED, ret);
174
175 status = PermissionRequestToggleStatus::OPEN;
176 ret = AccessTokenKit::SetPermissionRequestToggleStatus("ohos.permission.MICROPHONE", status,
177 g_infoManagerTestSystemInfoParms.userID);
178 EXPECT_EQ(AccessTokenError::ERR_PERMISSION_DENIED, ret);
179
180 // restore environment
181 setuid(selfUid);
182 }
183
184 /**
185 * @tc.name: SetPermissionRequestToggleStatusSpecTest003
186 * @tc.desc: SetPermissionRequestToggleStatus caller is a system app with permissions.
187 * @tc.type: FUNC
188 * @tc.require: Issue Number
189 */
190 HWTEST_F(PermissionRequestToggleStatusTest, SetPermissionRequestToggleStatusSpecTest003, TestSize.Level0)
191 {
192 LOGI(ATM_DOMAIN, ATM_TAG, "SetPermissionRequestToggleStatusSpecTest003");
193 std::vector<std::string> reqPerm;
194 reqPerm.emplace_back("ohos.permission.DISABLE_PERMISSION_DIALOG");
195 MockHapToken mock("SetPermissionRequestToggleStatusSpecTest003", reqPerm, true);
196
197 uint32_t status = PermissionRequestToggleStatus::CLOSED;
198 int32_t ret = AccessTokenKit::SetPermissionRequestToggleStatus("ohos.permission.MICROPHONE", status,
199 g_infoManagerTestSystemInfoParms.userID);
200 EXPECT_EQ(RET_SUCCESS, ret);
201
202 status = PermissionRequestToggleStatus::OPEN;
203 ret = AccessTokenKit::SetPermissionRequestToggleStatus("ohos.permission.MICROPHONE", status,
204 g_infoManagerTestSystemInfoParms.userID);
205 EXPECT_EQ(RET_SUCCESS, ret);
206 }
207
208 /**
209 * @tc.name: GetPermissionRequestToggleStatusAbnormalTest001
210 * @tc.desc: Get permission request toggle status that userId, permission is invalid.
211 * @tc.type: FUNC
212 * @tc.require: Issue Number
213 */
214 HWTEST_F(PermissionRequestToggleStatusTest, GetPermissionRequestToggleStatusAbnormalTest001, TestSize.Level0)
215 {
216 LOGI(ATM_DOMAIN, ATM_TAG, "GetPermissionRequestToggleStatusAbnormalTest001");
217
218 int32_t userID = 100;
219 uint32_t status;
220
221 // Permission name is invalid.
222 int32_t ret = AccessTokenKit::GetPermissionRequestToggleStatus("", status, userID);
223 EXPECT_EQ(AccessTokenError::ERR_PARAM_INVALID, ret);
224
225 // UserId is invalid.
226 userID = -1;
227 ret = AccessTokenKit::GetPermissionRequestToggleStatus("ohos.permission.MICROPHONE", status, userID);
228 EXPECT_EQ(AccessTokenError::ERR_PARAM_INVALID, ret);
229 }
230
231 /**
232 * @tc.name: GetPermissionRequestToggleStatusSpecTest001
233 * @tc.desc: GetPermissionRequestToggleStatus caller is a normal app, not a system app.
234 * @tc.type: FUNC
235 * @tc.require: Issue Number
236 */
237 HWTEST_F(PermissionRequestToggleStatusTest, GetPermissionRequestToggleStatusSpecTest001, TestSize.Level0)
238 {
239 LOGI(ATM_DOMAIN, ATM_TAG, "GetPermissionRequestToggleStatusSpecTest001");
240 std::vector<std::string> reqPerm;
241 reqPerm.emplace_back("ohos.permission.DISABLE_PERMISSION_DIALOG");
242 MockHapToken mock("GetPermissionRequestToggleStatusSpecTest001", reqPerm, false);
243
244 uint32_t status;
245 int32_t ret = AccessTokenKit::GetPermissionRequestToggleStatus("ohos.permission.MICROPHONE", status,
246 g_infoManagerTestNormalInfoParms.userID);
247 EXPECT_EQ(ERR_NOT_SYSTEM_APP, ret);
248 }
249
250 /**
251 * @tc.name: GetPermissionRequestToggleStatusSpecTest002
252 * @tc.desc: GetPermissionRequestToggleStatus caller is a system app without permissions.
253 * @tc.type: FUNC
254 * @tc.require: Issue Number
255 */
256 HWTEST_F(PermissionRequestToggleStatusTest, GetPermissionRequestToggleStatusSpecTest002, TestSize.Level0)
257 {
258 LOGI(ATM_DOMAIN, ATM_TAG, "GetPermissionRequestToggleStatusSpecTest002");
259 std::vector<std::string> reqPerm;
260 MockHapToken mock("GetPermissionRequestToggleStatusSpecTest002", reqPerm, true);
261
262 int32_t selfUid = getuid();
263 setuid(10001); // 10001: UID
264
265 uint32_t getStatus;
266 int32_t ret = AccessTokenKit::GetPermissionRequestToggleStatus("ohos.permission.MICROPHONE", getStatus,
267 g_infoManagerTestSystemInfoParms.userID);
268 EXPECT_EQ(AccessTokenError::ERR_PERMISSION_DENIED, ret);
269
270 // restore environment
271 setuid(selfUid);
272 }
273
274 /**
275 * @tc.name: GetPermissionRequestToggleStatusSpecTest003
276 * @tc.desc: GetPermissionRequestToggleStatus caller is a system app with related permissions.
277 * @tc.type: FUNC
278 * @tc.require: Issue Number
279 */
280 HWTEST_F(PermissionRequestToggleStatusTest, GetPermissionRequestToggleStatusSpecTest003, TestSize.Level0)
281 {
282 LOGI(ATM_DOMAIN, ATM_TAG, "GetPermissionRequestToggleStatusSpecTest003");
283 std::vector<std::string> reqPerm;
284 reqPerm.emplace_back("ohos.permission.DISABLE_PERMISSION_DIALOG");
285 reqPerm.emplace_back("ohos.permission.GET_SENSITIVE_PERMISSIONS");
286 MockHapToken mock("GetPermissionRequestToggleStatusSpecTest003", reqPerm, true);
287
288 // Set a closed status value.
289 uint32_t status = PermissionRequestToggleStatus::CLOSED;
290 int32_t ret = AccessTokenKit::SetPermissionRequestToggleStatus("ohos.permission.MICROPHONE", status,
291 g_infoManagerTestSystemInfoParms.userID);
292 EXPECT_EQ(RET_SUCCESS, ret);
293
294 // Get a closed status value.
295 uint32_t getStatus;
296 ret = AccessTokenKit::GetPermissionRequestToggleStatus("ohos.permission.MICROPHONE", getStatus,
297 g_infoManagerTestSystemInfoParms.userID);
298 EXPECT_EQ(RET_SUCCESS, ret);
299 EXPECT_EQ(PermissionRequestToggleStatus::CLOSED, getStatus);
300
301 // Set a open status value.
302 status = PermissionRequestToggleStatus::OPEN;
303 ret = AccessTokenKit::SetPermissionRequestToggleStatus("ohos.permission.MICROPHONE", status,
304 g_infoManagerTestSystemInfoParms.userID);
305 EXPECT_EQ(RET_SUCCESS, ret);
306
307 // Get a open status value.
308 ret = AccessTokenKit::GetPermissionRequestToggleStatus("ohos.permission.MICROPHONE", getStatus,
309 g_infoManagerTestSystemInfoParms.userID);
310 EXPECT_EQ(RET_SUCCESS, ret);
311 EXPECT_EQ(PermissionRequestToggleStatus::OPEN, getStatus);
312 }
313 } // namespace AccessToken
314 } // namespace Security
315 } // namespace OHOS