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 16 #include <gtest/gtest.h> 17 18 #include "surface_draw.h" 19 #include "display.h" 20 #include "display_info.h" 21 #include "display_manager.h" 22 #include "display_manager_proxy.h" 23 #include "window_impl.h" 24 25 using namespace testing; 26 using namespace testing::ext; 27 28 namespace OHOS { 29 namespace Rosen { 30 namespace { 31 const std::string IMAGE_PLACE_HOLDER_PNG_PATH = "/etc/window/resources/bg_place_holder.png"; 32 const int WAIT_FOR_SYNC_US = 1000 * 500; // 500ms 33 } 34 class SurfaceDrawTest : public testing::Test { 35 public: 36 static void SetUpTestCase(); 37 static void TearDownTestCase(); 38 void SetUp() override; 39 void TearDown() override; 40 41 public: 42 struct WindowTestInfo { 43 std::string name; 44 Rect rect; 45 WindowType type; 46 WindowMode mode; 47 bool needAvoid; 48 bool parentLimit; 49 bool forbidSplitMove {false}; 50 bool showWhenLocked; 51 uint32_t parentId; 52 }; 53 sptr<Window> CreateTestWindow(const std::string& name); 54 55 static inline DisplayId displayId_; 56 static inline int32_t displayWidth_; 57 static inline int32_t displayHeight_; 58 WindowTestInfo windowInfo_; 59 }; 60 SetUpTestCase()61 void SurfaceDrawTest::SetUpTestCase() 62 { 63 displayId_ = DisplayManager::GetInstance().GetDefaultDisplayId(); 64 sptr<Display> display = DisplayManager::GetInstance().GetDefaultDisplay(); 65 if (display == nullptr) { 66 return; 67 } 68 displayWidth_ = display->GetWidth(); 69 displayHeight_ = display->GetHeight(); 70 } 71 TearDownTestCase()72 void SurfaceDrawTest::TearDownTestCase() 73 { 74 } 75 SetUp()76 void SurfaceDrawTest::SetUp() 77 { 78 windowInfo_ = { 79 .name = "main", 80 .rect = {100, 100, 250, 300}, 81 .type = WindowType::WINDOW_TYPE_APP_MAIN_WINDOW, 82 .mode = WindowMode::WINDOW_MODE_FLOATING, 83 .needAvoid = true, 84 .parentLimit = false, 85 .parentId = INVALID_WINDOW_ID, 86 }; 87 } 88 TearDown()89 void SurfaceDrawTest::TearDown() 90 { 91 } 92 CreateTestWindow(const std::string & name)93 sptr<Window> SurfaceDrawTest::CreateTestWindow(const std::string& name) 94 { 95 sptr<WindowOption> option = new (std::nothrow)WindowOption(); 96 if (option == nullptr) { 97 return nullptr; 98 } 99 option->SetDisplayId(displayId_); 100 option->SetWindowType(windowInfo_.type); 101 option->SetWindowRect(windowInfo_.rect); 102 option->SetWindowMode(windowInfo_.mode); 103 option->SetWindowName(name); 104 sptr<Window> window = Window::Create(option->GetWindowName(), option); 105 if (window == nullptr) { 106 return nullptr; 107 } 108 window->AddWindowFlag(WindowFlag::WINDOW_FLAG_SHOW_WHEN_LOCKED); 109 return window; 110 } 111 112 namespace { 113 /** 114 * @tc.name: DrawImage 115 * @tc.desc: SurfaceDraw::DrawImage test 116 * @tc.type: FUNC 117 */ 118 HWTEST_F(SurfaceDrawTest, DrawImage01, Function | SmallTest | Level1) 119 { 120 ASSERT_FALSE(SurfaceDraw::DrawImage(nullptr, 0, 0, "")); 121 sptr<Window> window = CreateTestWindow("testDrawImage"); 122 if (window == nullptr) { 123 return; 124 } 125 ASSERT_NE(nullptr, window); 126 window->Show(); 127 usleep(WAIT_FOR_SYNC_US / 20); // wait for rect updated 128 129 auto surfaceNode = window->GetSurfaceNode(); 130 ASSERT_NE(surfaceNode, nullptr); 131 usleep(WAIT_FOR_SYNC_US / 20); // wait for rect updated 132 uint32_t width = window->GetRect().width_; 133 uint32_t height = window->GetRect().height_; 134 SurfaceDraw::DrawImage(surfaceNode, width, height, IMAGE_PLACE_HOLDER_PNG_PATH); 135 ASSERT_FALSE(SurfaceDraw::DrawImage(surfaceNode, -1, -1, IMAGE_PLACE_HOLDER_PNG_PATH)); 136 window->Destroy(); 137 } 138 /** 139 * @tc.name: DecodeImageToPixelMap 140 * @tc.desc: SurfaceDraw::DecodeImageToPixelMap test 141 * @tc.type: FUNC 142 */ 143 HWTEST_F(SurfaceDrawTest, DecodeImageToPixelMap01, Function | SmallTest | Level1) 144 { 145 ASSERT_EQ(SurfaceDraw::DecodeImageToPixelMap(""), nullptr); 146 ASSERT_NE(SurfaceDraw::DecodeImageToPixelMap(IMAGE_PLACE_HOLDER_PNG_PATH), nullptr); 147 } 148 /** 149 * @tc.name: DrawMasking 150 * @tc.desc: SurfaceDraw::DrawMasking test 151 * @tc.type: FUNC 152 */ 153 HWTEST_F(SurfaceDrawTest, DrawMasking01, Function | SmallTest | Level1) 154 { 155 OHOS::Rosen::Rect screenRect = {0, 0, 0, 0}; 156 OHOS::Rosen::Rect transRect = {0, 0, 0, 0}; 157 ASSERT_FALSE(SurfaceDraw::DrawMasking(nullptr, screenRect, transRect)); 158 159 sptr<Window> window = CreateTestWindow("testDrawMasking"); 160 if (window == nullptr) { 161 return; 162 } 163 ASSERT_NE(nullptr, window); 164 window->Show(); 165 usleep(WAIT_FOR_SYNC_US / 20); // wait for rect updated 166 167 auto surfaceNode = window->GetSurfaceNode(); 168 ASSERT_NE(surfaceNode, nullptr); 169 ASSERT_FALSE(SurfaceDraw::DrawMasking(surfaceNode, screenRect, transRect)); 170 171 screenRect.width_ = displayWidth_; 172 screenRect.height_ = displayHeight_; 173 transRect.width_ = displayWidth_; 174 transRect.height_ = displayHeight_; 175 SurfaceDraw::DrawMasking(surfaceNode, screenRect, transRect); 176 window->Destroy(); 177 } 178 /** 179 * @tc.name: DoDrawImageRect 180 * @tc.desc: SurfaceDraw::DoDrawImageRect test 181 * @tc.type: FUNC 182 */ 183 HWTEST_F(SurfaceDrawTest, DoDrawImageRect01, Function | SmallTest | Level1) 184 { 185 sptr<Window> window = CreateTestWindow("testDoDrawImageRect"); 186 if (window == nullptr) { 187 return; 188 } 189 ASSERT_NE(window, nullptr); 190 window->Show(); 191 usleep(WAIT_FOR_SYNC_US / 20); // wait for rect updated 192 193 OHOS::Rosen::Rect rect = window->GetRect(); 194 uint32_t color = 0x00660000; 195 196 auto surfaceNode = window->GetSurfaceNode(); 197 ASSERT_NE(surfaceNode, nullptr); 198 sptr<OHOS::Surface> layer = SurfaceDraw::GetLayer(surfaceNode); 199 ASSERT_NE(layer, nullptr); 200 sptr<OHOS::SurfaceBuffer> buffer = SurfaceDraw::GetSurfaceBuffer(layer, rect.width_, rect.height_); 201 if (buffer == nullptr) { 202 return; 203 } 204 205 ASSERT_FALSE(SurfaceDraw::DoDrawImageRect(buffer, rect, nullptr, color, false)); 206 207 std::shared_ptr<Media::PixelMap> pixelMap = SurfaceDraw::DecodeImageToPixelMap(IMAGE_PLACE_HOLDER_PNG_PATH); 208 ASSERT_NE(pixelMap, nullptr); 209 210 ASSERT_TRUE(SurfaceDraw::DoDrawImageRect(buffer, rect, pixelMap, color, false)); 211 window->Destroy(); 212 } 213 /** 214 * @tc.name: GetSurfaceSnapshot 215 * @tc.desc: SurfaceDraw::GetSurfaceSnapshot test 216 * @tc.type: FUNC 217 */ 218 HWTEST_F(SurfaceDrawTest, GetSurfaceSnapshot01, Function | SmallTest | Level1) 219 { 220 sptr<Window> window = CreateTestWindow("testDoDrawImageRect"); 221 if (window == nullptr) { 222 return; 223 } 224 ASSERT_NE(window, nullptr); 225 window->Show(); 226 usleep(WAIT_FOR_SYNC_US / 20); // wait for rect updated 227 228 auto surfaceNode = window->GetSurfaceNode(); 229 ASSERT_NE(surfaceNode, nullptr); 230 231 std::shared_ptr<Media::PixelMap> pixelMap = SurfaceDraw::DecodeImageToPixelMap(IMAGE_PLACE_HOLDER_PNG_PATH); 232 ASSERT_NE(pixelMap, nullptr); 233 234 ASSERT_FALSE(SurfaceDraw::GetSurfaceSnapshot(nullptr, pixelMap, 0, 0, 0)); 235 ASSERT_FALSE(SurfaceDraw::GetSurfaceSnapshot(surfaceNode, pixelMap, 0, 0, 0)); 236 window->Destroy(); 237 } 238 239 /** 240 * @tc.name: DrawColor 241 * @tc.desc: SurfaceDraw::DrawColor test 242 * @tc.type: FUNC 243 */ 244 HWTEST_F(SurfaceDrawTest, DrawColor01, Function | SmallTest | Level1) 245 { 246 ASSERT_FALSE(SurfaceDraw::DrawColor(nullptr, 0, 0, 0)); 247 sptr<Window> window = CreateTestWindow("DrawColor"); 248 if (window == nullptr) { 249 return; 250 } 251 ASSERT_NE(nullptr, window); 252 window->Show(); 253 usleep(WAIT_FOR_SYNC_US / 20); // wait for rect updated 254 auto surfaceNode = window->GetSurfaceNode(); 255 ASSERT_NE(surfaceNode, nullptr); 256 uint32_t width = window->GetRect().width_; 257 uint32_t height = window->GetRect().height_; 258 uint32_t color = 0x00660000; 259 SurfaceDraw::DrawColor(surfaceNode, width, height, color); 260 SurfaceDraw::DrawColor(surfaceNode, -1, -1, color); 261 ASSERT_EQ(WMError::WM_OK, window->Destroy()); 262 } 263 264 /** 265 * @tc.name: DoDraw 266 * @tc.desc: SurfaceDraw::DoDraw test 267 * @tc.type: FUNC 268 */ 269 HWTEST_F(SurfaceDrawTest, DoDraw01, Function | SmallTest | Level1) 270 { 271 sptr<Window> window = CreateTestWindow("DoDrawTest01"); 272 if (window == nullptr) { 273 return; 274 } 275 ASSERT_NE(nullptr, window); 276 window->Show(); 277 usleep(WAIT_FOR_SYNC_US / 20); // wait for rect updated 278 OHOS::Rosen::Rect rect = window->GetRect(); 279 auto surfaceNode = window->GetSurfaceNode(); 280 ASSERT_NE(surfaceNode, nullptr); 281 sptr<OHOS::Surface> layer = SurfaceDraw::GetLayer(surfaceNode); 282 ASSERT_NE(layer, nullptr); 283 sptr<OHOS::SurfaceBuffer> buffer = SurfaceDraw::GetSurfaceBuffer(layer, rect.width_, rect.height_); 284 ASSERT_NE(buffer, nullptr); 285 ASSERT_FALSE(SurfaceDraw::DoDraw(nullptr, 0, 0, "")); 286 window->Destroy(); 287 } 288 289 /** 290 * @tc.name: DoDraw 291 * @tc.desc: SurfaceDraw::DoDraw02 test 292 * @tc.type: FUNC 293 */ 294 HWTEST_F(SurfaceDrawTest, DoDraw02, Function | SmallTest | Level1) 295 { 296 sptr<Window> window = CreateTestWindow("DoDraw02"); 297 if (window == nullptr) { 298 return; 299 } 300 ASSERT_NE(window, nullptr); 301 window->Show(); 302 usleep(WAIT_FOR_SYNC_US / 20); // wait for rect updated 303 OHOS::Rosen::Rect rect = window->GetRect(); 304 auto surfaceNode = window->GetSurfaceNode(); 305 ASSERT_NE(surfaceNode, nullptr); 306 sptr<OHOS::Surface> layer = SurfaceDraw::GetLayer(surfaceNode); 307 ASSERT_NE(layer, nullptr); 308 sptr<OHOS::SurfaceBuffer> buffer = SurfaceDraw::GetSurfaceBuffer(layer, rect.width_, rect.height_); 309 if (buffer == nullptr) { 310 return; 311 } 312 std::shared_ptr<Media::PixelMap> pixelMap = SurfaceDraw::DecodeImageToPixelMap(IMAGE_PLACE_HOLDER_PNG_PATH); 313 ASSERT_NE(pixelMap, nullptr); 314 ASSERT_FALSE(SurfaceDraw::DoDraw(nullptr, 0, 0, pixelMap)); 315 window->Destroy(); 316 } 317 318 /** 319 * @tc.name: DoDraw03 320 * @tc.desc: SurfaceDraw::DoDraw03 test 321 * @tc.type: FUNC 322 */ 323 HWTEST_F(SurfaceDrawTest, DoDraw03, Function | SmallTest | Level1) 324 { 325 sptr<Window> window = CreateTestWindow("DoDrawTest03"); 326 if (window == nullptr) { 327 return; 328 } 329 ASSERT_NE(nullptr, window); 330 window->Show(); 331 usleep(WAIT_FOR_SYNC_US / 20); // wait for rect updated 332 OHOS::Rosen::Rect rect = window->GetRect(); 333 uint32_t color = 0x00660000; 334 auto surfaceNode = window->GetSurfaceNode(); 335 ASSERT_NE(surfaceNode, nullptr); 336 sptr<OHOS::Surface> layer = SurfaceDraw::GetLayer(surfaceNode); 337 ASSERT_NE(layer, nullptr); 338 sptr<OHOS::SurfaceBuffer> buffer = SurfaceDraw::GetSurfaceBuffer(layer, rect.width_, rect.height_); 339 if (buffer == nullptr) { 340 return; 341 } 342 ASSERT_FALSE(SurfaceDraw::DoDraw(nullptr, 0, 0, color)); 343 window->Destroy(); 344 } 345 346 /** 347 * @tc.name: DrawImageRect 348 * @tc.desc: SurfaceDraw::DoDrawImageRect test 349 * @tc.type: FUNC 350 */ 351 HWTEST_F(SurfaceDrawTest, DrawImageRect01, Function | SmallTest | Level1) 352 { 353 sptr<Window> window = CreateTestWindow("DrawImageRect"); 354 if (window == nullptr) { 355 return; 356 } 357 ASSERT_NE(window, nullptr); 358 window->Show(); 359 usleep(WAIT_FOR_SYNC_US / 20); // wait for rect updated 360 OHOS::Rosen::Rect rect = window->GetRect(); 361 uint32_t color = 0x00660000; 362 auto surfaceNode = window->GetSurfaceNode(); 363 ASSERT_NE(surfaceNode, nullptr); 364 ASSERT_FALSE(SurfaceDraw::DrawImageRect(surfaceNode, rect, nullptr, color, false)); 365 std::shared_ptr<Media::PixelMap> pixelMap = SurfaceDraw::DecodeImageToPixelMap(IMAGE_PLACE_HOLDER_PNG_PATH); 366 ASSERT_NE(pixelMap, nullptr); 367 SurfaceDraw::DrawImageRect(surfaceNode, rect, pixelMap, color, false); 368 window->Destroy(); 369 } 370 } 371 } // namespace Rosen 372 } // namespace OHOS