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