1 /*
2 * Copyright (c) 2021-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 #include <gtest/gtest.h>
16 #include <unistd.h>
17
18 #include <chrono>
19 #include <cstdint>
20 #include <vector>
21
22 #include "access_token.h"
23 #include "accesstoken_kit.h"
24 #include "hap_token_info.h"
25 #include "os_account_manager.h"
26 #include "pasteboard_client.h"
27 #include "pasteboard_error.h"
28 #include "pasteboard_hilog.h"
29 #include "pasteboard_observer_callback.h"
30 #include "permission_state_full.h"
31 #include "pixel_map.h"
32 #include "token_setproc.h"
33 #include <thread>
34 #include "uri.h"
35 #include "want.h"
36
37 namespace OHOS::MiscServices {
38 using namespace testing::ext;
39 using namespace OHOS::Media;
40 using namespace OHOS::Security::AccessToken;
41 constexpr const char *CMD = "hidumper -s 3701 -a --data";
42 constexpr const uint16_t EACH_LINE_LENGTH = 50;
43 constexpr const uint16_t TOTAL_LENGTH = 500;
44 std::string g_webviewPastedataTag = "WebviewPasteDataTag";
45 class PasteboardServiceTest : public testing::Test {
46 public:
47 static void SetUpTestCase(void);
48 static void TearDownTestCase(void);
49 void SetUp();
50 void TearDown();
51 static bool ExecuteCmd(std::string &result);
52
53 static void AllocTestTokenId();
54 static void DeleteTestTokenId();
55 static void SetTestTokenId();
56 static void RestoreSelfTokenId();
57 static void CommonTest(PasteData &oldPasteData, PasteData &newPasteData);
58 static sptr<PasteboardObserver> pasteboardObserver_;
59 static sptr<PasteboardObserver> pasteboardEventObserver_;
60 static std::atomic_bool pasteboardChangedFlag_;
61 static std::atomic_int32_t pasteboardEventStatus_;
62 static uint64_t selfTokenId_;
63 static AccessTokenID testTokenId_;
64 };
65 std::atomic_bool PasteboardServiceTest::pasteboardChangedFlag_ = false;
66 std::atomic_int32_t PasteboardServiceTest::pasteboardEventStatus_ = -1;
67 sptr<PasteboardObserver> PasteboardServiceTest::pasteboardObserver_ = nullptr;
68 sptr<PasteboardObserver> PasteboardServiceTest::pasteboardEventObserver_ = nullptr;
69 uint64_t PasteboardServiceTest::selfTokenId_ = 0;
70 AccessTokenID PasteboardServiceTest::testTokenId_ = 0;
71
SetUpTestCase(void)72 void PasteboardServiceTest::SetUpTestCase(void)
73 {
74 selfTokenId_ = GetSelfTokenID();
75 AllocTestTokenId();
76 }
77
TearDownTestCase(void)78 void PasteboardServiceTest::TearDownTestCase(void)
79 {
80 DeleteTestTokenId();
81 }
82
SetUp(void)83 void PasteboardServiceTest::SetUp(void)
84 {
85 }
86
TearDown(void)87 void PasteboardServiceTest::TearDown(void)
88 {
89 if (PasteboardServiceTest::pasteboardObserver_ != nullptr) {
90 PasteboardClient::GetInstance()->RemovePasteboardEventObserver(PasteboardServiceTest::pasteboardObserver_);
91 }
92 if (PasteboardServiceTest::pasteboardEventObserver_ != nullptr) {
93 PasteboardClient::GetInstance()->RemovePasteboardEventObserver(PasteboardServiceTest::pasteboardEventObserver_);
94 }
95 PasteboardClient::GetInstance()->Clear();
96 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_SERVICE, "TearDown.");
97 }
98
OnPasteboardChanged()99 void PasteboardObserverCallback::OnPasteboardChanged()
100 {
101 PasteboardServiceTest::pasteboardChangedFlag_ = true;
102 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_SERVICE, "test changed callback.");
103 }
104
OnPasteboardEvent(std::string bundleName,int32_t status)105 void PasteboardEventObserverCallback::OnPasteboardEvent(std::string bundleName, int32_t status)
106 {
107 PasteboardServiceTest::pasteboardEventStatus_ = status;
108 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_SERVICE, "test event callback bundleName: %{public}s,status:%{public}d",
109 bundleName.c_str(), status);
110 }
111
ExecuteCmd(std::string & result)112 bool PasteboardServiceTest::ExecuteCmd(std::string &result)
113 {
114 char buff[EACH_LINE_LENGTH] = { 0x00 };
115 char output[TOTAL_LENGTH] = { 0x00 };
116 FILE *ptr = nullptr;
117 if ((ptr = popen(CMD, "r")) != nullptr) {
118 while (fgets(buff, sizeof(buff), ptr) != nullptr) {
119 if (strcat_s(output, sizeof(output), buff) != 0) {
120 pclose(ptr);
121 ptr = nullptr;
122 return false;
123 }
124 }
125 pclose(ptr);
126 ptr = nullptr;
127 } else {
128 return false;
129 }
130 result = std::string(output);
131 return true;
132 }
133
AllocTestTokenId()134 void PasteboardServiceTest::AllocTestTokenId()
135 {
136 std::vector<int32_t> ids;
137 auto ret = AccountSA::OsAccountManager::QueryActiveOsAccountIds(ids);
138 if (ret != ERR_OK || ids.empty()) {
139 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "query active user failed errCode = %{public}d", ret);
140 return;
141 }
142 HapInfoParams infoParams = {
143 .userID = ids[0],
144 .bundleName = "ohos.privacy_test.pasteboard",
145 .instIndex = 0,
146 .appIDDesc = "privacy_test.pasteboard"
147 };
148 PermissionStateFull testState = {
149 .permissionName = "ohos.permission.DUMP",
150 .isGeneral = true,
151 .resDeviceID = { "local" },
152 .grantStatus = { PermissionState::PERMISSION_GRANTED },
153 .grantFlags = { 1 }
154 };
155 HapPolicyParams policyParams = {
156 .apl = APL_NORMAL,
157 .domain = "test.domain.pasteboard",
158 .permList = {},
159 .permStateList = { testState }
160 };
161
162 AccessTokenKit::AllocHapToken(infoParams, policyParams);
163 testTokenId_ = Security::AccessToken::AccessTokenKit::GetHapTokenID(
164 infoParams.userID, infoParams.bundleName, infoParams.instIndex);
165 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "userID = %{public}d, testTokenId = 0x%{public}x.", infoParams.userID,
166 testTokenId_);
167 }
168
DeleteTestTokenId()169 void PasteboardServiceTest::DeleteTestTokenId()
170 {
171 AccessTokenKit::DeleteToken(testTokenId_);
172 }
173
174
SetTestTokenId()175 void PasteboardServiceTest::SetTestTokenId()
176 {
177 auto ret = SetSelfTokenID(testTokenId_);
178 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "testTokenId = 0x%{public}x, ret = %{public}d!", testTokenId_, ret);
179 }
180
RestoreSelfTokenId()181 void PasteboardServiceTest::RestoreSelfTokenId()
182 {
183 auto ret = SetSelfTokenID(selfTokenId_);
184 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "ret = %{public}d!", ret);
185 }
186
CommonTest(PasteData & oldPasteData,PasteData & newPasteData)187 void PasteboardServiceTest::CommonTest(PasteData &oldPasteData, PasteData &newPasteData)
188 {
189 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "start.");
190 PasteboardClient::GetInstance()->Clear();
191 auto hasPasteData = PasteboardClient::GetInstance()->HasPasteData();
192 ASSERT_TRUE(hasPasteData != true);
193 int32_t ret = PasteboardClient::GetInstance()->SetPasteData(oldPasteData);
194 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
195 hasPasteData = PasteboardClient::GetInstance()->HasPasteData();
196 ASSERT_TRUE(hasPasteData == true);
197 ret = PasteboardClient::GetInstance()->GetPasteData(newPasteData);
198 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
199 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_SERVICE, "end.");
200 }
201
GetTime()202 string GetTime()
203 {
204 time_t curtime;
205 time(&curtime);
206 tm *nowtime = localtime(&curtime);
207 std::string targetTime = std::to_string(1900 + nowtime->tm_year) + "-" + std::to_string(1 + nowtime->tm_mon) + "-" +
208 std::to_string(nowtime->tm_mday) + " " + std::to_string(nowtime->tm_hour) + ":" +
209 std::to_string(nowtime->tm_min) + ":" + std::to_string(nowtime->tm_sec);
210 return targetTime;
211 }
212
213 /**
214 * @tc.name: PasteboardTest001
215 * @tc.desc: Create paste board test.
216 * @tc.type: FUNC
217 */
218 HWTEST_F(PasteboardServiceTest, PasteboardTest001, TestSize.Level0)
219 {
220 auto record = PasteboardClient::GetInstance()->CreatePlainTextRecord("paste record1");
221 ASSERT_TRUE(record != nullptr);
222 std::string plainText = "plain text";
223 auto data = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
224 ASSERT_TRUE(data != nullptr);
225 int32_t ret = PasteboardClient::GetInstance()->SetPasteData(*data);
226 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
227 auto has = PasteboardClient::GetInstance()->HasPasteData();
228 ASSERT_TRUE(has == true);
229 PasteData pasteData;
230 ret = PasteboardClient::GetInstance()->GetPasteData(pasteData);
231 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
232 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_SERVICE, "get.");
233 auto primaryText = pasteData.GetPrimaryText();
234 ASSERT_TRUE(primaryText != nullptr);
235 ASSERT_TRUE(*primaryText == plainText);
236 }
237
238 /**
239 * @tc.name: PasteRecordTest001
240 * @tc.desc: Create paste board record test.
241 * @tc.type: FUNC
242 */
243 HWTEST_F(PasteboardServiceTest, PasteRecordTest001, TestSize.Level0)
244 {
245 std::string plainText = "helloWorld";
246 auto record = PasteboardClient::GetInstance()->CreatePlainTextRecord(plainText);
247 ASSERT_TRUE(record != nullptr);
248 auto newPlainText = record->GetPlainText();
249 ASSERT_TRUE(newPlainText != nullptr);
250 ASSERT_TRUE(*newPlainText == plainText);
251 }
252
253 /**
254 * @tc.name: PasteRecordTest002
255 * @tc.desc: Create paste board record test.
256 * @tc.type: FUNC
257 */
258 HWTEST_F(PasteboardServiceTest, PasteRecordTest002, TestSize.Level0)
259 {
260 std::string htmlText = "<div class='disabled item tip user-programs'>";
261 auto record = PasteboardClient::GetInstance()->CreateHtmlTextRecord(htmlText);
262 ASSERT_TRUE(record != nullptr);
263 auto newHtmlText = record->GetHtmlText();
264 ASSERT_TRUE(newHtmlText != nullptr);
265 ASSERT_TRUE(*newHtmlText == htmlText);
266 }
267
268 /**
269 * @tc.name: PasteRecordTest003
270 * @tc.desc: Create paste board record test.
271 * @tc.type: FUNC
272 */
273 HWTEST_F(PasteboardServiceTest, PasteRecordTest003, TestSize.Level0)
274 {
275 using namespace OHOS::AAFwk;
276 std::shared_ptr<Want> want = std::make_shared<Want>();
277 std::string key = "id";
278 int32_t id = 456;
279 Want wantIn = want->SetParam(key, id);
280 auto record = PasteboardClient::GetInstance()->CreateWantRecord(want);
281 ASSERT_TRUE(record != nullptr);
282 auto newWant = record->GetWant();
283 ASSERT_TRUE(newWant != nullptr);
284 int32_t defaultValue = 333;
285 ASSERT_TRUE(newWant->GetIntParam(key, defaultValue) == id);
286 }
287
288 /**
289 * @tc.name: PasteRecordTest004
290 * @tc.desc: Create paste board record test.
291 * @tc.type: FUNC
292 */
293 HWTEST_F(PasteboardServiceTest, PasteRecordTest004, TestSize.Level0)
294 {
295 OHOS::Uri uri("uri");
296 auto record = PasteboardClient::GetInstance()->CreateUriRecord(uri);
297 ASSERT_TRUE(record != nullptr);
298 auto newUri = record->GetUri();
299 ASSERT_TRUE(newUri != nullptr);
300 ASSERT_TRUE(newUri->ToString() == uri.ToString());
301 }
302
303 /**
304 * @tc.name: PasteRecordTest005
305 * @tc.desc: Create paste board record test.
306 * @tc.type: FUNC
307 * @tc.require: AR000H5GKU
308 */
309 HWTEST_F(PasteboardServiceTest, PasteRecordTest005, TestSize.Level0)
310 {
311 uint32_t color[100] = { 3, 7, 9, 9, 7, 6 };
312 InitializationOptions opts = { { 5, 7 }, PixelFormat::ARGB_8888 };
313 std::unique_ptr<PixelMap> pixelMap = PixelMap::Create(color, 100, opts);
314 std::shared_ptr<PixelMap> pixelMapIn = move(pixelMap);
315 auto pasteDataRecord = PasteboardClient::GetInstance()->CreatePixelMapRecord(pixelMapIn);
316 ASSERT_TRUE(pasteDataRecord != nullptr);
317 auto newPixelMap = pasteDataRecord->GetPixelMap();
318 ASSERT_TRUE(newPixelMap != nullptr);
319 ImageInfo imageInfo = {};
320 newPixelMap->GetImageInfo(imageInfo);
321 ASSERT_TRUE(imageInfo.size.height == opts.size.height);
322 ASSERT_TRUE(imageInfo.size.width == opts.size.width);
323 ASSERT_TRUE(imageInfo.pixelFormat == opts.pixelFormat);
324 }
325
326 /**
327 * @tc.name: PasteRecordTest006
328 * @tc.desc: Create paste board record test.
329 * @tc.type: FUNC
330 * @tc.require: AR000H5GKU
331 */
332 HWTEST_F(PasteboardServiceTest, PasteRecordTest006, TestSize.Level0)
333 {
334 uint32_t color[100] = { 3, 7, 9, 9, 7, 6 };
335 InitializationOptions opts = { { 5, 7 }, PixelFormat::ARGB_8888 };
336 std::unique_ptr<PixelMap> pixelMap = PixelMap::Create(color, sizeof(color) / sizeof(color[0]), opts);
337 std::shared_ptr<PixelMap> pixelMapIn = move(pixelMap);
338 auto pasteDataRecord = PasteboardClient::GetInstance()->CreatePixelMapRecord(pixelMapIn);
339 ASSERT_TRUE(pasteDataRecord != nullptr);
340 InitializationOptions opts1 = { { 6, 9 }, PixelFormat::RGB_565 };
341 std::unique_ptr<PixelMap> pixelMap1 = PixelMap::Create(color, sizeof(color) / sizeof(color[0]), opts1);
342 std::shared_ptr<PixelMap> pixelMapIn1 = move(pixelMap1);
343 pasteDataRecord = pasteDataRecord->NewPixelMapRecord(pixelMapIn1);
344 ASSERT_TRUE(pasteDataRecord != nullptr);
345 auto newPixelMap = pasteDataRecord->GetPixelMap();
346 ASSERT_TRUE(newPixelMap != nullptr);
347 ImageInfo imageInfo = {};
348 newPixelMap->GetImageInfo(imageInfo);
349 ASSERT_TRUE(imageInfo.size.height == opts1.size.height);
350 ASSERT_TRUE(imageInfo.size.width == opts1.size.width);
351 ASSERT_TRUE(imageInfo.pixelFormat == opts1.pixelFormat);
352 }
353
354 /**
355 * @tc.name: PasteRecordTest007
356 * @tc.desc: Create paste board record test.
357 * @tc.type: FUNC
358 * @tc.require: AR000HEECD
359 */
360 HWTEST_F(PasteboardServiceTest, PasteRecordTest007, TestSize.Level0)
361 {
362 std::vector<uint8_t> arrayBuffer(46);
363 arrayBuffer = { 2, 7, 6, 8, 9 };
364 std::string mimeType = "image/jpg";
365 auto pasteDataRecord = PasteboardClient::GetInstance()->CreateKvRecord(mimeType, arrayBuffer);
366 ASSERT_TRUE(pasteDataRecord != nullptr);
367 auto customData = pasteDataRecord->GetCustomData();
368 ASSERT_TRUE(customData != nullptr);
369 auto itemData = customData->GetItemData();
370 ASSERT_TRUE(itemData.size() == 1);
371 auto item = itemData.find(mimeType);
372 ASSERT_TRUE(item != itemData.end());
373 ASSERT_TRUE(item->second == arrayBuffer);
374 }
375
376 /**
377 * @tc.name: PasteRecordTest008
378 * @tc.desc: Create paste board record test.
379 * @tc.type: FUNC
380 * @tc.require: AR000HEECD
381 */
382 HWTEST_F(PasteboardServiceTest, PasteRecordTest008, TestSize.Level0)
383 {
384 std::vector<uint8_t> arrayBuffer(46);
385 arrayBuffer = { 2, 7, 6, 8, 9 };
386 std::string mimeType = "image/jpg";
387 auto pasteDataRecord = PasteboardClient::GetInstance()->CreateKvRecord(mimeType, arrayBuffer);
388 ASSERT_TRUE(pasteDataRecord != nullptr);
389 std::string mimeType1 = "img/png";
390 std::vector<uint8_t> arrayBuffer1(46);
391 arrayBuffer1 = { 2, 7, 6, 8, 9 };
392 pasteDataRecord = pasteDataRecord->NewKvRecord(mimeType1, arrayBuffer1);
393 auto customData = pasteDataRecord->GetCustomData();
394 ASSERT_TRUE(customData != nullptr);
395 auto itemData = customData->GetItemData();
396 ASSERT_TRUE(itemData.size() == 1);
397 auto item = itemData.find(mimeType1);
398 ASSERT_TRUE(item != itemData.end());
399 ASSERT_TRUE(item->second == arrayBuffer1);
400 }
401
402 /**
403 * @tc.name: PasteRecordTest009
404 * @tc.desc: Create paste board html local url
405 * @tc.type: FUNC
406 */
407 HWTEST_F(PasteboardServiceTest, PasteRecordTest009, TestSize.Level0)
408 {
409 std::string htmlText =
410 "<div class='item'><img data-ohos='clipboard' "
411 "src='file:///com.example.webview/data/storage/el1/base/test.png'></div>";
412 auto data = PasteboardClient::GetInstance()->CreateHtmlData(htmlText);
413 ASSERT_TRUE(data != nullptr);
414 data->SetTag(g_webviewPastedataTag);
415 int32_t ret = PasteboardClient::GetInstance()->SetPasteData(*data);
416 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
417 auto has = PasteboardClient::GetInstance()->HasPasteData();
418 ASSERT_TRUE(has == true);
419 PasteData newPasteData;
420 ret = PasteboardClient::GetInstance()->GetPasteData(newPasteData);
421 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
422 auto record = newPasteData.GetPrimaryHtml();
423 ASSERT_TRUE(record != nullptr);
424 ASSERT_TRUE(*record == htmlText);
425 }
426
427 /**
428 * @tc.name: PasteRecordTest0010
429 * @tc.desc: Create paste board html distributed uri.
430 * @tc.type: FUNC
431 */
432 HWTEST_F(PasteboardServiceTest, PasteRecordTest0010, TestSize.Level0)
433 {
434 std::string htmlText =
435 "<div class='item'><img data-ohos='clipboard' "
436 "src='file://com.byy.testdpb/data/storage/el2/distributedfiles/"
437 ".remote_share/data/storage/el2/base/haps/entry/cache/t1.jpg'></div>";
438 auto data = PasteboardClient::GetInstance()->CreateHtmlData(htmlText);
439 ASSERT_TRUE(data != nullptr);
440 data->SetTag(g_webviewPastedataTag);
441 int32_t ret = PasteboardClient::GetInstance()->SetPasteData(*data);
442 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
443 auto has = PasteboardClient::GetInstance()->HasPasteData();
444 ASSERT_TRUE(has == true);
445 PasteData newPasteData2;
446 ret = PasteboardClient::GetInstance()->GetPasteData(newPasteData2);
447 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
448 auto record = newPasteData2.GetPrimaryHtml();
449 ASSERT_TRUE(record != nullptr);
450 ASSERT_TRUE(*record == htmlText);
451 }
452
453 /**
454 * @tc.name: PasteDataTest001
455 * @tc.desc: Create paste board data test.
456 * @tc.type: FUNC
457 */
458 HWTEST_F(PasteboardServiceTest, PasteDataTest001, TestSize.Level0)
459 {
460 using namespace OHOS::AAFwk;
461 std::shared_ptr<Want> want = std::make_shared<Want>();
462 std::string key = "id";
463 int32_t id = 456;
464 Want wantIn = want->SetParam(key, id);
465 auto data = PasteboardClient::GetInstance()->CreateWantData(std::make_shared<Want>(wantIn));
466 ASSERT_TRUE(data != nullptr);
467 PasteboardClient::GetInstance()->Clear();
468 auto has = PasteboardClient::GetInstance()->HasPasteData();
469 ASSERT_TRUE(has != true);
470 int32_t ret = PasteboardClient::GetInstance()->SetPasteData(*data);
471 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
472 has = PasteboardClient::GetInstance()->HasPasteData();
473 ASSERT_TRUE(has == true);
474 PasteData pasteData;
475 ret = PasteboardClient::GetInstance()->GetPasteData(pasteData);
476 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
477 auto record = pasteData.GetPrimaryWant();
478 ASSERT_TRUE(record != nullptr);
479 int32_t defaultValue = 333;
480 ASSERT_TRUE(record->GetIntParam(key, defaultValue) == id);
481 }
482
483 /**
484 * @tc.name: PasteDataTest002
485 * @tc.desc: Create paste board data test.
486 * @tc.type: FUNC
487 */
488 HWTEST_F(PasteboardServiceTest, PasteDataTest002, TestSize.Level0)
489 {
490 OHOS::Uri uri("uri");
491 auto data = PasteboardClient::GetInstance()->CreateUriData(uri);
492 ASSERT_TRUE(data != nullptr);
493 PasteboardClient::GetInstance()->Clear();
494 auto has = PasteboardClient::GetInstance()->HasPasteData();
495 ASSERT_TRUE(has != true);
496 int32_t ret = PasteboardClient::GetInstance()->SetPasteData(*data);
497 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
498 has = PasteboardClient::GetInstance()->HasPasteData();
499 ASSERT_TRUE(has == true);
500 PasteData pasteData;
501 ret = PasteboardClient::GetInstance()->GetPasteData(pasteData);
502 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
503 auto record = pasteData.GetPrimaryUri();
504 ASSERT_TRUE(record != nullptr);
505 ASSERT_TRUE(record->ToString() == uri.ToString());
506 }
507
508 /**
509 * @tc.name: PasteDataTest003
510 * @tc.desc: Create paste board data test.
511 * @tc.type: FUNC
512 */
513 HWTEST_F(PasteboardServiceTest, PasteDataTest003, TestSize.Level0)
514 {
515 std::string text = "plain text";
516 auto data = PasteboardClient::GetInstance()->CreatePlainTextData(text);
517 ASSERT_TRUE(data != nullptr);
518 PasteboardClient::GetInstance()->Clear();
519 auto has = PasteboardClient::GetInstance()->HasPasteData();
520 ASSERT_TRUE(has != true);
521 int32_t ret = PasteboardClient::GetInstance()->SetPasteData(*data);
522 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
523 has = PasteboardClient::GetInstance()->HasPasteData();
524 ASSERT_TRUE(has == true);
525 PasteData pasteData;
526 ret = PasteboardClient::GetInstance()->GetPasteData(pasteData);
527 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
528 auto record = pasteData.GetPrimaryText();
529 ASSERT_TRUE(record != nullptr);
530 ASSERT_TRUE(*record == text);
531 }
532
533 /**
534 * @tc.name: PasteDataTest004
535 * @tc.desc: Create paste board data test.
536 * @tc.type: FUNC
537 */
538 HWTEST_F(PasteboardServiceTest, PasteDataTest004, TestSize.Level0)
539 {
540 std::string htmlText = "<div class='disabled item tip user-programs'>";
541 auto data = PasteboardClient::GetInstance()->CreateHtmlData(htmlText);
542 ASSERT_TRUE(data != nullptr);
543 PasteboardClient::GetInstance()->Clear();
544 auto has = PasteboardClient::GetInstance()->HasPasteData();
545 ASSERT_TRUE(has != true);
546 int32_t ret = PasteboardClient::GetInstance()->SetPasteData(*data);
547 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
548 has = PasteboardClient::GetInstance()->HasPasteData();
549 ASSERT_TRUE(has == true);
550 PasteData pasteData;
551 ret = PasteboardClient::GetInstance()->GetPasteData(pasteData);
552 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
553 auto record = pasteData.GetPrimaryHtml();
554 ASSERT_TRUE(record != nullptr);
555 ASSERT_TRUE(*record == htmlText);
556 }
557
558 /**
559 * @tc.name: PasteDataTest005
560 * @tc.desc: CreateHtmlData test.
561 * @tc.type: FUNC
562 * @tc.require: AR000HEECD
563 */
564 HWTEST_F(PasteboardServiceTest, PasteDataTest005, TestSize.Level0)
565 {
566 std::string htmlText = "<div class='disabled item tip user-programs'>";
567 auto pasteData = PasteboardClient::GetInstance()->CreateHtmlData(htmlText);
568 ASSERT_TRUE(pasteData != nullptr);
569 std::string plainText = "plain text";
570 PasteDataRecord::Builder builder(MIMETYPE_TEXT_HTML);
571 std::string mimeType = MIMETYPE_TEXT_PLAIN;
572 std::vector<uint8_t> arrayBuffer(46);
573 arrayBuffer = { 2, 7, 6, 8, 9 };
574 std::string mimeType1 = "image/jpg";
575 std::shared_ptr<MineCustomData> customData = std::make_shared<MineCustomData>();
576 customData->AddItemData(mimeType1, arrayBuffer);
577 std::shared_ptr<PasteDataRecord> pasteDataRecord = builder.SetMimeType(mimeType)
578 .SetPlainText(std::make_shared<std::string>(plainText))
579 .SetHtmlText(std::make_shared<std::string>(htmlText))
580 .SetCustomData(customData)
581 .Build();
582 pasteData->AddRecord(pasteDataRecord);
583 PasteData newPasteData;
584 PasteboardServiceTest::CommonTest(*pasteData, newPasteData);
585 auto primaryHtml = newPasteData.GetPrimaryHtml();
586 ASSERT_TRUE(primaryHtml != nullptr);
587 ASSERT_TRUE(*primaryHtml == htmlText);
588 auto firstRecord = newPasteData.GetRecordAt(0);
589 ASSERT_TRUE(firstRecord != nullptr);
590 ASSERT_TRUE(firstRecord->GetMimeType() == mimeType);
591 auto newPlainText = firstRecord->GetPlainText();
592 ASSERT_TRUE(newPlainText != nullptr);
593 ASSERT_TRUE(*newPlainText == plainText);
594 auto newHtmlText = firstRecord->GetHtmlText();
595 ASSERT_TRUE(newHtmlText != nullptr);
596 ASSERT_TRUE(*newHtmlText == htmlText);
597 customData = pasteDataRecord->GetCustomData();
598 ASSERT_TRUE(customData != nullptr);
599 auto itemData = customData->GetItemData();
600 ASSERT_TRUE(itemData.size() == 1);
601 auto item = itemData.find(mimeType1);
602 ASSERT_TRUE(item != itemData.end());
603 ASSERT_TRUE(item->second == arrayBuffer);
604 }
605
606 /**
607 * @tc.name: PasteDataTest006
608 * @tc.desc: CreatePlainTextData test.
609 * @tc.type: FUNC
610 */
611 HWTEST_F(PasteboardServiceTest, PasteDataTest006, TestSize.Level0)
612 {
613 using namespace OHOS::AAFwk;
614 std::string plainText = "helloWorld";
615 auto pasteData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
616 ASSERT_TRUE(pasteData != nullptr);
617 std::shared_ptr<Want> want = std::make_shared<Want>();
618 std::string key = "id";
619 int32_t id = 456;
620 Want wantIn = want->SetParam(key, id);
621 PasteDataRecord::Builder builder(MIMETYPE_TEXT_WANT);
622 std::shared_ptr<PasteDataRecord> pasteDataRecord =
623 builder.SetWant(std::make_shared<Want>(wantIn)).SetPlainText(std::make_shared<std::string>(plainText)).Build();
624 pasteData->AddRecord(pasteDataRecord);
625 PasteData newPasteData;
626 PasteboardServiceTest::CommonTest(*pasteData, newPasteData);
627 auto firstRecord = newPasteData.GetRecordAt(0);
628 ASSERT_TRUE(firstRecord != nullptr);
629 ASSERT_TRUE(firstRecord->GetMimeType() == MIMETYPE_TEXT_WANT);
630 auto newWant = firstRecord->GetWant();
631 ASSERT_TRUE(newWant != nullptr);
632 int32_t defaultValue = 333;
633 ASSERT_TRUE(newWant->GetIntParam(key, defaultValue) == id);
634 auto newPlainText = firstRecord->GetPlainText();
635 ASSERT_TRUE(newPlainText != nullptr);
636 ASSERT_TRUE(*newPlainText == plainText);
637 }
638
639 /**
640 * @tc.name: PasteDataTest007
641 * @tc.desc: PixelMap test.
642 * @tc.type: FUNC
643 * @tc.require: AR000H5GKU
644 */
645 HWTEST_F(PasteboardServiceTest, PasteDataTest007, TestSize.Level0)
646 {
647 std::string htmlText = "<div class='disabled item tip user-programs'>";
648 auto pasteData = PasteboardClient::GetInstance()->CreateHtmlData(htmlText);
649 ASSERT_TRUE(pasteData != nullptr);
650 OHOS::Uri uri("uri");
651 uint32_t color[100] = { 3, 7, 9, 9, 7, 6 };
652 InitializationOptions opts = { { 5, 7 }, PixelFormat::ARGB_8888 };
653 std::unique_ptr<PixelMap> pixelMap = PixelMap::Create(color, sizeof(color) / sizeof(color[0]), opts);
654 std::shared_ptr<PixelMap> pixelMapIn = move(pixelMap);
655 PasteDataRecord::Builder builder(MIMETYPE_TEXT_URI);
656 std::shared_ptr<PasteDataRecord> pasteDataRecord =
657 builder.SetUri(std::make_shared<OHOS::Uri>(uri)).SetPixelMap(pixelMapIn).Build();
658 pasteData->AddRecord(pasteDataRecord);
659 PasteData newPasteData;
660 PasteboardServiceTest::CommonTest(*pasteData, newPasteData);
661 auto firstRecord = newPasteData.GetRecordAt(0);
662 ASSERT_TRUE(firstRecord != nullptr);
663 ASSERT_TRUE(firstRecord->GetMimeType() == MIMETYPE_TEXT_URI);
664 auto newUri = firstRecord->GetUri();
665 ASSERT_TRUE(newUri != nullptr);
666 ASSERT_TRUE(newUri->ToString() == uri.ToString());
667 auto newPixelMap = firstRecord->GetPixelMap();
668 ASSERT_TRUE(newPixelMap != nullptr);
669 ImageInfo imageInfo = {};
670 newPixelMap->GetImageInfo(imageInfo);
671 ASSERT_TRUE(imageInfo.size.height == opts.size.height);
672 ASSERT_TRUE(imageInfo.size.width == opts.size.width);
673 ASSERT_TRUE(imageInfo.pixelFormat == opts.pixelFormat);
674 }
675
676 /**
677 * @tc.name: PasteDataTest008
678 * @tc.desc: Create paste board data test.
679 * @tc.type: FUNC
680 * @tc.require: AR000H5GKU
681 */
682 HWTEST_F(PasteboardServiceTest, PasteDataTest008, TestSize.Level0)
683 {
684 uint32_t color[100] = { 3, 7, 9, 9, 7, 6 };
685 InitializationOptions opts = { { 5, 7 }, PixelFormat::ARGB_8888 };
686 std::unique_ptr<PixelMap> pixelMap = PixelMap::Create(color, sizeof(color) / sizeof(color[0]), opts);
687 std::shared_ptr<PixelMap> pixelMapIn = move(pixelMap);
688 auto pasteData = PasteboardClient::GetInstance()->CreatePixelMapData(pixelMapIn);
689 ASSERT_TRUE(pasteData != nullptr);
690 PasteData newPasteData;
691 PasteboardServiceTest::CommonTest(*pasteData, newPasteData);
692 auto primaryPixelMap = newPasteData.GetPrimaryPixelMap();
693 ASSERT_TRUE(primaryPixelMap != nullptr);
694 ImageInfo imageInfo = {};
695 primaryPixelMap->GetImageInfo(imageInfo);
696 ASSERT_TRUE(imageInfo.size.height == opts.size.height);
697 ASSERT_TRUE(imageInfo.size.width == opts.size.width);
698 ASSERT_TRUE(imageInfo.pixelFormat == opts.pixelFormat);
699 }
700
701 /**
702 * @tc.name: PasteDataTest009
703 * @tc.desc: Create paste board data test.
704 * @tc.type: FUNC
705 * @tc.require: AR000H5GKU
706 */
707 HWTEST_F(PasteboardServiceTest, PasteDataTest009, TestSize.Level0)
708 {
709 std::string plainText = "plain text";
710 auto pasteData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
711 ASSERT_TRUE(pasteData != nullptr);
712 uint32_t color[100] = { 3, 7, 9, 9, 7, 6 };
713 InitializationOptions opts = { { 5, 7 }, PixelFormat::ARGB_8888 };
714 std::unique_ptr<PixelMap> pixelMap = PixelMap::Create(color, sizeof(color) / sizeof(color[0]), opts);
715 std::shared_ptr<PixelMap> pixelMapIn = move(pixelMap);
716 pasteData->AddPixelMapRecord(pixelMapIn);
717 PasteData newPasteData;
718 PasteboardServiceTest::CommonTest(*pasteData, newPasteData);
719 auto primaryPlainText = newPasteData.GetPrimaryText();
720 ASSERT_TRUE(primaryPlainText != nullptr);
721 ASSERT_TRUE(*primaryPlainText == plainText);
722 auto primaryPixelMap = newPasteData.GetPrimaryPixelMap();
723 ASSERT_TRUE(primaryPixelMap != nullptr);
724 ImageInfo imageInfo = {};
725 primaryPixelMap->GetImageInfo(imageInfo);
726 ASSERT_TRUE(imageInfo.size.height == opts.size.height);
727 ASSERT_TRUE(imageInfo.size.width == opts.size.width);
728 ASSERT_TRUE(imageInfo.pixelFormat == opts.pixelFormat);
729 }
730
731 /**
732 * @tc.name: PasteDataTest0010
733 * @tc.desc: Create paste board data test.
734 * @tc.type: FUNC
735 * @tc.require: AR000HEECD
736 */
737 HWTEST_F(PasteboardServiceTest, PasteDataTest0010, TestSize.Level0)
738 {
739 std::vector<uint8_t> arrayBuffer(46);
740 arrayBuffer = { 2, 7, 6, 8, 9 };
741 std::string mimeType = "image/jpg";
742 auto pasteData = PasteboardClient::GetInstance()->CreateKvData(mimeType, arrayBuffer);
743 ASSERT_TRUE(pasteData != nullptr);
744 PasteData newPasteData;
745 PasteboardServiceTest::CommonTest(*pasteData, newPasteData);
746 auto firstRecord = newPasteData.GetRecordAt(0);
747 auto customData = firstRecord->GetCustomData();
748 ASSERT_TRUE(customData != nullptr);
749 auto itemData = customData->GetItemData();
750 ASSERT_TRUE(itemData.size() == 1);
751 auto item = itemData.find(mimeType);
752 ASSERT_TRUE(item != itemData.end());
753 ASSERT_TRUE(item->second == arrayBuffer);
754 }
755
756 /**
757 * @tc.name: PasteDataTest0011
758 * @tc.desc: Create paste board data test.
759 * @tc.type: FUNC
760 * @tc.require: AR000HEECD
761 */
762 HWTEST_F(PasteboardServiceTest, PasteDataTest0011, TestSize.Level0)
763 {
764 std::string plainText = "plain text";
765 auto pasteData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
766 ASSERT_TRUE(pasteData != nullptr);
767 std::vector<uint8_t> arrayBuffer(46);
768 arrayBuffer = { 2, 7, 6, 8, 9 };
769 std::string mimeType = "image/jpg";
770 pasteData->AddKvRecord(mimeType, arrayBuffer);
771 PasteData newPasteData;
772 PasteboardServiceTest::CommonTest(*pasteData, newPasteData);
773 auto firstRecord = newPasteData.GetRecordAt(0);
774 auto customData = firstRecord->GetCustomData();
775 ASSERT_TRUE(customData != nullptr);
776 auto itemData = customData->GetItemData();
777 ASSERT_TRUE(itemData.size() == 1);
778 auto item = itemData.find(mimeType);
779 ASSERT_TRUE(item != itemData.end());
780 ASSERT_TRUE(item->second == arrayBuffer);
781 auto primaryPlainText = newPasteData.GetPrimaryText();
782 ASSERT_TRUE(primaryPlainText != nullptr);
783 ASSERT_TRUE(*primaryPlainText == plainText);
784 }
785
786 /**
787 * @tc.name: PasteDataTest0012
788 * @tc.desc: Create paste board data test.
789 * @tc.type: FUNC
790 * @tc.require: AR000HEECD
791 */
792 HWTEST_F(PasteboardServiceTest, PasteDataTest0012, TestSize.Level0)
793 {
794 std::string plainText = "plain text";
795 auto pasteData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
796 ASSERT_TRUE(pasteData != nullptr);
797 std::vector<uint8_t> arrayBuffer(46);
798 arrayBuffer = { 2, 7, 6, 8, 9 };
799 std::string mimeType = "image/jpg";
800 pasteData->AddKvRecord(mimeType, arrayBuffer);
801 auto record = pasteData->GetRecordAt(0);
802 ASSERT_TRUE(record != nullptr);
803 std::string mimeType1 = "img/png";
804 std::vector<uint8_t> arrayBuffer1(54);
805 arrayBuffer1 = { 4, 7, 9, 8, 7 };
806 auto customData = record->GetCustomData();
807 ASSERT_TRUE(customData != nullptr);
808 customData->AddItemData(mimeType1, arrayBuffer1);
809 PasteData newPasteData;
810 PasteboardServiceTest::CommonTest(*pasteData, newPasteData);
811 auto firstRecord = newPasteData.GetRecordAt(0);
812 ASSERT_TRUE(firstRecord != nullptr);
813 customData = firstRecord->GetCustomData();
814 ASSERT_TRUE(customData != nullptr);
815 auto itemData = customData->GetItemData();
816 ASSERT_TRUE(itemData.size() == 2);
817 auto item = itemData.find(mimeType);
818 ASSERT_TRUE(item != itemData.end());
819 ASSERT_TRUE(item->second == arrayBuffer);
820 item = itemData.find(mimeType1);
821 ASSERT_TRUE(item != itemData.end());
822 ASSERT_TRUE(item->second == arrayBuffer1);
823 auto primaryPlainText = newPasteData.GetPrimaryText();
824 ASSERT_TRUE(primaryPlainText != nullptr);
825 ASSERT_TRUE(*primaryPlainText == plainText);
826 auto secondRecord = newPasteData.GetRecordAt(1);
827 ASSERT_TRUE(secondRecord != nullptr);
828 auto secondRecordMimeType = secondRecord->GetMimeType();
829 ASSERT_TRUE(secondRecordMimeType == MIMETYPE_TEXT_PLAIN);
830 }
831
832 /**
833 * @tc.name: PasteDataTest0014
834 * @tc.desc: Create paste board data test.
835 * @tc.type: FUNC
836 * @tc.require: AROOOH5R5G
837 */
838 HWTEST_F(PasteboardServiceTest, PasteDataTest0014, TestSize.Level0)
839 {
840 std::string plainText = "plain text";
841 auto pasteData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
842 ASSERT_TRUE(pasteData != nullptr);
843 auto shareOption = pasteData->GetShareOption();
844 ASSERT_TRUE(shareOption == ShareOption::CrossDevice);
845 pasteData->SetShareOption(ShareOption::InApp);
846 auto tokenId = pasteData->GetTokenId();
847 ASSERT_TRUE(tokenId == 0);
848 pasteData->SetTokenId(1);
849 PasteData newPasteData;
850 PasteboardServiceTest::CommonTest(*pasteData, newPasteData);
851 shareOption = newPasteData.GetShareOption();
852 ASSERT_TRUE(shareOption == ShareOption::InApp);
853 tokenId = pasteData->GetTokenId();
854 ASSERT_TRUE(tokenId != 0);
855 }
856
857 /**
858 * @tc.name: PasteDataTest0015
859 * @tc.desc: isLocalPaste and isDraggedData test.
860 * @tc.type: FUNC
861 * @tc.require: AROOOH5R5G
862 */
863 HWTEST_F(PasteboardServiceTest, PasteDataTest0015, TestSize.Level0)
864 {
865 std::string plainText = "plain text";
866 auto pasteData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
867 ASSERT_TRUE(pasteData != nullptr);
868 auto isDraggedData = pasteData->IsDraggedData();
869 ASSERT_FALSE(isDraggedData);
870 pasteData->SetDraggedDataFlag(true);
871 auto isLocalPaste = pasteData->IsLocalPaste();
872 ASSERT_FALSE(isLocalPaste);
873 pasteData->SetLocalPasteFlag(true);
874 isLocalPaste = pasteData->IsLocalPaste();
875 ASSERT_TRUE(isLocalPaste);
876 pasteData->SetLocalPasteFlag(false);
877 isLocalPaste = pasteData->IsLocalPaste();
878 ASSERT_FALSE(isLocalPaste);
879 PasteboardClient::GetInstance()->Clear();
880 auto hasPasteData = PasteboardClient::GetInstance()->HasPasteData();
881 ASSERT_FALSE(hasPasteData);
882 int32_t ret = PasteboardClient::GetInstance()->SetPasteData(*pasteData);
883 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
884 hasPasteData = PasteboardClient::GetInstance()->HasPasteData();
885 ASSERT_TRUE(hasPasteData);
886 PasteData newPasteData;
887 ret = PasteboardClient::GetInstance()->GetPasteData(newPasteData);
888 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
889 isDraggedData = newPasteData.IsDraggedData();
890 ASSERT_TRUE(isDraggedData);
891 isLocalPaste = newPasteData.IsLocalPaste();
892 ASSERT_TRUE(isLocalPaste);
893 }
894
895 /**
896 * @tc.name: PasteDataTest0016
897 * @tc.desc: RemoveRecordAt HasMimeType test.
898 * @tc.type: FUNC
899 * @tc.require: AROOOH5R5G
900 */
901 HWTEST_F(PasteboardServiceTest, PasteDataTest0016, TestSize.Level0)
902 {
903 std::string plainText = "plain text";
904 auto pasteData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
905 ASSERT_TRUE(pasteData != nullptr);
906 std::vector<uint8_t> arrayBuffer(46);
907 arrayBuffer = { 2, 7, 6, 8, 9 };
908 std::string mimeType = "image/jpg";
909 pasteData->AddKvRecord(mimeType, arrayBuffer);
910 pasteData->RemoveRecordAt(1);
911 PasteboardClient::GetInstance()->Clear();
912 auto hasPasteData = PasteboardClient::GetInstance()->HasPasteData();
913 ASSERT_FALSE(hasPasteData);
914 int32_t ret = PasteboardClient::GetInstance()->SetPasteData(*pasteData);
915 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
916 hasPasteData = PasteboardClient::GetInstance()->HasPasteData();
917 ASSERT_TRUE(hasPasteData);
918 PasteData newPasteData;
919 ret = PasteboardClient::GetInstance()->GetPasteData(newPasteData);
920 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
921 ASSERT_TRUE(newPasteData.HasMimeType(mimeType));
922 ASSERT_TRUE(newPasteData.GetRecordCount() == 1);
923 auto record = newPasteData.GetRecordAt(0);
924 ASSERT_TRUE(record != nullptr);
925 auto customData = record->GetCustomData();
926 ASSERT_TRUE(customData != nullptr);
927 auto itemData = customData->GetItemData();
928 ASSERT_EQ(itemData.size(), 1);
929 auto item = itemData.find(mimeType);
930 ASSERT_TRUE(item != itemData.end());
931 EXPECT_EQ(item->second, arrayBuffer);
932 }
933
934 /**
935 * @tc.name: PasteDataTest0017
936 * @tc.desc: ReplaceRecordAt GetProperty GetTag test.
937 * @tc.type: FUNC
938 * @tc.require: AROOOH5R5G
939 */
940 HWTEST_F(PasteboardServiceTest, PasteDataTest0017, TestSize.Level0)
941 {
942 uint32_t color[100] = { 3, 7, 9, 9, 7, 6 };
943 InitializationOptions opts = { { 5, 7 }, PixelFormat::ARGB_8888 };
944 std::unique_ptr<PixelMap> pixelMap = PixelMap::Create(color, sizeof(color) / sizeof(color[0]), opts);
945 std::shared_ptr<PixelMap> pixelMapIn = move(pixelMap);
946 auto pasteData = PasteboardClient::GetInstance()->CreatePixelMapData(pixelMapIn);
947 ASSERT_TRUE(pasteData != nullptr);
948 auto pixelMap1 = pasteData->GetPrimaryPixelMap();
949 ASSERT_TRUE(pixelMap1 != nullptr);
950 ImageInfo imageInfo = {};
951 pixelMap1->GetImageInfo(imageInfo);
952 ASSERT_EQ(imageInfo.size.height, opts.size.height);
953 ASSERT_EQ(imageInfo.size.width, opts.size.width);
954 ASSERT_EQ(imageInfo.pixelFormat, opts.pixelFormat);
955 std::string plainText = "plain text";
956 auto record = PasteboardClient::GetInstance()->CreatePlainTextRecord(plainText);
957 ASSERT_TRUE(record != nullptr);
958 ASSERT_TRUE(pasteData->ReplaceRecordAt(0, record));
959 PasteboardClient::GetInstance()->Clear();
960 auto hasPasteData = PasteboardClient::GetInstance()->HasPasteData();
961 ASSERT_FALSE(hasPasteData);
962 int32_t ret = PasteboardClient::GetInstance()->SetPasteData(*pasteData);
963 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
964 hasPasteData = PasteboardClient::GetInstance()->HasPasteData();
965 ASSERT_TRUE(hasPasteData);
966 PasteData newPasteData;
967 ret = PasteboardClient::GetInstance()->GetPasteData(newPasteData);
968 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
969 ASSERT_EQ(newPasteData.GetRecordCount(), 1);
970 auto record1 = newPasteData.GetRecordAt(0);
971 ASSERT_TRUE(record1 != nullptr);
972 auto plainText1 = record1->GetPlainText();
973 ASSERT_TRUE(plainText1 != nullptr);
974 EXPECT_EQ(*plainText1, plainText);
975 auto property = newPasteData.GetProperty();
976 EXPECT_TRUE(property.additions.IsEmpty());
977 EXPECT_EQ(property.mimeTypes.size(), 1);
978 EXPECT_EQ(property.mimeTypes[0], MIMETYPE_TEXT_PLAIN);
979 EXPECT_TRUE(property.tag.empty());
980 EXPECT_EQ(property.shareOption, ShareOption::CrossDevice);
981 EXPECT_TRUE(property.tokenId != 0);
982 auto tag = newPasteData.GetTag();
983 EXPECT_TRUE(tag.empty());
984 }
985
986 /**
987 * @tc.name: PasteDataTest0018
988 * @tc.desc: AddPasteboardChangedObserver RemovePasteboardChangedObserver OnRemoteDied OnRemoteSaDied test.
989 * @tc.type: FUNC
990 * @tc.require: AROOOH5R5G
991 */
992 HWTEST_F(PasteboardServiceTest, PasteDataTest0018, TestSize.Level0)
993 {
994 PasteboardClient::GetInstance()->RemovePasteboardChangedObserver(nullptr);
995 if (PasteboardServiceTest::pasteboardObserver_ == nullptr) {
996 PasteboardServiceTest::pasteboardObserver_ = new PasteboardObserverCallback();
997 }
998 PasteboardServiceTest::pasteboardChangedFlag_ = false;
999 ASSERT_TRUE(PasteboardServiceTest::pasteboardObserver_ != nullptr);
1000 PasteboardClient::GetInstance()->AddPasteboardChangedObserver(PasteboardServiceTest::pasteboardObserver_);
1001 ASSERT_FALSE(PasteboardServiceTest::pasteboardChangedFlag_);
1002 const wptr<IRemoteObject> object;
1003 PasteboardSaDeathRecipient death;
1004 death.OnRemoteDied(object);
1005 PasteboardClient::GetInstance()->OnRemoteSaDied(object);
1006 uint32_t color[100] = { 3, 7, 9, 9, 7, 6 };
1007 InitializationOptions opts = { { 5, 7 }, PixelFormat::ARGB_8888 };
1008 std::unique_ptr<PixelMap> pixelMap = PixelMap::Create(color, sizeof(color) / sizeof(color[0]), opts);
1009 std::shared_ptr<PixelMap> pixelMapIn = move(pixelMap);
1010 auto pasteData = PasteboardClient::GetInstance()->CreatePixelMapData(pixelMapIn);
1011 ASSERT_TRUE(pasteData != nullptr);
1012 PasteboardClient::GetInstance()->Clear();
1013 std::this_thread::sleep_for(std::chrono::milliseconds(5));
1014 ASSERT_FALSE(PasteboardServiceTest::pasteboardChangedFlag_);
1015 auto hasPasteData = PasteboardClient::GetInstance()->HasPasteData();
1016 ASSERT_FALSE(hasPasteData);
1017 int32_t ret = PasteboardClient::GetInstance()->SetPasteData(*pasteData);
1018 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
1019 std::this_thread::sleep_for(std::chrono::milliseconds(5));
1020 ASSERT_TRUE(PasteboardServiceTest::pasteboardChangedFlag_);
1021 hasPasteData = PasteboardClient::GetInstance()->HasPasteData();
1022 ASSERT_TRUE(hasPasteData);
1023 PasteData newPasteData;
1024 ret = PasteboardClient::GetInstance()->GetPasteData(newPasteData);
1025 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
1026 PasteboardServiceTest::pasteboardChangedFlag_ = false;
1027 PasteboardClient::GetInstance()->RemovePasteboardChangedObserver(PasteboardServiceTest::pasteboardObserver_);
1028 PasteboardClient::GetInstance()->Clear();
1029 ASSERT_FALSE(PasteboardServiceTest::pasteboardChangedFlag_);
1030 hasPasteData = PasteboardClient::GetInstance()->HasPasteData();
1031 ASSERT_FALSE(hasPasteData);
1032 PasteboardClient::GetInstance()->SetPasteData(*pasteData);
1033 std::this_thread::sleep_for(std::chrono::milliseconds(5));
1034 ASSERT_FALSE(PasteboardServiceTest::pasteboardChangedFlag_);
1035 hasPasteData = PasteboardClient::GetInstance()->HasPasteData();
1036 ASSERT_TRUE(hasPasteData);
1037 }
1038
1039
1040 /**
1041 * @tc.name: PasteDataTest0019
1042 * @tc.desc: AddPasteboardEventObserver RemovePasteboardEventObserver test.
1043 * @tc.type: FUNC
1044 * @tc.require: AROOOH5R5G
1045 */
1046 HWTEST_F(PasteboardServiceTest, PasteDataTest0019, TestSize.Level0)
1047 {
1048 PasteboardClient::GetInstance()->RemovePasteboardEventObserver(nullptr);
1049 if (PasteboardServiceTest::pasteboardEventObserver_ == nullptr) {
1050 PasteboardServiceTest::pasteboardEventObserver_ = new PasteboardEventObserverCallback();
1051 }
1052 PasteboardServiceTest::pasteboardEventStatus_ = -1;
1053 ASSERT_TRUE(PasteboardServiceTest::pasteboardEventObserver_ != nullptr);
1054 PasteboardClient::GetInstance()->AddPasteboardEventObserver(PasteboardServiceTest::pasteboardEventObserver_);
1055 ASSERT_EQ(PasteboardServiceTest::pasteboardEventStatus_, -1);
1056 auto pasteData = PasteboardClient::GetInstance()->CreatePlainTextData("hello");
1057 ASSERT_TRUE(pasteData != nullptr);
1058 PasteboardClient::GetInstance()->Clear();
1059 ASSERT_EQ(PasteboardServiceTest::pasteboardEventStatus_, -1);
1060 auto hasPasteData = PasteboardClient::GetInstance()->HasPasteData();
1061 ASSERT_FALSE(hasPasteData);
1062 int32_t ret = PasteboardClient::GetInstance()->SetPasteData(*pasteData);
1063 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
1064 std::this_thread::sleep_for(std::chrono::milliseconds(5));
1065 ASSERT_EQ(PasteboardServiceTest::pasteboardEventStatus_,
1066 static_cast<int32_t>(PasteboardEventStatus::PASTEBOARD_WRITE));
1067 hasPasteData = PasteboardClient::GetInstance()->HasPasteData();
1068 ASSERT_TRUE(hasPasteData);
1069 PasteData newPasteData;
1070 ret = PasteboardClient::GetInstance()->GetPasteData(newPasteData);
1071 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
1072 std::this_thread::sleep_for(std::chrono::milliseconds(5));
1073 ASSERT_EQ(PasteboardServiceTest::pasteboardEventStatus_,
1074 static_cast<int32_t>(PasteboardEventStatus::PASTEBOARD_READ));
1075 PasteboardClient::GetInstance()->Clear();
1076 std::this_thread::sleep_for(std::chrono::milliseconds(5));
1077 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
1078 ASSERT_EQ(PasteboardServiceTest::pasteboardEventStatus_,
1079 static_cast<int32_t>(PasteboardEventStatus::PASTEBOARD_CLEAR));
1080 PasteboardServiceTest::pasteboardEventStatus_ = -1;
1081 PasteboardClient::GetInstance()->RemovePasteboardEventObserver(PasteboardServiceTest::pasteboardEventObserver_);
1082 PasteboardClient::GetInstance()->Clear();
1083 std::this_thread::sleep_for(std::chrono::milliseconds(5));
1084 ASSERT_EQ(PasteboardServiceTest::pasteboardEventStatus_, -1);
1085 PasteboardClient::GetInstance()->SetPasteData(*pasteData);
1086 ASSERT_EQ(PasteboardServiceTest::pasteboardEventStatus_, -1);
1087 }
1088
1089 /**
1090 * @tc.name: PasteDataTest0020
1091 * @tc.desc: Create paste board test set bundleName and time.
1092 * @tc.type: FUNC
1093 */
1094 HWTEST_F(PasteboardServiceTest, PasteDataTest0020, TestSize.Level0)
1095 {
1096 std::string text = "plain text";
1097 auto pasteData = PasteboardClient::GetInstance()->CreatePlainTextData(text);
1098 ASSERT_TRUE(pasteData != nullptr);
1099 std::string bundleName = "ohos.acts.distributeddatamgr.pasteboard";
1100 pasteData->SetBundleName(bundleName);
1101 std::string time = GetTime();
1102 pasteData->SetTime(time);
1103 int32_t ret = PasteboardClient::GetInstance()->SetPasteData(*pasteData);
1104 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
1105 auto has = PasteboardClient::GetInstance()->HasPasteData();
1106 ASSERT_TRUE(has == true);
1107 }
1108
1109 /**
1110 * @tc.name: PasteDataTest0021
1111 * @tc.desc: AddPasteboardEventObserver RemovePasteboardEventObserver test.
1112 * @tc.type: FUNC
1113 */
1114 HWTEST_F(PasteboardServiceTest, PasteDataTest0021, TestSize.Level0)
1115 {
1116 PasteboardClient::GetInstance()->AddPasteboardEventObserver(new PasteboardEventObserverCallback());
1117 PasteboardClient::GetInstance()->AddPasteboardEventObserver(new PasteboardEventObserverCallback());
1118 PasteboardClient::GetInstance()->AddPasteboardEventObserver(new PasteboardEventObserverCallback());
1119 auto pasteData = PasteboardClient::GetInstance()->CreatePlainTextData("hello");
1120 ASSERT_TRUE(pasteData != nullptr);
1121 int32_t ret = PasteboardClient::GetInstance()->SetPasteData(*pasteData);
1122 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
1123 auto hasData = PasteboardClient::GetInstance()->HasPasteData();
1124 ASSERT_TRUE(hasData == true);
1125 PasteData newPasteData;
1126 PasteboardClient::GetInstance()->GetPasteData(newPasteData);
1127 PasteboardClient::GetInstance()->Clear();
1128 std::this_thread::sleep_for(std::chrono::milliseconds(5));
1129 PasteboardClient::GetInstance()->RemovePasteboardEventObserver(nullptr);
1130 hasData = PasteboardClient::GetInstance()->HasPasteData();
1131 ASSERT_TRUE(hasData == false);
1132 }
1133
1134 /**
1135 * @tc.name: BigPixelMap001
1136 * @tc.desc: paste big pixel map image
1137 * @tc.type: FUNC
1138 * @tc.require:AR000H5I1D
1139 * @tc.author: baoyayong
1140 */
1141 HWTEST_F(PasteboardServiceTest, BigPixelMap001, TestSize.Level1)
1142 {
1143 constexpr uint32_t COLOR_SIZE = 1024 * 1960;
1144 auto color = std::make_unique<uint32_t[]>(COLOR_SIZE);
1145 InitializationOptions opts = { { 1024, 1960 }, PixelFormat::ARGB_8888 };
1146 std::unique_ptr<PixelMap> pixelMap = PixelMap::Create(color.get(), COLOR_SIZE, opts);
1147 auto pasteData1 = PasteboardClient::GetInstance()->CreatePixelMapData(std::move(pixelMap));
1148 PasteboardClient::GetInstance()->Clear();
1149 auto hasPasteData = PasteboardClient::GetInstance()->HasPasteData();
1150 ASSERT_FALSE(hasPasteData);
1151 int32_t ret = PasteboardClient::GetInstance()->SetPasteData(*pasteData1);
1152 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
1153 hasPasteData = PasteboardClient::GetInstance()->HasPasteData();
1154 ASSERT_TRUE(hasPasteData);
1155 PasteData pasteData2;
1156 ret = PasteboardClient::GetInstance()->GetPasteData(pasteData2);
1157 ASSERT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
1158 auto pixelMap2 = pasteData2.GetPrimaryPixelMap();
1159 ASSERT_TRUE(pixelMap2 != nullptr);
1160 ImageInfo imageInfo{};
1161 pixelMap2->GetImageInfo(imageInfo);
1162 EXPECT_TRUE(imageInfo.size.height == opts.size.height);
1163 EXPECT_TRUE(imageInfo.size.width == opts.size.width);
1164 EXPECT_TRUE(imageInfo.pixelFormat == opts.pixelFormat);
1165 }
1166
1167 /**
1168 * @tc.name: GetPastedataFail001
1169 * @tc.desc: get paste data fail - SetValue()
1170 * @tc.type: FUNC
1171 * @tc.require: issuesI5WPTM
1172 * @tc.author: chenyu
1173 */
1174 HWTEST_F(PasteboardServiceTest, GetPastedataFail001, TestSize.Level1)
1175 {
1176 PasteboardClient::GetInstance()->Clear();
1177 PasteData data;
1178 auto ret = PasteboardClient::GetInstance()->GetPasteData(data);
1179 EXPECT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_ERROR));
1180 }
1181
1182 /**
1183 * @tc.name: DumpDataTest001
1184 * @tc.desc: DumpData()-remote, CrossDevice
1185 * @tc.type: FUNC
1186 * @tc.require: issueshI5YDEV
1187 * @tc.author: chenyu
1188 */
1189 HWTEST_F(PasteboardServiceTest, DumpDataTest001, TestSize.Level1)
1190 {
1191 PasteboardServiceTest::SetTestTokenId();
1192 std::string plainText = "plain text";
1193 auto pasteData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
1194 pasteData->SetRemote(true);
1195 pasteData->SetShareOption(ShareOption::CrossDevice);
1196 PasteboardClient::GetInstance()->Clear();
1197 int32_t ret = PasteboardClient::GetInstance()->SetPasteData(*pasteData);
1198 EXPECT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
1199 std::string result;
1200 ret = PasteboardServiceTest::ExecuteCmd(result);
1201 EXPECT_TRUE(ret);
1202 EXPECT_TRUE(result.find("CrossDevice") != std::string::npos);
1203 EXPECT_TRUE(result.find("remote") != std::string::npos);
1204 PasteboardClient::GetInstance()->Clear();
1205 PasteboardServiceTest::RestoreSelfTokenId();
1206 }
1207
1208 /**
1209 * @tc.name: DumpDataTest002
1210 * @tc.desc: DumpData()-local, LocalDevice
1211 * @tc.type: FUNC
1212 * @tc.require: issueshI5YDEV
1213 * @tc.author: chenyu
1214 */
1215 HWTEST_F(PasteboardServiceTest, DumpDataTest002, TestSize.Level1)
1216 {
1217 PasteboardServiceTest::SetTestTokenId();
1218 std::string plainText = "plain text";
1219 auto pasteData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
1220 pasteData->SetShareOption(ShareOption::LocalDevice);
1221 PasteboardClient::GetInstance()->Clear();
1222 int32_t ret = PasteboardClient::GetInstance()->SetPasteData(*pasteData);
1223 EXPECT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
1224 std::string result;
1225 ret = PasteboardServiceTest::ExecuteCmd(result);
1226 EXPECT_TRUE(ret);
1227 EXPECT_TRUE(result.find("LocalDevice") != std::string::npos);
1228 EXPECT_TRUE(result.find("local") != std::string::npos);
1229 PasteboardClient::GetInstance()->Clear();
1230 PasteboardServiceTest::RestoreSelfTokenId();
1231 }
1232
1233 /**
1234 * @tc.name: DumpDataTest003
1235 * @tc.desc: DumpData()-local, InApp
1236 * @tc.type: FUNC
1237 * @tc.require: issueshI5YDEV
1238 * @tc.author: chenyu
1239 */
1240 HWTEST_F(PasteboardServiceTest, DumpDataTest003, TestSize.Level1)
1241 {
1242 PasteboardServiceTest::SetTestTokenId();
1243 std::string plainText = "plain text";
1244 auto pasteData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
1245 pasteData->SetShareOption(ShareOption::InApp);
1246 PasteboardClient::GetInstance()->Clear();
1247 int32_t ret = PasteboardClient::GetInstance()->SetPasteData(*pasteData);
1248 EXPECT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
1249 std::string result;
1250 ret = PasteboardServiceTest::ExecuteCmd(result);
1251 EXPECT_TRUE(ret);
1252 EXPECT_TRUE(result.find("InAPP") != std::string::npos);
1253 EXPECT_TRUE(result.find("local") != std::string::npos);
1254 PasteboardClient::GetInstance()->Clear();
1255 PasteboardServiceTest::RestoreSelfTokenId();
1256 }
1257
1258 /**
1259 * @tc.name: DumpDataTest004
1260 * @tc.desc: DumpData()-no data
1261 * @tc.type: FUNC
1262 * @tc.require: issueshI5YDEV
1263 * @tc.author: chenyu
1264 */
1265 HWTEST_F(PasteboardServiceTest, DumpDataTest004, TestSize.Level1)
1266 {
1267 PasteboardServiceTest::SetTestTokenId();
1268 PasteboardClient::GetInstance()->Clear();
1269
1270 std::string result;
1271 auto ret = PasteboardServiceTest::ExecuteCmd(result);
1272 EXPECT_TRUE(ret);
1273 EXPECT_EQ(result.find("Share"), std::string::npos);
1274 EXPECT_EQ(result.find("Option"), std::string::npos);
1275 PasteboardServiceTest::RestoreSelfTokenId();
1276 }
1277
1278 /**
1279 * @tc.name: HasPastePermissionTest001
1280 * @tc.desc: if (!pasteData->IsDraggedData() && (!isFocusedApp && !IsDefaultIME(GetAppInfo(tokenId))))
1281 * @tc.type: FUNC
1282 * @tc.require: issueshI5YDEV
1283 * @tc.author: chenyu
1284 */
1285 HWTEST_F(PasteboardServiceTest, HasPastePermissionTest001, TestSize.Level0)
1286 {
1287 PasteboardServiceTest::SetTestTokenId();
1288 std::vector<uint8_t> arrayBuffer(46);
1289 arrayBuffer = { 2, 7, 6, 8, 9 };
1290 std::string mimeType = "image/jpg";
1291 auto pasteData = PasteboardClient::GetInstance()->CreateKvData(mimeType, arrayBuffer);
1292 PasteboardClient::GetInstance()->Clear();
1293 int32_t ret = PasteboardClient::GetInstance()->SetPasteData(*pasteData);
1294 EXPECT_TRUE(ret == static_cast<int32_t>(PasteboardError::E_OK));
1295 auto hasPasteData = PasteboardClient::GetInstance()->HasPasteData();
1296 // not DraggedData, not DefaultIME, not FocusedApp
1297 EXPECT_FALSE(hasPasteData);
1298 PasteboardClient::GetInstance()->Clear();
1299 PasteboardServiceTest::RestoreSelfTokenId();
1300 }
1301 } // namespace OHOS::MiscServices