• 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 "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