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 
18 #include "pasteboard_client.h"
19 #include "unistd.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 using Patterns = std::set<Pattern>;
27 class PasteboardClientTest : public testing::Test {
28 public:
29     static void SetUpTestCase(void);
30     static void TearDownTestCase(void);
31     void SetUp() override;
32     void TearDown() override;
33 };
34 
SetUpTestCase(void)35 void PasteboardClientTest::SetUpTestCase(void)
36 {
37     setuid(EDM_UID);
38 }
39 
TearDownTestCase(void)40 void PasteboardClientTest::TearDownTestCase(void)
41 {
42     setuid(0);
43 }
44 
SetUp(void)45 void PasteboardClientTest::SetUp(void) {}
46 
TearDown(void)47 void PasteboardClientTest::TearDown(void) {}
48 
49 /**
50 * @tc.name: IsRemoteData001
51 * @tc.desc: pasteData is local data.
52 * @tc.type: FUNC
53 * @tc.require:
54 * @tc.author:
55 */
HWTEST_F(PasteboardClientTest, IsRemoteData001, TestSize.Level0)56 HWTEST_F(PasteboardClientTest, IsRemoteData001, TestSize.Level0)
57 {
58     std::string plainText = "plain text";
59     auto pasteData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
60     PasteboardClient::GetInstance()->SetPasteData(*pasteData);
61     bool ret = PasteboardClient::GetInstance()->IsRemoteData();
62     ASSERT_FALSE(ret);
63 }
64 
65 /**
66 * @tc.name: IsRemoteData002
67 * @tc.desc: pasteData is remote data.
68 * @tc.type: FUNC
69 * @tc.require:
70 * @tc.author:
71 */
HWTEST_F(PasteboardClientTest, IsRemoteData002, TestSize.Level0)72 HWTEST_F(PasteboardClientTest, IsRemoteData002, TestSize.Level0)
73 {
74     std::string plainText = "plain text";
75     auto pasteData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
76     pasteData->SetRemote(true);
77     PasteboardClient::GetInstance()->SetPasteData(*pasteData);
78     bool ret = PasteboardClient::GetInstance()->IsRemoteData();
79     ASSERT_TRUE(ret);
80 }
81 
82 /**
83 * @tc.name: HasDataType001
84 * @tc.desc: data type is MIMETYPE_TEXT_PLAIN.
85 * @tc.type: FUNC
86 * @tc.require:
87 * @tc.author:
88 */
HWTEST_F(PasteboardClientTest, HasDataType001, TestSize.Level0)89 HWTEST_F(PasteboardClientTest, HasDataType001, TestSize.Level0)
90 {
91     std::string plainText = "helloWorld";
92     auto newData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
93     PasteboardClient::GetInstance()->SetPasteData(*newData);
94     auto ret = PasteboardClient::GetInstance()->HasDataType(MIMETYPE_TEXT_PLAIN);
95     ASSERT_TRUE(ret);
96     auto result = PasteboardClient::GetInstance()->HasDataType(MIMETYPE_TEXT_URI);
97     ASSERT_FALSE(result);
98 }
99 
100 /**
101 * @tc.name: HasDataType002
102 * @tc.desc: data type is MIMETYPE_TEXT_HTML.
103 * @tc.type: FUNC
104 * @tc.require:
105 * @tc.author:
106 */
HWTEST_F(PasteboardClientTest, HasDataType002, TestSize.Level0)107 HWTEST_F(PasteboardClientTest, HasDataType002, TestSize.Level0)
108 {
109     std::string htmlText = "<div class='disable'>helloWorld</div>";
110     auto newPasteData = PasteboardClient::GetInstance()->CreateHtmlData(htmlText);
111     PasteboardClient::GetInstance()->SetPasteData(*newPasteData);
112     auto ret = PasteboardClient::GetInstance()->HasDataType(MIMETYPE_TEXT_HTML);
113     ASSERT_TRUE(ret);
114     auto result = PasteboardClient::GetInstance()->HasDataType(MIMETYPE_TEXT_PLAIN);
115     ASSERT_FALSE(result);
116 }
117 
118 /**
119 * @tc.name: HasDataType003
120 * @tc.desc: data type is MIMETYPE_TEXT_URI
121 * @tc.type: FUNC
122 * @tc.require:
123 * @tc.author:
124 */
HWTEST_F(PasteboardClientTest, HasDataType003, TestSize.Level0)125 HWTEST_F(PasteboardClientTest, HasDataType003, TestSize.Level0)
126 {
127     OHOS::Uri uri("uri");
128     auto newPasteData = PasteboardClient::GetInstance()->CreateUriData(uri);
129     PasteboardClient::GetInstance()->SetPasteData(*newPasteData);
130     auto ret = PasteboardClient::GetInstance()->HasDataType(MIMETYPE_TEXT_URI);
131     ASSERT_TRUE(ret);
132     auto result = PasteboardClient::GetInstance()->HasDataType(MIMETYPE_TEXT_PLAIN);
133     ASSERT_FALSE(result);
134 }
135 
136 /**
137 * @tc.name: HasDataType004
138 * @tc.desc: data type is MIMETYPE_PIXELMAP
139 * @tc.type: FUNC
140 * @tc.require:
141 * @tc.author:
142 */
HWTEST_F(PasteboardClientTest, HasDataType004, TestSize.Level0)143 HWTEST_F(PasteboardClientTest, HasDataType004, TestSize.Level0)
144 {
145     uint32_t color[100] = { 3, 7, 9, 9, 7, 6 };
146     InitializationOptions opts = { { 5, 7 }, PixelFormat::ARGB_8888 };
147     std::unique_ptr<PixelMap> pixelMap = PixelMap::Create(color, sizeof(color) / sizeof(color[0]), opts);
148     std::shared_ptr<PixelMap> pixelMapIn = move(pixelMap);
149     auto newPasteData = PasteboardClient::GetInstance()->CreatePixelMapData(pixelMapIn);
150     PasteboardClient::GetInstance()->SetPasteData(*newPasteData);
151     auto ret = PasteboardClient::GetInstance()->HasDataType(MIMETYPE_PIXELMAP);
152     ASSERT_TRUE(ret);
153     auto result = PasteboardClient::GetInstance()->HasDataType(MIMETYPE_TEXT_URI);
154     ASSERT_FALSE(result);
155 }
156 
157 /**
158 * @tc.name: GetDataSource001
159 * @tc.desc: Get the source of the data.
160 * @tc.type: FUNC
161 * @tc.require:
162 * @tc.author:
163 */
HWTEST_F(PasteboardClientTest, GetDataSource001, TestSize.Level0)164 HWTEST_F(PasteboardClientTest, GetDataSource001, TestSize.Level0)
165 {
166     std::string plainText = "helloWorld";
167     auto newData = PasteboardClient::GetInstance()->CreatePlainTextData(plainText);
168     PasteboardClient::GetInstance()->SetPasteData(*newData);
169     std::string bundleName;
170     PasteboardClient::GetInstance()->GetDataSource(bundleName);
171     EXPECT_FALSE(bundleName.empty());
172 }
173 
174 /**
175 * @tc.name: SetGlobalShareOption
176 * @tc.desc: Set global shareOption
177 * @tc.type: FUNC
178 * @tc.require:
179 * @tc.author:
180 */
HWTEST_F(PasteboardClientTest, SetGlobalShareOption, TestSize.Level0)181 HWTEST_F(PasteboardClientTest, SetGlobalShareOption, TestSize.Level0)
182 {
183     std::map<uint32_t, ShareOption> settings = { { 100, ShareOption::InApp }, { 200, ShareOption::LocalDevice },
184         { 300, ShareOption::CrossDevice } };
185     PasteboardClient::GetInstance()->SetGlobalShareOption(settings);
186     auto result = PasteboardClient::GetInstance()->GetGlobalShareOption({});
187     EXPECT_TRUE(result.size() == 3);
188     EXPECT_EQ(result[100], ShareOption::InApp);
189     EXPECT_EQ(result[200], ShareOption::LocalDevice);
190     EXPECT_EQ(result[300], ShareOption::CrossDevice);
191     std::map<uint32_t, ShareOption> modify = { { 100, ShareOption::CrossDevice }, { 400, ShareOption::InApp } };
192     PasteboardClient::GetInstance()->SetGlobalShareOption(modify);
193     result = PasteboardClient::GetInstance()->GetGlobalShareOption({});
194     EXPECT_TRUE(result.size() == 4);
195     EXPECT_EQ(result[100], ShareOption::CrossDevice);
196     EXPECT_EQ(result[400], ShareOption::InApp);
197     PasteboardClient::GetInstance()->RemoveGlobalShareOption({ 100, 200, 300, 400 });
198 }
199 
200 /**
201 * @tc.name: GetGlobalShareOption
202 * @tc.desc: Get global shareOption
203 * @tc.type: FUNC
204 * @tc.require:
205 * @tc.author:
206 */
HWTEST_F(PasteboardClientTest, GetGlobalShareOption, TestSize.Level0)207 HWTEST_F(PasteboardClientTest, GetGlobalShareOption, TestSize.Level0)
208 {
209     std::map<uint32_t, ShareOption> settings = { { 100, ShareOption::InApp }, { 200, ShareOption::LocalDevice },
210         { 300, ShareOption::CrossDevice } };
211     PasteboardClient::GetInstance()->SetGlobalShareOption(settings);
212     auto result = PasteboardClient::GetInstance()->GetGlobalShareOption({});
213     EXPECT_TRUE(result.size() == 3);
214     EXPECT_EQ(result[100], ShareOption::InApp);
215     EXPECT_EQ(result[200], ShareOption::LocalDevice);
216     EXPECT_EQ(result[300], ShareOption::CrossDevice);
217     result = PasteboardClient::GetInstance()->GetGlobalShareOption({ 100, 400 });
218     EXPECT_TRUE(result.size() == 1);
219     EXPECT_EQ(result[100], ShareOption::InApp);
220     EXPECT_TRUE(result.find(400) == result.end());
221     PasteboardClient::GetInstance()->RemoveGlobalShareOption({ 100, 200, 300 });
222 }
223 
224 /**
225 * @tc.name: RemoveGlobalShareOption
226 * @tc.desc: Remove global shareOption
227 * @tc.type: FUNC
228 * @tc.require:
229 * @tc.author:
230 */
HWTEST_F(PasteboardClientTest, RemoveGlobalShareOption, TestSize.Level0)231 HWTEST_F(PasteboardClientTest, RemoveGlobalShareOption, TestSize.Level0)
232 {
233     std::map<uint32_t, ShareOption> settings = { { 100, ShareOption::InApp }, { 200, ShareOption::LocalDevice },
234         { 300, ShareOption::CrossDevice } };
235     PasteboardClient::GetInstance()->SetGlobalShareOption(settings);
236     auto result = PasteboardClient::GetInstance()->GetGlobalShareOption({});
237     EXPECT_TRUE(result.size() == 3);
238     EXPECT_EQ(result[100], ShareOption::InApp);
239     EXPECT_EQ(result[200], ShareOption::LocalDevice);
240     EXPECT_EQ(result[300], ShareOption::CrossDevice);
241     PasteboardClient::GetInstance()->RemoveGlobalShareOption({});
242     result = PasteboardClient::GetInstance()->GetGlobalShareOption({});
243     EXPECT_TRUE(result.size() == 3);
244     PasteboardClient::GetInstance()->RemoveGlobalShareOption({ 100, 400 });
245     result = PasteboardClient::GetInstance()->GetGlobalShareOption({});
246     EXPECT_TRUE(result.size() == 2);
247     EXPECT_TRUE(result.find(100) == result.end());
248     PasteboardClient::GetInstance()->RemoveGlobalShareOption({ 200, 300 });
249 }
250 
251 /**
252 * @tc.name: DetectPatterns001
253 * @tc.desc: Cover Permutation
254 * @tc.type: FUNC
255 * @tc.require:
256 * @tc.author:
257 */
HWTEST_F(PasteboardClientTest, DetectPatterns001, TestSize.Level0)258 HWTEST_F(PasteboardClientTest, DetectPatterns001, TestSize.Level0)
259 {
260     std::string plainText("r法塔赫已经,速tdghf!】qd rqdswww.comsski,.sjopwe"
261                           "ihhtpsdhttp我也带过去给他№のjioijhhu");
262     std::string plainText0("https://giedqwrtheeeeeefub.cerm/meeeelkove/obaklo_tjokl"
263                            "psetkjdttk/bkkjob/mwjweww.md)");
264     std::string plainText1("2我就破888芙蓉王82h7");
265     std::string plainText2("uhiyqydueuw@kahqw.oisko.sji");
266 
267     std::vector<std::string> plainTextVec{ plainText, plainText + plainText0, plainText + plainText1,
268         plainText + plainText2, plainText + plainText0 + plainText1, plainText0 + plainText2 + plainText,
269         plainText1 + plainText + plainText2, plainText0 + plainText1 + plainText + plainText2 };
270     std::vector<Patterns> patternsVec{ {}, { Pattern::URL }, { Pattern::Number }, { Pattern::EmailAddress },
271         { Pattern::URL, Pattern::Number }, { Pattern::URL, Pattern::EmailAddress },
272         { Pattern::Number, Pattern::EmailAddress }, { Pattern::URL, Pattern::Number, Pattern::EmailAddress } };
273     std::vector<std::vector<int>> patternsRightIndexVec{ { 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 1, 1, 0, 1 },
274         { 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 },
275         { 0, 0, 2, 3, 2, 3, 6, 6 }, { 0, 1, 2, 3, 4, 5, 6, 7 } };
276     for (int i = 0; i != 8; ++i) {
277         for (int j = 0; j != 8; ++j) {
278             auto newData = PasteboardClient::GetInstance()->CreatePlainTextData(plainTextVec[i]);
279             PasteboardClient::GetInstance()->SetPasteData(*newData);
280             auto ret = PasteboardClient::GetInstance()->DetectPatterns(patternsVec[j]);
281             int rightIndex = patternsRightIndexVec[i][j];
282             ASSERT_EQ(ret, patternsVec[rightIndex]);
283         }
284     }
285 }
286 
287 /**
288 * @tc.name: DetectPatterns002
289 * @tc.desc: check HTML
290 * @tc.type: FUNC
291 * @tc.require:
292 * @tc.author:
293 */
HWTEST_F(PasteboardClientTest, DetectPatterns002, TestSize.Level0)294 HWTEST_F(PasteboardClientTest, DetectPatterns002, TestSize.Level0)
295 {
296     std::string htmlText1 = "<!DOCTYPE html><html><head><title>"
297                             "超链案头研究。,封为啊啊</title></head><body><h2>发高热</h2>"
298                             "<p>隔热隔热的氛围<a href=\"https://exq23amwerwqple.com\">"
299                             "个人网站https://ex24t33tamp65hhle.com</a>。</p></body></html>";
300     auto newData1 = PasteboardClient::GetInstance()->CreateHtmlData(htmlText1);
301     PasteboardClient::GetInstance()->SetPasteData(*newData1);
302     Patterns patternsToCheck1{ Pattern::URL, Pattern::EmailAddress };
303     auto ret1 = PasteboardClient::GetInstance()->DetectPatterns(patternsToCheck1);
304     Patterns expected1{ Pattern::URL };
305     ASSERT_EQ(ret1, expected1);
306 
307     std::string htmlText2 = "<!DOCTYPE html><html><head><title>"
308                             "各个环节</title></head><body><h2>妈妈那边的</h2>"
309                             "<p>啊啊分,凤凰方法,环境https://examjjuyewple.com问我的<a "
310                             "href=\"https://ehhgxametgeple.com\">"
311                             "阿婆吗weqkqo@exaetmple.com</a>。????打法</p></body></html>";
312     auto newData2 = PasteboardClient::GetInstance()->CreateHtmlData(htmlText2);
313     PasteboardClient::GetInstance()->SetPasteData(*newData2);
314     Patterns patternsToCheck2{ Pattern::URL, Pattern::EmailAddress, Pattern::Number };
315     auto ret2 = PasteboardClient::GetInstance()->DetectPatterns(patternsToCheck2);
316     Patterns expected2{ Pattern::URL, Pattern::EmailAddress };
317     ASSERT_EQ(ret2, expected2);
318 }
319 
320 /**
321 * @tc.name: DetectPatterns003
322 * @tc.desc: Outlier force cast uint32_t to unsurportted Pattern
323 * @tc.type: FUNC
324 * @tc.require:
325 * @tc.author:
326 */
HWTEST_F(PasteboardClientTest, DetectPatterns003, TestSize.Level0)327 HWTEST_F(PasteboardClientTest, DetectPatterns003, TestSize.Level0)
328 {
329     std::string plainText1 = "部分人的十点半:\n"
330                              "「而飞过海」\n"
331                              "方法:\n"
332                              "https://pr5yyye-drseyive.u54yk.cwerfe/s/42e1ewed77f3dab4"
333                              "网gest加尔文iqru发的我ui哦计划任务i文化人:\n"
334                              "~b0043fg3423tddj~";
335     auto newData1 = PasteboardClient::GetInstance()->CreatePlainTextData(plainText1);
336     PasteboardClient::GetInstance()->SetPasteData(*newData1);
337     Patterns patternsToCheck{ Pattern::Number, Pattern::URL, Pattern::EmailAddress, static_cast<Pattern>(1023) };
338     auto ret1 = PasteboardClient::GetInstance()->DetectPatterns(patternsToCheck);
339     Patterns expected1{};
340     ASSERT_EQ(ret1, expected1);
341     std::string plainText2 = "【撒迪化,等我i却很难,无穷花的!】"
342                              "额外i卡号!念佛为?,为单位打开陪我。而奋斗,我去二队去,威威:trfwrtg"
343                              "(¥¥软骨素用人员为bdfdgse https://tgrthwerrwt.com/marrkerrerlorrve/ "
344                              "usrdq12_22swe@16rtgre3.com)";
345     auto newData2 = PasteboardClient::GetInstance()->CreatePlainTextData(plainText2);
346     PasteboardClient::GetInstance()->SetPasteData(*newData2);
347     auto ret2 = PasteboardClient::GetInstance()->DetectPatterns(patternsToCheck);
348     Patterns expected2{};
349     ASSERT_EQ(ret2, expected2);
350     std::string plainText3 = "【撒迪化,等我i却很难,无穷花的!】"
351                              "额外i卡号!念佛为?,为单位打开陪我。而奋斗,我去二队去,威威:trfwrtg";
352     auto newData3 = PasteboardClient::GetInstance()->CreatePlainTextData(plainText3);
353     PasteboardClient::GetInstance()->SetPasteData(*newData3);
354     auto ret3 = PasteboardClient::GetInstance()->DetectPatterns(patternsToCheck);
355     ASSERT_EQ(ret3, Patterns{});
356 }
357 
358 /**
359 * @tc.name: DetectPatterns004
360 * @tc.desc: Outlier force cast uint32_t 0xffffffff to unsurportted Pattern
361 * @tc.type: FUNC
362 * @tc.require:
363 * @tc.author:
364 */
HWTEST_F(PasteboardClientTest, DetectPatterns004, TestSize.Level0)365 HWTEST_F(PasteboardClientTest, DetectPatterns004, TestSize.Level0)
366 {
367     std::string plainText1 = "部分人的十点半:\n"
368                              "「而飞过海」\n"
369                              "方法:\n"
370                              "https://pr5yyye-drseyive.u54yk.cwerfe/s/42e1ewed77f3dab4"
371                              "网gest加尔文iqru发的我ui哦计划任务i文化人:\n"
372                              "~b0043fg3423tddj~";
373     auto newData1 = PasteboardClient::GetInstance()->CreatePlainTextData(plainText1);
374     PasteboardClient::GetInstance()->SetPasteData(*newData1);
375     std::set<Pattern> patternsToCheck{ Pattern::Number, Pattern::URL, Pattern::EmailAddress,
376         static_cast<Pattern>(0xffffffff), static_cast<Pattern>(0xffffff1a) };
377     auto ret1 = PasteboardClient::GetInstance()->DetectPatterns(patternsToCheck);
378     std::set<Pattern> expected1{};
379     ASSERT_EQ(ret1, expected1);
380     std::string plainText2 = "【撒迪化,等我i却很难,无穷花的!】"
381                              "额外i卡号!念佛为?,为单位打开陪我。而奋斗,我去二队去,威威:trfwrtg"
382                              "(¥¥软骨素用人员为bdfdgse https://tgrthwerrwt.com/marrkerrerlorrve/ "
383                              "usrdq12_22swe@16rtgre3.com)";
384     auto newData2 = PasteboardClient::GetInstance()->CreatePlainTextData(plainText2);
385     PasteboardClient::GetInstance()->SetPasteData(*newData2);
386     auto ret2 = PasteboardClient::GetInstance()->DetectPatterns(patternsToCheck);
387     std::set<Pattern> expected2{};
388     ASSERT_EQ(ret2, expected2);
389     std::string plainText3 = "【撒迪化,等我i却很难,无穷花的!】"
390                              "额外i卡号!念佛为?,为单位打开陪我。而奋斗,我去二队去,威威:trfwrtg";
391     auto newData3 = PasteboardClient::GetInstance()->CreatePlainTextData(plainText3);
392     PasteboardClient::GetInstance()->SetPasteData(*newData3);
393     auto ret3 = PasteboardClient::GetInstance()->DetectPatterns(patternsToCheck);
394     ASSERT_EQ(ret3, std::set<Pattern>{});
395 }
396 
397 } // namespace OHOS::MiscServices