1 /*
2 * Copyright (c) 2023 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 #define LOG_TAG "UdmfClientHapPermissionTest"
16 #include <gtest/gtest.h>
17
18 #include <unistd.h>
19 #include <thread>
20 #include <chrono>
21
22 #include "token_setproc.h"
23 #include "accesstoken_kit.h"
24 #include "directory_ex.h"
25 #include "nativetoken_kit.h"
26
27 #include "logger.h"
28 #include "udmf_client.h"
29 #include "application_defined_record.h"
30 #include "audio.h"
31 #include "file.h"
32 #include "folder.h"
33 #include "html.h"
34 #include "image.h"
35 #include "link.h"
36 #include "plain_text.h"
37 #include "system_defined_appitem.h"
38 #include "system_defined_form.h"
39 #include "system_defined_pixelmap.h"
40 #include "system_defined_record.h"
41 #include "text.h"
42 #include "unified_data_helper.h"
43 #include "video.h"
44
45 using namespace testing::ext;
46 using namespace OHOS::Security::AccessToken;
47 using namespace OHOS::UDMF;
48 using namespace OHOS;
49 namespace OHOS::Test {
50 static constexpr int USER_ID = 100;
51 static constexpr int INST_INDEX = 0;
52 class UdmfClientHapPermissionTest : public testing::Test {
53 public:
54 static void SetUpTestCase();
55 static void TearDownTestCase();
56 void SetUp() override;
57 void TearDown() override;
58
59 void SetNativeToken(const std::string &processName);
60 static void AllocHapToken1();
61 static void AllocHapToken2();
62 void SetHapToken1();
63 void SetHapToken2();
64 void AddPrivilege(QueryOption &option);
65 };
66
SetUpTestCase()67 void UdmfClientHapPermissionTest::SetUpTestCase()
68 {
69 AllocHapToken1();
70 AllocHapToken2();
71 }
72
TearDownTestCase()73 void UdmfClientHapPermissionTest::TearDownTestCase()
74 {
75 auto tokenId = AccessTokenKit::GetHapTokenID(USER_ID, "ohos.test.demo11", INST_INDEX);
76 AccessTokenKit::DeleteToken(tokenId);
77 tokenId = AccessTokenKit::GetHapTokenID(USER_ID, "ohos.test.demo22", INST_INDEX);
78 AccessTokenKit::DeleteToken(tokenId);
79 }
80
SetUp()81 void UdmfClientHapPermissionTest::SetUp()
82 {
83 SetHapToken1();
84 }
85
TearDown()86 void UdmfClientHapPermissionTest::TearDown()
87 {
88 }
89
SetNativeToken(const std::string & processName)90 void UdmfClientHapPermissionTest::SetNativeToken(const std::string &processName)
91 {
92 auto tokenId = AccessTokenKit::GetNativeTokenId(processName);
93 SetSelfTokenID(tokenId);
94 }
95
AllocHapToken1()96 void UdmfClientHapPermissionTest::AllocHapToken1()
97 {
98 HapInfoParams info = {
99 .userID = USER_ID,
100 .bundleName = "ohos.test.demo11",
101 .instIndex = INST_INDEX,
102 .appIDDesc = "ohos.test.demo11",
103 .isSystemApp = false,
104 };
105
106 HapPolicyParams policy = {
107 .apl = APL_SYSTEM_BASIC,
108 .domain = "test.domain",
109 .permList = {
110 {
111 .permissionName = "ohos.permission.test",
112 .bundleName = "ohos.test.demo11",
113 .grantMode = 1,
114 .availableLevel = APL_SYSTEM_BASIC,
115 .label = "label",
116 .labelId = 1,
117 .description = "test1",
118 .descriptionId = 1
119 }
120 },
121 .permStateList = {
122 {
123 .permissionName = "ohos.permission.test",
124 .isGeneral = true,
125 .resDeviceID = { "local" },
126 .grantStatus = { PermissionState::PERMISSION_GRANTED },
127 .grantFlags = { 1 }
128 }
129 }
130 };
131 auto tokenID = AccessTokenKit::AllocHapToken(info, policy);
132 SetSelfTokenID(tokenID.tokenIDEx);
133 }
134
AllocHapToken2()135 void UdmfClientHapPermissionTest::AllocHapToken2()
136 {
137 HapInfoParams info = {
138 .userID = USER_ID,
139 .bundleName = "ohos.test.demo22",
140 .instIndex = 0,
141 .isSystemApp = false,
142 .appIDDesc = "ohos.test.demo22"
143 };
144 HapPolicyParams policy = {
145 .apl = APL_SYSTEM_BASIC,
146 .domain = "test.domain",
147 .permList = {
148 {
149 .permissionName = "ohos.permission.MANAGE_UDMF_APP_SHARE_OPTION",
150 .bundleName = "ohos.test.demo22",
151 .grantMode = 1,
152 .availableLevel = APL_SYSTEM_BASIC,
153 .label = "label",
154 .labelId = 1,
155 .description = "test2",
156 .descriptionId = 1
157 }
158 },
159 .permStateList = {
160 {
161 .permissionName = "ohos.permission.MANAGE_UDMF_APP_SHARE_OPTION",
162 .isGeneral = true,
163 .resDeviceID = { "local" },
164 .grantStatus = { PermissionState::PERMISSION_GRANTED },
165 .grantFlags = { 1 }
166 }
167 }
168 };
169 auto tokenID = AccessTokenKit::AllocHapToken(info, policy);
170 SetSelfTokenID(tokenID.tokenIDEx);
171 }
172
SetHapToken1()173 void UdmfClientHapPermissionTest::SetHapToken1()
174 {
175 auto tokenId = AccessTokenKit::GetHapTokenID(USER_ID, "ohos.test.demo11", INST_INDEX);
176 SetSelfTokenID(tokenId);
177 }
178
SetHapToken2()179 void UdmfClientHapPermissionTest::SetHapToken2()
180 {
181 auto tokenId = AccessTokenKit::GetHapTokenID(USER_ID, "ohos.test.demo22", INST_INDEX);
182 SetSelfTokenID(tokenId);
183 }
184
AddPrivilege(QueryOption & option)185 void UdmfClientHapPermissionTest::AddPrivilege(QueryOption &option)
186 {
187 Privilege privilege;
188 privilege.tokenId = AccessTokenKit::GetHapTokenID(USER_ID, "ohos.test.demo22", INST_INDEX);
189 privilege.readPermission = "readPermission";
190 privilege.writePermission = "writePermission";
191 SetNativeToken("msdp_sa");
192 auto status = UdmfClient::GetInstance().AddPrivilege(option, privilege);
193 ASSERT_EQ(status, E_OK);
194 }
195
196 /**
197 * @tc.name: SetAppShareOption001
198 * @tc.desc: abnormal test, no permission
199 * @tc.type: FUNC
200 */
201 HWTEST_F(UdmfClientHapPermissionTest, SetAppShareOption001, TestSize.Level1)
202 {
203 SetHapToken1();
204 LOG_INFO(UDMF_TEST, "SetAppShareOption001 begin.");
205 auto status = UdmfClient::GetInstance().SetAppShareOption("drag", ShareOptions::IN_APP);
206 EXPECT_EQ(status, E_NO_PERMISSION);
207 LOG_INFO(UDMF_TEST, "SetAppShareOption001 end.");
208 }
209
210 /**
211 * @tc.name: SetAppShareOption002
212 * @tc.desc: normal test, has permission
213 * @tc.type: FUNC
214 */
215 HWTEST_F(UdmfClientHapPermissionTest, SetAppShareOption002, TestSize.Level1)
216 {
217 SetHapToken2();
218 LOG_INFO(UDMF_TEST, "SetAppShareOption002 begin.");
219 auto status = UdmfClient::GetInstance().SetAppShareOption("drag", ShareOptions::IN_APP);
220 EXPECT_EQ(status, E_OK);
221
222 ShareOptions appShareOptions;
223 status = UdmfClient::GetInstance().GetAppShareOption("drag", appShareOptions);
224 EXPECT_EQ(status, E_OK);
225 EXPECT_EQ(appShareOptions, ShareOptions::IN_APP);
226
227 status = UdmfClient::GetInstance().RemoveAppShareOption("drag");
228 EXPECT_EQ(status, E_OK);
229
230 status = UdmfClient::GetInstance().SetAppShareOption("drag", ShareOptions::CROSS_APP);
231 EXPECT_EQ(status, E_OK);
232
233 status = UdmfClient::GetInstance().GetAppShareOption("drag", appShareOptions);
234 EXPECT_EQ(status, E_OK);
235 EXPECT_EQ(appShareOptions, ShareOptions::CROSS_APP);
236
237 status = UdmfClient::GetInstance().RemoveAppShareOption("drag");
238 EXPECT_EQ(status, E_OK);
239
240 status = UdmfClient::GetInstance().GetAppShareOption("drag", appShareOptions);
241 EXPECT_EQ(status, E_NOT_FOUND);
242 LOG_INFO(UDMF_TEST, "SetAppShareOption002 end.");
243 }
244
245 /**
246 * @tc.name: SetAppShareOption003
247 * @tc.desc: SetAppShareOption IN_APP, get data success when IN_APP
248 * @tc.type: FUNC
249 */
250 HWTEST_F(UdmfClientHapPermissionTest, SetAppShareOption003, TestSize.Level1)
251 {
252 LOG_INFO(UDMF_TEST, "SetAppShareOption003 begin.");
253 SetHapToken2();
254 auto status = UdmfClient::GetInstance().SetAppShareOption("drag", ShareOptions::IN_APP);
255 EXPECT_EQ(status, E_OK);
256
257 CustomOption option1 = { .intention = Intention::UD_INTENTION_DRAG };
258 UnifiedData data1;
259 Text text1;
260 std::shared_ptr<UnifiedRecord> record1 = std::make_shared<Text>(text1);
261 data1.AddRecord(record1);
262 std::string key;
263 status = UdmfClient::GetInstance().SetData(option1, data1, key);
264 ASSERT_EQ(status, E_OK);
265
266 QueryOption option2 = { .key = key };
267 SetHapToken2();
268 UnifiedData data2;
269 status = UdmfClient::GetInstance().GetData(option2, data2);
270 ASSERT_EQ(status, E_OK);
271
272 std::shared_ptr<UnifiedRecord> record2 = data2.GetRecordAt(0);
273 ASSERT_NE(record2, nullptr);
274 auto type = record2->GetType();
275 EXPECT_EQ(type, UDType::TEXT);
276
277 auto text2 = static_cast<Text *>(record2.get());
278 ASSERT_NE(text2, nullptr);
279
280 status = UdmfClient::GetInstance().RemoveAppShareOption("drag");
281 EXPECT_EQ(status, E_OK);
282 LOG_INFO(UDMF_TEST, "SetAppShareOption003 end.");
283 }
284
285 /**
286 * @tc.name: SetAppShareOption004
287 * @tc.desc: SetAppShareOption CROSS_APP, get data success when CROSS_APP
288 * @tc.type: FUNC
289 */
290 HWTEST_F(UdmfClientHapPermissionTest, SetAppShareOption004, TestSize.Level1)
291 {
292 LOG_INFO(UDMF_TEST, "SetAppShareOption004 begin.");
293 SetHapToken2();
294 auto status = UdmfClient::GetInstance().SetAppShareOption("drag", ShareOptions::CROSS_APP);
295 EXPECT_EQ(status, E_OK);
296
297 CustomOption option1 = { .intention = Intention::UD_INTENTION_DRAG };
298 UnifiedData data1;
299 Text text1;
300 std::shared_ptr<UnifiedRecord> record1 = std::make_shared<Text>(text1);
301 data1.AddRecord(record1);
302 std::string key;
303 status = UdmfClient::GetInstance().SetData(option1, data1, key);
304 ASSERT_EQ(status, E_OK);
305
306 QueryOption option2 = { .key = key };
307 AddPrivilege(option2);
308
309 SetHapToken2();
310 UnifiedData data2;
311 status = UdmfClient::GetInstance().GetData(option2, data2);
312 ASSERT_EQ(status, E_OK);
313 std::shared_ptr<UnifiedRecord> record2 = data2.GetRecordAt(0);
314 ASSERT_NE(record2, nullptr);
315 auto type = record2->GetType();
316 EXPECT_EQ(type, UDType::TEXT);
317 auto text2 = static_cast<Text *>(record2.get());
318 ASSERT_NE(text2, nullptr);
319
320 SetHapToken2();
321 status = UdmfClient::GetInstance().RemoveAppShareOption("drag");
322 EXPECT_EQ(status, E_OK);
323 LOG_INFO(UDMF_TEST, "SetAppShareOption004 end.");
324 }
325
326 /**
327 * @tc.name: RemoveAppShareOption001
328 * @tc.desc: abnormal test, no permission
329 * @tc.type: FUNC
330 */
331 HWTEST_F(UdmfClientHapPermissionTest, RemoveAppShareOption001, TestSize.Level1)
332 {
333 SetHapToken1();
334 LOG_INFO(UDMF_TEST, "RemoveAppShareOption001 begin.");
335 auto status = UdmfClient::GetInstance().RemoveAppShareOption("drag");
336 EXPECT_EQ(status, E_NO_PERMISSION);
337 LOG_INFO(UDMF_TEST, "RemoveAppShareOption001 end.");
338 }
339
340 /**
341 * @tc.name: RemoveAppShareOption002
342 * @tc.desc: normal test, has permission
343 * @tc.type: FUNC
344 */
345 HWTEST_F(UdmfClientHapPermissionTest, RemoveAppShareOption002, TestSize.Level1)
346 {
347 SetHapToken2();
348 LOG_INFO(UDMF_TEST, "RemoveAppShareOption002 begin.");
349 auto status = UdmfClient::GetInstance().RemoveAppShareOption("drag");
350 EXPECT_EQ(status, E_OK);
351
352 ShareOptions appShareOptions;
353 status = UdmfClient::GetInstance().GetAppShareOption("drag", appShareOptions);
354 EXPECT_EQ(status, E_NOT_FOUND);
355 LOG_INFO(UDMF_TEST, "RemoveAppShareOption002 end.");
356 }
357 } // OHOS::Test