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 "display_buffer_mt.h" 17094332d3Sopenharmony_ci 18094332d3Sopenharmony_ci#include <unistd.h> 19094332d3Sopenharmony_ci#include <vector> 20094332d3Sopenharmony_ci#include <thread> 21094332d3Sopenharmony_ci#include <cinttypes> 22094332d3Sopenharmony_ci#include <securec.h> 23094332d3Sopenharmony_ci#include <cstring> 24094332d3Sopenharmony_ci 25094332d3Sopenharmony_ci#include "gtest/gtest.h" 26094332d3Sopenharmony_ci#include "v1_0/display_composer_type.h" 27094332d3Sopenharmony_ci#include "hdf_base.h" 28094332d3Sopenharmony_ci#include "hdf_log.h" 29094332d3Sopenharmony_ci 30094332d3Sopenharmony_cinamespace OHOS { 31094332d3Sopenharmony_cinamespace HDI { 32094332d3Sopenharmony_cinamespace Display { 33094332d3Sopenharmony_cinamespace TEST { 34094332d3Sopenharmony_ciusing namespace OHOS::HDI::Display::Composer::V1_0; 35094332d3Sopenharmony_ciusing namespace OHOS::HDI::Display::Buffer::V1_0; 36094332d3Sopenharmony_ciusing namespace OHOS; 37094332d3Sopenharmony_ciusing namespace testing::ext; 38094332d3Sopenharmony_ci 39094332d3Sopenharmony_cistatic IDisplayBuffer* g_dispbuf = nullptr; 40094332d3Sopenharmony_cistatic const int SIZE_TIMES = 3; 41094332d3Sopenharmony_cistatic const int HANDLE_NUM_1 = 2; 42094332d3Sopenharmony_cistatic const int HANDLE_NUM_2 = 32; 43094332d3Sopenharmony_cistatic const int LOOP_COUNT = 10; 44094332d3Sopenharmony_cistatic const int INFO_WIDTH = 1024; 45094332d3Sopenharmony_cistatic const int INFO_HEIGHT = 1024; 46094332d3Sopenharmony_ci 47094332d3Sopenharmony_ci#define HDF_LOG_TAG display_buffer_module_test 48094332d3Sopenharmony_ci 49094332d3Sopenharmony_cistatic void WriteBuffer(const BufferHandle& handle) 50094332d3Sopenharmony_ci{ 51094332d3Sopenharmony_ci const char VERIFY_MSG[] = "12345678, (*~*)"; 52094332d3Sopenharmony_ci // write msg to display buffer fully. 53094332d3Sopenharmony_ci int strSize = strlen(VERIFY_MSG) + 1; 54094332d3Sopenharmony_ci int i = 0; 55094332d3Sopenharmony_ci char* ptr = reinterpret_cast<char *>(handle.virAddr); 56094332d3Sopenharmony_ci if (ptr == nullptr) { 57094332d3Sopenharmony_ci HDF_LOGE("cast ptr failed"); 58094332d3Sopenharmony_ci return; 59094332d3Sopenharmony_ci } 60094332d3Sopenharmony_ci 61094332d3Sopenharmony_ci for (; i < handle.size - strSize;) { 62094332d3Sopenharmony_ci errno_t ret = memcpy_s(&ptr[i], sizeof(VERIFY_MSG), VERIFY_MSG, sizeof(VERIFY_MSG)); 63094332d3Sopenharmony_ci if (ret != EOK) { 64094332d3Sopenharmony_ci HDF_LOGE("memcpy_s error : %d", ret); 65094332d3Sopenharmony_ci return; 66094332d3Sopenharmony_ci } 67094332d3Sopenharmony_ci i += strSize; 68094332d3Sopenharmony_ci ptr[i - 1] = 0; 69094332d3Sopenharmony_ci } 70094332d3Sopenharmony_ci for (i = i - 1; i < handle.size; i++) { 71094332d3Sopenharmony_ci ptr[i] = 'z'; 72094332d3Sopenharmony_ci } 73094332d3Sopenharmony_ci 74094332d3Sopenharmony_ci // read all contents from buffer 75094332d3Sopenharmony_ci HDF_LOGD("%{public}s(%{public}d), buffer size:%{public}d, len:%{public}d", 76094332d3Sopenharmony_ci __func__, __LINE__, handle.size, strSize); 77094332d3Sopenharmony_ci // verify buffer contents from strings written. 78094332d3Sopenharmony_ci for (i = 0; i < handle.size - SIZE_TIMES * strSize; i = i + strSize) { 79094332d3Sopenharmony_ci if (strncmp(VERIFY_MSG, &ptr[i], sizeof(VERIFY_MSG)) != 0) { 80094332d3Sopenharmony_ci HDF_LOGD("%{public}s(%{public}d), buffer[%{public}d]:%{public}s", 81094332d3Sopenharmony_ci __func__, __LINE__, i, &ptr[i]); 82094332d3Sopenharmony_ci } 83094332d3Sopenharmony_ci } 84094332d3Sopenharmony_ci 85094332d3Sopenharmony_ci for (i = handle.size - HANDLE_NUM_1; i < (handle.size - HANDLE_NUM_2); i++) { 86094332d3Sopenharmony_ci HDF_LOGD("%{public}s(%{public}d), i:%{public}d, str:%{public}s", 87094332d3Sopenharmony_ci __func__, __LINE__, i, &ptr[i]); 88094332d3Sopenharmony_ci } 89094332d3Sopenharmony_ci} 90094332d3Sopenharmony_ci 91094332d3Sopenharmony_cistatic void DumpBufferHandle(const BufferHandle& handle) 92094332d3Sopenharmony_ci{ 93094332d3Sopenharmony_ci // dump buffer handle infomation 94094332d3Sopenharmony_ci HDF_LOGD("-------------------------------------"); 95094332d3Sopenharmony_ci HDF_LOGD("fd =%{public}d", handle.fd); 96094332d3Sopenharmony_ci HDF_LOGD("width =%{public}d", handle.width); 97094332d3Sopenharmony_ci HDF_LOGD("stride =%{public}d", handle.stride); 98094332d3Sopenharmony_ci HDF_LOGD("height =%{public}d", handle.height); 99094332d3Sopenharmony_ci HDF_LOGD("size =0x%{public}x", handle.size); 100094332d3Sopenharmony_ci HDF_LOGD("format =%{public}d", handle.format); 101094332d3Sopenharmony_ci HDF_LOGD("usage =0x%{public}" PRIx64 "", handle.usage); 102094332d3Sopenharmony_ci HDF_LOGD("reserveFds =%{public}d", handle.reserveFds); 103094332d3Sopenharmony_ci HDF_LOGD("reserveInts =%{public}d", handle.reserveInts); 104094332d3Sopenharmony_ci HDF_LOGD("-------------------------------------"); 105094332d3Sopenharmony_ci} 106094332d3Sopenharmony_ci 107094332d3Sopenharmony_ciint32_t DisplayBufferMt::RunTest(const AllocInfo& info) 108094332d3Sopenharmony_ci{ 109094332d3Sopenharmony_ci BufferHandle* bHandle = nullptr; 110094332d3Sopenharmony_ci // AllocMem 111094332d3Sopenharmony_ci int32_t ec = g_dispbuf->AllocMem(info, bHandle); 112094332d3Sopenharmony_ci if (ec != HDF_SUCCESS || bHandle == nullptr) { 113094332d3Sopenharmony_ci HDF_LOGE("%{public}s, line=%{public}d, AllocMem failed. ec=0x%{public}x", 114094332d3Sopenharmony_ci __func__, __LINE__, ec); 115094332d3Sopenharmony_ci return HDF_FAILURE; 116094332d3Sopenharmony_ci } 117094332d3Sopenharmony_ci 118094332d3Sopenharmony_ci // Mmap 119094332d3Sopenharmony_ci void* buffer = g_dispbuf->Mmap(*bHandle); 120094332d3Sopenharmony_ci if (buffer == nullptr) { 121094332d3Sopenharmony_ci HDF_LOGE("Mmap failed."); 122094332d3Sopenharmony_ci g_dispbuf->FreeMem(*bHandle); 123094332d3Sopenharmony_ci return HDF_FAILURE; 124094332d3Sopenharmony_ci } 125094332d3Sopenharmony_ci HDF_LOGD("Mmap successful"); 126094332d3Sopenharmony_ci 127094332d3Sopenharmony_ci DumpBufferHandle(*bHandle); 128094332d3Sopenharmony_ci WriteBuffer(*bHandle); 129094332d3Sopenharmony_ci 130094332d3Sopenharmony_ci // InvalidateCache 131094332d3Sopenharmony_ci ec = g_dispbuf->InvalidateCache(*bHandle); 132094332d3Sopenharmony_ci if (ec != HDF_SUCCESS) { 133094332d3Sopenharmony_ci HDF_LOGE("InvalidateCache failed."); 134094332d3Sopenharmony_ci g_dispbuf->Unmap(*bHandle); 135094332d3Sopenharmony_ci g_dispbuf->FreeMem(*bHandle); 136094332d3Sopenharmony_ci return HDF_FAILURE; 137094332d3Sopenharmony_ci } 138094332d3Sopenharmony_ci // InvalidateCache 139094332d3Sopenharmony_ci ec = g_dispbuf->FlushCache(*bHandle); 140094332d3Sopenharmony_ci if (ec != HDF_SUCCESS) { 141094332d3Sopenharmony_ci HDF_LOGE("flushCache failed."); 142094332d3Sopenharmony_ci g_dispbuf->Unmap(*bHandle); 143094332d3Sopenharmony_ci g_dispbuf->FreeMem(*bHandle); 144094332d3Sopenharmony_ci return HDF_FAILURE; 145094332d3Sopenharmony_ci } 146094332d3Sopenharmony_ci HDF_LOGD("flush Cache success."); 147094332d3Sopenharmony_ci // free buffer 148094332d3Sopenharmony_ci g_dispbuf->Unmap(*bHandle); 149094332d3Sopenharmony_ci g_dispbuf->FreeMem(*bHandle); 150094332d3Sopenharmony_ci return HDF_SUCCESS; 151094332d3Sopenharmony_ci} 152094332d3Sopenharmony_ci 153094332d3Sopenharmony_civoid DisplayBufferMt::SetUpTestCase() 154094332d3Sopenharmony_ci{ 155094332d3Sopenharmony_ci g_dispbuf = IDisplayBuffer::Get(); 156094332d3Sopenharmony_ci ASSERT_TRUE(g_dispbuf != nullptr); 157094332d3Sopenharmony_ci} 158094332d3Sopenharmony_ci 159094332d3Sopenharmony_ciHWTEST_F(DisplayBufferMt, test_DisplayBuffer, TestSize.Level1) 160094332d3Sopenharmony_ci{ 161094332d3Sopenharmony_ci AllocInfo info; 162094332d3Sopenharmony_ci info.width = INFO_WIDTH; 163094332d3Sopenharmony_ci info.height = INFO_HEIGHT; 164094332d3Sopenharmony_ci info.usage = OHOS::HDI::Display::Composer::V1_0::HBM_USE_MEM_DMA | 165094332d3Sopenharmony_ci OHOS::HDI::Display::Composer::V1_0::HBM_USE_CPU_READ | 166094332d3Sopenharmony_ci OHOS::HDI::Display::Composer::V1_0::HBM_USE_CPU_WRITE; 167094332d3Sopenharmony_ci info.format = PIXEL_FMT_RGBA_8888; 168094332d3Sopenharmony_ci 169094332d3Sopenharmony_ci for (int i = 0; i < LOOP_COUNT; i++) { 170094332d3Sopenharmony_ci int32_t ret = RunTest(info); 171094332d3Sopenharmony_ci EXPECT_EQ(HDF_SUCCESS, ret); 172094332d3Sopenharmony_ci } 173094332d3Sopenharmony_ci} 174094332d3Sopenharmony_ci} // OHOS 175094332d3Sopenharmony_ci} // HDI 176094332d3Sopenharmony_ci} // DISPLAY 177094332d3Sopenharmony_ci} // TEST 178