1 /*
2 * Copyright (c) 2023-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
16 #include <gtest/gtest.h>
17 #include <thread>
18
19 #include "pasteboard_client.h"
20 #include "pasteboard_error.h"
21 #include "unistd.h"
22
23 namespace OHOS::MiscServices {
24 using namespace testing::ext;
25 using namespace testing;
26 using namespace OHOS::Media;
27 constexpr const uid_t EDM_UID = 3057;
28 constexpr int32_t PERCENTAGE = 70;
29 constexpr uint32_t MAX_RECOGNITION_LENGTH = 1000;
30 constexpr uint32_t TEST_RECOGNITION_LENGTH = 100;
31 using Patterns = std::set<Pattern>;
32 class PasteboardClientTest : public testing::Test {
33 public:
34 static void SetUpTestCase(void);
35 static void TearDownTestCase(void);
36 void SetUp() override;
37 void TearDown() override;
38 };
39
40 class TestEntityRecognitionObserver : public EntityRecognitionObserver {
41 public:
OnRecognitionEvent(EntityType entityType,std::string & entity)42 void OnRecognitionEvent(EntityType entityType, std::string &entity) override
43 {
44 entityType_ = entityType;
45 entity_ = entity;
46 uint32_t type = static_cast<uint32_t>(entityType);
47 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_SERVICE,
48 "observer callback, entityType=%{public}u, entity=%{private}s", type, entity.c_str());
49 }
50 EntityType entityType_;
51 std::string entity_ = "";
52 };
53
SetUpTestCase(void)54 void PasteboardClientTest::SetUpTestCase(void)
55 {
56 setuid(EDM_UID);
57 }
58
TearDownTestCase(void)59 void PasteboardClientTest::TearDownTestCase(void)
60 {
61 setuid(0);
62 }
63
SetUp(void)64 void PasteboardClientTest::SetUp(void) { }
65
TearDown(void)66 void PasteboardClientTest::TearDown(void) { }
67
68 /**
69 * @tc.name: GetChangeCount001
70 * @tc.desc: change count should not change after clear pasteboard.
71 * @tc.type: FUNC
72 * @tc.require:
73 * @tc.author:
74 */
75 HWTEST_F(PasteboardClientTest, GetChangeCount001, TestSize.Level0)
76 {
77 uint32_t changeCount = 0;
78 int32_t ret = PasteboardClient::GetInstance()->GetChangeCount(changeCount);
79 ASSERT_EQ(ret, static_cast<int32_t>(PasteboardError::E_OK));
80 PasteboardClient::GetInstance()->Clear();
81 uint32_t newCount = 0;
82 ret = PasteboardClient::GetInstance()->GetChangeCount(newCount);
83 ASSERT_EQ(ret, static_cast<int32_t>(PasteboardError::E_OK));
84 ASSERT_EQ(newCount, changeCount);
85 }
86
87 /**
88 * @tc.name: GetChangeCount002
89 * @tc.desc: change count should add 1 after successful SetPastedata once.
90 * @tc.type: FUNC
91 * @tc.require:
92 * @tc.author:
93 */
94 HWTEST_F(PasteboardClientTest, GetChangeCount002, TestSize.Level0)
95 {
96 uint32_t changeCount = 0;
97 int32_t ret = PasteboardClient::GetInstance()->GetChangeCount(changeCount);
98 ASSERT_EQ(ret, static_cast<int32_t>(PasteboardError::E_OK));
99 std::string plainText = "helloWorld";
100 auto newData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
101 ret = PasteboardClient::GetInstance()->SetPasteData(*newData);
102 ASSERT_EQ(ret, static_cast<int32_t>(PasteboardError::E_OK));
103 uint32_t newCount = 0;
104 ret = PasteboardClient::GetInstance()->GetChangeCount(newCount);
105 ASSERT_EQ(ret, static_cast<int32_t>(PasteboardError::E_OK));
106 ASSERT_EQ(newCount, changeCount + 1);
107 }
108
109 /**
110 * @tc.name: GetChangeCount003
111 * @tc.desc: change count should add 2 after successful SetPastedata twice.
112 * @tc.type: FUNC
113 * @tc.require:
114 * @tc.author:
115 */
116 HWTEST_F(PasteboardClientTest, GetChangeCount003, TestSize.Level0)
117 {
118 uint32_t changeCount = 0;
119 int32_t ret = PasteboardClient::GetInstance()->GetChangeCount(changeCount);
120 ASSERT_EQ(ret, static_cast<int32_t>(PasteboardError::E_OK));
121 std::string plainText = "helloWorld";
122 auto newData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
123 ret = PasteboardClient::GetInstance()->SetPasteData(*newData);
124 ASSERT_EQ(ret, static_cast<int32_t>(PasteboardError::E_OK));
125 std::string htmlText = "<div class='disable'>helloWorld</div>";
126 auto newData1 = PasteboardClient::GetInstance()->CreateHtmlData(htmlText);
127 ret = PasteboardClient::GetInstance()->SetPasteData(*newData1);
128 ASSERT_EQ(ret, static_cast<int32_t>(PasteboardError::E_OK));
129 uint32_t newCount = 0;
130 ret = PasteboardClient::GetInstance()->GetChangeCount(newCount);
131 ASSERT_EQ(ret, static_cast<int32_t>(PasteboardError::E_OK));
132 ASSERT_EQ(newCount, changeCount + 2);
133 }
134
135 /**
136 * @tc.name: IsRemoteData001
137 * @tc.desc: pasteData is local data.
138 * @tc.type: FUNC
139 * @tc.require:
140 * @tc.author:
141 */
142 HWTEST_F(PasteboardClientTest, IsRemoteData001, TestSize.Level0)
143 {
144 std::string plainText = "plain text";
145 auto pasteData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
146 PasteboardClient::GetInstance()->SetPasteData(*pasteData);
147 bool ret = PasteboardClient::GetInstance()->IsRemoteData();
148 ASSERT_FALSE(ret);
149 }
150
151 /**
152 * @tc.name: IsRemoteData002
153 * @tc.desc: pasteData is remote data.
154 * @tc.type: FUNC
155 * @tc.require:
156 * @tc.author:
157 */
158 HWTEST_F(PasteboardClientTest, IsRemoteData002, TestSize.Level0)
159 {
160 std::string plainText = "plain text";
161 auto pasteData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
162 pasteData->SetRemote(true);
163 PasteboardClient::GetInstance()->SetPasteData(*pasteData);
164 bool ret = PasteboardClient::GetInstance()->IsRemoteData();
165 ASSERT_TRUE(ret);
166 }
167
168 /**
169 * @tc.name: GetMimeTypes001
170 * @tc.desc: get data type is empty.
171 * @tc.type: FUNC
172 * @tc.require:
173 * @tc.author:
174 */
175 HWTEST_F(PasteboardClientTest, GetMimeTypes001, TestSize.Level0)
176 {
177 PasteboardClient::GetInstance()->Clear();
178 std::vector<std::string> mimeTypes = PasteboardClient::GetInstance()->GetMimeTypes();
179 ASSERT_EQ(0, mimeTypes.size());
180 }
181
182 /**
183 * @tc.name: GetMimeTypes002
184 * @tc.desc: get data type is MIMETYPE_TEXT_PLAIN.
185 * @tc.type: FUNC
186 * @tc.require:
187 * @tc.author:
188 */
189 HWTEST_F(PasteboardClientTest, GetMimeTypes002, TestSize.Level0)
190 {
191 std::string plainText = "helloWorld";
192 auto newData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
193 ASSERT_TRUE(newData);
194 PasteboardClient::GetInstance()->SetPasteData(*newData);
195 std::vector<std::string> mimeTypes = PasteboardClient::GetInstance()->GetMimeTypes();
196 ASSERT_EQ(1, mimeTypes.size());
197 ASSERT_EQ(MIMETYPE_TEXT_PLAIN, mimeTypes[0]);
198 }
199
200 /**
201 * @tc.name: GetMimeTypes003
202 * @tc.desc: data type is MIMETYPE_TEXT_HTML.
203 * @tc.type: FUNC
204 * @tc.require:
205 * @tc.author:
206 */
207 HWTEST_F(PasteboardClientTest, GetMimeTypes003, TestSize.Level0)
208 {
209 std::string htmlText = "<div class='disable'>helloWorld</div>";
210 auto newPasteData = PasteboardClient::GetInstance()->CreateHtmlData(htmlText);
211 ASSERT_TRUE(newPasteData);
212 PasteboardClient::GetInstance()->SetPasteData(*newPasteData);
213 std::vector<std::string> mimeTypes = PasteboardClient::GetInstance()->GetMimeTypes();
214 ASSERT_EQ(1, mimeTypes.size());
215 ASSERT_EQ(MIMETYPE_TEXT_HTML, mimeTypes[0]);
216 }
217
218 /**
219 * @tc.name: GetMimeTypes004
220 * @tc.desc: data type is MIMETYPE_TEXT_URI.
221 * @tc.type: FUNC
222 * @tc.require:
223 * @tc.author:
224 */
225 HWTEST_F(PasteboardClientTest, GetMimeTypes004, TestSize.Level0)
226 {
227 OHOS::Uri uri("uri");
228 auto newPasteData = PasteboardClient::GetInstance()->CreateUriData(uri);
229 ASSERT_TRUE(newPasteData);
230 PasteboardClient::GetInstance()->SetPasteData(*newPasteData);
231 std::vector<std::string> mimeTypes = PasteboardClient::GetInstance()->GetMimeTypes();
232 ASSERT_EQ(1, mimeTypes.size());
233 ASSERT_EQ(MIMETYPE_TEXT_URI, mimeTypes[0]);
234 }
235
236 /**
237 * @tc.name: GetMimeTypes005
238 * @tc.desc: get multi data types.
239 * @tc.type: FUNC
240 * @tc.require:
241 * @tc.author:
242 */
243 HWTEST_F(PasteboardClientTest, GetMimeTypes005, TestSize.Level0)
244 {
245 PasteData data;
246 PasteDataRecord::Builder builder(MIMETYPE_TEXT_URI);
247 std::string uriStr = "/data/test/resource/pasteboardTest.txt";
248 auto uri = std::make_shared<OHOS::Uri>(uriStr);
249 auto record = builder.SetUri(uri).Build();
250 data.AddRecord(*record);
251
252 using namespace OHOS::AAFwk;
253 std::string plainText = "helloWorld";
254 std::shared_ptr<Want> want = std::make_shared<Want>();
255 std::string key = "id";
256 int32_t id = 456;
257 Want wantIn = want->SetParam(key, id);
258 PasteDataRecord::Builder builder2(MIMETYPE_TEXT_WANT);
259 std::shared_ptr<PasteDataRecord> pasteDataRecord = builder2.SetWant(std::make_shared<Want>(wantIn)).Build();
260 data.AddRecord(pasteDataRecord);
261
262 const uint32_t color[] = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80};
263 uint32_t len = sizeof(color) / sizeof(color[0]);
264 Media::InitializationOptions opts;
265 std::shared_ptr<OHOS::Media::PixelMap> pixelMap = Media::PixelMap::Create(color, len, 0, 2, opts);
266 PasteDataRecord::Builder builder3(MIMETYPE_PIXELMAP);
267 auto record3 = builder3.SetPixelMap(pixelMap).Build();
268 data.AddRecord(*record3);
269 PasteDataRecord::Builder builder4(MIMETYPE_TEXT_URI);
270 std::string uriStr4 = "/data/test/resource/pasteboardTest.txt";
271 auto uri4 = std::make_shared<OHOS::Uri>(uriStr4);
272 auto record4 = builder.SetUri(uri4).Build();
273 data.AddRecord(*record4);
274
275 PasteboardClient::GetInstance()->SetPasteData(data);
276 std::vector<std::string> mimeTypes = PasteboardClient::GetInstance()->GetMimeTypes();
277 ASSERT_EQ(3, mimeTypes.size());
278 std::set<std::string> mimeTypesSet(mimeTypes.begin(), mimeTypes.end());
279 ASSERT_EQ(3, mimeTypesSet.size());
280 for (const std::string &type : mimeTypesSet) {
281 ASSERT_TRUE(MIMETYPE_TEXT_WANT == type ||
282 MIMETYPE_PIXELMAP == type ||
283 MIMETYPE_TEXT_URI == type);
284 }
285 }
286
287 /**
288 * @tc.name: HasDataType001
289 * @tc.desc: data type is MIMETYPE_TEXT_PLAIN.
290 * @tc.type: FUNC
291 * @tc.require:
292 * @tc.author:
293 */
294 HWTEST_F(PasteboardClientTest, HasDataType001, TestSize.Level0)
295 {
296 std::string plainText = "helloWorld";
297 auto newData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
298 PasteboardClient::GetInstance()->SetPasteData(*newData);
299 auto ret = PasteboardClient::GetInstance()->HasDataType(MIMETYPE_TEXT_PLAIN);
300 ASSERT_TRUE(ret);
301 auto result = PasteboardClient::GetInstance()->HasDataType(MIMETYPE_TEXT_URI);
302 ASSERT_FALSE(result);
303 }
304
305 /**
306 * @tc.name: HasDataType002
307 * @tc.desc: data type is MIMETYPE_TEXT_HTML.
308 * @tc.type: FUNC
309 * @tc.require:
310 * @tc.author:
311 */
312 HWTEST_F(PasteboardClientTest, HasDataType002, TestSize.Level0)
313 {
314 std::string htmlText = "<div class='disable'>helloWorld</div>";
315 auto newPasteData = PasteboardClient::GetInstance()->CreateHtmlData(htmlText);
316 PasteboardClient::GetInstance()->SetPasteData(*newPasteData);
317 auto ret = PasteboardClient::GetInstance()->HasDataType(MIMETYPE_TEXT_HTML);
318 ASSERT_TRUE(ret);
319 auto result = PasteboardClient::GetInstance()->HasDataType(MIMETYPE_TEXT_PLAIN);
320 ASSERT_FALSE(result);
321 }
322
323 /**
324 * @tc.name: HasDataType003
325 * @tc.desc: data type is MIMETYPE_TEXT_URI
326 * @tc.type: FUNC
327 * @tc.require:
328 * @tc.author:
329 */
330 HWTEST_F(PasteboardClientTest, HasDataType003, TestSize.Level0)
331 {
332 OHOS::Uri uri("uri");
333 auto newPasteData = PasteboardClient::GetInstance()->CreateUriData(uri);
334 PasteboardClient::GetInstance()->SetPasteData(*newPasteData);
335 auto ret = PasteboardClient::GetInstance()->HasDataType(MIMETYPE_TEXT_URI);
336 ASSERT_TRUE(ret);
337 auto result = PasteboardClient::GetInstance()->HasDataType(MIMETYPE_TEXT_PLAIN);
338 ASSERT_FALSE(result);
339 }
340
341 /**
342 * @tc.name: HasDataType004
343 * @tc.desc: data type is MIMETYPE_PIXELMAP
344 * @tc.type: FUNC
345 * @tc.require:
346 * @tc.author:
347 */
348 HWTEST_F(PasteboardClientTest, HasDataType004, TestSize.Level0)
349 {
350 uint32_t color[100] = { 3, 7, 9, 9, 7, 6 };
351 InitializationOptions opts = { { 5, 7 }, PixelFormat::ARGB_8888 };
352 std::unique_ptr<PixelMap> pixelMap = PixelMap::Create(color, sizeof(color) / sizeof(color[0]), opts);
353 std::shared_ptr<PixelMap> pixelMapIn = move(pixelMap);
354 auto newPasteData = PasteboardClient::GetInstance()->CreatePixelMapData(pixelMapIn);
355 PasteboardClient::GetInstance()->SetPasteData(*newPasteData);
356 auto ret = PasteboardClient::GetInstance()->HasDataType(MIMETYPE_PIXELMAP);
357 ASSERT_TRUE(ret);
358 auto result = PasteboardClient::GetInstance()->HasDataType(MIMETYPE_TEXT_URI);
359 ASSERT_FALSE(result);
360 }
361
362 /**
363 * @tc.name: GetDataSource001
364 * @tc.desc: Get the source of the data.
365 * @tc.type: FUNC
366 * @tc.require:
367 * @tc.author:
368 */
369 HWTEST_F(PasteboardClientTest, GetDataSource001, TestSize.Level0)
370 {
371 std::string plainText = "helloWorld";
372 auto newData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
373 PasteboardClient::GetInstance()->SetPasteData(*newData);
374 std::string bundleName;
375 PasteboardClient::GetInstance()->GetDataSource(bundleName);
376 EXPECT_FALSE(bundleName.empty());
377 }
378
379 /**
380 * @tc.name: SetGlobalShareOption
381 * @tc.desc: Set global shareOption
382 * @tc.type: FUNC
383 * @tc.require:
384 * @tc.author:
385 */
386 HWTEST_F(PasteboardClientTest, SetGlobalShareOption, TestSize.Level0)
387 {
388 std::map<uint32_t, ShareOption> settings = { { 100, ShareOption::InApp }, { 200, ShareOption::LocalDevice },
389 { 300, ShareOption::CrossDevice } };
390 PasteboardClient::GetInstance()->SetGlobalShareOption(settings);
391 auto result = PasteboardClient::GetInstance()->GetGlobalShareOption({});
392 EXPECT_TRUE(result.size() == 3);
393 EXPECT_EQ(result[100], ShareOption::InApp);
394 EXPECT_EQ(result[200], ShareOption::LocalDevice);
395 EXPECT_EQ(result[300], ShareOption::CrossDevice);
396 std::map<uint32_t, ShareOption> modify = { { 100, ShareOption::CrossDevice }, { 400, ShareOption::InApp } };
397 PasteboardClient::GetInstance()->SetGlobalShareOption(modify);
398 result = PasteboardClient::GetInstance()->GetGlobalShareOption({});
399 EXPECT_TRUE(result.size() == 4);
400 EXPECT_EQ(result[100], ShareOption::CrossDevice);
401 EXPECT_EQ(result[400], ShareOption::InApp);
402 PasteboardClient::GetInstance()->RemoveGlobalShareOption({ 100, 200, 300, 400 });
403 }
404
405 /**
406 * @tc.name: GetGlobalShareOption
407 * @tc.desc: Get global shareOption
408 * @tc.type: FUNC
409 * @tc.require:
410 * @tc.author:
411 */
412 HWTEST_F(PasteboardClientTest, GetGlobalShareOption, TestSize.Level0)
413 {
414 std::map<uint32_t, ShareOption> settings = { { 100, ShareOption::InApp }, { 200, ShareOption::LocalDevice },
415 { 300, ShareOption::CrossDevice } };
416 PasteboardClient::GetInstance()->SetGlobalShareOption(settings);
417 auto result = PasteboardClient::GetInstance()->GetGlobalShareOption({});
418 EXPECT_TRUE(result.size() == 3);
419 EXPECT_EQ(result[100], ShareOption::InApp);
420 EXPECT_EQ(result[200], ShareOption::LocalDevice);
421 EXPECT_EQ(result[300], ShareOption::CrossDevice);
422 result = PasteboardClient::GetInstance()->GetGlobalShareOption({ 100, 400 });
423 EXPECT_TRUE(result.size() == 1);
424 EXPECT_EQ(result[100], ShareOption::InApp);
425 EXPECT_TRUE(result.find(400) == result.end());
426 PasteboardClient::GetInstance()->RemoveGlobalShareOption({ 100, 200, 300 });
427 }
428
429 /**
430 * @tc.name: RemoveGlobalShareOption
431 * @tc.desc: Remove global shareOption
432 * @tc.type: FUNC
433 * @tc.require:
434 * @tc.author:
435 */
436 HWTEST_F(PasteboardClientTest, RemoveGlobalShareOption, TestSize.Level0)
437 {
438 std::map<uint32_t, ShareOption> settings = { { 100, ShareOption::InApp }, { 200, ShareOption::LocalDevice },
439 { 300, ShareOption::CrossDevice } };
440 PasteboardClient::GetInstance()->SetGlobalShareOption(settings);
441 auto result = PasteboardClient::GetInstance()->GetGlobalShareOption({});
442 EXPECT_TRUE(result.size() == 3);
443 EXPECT_EQ(result[100], ShareOption::InApp);
444 EXPECT_EQ(result[200], ShareOption::LocalDevice);
445 EXPECT_EQ(result[300], ShareOption::CrossDevice);
446 PasteboardClient::GetInstance()->RemoveGlobalShareOption({});
447 result = PasteboardClient::GetInstance()->GetGlobalShareOption({});
448 EXPECT_TRUE(result.size() == 3);
449 PasteboardClient::GetInstance()->RemoveGlobalShareOption({ 100, 400 });
450 result = PasteboardClient::GetInstance()->GetGlobalShareOption({});
451 EXPECT_TRUE(result.size() == 2);
452 EXPECT_TRUE(result.find(100) == result.end());
453 PasteboardClient::GetInstance()->RemoveGlobalShareOption({ 200, 300 });
454 }
455
456 /**
457 * @tc.name: DetectPatterns001
458 * @tc.desc: Cover Permutation
459 * @tc.type: FUNC
460 * @tc.require:
461 * @tc.author:
462 */
463 HWTEST_F(PasteboardClientTest, DetectPatterns001, TestSize.Level0)
464 {
465 std::string plainText("r法塔赫已经,速tdghf!】qd rqdswww.comsski,.sjopwe"
466 "ihhtpsdhttp我也带过去给他№のjioijhhu");
467 std::string plainText0("https://giedqwrtheeeeeefub.cerm/meeeelkove/obaklo_tjokl"
468 "psetkjdttk/bkkjob/mwjweww.md)");
469 std::string plainText1("2我就破888芙蓉王82h7");
470 std::string plainText2("uhiyqydueuw@kahqw.oisko.sji");
471
472 std::vector<std::string> plainTextVec{ plainText, plainText + plainText0, plainText + plainText1,
473 plainText + plainText2, plainText + plainText0 + plainText1, plainText0 + plainText2 + plainText,
474 plainText1 + plainText + plainText2, plainText0 + plainText1 + plainText + plainText2 };
475 std::vector<Patterns> patternsVec { {}, { Pattern::URL }, { Pattern::NUMBER }, { Pattern::EMAIL_ADDRESS },
476 { Pattern::URL, Pattern::NUMBER }, { Pattern::URL, Pattern::EMAIL_ADDRESS },
477 { Pattern::NUMBER, Pattern::EMAIL_ADDRESS }, { Pattern::URL, Pattern::NUMBER, Pattern::EMAIL_ADDRESS } };
478 std::vector<std::vector<int>> patternsRightIndexVec { { 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 1, 1, 0, 1 },
479 { 0, 0, 2, 0, 2, 0, 2, 2 }, { 0, 0, 0, 3, 0, 3, 3, 3 }, { 0, 1, 2, 0, 4, 1, 2, 4 }, { 0, 1, 0, 3, 1, 5, 3, 5 },
480 { 0, 0, 2, 3, 2, 3, 6, 6 }, { 0, 1, 2, 3, 4, 5, 6, 7 } };
481 for (int i = 0; i != 8; ++i) {
482 for (int j = 0; j != 8; ++j) {
483 auto newData = PasteboardClient::GetInstance()->CreatePlainTextData(plainTextVec[i]);
484 PasteboardClient::GetInstance()->SetPasteData(*newData);
485 auto ret = PasteboardClient::GetInstance()->DetectPatterns(patternsVec[j]);
486 int rightIndex = patternsRightIndexVec[i][j];
487 ASSERT_EQ(ret, patternsVec[rightIndex]);
488 }
489 }
490 }
491
492 /**
493 * @tc.name: DetectPatterns002
494 * @tc.desc: check HTML
495 * @tc.type: FUNC
496 * @tc.require:
497 * @tc.author:
498 */
499 HWTEST_F(PasteboardClientTest, DetectPatterns002, TestSize.Level0)
500 {
501 std::string htmlText1 = "<!DOCTYPE html><html><head><title>"
502 "超链案头研究。,封为啊啊</title></head><body><h2>发高热</h2>"
503 "<p>隔热隔热的氛围<a href=\"https://exq23amwerwqple.com\">"
504 "个人网站https://ex24t33tamp65hhle.com</a>。</p></body></html>";
505 auto newData1 = PasteboardClient::GetInstance()->CreateHtmlData(htmlText1);
506 PasteboardClient::GetInstance()->SetPasteData(*newData1);
507 Patterns patternsToCheck1 { Pattern::URL, Pattern::EMAIL_ADDRESS };
508 auto ret1 = PasteboardClient::GetInstance()->DetectPatterns(patternsToCheck1);
509 Patterns expected1{ Pattern::URL };
510 ASSERT_EQ(ret1, expected1);
511
512 std::string htmlText2 = "<!DOCTYPE html><html><head><title>"
513 "各个环节</title></head><body><h2>妈妈那边的</h2>"
514 "<p>啊啊分,凤凰方法,环境https://examjjuyewple.com问我的<a "
515 "href=\"https://ehhgxametgeple.com\">"
516 "阿婆吗weqkqo@exaetmple.com</a>。????打法</p></body></html>";
517 auto newData2 = PasteboardClient::GetInstance()->CreateHtmlData(htmlText2);
518 PasteboardClient::GetInstance()->SetPasteData(*newData2);
519 Patterns patternsToCheck2 { Pattern::URL, Pattern::EMAIL_ADDRESS, Pattern::NUMBER };
520 auto ret2 = PasteboardClient::GetInstance()->DetectPatterns(patternsToCheck2);
521 Patterns expected2 { Pattern::URL, Pattern::EMAIL_ADDRESS };
522 ASSERT_EQ(ret2, expected2);
523 }
524
525 /**
526 * @tc.name: DetectPatterns003
527 * @tc.desc: Outlier force cast uint32_t to unsupported Pattern
528 * @tc.type: FUNC
529 * @tc.require:
530 * @tc.author:
531 */
532 HWTEST_F(PasteboardClientTest, DetectPatterns003, TestSize.Level0)
533 {
534 std::string plainText1 = "部分人的十点半:\n"
535 "「而飞过海」\n"
536 "方法:\n"
537 "https://pr5yyye-drseyive.u54yk.cwerfe/s/42e1ewed77f3dab4"
538 "网gest加尔文iqru发的我ui哦计划任务i文化人:\n"
539 "~b0043fg3423tddj~";
540 auto newData1 = PasteboardClient::GetInstance()->CreatePlainTextData(plainText1);
541 PasteboardClient::GetInstance()->SetPasteData(*newData1);
542 Patterns patternsToCheck { Pattern::NUMBER, Pattern::URL, Pattern::EMAIL_ADDRESS, static_cast<Pattern>(1023) };
543 auto ret1 = PasteboardClient::GetInstance()->DetectPatterns(patternsToCheck);
544 Patterns expected1{};
545 ASSERT_EQ(ret1, expected1);
546 std::string plainText2 = "【撒迪化,等我i却很难,无穷花的!】"
547 "额外i卡号!念佛为?,为单位打开陪我。而奋斗,我去二队去,威威:trfwrtg"
548 "(¥¥软骨素用人员为bdfdgse https://tgrthwerrwt.com/marrkerrerlorrve/ "
549 "usrdq12_22swe@16rtgre3.com)";
550 auto newData2 = PasteboardClient::GetInstance()->CreatePlainTextData(plainText2);
551 PasteboardClient::GetInstance()->SetPasteData(*newData2);
552 auto ret2 = PasteboardClient::GetInstance()->DetectPatterns(patternsToCheck);
553 Patterns expected2{};
554 ASSERT_EQ(ret2, expected2);
555 std::string plainText3 = "【撒迪化,等我i却很难,无穷花的!】"
556 "额外i卡号!念佛为?,为单位打开陪我。而奋斗,我去二队去,威威:trfwrtg";
557 auto newData3 = PasteboardClient::GetInstance()->CreatePlainTextData(plainText3);
558 PasteboardClient::GetInstance()->SetPasteData(*newData3);
559 auto ret3 = PasteboardClient::GetInstance()->DetectPatterns(patternsToCheck);
560 ASSERT_EQ(ret3, Patterns{});
561 }
562
563 /**
564 * @tc.name: DetectPatterns004
565 * @tc.desc: Outlier force cast uint32_t 0xffffffff to unsupported Pattern
566 * @tc.type: FUNC
567 * @tc.require:
568 * @tc.author:
569 */
570 HWTEST_F(PasteboardClientTest, DetectPatterns004, TestSize.Level0)
571 {
572 std::string plainText1 = "部分人的十点半:\n"
573 "「而飞过海」\n"
574 "方法:\n"
575 "https://pr5yyye-drseyive.u54yk.cwerfe/s/42e1ewed77f3dab4"
576 "网gest加尔文iqru发的我ui哦计划任务i文化人:\n"
577 "~b0043fg3423tddj~";
578 auto newData1 = PasteboardClient::GetInstance()->CreatePlainTextData(plainText1);
579 PasteboardClient::GetInstance()->SetPasteData(*newData1);
580 std::set<Pattern> patternsToCheck { Pattern::NUMBER, Pattern::URL, Pattern::EMAIL_ADDRESS,
581 static_cast<Pattern>(0xffffffff), static_cast<Pattern>(0xffffff1a) };
582 auto ret1 = PasteboardClient::GetInstance()->DetectPatterns(patternsToCheck);
583 std::set<Pattern> expected1{};
584 ASSERT_EQ(ret1, expected1);
585 std::string plainText2 = "【撒迪化,等我i却很难,无穷花的!】"
586 "额外i卡号!念佛为?,为单位打开陪我。而奋斗,我去二队去,威威:trfwrtg"
587 "(¥¥软骨素用人员为bdfdgse https://tgrthwerrwt.com/marrkerrerlorrve/ "
588 "usrdq12_22swe@16rtgre3.com)";
589 auto newData2 = PasteboardClient::GetInstance()->CreatePlainTextData(plainText2);
590 PasteboardClient::GetInstance()->SetPasteData(*newData2);
591 auto ret2 = PasteboardClient::GetInstance()->DetectPatterns(patternsToCheck);
592 std::set<Pattern> expected2{};
593 ASSERT_EQ(ret2, expected2);
594 std::string plainText3 = "【撒迪化,等我i却很难,无穷花的!】"
595 "额外i卡号!念佛为?,为单位打开陪我。而奋斗,我去二队去,威威:trfwrtg";
596 auto newData3 = PasteboardClient::GetInstance()->CreatePlainTextData(plainText3);
597 PasteboardClient::GetInstance()->SetPasteData(*newData3);
598 auto ret3 = PasteboardClient::GetInstance()->DetectPatterns(patternsToCheck);
599 ASSERT_EQ(ret3, std::set<Pattern>{});
600 }
601
602 /**
603 * @tc.name: CreateMultiDelayRecord001
604 * @tc.desc: call CreateMultiDelayRecord
605 * @tc.type: FUNC
606 * @tc.require:
607 * @tc.author:
608 */
609 HWTEST_F(PasteboardClientTest, CreateMultiDelayRecord001, TestSize.Level0)
610 {
611 std::vector<std::string> mineTypes;
612 auto pasteDataRecord = PasteboardClient::GetInstance()->CreateMultiDelayRecord(mineTypes, nullptr);
613 EXPECT_NE(nullptr, pasteDataRecord);
614 }
615
616 /**
617 * @tc.name: CreateMultiTypeData001
618 * @tc.desc: call CreateMultiTypeData
619 * @tc.type: FUNC
620 * @tc.require:
621 * @tc.author:
622 */
623 HWTEST_F(PasteboardClientTest, CreateMultiTypeData001, TestSize.Level0)
624 {
625 std::map<std::string, std::shared_ptr<EntryValue>> typeValueMap;
626 std::shared_ptr<std::map<std::string, std::shared_ptr<EntryValue>>> mapPtr =
627 std::make_shared<std::map<std::string, std::shared_ptr<EntryValue>>>(typeValueMap);
628 const std::string recordMimeType = "record_mime_type";
629 auto pasteData = PasteboardClient::GetInstance()->CreateMultiTypeData(mapPtr, recordMimeType);
630 EXPECT_NE(nullptr, pasteData);
631 }
632
633 /**
634 * @tc.name: CreateMultiTypeDelayData001
635 * @tc.desc: call CreateMultiTypeDelayData and some misc branches
636 * @tc.type: FUNC
637 * @tc.require:
638 * @tc.author:
639 */
640 HWTEST_F(PasteboardClientTest, CreateMultiTypeDelayData001, TestSize.Level0)
641 {
642 std::vector<std::string> mimeTypes;
643 auto pasteData = PasteboardClient::GetInstance()->CreateMultiTypeDelayData(mimeTypes, nullptr);
644 EXPECT_NE(nullptr, pasteData);
645 PasteboardClient::GetInstance()->PasteStart("paste_id");
646 PasteboardClient::GetInstance()->PasteComplete("device_id", "paste_id");
647 PasteboardClient::GetInstance()->Subscribe(PasteboardObserverType::OBSERVER_LOCAL, nullptr);
648 }
649
ProgressNotify(std::shared_ptr<GetDataParams> params)650 void ProgressNotify(std::shared_ptr<GetDataParams> params)
651 {
652 if (params == nullptr) {
653 printf("Error: params is nullptr\n");
654 return;
655 }
656
657 if (params->info == nullptr) {
658 printf("Error: params->info is nullptr\n");
659 return;
660 }
661
662 printf("percentage=%d\n", params->info->percentage);
663 }
664
665 /**
666 * @tc.name: GetDataWithProgress001
667 * @tc.desc: Getting data without system default progress indicator.
668 * @tc.type: FUNC
669 * @tc.require:
670 * @tc.author:
671 */
672 HWTEST_F(PasteboardClientTest, GetDataWithProgress001, TestSize.Level0)
673 {
674 std::string plainText = "helloWorld";
675 auto newData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
676 ASSERT_TRUE(newData != nullptr);
677 PasteboardClient::GetInstance()->SetPasteData(*newData);
678 PasteData pasteData;
679 std::shared_ptr<GetDataParams> params = std::make_shared<GetDataParams>();
680 params->fileConflictOption = FILE_OVERWRITE;
681 params->progressIndicator = NONE_PROGRESS_INDICATOR;
682 params->listener.ProgressNotify = ProgressNotify;
683 int32_t ret = PasteboardClient::GetInstance()->GetDataWithProgress(pasteData, params);
684 ASSERT_EQ(ret, static_cast<int32_t>(PasteboardError::E_OK));
685 }
686
687 /**
688 * @tc.name: GetDataWithProgress002
689 * @tc.desc: Getting data with system default progress indicator.
690 * @tc.type: FUNC
691 * @tc.require:
692 * @tc.author:
693 */
694 HWTEST_F(PasteboardClientTest, GetDataWithProgress002, TestSize.Level0)
695 {
696 std::string plainText = "helloWorld";
697 auto newData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
698 ASSERT_TRUE(newData != nullptr);
699 PasteboardClient::GetInstance()->SetPasteData(*newData);
700 PasteData pasteData;
701 std::shared_ptr<GetDataParams> params = std::make_shared<GetDataParams>();
702 params->fileConflictOption = FILE_OVERWRITE;
703 params->progressIndicator = DEFAULT_PROGRESS_INDICATOR;
704 int32_t ret = PasteboardClient::GetInstance()->GetDataWithProgress(pasteData, params);
705 ASSERT_EQ(ret, static_cast<int32_t>(PasteboardError::E_OK));
706 }
707
ProgressNotifyTest(std::shared_ptr<GetDataParams> params)708 void ProgressNotifyTest(std::shared_ptr<GetDataParams> params)
709 {
710 if (params == nullptr) {
711 printf("Error: params is nullptr\n");
712 return;
713 }
714
715 if (params->info == nullptr) {
716 printf("Error: params->info is nullptr\n");
717 return;
718 }
719
720 printf("percentage=%d\n", params->info->percentage);
721 if (params->info->percentage == PERCENTAGE) {
722 ProgressSignalClient::GetInstance().Cancel();
723 }
724 }
725
726 /**
727 * @tc.name: GetDataWithProgress003
728 * @tc.desc: When the progress reaches 80, the download is canceled.
729 * @tc.type: FUNC
730 * @tc.require:
731 * @tc.author:
732 */
733 HWTEST_F(PasteboardClientTest, GetDataWithProgress003, TestSize.Level0)
734 {
735 std::string plainText = "helloWorld";
736 auto newData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
737 ASSERT_TRUE(newData != nullptr);
738 PasteboardClient::GetInstance()->SetPasteData(*newData);
739 PasteData pasteData;
740 std::shared_ptr<GetDataParams> params = std::make_shared<GetDataParams>();
741 params->fileConflictOption = FILE_OVERWRITE;
742 params->progressIndicator = NONE_PROGRESS_INDICATOR;
743 params->listener.ProgressNotify = ProgressNotifyTest;
744 int32_t ret = PasteboardClient::GetInstance()->GetDataWithProgress(pasteData, params);
745 ASSERT_EQ(ret, static_cast<int32_t>(PasteboardError::E_OK));
746 }
747
748 /**
749 * @tc.name: GetDataWithProgress004
750 * @tc.desc: GetDataWithProgress test.
751 * @tc.type: FUNC
752 * @tc.require:
753 * @tc.author:
754 */
755 HWTEST_F(PasteboardClientTest, GetDataWithProgress004, TestSize.Level0)
756 {
757 PasteData pasteData;
758 int32_t ret = PasteboardClient::GetInstance()->GetDataWithProgress(pasteData, nullptr);
759 ASSERT_EQ(ret, static_cast<int32_t>(PasteboardError::INVALID_PARAM_ERROR));
760 std::string plainText = "helloWorld";
761 auto newData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
762 ASSERT_TRUE(newData != nullptr);
763 PasteboardClient::GetInstance()->SetPasteData(*newData);
764 std::shared_ptr<GetDataParams> params = std::make_shared<GetDataParams>();
765 params->fileConflictOption = FILE_OVERWRITE;
766 params->progressIndicator = NONE_PROGRESS_INDICATOR;
767 ret = PasteboardClient::GetInstance()->GetDataWithProgress(pasteData, params);
768 ASSERT_EQ(ret, static_cast<int32_t>(PasteboardError::E_OK));
769 }
770
771 /**
772 * @tc.name: GetDataWithProgress005
773 * @tc.desc: GetDataWithProgress test.
774 * @tc.type: FUNC
775 * @tc.require:
776 * @tc.author:
777 */
778 HWTEST_F(PasteboardClientTest, GetDataWithProgress005, TestSize.Level0)
779 {
780 PasteData pasteData;
781 std::string plainText = "helloWorld";
782 auto newData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
783 ASSERT_TRUE(newData != nullptr);
784 PasteboardClient::GetInstance()->SetPasteData(*newData);
785 std::shared_ptr<GetDataParams> params = std::make_shared<GetDataParams>();
786 params->fileConflictOption = FILE_OVERWRITE;
787 params->progressIndicator = DEFAULT_PROGRESS_INDICATOR;
788 int32_t ret = PasteboardClient::GetInstance()->GetDataWithProgress(pasteData, params);
789 ASSERT_EQ(ret, static_cast<int32_t>(PasteboardError::E_OK));
790 }
791
792 /**
793 * @tc.name: HandleSignalValue001
794 * @tc.desc: HandleSignalValue001 Test.
795 * @tc.type: FUNC
796 * @tc.require:
797 * @tc.author:
798 */
799 HWTEST_F(PasteboardClientTest, HandleSignalValue001, TestSize.Level0)
800 {
801 PasteboardClient pasteboardClient;
802 std::string signalValue = "0";
803 int32_t result = pasteboardClient.HandleSignalValue(signalValue);
804 EXPECT_EQ(result, static_cast<int32_t>(PasteboardError::E_OK));
805 }
806
807 /**
808 * @tc.name: HandleSignalValue002
809 * @tc.desc: HandleSignalValue002 Test.
810 * @tc.type: FUNC
811 * @tc.require:
812 * @tc.author:
813 */
814 HWTEST_F(PasteboardClientTest, HandleSignalValue002, TestSize.Level0)
815 {
816 PasteboardClient pasteboardClient;
817 std::string signalValue = "invalid";
818 int32_t result = pasteboardClient.HandleSignalValue(signalValue);
819 EXPECT_EQ(result, static_cast<int32_t>(PasteboardError::INVALID_PARAM_ERROR));
820 }
821
822 /**
823 * @tc.name: HandleSignalValue003
824 * @tc.desc: HandleSignalValue003 Test.
825 * @tc.type: FUNC
826 * @tc.require:
827 * @tc.author:
828 */
829 HWTEST_F(PasteboardClientTest, HandleSignalValue003, TestSize.Level0)
830 {
831 PasteboardClient pasteboardClient;
832 int64_t value = INT32_MAX;
833 std::string signalValue = std::to_string(value + 1);
834 int32_t result = pasteboardClient.HandleSignalValue(signalValue);
835 EXPECT_EQ(result, static_cast<int32_t>(PasteboardError::INVALID_PARAM_ERROR));
836 }
837
838 /**
839 * @tc.name: SubscribeEntityObserverTest001
840 * @tc.desc: Subscribe EntityObserver when entityType is invalid value, should return ERR_INVALID_VALUE.
841 * hen EntityType is MAX, should return INVALID_PARAM_ERROR.
842 * @tc.type: FUNC
843 */
844 HWTEST_F(PasteboardClientTest, SubscribeEntityObserverTest001, TestSize.Level0)
845 {
846 uint32_t expectedDataLength = MAX_RECOGNITION_LENGTH;
847 sptr<EntityRecognitionObserver> observer = sptr<EntityRecognitionObserver>::MakeSptr();
848 int32_t result = PasteboardClient::GetInstance()->SubscribeEntityObserver(
849 EntityType::MAX, expectedDataLength, observer);
850 ASSERT_EQ(static_cast<int32_t>(PasteboardError::INVALID_PARAM_ERROR), result);
851 }
852
853 /**
854 * @tc.name: SubscribeEntityObserverTest002
855 * @tc.desc: Subscribe EntityObserver when expectedDataLength exceeds limitation, should return INVALID_PARAM_ERROR.
856 * @tc.type: FUNC
857 */
858 HWTEST_F(PasteboardClientTest, SubscribeEntityObserverTest002, TestSize.Level0)
859 {
860 uint32_t expectedDataLength = MAX_RECOGNITION_LENGTH + 1;
861 sptr<EntityRecognitionObserver> observer = sptr<EntityRecognitionObserver>::MakeSptr();
862 int32_t result = PasteboardClient::GetInstance()->SubscribeEntityObserver(
863 EntityType::ADDRESS, expectedDataLength, observer);
864 ASSERT_EQ(static_cast<int32_t>(PasteboardError::INVALID_PARAM_ERROR), result);
865 }
866
867 /**
868 * @tc.name: SubscribeEntityObserverTest003
869 * @tc.desc: Subscribe EntityObserver when observer is nullptr, should return INVALID_PARAM_ERROR.
870 * @tc.type: FUNC
871 */
872 HWTEST_F(PasteboardClientTest, SubscribeEntityObserverTest003, TestSize.Level0)
873 {
874 uint32_t expectedDataLength = MAX_RECOGNITION_LENGTH;
875 sptr<EntityRecognitionObserver> observer = nullptr;
876 int32_t result = PasteboardClient::GetInstance()->SubscribeEntityObserver(
877 EntityType::ADDRESS, expectedDataLength, observer);
878 ASSERT_EQ(static_cast<int32_t>(PasteboardError::INVALID_PARAM_ERROR), result);
879 }
880
881 /**
882 * @tc.name: SubscribeEntityObserverTest004
883 * @tc.desc: Subscribe EntityObserver normally should return E_OK.
884 * @tc.type: FUNC
885 */
886 HWTEST_F(PasteboardClientTest, SubscribeEntityObserverTest004, TestSize.Level0)
887 {
888 uint32_t expectedDataLength = MAX_RECOGNITION_LENGTH;
889 sptr<EntityRecognitionObserver> observer = sptr<EntityRecognitionObserver>::MakeSptr();
890 int32_t result = PasteboardClient::GetInstance()->SubscribeEntityObserver(
891 EntityType::ADDRESS, expectedDataLength, observer);
892 ASSERT_EQ(static_cast<int32_t>(PasteboardError::E_OK), result);
893 result = PasteboardClient::GetInstance()->UnsubscribeEntityObserver(
894 EntityType::ADDRESS, expectedDataLength, observer);
895 ASSERT_EQ(static_cast<int32_t>(PasteboardError::E_OK), result);
896 }
897
898 /**
899 * @tc.name: SubscribeEntityObserverTest005
900 * @tc.desc: Subscribe EntityObserver normally should return E_OK.
901 * @tc.type: FUNC
902 */
903 HWTEST_F(PasteboardClientTest, SubscribeEntityObserverTest005, TestSize.Level0)
904 {
905 uint32_t expectedDataLength = MAX_RECOGNITION_LENGTH;
906 sptr<EntityRecognitionObserver> observer = sptr<EntityRecognitionObserver>::MakeSptr();
907 int32_t result = PasteboardClient::GetInstance()->SubscribeEntityObserver(
908 EntityType::ADDRESS, expectedDataLength, observer);
909 ASSERT_EQ(static_cast<int32_t>(PasteboardError::E_OK), result);
910 PasteData pasteData;
911 std::string plainText = "陕西省西安市高新区丈八八路";
912 auto newData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
913 ASSERT_NE(newData, nullptr);
914 result = PasteboardClient::GetInstance()->SetPasteData(*newData);
915 ASSERT_EQ(static_cast<int32_t>(PasteboardError::E_OK), result);
916 std::this_thread::sleep_for(std::chrono::seconds(2));
917 result = PasteboardClient::GetInstance()->UnsubscribeEntityObserver(
918 EntityType::ADDRESS, expectedDataLength, observer);
919 ASSERT_EQ(static_cast<int32_t>(PasteboardError::E_OK), result);
920 }
921
922 /**
923 * @tc.name: SubscribeEntityObserverTest006
924 * @tc.desc: Subscribe observer again will return E_OK.
925 * @tc.type: FUNC
926 */
927 HWTEST_F(PasteboardClientTest, SubscribeEntityObserverTest006, TestSize.Level0)
928 {
929 uint32_t expectedDataLength = MAX_RECOGNITION_LENGTH;
930 sptr<EntityRecognitionObserver> observer = sptr<EntityRecognitionObserver>::MakeSptr();
931 int32_t result = PasteboardClient::GetInstance()->SubscribeEntityObserver(
932 EntityType::ADDRESS, expectedDataLength, observer);
933 ASSERT_EQ(static_cast<int32_t>(PasteboardError::E_OK), result);
934 result = PasteboardClient::GetInstance()->SubscribeEntityObserver(
935 EntityType::ADDRESS, expectedDataLength, observer);
936 ASSERT_EQ(static_cast<int32_t>(PasteboardError::E_OK), result);
937 result = PasteboardClient::GetInstance()->UnsubscribeEntityObserver(
938 EntityType::ADDRESS, expectedDataLength, observer);
939 ASSERT_EQ(static_cast<int32_t>(PasteboardError::E_OK), result);
940 }
941
942 /**
943 * @tc.name: SubscribeEntityObserverTest007
944 * @tc.desc: Subscribe another observer will replace old one and return E_OK.
945 * @tc.type: FUNC
946 */
947 HWTEST_F(PasteboardClientTest, SubscribeEntityObserverTest007, TestSize.Level0)
948 {
949 uint32_t expectedDataLength = MAX_RECOGNITION_LENGTH;
950 sptr<EntityRecognitionObserver> observer = new TestEntityRecognitionObserver();
951 int32_t result = PasteboardClient::GetInstance()->SubscribeEntityObserver(
952 EntityType::ADDRESS, expectedDataLength, observer);
953 ASSERT_EQ(static_cast<int32_t>(PasteboardError::E_OK), result);
954 sptr<EntityRecognitionObserver> otherObserver = sptr<EntityRecognitionObserver>::MakeSptr();
955 result = PasteboardClient::GetInstance()->SubscribeEntityObserver(
956 EntityType::ADDRESS, expectedDataLength, otherObserver);
957 ASSERT_EQ(static_cast<int32_t>(PasteboardError::E_OK), result);
958 result = PasteboardClient::GetInstance()->UnsubscribeEntityObserver(
959 EntityType::ADDRESS, expectedDataLength, otherObserver);
960 ASSERT_EQ(static_cast<int32_t>(PasteboardError::E_OK), result);
961 }
962
963 /**
964 * @tc.name: SubscribeEntityObserverTest008
965 * @tc.desc: Subscribe observer again with different param will return E_OK.
966 * @tc.type: FUNC
967 */
968 HWTEST_F(PasteboardClientTest, SubscribeEntityObserverTest008, TestSize.Level0)
969 {
970 uint32_t expectedDataLength = MAX_RECOGNITION_LENGTH;
971 sptr<EntityRecognitionObserver> observer = sptr<EntityRecognitionObserver>::MakeSptr();
972 int32_t result = PasteboardClient::GetInstance()->SubscribeEntityObserver(
973 EntityType::ADDRESS, expectedDataLength, observer);
974 ASSERT_EQ(static_cast<int32_t>(PasteboardError::E_OK), result);
975 result = PasteboardClient::GetInstance()->SubscribeEntityObserver(
976 EntityType::ADDRESS, TEST_RECOGNITION_LENGTH, observer);
977 ASSERT_EQ(static_cast<int32_t>(PasteboardError::E_OK), result);
978 result = PasteboardClient::GetInstance()->UnsubscribeEntityObserver(
979 EntityType::ADDRESS, expectedDataLength, observer);
980 ASSERT_EQ(static_cast<int32_t>(PasteboardError::E_OK), result);
981 result = PasteboardClient::GetInstance()->UnsubscribeEntityObserver(
982 EntityType::ADDRESS, TEST_RECOGNITION_LENGTH, observer);
983 ASSERT_EQ(static_cast<int32_t>(PasteboardError::E_OK), result);
984 }
985
986 /**
987 * @tc.name: SubscribeEntityObserverTest009
988 * @tc.desc: Unsubscribe EntityObserver and copy plainText, will not exec callback.
989 * @tc.type: FUNC
990 */
991 HWTEST_F(PasteboardClientTest, SubscribeEntityObserverTest009, TestSize.Level0)
992 {
993 uint32_t expectedDataLength = MAX_RECOGNITION_LENGTH;
994 sptr<TestEntityRecognitionObserver> observer = sptr<TestEntityRecognitionObserver>::MakeSptr();
995 int32_t result = PasteboardClient::GetInstance()->SubscribeEntityObserver(
996 EntityType::ADDRESS, expectedDataLength, observer);
997 ASSERT_EQ(static_cast<int32_t>(PasteboardError::E_OK), result);
998 result = PasteboardClient::GetInstance()->UnsubscribeEntityObserver(
999 EntityType::ADDRESS, expectedDataLength, observer);
1000 ASSERT_EQ(static_cast<int32_t>(PasteboardError::E_OK), result);
1001 PasteData pasteData;
1002 std::string plainText = "陕西省西安市高新区丈八八路";
1003 auto newData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
1004 ASSERT_NE(newData, nullptr);
1005 result = PasteboardClient::GetInstance()->SetPasteData(*newData);
1006 std::this_thread::sleep_for(std::chrono::seconds(1));
1007 ASSERT_EQ(static_cast<int32_t>(PasteboardError::E_OK), result);
1008 ASSERT_TRUE(observer->entity_.empty());
1009 }
1010
1011 /**
1012 * @tc.name: SubscribeEntityObserverTest010
1013 * @tc.desc: Subscribe EntityObserver and copy plainText with ShareOption::InApp, will not exec callback.
1014 * @tc.type: FUNC
1015 */
1016 HWTEST_F(PasteboardClientTest, SubscribeEntityObserverTest0010, TestSize.Level0)
1017 {
1018 uint32_t expectedDataLength = MAX_RECOGNITION_LENGTH;
1019 sptr<TestEntityRecognitionObserver> observer = sptr<TestEntityRecognitionObserver>::MakeSptr();
1020 int32_t result = PasteboardClient::GetInstance()->SubscribeEntityObserver(
1021 EntityType::ADDRESS, expectedDataLength, observer);
1022 ASSERT_EQ(static_cast<int32_t>(PasteboardError::E_OK), result);
1023 std::string plainText = "陕西省西安市高新区丈八八路";
1024 auto newData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
1025 ASSERT_NE(newData, nullptr);
1026 newData->SetShareOption(ShareOption::InApp);
1027 result = PasteboardClient::GetInstance()->SetPasteData(*newData);
1028 std::this_thread::sleep_for(std::chrono::seconds(1));
1029 ASSERT_EQ(static_cast<int32_t>(PasteboardError::E_OK), result);
1030 ASSERT_TRUE(observer->entity_.empty());
1031 result = PasteboardClient::GetInstance()->UnsubscribeEntityObserver(
1032 EntityType::ADDRESS, expectedDataLength, observer);
1033 ASSERT_EQ(static_cast<int32_t>(PasteboardError::E_OK), result);
1034 }
1035
1036 /**
1037 * @tc.name: UnsubscribeEntityObserverTest001
1038 * @tc.desc: Subscribe EntityObserver when EntityType is MAX, should return INVALID_PARAM_ERROR.
1039 * @tc.type: FUNC
1040 */
1041 HWTEST_F(PasteboardClientTest, UnsubscribeEntityObserverTest001, TestSize.Level0)
1042 {
1043 uint32_t expectedDataLength = MAX_RECOGNITION_LENGTH;
1044 sptr<EntityRecognitionObserver> observer = sptr<EntityRecognitionObserver>::MakeSptr();
1045 int32_t result = PasteboardClient::GetInstance()->UnsubscribeEntityObserver(
1046 EntityType::MAX, expectedDataLength, observer);
1047 ASSERT_EQ(static_cast<int32_t>(PasteboardError::INVALID_PARAM_ERROR), result);
1048 }
1049
1050 /**
1051 * @tc.name: UnsubscribeEntityObserverTest002
1052 * @tc.desc: Subscribe EntityObserver when expectedDataLength exceeds limitation, should return INVALID_PARAM_ERROR.
1053 * @tc.type: FUNC
1054 */
1055 HWTEST_F(PasteboardClientTest, UnsubscribeEntityObserverTest002, TestSize.Level0)
1056 {
1057 uint32_t expectedDataLength = MAX_RECOGNITION_LENGTH + 1;
1058 sptr<EntityRecognitionObserver> observer = sptr<EntityRecognitionObserver>::MakeSptr();
1059 int32_t result = PasteboardClient::GetInstance()->UnsubscribeEntityObserver(
1060 EntityType::ADDRESS, expectedDataLength, observer);
1061 ASSERT_EQ(static_cast<int32_t>(PasteboardError::INVALID_PARAM_ERROR), result);
1062 }
1063
1064 /**
1065 * @tc.name: UnsubscribeEntityObserverTest003
1066 * @tc.desc: Subscribe EntityObserver when observer is nullptr, should return INVALID_PARAM_ERROR.
1067 * @tc.type: FUNC
1068 */
1069 HWTEST_F(PasteboardClientTest, UnsubscribeEntityObserverTest003, TestSize.Level0)
1070 {
1071 uint32_t expectedDataLength = MAX_RECOGNITION_LENGTH;
1072 sptr<EntityRecognitionObserver> observer = nullptr;
1073 int32_t result = PasteboardClient::GetInstance()->UnsubscribeEntityObserver(
1074 EntityType::ADDRESS, expectedDataLength, observer);
1075 ASSERT_EQ(static_cast<int32_t>(PasteboardError::INVALID_PARAM_ERROR), result);
1076 }
1077
1078 /**
1079 * @tc.name: UnsubscribeEntityObserverTest004
1080 * @tc.desc: Subscribe EntityObserver normally should return E_OK.
1081 * @tc.type: FUNC
1082 */
1083 HWTEST_F(PasteboardClientTest, UnsubscribeEntityObserverTest004, TestSize.Level0)
1084 {
1085 uint32_t expectedDataLength = MAX_RECOGNITION_LENGTH;
1086 sptr<EntityRecognitionObserver> observer = sptr<EntityRecognitionObserver>::MakeSptr();
1087 int32_t result = PasteboardClient::GetInstance()->UnsubscribeEntityObserver(
1088 EntityType::ADDRESS, expectedDataLength, observer);
1089 ASSERT_EQ(static_cast<int32_t>(PasteboardError::E_OK), result);
1090 }
1091
1092 /**
1093 * @tc.name: UnsubscribeEntityObserverTest005
1094 * @tc.desc: Unsubscribe observer again will return E_OK.
1095 * @tc.type: FUNC
1096 */
1097 HWTEST_F(PasteboardClientTest, UnsubscribeEntityObserverTest005, TestSize.Level0)
1098 {
1099 uint32_t expectedDataLength = MAX_RECOGNITION_LENGTH;
1100 sptr<EntityRecognitionObserver> observer = new TestEntityRecognitionObserver();
1101 int32_t result = PasteboardClient::GetInstance()->UnsubscribeEntityObserver(
1102 EntityType::ADDRESS, expectedDataLength, observer);
1103 ASSERT_EQ(static_cast<int32_t>(PasteboardError::E_OK), result);
1104 result = PasteboardClient::GetInstance()->UnsubscribeEntityObserver(
1105 EntityType::ADDRESS, expectedDataLength, observer);
1106 ASSERT_EQ(static_cast<int32_t>(PasteboardError::E_OK), result);
1107 }
1108
1109 /**
1110 * @tc.name: UpdateProgressTest001
1111 * @tc.desc: UpdateProgressTest001
1112 * @tc.type: FUNC
1113 * @tc.require:
1114 * @tc.author:
1115 */
1116 HWTEST_F(PasteboardClientTest, UpdateProgressTest001, TestSize.Level0)
1117 {
1118 std::shared_ptr<GetDataParams> params = nullptr;
1119 PasteboardClient::GetInstance()->UpdateProgress(params, 50);
1120 EXPECT_TRUE(params == nullptr);
1121 }
1122
1123 /**
1124 * @tc.name: ReleaseSaListenerTest001
1125 * @tc.desc: Release Sa Listener
1126 * @tc.type: FUNC
1127 * @tc.require:
1128 * @tc.author:
1129 */
1130 HWTEST_F(PasteboardClientTest, ReleaseSaListenerTest001, TestSize.Level0)
1131 {
1132 PasteboardClient::GetInstance()->ReleaseSaListener();
1133 EXPECT_TRUE(PasteboardClient::GetInstance()->isSubscribeSa_ == false);
1134 }
1135
1136 /**
1137 * @tc.name: GetRecordValueByTypeTest001
1138 * @tc.desc: GetRecordValueByTypeTest001
1139 * @tc.type: FUNC
1140 * @tc.require:
1141 * @tc.author:
1142 */
1143 HWTEST_F(PasteboardClientTest, GetRecordValueByTypeTest001, TestSize.Level0)
1144 {
1145 PasteDataEntry entry;
1146 int32_t result = PasteboardClient::GetInstance()->GetRecordValueByType(1, 1, entry);
1147 ASSERT_EQ(result, static_cast<int32_t>(PasteboardError::INVALID_DATA_ID));
1148 }
1149 } // namespace OHOS::MiscServices
1150