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