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