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 <fcntl.h>
16 #include <gtest/gtest.h>
17 #include "display.h"
18 #include "display_manager.h"
19 #include "snapshot_utils.h"
20 #include "common_test_utils.h"
21
22 using namespace testing;
23 using namespace testing::ext;
24
25 namespace OHOS {
26 namespace Rosen {
27 namespace {
28 constexpr int BPP = 4;
29 }
30 class SnapshotUtilsTest : public testing::Test {
31 public:
32 static void SetUpTestCase();
33 static void TearDownTestCase();
34 virtual void SetUp() override;
35 virtual void TearDown() override;
36 const std::string defaultFile_ = "/data/snapshot_display_1.jpeg";
37 const int defaultBitDepth_ = 8;
38 };
39
SetUpTestCase()40 void SnapshotUtilsTest::SetUpTestCase()
41 {
42 CommonTestUtils::InjectTokenInfoByHapName(0, "com.ohos.systemui", 0);
43 const char** perms = new const char *[1];
44 perms[0] = "ohos.permission.CAPTURE_SCREEN";
45 CommonTestUtils::SetAceessTokenPermission("DisplayManagerServiceTest", perms, 1);
46 }
47
TearDownTestCase()48 void SnapshotUtilsTest::TearDownTestCase()
49 {
50 }
51
SetUp()52 void SnapshotUtilsTest::SetUp()
53 {
54 }
55
TearDown()56 void SnapshotUtilsTest::TearDown()
57 {
58 }
59
60 namespace {
61 /**
62 * @tc.name: Check01
63 * @tc.desc: Check if default jpeg is valid file names
64 * @tc.type: FUNC
65 */
66 HWTEST_F(SnapshotUtilsTest, Check01, Function | SmallTest | Level3)
67 {
68 ASSERT_EQ(true, SnapShotUtils::CheckFileNameValid(defaultFile_));
69 }
70
71 /**
72 * @tc.name: Check02
73 * @tc.desc: Check custom jpeg is valid file names
74 * @tc.type: FUNC
75 */
76 HWTEST_F(SnapshotUtilsTest, Check02, Function | SmallTest | Level3)
77 {
78 std::string fileName = "/data/test.jpeg";
79 ASSERT_EQ(true, SnapShotUtils::CheckFileNameValid(fileName));
80 }
81
82 /**
83 * @tc.name: Check03
84 * @tc.desc: Check random path is invalid file names
85 * @tc.type: FUNC
86 */
87 HWTEST_F(SnapshotUtilsTest, Check03, Function | SmallTest | Level3)
88 {
89 std::string fileName1 = "/path/to/test/1.jpeg";
90 ASSERT_EQ(false, SnapShotUtils::CheckFileNameValid(fileName1));
91 std::string fileName2 = "";
92 ASSERT_EQ(false, SnapShotUtils::CheckFileNameValid(fileName2));
93 std::string fileName3 = "/data/test.png";
94 ASSERT_EQ(false, SnapShotUtils::CheckFileNameValid(fileName3));
95 }
96
97 /**
98 * @tc.name: RGBA8888ToRGB88801
99 * @tc.desc: RGBA8888 to RGB888 using invalid params
100 * @tc.type: FUNC
101 */
102 HWTEST_F(SnapshotUtilsTest, RGBA8888ToRGB88801, Function | SmallTest | Level3)
103 {
104 ASSERT_FALSE(SnapShotUtils::RGBA8888ToRGB888(nullptr, nullptr, -1));
105 }
106
107 /**
108 * @tc.name: WriteRgb888ToJpeg01
109 * @tc.desc: write rgb888 to jpeg using invalid data
110 * @tc.type: FUNC
111 */
112 HWTEST_F(SnapshotUtilsTest, WriteRgb888ToJpeg01, Function | SmallTest | Level3)
113 {
114 uint8_t *data = nullptr;
115 FILE *file = fopen(defaultFile_.c_str(), "wb");
116 if (file == nullptr) {
117 return;
118 }
119 ASSERT_FALSE(SnapShotUtils::WriteRgb888ToJpeg(file, 100, 100, data));
120 fclose(file);
121 }
122
123 /**
124 * @tc.name: WriteRgb888ToJpeg02
125 * @tc.desc: write rgb888 to jpeg using invalid file
126 * @tc.type: FUNC
127 */
128 HWTEST_F(SnapshotUtilsTest, WriteRgb888ToJpeg02, Function | SmallTest | Level3)
129 {
130 uint8_t *data = new uint8_t;
131 FILE *file = nullptr;
132 ASSERT_FALSE(SnapShotUtils::WriteRgb888ToJpeg(file, 100, 100, data));
133 }
134
135 /**
136 * @tc.name: Write01
137 * @tc.desc: Write default jpeg using valid file names and valid PixelMap
138 * @tc.type: FUNC
139 */
140 HWTEST_F(SnapshotUtilsTest, Write01, Function | MediumTest | Level3)
141 {
142 DisplayId id = DisplayManager::GetInstance().GetDefaultDisplayId();
143 std::shared_ptr<Media::PixelMap> pixelMap = DisplayManager::GetInstance().GetScreenshot(id);
144 ASSERT_NE(nullptr, pixelMap);
145 ASSERT_EQ(true, SnapShotUtils::WriteToJpegWithPixelMap(defaultFile_, *pixelMap));
146 }
147
148 /**
149 * @tc.name: Write02
150 * @tc.desc: Write default jpeg using valid file names and valid WriteToJpegParam
151 * @tc.type: FUNC
152 */
153 HWTEST_F(SnapshotUtilsTest, Write02, Function | MediumTest | Level3)
154 {
155 DisplayId id = DisplayManager::GetInstance().GetDefaultDisplayId();
156 std::shared_ptr<Media::PixelMap> pixelMap = DisplayManager::GetInstance().GetScreenshot(id);
157 ASSERT_NE(nullptr, pixelMap);
158 WriteToJpegParam param = {
159 .width = pixelMap->GetWidth(),
160 .height = pixelMap->GetHeight(),
161 .stride = pixelMap->GetRowBytes(),
162 .format = pixelMap->GetPixelFormat(),
163 .data = pixelMap->GetPixels()
164 };
165 ASSERT_EQ(true, SnapShotUtils::WriteToJpeg(defaultFile_, param));
166 }
167
168 /**
169 * @tc.name: Write03
170 * @tc.desc: Write custom jpeg using valid file names and valid WriteToJpegParam
171 * @tc.type: FUNC
172 */
173 HWTEST_F(SnapshotUtilsTest, Write03, Function | MediumTest | Level3)
174 {
175 DisplayId id = DisplayManager::GetInstance().GetDefaultDisplayId();
176 std::shared_ptr<Media::PixelMap> pixelMap = DisplayManager::GetInstance().GetScreenshot(id);
177 ASSERT_NE(nullptr, pixelMap);
178 WriteToJpegParam param = {
179 .width = (pixelMap->GetWidth() / 2),
180 .height = (pixelMap->GetWidth() / 2),
181 .stride = pixelMap->GetRowBytes(),
182 .format = pixelMap->GetPixelFormat(),
183 .data = pixelMap->GetPixels()
184 };
185 ASSERT_EQ(false, SnapShotUtils::WriteToJpeg(defaultFile_, param));
186 }
187
188 /**
189 * @tc.name: Write04
190 * @tc.desc: Write pixel map with jpeg, using fd
191 * @tc.type: FUNC
192 */
193 HWTEST_F(SnapshotUtilsTest, Write04, Function | MediumTest | Level3)
194 {
195 DisplayId id = DisplayManager::GetInstance().GetDefaultDisplayId();
196 std::shared_ptr<Media::PixelMap> pixelMap = DisplayManager::GetInstance().GetScreenshot(id);
197 int fd = open(defaultFile_.c_str(), O_RDWR | O_CREAT | O_TRUNC, 0666);
198 if (fd == -1) {
199 return;
200 }
201 ASSERT_EQ(true, SnapShotUtils::WriteToJpegWithPixelMap(fd, *pixelMap));
202 close(fd);
203 }
204
205 /**
206 * @tc.name: Write05
207 * @tc.desc: Write custom jpeg using invalid file names and valid WriteToJpegParam
208 * @tc.type: FUNC
209 */
210 HWTEST_F(SnapshotUtilsTest, Write05, Function | MediumTest | Level3)
211 {
212 WriteToJpegParam param = {
213 .width = 256,
214 .height = 256,
215 .stride = 256 * BPP,
216 .format = Media::PixelFormat::UNKNOWN,
217 .data = new uint8_t
218 };
219 ASSERT_FALSE(SnapShotUtils::WriteToJpeg("", param));
220 }
221
222 /**
223 * @tc.name: Write06
224 * @tc.desc: Write custom jpeg using valid file names and invalid WriteToJpegParam
225 * @tc.type: FUNC
226 */
227 HWTEST_F(SnapshotUtilsTest, Write06, Function | MediumTest | Level3)
228 {
229 WriteToJpegParam param = {
230 .width = 256,
231 .height = 256,
232 .stride = 256 * BPP,
233 .format = Media::PixelFormat::UNKNOWN,
234 .data = nullptr
235 };
236 ASSERT_FALSE(SnapShotUtils::WriteToJpeg(defaultFile_, param));
237 }
238
239 /**
240 * @tc.name: Write07
241 * @tc.desc: Write custom jpeg using valid fd and invalid WriteToJpegParam
242 * @tc.type: FUNC
243 */
244 HWTEST_F(SnapshotUtilsTest, Write07, Function | MediumTest | Level3)
245 {
246 WriteToJpegParam param = {
247 .width = 256,
248 .height = 256,
249 .stride = 256 * BPP,
250 .format = Media::PixelFormat::UNKNOWN,
251 .data = nullptr
252 };
253 ASSERT_FALSE(SnapShotUtils::WriteToJpeg(1, param));
254 }
255
256 /**
257 * @tc.name: CheckWHValid
258 * @tc.desc: Check width and height whether valid
259 * @tc.type: FUNC
260 */
261 HWTEST_F(SnapshotUtilsTest, CheckWHValid, Function | SmallTest | Level3)
262 {
263 ASSERT_EQ(false, SnapShotUtils::CheckWHValid(0));
264 ASSERT_EQ(true, SnapShotUtils::CheckWHValid(DisplayManager::MAX_RESOLUTION_SIZE_SCREENSHOT));
265 ASSERT_EQ(false, SnapShotUtils::CheckWHValid(DisplayManager::MAX_RESOLUTION_SIZE_SCREENSHOT + 1));
266 }
267
268 /**
269 * @tc.name: CheckParamValid01
270 * @tc.desc: Check jpeg param whether valid width
271 * @tc.type: FUNC
272 */
273 HWTEST_F(SnapshotUtilsTest, CheckParamValid01, Function | SmallTest | Level3)
274 {
275 WriteToJpegParam paramInvalidWidth = {
276 .width = DisplayManager::MAX_RESOLUTION_SIZE_SCREENSHOT + 1,
277 .height = 0,
278 .stride = 0,
279 .format = Media::PixelFormat::UNKNOWN,
280 .data = nullptr
281 };
282 ASSERT_EQ(false, SnapShotUtils::CheckParamValid(paramInvalidWidth));
283 }
284
285 /**
286 * @tc.name: CheckParamValid02
287 * @tc.desc: Check jpeg param whether valid height
288 * @tc.type: FUNC
289 */
290 HWTEST_F(SnapshotUtilsTest, CheckParamValid02, Function | SmallTest | Level3)
291 {
292 WriteToJpegParam paramInvalidHeight = {
293 .width = DisplayManager::MAX_RESOLUTION_SIZE_SCREENSHOT,
294 .height = 0,
295 .stride = 0,
296 .format = Media::PixelFormat::UNKNOWN,
297 .data = nullptr
298 };
299 ASSERT_EQ(false, SnapShotUtils::CheckParamValid(paramInvalidHeight));
300 }
301
302 /**
303 * @tc.name: CheckParamValid03
304 * @tc.desc: Check jpeg param whether valid stride
305 * @tc.type: FUNC
306 */
307 HWTEST_F(SnapshotUtilsTest, CheckParamValid03, Function | SmallTest | Level3)
308 {
309 WriteToJpegParam paramInvalidStride = {
310 .width = 256,
311 .height = 256,
312 .stride = 1,
313 .format = Media::PixelFormat::UNKNOWN,
314 .data = nullptr
315 };
316 ASSERT_EQ(false, SnapShotUtils::CheckParamValid(paramInvalidStride));
317 }
318
319 /**
320 * @tc.name: CheckParamValid04
321 * @tc.desc: Check jpeg param whether valid data
322 * @tc.type: FUNC
323 */
324 HWTEST_F(SnapshotUtilsTest, CheckParamValid04, Function | SmallTest | Level3)
325 {
326 WriteToJpegParam paramInvalidData = {
327 .width = 256,
328 .height = 256,
329 .stride = 256 * BPP,
330 .format = Media::PixelFormat::UNKNOWN,
331 .data = nullptr
332 };
333 ASSERT_EQ(false, SnapShotUtils::CheckParamValid(paramInvalidData));
334 }
335 }
336 } // namespace Rosen
337 } // namespace OHOS