1e0dac50fSopenharmony_ci/* 2e0dac50fSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3e0dac50fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4e0dac50fSopenharmony_ci * you may not use this file except in compliance with the License. 5e0dac50fSopenharmony_ci * You may obtain a copy of the License at 6e0dac50fSopenharmony_ci * 7e0dac50fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8e0dac50fSopenharmony_ci * 9e0dac50fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10e0dac50fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11e0dac50fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12e0dac50fSopenharmony_ci * See the License for the specific language governing permissions and 13e0dac50fSopenharmony_ci * limitations under the License. 14e0dac50fSopenharmony_ci */ 15e0dac50fSopenharmony_ci#include <gtest/gtest.h> 16e0dac50fSopenharmony_ci#include <transaction/rs_transaction.h> 17e0dac50fSopenharmony_ci#include <ui/rs_surface_node.h> 18e0dac50fSopenharmony_ci#include "display_test_utils.h" 19e0dac50fSopenharmony_ci#include "display.h" 20e0dac50fSopenharmony_ci#include "display_manager_proxy.h" 21e0dac50fSopenharmony_ci#include "screen.h" 22e0dac50fSopenharmony_ci#include "surface_draw.h" 23e0dac50fSopenharmony_ci#include "wm_common.h" 24e0dac50fSopenharmony_ci#include "wm_common_inner.h" 25e0dac50fSopenharmony_ci#include "window.h" 26e0dac50fSopenharmony_ci#include "window_option.h" 27e0dac50fSopenharmony_ci#include "window_manager_hilog.h" 28e0dac50fSopenharmony_ci#include "display_manager_agent_controller.h" 29e0dac50fSopenharmony_ci 30e0dac50fSopenharmony_ciusing namespace testing; 31e0dac50fSopenharmony_ciusing namespace testing::ext; 32e0dac50fSopenharmony_ci 33e0dac50fSopenharmony_cinamespace OHOS::Rosen { 34e0dac50fSopenharmony_cinamespace { 35e0dac50fSopenharmony_ciconstexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "DisplayManagerTest"}; 36e0dac50fSopenharmony_ciconst int WAIT_FOR_SYNC_US = 1; // 1s 37e0dac50fSopenharmony_ci} 38e0dac50fSopenharmony_ci 39e0dac50fSopenharmony_ciclass DisplayChangeEventListener : public DisplayManager::IDisplayListener { 40e0dac50fSopenharmony_cipublic: 41e0dac50fSopenharmony_ci virtual void OnCreate(DisplayId displayId) {} 42e0dac50fSopenharmony_ci 43e0dac50fSopenharmony_ci virtual void OnDestroy(DisplayId displayId) {} 44e0dac50fSopenharmony_ci 45e0dac50fSopenharmony_ci virtual void OnChange(DisplayId displayId) {} 46e0dac50fSopenharmony_ci}; 47e0dac50fSopenharmony_ci 48e0dac50fSopenharmony_ciclass DisplayManagerTest : public testing::Test { 49e0dac50fSopenharmony_cipublic: 50e0dac50fSopenharmony_ci static void SetUpTestCase(); 51e0dac50fSopenharmony_ci static void TearDownTestCase(); 52e0dac50fSopenharmony_ci virtual void SetUp() override; 53e0dac50fSopenharmony_ci virtual void TearDown() override; 54e0dac50fSopenharmony_ci 55e0dac50fSopenharmony_ci sptr<Window> CreateWindow(std::string name, WindowMode mode, Rect rect, uint32_t color = 0xff000000); 56e0dac50fSopenharmony_ci bool DrawWindowColor(const sptr<Window>& window, uint32_t color, int32_t width, int32_t height); 57e0dac50fSopenharmony_ci static inline DisplayId displayId_; 58e0dac50fSopenharmony_ci static inline int32_t displayWidth_; 59e0dac50fSopenharmony_ci static inline int32_t displayHeight_; 60e0dac50fSopenharmony_ci}; 61e0dac50fSopenharmony_ci 62e0dac50fSopenharmony_civoid DisplayManagerTest::SetUpTestCase() 63e0dac50fSopenharmony_ci{ 64e0dac50fSopenharmony_ci displayId_ = DisplayManager::GetInstance().GetDefaultDisplayId(); 65e0dac50fSopenharmony_ci sptr<Display> display = DisplayManager::GetInstance().GetDefaultDisplay(); 66e0dac50fSopenharmony_ci if (display == nullptr) { 67e0dac50fSopenharmony_ci return; 68e0dac50fSopenharmony_ci } 69e0dac50fSopenharmony_ci displayWidth_ = display->GetWidth(); 70e0dac50fSopenharmony_ci displayHeight_ = display->GetHeight(); 71e0dac50fSopenharmony_ci} 72e0dac50fSopenharmony_ci 73e0dac50fSopenharmony_civoid DisplayManagerTest::TearDownTestCase() 74e0dac50fSopenharmony_ci{ 75e0dac50fSopenharmony_ci} 76e0dac50fSopenharmony_ci 77e0dac50fSopenharmony_civoid DisplayManagerTest::SetUp() 78e0dac50fSopenharmony_ci{ 79e0dac50fSopenharmony_ci} 80e0dac50fSopenharmony_ci 81e0dac50fSopenharmony_civoid DisplayManagerTest::TearDown() 82e0dac50fSopenharmony_ci{ 83e0dac50fSopenharmony_ci} 84e0dac50fSopenharmony_ci 85e0dac50fSopenharmony_cisptr<Window> DisplayManagerTest::CreateWindow(std::string name, 86e0dac50fSopenharmony_ci WindowMode mode, Rect rect, uint32_t color) 87e0dac50fSopenharmony_ci{ 88e0dac50fSopenharmony_ci sptr<WindowOption> option = new WindowOption(); 89e0dac50fSopenharmony_ci option->SetDisplayId(displayId_); 90e0dac50fSopenharmony_ci option->SetWindowType(WindowType::WINDOW_TYPE_APP_MAIN_WINDOW); 91e0dac50fSopenharmony_ci int32_t width = 0; 92e0dac50fSopenharmony_ci int32_t height = 0; 93e0dac50fSopenharmony_ci if (mode != WindowMode::WINDOW_MODE_FULLSCREEN) { 94e0dac50fSopenharmony_ci option->SetWindowRect(rect); 95e0dac50fSopenharmony_ci } else { 96e0dac50fSopenharmony_ci width = displayWidth_; 97e0dac50fSopenharmony_ci height = displayHeight_; 98e0dac50fSopenharmony_ci } 99e0dac50fSopenharmony_ci option->SetWindowMode(mode); 100e0dac50fSopenharmony_ci option->SetWindowName(name); 101e0dac50fSopenharmony_ci sptr<Window> window = Window::Create(option->GetWindowName(), option); 102e0dac50fSopenharmony_ci if (window == nullptr) { 103e0dac50fSopenharmony_ci return nullptr; 104e0dac50fSopenharmony_ci } 105e0dac50fSopenharmony_ci window->AddWindowFlag(WindowFlag::WINDOW_FLAG_SHOW_WHEN_LOCKED); 106e0dac50fSopenharmony_ci window->Show(); 107e0dac50fSopenharmony_ci sleep(WAIT_FOR_SYNC_US); // wait for rect updated 108e0dac50fSopenharmony_ci width = window->GetRect().width_; 109e0dac50fSopenharmony_ci height = window->GetRect().height_; 110e0dac50fSopenharmony_ci DrawWindowColor(window, color, width, height); // 0x66000000 color_black 111e0dac50fSopenharmony_ci RSTransaction::FlushImplicitTransaction(); 112e0dac50fSopenharmony_ci return window; 113e0dac50fSopenharmony_ci} 114e0dac50fSopenharmony_ci 115e0dac50fSopenharmony_cibool DisplayManagerTest::DrawWindowColor(const sptr<Window>& window, uint32_t color, int32_t width, int32_t height) 116e0dac50fSopenharmony_ci{ 117e0dac50fSopenharmony_ci auto surfaceNode = window->GetSurfaceNode(); 118e0dac50fSopenharmony_ci if (surfaceNode == nullptr) { 119e0dac50fSopenharmony_ci WLOGFE("Failed to GetSurfaceNode!"); 120e0dac50fSopenharmony_ci return false; 121e0dac50fSopenharmony_ci } 122e0dac50fSopenharmony_ci SurfaceDraw::DrawColor(surfaceNode, width, height, color); 123e0dac50fSopenharmony_ci surfaceNode->SetAbilityBGAlpha(255); // 255 is alpha 124e0dac50fSopenharmony_ci return true; 125e0dac50fSopenharmony_ci} 126e0dac50fSopenharmony_ci 127e0dac50fSopenharmony_cinamespace { 128e0dac50fSopenharmony_ci/** 129e0dac50fSopenharmony_ci * @tc.name: HasPrivateWindow 130e0dac50fSopenharmony_ci * @tc.desc: Check whether there is a private window in the current display 131e0dac50fSopenharmony_ci * @tc.type: FUNC 132e0dac50fSopenharmony_ci * @tc.require issueI5HF6V 133e0dac50fSopenharmony_ci */ 134e0dac50fSopenharmony_ciHWTEST_F(DisplayManagerTest, HasPrivateWindow, Function | SmallTest | Level2) 135e0dac50fSopenharmony_ci{ 136e0dac50fSopenharmony_ci sptr<Window> window = CreateWindow("test", WindowMode::WINDOW_MODE_FULLSCREEN, Rect {0, 0, 0, 0}); 137e0dac50fSopenharmony_ci if (window == nullptr) { 138e0dac50fSopenharmony_ci return; 139e0dac50fSopenharmony_ci } 140e0dac50fSopenharmony_ci ASSERT_NE(nullptr, window); 141e0dac50fSopenharmony_ci window->SetPrivacyMode(true); 142e0dac50fSopenharmony_ci sleep(WAIT_FOR_SYNC_US); 143e0dac50fSopenharmony_ci bool hasPrivateWindow = false; 144e0dac50fSopenharmony_ci DisplayId id = DisplayManager::GetInstance().GetDefaultDisplayId(); 145e0dac50fSopenharmony_ci DisplayManager::GetInstance().HasPrivateWindow(id, hasPrivateWindow); 146e0dac50fSopenharmony_ci 147e0dac50fSopenharmony_ci window->SetPrivacyMode(false); 148e0dac50fSopenharmony_ci sleep(WAIT_FOR_SYNC_US); 149e0dac50fSopenharmony_ci DisplayManager::GetInstance().HasPrivateWindow(id, hasPrivateWindow); 150e0dac50fSopenharmony_ci window->Destroy(); 151e0dac50fSopenharmony_ci ASSERT_TRUE(!hasPrivateWindow); 152e0dac50fSopenharmony_ci} 153e0dac50fSopenharmony_ci 154e0dac50fSopenharmony_ci/** 155e0dac50fSopenharmony_ci * @tc.name: HasPrivateWindowCovered 156e0dac50fSopenharmony_ci * @tc.desc: The private window is covered 157e0dac50fSopenharmony_ci * @tc.type: FUNC 158e0dac50fSopenharmony_ci * @tc.require issueI5HF6V 159e0dac50fSopenharmony_ci */ 160e0dac50fSopenharmony_ciHWTEST_F(DisplayManagerTest, HasPrivateWindowCovered, Function | SmallTest | Level2) 161e0dac50fSopenharmony_ci{ 162e0dac50fSopenharmony_ci auto displayWidth = DisplayManagerTest::displayWidth_; 163e0dac50fSopenharmony_ci auto displayHeight = DisplayManagerTest::displayHeight_; 164e0dac50fSopenharmony_ci 165e0dac50fSopenharmony_ci sptr<Window> window1 = CreateWindow("test", WindowMode::WINDOW_MODE_FULLSCREEN, Rect {0, 0, 0, 0}); 166e0dac50fSopenharmony_ci if (window1 == nullptr) { 167e0dac50fSopenharmony_ci return; 168e0dac50fSopenharmony_ci } 169e0dac50fSopenharmony_ci ASSERT_NE(nullptr, window1); 170e0dac50fSopenharmony_ci // 10:rect.posX_, 120:rect.posY_, 650:rect.width, 500:rect.height 171e0dac50fSopenharmony_ci sptr<Window> window2 = CreateWindow("private", WindowMode::WINDOW_MODE_FLOATING, 172e0dac50fSopenharmony_ci Rect{0, 0, 300, 300}, 0xffff0000); 173e0dac50fSopenharmony_ci ASSERT_NE(nullptr, window2); 174e0dac50fSopenharmony_ci window2->SetPrivacyMode(true); 175e0dac50fSopenharmony_ci // The window shadows is too large to cover. so, set a special position for cover window easily. 176e0dac50fSopenharmony_ci sleep(WAIT_FOR_SYNC_US); 177e0dac50fSopenharmony_ci window2->MoveTo(displayWidth * 0.53, displayHeight * 0.66); 178e0dac50fSopenharmony_ci sleep(WAIT_FOR_SYNC_US); 179e0dac50fSopenharmony_ci 180e0dac50fSopenharmony_ci // 10:rect.posX_, 110:rect.posY_, 650:rect.width, 500:rect.height 181e0dac50fSopenharmony_ci sptr<Window> window3 = CreateWindow("covered", WindowMode::WINDOW_MODE_FLOATING, 182e0dac50fSopenharmony_ci Rect{0, 0, displayWidth, displayHeight}, 0xff00ff00); 183e0dac50fSopenharmony_ci ASSERT_NE(nullptr, window3); 184e0dac50fSopenharmony_ci sleep(WAIT_FOR_SYNC_US); 185e0dac50fSopenharmony_ci window3->MoveTo(45, 115); 186e0dac50fSopenharmony_ci sleep(WAIT_FOR_SYNC_US); 187e0dac50fSopenharmony_ci 188e0dac50fSopenharmony_ci bool hasPrivateWindow = false; 189e0dac50fSopenharmony_ci DisplayId id = DisplayManager::GetInstance().GetDefaultDisplayId(); 190e0dac50fSopenharmony_ci DisplayManager::GetInstance().HasPrivateWindow(id, hasPrivateWindow); 191e0dac50fSopenharmony_ci window1->Destroy(); 192e0dac50fSopenharmony_ci window2->Destroy(); 193e0dac50fSopenharmony_ci window3->Destroy(); 194e0dac50fSopenharmony_ci if (!hasPrivateWindow) { 195e0dac50fSopenharmony_ci ASSERT_TRUE(!hasPrivateWindow); 196e0dac50fSopenharmony_ci } 197e0dac50fSopenharmony_ci} 198e0dac50fSopenharmony_ci 199e0dac50fSopenharmony_ci/** 200e0dac50fSopenharmony_ci * @tc.name: HasPrivateWindowCovered01 201e0dac50fSopenharmony_ci * @tc.desc: The private window is partially covered 202e0dac50fSopenharmony_ci * @tc.type: FUNC 203e0dac50fSopenharmony_ci * @tc.require issueI5HF6V 204e0dac50fSopenharmony_ci */ 205e0dac50fSopenharmony_ciHWTEST_F(DisplayManagerTest, HasPrivateWindowCovered01, Function | SmallTest | Level2) 206e0dac50fSopenharmony_ci{ 207e0dac50fSopenharmony_ci sptr<Window> window1 = CreateWindow("test", WindowMode::WINDOW_MODE_FULLSCREEN, Rect{0, 0, 0, 0}); 208e0dac50fSopenharmony_ci 209e0dac50fSopenharmony_ci // 10:rect.posX_, 120:rect.posY_, 650:rect.width, 500:rect.height 210e0dac50fSopenharmony_ci if (window1 == nullptr) 211e0dac50fSopenharmony_ci { 212e0dac50fSopenharmony_ci return; 213e0dac50fSopenharmony_ci } 214e0dac50fSopenharmony_ci ASSERT_NE(nullptr, window1); 215e0dac50fSopenharmony_ci sptr<Window> window2 = CreateWindow("private", WindowMode::WINDOW_MODE_FLOATING, 216e0dac50fSopenharmony_ci Rect{10, 120, 650, 500}, 0xffff0000); 217e0dac50fSopenharmony_ci ASSERT_NE(nullptr, window2); 218e0dac50fSopenharmony_ci window2->SetPrivacyMode(true); 219e0dac50fSopenharmony_ci // 5:rect.posX_, 110:rect.posY_, 650:rect.width, 500:rect.height 220e0dac50fSopenharmony_ci sptr<Window> window3 = CreateWindow("covered", WindowMode::WINDOW_MODE_FLOATING, 221e0dac50fSopenharmony_ci Rect{5, 110, 650, 500}, 0xff00ff00); 222e0dac50fSopenharmony_ci ASSERT_NE(nullptr, window3); 223e0dac50fSopenharmony_ci 224e0dac50fSopenharmony_ci sleep(WAIT_FOR_SYNC_US); 225e0dac50fSopenharmony_ci bool hasPrivateWindow = false; 226e0dac50fSopenharmony_ci DisplayId id = DisplayManager::GetInstance().GetDefaultDisplayId(); 227e0dac50fSopenharmony_ci DisplayManager::GetInstance().HasPrivateWindow(id, hasPrivateWindow); 228e0dac50fSopenharmony_ci window1->Destroy(); 229e0dac50fSopenharmony_ci window2->Destroy(); 230e0dac50fSopenharmony_ci window3->Destroy(); 231e0dac50fSopenharmony_ci if (hasPrivateWindow) 232e0dac50fSopenharmony_ci { 233e0dac50fSopenharmony_ci ASSERT_TRUE(hasPrivateWindow); 234e0dac50fSopenharmony_ci } 235e0dac50fSopenharmony_ci} 236e0dac50fSopenharmony_ci 237e0dac50fSopenharmony_ci/** 238e0dac50fSopenharmony_ci * @tc.name: HasPrivateWindowCovered02 239e0dac50fSopenharmony_ci * @tc.desc: The private window is covered 240e0dac50fSopenharmony_ci * @tc.type: FUNC 241e0dac50fSopenharmony_ci * @tc.require issueI5HF6V 242e0dac50fSopenharmony_ci */ 243e0dac50fSopenharmony_ciHWTEST_F(DisplayManagerTest, HasPrivateWindowCovered02, Function | SmallTest | Level2) 244e0dac50fSopenharmony_ci{ 245e0dac50fSopenharmony_ci auto displayWidth = DisplayManagerTest::displayWidth_; 246e0dac50fSopenharmony_ci auto displayHeight = DisplayManagerTest::displayHeight_; 247e0dac50fSopenharmony_ci 248e0dac50fSopenharmony_ci sptr<Window> window1 = CreateWindow("test", WindowMode::WINDOW_MODE_FULLSCREEN, Rect {0, 0, 0, 0}); 249e0dac50fSopenharmony_ci if (window1 == nullptr) { 250e0dac50fSopenharmony_ci return; 251e0dac50fSopenharmony_ci } 252e0dac50fSopenharmony_ci ASSERT_NE(nullptr, window1); 253e0dac50fSopenharmony_ci // 10:rect.posX_, 120:rect.posY_, 650:rect.width, 500:rect.height 254e0dac50fSopenharmony_ci sptr<Window> window2 = CreateWindow("private", WindowMode::WINDOW_MODE_FLOATING, 255e0dac50fSopenharmony_ci Rect {0, 0, 300, 300}, 0xffff0000); 256e0dac50fSopenharmony_ci ASSERT_NE(nullptr, window2); 257e0dac50fSopenharmony_ci window2->SetPrivacyMode(true); 258e0dac50fSopenharmony_ci // The window shadows is too large to cover. so, set a special position for cover window easily. 259e0dac50fSopenharmony_ci sleep(WAIT_FOR_SYNC_US); 260e0dac50fSopenharmony_ci window2->MoveTo(displayWidth * 0.53, displayHeight * 0.66); 261e0dac50fSopenharmony_ci sleep(WAIT_FOR_SYNC_US); 262e0dac50fSopenharmony_ci 263e0dac50fSopenharmony_ci // 5:rect.posX_, 110:rect.posY_, 655:rect.width, 500:rect.height 264e0dac50fSopenharmony_ci sptr<Window> window3 = CreateWindow("covered1", WindowMode::WINDOW_MODE_FLOATING, 265e0dac50fSopenharmony_ci Rect { 0, 0, displayWidth, displayHeight / 2}, 0xff00ff00); 266e0dac50fSopenharmony_ci ASSERT_NE(nullptr, window3); 267e0dac50fSopenharmony_ci sleep(WAIT_FOR_SYNC_US); 268e0dac50fSopenharmony_ci window3->MoveTo(45, 115); 269e0dac50fSopenharmony_ci sleep(WAIT_FOR_SYNC_US); 270e0dac50fSopenharmony_ci 271e0dac50fSopenharmony_ci // 5:rect.posX_, 300:rect.posY_, 655:rect.width, 500:rect.height 272e0dac50fSopenharmony_ci sptr<Window> window4 = CreateWindow("covered2", WindowMode::WINDOW_MODE_FLOATING, 273e0dac50fSopenharmony_ci Rect { 0, 0, displayWidth, displayHeight / 2 + 200 }, 0xff00ff00); 274e0dac50fSopenharmony_ci ASSERT_NE(nullptr, window4); 275e0dac50fSopenharmony_ci window4->MoveTo(45, displayHeight / 2 - 95); 276e0dac50fSopenharmony_ci 277e0dac50fSopenharmony_ci sleep(WAIT_FOR_SYNC_US); 278e0dac50fSopenharmony_ci bool hasPrivateWindow = false; 279e0dac50fSopenharmony_ci DisplayId id = DisplayManager::GetInstance().GetDefaultDisplayId(); 280e0dac50fSopenharmony_ci DisplayManager::GetInstance().HasPrivateWindow(id, hasPrivateWindow); 281e0dac50fSopenharmony_ci window1->Destroy(); 282e0dac50fSopenharmony_ci window2->Destroy(); 283e0dac50fSopenharmony_ci window3->Destroy(); 284e0dac50fSopenharmony_ci window4->Destroy(); 285e0dac50fSopenharmony_ci if (!hasPrivateWindow) { 286e0dac50fSopenharmony_ci ASSERT_TRUE(!hasPrivateWindow); 287e0dac50fSopenharmony_ci } 288e0dac50fSopenharmony_ci} 289e0dac50fSopenharmony_ci 290e0dac50fSopenharmony_ci/** 291e0dac50fSopenharmony_ci * @tc.name: HasPrivateWindowCovered03 292e0dac50fSopenharmony_ci * @tc.desc: The private window is partially covered 293e0dac50fSopenharmony_ci * @tc.type: FUNC 294e0dac50fSopenharmony_ci * @tc.require issueI5HF6V 295e0dac50fSopenharmony_ci */ 296e0dac50fSopenharmony_ciHWTEST_F(DisplayManagerTest, HasPrivateWindowCovered03, Function | SmallTest | Level2) 297e0dac50fSopenharmony_ci{ 298e0dac50fSopenharmony_ci sptr<Window> window1 = CreateWindow("test", WindowMode::WINDOW_MODE_FULLSCREEN, Rect {0, 0, 0, 0}); 299e0dac50fSopenharmony_ci 300e0dac50fSopenharmony_ci if (window1 == nullptr) { 301e0dac50fSopenharmony_ci return; 302e0dac50fSopenharmony_ci } 303e0dac50fSopenharmony_ci ASSERT_NE(nullptr, window1); 304e0dac50fSopenharmony_ci // 10:rect.posX_, 120:rect.pos_Y, rect.width_:650, rect.height_:700 305e0dac50fSopenharmony_ci sptr<Window> window2 = CreateWindow("private", WindowMode::WINDOW_MODE_FLOATING, 306e0dac50fSopenharmony_ci Rect{10, 120, 650, 700}, 0xffff0000); 307e0dac50fSopenharmony_ci ASSERT_NE(nullptr, window2); 308e0dac50fSopenharmony_ci window2->SetPrivacyMode(true); 309e0dac50fSopenharmony_ci // 5:rect.posX_, 110:rect.pos_Y, rect.width_:655, rect.height_:500 310e0dac50fSopenharmony_ci sptr<Window> window3 = CreateWindow("covered1", WindowMode::WINDOW_MODE_FLOATING, 311e0dac50fSopenharmony_ci Rect{5, 110, 655, 500}, 0xff00ff00); 312e0dac50fSopenharmony_ci ASSERT_NE(nullptr, window3); 313e0dac50fSopenharmony_ci // 5:rect.posX_, 700:rect.pos_Y, rect.width_:655, rect.height_:500 314e0dac50fSopenharmony_ci sptr<Window> window4 = CreateWindow("covered2", WindowMode::WINDOW_MODE_FLOATING, 315e0dac50fSopenharmony_ci Rect{5, 700, 655, 500}, 0xff00ff00); 316e0dac50fSopenharmony_ci ASSERT_NE(nullptr, window4); 317e0dac50fSopenharmony_ci 318e0dac50fSopenharmony_ci sleep(WAIT_FOR_SYNC_US); 319e0dac50fSopenharmony_ci bool hasPrivateWindow = false; 320e0dac50fSopenharmony_ci DisplayId id = DisplayManager::GetInstance().GetDefaultDisplayId(); 321e0dac50fSopenharmony_ci DisplayManager::GetInstance().HasPrivateWindow(id, hasPrivateWindow); 322e0dac50fSopenharmony_ci window1->Destroy(); 323e0dac50fSopenharmony_ci window2->Destroy(); 324e0dac50fSopenharmony_ci window3->Destroy(); 325e0dac50fSopenharmony_ci window4->Destroy(); 326e0dac50fSopenharmony_ci if (hasPrivateWindow) { 327e0dac50fSopenharmony_ci ASSERT_TRUE(hasPrivateWindow); 328e0dac50fSopenharmony_ci } 329e0dac50fSopenharmony_ci} 330e0dac50fSopenharmony_ci 331e0dac50fSopenharmony_ci/** 332e0dac50fSopenharmony_ci * @tc.name: HasPrivateWindowSkipSnapShot 333e0dac50fSopenharmony_ci * @tc.desc: set snap shot skip 334e0dac50fSopenharmony_ci * @tc.type: FUNC 335e0dac50fSopenharmony_ci * @tc.require issueI5HF6V 336e0dac50fSopenharmony_ci */ 337e0dac50fSopenharmony_ciHWTEST_F(DisplayManagerTest, HasPrivateWindowSkipSnapShot, Function | SmallTest | Level2) 338e0dac50fSopenharmony_ci{ 339e0dac50fSopenharmony_ci sptr<Window> window1 = CreateWindow("test", WindowMode::WINDOW_MODE_FULLSCREEN, Rect {0, 0, 0, 0}); 340e0dac50fSopenharmony_ci if (window1 == nullptr) { 341e0dac50fSopenharmony_ci return; 342e0dac50fSopenharmony_ci } 343e0dac50fSopenharmony_ci ASSERT_NE(nullptr, window1); 344e0dac50fSopenharmony_ci // 10:rect.posX_, 120:rect.posY_, 650:rect.width, 500:rect.height 345e0dac50fSopenharmony_ci sptr<Window> window2 = CreateWindow("private", WindowMode::WINDOW_MODE_FLOATING, 346e0dac50fSopenharmony_ci Rect {10, 120, 650, 500}, 0xffff0000); 347e0dac50fSopenharmony_ci ASSERT_NE(nullptr, window2); 348e0dac50fSopenharmony_ci window2->SetSnapshotSkip(true); 349e0dac50fSopenharmony_ci sleep(WAIT_FOR_SYNC_US); 350e0dac50fSopenharmony_ci bool hasPrivateWindow = false; 351e0dac50fSopenharmony_ci DisplayId id = DisplayManager::GetInstance().GetDefaultDisplayId(); 352e0dac50fSopenharmony_ci DisplayManager::GetInstance().HasPrivateWindow(id, hasPrivateWindow); 353e0dac50fSopenharmony_ci window1->Destroy(); 354e0dac50fSopenharmony_ci window2->Destroy(); 355e0dac50fSopenharmony_ci if (hasPrivateWindow) { 356e0dac50fSopenharmony_ci ASSERT_TRUE(hasPrivateWindow); 357e0dac50fSopenharmony_ci } 358e0dac50fSopenharmony_ci} 359e0dac50fSopenharmony_ci 360e0dac50fSopenharmony_ci/** 361e0dac50fSopenharmony_ci * @tc.name: AddSurfaceNodeToDisplay | RemoveSurfaceNodeFromDisplay 362e0dac50fSopenharmony_ci * @tc.desc: add/remove surfaceNode to/from display 363e0dac50fSopenharmony_ci * @tc.type: FUNC 364e0dac50fSopenharmony_ci */ 365e0dac50fSopenharmony_ciHWTEST_F(DisplayManagerTest, AddAndRemoveSurfaceNode, Function | SmallTest | Level2) 366e0dac50fSopenharmony_ci{ 367e0dac50fSopenharmony_ci RSSurfaceNodeConfig config; 368e0dac50fSopenharmony_ci config.SurfaceNodeName = "TestSurfaceNode"; 369e0dac50fSopenharmony_ci auto surfaceNode = RSSurfaceNode::Create(config); 370e0dac50fSopenharmony_ci DisplayId id = DisplayManager::GetInstance().GetDefaultDisplayId(); 371e0dac50fSopenharmony_ci ASSERT_EQ(DMError::DM_OK, DisplayManager::GetInstance().AddSurfaceNodeToDisplay(id, surfaceNode)); 372e0dac50fSopenharmony_ci sleep(2); 373e0dac50fSopenharmony_ci ASSERT_EQ(DMError::DM_OK, DisplayManager::GetInstance().RemoveSurfaceNodeFromDisplay(id, surfaceNode)); 374e0dac50fSopenharmony_ci} 375e0dac50fSopenharmony_ci 376e0dac50fSopenharmony_ci/** 377e0dac50fSopenharmony_ci * @tc.name: AddSurfaceNodeToDisplay | RemoveSurfaceNodeFromDisplay 378e0dac50fSopenharmony_ci * @tc.desc: add/remove surfaceNode to/from display 379e0dac50fSopenharmony_ci * @tc.type: FUNC 380e0dac50fSopenharmony_ci */ 381e0dac50fSopenharmony_ciHWTEST_F(DisplayManagerTest, SetVirtualScreenSecurityExemption, Function | SmallTest | Level2) 382e0dac50fSopenharmony_ci{ 383e0dac50fSopenharmony_ci ScreenId id = 0; 384e0dac50fSopenharmony_ci uint32_t pid = 0; 385e0dac50fSopenharmony_ci std::vector<uint64_t> windowList; 386e0dac50fSopenharmony_ci auto ret = DisplayManager::GetInstance().SetVirtualScreenSecurityExemption(id, pid, windowList); 387e0dac50fSopenharmony_ci ASSERT_NE(DMError::DM_OK, ret); // not virtual screen for id 0 388e0dac50fSopenharmony_ci sleep(2); 389e0dac50fSopenharmony_ci} 390e0dac50fSopenharmony_ci 391e0dac50fSopenharmony_ci} 392e0dac50fSopenharmony_ci} // namespace OHOS::Rosen 393