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