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_web_controller.h"
17 #include "pasteboard_client.h"
18 #include <gtest/gtest.h>
19 
20 using namespace testing;
21 using namespace testing::ext;
22 using namespace OHOS::MiscServices;
23 class WebControllerTest : public testing::Test {
24 public:
WebControllerTest()25     WebControllerTest() {};
~WebControllerTest()26     ~WebControllerTest() {};
27     static void SetUpTestCase(void);
28     static void TearDownTestCase(void);
29     void SetUp();
30     void TearDown();
31 };
32 
SetUpTestCase(void)33 void WebControllerTest::SetUpTestCase(void)
34 {
35 }
36 
TearDownTestCase(void)37 void WebControllerTest::TearDownTestCase(void)
38 {
39 }
40 
SetUp(void)41 void WebControllerTest::SetUp(void)
42 {
43 }
44 
TearDown(void)45 void WebControllerTest::TearDown(void)
46 {
47 }
48 
49 /**
50  * @tc.name: SplitHtmlTest_001.
51  * @tc.desc: Test did not use local image address HTML with SplitHtml.
52  * @tc.type: FUNC.
53  * @tc.require:
54  * @tc.author:
55  */
56 HWTEST_F(WebControllerTest, SplitHtmlTest_001, TestSize.Level1)
57 {
58     auto webClipboardController = PasteboardWebController::GetInstance();
59     std::shared_ptr<std::string> html(
60         new std::string("<img data-ohos='clipboard' src='http://file1.jpg'><img data-ohos='clipboard' "
61                         "src='https://data/storage/el2/distributedfiles/202305301.png'>"));
62     auto records = webClipboardController.SplitHtml2Records(html, 1);
63     EXPECT_EQ(records.size(), 0);
64 }
65 
66 /**
67  * @tc.name: SplitHtmlTest_002.
68  * @tc.desc: Test contains a local image address HTML with SplitHtml.
69  * @tc.type: FUNC.
70  * @tc.require:
71  * @tc.author:
72  */
73 HWTEST_F(WebControllerTest, SplitHtmlTest_002, TestSize.Level1)
74 {
75     auto webClipboardController = PasteboardWebController::GetInstance();
76     std::shared_ptr<std::string> html(
77         new std::string("<img data-ohos='clipboard' src='file:///file1.jpg'><img data-ohos='clipboard' "
78                         "src='https://data/storage/el2/distributedfiles/202305301.png'>"));
79     auto records = webClipboardController.SplitHtml2Records(html, 1);
80     EXPECT_EQ(records.size(), 1);
81 }
82 
83 /**
84  * @tc.name: SplitHtmlTest_003.
85  * @tc.desc: Test contains multiple image addresses, but no local address with SplitHtml.
86  * @tc.type: FUNC.
87  * @tc.require:
88  * @tc.author:
89  */
90 HWTEST_F(WebControllerTest, SplitHtmlTest_003, TestSize.Level1)
91 {
92     auto webClipboardController = PasteboardWebController::GetInstance();
93     std::shared_ptr<std::string> html(
94         new std::string("<img data-ohos='clipboard' src='file://file1.jpg'><img data-ohos='clipboard' "
95                         "src='file2.jpg'><img data-ohos='clipboard' "
96                         "src='https://data/storage/el2/distributedfiles/202305301.png'>"));
97     auto records = webClipboardController.SplitHtml2Records(html, 1);
98     EXPECT_FALSE(records.empty());
99 }
100 
101 /**
102  * @tc.name: RebuildHtmlTest_004.
103  * @tc.desc: Test does not include local image address HTML with RebuildHtml.
104  * @tc.type: FUNC.
105  * @tc.require:
106  * @tc.author:
107  */
108 HWTEST_F(WebControllerTest, RebuildHtmlTest_004, TestSize.Level1)
109 {
110     std::shared_ptr<std::string> html(
111             new std::string("<img data-ohos='clipboard' src='http://file1.jpg'><img data-ohos='clipboard' "
112                             "src='https://data/storage/el2/distributedfiles/202305301.png'>"));
113     auto pasteData = PasteboardClient::GetInstance()->CreateHtmlData(*html);
114     auto htmlRecord = pasteData->GetRecordAt(0);
115 
116     auto webClipboardController = PasteboardWebController::GetInstance();
117     auto records = webClipboardController.SplitHtml2Records(html, htmlRecord->GetRecordId());
118     EXPECT_EQ(records.size(), 0);
119 
120     webClipboardController.MergeExtraUris2Html(*pasteData);
121     EXPECT_EQ(pasteData->GetRecordCount(), 1);
122 }
123 
124 /**
125  * @tc.name: RebuildHtmlTest_005.
126  * @tc.desc: Test contains a local image address HTML with RebuildHtml.
127  * @tc.type: FUNC.
128  * @tc.require:
129  * @tc.author:
130  */
131 HWTEST_F(WebControllerTest, RebuildHtmlTest_005, TestSize.Level1)
132 {
133     const int32_t splitRecordCount = 1;
134     const std::string uri = "file:///data/storage/el2/distributedfiles/temp.png";
135     auto webClipboardController = PasteboardWebController::GetInstance();
136     std::shared_ptr<std::string> html(
137         new std::string("<img data-ohos='clipboard' src='file:///file1.jpg'><img data-ohos='clipboard' "
138                         "src='https://data/storage/el2/distributedfiles/202305301.png'>"));
139     auto pasteData = PasteboardClient::GetInstance()->CreateHtmlData(*html);
140     auto htmlRecord = pasteData->GetRecordAt(0);
141     htmlRecord->SetFrom(htmlRecord->GetRecordId());
142 
143     const char* execptHtml =
144         "<img data-ohos='clipboard' src='file:///data/storage/el2/distributedfiles/temp.png'><img "
145         "data-ohos='clipboard' "
146         "src='https://data/storage/el2/distributedfiles/202305301.png'>";
147     auto records = webClipboardController.SplitHtml2Records(html, htmlRecord->GetRecordId());
148     EXPECT_EQ(records.size(), splitRecordCount);
149     pasteData->AddRecord(records[0]);
150 
151     std::shared_ptr<PasteData> newPasteData = std::make_shared<PasteData>();
152     std::vector<std::shared_ptr<PasteDataRecord>> pasteDataRecords = pasteData->AllRecords();
153     EXPECT_EQ(*(pasteDataRecords[pasteData->GetRecordCount() - 1]->GetHtmlText()), *html);
154 
155     newPasteData->AddHtmlRecord(*html);
156     for (auto i = 0; i < pasteData->GetRecordCount() - 1; i++) {
157         PasteDataRecord::Builder builder(MIMETYPE_TEXT_URI);
158         auto newUri = std::make_shared<OHOS::Uri>(uri);
159         builder.SetUri(newUri);
160         builder.SetCustomData(pasteDataRecords[i]->GetCustomData());
161         auto record = builder.Build();
162         newPasteData->AddRecord(record);
163     }
164     EXPECT_EQ(newPasteData->GetRecordCount(), 2);
165     std::shared_ptr<std::string> newHtml = webClipboardController.RebuildHtml(newPasteData);
166     EXPECT_EQ(newPasteData->GetRecordCount(), 1);
167     const char* newHtmlStr = newHtml.get()->c_str();
168     EXPECT_STREQ(newHtmlStr, execptHtml);
169 }
170 
171 /**
172  * @tc.name: RebuildHtmlTest_006.
173  * @tc.desc: Test contains a multiple image address HTML with MergeExtraUris2Html.
174  * @tc.type: FUNC.
175  * @tc.require:
176  * @tc.author:
177  */
178 HWTEST_F(WebControllerTest, RebuildHtmlTest_006, TestSize.Level1)
179 {
180     const std::string uri = "file:///data/storage/el2/distributedfiles/temp.png";
181     auto webClipboardController = PasteboardWebController::GetInstance();
182     std::shared_ptr<std::string> html(
183         new std::string("<img data-ohos='clipboard' src='file:///file1.jpg'><img data-ohos='clipboard' "
184                         "src=\"file2.jpg\"><img data-ohos='clipboard' "
185                         "src='https://data/storage/el2/distributedfiles/202305301.png'>"));
186     auto pasteData = PasteboardClient::GetInstance()->CreateHtmlData(*html);
187     auto htmlRecord = pasteData->GetRecordAt(0);
188     htmlRecord->SetFrom(htmlRecord->GetRecordId());
189 
190     const char* execptHtml =
191         "<img data-ohos='clipboard' src='file:///data/storage/el2/distributedfiles/temp.png'><img "
192         "data-ohos='clipboard' "
193         "src=\"file:///data/storage/el2/distributedfiles/temp.png\"><img data-ohos='clipboard' "
194         "src='https://data/storage/el2/distributedfiles/202305301.png'>";
195     auto records = webClipboardController.SplitHtml2Records(html, htmlRecord->GetRecordId());
196     EXPECT_EQ(records.size(), 2);
197     EXPECT_EQ(records[0]->GetFrom(), htmlRecord->GetRecordId());
198     pasteData->AddRecord(records[0]);
199     pasteData->AddRecord(records[1]);
200 
201     std::shared_ptr<PasteData> newPasteData = std::make_shared<PasteData>();
202     std::vector<std::shared_ptr<PasteDataRecord>> pasteDataRecords = pasteData->AllRecords();
203     EXPECT_EQ(*(pasteDataRecords[pasteData->GetRecordCount() - 1]->GetHtmlText()), *html);
204 
205     newPasteData->AddHtmlRecord(*html);
206     auto newHtmlRecord = newPasteData->GetRecordAt(0);
207     newHtmlRecord->SetFrom(newHtmlRecord->GetRecordId());
208     for (auto i = 0; i < pasteData->GetRecordCount() - 1; i++) {
209         PasteDataRecord::Builder builder(MIMETYPE_TEXT_URI);
210         auto newUri = std::make_shared<OHOS::Uri>(uri);
211         builder.SetUri(newUri);
212         builder.SetCustomData(pasteDataRecords[i]->GetCustomData());
213         auto record = builder.Build();
214         record->SetFrom(newHtmlRecord->GetRecordId());
215         newPasteData->AddRecord(record);
216     }
217     EXPECT_EQ(newPasteData->GetRecordCount(), 3);
218     webClipboardController.MergeExtraUris2Html(*newPasteData);
219     ASSERT_EQ(newPasteData->GetRecordCount(), 1);
220     auto recordGet = newPasteData->GetRecordAt(0);
221     auto newHtmlStr = recordGet->GetHtmlText();
222     ASSERT_NE(newHtmlStr, nullptr);
223     EXPECT_STREQ(newHtmlStr->c_str(), execptHtml);
224 }
225 
226 /**
227  * @tc.name: SplitHtmlTest_007.
228  * @tc.desc: Test contains invalid protocol image link HTML with SplitHtml.
229  * @tc.type: FUNC.
230  * @tc.require:
231  * @tc.author:
232  */
233 HWTEST_F(WebControllerTest, SplitHtmlTest_007, TestSize.Level1)
234 {
235     auto webClipboardController = PasteboardWebController::GetInstance();
236     std::shared_ptr<std::string> html(
237         new std::string("<img data-ohos='clipboard' src='xxx://file1.jpg'><img data-ohos='clipboard' "
238                         "src='yyy://data/storage/el2/distributedfiles/202305301.png'>"));
239     auto records = webClipboardController.SplitHtml2Records(html, 1);
240     EXPECT_EQ(records.size(), 0);
241 }
242 
243 /**
244  * @tc.name: RebuildHtmlTest_008.
245  * @tc.desc: Test contains invalid protocol image link HTML with RebuildHtml.
246  * @tc.type: FUNC.
247  * @tc.require:
248  * @tc.author:
249  */
250 HWTEST_F(WebControllerTest, RebuildHtmlTest_008, TestSize.Level1)
251 {
252     auto webClipboardController = PasteboardWebController::GetInstance();
253     std::shared_ptr<std::string> html(
254         new std::string("<img data-ohos='clipboard' src='xxx://file1.jpg'><img data-ohos='clipboard' "
255                         "src='ttt://data/storage/el2/distributedfiles/202305301.png'>"));
256     auto pasteData = PasteboardClient::GetInstance()->CreateHtmlData(*html);
257     EXPECT_EQ(pasteData->GetRecordCount(), 1);
258     std::shared_ptr<std::string> newHtml = webClipboardController.RebuildHtml(pasteData);
259     EXPECT_EQ(*newHtml, *html);
260 }
261 
262 /**
263  * @tc.name: RebuildHtmlTest_009.
264  * @tc.desc: Test contains a local image address HTML with RebuildHtml.
265  * @tc.type: FUNC.
266  * @tc.require:
267  * @tc.author:
268  */
269 HWTEST_F(WebControllerTest, RebuildHtmlTest_009, TestSize.Level1)
270 {
271     const std::string uri = "file:///data/storage/el2/distributedfiles/temp.png";
272     auto webClipboardController = PasteboardWebController::GetInstance();
273     std::shared_ptr<std::string> html(
274         new std::string("<img src='file:///file1.jpg'><img src=\"file2.jpg\"><img "
275                         "src='https://data/storage/el2/distributedfiles/202305301.png'>"));
276     const char* execptHtml =
277         "<img src='file:///data/storage/el2/distributedfiles/temp.png'><img "
278         ""
279         "src=\"file:///data/storage/el2/distributedfiles/temp.png\"><img "
280         "src='https://data/storage/el2/distributedfiles/202305301.png'>";
281     auto pasteData = PasteboardClient::GetInstance()->CreateHtmlData(*html);
282     auto htmlRecord = pasteData->GetRecordAt(0);
283     htmlRecord->SetFrom(htmlRecord->GetRecordId());
284     auto records = webClipboardController.SplitHtml2Records(html, htmlRecord->GetRecordId());
285     EXPECT_EQ(records.size(), 2);
286     pasteData->AddRecord(records[0]);
287     pasteData->AddRecord(records[1]);
288 
289     std::shared_ptr<PasteData> newPasteData = std::make_shared<PasteData>();
290     std::vector<std::shared_ptr<PasteDataRecord>> pasteDataRecords = pasteData->AllRecords();
291     EXPECT_EQ(*(pasteDataRecords[pasteData->GetRecordCount() - 1]->GetHtmlText()), *html);
292 
293     newPasteData->AddHtmlRecord(*html);
294     for (auto i = 0; i < pasteData->GetRecordCount() - 1; i++) {
295         PasteDataRecord::Builder builder(MIMETYPE_TEXT_URI);
296         auto newUri = std::make_shared<OHOS::Uri>(uri);
297         builder.SetUri(newUri);
298         builder.SetCustomData(pasteDataRecords[i]->GetCustomData());
299         auto record = builder.Build();
300         newPasteData->AddRecord(record);
301     }
302     EXPECT_EQ(newPasteData->GetRecordCount(), 3);
303     std::shared_ptr<std::string> newHtml = webClipboardController.RebuildHtml(newPasteData);
304     EXPECT_EQ(newPasteData->GetRecordCount(), 1);
305     const char* newHtmlStr = newHtml.get()->c_str();
306     EXPECT_STREQ(newHtmlStr, execptHtml);
307 }
308 
309 /**
310  * @tc.name: RebuildHtmlTest_010.
311  * @tc.desc: Test contains a local image address HTML with MergeExtraUris2Html.
312  * @tc.type: FUNC.
313  * @tc.require:
314  * @tc.author:
315  */
316 HWTEST_F(WebControllerTest, RebuildHtmlTest_010, TestSize.Level1)
317 {
318     const std::string uri = "file:///data/storage/el2/distributedfiles/temp.png";
319     auto webClipboardController = PasteboardWebController::GetInstance();
320     std::shared_ptr<std::string> html(
321             new std::string("<img src='file:///file1.jpg'><img src=\"file2.jpg\"><img "
322                             "src='https://data/storage/el2/distributedfiles/202305301.png'>"));
323     const char* execptHtml =
324             "<img src='file:///data/storage/el2/distributedfiles/temp.png'><img "
325             "src=\"file:///data/storage/el2/distributedfiles/temp.png\"><img "
326             "src='https://data/storage/el2/distributedfiles/202305301.png'>";
327     auto pasteData = PasteboardClient::GetInstance()->CreateHtmlData(*html);
328     auto htmlRecord = pasteData->GetRecordAt(0);
329     htmlRecord->SetFrom(htmlRecord->GetRecordId());
330     auto records = webClipboardController.SplitHtml2Records(html, htmlRecord->GetRecordId());
331     ASSERT_EQ(records.size(), 2);
332     EXPECT_EQ(records[0]->GetFrom(), htmlRecord->GetRecordId());
333     pasteData->AddRecord(records[0]);
334     pasteData->AddRecord(records[1]);
335 
336     std::shared_ptr<PasteData> newPasteData = std::make_shared<PasteData>();
337     std::vector<std::shared_ptr<PasteDataRecord>> pasteDataRecords = pasteData->AllRecords();
338     EXPECT_EQ(*(pasteDataRecords[pasteData->GetRecordCount() - 1]->GetHtmlText()), *html);
339 
340     newPasteData->AddHtmlRecord(*html);
341     auto newHtmlRecord = newPasteData->GetRecordAt(0);
342     newHtmlRecord->SetFrom(newHtmlRecord->GetRecordId());
343     for (auto i = 0; i < pasteData->GetRecordCount() - 1; i++) {
344         PasteDataRecord::Builder builder(MIMETYPE_TEXT_URI);
345         auto newUri = std::make_shared<OHOS::Uri>(uri);
346         builder.SetUri(newUri);
347         builder.SetCustomData(pasteDataRecords[i]->GetCustomData());
348         auto record = builder.Build();
349         record->SetFrom(newHtmlRecord->GetRecordId());
350         newPasteData->AddRecord(record);
351     }
352     EXPECT_EQ(newPasteData->GetRecordCount(), 3);
353     webClipboardController.MergeExtraUris2Html(*newPasteData);
354 
355     ASSERT_EQ(newPasteData->GetRecordCount(), 1);
356     auto recordGet = newPasteData->GetRecordAt(0);
357     auto newHtmlStr = recordGet->GetHtmlText();
358     ASSERT_NE(newHtmlStr, nullptr);
359     EXPECT_STREQ(newHtmlStr->c_str(), execptHtml);
360 }