• 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 "pasteboard_client.h"
17 #include "unistd.h"
18 #include <gtest/gtest.h>
19 #include "pasteboard_error.h"
20 
21 namespace OHOS::MiscServices {
22 using namespace testing::ext;
23 using namespace testing;
24 using namespace OHOS::Media;
25 constexpr const uid_t EDM_UID = 3057;
26 constexpr int32_t PERCENTAGE = 70;
27 using Patterns = std::set<Pattern>;
28 class PasteboardClientTest : public testing::Test {
29 public:
30     static void SetUpTestCase(void);
31     static void TearDownTestCase(void);
32     void SetUp() override;
33     void TearDown() override;
34 };
35 
SetUpTestCase(void)36 void PasteboardClientTest::SetUpTestCase(void)
37 {
38     setuid(EDM_UID);
39 }
40 
TearDownTestCase(void)41 void PasteboardClientTest::TearDownTestCase(void)
42 {
43     setuid(0);
44 }
45 
SetUp(void)46 void PasteboardClientTest::SetUp(void)
47 {
48 }
49 
TearDown(void)50 void PasteboardClientTest::TearDown(void)
51 {
52 }
53 
54 /**
55 * @tc.name: IsRemoteData001
56 * @tc.desc: pasteData is local data.
57 * @tc.type: FUNC
58 * @tc.require:
59 * @tc.author:
60 */
61 HWTEST_F(PasteboardClientTest, IsRemoteData001, TestSize.Level0)
62 {
63     std::string plainText = "plain text";
64     auto pasteData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
65     PasteboardClient::GetInstance()->SetPasteData(*pasteData);
66     bool ret = PasteboardClient::GetInstance()->IsRemoteData();
67     ASSERT_FALSE(ret);
68 }
69 
70 /**
71 * @tc.name: IsRemoteData002
72 * @tc.desc: pasteData is remote data.
73 * @tc.type: FUNC
74 * @tc.require:
75 * @tc.author:
76 */
77 HWTEST_F(PasteboardClientTest, IsRemoteData002, TestSize.Level0)
78 {
79     std::string plainText = "plain text";
80     auto pasteData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
81     pasteData->SetRemote(true);
82     PasteboardClient::GetInstance()->SetPasteData(*pasteData);
83     bool ret = PasteboardClient::GetInstance()->IsRemoteData();
84     ASSERT_TRUE(ret);
85 }
86 
87 /**
88  * @tc.name: GetMimeTypes001
89  * @tc.desc: get data type is empty.
90  * @tc.type: FUNC
91  * @tc.require:
92  * @tc.author:
93  */
94 HWTEST_F(PasteboardClientTest, GetMimeTypes001, TestSize.Level0)
95 {
96     PasteboardClient::GetInstance()->Clear();
97     std::vector<std::string> mimeTypes = PasteboardClient::GetInstance()->GetMimeTypes();
98     ASSERT_EQ(0, mimeTypes.size());
99 }
100 
101 /**
102  * @tc.name: GetMimeTypes002
103  * @tc.desc: get data type is MIMETYPE_TEXT_PLAIN.
104  * @tc.type: FUNC
105  * @tc.require:
106  * @tc.author:
107  */
108 HWTEST_F(PasteboardClientTest, GetMimeTypes002, TestSize.Level0)
109 {
110     std::string plainText = "helloWorld";
111     auto newData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
112     ASSERT_TRUE(newData);
113     PasteboardClient::GetInstance()->SetPasteData(*newData);
114     std::vector<std::string> mimeTypes = PasteboardClient::GetInstance()->GetMimeTypes();
115     ASSERT_EQ(1, mimeTypes.size());
116     ASSERT_EQ(MIMETYPE_TEXT_PLAIN, mimeTypes[0]);
117 }
118 
119 /**
120  * @tc.name: GetMimeTypes003
121  * @tc.desc: data type is MIMETYPE_TEXT_HTML.
122  * @tc.type: FUNC
123  * @tc.require:
124  * @tc.author:
125  */
126 HWTEST_F(PasteboardClientTest, GetMimeTypes003, TestSize.Level0)
127 {
128     std::string htmlText = "<div class='disable'>helloWorld</div>";
129     auto newPasteData = PasteboardClient::GetInstance()->CreateHtmlData(htmlText);
130     ASSERT_TRUE(newPasteData);
131     PasteboardClient::GetInstance()->SetPasteData(*newPasteData);
132     std::vector<std::string> mimeTypes = PasteboardClient::GetInstance()->GetMimeTypes();
133     ASSERT_EQ(1, mimeTypes.size());
134     ASSERT_EQ(MIMETYPE_TEXT_HTML, mimeTypes[0]);
135 }
136 
137 /**
138  * @tc.name: GetMimeTypes004
139  * @tc.desc: data type is MIMETYPE_TEXT_URI.
140  * @tc.type: FUNC
141  * @tc.require:
142  * @tc.author:
143  */
144 HWTEST_F(PasteboardClientTest, GetMimeTypes004, TestSize.Level0)
145 {
146     OHOS::Uri uri("uri");
147     auto newPasteData = PasteboardClient::GetInstance()->CreateUriData(uri);
148     ASSERT_TRUE(newPasteData);
149     PasteboardClient::GetInstance()->SetPasteData(*newPasteData);
150     std::vector<std::string> mimeTypes = PasteboardClient::GetInstance()->GetMimeTypes();
151     ASSERT_EQ(1, mimeTypes.size());
152     ASSERT_EQ(MIMETYPE_TEXT_URI, mimeTypes[0]);
153 }
154 
155 /**
156  * @tc.name: GetMimeTypes005
157  * @tc.desc: get multi data types.
158  * @tc.type: FUNC
159  * @tc.require:
160  * @tc.author:
161  */
162 HWTEST_F(PasteboardClientTest, GetMimeTypes005, TestSize.Level0)
163 {
164     PasteData data;
165     PasteDataRecord::Builder builder(MIMETYPE_TEXT_URI);
166     std::string uriStr = "/data/test/resource/pasteboardTest.txt";
167     auto uri = std::make_shared<OHOS::Uri>(uriStr);
168     auto record = builder.SetUri(uri).Build();
169     data.AddRecord(*record);
170 
171     using namespace OHOS::AAFwk;
172     std::string plainText = "helloWorld";
173     std::shared_ptr<Want> want = std::make_shared<Want>();
174     std::string key = "id";
175     int32_t id = 456;
176     Want wantIn = want->SetParam(key, id);
177     PasteDataRecord::Builder builder2(MIMETYPE_TEXT_WANT);
178     std::shared_ptr<PasteDataRecord> pasteDataRecord = builder2.SetWant(std::make_shared<Want>(wantIn)).Build();
179     data.AddRecord(pasteDataRecord);
180 
181     const uint32_t color[] = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80};
182     uint32_t len = sizeof(color) / sizeof(color[0]);
183     Media::InitializationOptions opts;
184     std::shared_ptr<OHOS::Media::PixelMap> pixelMap = Media::PixelMap::Create(color, len, 0, 2, opts);
185     PasteDataRecord::Builder builder3(MIMETYPE_PIXELMAP);
186     auto record3 = builder3.SetPixelMap(pixelMap).Build();
187     data.AddRecord(*record3);
188     PasteDataRecord::Builder builder4(MIMETYPE_TEXT_URI);
189     std::string uriStr4 = "/data/test/resource/pasteboardTest.txt";
190     auto uri4 = std::make_shared<OHOS::Uri>(uriStr4);
191     auto record4 = builder.SetUri(uri4).Build();
192     data.AddRecord(*record4);
193 
194     PasteboardClient::GetInstance()->SetPasteData(data);
195     std::vector<std::string> mimeTypes = PasteboardClient::GetInstance()->GetMimeTypes();
196     ASSERT_EQ(3, mimeTypes.size());
197     std::set<std::string> mimeTypesSet(mimeTypes.begin(), mimeTypes.end());
198     ASSERT_EQ(3, mimeTypesSet.size());
199     for (const std::string &type : mimeTypesSet) {
200         ASSERT_TRUE(MIMETYPE_TEXT_WANT == type ||
201                     MIMETYPE_PIXELMAP == type ||
202                     MIMETYPE_TEXT_URI == type);
203     }
204 }
205 
206 /**
207 * @tc.name: HasDataType001
208 * @tc.desc: data type is MIMETYPE_TEXT_PLAIN.
209 * @tc.type: FUNC
210 * @tc.require:
211 * @tc.author:
212 */
213 HWTEST_F(PasteboardClientTest, HasDataType001, TestSize.Level0)
214 {
215     std::string plainText = "helloWorld";
216     auto newData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
217     PasteboardClient::GetInstance()->SetPasteData(*newData);
218     auto ret = PasteboardClient::GetInstance()->HasDataType(MIMETYPE_TEXT_PLAIN);
219     ASSERT_TRUE(ret);
220     auto result = PasteboardClient::GetInstance()->HasDataType(MIMETYPE_TEXT_URI);
221     ASSERT_FALSE(result);
222 }
223 
224 /**
225 * @tc.name: HasDataType002
226 * @tc.desc: data type is MIMETYPE_TEXT_HTML.
227 * @tc.type: FUNC
228 * @tc.require:
229 * @tc.author:
230 */
231 HWTEST_F(PasteboardClientTest, HasDataType002, TestSize.Level0)
232 {
233     std::string htmlText = "<div class='disable'>helloWorld</div>";
234     auto newPasteData = PasteboardClient::GetInstance()->CreateHtmlData(htmlText);
235     PasteboardClient::GetInstance()->SetPasteData(*newPasteData);
236     auto ret = PasteboardClient::GetInstance()->HasDataType(MIMETYPE_TEXT_HTML);
237     ASSERT_TRUE(ret);
238     auto result = PasteboardClient::GetInstance()->HasDataType(MIMETYPE_TEXT_PLAIN);
239     ASSERT_FALSE(result);
240 }
241 
242 /**
243 * @tc.name: HasDataType003
244 * @tc.desc: data type is MIMETYPE_TEXT_URI
245 * @tc.type: FUNC
246 * @tc.require:
247 * @tc.author:
248 */
249 HWTEST_F(PasteboardClientTest, HasDataType003, TestSize.Level0)
250 {
251     OHOS::Uri uri("uri");
252     auto newPasteData = PasteboardClient::GetInstance()->CreateUriData(uri);
253     PasteboardClient::GetInstance()->SetPasteData(*newPasteData);
254     auto ret = PasteboardClient::GetInstance()->HasDataType(MIMETYPE_TEXT_URI);
255     ASSERT_TRUE(ret);
256     auto result = PasteboardClient::GetInstance()->HasDataType(MIMETYPE_TEXT_PLAIN);
257     ASSERT_FALSE(result);
258 }
259 
260 /**
261 * @tc.name: HasDataType004
262 * @tc.desc: data type is MIMETYPE_PIXELMAP
263 * @tc.type: FUNC
264 * @tc.require:
265 * @tc.author:
266 */
267 HWTEST_F(PasteboardClientTest, HasDataType004, TestSize.Level0)
268 {
269     uint32_t color[100] = { 3, 7, 9, 9, 7, 6 };
270     InitializationOptions opts = { { 5, 7 }, PixelFormat::ARGB_8888 };
271     std::unique_ptr<PixelMap> pixelMap = PixelMap::Create(color, sizeof(color) / sizeof(color[0]), opts);
272     std::shared_ptr<PixelMap> pixelMapIn = move(pixelMap);
273     auto newPasteData = PasteboardClient::GetInstance()->CreatePixelMapData(pixelMapIn);
274     PasteboardClient::GetInstance()->SetPasteData(*newPasteData);
275     auto ret = PasteboardClient::GetInstance()->HasDataType(MIMETYPE_PIXELMAP);
276     ASSERT_TRUE(ret);
277     auto result = PasteboardClient::GetInstance()->HasDataType(MIMETYPE_TEXT_URI);
278     ASSERT_FALSE(result);
279 }
280 
281 /**
282 * @tc.name: GetDataSource001
283 * @tc.desc: Get the source of the data.
284 * @tc.type: FUNC
285 * @tc.require:
286 * @tc.author:
287 */
288 HWTEST_F(PasteboardClientTest, GetDataSource001, TestSize.Level0)
289 {
290     std::string plainText = "helloWorld";
291     auto newData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
292     PasteboardClient::GetInstance()->SetPasteData(*newData);
293     std::string bundleName;
294     PasteboardClient::GetInstance()->GetDataSource(bundleName);
295     EXPECT_FALSE(bundleName.empty());
296 }
297 
298 /**
299 * @tc.name: SetGlobalShareOption
300 * @tc.desc: Set global shareOption
301 * @tc.type: FUNC
302 * @tc.require:
303 * @tc.author:
304 */
305 HWTEST_F(PasteboardClientTest, SetGlobalShareOption, TestSize.Level0)
306 {
307     std::map<uint32_t, ShareOption> settings = {
308         {100, ShareOption::InApp},
309         {200, ShareOption::LocalDevice},
310         {300, ShareOption::CrossDevice}};
311     PasteboardClient::GetInstance()->SetGlobalShareOption(settings);
312     auto result = PasteboardClient::GetInstance()->GetGlobalShareOption({});
313     EXPECT_TRUE(result.size() == 3);
314     EXPECT_EQ(result[100], ShareOption::InApp);
315     EXPECT_EQ(result[200], ShareOption::LocalDevice);
316     EXPECT_EQ(result[300], ShareOption::CrossDevice);
317     std::map<uint32_t, ShareOption> modify = {{100, ShareOption::CrossDevice},
318                                               {400, ShareOption::InApp}};
319     PasteboardClient::GetInstance()->SetGlobalShareOption(modify);
320     result = PasteboardClient::GetInstance()->GetGlobalShareOption({});
321     EXPECT_TRUE(result.size() == 4);
322     EXPECT_EQ(result[100], ShareOption::CrossDevice);
323     EXPECT_EQ(result[400], ShareOption::InApp);
324     PasteboardClient::GetInstance()->RemoveGlobalShareOption({100, 200, 300, 400});
325 }
326 
327 /**
328 * @tc.name: GetGlobalShareOption
329 * @tc.desc: Get global shareOption
330 * @tc.type: FUNC
331 * @tc.require:
332 * @tc.author:
333 */
334 HWTEST_F(PasteboardClientTest, GetGlobalShareOption, TestSize.Level0)
335 {
336     std::map<uint32_t, ShareOption> settings = {
337         {100, ShareOption::InApp},
338         {200, ShareOption::LocalDevice},
339         {300, ShareOption::CrossDevice}};
340     PasteboardClient::GetInstance()->SetGlobalShareOption(settings);
341     auto result = PasteboardClient::GetInstance()->GetGlobalShareOption({});
342     EXPECT_TRUE(result.size() == 3);
343     EXPECT_EQ(result[100], ShareOption::InApp);
344     EXPECT_EQ(result[200], ShareOption::LocalDevice);
345     EXPECT_EQ(result[300], ShareOption::CrossDevice);
346     result = PasteboardClient::GetInstance()->GetGlobalShareOption({100, 400});
347     EXPECT_TRUE(result.size() == 1);
348     EXPECT_EQ(result[100], ShareOption::InApp);
349     EXPECT_TRUE(result.find(400) == result.end());
350     PasteboardClient::GetInstance()->RemoveGlobalShareOption({100, 200, 300});
351 }
352 
353 /**
354 * @tc.name: RemoveGlobalShareOption
355 * @tc.desc: Remove global shareOption
356 * @tc.type: FUNC
357 * @tc.require:
358 * @tc.author:
359 */
360 HWTEST_F(PasteboardClientTest, RemoveGlobalShareOption, TestSize.Level0)
361 {
362     std::map<uint32_t, ShareOption> settings = {
363         {100, ShareOption::InApp},
364         {200, ShareOption::LocalDevice},
365         {300, ShareOption::CrossDevice}};
366     PasteboardClient::GetInstance()->SetGlobalShareOption(settings);
367     auto result = PasteboardClient::GetInstance()->GetGlobalShareOption({});
368     EXPECT_TRUE(result.size() == 3);
369     EXPECT_EQ(result[100], ShareOption::InApp);
370     EXPECT_EQ(result[200], ShareOption::LocalDevice);
371     EXPECT_EQ(result[300], ShareOption::CrossDevice);
372     PasteboardClient::GetInstance()->RemoveGlobalShareOption({});
373     result = PasteboardClient::GetInstance()->GetGlobalShareOption({});
374     EXPECT_TRUE(result.size() == 3);
375     PasteboardClient::GetInstance()->RemoveGlobalShareOption({100, 400});
376     result = PasteboardClient::GetInstance()->GetGlobalShareOption({});
377     EXPECT_TRUE(result.size() == 2);
378     EXPECT_TRUE(result.find(100) == result.end());
379     PasteboardClient::GetInstance()->RemoveGlobalShareOption({200, 300});
380 }
381 
382 /**
383 * @tc.name: DetectPatterns001
384 * @tc.desc: Cover Permutation
385 * @tc.type: FUNC
386 * @tc.require:
387 * @tc.author:
388 */
389 HWTEST_F(PasteboardClientTest, DetectPatterns001, TestSize.Level0)
390 {
391     std::string plainText("r法塔赫已经,速tdghf!】qd rqdswww.comsski,.sjopwe"
392     "ihhtpsdhttp我也带过去给他№のjioijhhu");
393     std::string plainText0("https://giedqwrtheeeeeefub.cerm/meeeelkove/obaklo_tjokl"
394     "psetkjdttk/bkkjob/mwjweww.md)");
395     std::string plainText1("2我就破888芙蓉王82h7");
396     std::string plainText2("uhiyqydueuw@kahqw.oisko.sji");
397 
398     std::vector<std::string> plainTextVec{
399         plainText, plainText+plainText0, plainText+plainText1, plainText+plainText2,
400         plainText+plainText0+plainText1, plainText0+plainText2+plainText, plainText1+plainText+plainText2,
401         plainText0+plainText1+plainText+plainText2
402     };
403     std::vector<Patterns> patternsVec{
404         {}, {Pattern::URL}, {Pattern::Number}, {Pattern::EmailAddress},
405         {Pattern::URL, Pattern::Number}, {Pattern::URL, Pattern::EmailAddress},
406         {Pattern::Number, Pattern::EmailAddress}, {Pattern::URL, Pattern::Number, Pattern::EmailAddress}
407     };
408     std::vector<std::vector<int>> patternsRightIndexVec{
409         {0, 0, 0, 0, 0, 0, 0, 0},
410         {0, 1, 0, 0, 1, 1, 0, 1},
411         {0, 0, 2, 0, 2, 0, 2, 2},
412         {0, 0, 0, 3, 0, 3, 3, 3},
413         {0, 1, 2, 0, 4, 1, 2, 4},
414         {0, 1, 0, 3, 1, 5, 3, 5},
415         {0, 0, 2, 3, 2, 3, 6, 6},
416         {0, 1, 2, 3, 4, 5, 6, 7}
417     };
418     for (int i = 0; i != 8; ++i) {
419         for (int j = 0; j != 8; ++j) {
420             auto newData = PasteboardClient::GetInstance()->CreatePlainTextData(
421                 plainTextVec[i]);
422             PasteboardClient::GetInstance()->SetPasteData(*newData);
423             auto ret = PasteboardClient::GetInstance()->DetectPatterns(
424                 patternsVec[j]);
425             int rightIndex = patternsRightIndexVec[i][j];
426             ASSERT_EQ(ret, patternsVec[rightIndex]);
427         }
428     }
429 }
430 
431 /**
432 * @tc.name: DetectPatterns002
433 * @tc.desc: check HTML
434 * @tc.type: FUNC
435 * @tc.require:
436 * @tc.author:
437 */
438 HWTEST_F(PasteboardClientTest, DetectPatterns002, TestSize.Level0)
439 {
440     std::string htmlText1 = "<!DOCTYPE html><html><head><title>"
441     "超链案头研究。,封为啊啊</title></head><body><h2>发高热</h2>"
442     "<p>隔热隔热的氛围<a href=\"https://exq23amwerwqple.com\">"
443     "个人网站https://ex24t33tamp65hhle.com</a>。</p></body></html>";
444     auto newData1 = PasteboardClient::GetInstance()->CreateHtmlData(htmlText1);
445     PasteboardClient::GetInstance()->SetPasteData(*newData1);
446     Patterns patternsToCheck1{Pattern::URL, Pattern::EmailAddress};
447     auto ret1 = PasteboardClient::GetInstance()->DetectPatterns(patternsToCheck1);
448     Patterns expected1{Pattern::URL};
449     ASSERT_EQ(ret1, expected1);
450 
451     std::string htmlText2 = "<!DOCTYPE html><html><head><title>"
452     "各个环节</title></head><body><h2>妈妈那边的</h2>"
453     "<p>啊啊分,凤凰方法,环境https://examjjuyewple.com问我的<a href=\"https://ehhgxametgeple.com\">"
454     "阿婆吗weqkqo@exaetmple.com</a>。????打法</p></body></html>";
455     auto newData2 = PasteboardClient::GetInstance()->CreateHtmlData(htmlText2);
456     PasteboardClient::GetInstance()->SetPasteData(*newData2);
457     Patterns patternsToCheck2{Pattern::URL, Pattern::EmailAddress, Pattern::Number};
458     auto ret2 = PasteboardClient::GetInstance()->DetectPatterns(patternsToCheck2);
459     Patterns expected2{Pattern::URL, Pattern::EmailAddress};
460     ASSERT_EQ(ret2, expected2);
461 }
462 
463 /**
464 * @tc.name: DetectPatterns003
465 * @tc.desc: Outlier force cast uint32_t to unsurportted Pattern
466 * @tc.type: FUNC
467 * @tc.require:
468 * @tc.author:
469 */
470 HWTEST_F(PasteboardClientTest, DetectPatterns003, TestSize.Level0)
471 {
472     std::string plainText1 = "部分人的十点半:\n"
473     "「而飞过海」\n"
474     "方法:\n"
475     "https://pr5yyye-drseyive.u54yk.cwerfe/s/42e1ewed77f3dab4"
476     "网gest加尔文iqru发的我ui哦计划任务i文化人:\n"
477     "~b0043fg3423tddj~";
478     auto newData1 = PasteboardClient::GetInstance()->CreatePlainTextData(plainText1);
479     PasteboardClient::GetInstance()->SetPasteData(*newData1);
480     Patterns patternsToCheck{
481         Pattern::Number, Pattern::URL, Pattern::EmailAddress, static_cast<Pattern>(1023)};
482     auto ret1 = PasteboardClient::GetInstance()->DetectPatterns(patternsToCheck);
483     Patterns expected1{};
484     ASSERT_EQ(ret1, expected1);
485     std::string plainText2 = "【撒迪化,等我i却很难,无穷花的!】"
486     "额外i卡号!念佛为?,为单位打开陪我。而奋斗,我去二队去,威威:trfwrtg"
487     "(¥¥软骨素用人员为bdfdgse https://tgrthwerrwt.com/marrkerrerlorrve/ usrdq12_22swe@16rtgre3.com)";
488     auto newData2 = PasteboardClient::GetInstance()->CreatePlainTextData(plainText2);
489     PasteboardClient::GetInstance()->SetPasteData(*newData2);
490     auto ret2 = PasteboardClient::GetInstance()->DetectPatterns(patternsToCheck);
491     Patterns expected2{};
492     ASSERT_EQ(ret2, expected2);
493     std::string plainText3 = "【撒迪化,等我i却很难,无穷花的!】"
494     "额外i卡号!念佛为?,为单位打开陪我。而奋斗,我去二队去,威威:trfwrtg";
495     auto newData3 = PasteboardClient::GetInstance()->CreatePlainTextData(plainText3);
496     PasteboardClient::GetInstance()->SetPasteData(*newData3);
497     auto ret3 = PasteboardClient::GetInstance()->DetectPatterns(patternsToCheck);
498     ASSERT_EQ(ret3, Patterns{});
499 }
500 
501 /**
502 * @tc.name: DetectPatterns004
503 * @tc.desc: Outlier force cast uint32_t 0xffffffff to unsurportted Pattern
504 * @tc.type: FUNC
505 * @tc.require:
506 * @tc.author:
507 */
508 HWTEST_F(PasteboardClientTest, DetectPatterns004, TestSize.Level0)
509 {
510     std::string plainText1 = "部分人的十点半:\n"
511     "「而飞过海」\n"
512     "方法:\n"
513     "https://pr5yyye-drseyive.u54yk.cwerfe/s/42e1ewed77f3dab4"
514     "网gest加尔文iqru发的我ui哦计划任务i文化人:\n"
515     "~b0043fg3423tddj~";
516     auto newData1 = PasteboardClient::GetInstance()->CreatePlainTextData(plainText1);
517     PasteboardClient::GetInstance()->SetPasteData(*newData1);
518     std::set<Pattern> patternsToCheck{
519         Pattern::Number, Pattern::URL, Pattern::EmailAddress,
520         static_cast<Pattern>(0xffffffff), static_cast<Pattern>(0xffffff1a)};
521     auto ret1 = PasteboardClient::GetInstance()->DetectPatterns(patternsToCheck);
522     std::set<Pattern> expected1{};
523     ASSERT_EQ(ret1, expected1);
524     std::string plainText2 = "【撒迪化,等我i却很难,无穷花的!】"
525     "额外i卡号!念佛为?,为单位打开陪我。而奋斗,我去二队去,威威:trfwrtg"
526     "(¥¥软骨素用人员为bdfdgse https://tgrthwerrwt.com/marrkerrerlorrve/ usrdq12_22swe@16rtgre3.com)";
527     auto newData2 = PasteboardClient::GetInstance()->CreatePlainTextData(plainText2);
528     PasteboardClient::GetInstance()->SetPasteData(*newData2);
529     auto ret2 = PasteboardClient::GetInstance()->DetectPatterns(patternsToCheck);
530     std::set<Pattern> expected2{};
531     ASSERT_EQ(ret2, expected2);
532     std::string plainText3 = "【撒迪化,等我i却很难,无穷花的!】"
533     "额外i卡号!念佛为?,为单位打开陪我。而奋斗,我去二队去,威威:trfwrtg";
534     auto newData3 = PasteboardClient::GetInstance()->CreatePlainTextData(plainText3);
535     PasteboardClient::GetInstance()->SetPasteData(*newData3);
536     auto ret3 = PasteboardClient::GetInstance()->DetectPatterns(patternsToCheck);
537     ASSERT_EQ(ret3, std::set<Pattern>{});
538 }
539 
ProgressNotify(std::shared_ptr<GetDataParams> params)540 void ProgressNotify(std::shared_ptr<GetDataParams> params)
541 {
542     if (params == nullptr) {
543         printf("Error: params is nullptr\n");
544         return;
545     }
546 
547     if (params->info == nullptr) {
548         printf("Error: params->info is nullptr\n");
549         return;
550     }
551 
552     printf("percentage=%d\n", params->info->percentage);
553 }
554 
555 /**
556  * @tc.name: GetDataWithProgress001
557  * @tc.desc: Getting data without system default progress indicator.
558  * @tc.type: FUNC
559  * @tc.require:
560  * @tc.author:
561  */
562 HWTEST_F(PasteboardClientTest, GetDataWithProgress001, TestSize.Level0)
563 {
564     std::string plainText = "helloWorld";
565     auto newData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
566     ASSERT_TRUE(newData != nullptr);
567     PasteboardClient::GetInstance()->SetPasteData(*newData);
568     PasteData pasteData;
569     std::shared_ptr<GetDataParams> params = std::make_shared<GetDataParams>();
570     params->fileConflictOption = FILE_OVERWRITE;
571     params->progressIndicator = NONE_PROGRESS_INDICATOR;
572     params->listener.ProgressNotify = ProgressNotify;
573     int32_t ret = PasteboardClient::GetInstance()->GetDataWithProgress(pasteData, params);
574     ASSERT_EQ(ret, static_cast<int32_t>(PasteboardError::E_OK));
575 }
576 
577 /**
578  * @tc.name: GetDataWithProgress002
579  * @tc.desc: Getting data with system default progress indicator.
580  * @tc.type: FUNC
581  * @tc.require:
582  * @tc.author:
583  */
584 HWTEST_F(PasteboardClientTest, GetDataWithProgress002, TestSize.Level0)
585 {
586     std::string plainText = "helloWorld";
587     auto newData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
588     ASSERT_TRUE(newData != nullptr);
589     PasteboardClient::GetInstance()->SetPasteData(*newData);
590     PasteData pasteData;
591     std::shared_ptr<GetDataParams> params = std::make_shared<GetDataParams>();
592     params->fileConflictOption = FILE_OVERWRITE;
593     params->progressIndicator = DEFAULT_PROGRESS_INDICATOR;
594     int32_t ret = PasteboardClient::GetInstance()->GetDataWithProgress(pasteData, params);
595     ASSERT_EQ(ret, static_cast<int32_t>(PasteboardError::E_OK));
596 }
597 
ProgressNotifyTest(std::shared_ptr<GetDataParams> params)598 void ProgressNotifyTest(std::shared_ptr<GetDataParams> params)
599 {
600     if (params == nullptr) {
601         printf("Error: params is nullptr\n");
602         return;
603     }
604 
605     if (params->info == nullptr) {
606         printf("Error: params->info is nullptr\n");
607         return;
608     }
609 
610     printf("percentage=%d\n", params->info->percentage);
611     if (params->info->percentage == PERCENTAGE) {
612         ProgressSignalClient::GetInstance().Cancel();
613     }
614 }
615 
616 /**
617  * @tc.name: GetDataWithProgress003
618  * @tc.desc: When the progress reaches 70, the download is canceled.
619  * @tc.type: FUNC
620  * @tc.require:
621  * @tc.author:
622  */
623 HWTEST_F(PasteboardClientTest, GetDataWithProgress003, TestSize.Level0)
624 {
625     std::string plainText = "helloWorld";
626     auto newData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
627     ASSERT_TRUE(newData != nullptr);
628     PasteboardClient::GetInstance()->SetPasteData(*newData);
629     PasteData pasteData;
630     std::shared_ptr<GetDataParams> params = std::make_shared<GetDataParams>();
631     params->fileConflictOption = FILE_OVERWRITE;
632     params->progressIndicator = NONE_PROGRESS_INDICATOR;
633     params->listener.ProgressNotify = ProgressNotifyTest;
634     int32_t ret = PasteboardClient::GetInstance()->GetDataWithProgress(pasteData, params);
635     ASSERT_EQ(ret, static_cast<int32_t>(PasteboardError::E_OK));
636 }
637 
638 /**
639  * @tc.name: GetDataWithProgress004
640  * @tc.desc: GetDataWithProgress test.
641  * @tc.type: FUNC
642  * @tc.require:
643  * @tc.author:
644  */
645 HWTEST_F(PasteboardClientTest, GetDataWithProgress004, TestSize.Level0)
646 {
647     PasteData pasteData;
648     int32_t ret = PasteboardClient::GetInstance()->GetDataWithProgress(pasteData, nullptr);
649     ASSERT_EQ(ret, static_cast<int32_t>(PasteboardError::INVALID_PARAM_ERROR));
650     std::string plainText = "helloWorld";
651     auto newData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
652     ASSERT_TRUE(newData != nullptr);
653     PasteboardClient::GetInstance()->SetPasteData(*newData);
654     std::shared_ptr<GetDataParams> params = std::make_shared<GetDataParams>();
655     params->fileConflictOption = FILE_OVERWRITE;
656     params->progressIndicator = NONE_PROGRESS_INDICATOR;
657     ret = PasteboardClient::GetInstance()->GetDataWithProgress(pasteData, params);
658     ASSERT_EQ(ret, static_cast<int32_t>(PasteboardError::E_OK));
659 }
660 
661 /**
662  * @tc.name: GetDataWithProgress005
663  * @tc.desc: GetDataWithProgress test.
664  * @tc.type: FUNC
665  * @tc.require:
666  * @tc.author:
667  */
668 HWTEST_F(PasteboardClientTest, GetDataWithProgress005, TestSize.Level0)
669 {
670     PasteData pasteData;
671     std::string plainText = "helloWorld";
672     auto newData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
673     ASSERT_TRUE(newData != nullptr);
674     PasteboardClient::GetInstance()->SetPasteData(*newData);
675     std::shared_ptr<GetDataParams> params = std::make_shared<GetDataParams>();
676     params->fileConflictOption = FILE_OVERWRITE;
677     params->progressIndicator = DEFAULT_PROGRESS_INDICATOR;
678     int32_t ret = PasteboardClient::GetInstance()->GetDataWithProgress(pasteData, params);
679     ASSERT_EQ(ret, static_cast<int32_t>(PasteboardError::E_OK));
680 }
681 } // namespace OHOS::MiscServices