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