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