1 /*
2 * Copyright (c) 2022 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 #include <gmock/gmock.h>
16 #include <gtest/gtest.h>
17
18 #include "copy_uri_handler.h"
19 #include "paste_uri_handler.h"
20 #include "pasteboard_client.h"
21 namespace OHOS::MiscServices {
22 using namespace testing::ext;
23 using namespace testing;
24 using namespace OHOS::AAFwk;
25 using namespace OHOS::Media;
26 constexpr const int32_t INVALID_FD = -1;
27 constexpr const char *FILE_URI = "/data/test/resource/pasteboardTest.txt";
28 class PasteDataTest : public testing::Test {
29 public:
30 static void SetUpTestCase(void);
31 static void TearDownTestCase(void);
32 void SetUp();
33 void TearDown();
34 };
35
SetUpTestCase(void)36 void PasteDataTest::SetUpTestCase(void)
37 {
38 }
39
TearDownTestCase(void)40 void PasteDataTest::TearDownTestCase(void)
41 {
42 }
43
SetUp(void)44 void PasteDataTest::SetUp(void)
45 {
46 }
47
TearDown(void)48 void PasteDataTest::TearDown(void)
49 {
50 }
51
52 class UriHandlerMock : public UriHandler {
53 public:
54 UriHandlerMock() = default;
55 virtual ~UriHandlerMock() = default;
56
57 MOCK_METHOD1(ToUri, std::string(int32_t fd));
58 MOCK_METHOD2(ToFd, int32_t(const std::string &uri, bool isClient));
59 MOCK_CONST_METHOD1(IsFile, bool(const std::string &uri));
60 };
61 /**
62 * @tc.name: ReplaceShareUri001
63 * @tc.desc: replace user id in share path
64 * @tc.type: FUNC
65 * @tc.require:AR000H5I1D
66 * @tc.author: baoyayong
67 */
68 HWTEST_F(PasteDataTest, ReplaceShareUri001, TestSize.Level0)
69 {
70 PasteData data;
71 PasteDataRecord::Builder builder(MIMETYPE_TEXT_URI);
72 std::string uriStr = "/data/storage/100/haps/caches/xxx.txt";
73 auto uri = std::make_shared<OHOS::Uri>(uriStr);
74 builder.SetUri(uri);
75 auto record = builder.Build();
76
77 // mock
78 UriHandlerMock mock;
79 std::string mockUri = "/mnt/hmdfs/100/account/merge_view/services/psteboard_service/.share/xxx.txt";
80 EXPECT_CALL(mock, ToUri(_)).WillRepeatedly(Return(mockUri));
81 EXPECT_CALL(mock, ToFd(_, _)).WillRepeatedly(Return(2));
82 EXPECT_CALL(mock, IsFile(_)).WillRepeatedly(Return(true));
83
84 data.AddRecord(record);
85 MessageParcel parcel;
86 data.WriteUriFd(parcel, mock);
87 bool result = data.ReadUriFd(parcel, mock);
88 EXPECT_TRUE(result);
89 EXPECT_EQ(mockUri, data.GetPrimaryUri()->ToString());
90 data.ReplaceShareUri(200);
91 std::string mockUri2 = "/mnt/hmdfs/200/account/merge_view/services/psteboard_service/.share/xxx.txt";
92 EXPECT_EQ(mockUri2, data.GetPrimaryUri()->ToString());
93 }
94 /**
95 * @tc.name: uriConvertTest001
96 * @tc.desc: uri convert(in same app)
97 * @tc.type: FUNC
98 * @tc.require:AR000H5I1D
99 * @tc.author: chenyu
100 */
101 HWTEST_F(PasteDataTest, uriConvertTest001, TestSize.Level0)
102 {
103 PasteData data;
104 PasteDataRecord::Builder builder(MIMETYPE_TEXT_URI);
105 std::string uriStr = FILE_URI;
106 auto uri = std::make_shared<OHOS::Uri>(uriStr);
107 builder.SetUri(uri);
108 auto record = builder.Build();
109 data.AddRecord(record);
110
111 MessageParcel parcel;
112 CopyUriHandler copyHandler;
113 data.WriteUriFd(parcel, copyHandler);
114 bool result = data.ReadUriFd(parcel, copyHandler);
115 EXPECT_TRUE(result);
116 auto distributedUri = data.GetPrimaryUri()->ToString();
117 EXPECT_FALSE(uriStr == distributedUri);
118
119 MessageParcel parcel1;
120 PasteUriHandler pasteHandler;
121 int32_t fd = 5;
122 pasteHandler.ToUri(fd);
123
124 data.SetLocalPasteFlag(true);
125 data.WriteUriFd(parcel1, pasteHandler);
126 result = data.ReadUriFd(parcel1, pasteHandler);
127 EXPECT_TRUE(result);
128 ASSERT_TRUE(data.GetPrimaryUri() != nullptr);
129 auto convertedUri = data.GetPrimaryUri()->ToString();
130 EXPECT_EQ(distributedUri, convertedUri);
131 EXPECT_FALSE(uriStr == convertedUri);
132 }
133
134 /**
135 * @tc.name: GetRealPathFailed001
136 * @tc.desc: GetRealPath Failed(realpath(inOriPath.c_str(), realPath) == nullptr)
137 * @tc.type: FUNC
138 * @tc.require: issuesI5Y6PO
139 * @tc.author: chenyu
140 */
141 HWTEST_F(PasteDataTest, GetRealPathFailed001, TestSize.Level0)
142 {
143 std::string uriStr = "/data/storage/100/haps/caches/xxx.txt";
144 PasteUriHandler pasteHandler;
145 auto ret = pasteHandler.ToFd(uriStr, true);
146 EXPECT_EQ(ret, INVALID_FD);
147 }
148
149 /**
150 * @tc.name: GetRealPathFailed002
151 * @tc.desc: GetRealPath Failed(inOriPath.size() > PATH_MAX)
152 * @tc.type: FUNC
153 * @tc.require: issuesI5Y6PO
154 * @tc.author: chenyu
155 */
156 HWTEST_F(PasteDataTest, GetRealPathFailed002, TestSize.Level0)
157 {
158 std::string uriStr(PATH_MAX + 2, '*');
159 PasteUriHandler pasteHandler;
160 auto ret = pasteHandler.ToFd(uriStr, true);
161 EXPECT_EQ(ret, INVALID_FD);
162 }
163
164 /**
165 * @tc.name: PasteDataMarshallingUnMarshalling001
166 * @tc.desc: PasteData: Marshalling unMarshalling
167 * @tc.type: FUNC
168 * @tc.require: AROOOH5R5G
169 * @tc.author: chenyu
170 */
171 HWTEST_F(PasteDataTest, PasteDataMarshallingUnMarshalling001, TestSize.Level0)
172 {
173 std::string htmlText = "<div class='disabled item tip user-programs'>";
174 auto pasteData = PasteboardClient::GetInstance()->CreateHtmlData(htmlText);
175 Parcel parcel;
176 auto ret = pasteData->Marshalling(parcel);
177 ASSERT_TRUE(ret);
178 std::shared_ptr<PasteData> pasteData1(pasteData->Unmarshalling(parcel));
179 ASSERT_TRUE(pasteData1 != nullptr);
180 auto html = pasteData1->GetPrimaryHtml();
181 ASSERT_TRUE(html != nullptr);
182 EXPECT_EQ(*html, htmlText);
183 }
184
185 /**
186 * @tc.name: PasteDataRecordMarshallingUnMarshalling001
187 * @tc.desc: PasteDataRecord: Marshalling unMarshalling
188 * @tc.type: FUNC
189 * @tc.require: AROOOH5R5G
190 * @tc.author: chenyu
191 */
192 HWTEST_F(PasteDataTest, PasteDataRecordMarshallingUnMarshalling001, TestSize.Level0)
193 {
194 std::shared_ptr<OHOS::AAFwk::Want> want = std::make_shared<OHOS::AAFwk::Want>();
195 std::string key = "id";
196 int32_t id = 456;
197 Want wantIn = want->SetParam(key, id);
198 auto record = PasteboardClient::GetInstance()->CreateWantRecord(want);
199 ASSERT_TRUE(record != nullptr);
200 Parcel parcel;
201 auto ret = record->Marshalling(parcel);
202 ASSERT_TRUE(ret);
203 std::shared_ptr<PasteDataRecord> record1(record->Unmarshalling(parcel));
204 ASSERT_TRUE(record1 != nullptr);
205 auto newWant = record->GetWant();
206 ASSERT_TRUE(newWant != nullptr);
207 int32_t defaultValue = 333;
208 EXPECT_EQ(newWant->GetIntParam(key, defaultValue), id);
209 }
210
211 /**
212 * @tc.name: ConvertToText001
213 * @tc.desc: PasteDataRecord: ConvertToText
214 * @tc.type: FUNC
215 * @tc.require: AR000HEECD
216 * @tc.author: chenyu
217 */
218 HWTEST_F(PasteDataTest, ConvertToText001, TestSize.Level0)
219 {
220 std::string htmlText = "<div class='disabled item tip user-programs'>";
221 auto record = PasteboardClient::GetInstance()->CreateHtmlTextRecord(htmlText);
222 ASSERT_TRUE(record != nullptr);
223 auto text = record->ConvertToText();
224 EXPECT_EQ(text, htmlText);
225 }
226 } // namespace OHOS::MiscServices