* Copyright (c) 2023 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "display_buffer_mt.h"
#include <unistd.h>
#include <vector>
#include <thread>
#include <cinttypes>
#include <securec.h>
#include <cstring>
#include "gtest/gtest.h"
#include "v1_0/display_composer_type.h"
#include "hdf_base.h"
#include "hdf_log.h"
namespace OHOS {
namespace HDI {
namespace Display {
namespace TEST {
using namespace OHOS::HDI::Display::Composer::V1_0;
using namespace OHOS::HDI::Display::Buffer::V1_0;
using namespace OHOS;
using namespace testing::ext;
static IDisplayBuffer* g_dispbuf = nullptr;
static const int SIZE_TIMES = 3;
static const int HANDLE_NUM_1 = 2;
static const int HANDLE_NUM_2 = 32;
static const int LOOP_COUNT = 10;
static const int INFO_WIDTH = 1024;
static const int INFO_HEIGHT = 1024;
#define HDF_LOG_TAG display_buffer_module_test
static void WriteBuffer(const BufferHandle& handle)
{
const char VERIFY_MSG[] = "12345678, (*~*)";
int strSize = strlen(VERIFY_MSG) + 1;
int i = 0;
char* ptr = reinterpret_cast<char *>(handle.virAddr);
if (ptr == nullptr) {
HDF_LOGE("cast ptr failed");
return;
}
for (; i < handle.size - strSize;) {
errno_t ret = memcpy_s(&ptr[i], sizeof(VERIFY_MSG), VERIFY_MSG, sizeof(VERIFY_MSG));
if (ret != EOK) {
HDF_LOGE("memcpy_s error : %d", ret);
return;
}
i += strSize;
ptr[i - 1] = 0;
}
for (i = i - 1; i < handle.size; i++) {
ptr[i] = 'z';
}
HDF_LOGD("%{public}s(%{public}d), buffer size:%{public}d, len:%{public}d",
__func__, __LINE__, handle.size, strSize);
for (i = 0; i < handle.size - SIZE_TIMES * strSize; i = i + strSize) {
if (strncmp(VERIFY_MSG, &ptr[i], sizeof(VERIFY_MSG)) != 0) {
HDF_LOGD("%{public}s(%{public}d), buffer[%{public}d]:%{public}s",
__func__, __LINE__, i, &ptr[i]);
}
}
for (i = handle.size - HANDLE_NUM_1; i < (handle.size - HANDLE_NUM_2); i++) {
HDF_LOGD("%{public}s(%{public}d), i:%{public}d, str:%{public}s",
__func__, __LINE__, i, &ptr[i]);
}
}
static void DumpBufferHandle(const BufferHandle& handle)
{
HDF_LOGD("-------------------------------------");
HDF_LOGD("fd =%{public}d", handle.fd);
HDF_LOGD("width =%{public}d", handle.width);
HDF_LOGD("stride =%{public}d", handle.stride);
HDF_LOGD("height =%{public}d", handle.height);
HDF_LOGD("size =0x%{public}x", handle.size);
HDF_LOGD("format =%{public}d", handle.format);
HDF_LOGD("usage =0x%{public}" PRIx64 "", handle.usage);
HDF_LOGD("reserveFds =%{public}d", handle.reserveFds);
HDF_LOGD("reserveInts =%{public}d", handle.reserveInts);
HDF_LOGD("-------------------------------------");
}
int32_t DisplayBufferMt::RunTest(const AllocInfo& info)
{
BufferHandle* bHandle = nullptr;
int32_t ec = g_dispbuf->AllocMem(info, bHandle);
if (ec != HDF_SUCCESS || bHandle == nullptr) {
HDF_LOGE("%{public}s, line=%{public}d, AllocMem failed. ec=0x%{public}x",
__func__, __LINE__, ec);
return HDF_FAILURE;
}
void* buffer = g_dispbuf->Mmap(*bHandle);
if (buffer == nullptr) {
HDF_LOGE("Mmap failed.");
g_dispbuf->FreeMem(*bHandle);
return HDF_FAILURE;
}
HDF_LOGD("Mmap successful");
DumpBufferHandle(*bHandle);
WriteBuffer(*bHandle);
ec = g_dispbuf->InvalidateCache(*bHandle);
if (ec != HDF_SUCCESS) {
HDF_LOGE("InvalidateCache failed.");
g_dispbuf->Unmap(*bHandle);
g_dispbuf->FreeMem(*bHandle);
return HDF_FAILURE;
}
ec = g_dispbuf->FlushCache(*bHandle);
if (ec != HDF_SUCCESS) {
HDF_LOGE("flushCache failed.");
g_dispbuf->Unmap(*bHandle);
g_dispbuf->FreeMem(*bHandle);
return HDF_FAILURE;
}
HDF_LOGD("flush Cache success.");
g_dispbuf->Unmap(*bHandle);
g_dispbuf->FreeMem(*bHandle);
return HDF_SUCCESS;
}
void DisplayBufferMt::SetUpTestCase()
{
g_dispbuf = IDisplayBuffer::Get();
ASSERT_TRUE(g_dispbuf != nullptr);
}
HWTEST_F(DisplayBufferMt, test_DisplayBuffer, TestSize.Level1)
{
AllocInfo info;
info.width = INFO_WIDTH;
info.height = INFO_HEIGHT;
info.usage = OHOS::HDI::Display::Composer::V1_0::HBM_USE_MEM_DMA |
OHOS::HDI::Display::Composer::V1_0::HBM_USE_CPU_READ |
OHOS::HDI::Display::Composer::V1_0::HBM_USE_CPU_WRITE;
info.format = PIXEL_FMT_RGBA_8888;
for (int i = 0; i < LOOP_COUNT; i++) {
int32_t ret = RunTest(info);
EXPECT_EQ(HDF_SUCCESS, ret);
}
}
}
}
}
}