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