• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <sys/time.h>
17 #include <thread>
18 #include <chrono>
19 #include <cinttypes>
20 #include <algorithm>
21 #include "v1_3/include/idisplay_composer_interface.h"
22 #include "v1_3/display_composer_type.h"
23 #include "v1_0/display_buffer_type.h"
24 #include "display_test.h"
25 #include "display_test_utils.h"
26 #include "hdi_composition_check.h"
27 #include "hdi_test_device.h"
28 #include "hdi_test_device_common.h"
29 #include "hdi_test_display.h"
30 #include "hdi_test_render_utils.h"
31 #include "timer.h"
32 #include "hdi_composer_ut.h"
33 
34 using namespace OHOS::HDI::Display::Buffer::V1_0;
35 using namespace OHOS::HDI::Display::Composer::V1_3;
36 using namespace OHOS::HDI::Display::TEST;
37 using namespace testing::ext;
38 
39 static sptr<Composer::V1_3::IDisplayComposerInterface> g_composerDevice = nullptr;
40 static std::shared_ptr<IDisplayBuffer> g_gralloc = nullptr;
41 static std::vector<uint32_t> g_displayIds;
42 const int SLEEP_CONT_10 = 10;
43 const int SLEEP_CONT_100 = 100;
44 const int SLEEP_CONT_2000 = 2000;
45 static bool g_isOnSeamlessChangeCalled = false;
46 static bool g_isOnModeCalled = false;
47 static bool g_isOnHwcEventCalled = false;
48 static bool g_threadCtrl = false;
49 static constexpr int32_t VALID_HDI_FD = 1;
50 static constexpr int32_t INVALID_HDI_FD = -1;
51 
GetFirstDisplay()52 static inline std::shared_ptr<HdiTestDisplay> GetFirstDisplay()
53 {
54     return HdiTestDevice::GetInstance().GetFirstDisplay();
55 }
56 
CheckComposition(std::vector<LayerSettings> & layers,BufferHandle * clientBuffer,uint32_t checkType=HdiCompositionCheck::CHECK_VERTEX)57 static int32_t CheckComposition(std::vector<LayerSettings> &layers, BufferHandle* clientBuffer,
58     uint32_t checkType = HdiCompositionCheck::CHECK_VERTEX)
59 {
60     DISPLAY_TEST_CHK_RETURN((clientBuffer == nullptr), DISPLAY_NULL_PTR, DISPLAY_TEST_LOGE("client buffer is nullptr"));
61     return HdiCompositionCheck::GetInstance().Check(layers, *clientBuffer, checkType);
62 }
63 
CreateTestLayer(LayerSettings setting,uint32_t zorder)64 static std::shared_ptr<HdiTestLayer> CreateTestLayer(LayerSettings setting, uint32_t zorder)
65 {
66     int ret;
67     HdiTestDevice::GetInstance();
68     DISPLAY_TEST_LOGD("color 0x%x", setting.color);
69     std::shared_ptr<HdiTestDisplay> display = HdiTestDevice::GetInstance().GetFirstDisplay();
70     DISPLAY_TEST_CHK_RETURN((display == nullptr), nullptr, DISPLAY_TEST_LOGE("can not get display"));
71 
72     std::shared_ptr<HdiTestLayer> layer = display->CreateHdiTestLayer(setting.bufferSize.w, setting.bufferSize.h);
73     DISPLAY_TEST_CHK_RETURN((layer == nullptr), nullptr, DISPLAY_TEST_LOGE("can not create hdi test layer"));
74 
75     layer->SetLayerPosition(setting.displayRect);
76 
77     layer->SetCompType(setting.compositionType);
78 
79     if ((setting.alpha >= 0) && (setting.alpha <= 0xff)) { // alpha rang 0x00 ~ 0xff
80         LayerAlpha alpha = { 0 };
81         alpha.gAlpha = setting.alpha;
82         alpha.enGlobalAlpha = true;
83         layer->SetAlpha(alpha);
84     }
85     HdiGrallocBuffer* handle = layer->GetFrontBuffer();
86     DISPLAY_TEST_CHK_RETURN((handle == nullptr), nullptr, DISPLAY_TEST_LOGE("can not get front buffer"));
87     ClearColor(*(handle->Get()), setting.color);
88     ret = layer->SwapFrontToBackQ();
89     DISPLAY_TEST_CHK_RETURN((ret != DISPLAY_SUCCESS), nullptr, DISPLAY_TEST_LOGE("SwapFrontToBackQ failed"));
90     layer->SetZorder(zorder);
91     layer->SetBlendType(setting.blendType);
92     layer->SetTransform(setting.rotate);
93     return layer;
94 }
95 
PrepareAndCommit()96 static int PrepareAndCommit()
97 {
98     int ret;
99     DISPLAY_TEST_LOGD();
100     std::shared_ptr<HdiTestDisplay> display = HdiTestDevice::GetInstance().GetFirstDisplay();
101     DISPLAY_TEST_CHK_RETURN((display == nullptr), DISPLAY_FAILURE, DISPLAY_TEST_LOGE("can not get display"));
102 
103     ret = display->PrepareDisplayLayers(); // 确定顶压策略(是否走GPU合成)、刷新layer列表
104     DISPLAY_TEST_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE,
105         DISPLAY_TEST_LOGE("PrepareDisplayLayers failed"));
106 
107     ret = display->Commit(); // 送显
108     DISPLAY_TEST_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_TEST_LOGE("Commit failed"));
109     return DISPLAY_SUCCESS;
110 }
111 
LoopCommit()112 static void LoopCommit()
113 {
114     while (!g_threadCtrl) {
115         PrepareAndCommit();
116         std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_CONT_10));
117     }
118 }
119 
TestVBlankCallback(unsigned int sequence,uint64_t ns,void * data)120 static void TestVBlankCallback(unsigned int sequence, uint64_t ns, void* data)
121 {
122     static uint64_t lastns;
123     DISPLAY_TEST_LOGD("seq %{public}d  ns %" PRId64 " duration %" PRId64 " ns", sequence, ns, (ns - lastns));
124     lastns = ns;
125     VblankCtr::GetInstance().NotifyVblank(sequence, ns, data);
126 }
127 
AdjustLayerSettings(std::vector<LayerSettings> & settings,uint32_t w,uint32_t h)128 static void AdjustLayerSettings(std::vector<LayerSettings> &settings, uint32_t w, uint32_t h)
129 {
130     DISPLAY_TEST_LOGD();
131     for (uint32_t i = 0; i < settings.size(); i++) {
132         LayerSettings& setting = settings[i];
133         DISPLAY_TEST_LOGD(" ratio w: %f  ratio h: %f", setting.rectRatio.w, setting.rectRatio.h);
134         if ((setting.rectRatio.w > 0.0f) && (setting.rectRatio.h > 0.0f)) {
135             setting.displayRect.h = static_cast<uint32_t>(setting.rectRatio.h * h);
136             setting.displayRect.w = static_cast<uint32_t>(setting.rectRatio.w * w);
137             setting.displayRect.x = static_cast<uint32_t>(setting.rectRatio.x * w);
138             setting.displayRect.y = static_cast<uint32_t>(setting.rectRatio.y * h);
139             DISPLAY_TEST_LOGD("display rect adjust form %f %f %f %f to %{public}d %{public}d %{public}d %{public}d ",
140                 setting.rectRatio.x, setting.rectRatio.y, setting.rectRatio.w, setting.rectRatio.h,
141                 setting.displayRect.x, setting.displayRect.y, setting.displayRect.w, setting.displayRect.h);
142         }
143 
144         if ((setting.bufferRatio.h > 0.0f) || (setting.bufferRatio.w > 0.0f)) {
145             setting.bufferSize.h = static_cast<uint32_t>(setting.bufferRatio.h * h);
146             setting.bufferSize.w = static_cast<uint32_t>(setting.bufferRatio.w * w);
147             DISPLAY_TEST_LOGD("buffer size adjust for %f %f to %{public}d %{public}d",
148                 setting.bufferRatio.w, setting.bufferRatio.h, setting.bufferSize.w, setting.bufferSize.h);
149         }
150 
151         if ((setting.bufferSize.w == 0) || (setting.bufferSize.h == 0)) {
152             DISPLAY_TEST_LOGD("buffer size adjust for %{public}d %{public}d to %{public}d %{public}d",
153                 setting.bufferSize.w, setting.bufferSize.h, setting.displayRect.w, setting.displayRect.h);
154 
155             setting.bufferSize.w = setting.displayRect.w;
156             setting.bufferSize.h = setting.displayRect.h;
157         }
158     }
159 }
160 
CreateLayers(std::vector<LayerSettings> & settings)161 static std::vector<std::shared_ptr<HdiTestLayer>> CreateLayers(std::vector<LayerSettings> &settings)
162 {
163     DISPLAY_TEST_LOGD("settings %{public}zd", settings.size());
164     std::vector<std::shared_ptr<HdiTestLayer>> layers;
165     DisplayModeInfo mode = GetFirstDisplay()->GetCurrentMode();
166     AdjustLayerSettings(settings, mode.width, mode.height);
167     for (uint32_t i = 0; i < settings.size(); i++) {
168         LayerSettings setting = settings[i];
169 
170         auto layer = CreateTestLayer(setting, i);
171         layers.push_back(layer);
172     }
173 
174     return layers;
175 }
176 
PresentAndCheck(std::vector<LayerSettings> & layerSettings,uint32_t checkType=HdiCompositionCheck::CHECK_VERTEX)177 static inline void PresentAndCheck(std::vector<LayerSettings> &layerSettings,
178     uint32_t checkType = HdiCompositionCheck::CHECK_VERTEX)
179 {
180     int ret = PrepareAndCommit();
181     ASSERT_TRUE((ret == DISPLAY_SUCCESS));
182     if ((GetFirstDisplay()->SnapShot()) != nullptr) {
183         HdiTestDevice::GetInstance().GetGrallocInterface()->InvalidateCache(*(GetFirstDisplay()->SnapShot()));
184         ret = CheckComposition(layerSettings, GetFirstDisplay()->SnapShot(), checkType);
185         ASSERT_TRUE((ret == DISPLAY_SUCCESS));
186     }
187 }
188 
DestroyLayer(std::shared_ptr<HdiTestLayer> layer)189 static void DestroyLayer(std::shared_ptr<HdiTestLayer> layer)
190 {
191     std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_CONT_100));
192     auto ret = g_composerDevice->DestroyLayer(g_displayIds[0], layer->GetId());
193     if (ret != DISPLAY_SUCCESS && ret != DISPLAY_NOT_SUPPORT) {
194         DISPLAY_TEST_LOGD("DestroyLayer fail or not support, ret: %{public}d", ret);
195         return;
196     }
197     std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_CONT_100));
198 }
199 
SetUpTestCase()200 void DeviceTest::SetUpTestCase()
201 {
202     int ret = HdiTestDevice::GetInstance().InitDevice();
203     ASSERT_TRUE(ret == DISPLAY_SUCCESS);
204 
205     g_composerDevice = HdiTestDevice::GetInstance().GetDeviceInterface();
206     ASSERT_TRUE(g_composerDevice != nullptr);
207 
208     g_gralloc.reset(IDisplayBuffer::Get());
209     ASSERT_TRUE(g_gralloc != nullptr);
210 
211     g_displayIds = HdiTestDevice::GetInstance().GetDevIds();
212     ASSERT_TRUE(g_displayIds.size() > 0);
213 }
214 
TearDownTestCase()215 void DeviceTest::TearDownTestCase()
216 {
217     HdiTestDevice::GetInstance().Clear();
218     HdiTestDevice::GetInstance().GetFirstDisplay()->ResetClientLayer();
219 }
220 
NotifyVblank(unsigned int sequence,uint64_t ns,const void * data)221 void VblankCtr::NotifyVblank(unsigned int sequence, uint64_t ns, const void* data)
222 {
223     DISPLAY_TEST_LOGD();
224     if (data != nullptr) {
225         DISPLAY_TEST_LOGD("sequence = %{public}u, ns = %" PRIu64 "", sequence, ns);
226     }
227     std::unique_lock<std::mutex> lg(vblankMutex_);
228     hasVblank_ = true;
229     vblankCondition_.notify_one();
230     DISPLAY_TEST_LOGD();
231 }
232 
~VblankCtr()233 VblankCtr::~VblankCtr() {}
234 
WaitVblank(uint32_t ms)235 int32_t VblankCtr::WaitVblank(uint32_t ms)
236 {
237     bool ret = false;
238     DISPLAY_TEST_LOGD();
239     std::unique_lock<std::mutex> lck(vblankMutex_);
240     ret = vblankCondition_.wait_for(lck, std::chrono::milliseconds(ms), [=] { return hasVblank_; });
241     DISPLAY_TEST_LOGD();
242     if (!ret) {
243         return DISPLAY_FAILURE;
244     }
245     return DISPLAY_SUCCESS;
246 }
247 
248 HWTEST_F(DeviceTest, test_SetClientBufferCacheCount, TestSize.Level1)
249 {
250     const uint32_t CACHE_COUNT = 5;
251     auto ret = g_composerDevice->SetClientBufferCacheCount(g_displayIds[0], CACHE_COUNT);
252     EXPECT_EQ(DISPLAY_SUCCESS, ret);
253 }
254 
255 HWTEST_F(DeviceTest, test_GetDisplayCapability, TestSize.Level1)
256 {
257     DisplayCapability info;
258     auto ret = g_composerDevice->GetDisplayCapability(g_displayIds[0], info);
259     EXPECT_EQ(DISPLAY_SUCCESS, ret);
260 }
261 
262 HWTEST_F(DeviceTest, test_GetDisplaySupportedModes, TestSize.Level1)
263 {
264     std::vector<DisplayModeInfo> modes;
265     auto ret = g_composerDevice->GetDisplaySupportedModes(g_displayIds[0], modes);
266     EXPECT_EQ(DISPLAY_SUCCESS, ret);
267 }
268 
269 HWTEST_F(DeviceTest, test_GetDisplayMode, TestSize.Level1)
270 {
271     uint32_t MODE = 0;
272     auto ret = g_composerDevice->GetDisplayMode(g_displayIds[0], MODE);
273     EXPECT_EQ(DISPLAY_SUCCESS, ret);
274 }
275 
276 HWTEST_F(DeviceTest, test_SetDisplayMode, TestSize.Level1)
277 {
278     const uint32_t MODE = 0;
279     auto ret = g_composerDevice->SetDisplayMode(g_displayIds[0], MODE);
280     EXPECT_EQ(DISPLAY_SUCCESS, ret);
281 }
282 
283 HWTEST_F(DeviceTest, test_GetDisplayPowerStatus, TestSize.Level1)
284 {
285     Composer::V1_0::DispPowerStatus powerStatus = Composer::V1_0::DispPowerStatus::POWER_STATUS_OFF;
286     auto ret = g_composerDevice->GetDisplayPowerStatus(g_displayIds[0], powerStatus);
287     EXPECT_EQ(DISPLAY_SUCCESS, ret);
288 }
289 
290 HWTEST_F(DeviceTest, test_SetDisplayPowerStatus, TestSize.Level1)
291 {
292     auto ret = g_composerDevice->SetDisplayPowerStatus(g_displayIds[0],
293         Composer::V1_0::DispPowerStatus::POWER_STATUS_STANDBY);
294     EXPECT_EQ(DISPLAY_SUCCESS, ret);
295 
296     ret = g_composerDevice->SetDisplayPowerStatus(g_displayIds[0], Composer::V1_0::DispPowerStatus::POWER_STATUS_ON);
297     EXPECT_EQ(DISPLAY_SUCCESS, ret);
298 }
299 
300 #ifdef DISPLAY_COMMUNITY
301 HWTEST_F(DeviceTest, test_GetDisplayBacklight, TestSize.Level1)
302 {
303     uint32_t level;
304     auto ret = g_composerDevice->GetDisplayBacklight(g_displayIds[0], level);
305     EXPECT_EQ(DISPLAY_SUCCESS, ret);
306 }
307 #endif
308 
309 HWTEST_F(DeviceTest, test_SetDisplayBacklight, TestSize.Level1)
310 {
311     const uint32_t LEVEL = 10;
312     auto ret = g_composerDevice->SetDisplayBacklight(g_displayIds[0], LEVEL);
313     EXPECT_EQ(DISPLAY_SUCCESS, ret);
314 }
315 
316 HWTEST_F(DeviceTest, test_GetDisplayProperty, TestSize.Level1)
317 {
318     const uint32_t PROPERTY_ID = 1;
319     uint64_t propertyValue = 0;
320     auto ret = g_composerDevice->GetDisplayProperty(g_displayIds[0], PROPERTY_ID, propertyValue);
321     int32_t result = DISPLAY_FAILURE;
322     if (ret == DISPLAY_SUCCESS || ret == DISPLAY_NOT_SUPPORT) {
323         result = DISPLAY_SUCCESS;
324     }
325     EXPECT_EQ(DISPLAY_SUCCESS, result);
326 }
327 
328 HWTEST_F(DeviceTest, test_GetDisplayIdentificationData, TestSize.Level1)
329 {
330     uint8_t portId = 0;
331     std::vector<uint8_t> edidData = {};
332     auto ret = g_composerDevice->GetDisplayIdentificationData(g_displayIds[0], portId, edidData);
333     DISPLAY_TEST_LOGD("displayId[%u], portId[%u], edidDataLength[%u]", g_displayIds[0], portId, edidData.size());
334     if (ret == DISPLAY_NOT_SUPPORT) {
335         return;
336     }
337     EXPECT_EQ(DISPLAY_FAILURE, ret);
338 }
339 
340 HWTEST_F(DeviceTest, test_UpdateHardwareCursor, TestSize.Level1)
341 {
342     BufferHandle* buffer = nullptr;
343     const int32_t WIDTH = 512;
344     const int32_t HEIGHT = 512;
345 
346     AllocInfo info;
347     info.width  = WIDTH;
348     info.height = HEIGHT;
349     info.usage = OHOS::HDI::Display::Composer::V1_0::HBM_USE_MEM_DMA |
350             OHOS::HDI::Display::Composer::V1_0::HBM_USE_CPU_READ |
351             OHOS::HDI::Display::Composer::V1_0::HBM_USE_CPU_WRITE |
352             OHOS::HDI::Display::Composer::V1_0::HBM_USE_HW_COMPOSER;
353     info.format = Composer::V1_0::PIXEL_FMT_RGBA_8888;
354 
355     g_gralloc->AllocMem(info, buffer);
356     ASSERT_TRUE(buffer != nullptr);
357 
358     std::vector<LayerSettings> settings = {
359         {.rectRatio = { 0, 0, 1.0f, 1.0f }, .color = RED},
360     };
361 
362     std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
363     ASSERT_TRUE((layers.size() > 0));
364 
365     auto layer = layers[0];
366     PrepareAndCommit();
367     sleep(1);
368     HdiTestDevice::GetInstance().Clear();
369     DestroyLayer(layer);
370 
371     int32_t x = 1;
372     int32_t y = 1;
373     auto ret = g_composerDevice->UpdateHardwareCursor(g_displayIds[0], x, y, buffer);
374     if (ret == DISPLAY_SUCCESS || ret == DISPLAY_NOT_SUPPORT) {
375         ret = DISPLAY_SUCCESS;
376     }
377     g_gralloc->FreeMem(*buffer);
378     EXPECT_EQ(DISPLAY_SUCCESS, ret);
379 }
380 
381 HWTEST_F(DeviceTest, test_EnableHardwareCursorStats, TestSize.Level1)
382 {
383     bool enable = true;
384     auto ret = g_composerDevice->EnableHardwareCursorStats(g_displayIds[0], enable);
385     if (ret == DISPLAY_SUCCESS || ret == DISPLAY_NOT_SUPPORT) {
386         ret = DISPLAY_SUCCESS;
387     }
388     EXPECT_EQ(DISPLAY_SUCCESS, ret);
389 }
390 
391 HWTEST_F(DeviceTest, test_GetHardwareCursorStats, TestSize.Level1)
392 {
393     uint32_t frameCount = 0;
394     uint32_t vsyncCount = 0;
395     auto ret = g_composerDevice->GetHardwareCursorStats(g_displayIds[0], frameCount, vsyncCount);
396     if (ret == DISPLAY_SUCCESS || ret == DISPLAY_NOT_SUPPORT) {
397         ret = DISPLAY_SUCCESS;
398     }
399     EXPECT_EQ(DISPLAY_SUCCESS, ret);
400 }
401 
402 HWTEST_F(DeviceTest, test_GetDisplayCompChange, TestSize.Level1)
403 {
404     std::vector<uint32_t> layers {};
405     std::vector<int32_t> type {};
406     auto ret = g_composerDevice->GetDisplayCompChange(g_displayIds[0], layers, type);
407     EXPECT_EQ(DISPLAY_SUCCESS, ret);
408 }
409 
410 HWTEST_F(DeviceTest, test_SetDisplayClientCrop, TestSize.Level1)
411 {
412     const int32_t WIDTH = 1920;
413     const int32_t HEIGHT = 1080;
414     IRect rect = {0, 0, WIDTH, HEIGHT};
415     auto ret = g_composerDevice->SetDisplayClientCrop(g_displayIds[0], rect);
416     // not support
417     EXPECT_EQ(DISPLAY_FAILURE, ret);
418 }
419 
420 HWTEST_F(DeviceTest, test_GetDisplayReleaseFence, TestSize.Level1)
421 {
422     std::vector<uint32_t> layers {};
423     std::vector<int32_t> fences {};
424     auto ret = g_composerDevice->GetDisplayReleaseFence(g_displayIds[0], layers, fences);
425     EXPECT_EQ(DISPLAY_SUCCESS, ret);
426 }
427 
428 HWTEST_F(DeviceTest, test_SetDisplayClientBuffer, TestSize.Level1)
429 {
430     BufferHandle* buffer = nullptr;
431     const int32_t WIDTH = 800;
432     const int32_t HEIGHT = 600;
433 
434     AllocInfo info;
435     info.width  = WIDTH;
436     info.height = HEIGHT;
437     info.usage = OHOS::HDI::Display::Composer::V1_0::HBM_USE_MEM_DMA |
438             OHOS::HDI::Display::Composer::V1_0::HBM_USE_CPU_READ |
439             OHOS::HDI::Display::Composer::V1_0::HBM_USE_CPU_WRITE;
440     info.format = Composer::V1_0::PIXEL_FMT_RGBA_8888;
441 
442     g_gralloc->AllocMem(info, buffer);
443     ASSERT_TRUE(buffer != nullptr);
444 
445     uint32_t bufferSeq = 1;
446     auto ret = g_composerDevice->SetDisplayClientBuffer(g_displayIds[0], buffer, bufferSeq, -1);
447     g_gralloc->FreeMem(*buffer);
448     EXPECT_EQ(DISPLAY_SUCCESS, ret);
449 }
450 
451 HWTEST_F(DeviceTest, test_SetDisplayClientDamage, TestSize.Level1)
452 {
453     const int32_t WIDTH = 1920;
454     const int32_t HEIGHT = 1080;
455     IRect rect = {0, 0, WIDTH, HEIGHT};
456     std::vector<IRect> vRects;
457     vRects.push_back(rect);
458     auto ret = g_composerDevice->SetDisplayClientDamage(g_displayIds[0], vRects);
459     // not support
460     EXPECT_EQ(DISPLAY_SUCCESS, ret);
461 }
462 
463 HWTEST_F(DeviceTest, test_CreateVirtualDisplay, TestSize.Level1)
464 {
465     const uint32_t WIDTH = 1920;
466     const uint32_t HEIGHT = 1080;
467     int32_t format = 0;
468     uint32_t devId = 0;
469     auto ret = g_composerDevice->CreateVirtualDisplay(WIDTH, HEIGHT, format, devId);
470     // not support
471     EXPECT_EQ(DISPLAY_FAILURE, ret);
472 }
473 
474 HWTEST_F(DeviceTest, test_DestroyVirtualDisplay, TestSize.Level1)
475 {
476     uint32_t devId = 0;
477     auto ret = g_composerDevice->DestroyVirtualDisplay(devId);
478     // not support
479     EXPECT_EQ(DISPLAY_FAILURE, ret);
480 }
481 
482 HWTEST_F(DeviceTest, test_SetVirtualDisplayBuffer, TestSize.Level1)
483 {
484     BufferHandle* buffer = nullptr;
485     int32_t fence = -1;
486     const int32_t WIDTH = 800;
487     const int32_t HEIGHT = 600;
488 
489     AllocInfo info;
490     info.width  = WIDTH;
491     info.height = HEIGHT;
492     info.usage = OHOS::HDI::Display::Composer::V1_0::HBM_USE_MEM_DMA |
493             OHOS::HDI::Display::Composer::V1_0::HBM_USE_CPU_READ |
494             OHOS::HDI::Display::Composer::V1_0::HBM_USE_CPU_WRITE;
495     info.format = Composer::V1_0::PIXEL_FMT_RGBA_8888;
496 
497     g_gralloc->AllocMem(info, buffer);
498     ASSERT_TRUE(buffer != nullptr);
499 
500     auto ret = g_composerDevice->SetVirtualDisplayBuffer(g_displayIds[0], *buffer, fence);
501     g_gralloc->FreeMem(*buffer);
502     // not support
503     EXPECT_EQ(DISPLAY_FAILURE, ret);
504 }
505 
506 HWTEST_F(DeviceTest, test_SetDisplayProperty, TestSize.Level1)
507 {
508     const uint32_t PROPERTY_ID = 1;
509     const uint64_t PROPERTY_VALUE = 0;
510     auto ret = g_composerDevice->SetDisplayProperty(g_displayIds[0], PROPERTY_ID, PROPERTY_VALUE);
511     // not support
512     EXPECT_EQ(DISPLAY_FAILURE, ret);
513 }
514 
515 HWTEST_F(DeviceTest, test_SetLayerCrop, TestSize.Level1)
516 {
517     std::vector<LayerSettings> settings = {
518         {
519             .rectRatio = { 0, 0, 1.0f, 1.0f },
520             .color = RED
521         },
522     };
523     std::vector<uint32_t> splitColors = { { RED, GREEN, YELLOW, BLUE, PINK, PURPLE, CYAN, TRANSPARENT } };
524 
525     std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
526     ASSERT_TRUE((layers.size() > 0));
527     // split the buffer
528     auto layer = layers[0];
529     HdiGrallocBuffer* handle = layer->GetBackBuffer(); // the backbuffer has not present now
530     ASSERT_TRUE((handle != nullptr));
531     auto splitRects = SplitBuffer(*(handle->Get()), splitColors);
532     PrepareAndCommit();
533     for (uint32_t i = 0; i < splitRects.size(); i++) {
534         settings[0].color = splitColors[i];
535         layer->SetLayerCrop(splitRects[i]);
536         PresentAndCheck(settings);
537     }
538 
539     DestroyLayer(layer);
540 }
541 
542 HWTEST_F(DeviceTest, test_SetLayerZorder, TestSize.Level1)
543 {
544     std::vector<LayerSettings> settings = {
545         {
546             .rectRatio = { 0, 0, 1.0f, 1.0f },
547             .color = RED
548         },
549         {
550             .rectRatio = { 0, 0, 1.0f, 1.0f },
551             .color = GREEN
552         },
553         {
554             .rectRatio = { 0, 0, 1.0f, 1.0f },
555             .color = YELLOW
556         },
557     };
558 
559     std::vector<std::vector<int>> zorders = {
560         { 3, 2, 1 }, { 1, 3, 2 }, { 3, 1, 2 }, { 1, 2, 3 }, { 2, 1, 3 }, { 2, 3, 1 },
561     };
562     std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
563 
564     for (const auto& zorderList : zorders) {
565         // adjust the zorder
566         for (uint32_t i = 0; i < zorderList.size(); i++) {
567             settings[i].zorder = zorderList[i];
568             layers[i]->SetZorder(zorderList[i]);
569         }
570         std::vector<LayerSettings> tempSettings = settings;
571         std::sort(tempSettings.begin(), tempSettings.end(),
__anon81599a230202(const auto& l, auto const & r) 572             [=](const auto& l, auto const & r) { return l.zorder < r.zorder; });
573         // present and check
574         PresentAndCheck(tempSettings);
575     }
576     HdiTestDevice::GetInstance().Clear();
577 }
578 
579 HWTEST_F(DeviceTest, test_SetLayerPreMulti, TestSize.Level1)
580 {
581     std::vector<LayerSettings> settings = {
582         {
583             .rectRatio = { 0, 0, 1.0f, 1.0f },
584             .color = GREEN
585         },
586     };
587 
588     std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
589     ASSERT_TRUE((layers.size() > 0));
590     PrepareAndCommit();
591 
592     auto layer = layers[0];
593     bool preMul = true;
594     auto ret = g_composerDevice->SetLayerPreMulti(g_displayIds[0], layer->GetId(), preMul);
595 
596     PrepareAndCommit();
597     HdiTestDevice::GetInstance().Clear();
598     EXPECT_EQ(DISPLAY_SUCCESS, ret);
599 
600     DestroyLayer(layer);
601 }
602 
603 HWTEST_F(DeviceTest, test_SetLayerAlpha, TestSize.Level1)
604 {
605     std::vector<LayerSettings> settings = {
606         {
607             .rectRatio = { 0, 0, 1.0f, 1.0f },
608             .color = GREEN
609         },
610         {
611             .rectRatio = { 0, 0, 1.0f, 1.0f },
612             .color = RED
613         },
614     };
615 
616     std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
617     ASSERT_TRUE((layers.size() > 0));
618 
619     auto layer = layers[1];
620     LayerAlpha alpha = { 0 };
621     alpha.enGlobalAlpha = true;
622     alpha.enPixelAlpha = true;
623     alpha.gAlpha = 0;
624     alpha.alpha0 = 0;
625     alpha.alpha1 = 0;
626     layer->SetAlpha(alpha);
627 
628     PrepareAndCommit();
629     HdiTestDevice::GetInstance().Clear();
630 
631     DestroyLayer(layer);
632 }
633 
634 HWTEST_F(DeviceTest, test_SetLayerRegion, TestSize.Level1)
635 {
636     std::vector<LayerSettings> settings = {
637         {.rectRatio = {0, 0, 1.0f, 1.0f}, .color = GREEN, .alpha = 0xFF}
638     };
639 
640     std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
641     ASSERT_TRUE((layers.size() > 0));
642 
643     const int32_t WIDTH = 100;
644     const int32_t HEIGHT = 100;
645     auto layer = layers[0];
646     IRect rect = {0, 0, WIDTH, HEIGHT};
647     auto ret = g_composerDevice->SetLayerRegion(g_displayIds[0], layer->GetId(), rect);
648 
649     PrepareAndCommit();
650     EXPECT_EQ(DISPLAY_SUCCESS, ret);
651 
652     DestroyLayer(layer);
653 }
654 
655 HWTEST_F(DeviceTest, test_SetLayerDirtyRegion, TestSize.Level1)
656 {
657     std::vector<LayerSettings> settings = {
658         {
659             .rectRatio = { 0, 0, 1.0f, 1.0f },
660             .color = BLUE
661         }
662     };
663 
664     std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
665     ASSERT_TRUE((layers.size() > 0));
666 
667     auto layer = layers[0];
668 
669     const int32_t WIDTH = 100;
670     const int32_t HEIGHT = 100;
671     IRect rect = {0, 0, WIDTH, HEIGHT};
672     std::vector<IRect> vRects;
673     vRects.push_back(rect);
674     auto ret = g_composerDevice->SetLayerDirtyRegion(g_displayIds[0], layer->GetId(), vRects);
675 
676     PrepareAndCommit();
677     HdiTestDevice::GetInstance().Clear();
678 
679     EXPECT_EQ(DISPLAY_SUCCESS, ret);
680 
681     DestroyLayer(layer);
682 }
683 
684 HWTEST_F(DeviceTest, test_SetLayerTransformMode, TestSize.Level1)
685 {
686     std::vector<LayerSettings> settings = {
687         {
688             .rectRatio = { 0, 0, 1.0f, 1.0f },
689             .color = RED
690         }
691     };
692 
693     std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
694     ASSERT_TRUE((layers.size() > 0));
695 
696     PrepareAndCommit();
697 
698     auto layer = layers[0];
699 
700     TransformType type = TransformType::ROTATE_90;
701     auto ret = g_composerDevice->SetLayerTransformMode(g_displayIds[0], layer->GetId(), type);
702     PrepareAndCommit();
703 
704     type = TransformType::ROTATE_180;
705     ret = g_composerDevice->SetLayerTransformMode(g_displayIds[0], layer->GetId(), type);
706     PrepareAndCommit();
707 
708     type = TransformType::ROTATE_270;
709     ret = g_composerDevice->SetLayerTransformMode(g_displayIds[0], layer->GetId(), type);
710     PrepareAndCommit();
711 
712     EXPECT_EQ(DISPLAY_SUCCESS, ret);
713 
714     DestroyLayer(layer);
715 }
716 
717 HWTEST_F(DeviceTest, test_SetLayerVisibleRegion, TestSize.Level1)
718 {
719     std::vector<LayerSettings> settings = {
720         {
721             .rectRatio = { 0, 0, 1.0f, 1.0f },
722             .color = BLUE
723         }
724     };
725 
726     std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
727     ASSERT_TRUE((layers.size() > 0));
728     PrepareAndCommit();
729     auto layer = layers[0];
730 
731     const int32_t WIDTH = 500;
732     const int32_t HEIGHT = 500;
733     IRect region = {0, 0, WIDTH, HEIGHT};
734     std::vector<IRect> regions = {};
735     regions.push_back(region);
736     auto ret = g_composerDevice->SetLayerVisibleRegion(g_displayIds[0], layer->GetId(), regions);
737     PrepareAndCommit();
738 
739     EXPECT_EQ(DISPLAY_SUCCESS, ret);
740 
741     DestroyLayer(layer);
742 }
743 
744 HWTEST_F(DeviceTest, test_SetLayerBuffer, TestSize.Level1)
745 {
746     std::vector<LayerSettings> settings = {
747         {
748             .rectRatio = { 0, 0, 1.0f, 1.0f },
749             .color = GREEN
750         }
751     };
752 
753     std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
754     ASSERT_TRUE((layers.size() > 0));
755 
756     auto layer = layers[0];
757 
758     auto graphicBuffer = layer->AcquireBackBuffer();
__anon81599a230302(const BufferHandle* buffer, uint32_t seqNo) 759     int32_t ret = graphicBuffer->SetGraphicBuffer([&](const BufferHandle* buffer, uint32_t seqNo) -> int32_t {
760         std::vector<uint32_t> deletingList;
761         int32_t result = g_composerDevice->SetLayerBuffer(g_displayIds[0], layer->GetId(), buffer, seqNo, -1,
762             deletingList);
763         return result;
764     });
765     PrepareAndCommit();
766 
767     EXPECT_EQ(DISPLAY_SUCCESS, ret);
768 
769     DestroyLayer(layer);
770 }
771 
772 HWTEST_F(DeviceTest, test_SetLayerCompositionType, TestSize.Level1)
773 {
774     std::vector<LayerSettings> settings = {
775         {
776             .rectRatio = { 0, 0, 1.0f, 1.0f },
777             .color = BLUE
778         }
779     };
780 
781     std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
782     ASSERT_TRUE((layers.size() > 0));
783 
784     auto layer = layers[0];
785 
786     Composer::V1_0::CompositionType type = Composer::V1_0::CompositionType::COMPOSITION_CLIENT;
787     auto ret = g_composerDevice->SetLayerCompositionType(g_displayIds[0], layer->GetId(), type);
788 
789     PrepareAndCommit();
790 
791     EXPECT_EQ(DISPLAY_SUCCESS, ret);
792 
793     DestroyLayer(layer);
794 }
795 
796 HWTEST_F(DeviceTest, test_SetLayerBlendType, TestSize.Level1)
797 {
798     std::vector<LayerSettings> settings = {
799         {
800             .rectRatio = { 0, 0, 1.0f, 1.0f },
801             .color = GREEN
802         }
803     };
804 
805     std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
806     ASSERT_TRUE((layers.size() > 0));
807 
808     auto layer = layers[0];
809 
810     BlendType type = BlendType::BLEND_NONE;
811     auto ret = g_composerDevice->SetLayerBlendType(g_displayIds[0], layer->GetId(), type);
812 
813     PrepareAndCommit();
814 
815     EXPECT_EQ(DISPLAY_SUCCESS, ret);
816 
817     DestroyLayer(layer);
818 }
819 
820 HWTEST_F(DeviceTest, test_SetLayerMaskInfo, TestSize.Level1)
821 {
822     std::vector<LayerSettings> settings = {
823         {
824             .rectRatio = { 0, 0, 1.0f, 1.0f },
825             .color = GREEN
826         }
827     };
828 
829     std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
830     ASSERT_TRUE((layers.size() > 0));
831 
832     auto layer = layers[0];
833 
834     MaskInfo maskInfo = MaskInfo::LAYER_HBM_SYNC;
835     auto ret = g_composerDevice->SetLayerMaskInfo(g_displayIds[0], layer->GetId(), maskInfo);
836 
837     HdiTestDevice::GetInstance().Clear();
838 
839     EXPECT_EQ(DISPLAY_SUCCESS, ret);
840 }
841 
842 HWTEST_F(DeviceTest, test_SetLayerColor, TestSize.Level1)
843 {
844     std::vector<LayerSettings> settings = {
845         {
846             .rectRatio = { 0, 0, 1.0f, 1.0f },
847             .color = GREEN
848         }
849     };
850 
851     std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
852     ASSERT_TRUE((layers.size() > 0));
853 
854     auto layer = layers[0];
855     const uint32_t COLOR_R = 155;
856     const uint32_t COLOR_G = 224;
857     const uint32_t COLOR_B = 88;
858     const uint32_t COLOR_A = 128;
859 
860     LayerColor layerColor = {
861         .r = COLOR_R,
862         .g = COLOR_G,
863         .b = COLOR_B,
864         .a = COLOR_A
865     };
866 
867     auto ret = g_composerDevice->SetLayerColor(g_displayIds[0], layer->GetId(), layerColor);
868 
869     PrepareAndCommit();
870 
871     EXPECT_EQ(DISPLAY_SUCCESS, ret);
872 
873     DestroyLayer(layer);
874 }
875 
876 HWTEST_F(DeviceTest, test_DestroyLayer, TestSize.Level1)
877 {
878     std::vector<LayerSettings> settings = {
879         {
880             .rectRatio = { 0, 0, 1.0f, 1.0f },
881             .color = PURPLE
882         }
883     };
884 
885     std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
886     ASSERT_TRUE((layers.size() > 0));
887     auto layer = layers[0];
888     PrepareAndCommit();
889 
890     sleep(1);
891     auto ret = g_composerDevice->DestroyLayer(g_displayIds[0], layer->GetId());
892     EXPECT_EQ(DISPLAY_SUCCESS, ret);
893     std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_CONT_100));
894 }
895 
896 HWTEST_F(DeviceTest, test_RegDisplayVBlankCallback, TestSize.Level1)
897 {
898     int ret;
899     DISPLAY_TEST_LOGD();
900     std::shared_ptr<HdiTestDisplay> display = HdiTestDevice::GetInstance().GetFirstDisplay();
901     ASSERT_TRUE(display != nullptr) << "get display failed";
902     ret = display->RegDisplayVBlankCallback(TestVBlankCallback, nullptr);
903     ASSERT_TRUE(ret == DISPLAY_SUCCESS) << "RegDisplayVBlankCallback failed";
904     ret = display->SetDisplayVsyncEnabled(true);
905     ASSERT_TRUE(ret == DISPLAY_SUCCESS) << "SetDisplayVsyncEnabled failed";
906 
907     std::vector<LayerSettings> settings = {
908         {
909             .rectRatio = { 0, 0, 1.0f, 1.0f },
910             .color = PINK
911         },
912     };
913     std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
914     ASSERT_TRUE((layers.size() > 0));
915     VblankCtr::GetInstance().hasVblank_ = false;
916     PrepareAndCommit();
917     ret = VblankCtr::GetInstance().WaitVblank(SLEEP_CONT_100); // 100ms
918     ASSERT_TRUE(ret == DISPLAY_SUCCESS) << "WaitVblank timeout";
919     ret = display->SetDisplayVsyncEnabled(false);
920     ASSERT_TRUE(ret == DISPLAY_SUCCESS) << "SetDisplayVsyncEnabled failed";
921     usleep(SLEEP_CONT_100 * SLEEP_CONT_2000); // wait for 100ms avoid the last vsync.
922     VblankCtr::GetInstance().hasVblank_ = false;
923     ret = VblankCtr::GetInstance().WaitVblank(SLEEP_CONT_100); // 100ms
924     ASSERT_TRUE(ret != DISPLAY_SUCCESS) << "vblank do not disable";
925 
926     DestroyLayer(layers[0]);
927 }
928 
OnMode(uint32_t modeId,uint64_t vBlankPeriod,void * data)929 void DeviceTest::OnMode(uint32_t modeId, uint64_t vBlankPeriod, void* data)
930 {
931     g_isOnModeCalled = true;
932 }
933 
OnSeamlessChange(uint32_t devId,void * data)934 void DeviceTest::OnSeamlessChange(uint32_t devId, void* data)
935 {
936     g_isOnSeamlessChangeCalled = true;
937 }
938 
OnHwcEvent(uint32_t devId,uint32_t eventId,const std::vector<int32_t> & eventData,void * data)939 void DeviceTest::OnHwcEvent(uint32_t devId, uint32_t eventId, const std::vector<int32_t>& eventData, void* data)
940 {
941     g_isOnHwcEventCalled = true;
942 }
943 
944 HWTEST_F(DeviceTest, test_GetDisplaySupportedModesExt, TestSize.Level1)
945 {
946     std::vector<DisplayModeInfoExt> modes;
947     auto ret = g_composerDevice->GetDisplaySupportedModesExt(g_displayIds[0], modes);
948     if (ret == DISPLAY_NOT_SUPPORT) {
949         DISPLAY_TEST_LOGD("GetDisplaySupportedModesExt not support");
950         return;
951     }
952     EXPECT_EQ(DISPLAY_SUCCESS, ret);
953 }
954 
955 HWTEST_F(DeviceTest, test_SetDisplayModeAsync, TestSize.Level1)
956 {
957     g_isOnModeCalled = false;
958     std::vector<DisplayModeInfo> oldModes;
959     std::vector<LayerSettings> settings = {
960         {
961             .rectRatio = { 0, 0, 1.0f, 1.0f },
962             .color = RED
963         }
964     };
965 
966     // 先注册VBlankCallback
967     auto ret = g_composerDevice->RegDisplayVBlankCallback(g_displayIds[0], TestVBlankCallback, nullptr);
968     ASSERT_TRUE(ret == DISPLAY_SUCCESS) << "RegDisplayVBlankCallback failed";
969 
970     ret = g_composerDevice->GetDisplaySupportedModes(g_displayIds[0], oldModes);
971     ASSERT_EQ(DISPLAY_SUCCESS, ret);
972     ASSERT_EQ(oldModes.size() > 0, true);
973 
974     uint32_t modeid = oldModes[0].id;
975     ret = g_composerDevice->SetDisplayModeAsync(g_displayIds[0], modeid, OnMode);
976     if (ret == DISPLAY_NOT_SUPPORT) {
977         return;
978     }
979     EXPECT_EQ(DISPLAY_SUCCESS, ret);
980     if (ret == DISPLAY_SUCCESS) {
981         std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
982         ASSERT_TRUE((layers.size() > 0));
983         g_threadCtrl = false;
984         std::thread commitThread(LoopCommit);
985         std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_CONT_100));
986         g_threadCtrl = true;
987         commitThread.join();
988         ASSERT_EQ(g_isOnModeCalled, true);
989 
990         DestroyLayer(layers[0]);
991     }
992 }
993 
994 HWTEST_F(DeviceTest, test_GetDisplayVBlankPeriod, TestSize.Level1)
995 {
996     uint64_t period = 0;
997     auto ret = g_composerDevice->GetDisplayVBlankPeriod(g_displayIds[0], period);
998     if (ret == DISPLAY_NOT_SUPPORT) {
999         DISPLAY_TEST_LOGD("GetDisplayVBlankPeriod not support");
1000         return;
1001     }
1002     EXPECT_EQ(DISPLAY_SUCCESS, ret);
1003     EXPECT_EQ(period != 0, true);
1004 }
1005 
1006 HWTEST_F(DeviceTest, test_RegSeamlessChangeCallback, TestSize.Level1)
1007 {
1008     g_isOnSeamlessChangeCalled = false;
1009     auto ret = g_composerDevice->RegSeamlessChangeCallback(OnSeamlessChange, nullptr);
1010     if (ret == DISPLAY_NOT_SUPPORT) {
1011         DISPLAY_TEST_LOGD("RegSeamlessChangeCallback not support");
1012         return;
1013     }
1014     EXPECT_EQ(DISPLAY_SUCCESS, ret);
1015     if (ret == DISPLAY_SUCCESS) {
1016         std::this_thread::sleep_for(std::chrono::milliseconds(5000));
1017         ASSERT_EQ(g_isOnSeamlessChangeCalled, true);
1018     }
1019 }
1020 
1021 HWTEST_F(DeviceTest, test_RegHwcEventCallback, TestSize.Level1)
1022 {
1023     g_isOnHwcEventCalled = false;
1024     auto ret = g_composerDevice->RegHwcEventCallback(OnHwcEvent, nullptr);
1025     if (ret == DISPLAY_NOT_SUPPORT) {
1026         DISPLAY_TEST_LOGD("RegHwcEventCallback not support");
1027         return;
1028     }
1029     EXPECT_EQ(DISPLAY_SUCCESS, ret);
1030     if (ret == DISPLAY_SUCCESS) {
1031         std::this_thread::sleep_for(std::chrono::milliseconds(5000));
1032         ASSERT_EQ(g_isOnHwcEventCalled, true);
1033     }
1034 }
1035 
1036 HWTEST_F(DeviceTest, test_SetLayerPerFrameParameter, TestSize.Level1)
1037 {
1038     std::vector<LayerSettings> settings = {
1039         {
1040             .rectRatio = { 0, 0, 1.0f, 1.0f },
1041             .color = GREEN
1042         },
1043     };
1044 
1045     std::vector<std::shared_ptr<HdiTestLayer>> layers = CreateLayers(settings);
1046     ASSERT_TRUE((layers.size() > 0));
1047     auto layer = layers[0];
1048     std::vector<std::string> ValidKeys = { "FilmFilter", "ArsrDoEnhance", "SDRBrightnessRatio", "BrightnessNit",
1049         "ViewGroupHasValidAlpha", "SourceCropTuning" };
1050     std::string key;
1051     std::vector<int8_t> value = { 1 };
1052     key = "NotSupportKey";
1053     auto ret = g_composerDevice->SetLayerPerFrameParameter(g_displayIds[0], layer->GetId(), key, value);
1054     if (ret == DISPLAY_NOT_SUPPORT) {
1055         DISPLAY_TEST_LOGD("SetLayerPerFrameParameter not support");
1056         return;
1057     }
1058     ASSERT_EQ(ret, -1) << "key not support, ret:" << ret;
1059     key = ValidKeys[0];
1060     ret = g_composerDevice->SetLayerPerFrameParameter(g_displayIds[0], layer->GetId(), key, value);
1061     ASSERT_EQ(ret, 0) << "key support, ret:" << ret;
1062     if (ret == DISPLAY_NOT_SUPPORT) {
1063         DISPLAY_TEST_LOGD("SetLayerPerFrameParameter not support");
1064         return;
1065     }
1066     EXPECT_EQ(DISPLAY_SUCCESS, ret);
1067 }
1068 
1069 HWTEST_F(DeviceTest, test_GetSupportedLayerPerFrameParameterKey, TestSize.Level1)
1070 {
1071     std::vector<std::string> keys;
1072     auto ret = g_composerDevice->GetSupportedLayerPerFrameParameterKey(keys);
1073     if (ret == DISPLAY_NOT_SUPPORT) {
1074         DISPLAY_TEST_LOGD("GetSupportedLayerPerFrameParameterKey not support");
1075         return;
1076     }
1077     EXPECT_EQ(DISPLAY_SUCCESS, ret);
1078 }
1079 
1080 HWTEST_F(DeviceTest, test_SetDisplayOverlayResolution, TestSize.Level1)
1081 {
1082     DisplayModeInfo mode = GetFirstDisplay()->GetCurrentMode();
1083     auto ret = g_composerDevice->SetDisplayOverlayResolution(g_displayIds[0], mode.width, mode.height);
1084     if (ret == DISPLAY_NOT_SUPPORT) {
1085         DISPLAY_TEST_LOGD("SetDisplayOverlayResolution not support");
1086         return;
1087     }
1088     EXPECT_EQ(DISPLAY_SUCCESS, ret);
1089 }
1090 
TestRefreshCallback(uint32_t devId,void * data)1091 static void TestRefreshCallback(uint32_t devId, void* data)
1092 {
1093 }
1094 
1095 HWTEST_F(DeviceTest, test_RegRefreshCallback, TestSize.Level1)
1096 {
1097     auto ret = g_composerDevice->RegRefreshCallback(TestRefreshCallback, nullptr);
1098     if (ret == DISPLAY_NOT_SUPPORT) {
1099         DISPLAY_TEST_LOGD("RegRefreshCallback not support");
1100         return;
1101     }
1102     EXPECT_EQ(DISPLAY_SUCCESS, ret);
1103 }
1104 
1105 HWTEST_F(DeviceTest, test_GetDisplaySupportedColorGamuts, TestSize.Level1)
1106 {
1107     std::vector<ColorGamut> gamuts;
1108     auto ret = g_composerDevice->GetDisplaySupportedColorGamuts(g_displayIds[0], gamuts);
1109     if (ret == DISPLAY_NOT_SUPPORT) {
1110         DISPLAY_TEST_LOGD("GetDisplaySupportedColorGamuts not support");
1111         return;
1112     }
1113     EXPECT_EQ(DISPLAY_SUCCESS, ret);
1114 }
1115 
1116 HWTEST_F(DeviceTest, test_GetHDRCapabilityInfos, TestSize.Level1)
1117 {
1118     HDRCapability info = { 0 };
1119     auto ret = g_composerDevice->GetHDRCapabilityInfos(g_displayIds[0], info);
1120     if (ret == DISPLAY_NOT_SUPPORT) {
1121         DISPLAY_TEST_LOGD("GetHDRCapabilityInfos not support");
1122         return;
1123     }
1124     EXPECT_EQ(DISPLAY_SUCCESS, ret);
1125 }
1126 
1127 HWTEST_F(DeviceTest, test_SetDisplayActiveRegion, TestSize.Level1)
1128 {
1129     IRect rect = {0, 0, 1, 1};
1130     auto ret = g_composerDevice->SetDisplayActiveRegion(g_displayIds[0], rect);
1131     HDF_LOGI("SetDisplayActiveRegion ret = %{public}d", ret);
1132 
1133     if (ret == DISPLAY_NOT_SUPPORT) {
1134         DISPLAY_TEST_LOGD("SetDisplayActiveRegion not support");
1135         return;
1136     }
1137     EXPECT_EQ(DISPLAY_FAILURE, ret);
1138 }
1139 
1140 HWTEST_F(DeviceTest, test_FastPresent, TestSize.Level1)
1141 {
1142     PresentParam param = { 0, 1280, 1, 0x5000280, 0 };
1143     std::vector<BufferHandle *> inHandles;
1144     auto ret = g_composerDevice->FastPresent(g_displayIds[0], param, inHandles);
1145     if (ret == DISPLAY_NOT_SUPPORT) {
1146         DISPLAY_TEST_LOGD("FastPresent not support");
1147         return;
1148     }
1149     EXPECT_EQ(DISPLAY_FAILURE, ret);
1150 }
1151 
1152 HWTEST_F(DeviceTest, test_HdifdParcelable, TestSize.Level1)
1153 {
1154     HdifdParcelable hdiFd1(VALID_HDI_FD);
1155     bool ret = hdiFd1.Init(VALID_HDI_FD);
1156     EXPECT_FALSE(ret);
1157     (void)hdiFd1.Move();
1158 
1159     HdifdParcelable hdiFd2;
1160     ret = hdiFd2.Init(INVALID_HDI_FD);
1161     EXPECT_TRUE(ret);
1162 
1163     HdifdParcelable hdiFd3;
1164     ret = hdiFd3.Init(VALID_HDI_FD);
1165     EXPECT_TRUE(ret);
1166 }
1167 
1168 HWTEST_F(DeviceTest, test_HdifdParcelable_Unmarshall, TestSize.Level1)
1169 {
1170     MessageParcel parcel;
1171 
1172     sptr<HdifdParcelable> hdiFd1 = HdifdParcelable::Unmarshalling(parcel);
1173     EXPECT_EQ(hdiFd1, nullptr);
1174 
1175     bool ret = parcel.WriteBool(true);
1176     EXPECT_TRUE(ret);
1177     sptr<HdifdParcelable> hdiFd2 = HdifdParcelable::Unmarshalling(parcel);
1178     EXPECT_EQ(hdiFd2, nullptr);
1179 }
1180 
1181 HWTEST_F(DeviceTest, test_HdifdParcelable_Marshall01, TestSize.Level1)
1182 {
1183     HdifdParcelable hdiFd1;
1184     MessageParcel parcel;
1185     bool ret = hdiFd1.Marshalling(parcel);
1186     EXPECT_TRUE(ret);
1187 
1188     auto hdiFd2 = HdifdParcelable::Unmarshalling(parcel);
1189     int32_t fd = hdiFd2->GetFd();
1190     EXPECT_EQ(INVALID_HDI_FD, fd);
1191 }
1192 
1193 HWTEST_F(DeviceTest, test_HdifdParcelable_Marshall02, TestSize.Level1)
1194 {
1195     HdifdParcelable hdiFd1(VALID_HDI_FD);
1196     MessageParcel parcel;
1197     bool ret = hdiFd1.Marshalling(parcel);
1198     EXPECT_TRUE(ret);
1199 
1200     auto hdiFd2 = HdifdParcelable::Unmarshalling(parcel);
1201     int32_t fd = hdiFd2->GetFd();
1202     EXPECT_TRUE(fd >= 0);
1203 
1204     (void)hdiFd1.Move(); // avoid call close()
1205 }
1206 
1207 HWTEST_F(DeviceTest, test_HdifdParcelable_Move, TestSize.Level1)
1208 {
1209     HdifdParcelable hdiFd1;
1210     int32_t fd = hdiFd1.Move();
1211     EXPECT_EQ(INVALID_HDI_FD, fd);
1212 
1213     HdifdParcelable hdiFd2(VALID_HDI_FD);
1214     fd = hdiFd2.Move();
1215     EXPECT_EQ(VALID_HDI_FD, fd);
1216 }
1217 
1218 HWTEST_F(DeviceTest, test_HdifdParcelable_GetFd, TestSize.Level1)
1219 {
1220     HdifdParcelable hdiFd1;
1221     int32_t fd = hdiFd1.GetFd();
1222     EXPECT_EQ(INVALID_HDI_FD, fd);
1223 
1224     HdifdParcelable hdiFd2(VALID_HDI_FD);
1225     fd = hdiFd2.GetFd();
1226     EXPECT_EQ(VALID_HDI_FD, fd);
1227     (void)hdiFd2.Move(); // avoid call close()
1228 }
1229 
1230 HWTEST_F(DeviceTest, test_HdifdParcelable_Dump, TestSize.Level1)
1231 {
1232     HdifdParcelable hdiFd1;
1233     auto dumpFd = hdiFd1.Dump();
1234     EXPECT_EQ("fd: {" + std::to_string(INVALID_HDI_FD) + "}\n", dumpFd);
1235 
1236     HdifdParcelable hdiFd2(VALID_HDI_FD);
1237     dumpFd = hdiFd2.Dump();
1238     EXPECT_EQ("fd: {" + std::to_string(VALID_HDI_FD) + "}\n", dumpFd);
1239     (void)hdiFd2.Move(); // avoid call close()
1240 }
1241