1094332d3Sopenharmony_ci/*
2094332d3Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License.
5094332d3Sopenharmony_ci * You may obtain a copy of the License at
6094332d3Sopenharmony_ci *
7094332d3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8094332d3Sopenharmony_ci *
9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and
13094332d3Sopenharmony_ci * limitations under the License.
14094332d3Sopenharmony_ci */
15094332d3Sopenharmony_ci
16094332d3Sopenharmony_ci#include "hdi_composer_ut.h"
17094332d3Sopenharmony_ci#include <chrono>
18094332d3Sopenharmony_ci#include <cinttypes>
19094332d3Sopenharmony_ci#include <algorithm>
20094332d3Sopenharmony_ci#include "v1_2/include/idisplay_composer_interface.h"
21094332d3Sopenharmony_ci#include "v1_2/display_composer_type.h"
22094332d3Sopenharmony_ci#include "v1_0/display_buffer_type.h"
23094332d3Sopenharmony_ci#include "display_test.h"
24094332d3Sopenharmony_ci#include "display_test_utils.h"
25094332d3Sopenharmony_ci#include "hdi_composition_check.h"
26094332d3Sopenharmony_ci#include "hdi_test_device.h"
27094332d3Sopenharmony_ci#include "hdi_test_device_common.h"
28094332d3Sopenharmony_ci#include "hdi_test_display.h"
29094332d3Sopenharmony_ci#include "hdi_test_render_utils.h"
30094332d3Sopenharmony_ci#include "timer.h"
31094332d3Sopenharmony_ci#include <sys/time.h>
32094332d3Sopenharmony_ci#include <thread>
33094332d3Sopenharmony_ci
34094332d3Sopenharmony_ciusing namespace OHOS::HDI::Display::Buffer::V1_0;
35094332d3Sopenharmony_ciusing namespace OHOS::HDI::Display::Composer::V1_2;
36094332d3Sopenharmony_ciusing namespace OHOS::HDI::Display::TEST;
37094332d3Sopenharmony_ciusing namespace testing::ext;
38094332d3Sopenharmony_ci
39094332d3Sopenharmony_cistatic sptr<Composer::V1_2::IDisplayComposerInterface> g_composerDevice = nullptr;
40094332d3Sopenharmony_cistatic std::shared_ptr<IDisplayBuffer> g_gralloc = nullptr;
41094332d3Sopenharmony_cistatic std::vector<uint32_t> g_displayIds;
42094332d3Sopenharmony_ciconst int SLEEP_CONT_10 = 10;
43094332d3Sopenharmony_ciconst int SLEEP_CONT_100 = 100;
44094332d3Sopenharmony_ciconst int SLEEP_CONT_2000 = 2000;
45094332d3Sopenharmony_cistatic bool g_isOnSeamlessChangeCalled = false;
46094332d3Sopenharmony_cistatic bool g_isOnModeCalled = false;
47094332d3Sopenharmony_cistatic bool g_threadCtrl = false;
48094332d3Sopenharmony_ci
49094332d3Sopenharmony_cistatic inline std::shared_ptr<HdiTestDisplay> GetFirstDisplay()
50094332d3Sopenharmony_ci{
51094332d3Sopenharmony_ci    return HdiTestDevice::GetInstance().GetFirstDisplay();
52094332d3Sopenharmony_ci}
53094332d3Sopenharmony_ci
54094332d3Sopenharmony_cistatic int32_t CheckComposition(std::vector<LayerSettings> &layers, BufferHandle* clientBuffer,
55094332d3Sopenharmony_ci    uint32_t checkType = HdiCompositionCheck::CHECK_VERTEX)
56094332d3Sopenharmony_ci{
57094332d3Sopenharmony_ci    DISPLAY_TEST_CHK_RETURN((clientBuffer == nullptr), DISPLAY_NULL_PTR, DISPLAY_TEST_LOGE("client buffer is nullptr"));
58094332d3Sopenharmony_ci    return HdiCompositionCheck::GetInstance().Check(layers, *clientBuffer, checkType);
59094332d3Sopenharmony_ci}
60094332d3Sopenharmony_ci
61094332d3Sopenharmony_cistatic std::shared_ptr<HdiTestLayer> CreateTestLayer(LayerSettings setting, uint32_t zorder)
62094332d3Sopenharmony_ci{
63094332d3Sopenharmony_ci    int ret;
64094332d3Sopenharmony_ci    HdiTestDevice::GetInstance();
65094332d3Sopenharmony_ci    DISPLAY_TEST_LOGD("color 0x%x", setting.color);
66094332d3Sopenharmony_ci    std::shared_ptr<HdiTestDisplay> display = HdiTestDevice::GetInstance().GetFirstDisplay();
67094332d3Sopenharmony_ci    DISPLAY_TEST_CHK_RETURN((display == nullptr), nullptr, DISPLAY_TEST_LOGE("can not get display"));
68094332d3Sopenharmony_ci
69094332d3Sopenharmony_ci    std::shared_ptr<HdiTestLayer> layer = display->CreateHdiTestLayer(setting.bufferSize.w, setting.bufferSize.h);
70094332d3Sopenharmony_ci    DISPLAY_TEST_CHK_RETURN((layer == nullptr), nullptr, DISPLAY_TEST_LOGE("can not create hdi test layer"));
71094332d3Sopenharmony_ci
72094332d3Sopenharmony_ci    layer->SetLayerPosition(setting.displayRect);
73094332d3Sopenharmony_ci
74094332d3Sopenharmony_ci    layer->SetCompType(setting.compositionType);
75094332d3Sopenharmony_ci
76094332d3Sopenharmony_ci    if ((setting.alpha >= 0) && (setting.alpha <= 0xff)) { // alpha rang 0x00 ~ 0xff
77094332d3Sopenharmony_ci        LayerAlpha alpha = { 0 };
78094332d3Sopenharmony_ci        alpha.gAlpha = setting.alpha;
79094332d3Sopenharmony_ci        alpha.enGlobalAlpha = true;
80094332d3Sopenharmony_ci        layer->SetAlpha(alpha);
81094332d3Sopenharmony_ci    }
82094332d3Sopenharmony_ci    HdiGrallocBuffer* handle = layer->GetFrontBuffer();
83094332d3Sopenharmony_ci    DISPLAY_TEST_CHK_RETURN((handle == nullptr), nullptr, DISPLAY_TEST_LOGE("can not get front buffer"));
84094332d3Sopenharmony_ci    ClearColor(*(handle->Get()), setting.color);
85094332d3Sopenharmony_ci    ret = layer->SwapFrontToBackQ();
86094332d3Sopenharmony_ci    DISPLAY_TEST_CHK_RETURN((ret != DISPLAY_SUCCESS), nullptr, DISPLAY_TEST_LOGE("SwapFrontToBackQ failed"));
87094332d3Sopenharmony_ci    layer->SetZorder(zorder);
88094332d3Sopenharmony_ci    layer->SetBlendType(setting.blendType);
89094332d3Sopenharmony_ci    layer->SetTransform(setting.rotate);
90094332d3Sopenharmony_ci    return layer;
91094332d3Sopenharmony_ci}
92094332d3Sopenharmony_ci
93094332d3Sopenharmony_cistatic int PrepareAndCommit()
94094332d3Sopenharmony_ci{
95094332d3Sopenharmony_ci    int ret;
96094332d3Sopenharmony_ci    DISPLAY_TEST_LOGD();
97094332d3Sopenharmony_ci    std::shared_ptr<HdiTestDisplay> display = HdiTestDevice::GetInstance().GetFirstDisplay();
98094332d3Sopenharmony_ci    DISPLAY_TEST_CHK_RETURN((display == nullptr), DISPLAY_FAILURE, DISPLAY_TEST_LOGE("can not get display"));
99094332d3Sopenharmony_ci
100094332d3Sopenharmony_ci    ret = display->PrepareDisplayLayers(); // 确定顶压策略(是否走GPU合成)、刷新layer列表
101094332d3Sopenharmony_ci    DISPLAY_TEST_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE,
102094332d3Sopenharmony_ci        DISPLAY_TEST_LOGE("PrepareDisplayLayers failed"));
103094332d3Sopenharmony_ci
104094332d3Sopenharmony_ci    ret = display->Commit(); // 送显
105094332d3Sopenharmony_ci    DISPLAY_TEST_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_TEST_LOGE("Commit failed"));
106094332d3Sopenharmony_ci    return DISPLAY_SUCCESS;
107094332d3Sopenharmony_ci}
108094332d3Sopenharmony_ci
109094332d3Sopenharmony_cistatic void LoopCommit()
110094332d3Sopenharmony_ci{
111094332d3Sopenharmony_ci    while (!g_threadCtrl) {
112094332d3Sopenharmony_ci        PrepareAndCommit();
113094332d3Sopenharmony_ci        std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_CONT_10));
114094332d3Sopenharmony_ci    }
115094332d3Sopenharmony_ci}
116094332d3Sopenharmony_ci
117094332d3Sopenharmony_cistatic void TestVBlankCallback(unsigned int sequence, uint64_t ns, void* data)
118094332d3Sopenharmony_ci{
119094332d3Sopenharmony_ci    static uint64_t lastns;
120094332d3Sopenharmony_ci    DISPLAY_TEST_LOGD("seq %{public}d  ns %" PRId64 " duration %" PRId64 " ns", sequence, ns, (ns - lastns));
121094332d3Sopenharmony_ci    lastns = ns;
122094332d3Sopenharmony_ci    VblankCtr::GetInstance().NotifyVblank(sequence, ns, data);
123094332d3Sopenharmony_ci}
124094332d3Sopenharmony_ci
125094332d3Sopenharmony_cistatic void AdjustLayerSettings(std::vector<LayerSettings> &settings, uint32_t w, uint32_t h)
126094332d3Sopenharmony_ci{
127094332d3Sopenharmony_ci    DISPLAY_TEST_LOGD();
128094332d3Sopenharmony_ci    for (uint32_t i = 0; i < settings.size(); i++) {
129094332d3Sopenharmony_ci        LayerSettings& setting = settings[i];
130094332d3Sopenharmony_ci        DISPLAY_TEST_LOGD(" ratio w: %f  ratio h: %f", setting.rectRatio.w, setting.rectRatio.h);
131094332d3Sopenharmony_ci        if ((setting.rectRatio.w > 0.0f) && (setting.rectRatio.h > 0.0f)) {
132094332d3Sopenharmony_ci            setting.displayRect.h = static_cast<uint32_t>(setting.rectRatio.h * h);
133094332d3Sopenharmony_ci            setting.displayRect.w = static_cast<uint32_t>(setting.rectRatio.w * w);
134094332d3Sopenharmony_ci            setting.displayRect.x = static_cast<uint32_t>(setting.rectRatio.x * w);
135094332d3Sopenharmony_ci            setting.displayRect.y = static_cast<uint32_t>(setting.rectRatio.y * h);
136094332d3Sopenharmony_ci            DISPLAY_TEST_LOGD("display rect adust form %f %f %f %f to %{public}d %{public}d %{public}d %{public}d ",
137094332d3Sopenharmony_ci                setting.rectRatio.x, setting.rectRatio.y, setting.rectRatio.w, setting.rectRatio.h,
138094332d3Sopenharmony_ci                setting.displayRect.x, setting.displayRect.y, setting.displayRect.w, setting.displayRect.h);
139094332d3Sopenharmony_ci        }
140094332d3Sopenharmony_ci
141094332d3Sopenharmony_ci        if ((setting.bufferRatio.h > 0.0f) || (setting.bufferRatio.w > 0.0f)) {
142094332d3Sopenharmony_ci            setting.bufferSize.h = static_cast<uint32_t>(setting.bufferRatio.h * h);
143094332d3Sopenharmony_ci            setting.bufferSize.w = static_cast<uint32_t>(setting.bufferRatio.w * w);
144094332d3Sopenharmony_ci            DISPLAY_TEST_LOGD("buffer size adjust for %f %f to %{public}d %{public}d",
145094332d3Sopenharmony_ci                setting.bufferRatio.w, setting.bufferRatio.h, setting.bufferSize.w, setting.bufferSize.h);
146094332d3Sopenharmony_ci        }
147094332d3Sopenharmony_ci
148094332d3Sopenharmony_ci        if ((setting.bufferSize.w == 0) || (setting.bufferSize.h == 0)) {
149094332d3Sopenharmony_ci            DISPLAY_TEST_LOGD("buffer size adjust for %{public}d %{public}d to %{public}d %{public}d",
150094332d3Sopenharmony_ci                setting.bufferSize.w, setting.bufferSize.h, setting.displayRect.w, setting.displayRect.h);
151094332d3Sopenharmony_ci
152094332d3Sopenharmony_ci            setting.bufferSize.w = setting.displayRect.w;
153094332d3Sopenharmony_ci            setting.bufferSize.h = setting.displayRect.h;
154094332d3Sopenharmony_ci        }
155094332d3Sopenharmony_ci    }
156094332d3Sopenharmony_ci}
157094332d3Sopenharmony_ci
158094332d3Sopenharmony_cistatic std::vector<std::shared_ptr<HdiTestLayer>> CreateLayers(std::vector<LayerSettings> &settings)
159094332d3Sopenharmony_ci{
160094332d3Sopenharmony_ci    DISPLAY_TEST_LOGD("settings %{public}zd", settings.size());
161094332d3Sopenharmony_ci    std::vector<std::shared_ptr<HdiTestLayer>> layers;
162094332d3Sopenharmony_ci    DisplayModeInfo mode = GetFirstDisplay()->GetCurrentMode();
163094332d3Sopenharmony_ci    AdjustLayerSettings(settings, mode.width, mode.height);
164094332d3Sopenharmony_ci    for (uint32_t i = 0; i < settings.size(); i++) {
165094332d3Sopenharmony_ci        LayerSettings setting = settings[i];
166094332d3Sopenharmony_ci
167094332d3Sopenharmony_ci        auto layer = CreateTestLayer(setting, i);
168094332d3Sopenharmony_ci        layers.push_back(layer);
169094332d3Sopenharmony_ci    }
170094332d3Sopenharmony_ci
171094332d3Sopenharmony_ci    return layers;
172094332d3Sopenharmony_ci}
173094332d3Sopenharmony_ci
174094332d3Sopenharmony_cistatic inline void PresentAndCheck(std::vector<LayerSettings> &layerSettings,
175094332d3Sopenharmony_ci    uint32_t checkType = HdiCompositionCheck::CHECK_VERTEX)
176094332d3Sopenharmony_ci{
177094332d3Sopenharmony_ci    int ret = PrepareAndCommit();
178094332d3Sopenharmony_ci    ASSERT_TRUE((ret == DISPLAY_SUCCESS));
179094332d3Sopenharmony_ci    if ((GetFirstDisplay()->SnapShot()) != nullptr) {
180094332d3Sopenharmony_ci        HdiTestDevice::GetInstance().GetGrallocInterface()->InvalidateCache(*(GetFirstDisplay()->SnapShot()));
181094332d3Sopenharmony_ci        ret = CheckComposition(layerSettings, GetFirstDisplay()->SnapShot(), checkType);
182094332d3Sopenharmony_ci        ASSERT_TRUE((ret == DISPLAY_SUCCESS));
183094332d3Sopenharmony_ci    }
184094332d3Sopenharmony_ci}
185094332d3Sopenharmony_ci
186094332d3Sopenharmony_cistatic void DestroyLayer(std::shared_ptr<HdiTestLayer> layer)
187094332d3Sopenharmony_ci{
188094332d3Sopenharmony_ci    std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_CONT_100));
189094332d3Sopenharmony_ci    auto ret = g_composerDevice->DestroyLayer(g_displayIds[0], layer->GetId());
190094332d3Sopenharmony_ci    if (ret != DISPLAY_SUCCESS && ret != DISPLAY_NOT_SUPPORT) {
191094332d3Sopenharmony_ci        DISPLAY_TEST_LOGD("DestroyLayer fail or not support, ret: %{public}d", ret);
192094332d3Sopenharmony_ci        return;
193094332d3Sopenharmony_ci    }
194094332d3Sopenharmony_ci    std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_CONT_100));
195094332d3Sopenharmony_ci}
196094332d3Sopenharmony_ci
197094332d3Sopenharmony_civoid DeviceTest::SetUpTestCase()
198094332d3Sopenharmony_ci{
199094332d3Sopenharmony_ci    int ret = HdiTestDevice::GetInstance().InitDevice();
200094332d3Sopenharmony_ci    ASSERT_TRUE(ret == DISPLAY_SUCCESS);
201094332d3Sopenharmony_ci
202094332d3Sopenharmony_ci    g_composerDevice = HdiTestDevice::GetInstance().GetDeviceInterface();
203094332d3Sopenharmony_ci    ASSERT_TRUE(g_composerDevice != nullptr);
204094332d3Sopenharmony_ci
205094332d3Sopenharmony_ci    g_gralloc.reset(IDisplayBuffer::Get());
206094332d3Sopenharmony_ci    ASSERT_TRUE(g_gralloc != nullptr);
207094332d3Sopenharmony_ci
208094332d3Sopenharmony_ci    g_displayIds = HdiTestDevice::GetInstance().GetDevIds();
209094332d3Sopenharmony_ci    ASSERT_TRUE(g_displayIds.size() > 0);
210094332d3Sopenharmony_ci}
211094332d3Sopenharmony_ci
212094332d3Sopenharmony_civoid DeviceTest::TearDownTestCase()
213094332d3Sopenharmony_ci{
214094332d3Sopenharmony_ci    HdiTestDevice::GetInstance().Clear();
215094332d3Sopenharmony_ci    HdiTestDevice::GetInstance().GetFirstDisplay()->ResetClientLayer();
216094332d3Sopenharmony_ci}
217094332d3Sopenharmony_ci
218094332d3Sopenharmony_civoid VblankCtr::NotifyVblank(unsigned int sequence, uint64_t ns, const void* data)
219094332d3Sopenharmony_ci{
220094332d3Sopenharmony_ci    DISPLAY_TEST_LOGD();
221094332d3Sopenharmony_ci    if (data != nullptr) {
222094332d3Sopenharmony_ci        DISPLAY_TEST_LOGD("sequence = %{public}u, ns = %" PRIu64 "", sequence, ns);
223094332d3Sopenharmony_ci    }
224094332d3Sopenharmony_ci    std::unique_lock<std::mutex> lg(vblankMutex_);
225094332d3Sopenharmony_ci    hasVblank_ = true;
226094332d3Sopenharmony_ci    vblankCondition_.notify_one();
227094332d3Sopenharmony_ci    DISPLAY_TEST_LOGD();
228094332d3Sopenharmony_ci}
229094332d3Sopenharmony_ci
230094332d3Sopenharmony_ciVblankCtr::~VblankCtr() {}
231094332d3Sopenharmony_ci
232094332d3Sopenharmony_ciint32_t VblankCtr::WaitVblank(uint32_t ms)
233094332d3Sopenharmony_ci{
234094332d3Sopenharmony_ci    bool ret = false;
235094332d3Sopenharmony_ci    DISPLAY_TEST_LOGD();
236094332d3Sopenharmony_ci    std::unique_lock<std::mutex> lck(vblankMutex_);
237094332d3Sopenharmony_ci    ret = vblankCondition_.wait_for(lck, std::chrono::milliseconds(ms), [=] { return hasVblank_; });
238094332d3Sopenharmony_ci    DISPLAY_TEST_LOGD();
239094332d3Sopenharmony_ci    if (!ret) {
240094332d3Sopenharmony_ci        return DISPLAY_FAILURE;
241094332d3Sopenharmony_ci    }
242094332d3Sopenharmony_ci    return DISPLAY_SUCCESS;
243094332d3Sopenharmony_ci}
244094332d3Sopenharmony_ci
245094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_SetClientBufferCacheCount, TestSize.Level1)
246094332d3Sopenharmony_ci{
247094332d3Sopenharmony_ci    const uint32_t CACHE_COUNT = 5;
248094332d3Sopenharmony_ci    auto ret = g_composerDevice->SetClientBufferCacheCount(g_displayIds[0], CACHE_COUNT);
249094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
250094332d3Sopenharmony_ci}
251094332d3Sopenharmony_ci
252094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_GetDisplayCapability, TestSize.Level1)
253094332d3Sopenharmony_ci{
254094332d3Sopenharmony_ci    DisplayCapability info;
255094332d3Sopenharmony_ci    auto ret = g_composerDevice->GetDisplayCapability(g_displayIds[0], info);
256094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
257094332d3Sopenharmony_ci}
258094332d3Sopenharmony_ci
259094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_GetDisplaySupportedModes, TestSize.Level1)
260094332d3Sopenharmony_ci{
261094332d3Sopenharmony_ci    std::vector<DisplayModeInfo> modes;
262094332d3Sopenharmony_ci    auto ret = g_composerDevice->GetDisplaySupportedModes(g_displayIds[0], modes);
263094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
264094332d3Sopenharmony_ci}
265094332d3Sopenharmony_ci
266094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_GetDisplayMode, TestSize.Level1)
267094332d3Sopenharmony_ci{
268094332d3Sopenharmony_ci    uint32_t MODE = 0;
269094332d3Sopenharmony_ci    auto ret = g_composerDevice->GetDisplayMode(g_displayIds[0], MODE);
270094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
271094332d3Sopenharmony_ci}
272094332d3Sopenharmony_ci
273094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_SetDisplayMode, TestSize.Level1)
274094332d3Sopenharmony_ci{
275094332d3Sopenharmony_ci    const uint32_t MODE = 0;
276094332d3Sopenharmony_ci    auto ret = g_composerDevice->SetDisplayMode(g_displayIds[0], MODE);
277094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
278094332d3Sopenharmony_ci}
279094332d3Sopenharmony_ci
280094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_GetDisplayPowerStatus, TestSize.Level1)
281094332d3Sopenharmony_ci{
282094332d3Sopenharmony_ci    Composer::V1_0::DispPowerStatus powerStatus = Composer::V1_0::DispPowerStatus::POWER_STATUS_OFF;
283094332d3Sopenharmony_ci    auto ret = g_composerDevice->GetDisplayPowerStatus(g_displayIds[0], powerStatus);
284094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
285094332d3Sopenharmony_ci}
286094332d3Sopenharmony_ci
287094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_SetDisplayPowerStatus, TestSize.Level1)
288094332d3Sopenharmony_ci{
289094332d3Sopenharmony_ci    auto ret = g_composerDevice->SetDisplayPowerStatus(g_displayIds[0],
290094332d3Sopenharmony_ci        Composer::V1_0::DispPowerStatus::POWER_STATUS_STANDBY);
291094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
292094332d3Sopenharmony_ci
293094332d3Sopenharmony_ci    ret = g_composerDevice->SetDisplayPowerStatus(g_displayIds[0], Composer::V1_0::DispPowerStatus::POWER_STATUS_ON);
294094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
295094332d3Sopenharmony_ci}
296094332d3Sopenharmony_ci
297094332d3Sopenharmony_ci#ifdef DISPLAY_COMMUNITY
298094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_GetDisplayBacklight, TestSize.Level1)
299094332d3Sopenharmony_ci{
300094332d3Sopenharmony_ci    uint32_t level;
301094332d3Sopenharmony_ci    auto ret = g_composerDevice->GetDisplayBacklight(g_displayIds[0], level);
302094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
303094332d3Sopenharmony_ci}
304094332d3Sopenharmony_ci#endif
305094332d3Sopenharmony_ci
306094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_SetDisplayBacklight, TestSize.Level1)
307094332d3Sopenharmony_ci{
308094332d3Sopenharmony_ci    const uint32_t LEVEL = 10;
309094332d3Sopenharmony_ci    auto ret = g_composerDevice->SetDisplayBacklight(g_displayIds[0], LEVEL);
310094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
311094332d3Sopenharmony_ci}
312094332d3Sopenharmony_ci
313094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_GetDisplayProperty, TestSize.Level1)
314094332d3Sopenharmony_ci{
315094332d3Sopenharmony_ci    const uint32_t PROPERTY_ID = 1;
316094332d3Sopenharmony_ci    uint64_t propertyValue = 0;
317094332d3Sopenharmony_ci    auto ret = g_composerDevice->GetDisplayProperty(g_displayIds[0], PROPERTY_ID, propertyValue);
318094332d3Sopenharmony_ci    int32_t result = DISPLAY_FAILURE;
319094332d3Sopenharmony_ci    if (ret == DISPLAY_SUCCESS || ret == DISPLAY_NOT_SUPPORT) {
320094332d3Sopenharmony_ci        result = DISPLAY_SUCCESS;
321094332d3Sopenharmony_ci    }
322094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, result);
323094332d3Sopenharmony_ci}
324094332d3Sopenharmony_ci
325094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_SetHardwareCursorPosition, TestSize.Level1)
326094332d3Sopenharmony_ci{
327094332d3Sopenharmony_ci    int32_t x = 1;
328094332d3Sopenharmony_ci    int32_t y = 1;
329094332d3Sopenharmony_ci    auto ret = g_composerDevice->SetHardwareCursorPosition(g_displayIds[0], x, y);
330094332d3Sopenharmony_ci    if (ret == DISPLAY_SUCCESS || ret == DISPLAY_NOT_SUPPORT) {
331094332d3Sopenharmony_ci        ret = DISPLAY_SUCCESS;
332094332d3Sopenharmony_ci    }
333094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
334094332d3Sopenharmony_ci}
335094332d3Sopenharmony_ci
336094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_EnableHardwareCursorStats, TestSize.Level1)
337094332d3Sopenharmony_ci{
338094332d3Sopenharmony_ci    bool enable = true;
339094332d3Sopenharmony_ci    auto ret = g_composerDevice->EnableHardwareCursorStats(g_displayIds[0], enable);
340094332d3Sopenharmony_ci    if (ret == DISPLAY_SUCCESS || ret == DISPLAY_NOT_SUPPORT) {
341094332d3Sopenharmony_ci        ret = DISPLAY_SUCCESS;
342094332d3Sopenharmony_ci    }
343094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
344094332d3Sopenharmony_ci}
345094332d3Sopenharmony_ci
346094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_GetHardwareCursorStats, TestSize.Level1)
347094332d3Sopenharmony_ci{
348094332d3Sopenharmony_ci    uint32_t frameCount = 0;
349094332d3Sopenharmony_ci    uint32_t vsyncCount = 0;
350094332d3Sopenharmony_ci    auto ret = g_composerDevice->GetHardwareCursorStats(g_displayIds[0], frameCount, vsyncCount);
351094332d3Sopenharmony_ci    if (ret == DISPLAY_SUCCESS || ret == DISPLAY_NOT_SUPPORT) {
352094332d3Sopenharmony_ci        ret = DISPLAY_SUCCESS;
353094332d3Sopenharmony_ci    }
354094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
355094332d3Sopenharmony_ci}
356094332d3Sopenharmony_ci
357094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_GetDisplayCompChange, TestSize.Level1)
358094332d3Sopenharmony_ci{
359094332d3Sopenharmony_ci    std::vector<uint32_t> layers {};
360094332d3Sopenharmony_ci    std::vector<int32_t> type {};
361094332d3Sopenharmony_ci    auto ret = g_composerDevice->GetDisplayCompChange(g_displayIds[0], layers, type);
362094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
363094332d3Sopenharmony_ci}
364094332d3Sopenharmony_ci
365094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_SetDisplayClientCrop, TestSize.Level1)
366094332d3Sopenharmony_ci{
367094332d3Sopenharmony_ci    const int32_t WIDTH = 1920;
368094332d3Sopenharmony_ci    const int32_t HEIGHT = 1080;
369094332d3Sopenharmony_ci    IRect rect = {0, 0, WIDTH, HEIGHT};
370094332d3Sopenharmony_ci    auto ret = g_composerDevice->SetDisplayClientCrop(g_displayIds[0], rect);
371094332d3Sopenharmony_ci    // not support
372094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_FAILURE, ret);
373094332d3Sopenharmony_ci}
374094332d3Sopenharmony_ci
375094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_GetDisplayReleaseFence, TestSize.Level1)
376094332d3Sopenharmony_ci{
377094332d3Sopenharmony_ci    std::vector<uint32_t> layers {};
378094332d3Sopenharmony_ci    std::vector<int32_t> fences {};
379094332d3Sopenharmony_ci    auto ret = g_composerDevice->GetDisplayReleaseFence(g_displayIds[0], layers, fences);
380094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
381094332d3Sopenharmony_ci}
382094332d3Sopenharmony_ci
383094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_SetDisplayClientBuffer, TestSize.Level1)
384094332d3Sopenharmony_ci{
385094332d3Sopenharmony_ci    BufferHandle* buffer = nullptr;
386094332d3Sopenharmony_ci    const int32_t WIDTH = 800;
387094332d3Sopenharmony_ci    const int32_t HEIGHT = 600;
388094332d3Sopenharmony_ci
389094332d3Sopenharmony_ci    AllocInfo info;
390094332d3Sopenharmony_ci    info.width  = WIDTH;
391094332d3Sopenharmony_ci    info.height = HEIGHT;
392094332d3Sopenharmony_ci    info.usage = OHOS::HDI::Display::Composer::V1_0::HBM_USE_MEM_DMA |
393094332d3Sopenharmony_ci            OHOS::HDI::Display::Composer::V1_0::HBM_USE_CPU_READ |
394094332d3Sopenharmony_ci            OHOS::HDI::Display::Composer::V1_0::HBM_USE_CPU_WRITE;
395094332d3Sopenharmony_ci    info.format = Composer::V1_0::PIXEL_FMT_RGBA_8888;
396094332d3Sopenharmony_ci
397094332d3Sopenharmony_ci    g_gralloc->AllocMem(info, buffer);
398094332d3Sopenharmony_ci    ASSERT_TRUE(buffer != nullptr);
399094332d3Sopenharmony_ci
400094332d3Sopenharmony_ci    uint32_t bufferSeq = 1;
401094332d3Sopenharmony_ci    auto ret = g_composerDevice->SetDisplayClientBuffer(g_displayIds[0], buffer, bufferSeq, -1);
402094332d3Sopenharmony_ci    g_gralloc->FreeMem(*buffer);
403094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
404094332d3Sopenharmony_ci}
405094332d3Sopenharmony_ci
406094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_SetDisplayClientDamage, TestSize.Level1)
407094332d3Sopenharmony_ci{
408094332d3Sopenharmony_ci    const int32_t WIDTH = 1920;
409094332d3Sopenharmony_ci    const int32_t HEIGHT = 1080;
410094332d3Sopenharmony_ci    IRect rect = {0, 0, WIDTH, HEIGHT};
411094332d3Sopenharmony_ci    std::vector<IRect> vRects;
412094332d3Sopenharmony_ci    vRects.push_back(rect);
413094332d3Sopenharmony_ci    auto ret = g_composerDevice->SetDisplayClientDamage(g_displayIds[0], vRects);
414094332d3Sopenharmony_ci    // not support
415094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
416094332d3Sopenharmony_ci}
417094332d3Sopenharmony_ci
418094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_CreateVirtualDisplay, TestSize.Level1)
419094332d3Sopenharmony_ci{
420094332d3Sopenharmony_ci    const uint32_t WIDTH = 1920;
421094332d3Sopenharmony_ci    const uint32_t HEIGHT = 1080;
422094332d3Sopenharmony_ci    int32_t format = 0;
423094332d3Sopenharmony_ci    uint32_t devId = 0;
424094332d3Sopenharmony_ci    auto ret = g_composerDevice->CreateVirtualDisplay(WIDTH, HEIGHT, format, devId);
425094332d3Sopenharmony_ci    // not support
426094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_FAILURE, ret);
427094332d3Sopenharmony_ci}
428094332d3Sopenharmony_ci
429094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_DestroyVirtualDisplay, TestSize.Level1)
430094332d3Sopenharmony_ci{
431094332d3Sopenharmony_ci    uint32_t devId = 0;
432094332d3Sopenharmony_ci    auto ret = g_composerDevice->DestroyVirtualDisplay(devId);
433094332d3Sopenharmony_ci    // not support
434094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_FAILURE, ret);
435094332d3Sopenharmony_ci}
436094332d3Sopenharmony_ci
437094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_SetVirtualDisplayBuffer, TestSize.Level1)
438094332d3Sopenharmony_ci{
439094332d3Sopenharmony_ci    BufferHandle* buffer = nullptr;
440094332d3Sopenharmony_ci    int32_t fence = -1;
441094332d3Sopenharmony_ci    const int32_t WIDTH = 800;
442094332d3Sopenharmony_ci    const int32_t HEIGHT = 600;
443094332d3Sopenharmony_ci
444094332d3Sopenharmony_ci    AllocInfo info;
445094332d3Sopenharmony_ci    info.width  = WIDTH;
446094332d3Sopenharmony_ci    info.height = HEIGHT;
447094332d3Sopenharmony_ci    info.usage = OHOS::HDI::Display::Composer::V1_0::HBM_USE_MEM_DMA |
448094332d3Sopenharmony_ci            OHOS::HDI::Display::Composer::V1_0::HBM_USE_CPU_READ |
449094332d3Sopenharmony_ci            OHOS::HDI::Display::Composer::V1_0::HBM_USE_CPU_WRITE;
450094332d3Sopenharmony_ci    info.format = Composer::V1_0::PIXEL_FMT_RGBA_8888;
451094332d3Sopenharmony_ci
452094332d3Sopenharmony_ci    g_gralloc->AllocMem(info, buffer);
453094332d3Sopenharmony_ci    ASSERT_TRUE(buffer != nullptr);
454094332d3Sopenharmony_ci
455094332d3Sopenharmony_ci    auto ret = g_composerDevice->SetVirtualDisplayBuffer(g_displayIds[0], *buffer, fence);
456094332d3Sopenharmony_ci    g_gralloc->FreeMem(*buffer);
457094332d3Sopenharmony_ci    // not support
458094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_FAILURE, ret);
459094332d3Sopenharmony_ci}
460094332d3Sopenharmony_ci
461094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_SetDisplayProperty, TestSize.Level1)
462094332d3Sopenharmony_ci{
463094332d3Sopenharmony_ci    const uint32_t PROPERTY_ID = 1;
464094332d3Sopenharmony_ci    const uint64_t PROPERTY_VALUE = 0;
465094332d3Sopenharmony_ci    auto ret = g_composerDevice->SetDisplayProperty(g_displayIds[0], PROPERTY_ID, PROPERTY_VALUE);
466094332d3Sopenharmony_ci    // not support
467094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_FAILURE, ret);
468094332d3Sopenharmony_ci}
469094332d3Sopenharmony_ci
470094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_SetLayerCrop, TestSize.Level1)
471094332d3Sopenharmony_ci{
472094332d3Sopenharmony_ci    std::vector<LayerSettings> settings = {
473094332d3Sopenharmony_ci        {
474094332d3Sopenharmony_ci            .rectRatio = { 0, 0, 1.0f, 1.0f },
475094332d3Sopenharmony_ci            .color = RED
476094332d3Sopenharmony_ci        },
477094332d3Sopenharmony_ci    };
478094332d3Sopenharmony_ci    std::vector<uint32_t> splitColors = { { RED, GREEN, YELLOW, BLUE, PINK, PURPLE, CYAN, TRANSPARENT } };
479094332d3Sopenharmony_ci
480094332d3Sopenharmony_ci    std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
481094332d3Sopenharmony_ci    ASSERT_TRUE((layers.size() > 0));
482094332d3Sopenharmony_ci    // split the buffer
483094332d3Sopenharmony_ci    auto layer = layers[0];
484094332d3Sopenharmony_ci    HdiGrallocBuffer* handle = layer->GetBackBuffer(); // the backbuffer has not present now
485094332d3Sopenharmony_ci    ASSERT_TRUE((handle != nullptr));
486094332d3Sopenharmony_ci    auto splitRects = SplitBuffer(*(handle->Get()), splitColors);
487094332d3Sopenharmony_ci    PrepareAndCommit();
488094332d3Sopenharmony_ci    for (uint32_t i = 0; i < splitRects.size(); i++) {
489094332d3Sopenharmony_ci        settings[0].color = splitColors[i];
490094332d3Sopenharmony_ci        layer->SetLayerCrop(splitRects[i]);
491094332d3Sopenharmony_ci        PresentAndCheck(settings);
492094332d3Sopenharmony_ci    }
493094332d3Sopenharmony_ci
494094332d3Sopenharmony_ci    DestroyLayer(layer);
495094332d3Sopenharmony_ci}
496094332d3Sopenharmony_ci
497094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_SetLayerZorder, TestSize.Level1)
498094332d3Sopenharmony_ci{
499094332d3Sopenharmony_ci    std::vector<LayerSettings> settings = {
500094332d3Sopenharmony_ci        {
501094332d3Sopenharmony_ci            .rectRatio = { 0, 0, 1.0f, 1.0f },
502094332d3Sopenharmony_ci            .color = RED
503094332d3Sopenharmony_ci        },
504094332d3Sopenharmony_ci        {
505094332d3Sopenharmony_ci            .rectRatio = { 0, 0, 1.0f, 1.0f },
506094332d3Sopenharmony_ci            .color = GREEN
507094332d3Sopenharmony_ci        },
508094332d3Sopenharmony_ci        {
509094332d3Sopenharmony_ci            .rectRatio = { 0, 0, 1.0f, 1.0f },
510094332d3Sopenharmony_ci            .color = YELLOW
511094332d3Sopenharmony_ci        },
512094332d3Sopenharmony_ci    };
513094332d3Sopenharmony_ci
514094332d3Sopenharmony_ci    std::vector<std::vector<int>> zorders = {
515094332d3Sopenharmony_ci        { 3, 2, 1 }, { 1, 3, 2 }, { 3, 1, 2 }, { 1, 2, 3 }, { 2, 1, 3 }, { 2, 3, 1 },
516094332d3Sopenharmony_ci    };
517094332d3Sopenharmony_ci    std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
518094332d3Sopenharmony_ci
519094332d3Sopenharmony_ci    for (const auto& zorderList : zorders) {
520094332d3Sopenharmony_ci        // adjust the zorder
521094332d3Sopenharmony_ci        for (uint32_t i = 0; i < zorderList.size(); i++) {
522094332d3Sopenharmony_ci            settings[i].zorder = zorderList[i];
523094332d3Sopenharmony_ci            layers[i]->SetZorder(zorderList[i]);
524094332d3Sopenharmony_ci        }
525094332d3Sopenharmony_ci        std::vector<LayerSettings> tempSettings = settings;
526094332d3Sopenharmony_ci        std::sort(tempSettings.begin(), tempSettings.end(),
527094332d3Sopenharmony_ci            [=](const auto& l, auto const & r) { return l.zorder < r.zorder; });
528094332d3Sopenharmony_ci        // present and check
529094332d3Sopenharmony_ci        PresentAndCheck(tempSettings);
530094332d3Sopenharmony_ci    }
531094332d3Sopenharmony_ci    HdiTestDevice::GetInstance().Clear();
532094332d3Sopenharmony_ci}
533094332d3Sopenharmony_ci
534094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_SetLayerPreMulti, TestSize.Level1)
535094332d3Sopenharmony_ci{
536094332d3Sopenharmony_ci    std::vector<LayerSettings> settings = {
537094332d3Sopenharmony_ci        {
538094332d3Sopenharmony_ci            .rectRatio = { 0, 0, 1.0f, 1.0f },
539094332d3Sopenharmony_ci            .color = GREEN
540094332d3Sopenharmony_ci        },
541094332d3Sopenharmony_ci    };
542094332d3Sopenharmony_ci
543094332d3Sopenharmony_ci    std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
544094332d3Sopenharmony_ci    ASSERT_TRUE((layers.size() > 0));
545094332d3Sopenharmony_ci    PrepareAndCommit();
546094332d3Sopenharmony_ci
547094332d3Sopenharmony_ci    auto layer = layers[0];
548094332d3Sopenharmony_ci    bool preMul = true;
549094332d3Sopenharmony_ci    auto ret = g_composerDevice->SetLayerPreMulti(g_displayIds[0], layer->GetId(), preMul);
550094332d3Sopenharmony_ci
551094332d3Sopenharmony_ci    PrepareAndCommit();
552094332d3Sopenharmony_ci    HdiTestDevice::GetInstance().Clear();
553094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
554094332d3Sopenharmony_ci
555094332d3Sopenharmony_ci    DestroyLayer(layer);
556094332d3Sopenharmony_ci}
557094332d3Sopenharmony_ci
558094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_SetLayerAlpha, TestSize.Level1)
559094332d3Sopenharmony_ci{
560094332d3Sopenharmony_ci    std::vector<LayerSettings> settings = {
561094332d3Sopenharmony_ci        {
562094332d3Sopenharmony_ci            .rectRatio = { 0, 0, 1.0f, 1.0f },
563094332d3Sopenharmony_ci            .color = GREEN
564094332d3Sopenharmony_ci        },
565094332d3Sopenharmony_ci        {
566094332d3Sopenharmony_ci            .rectRatio = { 0, 0, 1.0f, 1.0f },
567094332d3Sopenharmony_ci            .color = RED
568094332d3Sopenharmony_ci        },
569094332d3Sopenharmony_ci    };
570094332d3Sopenharmony_ci
571094332d3Sopenharmony_ci    std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
572094332d3Sopenharmony_ci    ASSERT_TRUE((layers.size() > 0));
573094332d3Sopenharmony_ci
574094332d3Sopenharmony_ci    auto layer = layers[1];
575094332d3Sopenharmony_ci    LayerAlpha alpha = { 0 };
576094332d3Sopenharmony_ci    alpha.enGlobalAlpha = true;
577094332d3Sopenharmony_ci    alpha.enPixelAlpha = true;
578094332d3Sopenharmony_ci    alpha.gAlpha = 0;
579094332d3Sopenharmony_ci    alpha.alpha0 = 0;
580094332d3Sopenharmony_ci    alpha.alpha1 = 0;
581094332d3Sopenharmony_ci    layer->SetAlpha(alpha);
582094332d3Sopenharmony_ci
583094332d3Sopenharmony_ci    PrepareAndCommit();
584094332d3Sopenharmony_ci    HdiTestDevice::GetInstance().Clear();
585094332d3Sopenharmony_ci
586094332d3Sopenharmony_ci    DestroyLayer(layer);
587094332d3Sopenharmony_ci}
588094332d3Sopenharmony_ci
589094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_SetLayerRegion, TestSize.Level1)
590094332d3Sopenharmony_ci{
591094332d3Sopenharmony_ci    std::vector<LayerSettings> settings = {
592094332d3Sopenharmony_ci        {.rectRatio = {0, 0, 1.0f, 1.0f}, .color = GREEN, .alpha = 0xFF}
593094332d3Sopenharmony_ci    };
594094332d3Sopenharmony_ci
595094332d3Sopenharmony_ci    std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
596094332d3Sopenharmony_ci    ASSERT_TRUE((layers.size() > 0));
597094332d3Sopenharmony_ci
598094332d3Sopenharmony_ci    const int32_t WIDTH = 100;
599094332d3Sopenharmony_ci    const int32_t HEIGHT = 100;
600094332d3Sopenharmony_ci    auto layer = layers[0];
601094332d3Sopenharmony_ci    IRect rect = {0, 0, WIDTH, HEIGHT};
602094332d3Sopenharmony_ci    auto ret = g_composerDevice->SetLayerRegion(g_displayIds[0], layer->GetId(), rect);
603094332d3Sopenharmony_ci
604094332d3Sopenharmony_ci    PrepareAndCommit();
605094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
606094332d3Sopenharmony_ci
607094332d3Sopenharmony_ci    DestroyLayer(layer);
608094332d3Sopenharmony_ci}
609094332d3Sopenharmony_ci
610094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_SetLayerDirtyRegion, TestSize.Level1)
611094332d3Sopenharmony_ci{
612094332d3Sopenharmony_ci    std::vector<LayerSettings> settings = {
613094332d3Sopenharmony_ci        {
614094332d3Sopenharmony_ci            .rectRatio = { 0, 0, 1.0f, 1.0f },
615094332d3Sopenharmony_ci            .color = BLUE
616094332d3Sopenharmony_ci        }
617094332d3Sopenharmony_ci    };
618094332d3Sopenharmony_ci
619094332d3Sopenharmony_ci    std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
620094332d3Sopenharmony_ci    ASSERT_TRUE((layers.size() > 0));
621094332d3Sopenharmony_ci
622094332d3Sopenharmony_ci    auto layer = layers[0];
623094332d3Sopenharmony_ci
624094332d3Sopenharmony_ci    const int32_t WIDTH = 100;
625094332d3Sopenharmony_ci    const int32_t HEIGHT = 100;
626094332d3Sopenharmony_ci    IRect rect = {0, 0, WIDTH, HEIGHT};
627094332d3Sopenharmony_ci    std::vector<IRect> vRects;
628094332d3Sopenharmony_ci    vRects.push_back(rect);
629094332d3Sopenharmony_ci    auto ret = g_composerDevice->SetLayerDirtyRegion(g_displayIds[0], layer->GetId(), vRects);
630094332d3Sopenharmony_ci
631094332d3Sopenharmony_ci    PrepareAndCommit();
632094332d3Sopenharmony_ci    HdiTestDevice::GetInstance().Clear();
633094332d3Sopenharmony_ci
634094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
635094332d3Sopenharmony_ci
636094332d3Sopenharmony_ci    DestroyLayer(layer);
637094332d3Sopenharmony_ci}
638094332d3Sopenharmony_ci
639094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_SetLayerTransformMode, TestSize.Level1)
640094332d3Sopenharmony_ci{
641094332d3Sopenharmony_ci    std::vector<LayerSettings> settings = {
642094332d3Sopenharmony_ci        {
643094332d3Sopenharmony_ci            .rectRatio = { 0, 0, 1.0f, 1.0f },
644094332d3Sopenharmony_ci            .color = RED
645094332d3Sopenharmony_ci        }
646094332d3Sopenharmony_ci    };
647094332d3Sopenharmony_ci
648094332d3Sopenharmony_ci    std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
649094332d3Sopenharmony_ci    ASSERT_TRUE((layers.size() > 0));
650094332d3Sopenharmony_ci
651094332d3Sopenharmony_ci    PrepareAndCommit();
652094332d3Sopenharmony_ci
653094332d3Sopenharmony_ci    auto layer = layers[0];
654094332d3Sopenharmony_ci
655094332d3Sopenharmony_ci    TransformType type = TransformType::ROTATE_90;
656094332d3Sopenharmony_ci    auto ret = g_composerDevice->SetLayerTransformMode(g_displayIds[0], layer->GetId(), type);
657094332d3Sopenharmony_ci    PrepareAndCommit();
658094332d3Sopenharmony_ci
659094332d3Sopenharmony_ci    type = TransformType::ROTATE_180;
660094332d3Sopenharmony_ci    ret = g_composerDevice->SetLayerTransformMode(g_displayIds[0], layer->GetId(), type);
661094332d3Sopenharmony_ci    PrepareAndCommit();
662094332d3Sopenharmony_ci
663094332d3Sopenharmony_ci    type = TransformType::ROTATE_270;
664094332d3Sopenharmony_ci    ret = g_composerDevice->SetLayerTransformMode(g_displayIds[0], layer->GetId(), type);
665094332d3Sopenharmony_ci    PrepareAndCommit();
666094332d3Sopenharmony_ci
667094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
668094332d3Sopenharmony_ci
669094332d3Sopenharmony_ci    DestroyLayer(layer);
670094332d3Sopenharmony_ci}
671094332d3Sopenharmony_ci
672094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_SetLayerVisibleRegion, TestSize.Level1)
673094332d3Sopenharmony_ci{
674094332d3Sopenharmony_ci    std::vector<LayerSettings> settings = {
675094332d3Sopenharmony_ci        {
676094332d3Sopenharmony_ci            .rectRatio = { 0, 0, 1.0f, 1.0f },
677094332d3Sopenharmony_ci            .color = BLUE
678094332d3Sopenharmony_ci        }
679094332d3Sopenharmony_ci    };
680094332d3Sopenharmony_ci
681094332d3Sopenharmony_ci    std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
682094332d3Sopenharmony_ci    ASSERT_TRUE((layers.size() > 0));
683094332d3Sopenharmony_ci    PrepareAndCommit();
684094332d3Sopenharmony_ci    auto layer = layers[0];
685094332d3Sopenharmony_ci
686094332d3Sopenharmony_ci    const int32_t WIDTH = 500;
687094332d3Sopenharmony_ci    const int32_t HEIGHT = 500;
688094332d3Sopenharmony_ci    IRect region = {0, 0, WIDTH, HEIGHT};
689094332d3Sopenharmony_ci    std::vector<IRect> regions = {};
690094332d3Sopenharmony_ci    regions.push_back(region);
691094332d3Sopenharmony_ci    auto ret = g_composerDevice->SetLayerVisibleRegion(g_displayIds[0], layer->GetId(), regions);
692094332d3Sopenharmony_ci    PrepareAndCommit();
693094332d3Sopenharmony_ci
694094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
695094332d3Sopenharmony_ci
696094332d3Sopenharmony_ci    DestroyLayer(layer);
697094332d3Sopenharmony_ci}
698094332d3Sopenharmony_ci
699094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_SetLayerBuffer, TestSize.Level1)
700094332d3Sopenharmony_ci{
701094332d3Sopenharmony_ci    std::vector<LayerSettings> settings = {
702094332d3Sopenharmony_ci        {
703094332d3Sopenharmony_ci            .rectRatio = { 0, 0, 1.0f, 1.0f },
704094332d3Sopenharmony_ci            .color = GREEN
705094332d3Sopenharmony_ci        }
706094332d3Sopenharmony_ci    };
707094332d3Sopenharmony_ci
708094332d3Sopenharmony_ci    std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
709094332d3Sopenharmony_ci    ASSERT_TRUE((layers.size() > 0));
710094332d3Sopenharmony_ci
711094332d3Sopenharmony_ci    auto layer = layers[0];
712094332d3Sopenharmony_ci
713094332d3Sopenharmony_ci    auto graphicBuffer = layer->AcquireBackBuffer();
714094332d3Sopenharmony_ci    int32_t ret = graphicBuffer->SetGraphicBuffer([&](const BufferHandle* buffer, uint32_t seqNo) -> int32_t {
715094332d3Sopenharmony_ci        std::vector<uint32_t> deletingList;
716094332d3Sopenharmony_ci        int32_t result = g_composerDevice->SetLayerBuffer(g_displayIds[0], layer->GetId(), buffer, seqNo, -1,
717094332d3Sopenharmony_ci            deletingList);
718094332d3Sopenharmony_ci        return result;
719094332d3Sopenharmony_ci    });
720094332d3Sopenharmony_ci    PrepareAndCommit();
721094332d3Sopenharmony_ci
722094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
723094332d3Sopenharmony_ci
724094332d3Sopenharmony_ci    DestroyLayer(layer);
725094332d3Sopenharmony_ci}
726094332d3Sopenharmony_ci
727094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_SetLayerCompositionType, TestSize.Level1)
728094332d3Sopenharmony_ci{
729094332d3Sopenharmony_ci    std::vector<LayerSettings> settings = {
730094332d3Sopenharmony_ci        {
731094332d3Sopenharmony_ci            .rectRatio = { 0, 0, 1.0f, 1.0f },
732094332d3Sopenharmony_ci            .color = BLUE
733094332d3Sopenharmony_ci        }
734094332d3Sopenharmony_ci    };
735094332d3Sopenharmony_ci
736094332d3Sopenharmony_ci    std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
737094332d3Sopenharmony_ci    ASSERT_TRUE((layers.size() > 0));
738094332d3Sopenharmony_ci
739094332d3Sopenharmony_ci    auto layer = layers[0];
740094332d3Sopenharmony_ci
741094332d3Sopenharmony_ci    Composer::V1_0::CompositionType type = Composer::V1_0::CompositionType::COMPOSITION_CLIENT;
742094332d3Sopenharmony_ci    auto ret = g_composerDevice->SetLayerCompositionType(g_displayIds[0], layer->GetId(), type);
743094332d3Sopenharmony_ci
744094332d3Sopenharmony_ci    PrepareAndCommit();
745094332d3Sopenharmony_ci
746094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
747094332d3Sopenharmony_ci
748094332d3Sopenharmony_ci    DestroyLayer(layer);
749094332d3Sopenharmony_ci}
750094332d3Sopenharmony_ci
751094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_SetLayerBlendType, TestSize.Level1)
752094332d3Sopenharmony_ci{
753094332d3Sopenharmony_ci    std::vector<LayerSettings> settings = {
754094332d3Sopenharmony_ci        {
755094332d3Sopenharmony_ci            .rectRatio = { 0, 0, 1.0f, 1.0f },
756094332d3Sopenharmony_ci            .color = GREEN
757094332d3Sopenharmony_ci        }
758094332d3Sopenharmony_ci    };
759094332d3Sopenharmony_ci
760094332d3Sopenharmony_ci    std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
761094332d3Sopenharmony_ci    ASSERT_TRUE((layers.size() > 0));
762094332d3Sopenharmony_ci
763094332d3Sopenharmony_ci    auto layer = layers[0];
764094332d3Sopenharmony_ci
765094332d3Sopenharmony_ci    BlendType type = BlendType::BLEND_NONE;
766094332d3Sopenharmony_ci    auto ret = g_composerDevice->SetLayerBlendType(g_displayIds[0], layer->GetId(), type);
767094332d3Sopenharmony_ci
768094332d3Sopenharmony_ci    PrepareAndCommit();
769094332d3Sopenharmony_ci
770094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
771094332d3Sopenharmony_ci
772094332d3Sopenharmony_ci    DestroyLayer(layer);
773094332d3Sopenharmony_ci}
774094332d3Sopenharmony_ci
775094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_SetLayerMaskInfo, TestSize.Level1)
776094332d3Sopenharmony_ci{
777094332d3Sopenharmony_ci    std::vector<LayerSettings> settings = {
778094332d3Sopenharmony_ci        {
779094332d3Sopenharmony_ci            .rectRatio = { 0, 0, 1.0f, 1.0f },
780094332d3Sopenharmony_ci            .color = GREEN
781094332d3Sopenharmony_ci        }
782094332d3Sopenharmony_ci    };
783094332d3Sopenharmony_ci
784094332d3Sopenharmony_ci    std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
785094332d3Sopenharmony_ci    ASSERT_TRUE((layers.size() > 0));
786094332d3Sopenharmony_ci
787094332d3Sopenharmony_ci    auto layer = layers[0];
788094332d3Sopenharmony_ci
789094332d3Sopenharmony_ci    MaskInfo maskInfo = MaskInfo::LAYER_HBM_SYNC;
790094332d3Sopenharmony_ci    auto ret = g_composerDevice->SetLayerMaskInfo(g_displayIds[0], layer->GetId(), maskInfo);
791094332d3Sopenharmony_ci
792094332d3Sopenharmony_ci    HdiTestDevice::GetInstance().Clear();
793094332d3Sopenharmony_ci
794094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
795094332d3Sopenharmony_ci}
796094332d3Sopenharmony_ci
797094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_SetLayerColor, TestSize.Level1)
798094332d3Sopenharmony_ci{
799094332d3Sopenharmony_ci    std::vector<LayerSettings> settings = {
800094332d3Sopenharmony_ci        {
801094332d3Sopenharmony_ci            .rectRatio = { 0, 0, 1.0f, 1.0f },
802094332d3Sopenharmony_ci            .color = GREEN
803094332d3Sopenharmony_ci        }
804094332d3Sopenharmony_ci    };
805094332d3Sopenharmony_ci
806094332d3Sopenharmony_ci    std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
807094332d3Sopenharmony_ci    ASSERT_TRUE((layers.size() > 0));
808094332d3Sopenharmony_ci
809094332d3Sopenharmony_ci    auto layer = layers[0];
810094332d3Sopenharmony_ci    const uint32_t COLOR_R = 155;
811094332d3Sopenharmony_ci    const uint32_t COLOR_G = 224;
812094332d3Sopenharmony_ci    const uint32_t COLOR_B = 88;
813094332d3Sopenharmony_ci    const uint32_t COLOR_A = 128;
814094332d3Sopenharmony_ci
815094332d3Sopenharmony_ci    LayerColor layerColor = {
816094332d3Sopenharmony_ci        .r = COLOR_R,
817094332d3Sopenharmony_ci        .g = COLOR_G,
818094332d3Sopenharmony_ci        .b = COLOR_B,
819094332d3Sopenharmony_ci        .a = COLOR_A
820094332d3Sopenharmony_ci    };
821094332d3Sopenharmony_ci
822094332d3Sopenharmony_ci    auto ret = g_composerDevice->SetLayerColor(g_displayIds[0], layer->GetId(), layerColor);
823094332d3Sopenharmony_ci
824094332d3Sopenharmony_ci    PrepareAndCommit();
825094332d3Sopenharmony_ci
826094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
827094332d3Sopenharmony_ci
828094332d3Sopenharmony_ci    DestroyLayer(layer);
829094332d3Sopenharmony_ci}
830094332d3Sopenharmony_ci
831094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_DestroyLayer, TestSize.Level1)
832094332d3Sopenharmony_ci{
833094332d3Sopenharmony_ci    std::vector<LayerSettings> settings = {
834094332d3Sopenharmony_ci        {
835094332d3Sopenharmony_ci            .rectRatio = { 0, 0, 1.0f, 1.0f },
836094332d3Sopenharmony_ci            .color = PURPLE
837094332d3Sopenharmony_ci        }
838094332d3Sopenharmony_ci    };
839094332d3Sopenharmony_ci
840094332d3Sopenharmony_ci    std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
841094332d3Sopenharmony_ci    ASSERT_TRUE((layers.size() > 0));
842094332d3Sopenharmony_ci    auto layer = layers[0];
843094332d3Sopenharmony_ci    PrepareAndCommit();
844094332d3Sopenharmony_ci
845094332d3Sopenharmony_ci    sleep(1);
846094332d3Sopenharmony_ci    auto ret = g_composerDevice->DestroyLayer(g_displayIds[0], layer->GetId());
847094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
848094332d3Sopenharmony_ci    std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_CONT_100));
849094332d3Sopenharmony_ci}
850094332d3Sopenharmony_ci
851094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_RegDisplayVBlankCallback, TestSize.Level1)
852094332d3Sopenharmony_ci{
853094332d3Sopenharmony_ci    int ret;
854094332d3Sopenharmony_ci    DISPLAY_TEST_LOGD();
855094332d3Sopenharmony_ci    std::shared_ptr<HdiTestDisplay> display = HdiTestDevice::GetInstance().GetFirstDisplay();
856094332d3Sopenharmony_ci    ASSERT_TRUE(display != nullptr) << "get display failed";
857094332d3Sopenharmony_ci    ret = display->RegDisplayVBlankCallback(TestVBlankCallback, nullptr);
858094332d3Sopenharmony_ci    ASSERT_TRUE(ret == DISPLAY_SUCCESS) << "RegDisplayVBlankCallback failed";
859094332d3Sopenharmony_ci    ret = display->SetDisplayVsyncEnabled(true);
860094332d3Sopenharmony_ci    ASSERT_TRUE(ret == DISPLAY_SUCCESS) << "SetDisplayVsyncEnabled failed";
861094332d3Sopenharmony_ci
862094332d3Sopenharmony_ci    std::vector<LayerSettings> settings = {
863094332d3Sopenharmony_ci        {
864094332d3Sopenharmony_ci            .rectRatio = { 0, 0, 1.0f, 1.0f },
865094332d3Sopenharmony_ci            .color = PINK
866094332d3Sopenharmony_ci        },
867094332d3Sopenharmony_ci    };
868094332d3Sopenharmony_ci    std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
869094332d3Sopenharmony_ci    ASSERT_TRUE((layers.size() > 0));
870094332d3Sopenharmony_ci    VblankCtr::GetInstance().hasVblank_ = false;
871094332d3Sopenharmony_ci    PrepareAndCommit();
872094332d3Sopenharmony_ci    ret = VblankCtr::GetInstance().WaitVblank(SLEEP_CONT_100); // 100ms
873094332d3Sopenharmony_ci    ASSERT_TRUE(ret == DISPLAY_SUCCESS) << "WaitVblank timeout";
874094332d3Sopenharmony_ci    ret = display->SetDisplayVsyncEnabled(false);
875094332d3Sopenharmony_ci    ASSERT_TRUE(ret == DISPLAY_SUCCESS) << "SetDisplayVsyncEnabled failed";
876094332d3Sopenharmony_ci    usleep(SLEEP_CONT_100 * SLEEP_CONT_2000); // wait for 100ms avoid the last vsync.
877094332d3Sopenharmony_ci    VblankCtr::GetInstance().hasVblank_ = false;
878094332d3Sopenharmony_ci    ret = VblankCtr::GetInstance().WaitVblank(SLEEP_CONT_100); // 100ms
879094332d3Sopenharmony_ci    ASSERT_TRUE(ret != DISPLAY_SUCCESS) << "vblank do not disable";
880094332d3Sopenharmony_ci
881094332d3Sopenharmony_ci    DestroyLayer(layers[0]);
882094332d3Sopenharmony_ci}
883094332d3Sopenharmony_ci
884094332d3Sopenharmony_civoid DeviceTest::OnMode(uint32_t modeId, uint64_t vBlankPeriod, void* data)
885094332d3Sopenharmony_ci{
886094332d3Sopenharmony_ci    g_isOnModeCalled = true;
887094332d3Sopenharmony_ci}
888094332d3Sopenharmony_ci
889094332d3Sopenharmony_civoid DeviceTest::OnSeamlessChange(uint32_t devId, void* data)
890094332d3Sopenharmony_ci{
891094332d3Sopenharmony_ci    g_isOnSeamlessChangeCalled = true;
892094332d3Sopenharmony_ci}
893094332d3Sopenharmony_ci
894094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_GetDisplaySupportedModesExt, TestSize.Level1)
895094332d3Sopenharmony_ci{
896094332d3Sopenharmony_ci    std::vector<DisplayModeInfoExt> modes;
897094332d3Sopenharmony_ci    auto ret = g_composerDevice->GetDisplaySupportedModesExt(g_displayIds[0], modes);
898094332d3Sopenharmony_ci    if (ret == DISPLAY_NOT_SUPPORT) {
899094332d3Sopenharmony_ci        DISPLAY_TEST_LOGD("GetDisplaySupportedModesExt not support");
900094332d3Sopenharmony_ci        return;
901094332d3Sopenharmony_ci    }
902094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
903094332d3Sopenharmony_ci}
904094332d3Sopenharmony_ci
905094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_SetDisplayModeAsync, TestSize.Level1)
906094332d3Sopenharmony_ci{
907094332d3Sopenharmony_ci    g_isOnModeCalled = false;
908094332d3Sopenharmony_ci    std::vector<DisplayModeInfo> oldModes;
909094332d3Sopenharmony_ci    std::vector<LayerSettings> settings = {
910094332d3Sopenharmony_ci        {
911094332d3Sopenharmony_ci            .rectRatio = { 0, 0, 1.0f, 1.0f },
912094332d3Sopenharmony_ci            .color = RED
913094332d3Sopenharmony_ci        }
914094332d3Sopenharmony_ci    };
915094332d3Sopenharmony_ci
916094332d3Sopenharmony_ci    // 先注册VBlankCallback
917094332d3Sopenharmony_ci    auto ret = g_composerDevice->RegDisplayVBlankCallback(g_displayIds[0], TestVBlankCallback, nullptr);
918094332d3Sopenharmony_ci    ASSERT_TRUE(ret == DISPLAY_SUCCESS) << "RegDisplayVBlankCallback failed";
919094332d3Sopenharmony_ci
920094332d3Sopenharmony_ci    ret = g_composerDevice->GetDisplaySupportedModes(g_displayIds[0], oldModes);
921094332d3Sopenharmony_ci    ASSERT_EQ(DISPLAY_SUCCESS, ret);
922094332d3Sopenharmony_ci    ASSERT_EQ(oldModes.size() > 0, true);
923094332d3Sopenharmony_ci
924094332d3Sopenharmony_ci    uint32_t modeid = oldModes[0].id;
925094332d3Sopenharmony_ci    ret = g_composerDevice->SetDisplayModeAsync(g_displayIds[0], modeid, OnMode);
926094332d3Sopenharmony_ci    if (ret == DISPLAY_NOT_SUPPORT) {
927094332d3Sopenharmony_ci        return;
928094332d3Sopenharmony_ci    }
929094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
930094332d3Sopenharmony_ci    if (ret == DISPLAY_SUCCESS) {
931094332d3Sopenharmony_ci        std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
932094332d3Sopenharmony_ci        ASSERT_TRUE((layers.size() > 0));
933094332d3Sopenharmony_ci        g_threadCtrl = false;
934094332d3Sopenharmony_ci        std::thread commitThread(LoopCommit);
935094332d3Sopenharmony_ci        std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_CONT_100));
936094332d3Sopenharmony_ci        g_threadCtrl = true;
937094332d3Sopenharmony_ci        commitThread.join();
938094332d3Sopenharmony_ci        ASSERT_EQ(g_isOnModeCalled, true);
939094332d3Sopenharmony_ci
940094332d3Sopenharmony_ci        DestroyLayer(layers[0]);
941094332d3Sopenharmony_ci    }
942094332d3Sopenharmony_ci}
943094332d3Sopenharmony_ci
944094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_GetDisplayVBlankPeriod, TestSize.Level1)
945094332d3Sopenharmony_ci{
946094332d3Sopenharmony_ci    uint64_t period = 0;
947094332d3Sopenharmony_ci    auto ret = g_composerDevice->GetDisplayVBlankPeriod(g_displayIds[0], period);
948094332d3Sopenharmony_ci    if (ret == DISPLAY_NOT_SUPPORT) {
949094332d3Sopenharmony_ci        DISPLAY_TEST_LOGD("GetDisplayVBlankPeriod not support");
950094332d3Sopenharmony_ci        return;
951094332d3Sopenharmony_ci    }
952094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
953094332d3Sopenharmony_ci    EXPECT_EQ(period != 0, true);
954094332d3Sopenharmony_ci}
955094332d3Sopenharmony_ci
956094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_RegSeamlessChangeCallback, TestSize.Level1)
957094332d3Sopenharmony_ci{
958094332d3Sopenharmony_ci    g_isOnSeamlessChangeCalled = false;
959094332d3Sopenharmony_ci    auto ret = g_composerDevice->RegSeamlessChangeCallback(OnSeamlessChange, nullptr);
960094332d3Sopenharmony_ci    if (ret == DISPLAY_NOT_SUPPORT) {
961094332d3Sopenharmony_ci        DISPLAY_TEST_LOGD("RegSeamlessChangeCallback not support");
962094332d3Sopenharmony_ci        return;
963094332d3Sopenharmony_ci    }
964094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
965094332d3Sopenharmony_ci    if (ret == DISPLAY_SUCCESS) {
966094332d3Sopenharmony_ci        std::this_thread::sleep_for(std::chrono::milliseconds(5000));
967094332d3Sopenharmony_ci        ASSERT_EQ(g_isOnSeamlessChangeCalled, true);
968094332d3Sopenharmony_ci    }
969094332d3Sopenharmony_ci}
970094332d3Sopenharmony_ci
971094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_SetLayerPerFrameParameter, TestSize.Level1)
972094332d3Sopenharmony_ci{
973094332d3Sopenharmony_ci    std::vector<LayerSettings> settings = {
974094332d3Sopenharmony_ci        {
975094332d3Sopenharmony_ci            .rectRatio = { 0, 0, 1.0f, 1.0f },
976094332d3Sopenharmony_ci            .color = GREEN
977094332d3Sopenharmony_ci        },
978094332d3Sopenharmony_ci    };
979094332d3Sopenharmony_ci
980094332d3Sopenharmony_ci    std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
981094332d3Sopenharmony_ci    ASSERT_TRUE((layers.size() > 0));
982094332d3Sopenharmony_ci    auto layer = layers[0];
983094332d3Sopenharmony_ci    std::vector<std::string> ValidKeys = { "FilmFilter", "ArsrDoEnhance", "SDRBrightnessRatio", "BrightnessNit",
984094332d3Sopenharmony_ci        "ViewGroupHasValidAlpha", "SourceCropTuning" };
985094332d3Sopenharmony_ci    std::string key;
986094332d3Sopenharmony_ci    std::vector<int8_t> value = { 1 };
987094332d3Sopenharmony_ci    key = "NotSupportKey";
988094332d3Sopenharmony_ci    auto ret = g_composerDevice->SetLayerPerFrameParameter(g_displayIds[0], layer->GetId(), key, value);
989094332d3Sopenharmony_ci    if (ret == DISPLAY_NOT_SUPPORT) {
990094332d3Sopenharmony_ci        DISPLAY_TEST_LOGD("SetLayerPerFrameParameter not support");
991094332d3Sopenharmony_ci        return;
992094332d3Sopenharmony_ci    }
993094332d3Sopenharmony_ci    ASSERT_EQ(ret, -1) << "key not support, ret:" << ret;
994094332d3Sopenharmony_ci    key = ValidKeys[0];
995094332d3Sopenharmony_ci    ret = g_composerDevice->SetLayerPerFrameParameter(g_displayIds[0], layer->GetId(), key, value);
996094332d3Sopenharmony_ci    ASSERT_EQ(ret, 0) << "key support, ret:" << ret;
997094332d3Sopenharmony_ci    if (ret == DISPLAY_NOT_SUPPORT) {
998094332d3Sopenharmony_ci        DISPLAY_TEST_LOGD("SetLayerPerFrameParameter not support");
999094332d3Sopenharmony_ci        return;
1000094332d3Sopenharmony_ci    }
1001094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
1002094332d3Sopenharmony_ci}
1003094332d3Sopenharmony_ci
1004094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_GetSupportedLayerPerFrameParameterKey, TestSize.Level1)
1005094332d3Sopenharmony_ci{
1006094332d3Sopenharmony_ci    std::vector<std::string> keys;
1007094332d3Sopenharmony_ci    auto ret = g_composerDevice->GetSupportedLayerPerFrameParameterKey(keys);
1008094332d3Sopenharmony_ci    if (ret == DISPLAY_NOT_SUPPORT) {
1009094332d3Sopenharmony_ci        DISPLAY_TEST_LOGD("GetSupportedLayerPerFrameParameterKey not support");
1010094332d3Sopenharmony_ci        return;
1011094332d3Sopenharmony_ci    }
1012094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
1013094332d3Sopenharmony_ci}
1014094332d3Sopenharmony_ci
1015094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_SetDisplayOverlayResolution, TestSize.Level1)
1016094332d3Sopenharmony_ci{
1017094332d3Sopenharmony_ci    DisplayModeInfo mode = GetFirstDisplay()->GetCurrentMode();
1018094332d3Sopenharmony_ci    auto ret = g_composerDevice->SetDisplayOverlayResolution(g_displayIds[0], mode.width, mode.height);
1019094332d3Sopenharmony_ci    if (ret == DISPLAY_NOT_SUPPORT) {
1020094332d3Sopenharmony_ci        DISPLAY_TEST_LOGD("SetDisplayOverlayResolution not support");
1021094332d3Sopenharmony_ci        return;
1022094332d3Sopenharmony_ci    }
1023094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
1024094332d3Sopenharmony_ci}
1025094332d3Sopenharmony_ci
1026094332d3Sopenharmony_cistatic void TestRefreshCallback(uint32_t devId, void* data)
1027094332d3Sopenharmony_ci{
1028094332d3Sopenharmony_ci}
1029094332d3Sopenharmony_ci
1030094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_RegRefreshCallback, TestSize.Level1)
1031094332d3Sopenharmony_ci{
1032094332d3Sopenharmony_ci    auto ret = g_composerDevice->RegRefreshCallback(TestRefreshCallback, nullptr);
1033094332d3Sopenharmony_ci    if (ret == DISPLAY_NOT_SUPPORT) {
1034094332d3Sopenharmony_ci        DISPLAY_TEST_LOGD("RegRefreshCallback not support");
1035094332d3Sopenharmony_ci        return;
1036094332d3Sopenharmony_ci    }
1037094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
1038094332d3Sopenharmony_ci}
1039094332d3Sopenharmony_ci
1040094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_GetDisplaySupportedColorGamuts, TestSize.Level1)
1041094332d3Sopenharmony_ci{
1042094332d3Sopenharmony_ci    std::vector<ColorGamut> gamuts;
1043094332d3Sopenharmony_ci    auto ret = g_composerDevice->GetDisplaySupportedColorGamuts(g_displayIds[0], gamuts);
1044094332d3Sopenharmony_ci    if (ret == DISPLAY_NOT_SUPPORT) {
1045094332d3Sopenharmony_ci        DISPLAY_TEST_LOGD("GetDisplaySupportedColorGamuts not support");
1046094332d3Sopenharmony_ci        return;
1047094332d3Sopenharmony_ci    }
1048094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
1049094332d3Sopenharmony_ci}
1050094332d3Sopenharmony_ci
1051094332d3Sopenharmony_ciHWTEST_F(DeviceTest, test_GetHDRCapabilityInfos, TestSize.Level1)
1052094332d3Sopenharmony_ci{
1053094332d3Sopenharmony_ci    HDRCapability info = { 0 };
1054094332d3Sopenharmony_ci    auto ret = g_composerDevice->GetHDRCapabilityInfos(g_displayIds[0], info);
1055094332d3Sopenharmony_ci    if (ret == DISPLAY_NOT_SUPPORT) {
1056094332d3Sopenharmony_ci        DISPLAY_TEST_LOGD("GetHDRCapabilityInfos not support");
1057094332d3Sopenharmony_ci        return;
1058094332d3Sopenharmony_ci    }
1059094332d3Sopenharmony_ci    EXPECT_EQ(DISPLAY_SUCCESS, ret);
1060094332d3Sopenharmony_ci}
1061