* -------------------------------------------------------------------------
* This file is part of the Vision SDK project.
* Copyright (c) 2025 Huawei Technologies Co.,Ltd.
*
* Vision SDK is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
*
* http://license.coscl.org.cn/MulanPSL2
*
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
* -------------------------------------------------------------------------
* Description: DT test for the MxOmModelDesc.cpp file.
* Author: MindX SDK
* Create: 2025
* History: NA
*/
#include <gtest/gtest.h>
#include <mockcpp/mockcpp.hpp>
#define private public
#define protected public
#include "Model/MxOmModelDesc/MxOmModelDesc.h"
#undef private
#undef protected
#include "MxBase/MemoryHelper/CustomizedMemoryHelper.h"
#include "MxBase/MxBase.h"
#include "Model/MxModelDesc/MxModelDesc.h"
#include "MxBase/ModelInfer/ModelDataType.h"
#include "MxBase/E2eInfer/DataType.h"
namespace {
using namespace MxBase;
const int DEVICE_ID = 1;
const int TWO = 2;
const int FOUR = 4;
const int FAKE_SIZE = 100;
std::vector<uint32_t> g_tensor1 = {1, 2, 3};
std::vector<uint32_t> g_tensor2 = {1, 2, 3, 4};
std::vector<uint32_t> g_tensor3 = {1, 2, 3, 1};
std::vector<uint32_t> g_tensor4 = {1, 2, 3, 1, 4};
class MxOmModelDescTest : public testing::Test {
protected:
void TearDown()
{
GlobalMockObject::verify();
}
};
MxOmModelDesc *DefineDynamicType(VisionDynamicType dynamicType)
{
VisionDynamicInfo info;
info.dynamicType = dynamicType;
MxOmModelDesc *mockModelDesc = new MxOmModelDesc();
mockModelDesc->dynamicInfo_ = info;
return mockModelDesc;
}
TEST_F(MxOmModelDescTest, Test_Init_Should_Return_Fail_When_DeviceId_Is_Invalid)
{
MxOmModelDesc mockModelDesc;
ModelLoadOptV2 mdlLoadOpt;
int32_t wrongDeviceId = 10;
APP_ERROR ret = mockModelDesc.Init(mdlLoadOpt, wrongDeviceId);
EXPECT_EQ(ret, APP_ERR_COMM_INVALID_PARAM);
}
TEST_F(MxOmModelDescTest, Test_Init_Should_Return_Fail_When_InitModel_Fail)
{
MxOmModelDesc mockModelDesc;
MOCKER_CPP_VIRTUAL(mockModelDesc, &MxOmModelDesc::SetDevice).times(1).will(returnValue(0));
MOCKER_CPP(&MxOmModelDesc::InitModel).times(1).will(returnValue(1));
ModelLoadOptV2 mdlLoadOpt;
int32_t deviceId = DEVICE_ID;
APP_ERROR ret = mockModelDesc.Init(mdlLoadOpt, deviceId);
EXPECT_EQ(ret, 1);
}
TEST_F(MxOmModelDescTest, Test_Infer_Should_Return_Fail_When_CheckInputTensors_Fail)
{
std::vector<Tensor> emptyTensor;
std::vector<Tensor> outputTensors;
AscendStream stream;
MxOmModelDesc mockModelDesc;
APP_ERROR ret = mockModelDesc.Infer(emptyTensor, outputTensors, stream);
EXPECT_EQ(ret, APP_ERR_COMM_INVALID_PARAM);
}
TEST_F(MxOmModelDescTest, Test_Infer_With_One_InputTensor_Should_Return_Fail_When_CheckInputTensors_Fail)
{
std::vector<Tensor> emptyTensor;
MxOmModelDesc mockModelDesc;
std::vector<Tensor> ret = mockModelDesc.Infer(emptyTensor);
EXPECT_EQ(ret.size(), 0);
}
TEST_F(MxOmModelDescTest, Test_GetInputTensorShape_Should_Return_Empty_Vector_When_Index_Is_Out_Of_Range)
{
MxOmModelDesc mockModelDesc;
uint32_t index = 100;
std::vector<int64_t> ret = mockModelDesc.GetInputTensorShape(index);
EXPECT_EQ(ret.size(), 0);
}
TEST_F(MxOmModelDescTest, Test_GetOutputTensorShape_Should_Return_Empty_Vector_When_Index_Is_Out_Of_Range)
{
MxOmModelDesc mockModelDesc;
uint32_t index = 100;
std::vector<uint32_t> ret = mockModelDesc.GetOutputTensorShape(index);
EXPECT_EQ(ret.size(), 0);
}
TEST_F(MxOmModelDescTest, Test_InitModel_Should_Return_Fail_When_aclrtCreateStream_Fail)
{
MOCKER_CPP(&aclrtCreateStream).times(1).will(returnValue(1));
MxOmModelDesc mockModelDesc;
ModelLoadOptV2 mdlLoadOpt;
APP_ERROR ret = mockModelDesc.InitModel(mdlLoadOpt);
EXPECT_EQ(ret, APP_ERR_ACL_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_GetDynamicGearInfo_Process_When_VisionDynamicType_Is_DYNAMIC_BATCH)
{
MxOmModelDesc *mockModelDesc = DefineDynamicType(VisionDynamicType::DYNAMIC_BATCH);
std::vector<std::vector<uint64_t>> ret = mockModelDesc->GetDynamicGearInfo();
delete mockModelDesc;
EXPECT_EQ(ret.size(), 0);
}
TEST_F(MxOmModelDescTest, Test_GetDynamicGearInfo_Process_When_VisionDynamicType_Is_DYNAMIC_HW)
{
MxOmModelDesc *mockModelDesc = DefineDynamicType(VisionDynamicType::DYNAMIC_HW);
std::vector<std::vector<uint64_t>> ret = mockModelDesc->GetDynamicGearInfo();
delete mockModelDesc;
EXPECT_EQ(ret.size(), 0);
}
TEST_F(MxOmModelDescTest, Test_GetDynamicGearInfo_Process_When_VisionDynamicType_Is_DYNAMIC_DIMS)
{
MxOmModelDesc *mockModelDesc = DefineDynamicType(VisionDynamicType::DYNAMIC_DIMS);
std::vector<std::vector<uint64_t>> ret = mockModelDesc->GetDynamicGearInfo();
EXPECT_EQ(ret.size(), 0);
}
TEST_F(MxOmModelDescTest, Test_GetInputTensorDataType_Should_Return_UNDEFINED_Type_When_Index_Is_Out_Of_Range)
{
MxOmModelDesc mockModelDesc;
uint32_t index = 100;
TensorDType ret = mockModelDesc.GetInputTensorDataType(index);
EXPECT_EQ(ret, TensorDType::UNDEFINED);
}
TEST_F(MxOmModelDescTest, Test_GetOutputTensorDataType_Should_Return_UNDEFINED_Type_When_Index_Is_Out_Of_Range)
{
MxOmModelDesc mockModelDesc;
uint32_t index = 100;
TensorDType ret = mockModelDesc.GetOutputTensorDataType(index);
EXPECT_EQ(ret, TensorDType::UNDEFINED);
}
TEST_F(MxOmModelDescTest, Test_GetDynamicType_Should_Return_DYNAMIC_DIMS_When_Type_Is_DYNAMIC_DIMS)
{
MxOmModelDesc *mockModelDesc = DefineDynamicType(VisionDynamicType::DYNAMIC_DIMS);
VisionDynamicType ret = mockModelDesc->GetDynamicType();
delete mockModelDesc;
EXPECT_EQ(ret, VisionDynamicType::DYNAMIC_DIMS);
}
TEST_F(MxOmModelDescTest, Test_MallocInputBuffer_Should_Return_Fail_When_DeviceMemoryMallocFunc_Fail)
{
MOCKER_CPP(&aclmdlGetInputSizeByIndex).times(1).will(returnValue((unsigned long)0));
MOCKER_CPP(&DeviceMemoryMallocFunc).times(1).will(returnValue(1));
VisionTensorDesc desc;
std::vector<VisionTensorDesc> inputDesc = {desc, desc};
MxOmModelDesc mockModelDesc;
mockModelDesc.inputTensorDesc_ = inputDesc;
APP_ERROR ret = mockModelDesc.MallocInputBuffer();
EXPECT_EQ(ret, APP_ERR_ACL_BAD_ALLOC);
}
TEST_F(MxOmModelDescTest, Test_DeInit_Should_Return_Fail_When_aclmdlDestroyDesc_Fail)
{
MOCKER_CPP(&aclmdlUnload).times(TWO).will(returnValue(0));
MOCKER_CPP(&aclmdlDestroyDesc).times(1).will(returnValue(1));
void *aclmd = malloc(5);
MxOmModelDesc mockModelDesc;
mockModelDesc.aclModelDesc_ = aclmd;
APP_ERROR ret = mockModelDesc.DeInit();
EXPECT_EQ(ret, APP_ERR_ACL_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_GetModelInputDesc_Should_Return_Fail_When_aclmdlGetInputDimsV2_Fail)
{
MOCKER_CPP(&aclmdlGetNumInputs).times(1).will(returnValue(1));
MOCKER_CPP(&aclmdlGetInputDimsV2).times(1).will(returnValue(1));
MxOmModelDesc mockModelDesc;
APP_ERROR ret = mockModelDesc.GetModelInputDesc();
EXPECT_EQ(ret, APP_ERR_ACL_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_MallocOutputBuffer_Should_Return_Fail_When_DeviceMemoryMallocFunc_Fail)
{
MOCKER_CPP(&DeviceMemoryMallocFunc).times(1).will(returnValue(1));
VisionTensorDesc emptyTensor;
std::vector<VisionTensorDesc> outputTD = {emptyTensor, emptyTensor};
MxOmModelDesc mockModelDesc;
mockModelDesc.outputTensorDesc_ = outputTD;
APP_ERROR ret = mockModelDesc.MallocOutputBuffer();
EXPECT_EQ(ret, APP_ERR_ACL_BAD_ALLOC);
}
TEST_F(MxOmModelDescTest, Test_GetModelOutputDesc_Process_With_VisionDynamicType_Is_DYNAMIC_SHAPE)
{
MOCKER_CPP(&aclmdlGetNumOutputs).times(1).will(returnValue(1));
MxOmModelDesc *mockModelDesc = DefineDynamicType(VisionDynamicType::DYNAMIC_SHAPE);
APP_ERROR ret = mockModelDesc->GetModelOutputDesc();
delete mockModelDesc;
EXPECT_EQ(ret, APP_ERR_ACL_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_GetModelCurOutputDesc_Should_Return_Fail_When_aclmdlGetCurOutputDims_Fail)
{
MOCKER_CPP(&aclmdlGetNumOutputs).times(1).will(returnValue(1));
MOCKER_CPP(&aclmdlGetCurOutputDims).times(1).will(returnValue(1));
MxOmModelDesc mockModelDesc;
APP_ERROR ret = mockModelDesc.GetModelCurOutputDesc();
EXPECT_EQ(ret, APP_ERR_ACL_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_GetDynamicDesc_Should_Return_Fail_When_GetDynamicBatch_Fail)
{
MOCKER_CPP(&aclmdlGetDynamicBatch).times(1).will(returnValue(1));
MxOmModelDesc mockModelDesc;
APP_ERROR ret = mockModelDesc.GetDynamicDesc();
EXPECT_EQ(ret, APP_ERR_ACL_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_GetDynamicDesc_Should_Return_Fail_When_GetDynamicSize_Fail)
{
MOCKER_CPP(&MxOmModelDesc::GetDynamicBatch).times(1).will(returnValue(0));
MOCKER_CPP(&MxOmModelDesc::GetDynamicSize).times(1).will(returnValue(1));
MxOmModelDesc mockModelDesc;
APP_ERROR ret = mockModelDesc.GetDynamicDesc();
EXPECT_EQ(ret, 1);
}
TEST_F(MxOmModelDescTest, Test_GetDynamicDims_Should_Return_Success_When_Type_Is_Not_STATIC_BATCH)
{
MxOmModelDesc *mockModelDesc = DefineDynamicType(VisionDynamicType::DYNAMIC_SHAPE);
APP_ERROR ret = mockModelDesc->GetDynamicDims();
delete mockModelDesc;
EXPECT_EQ(ret, APP_ERR_OK);
}
TEST_F(MxOmModelDescTest, Test_GetDynamicSize_Should_Return_Success_When_Type_Is_Not_STATIC_BATCH)
{
MxOmModelDesc *mockModelDesc = DefineDynamicType(VisionDynamicType::DYNAMIC_SHAPE);
APP_ERROR ret = mockModelDesc->GetDynamicSize();
delete mockModelDesc;
EXPECT_EQ(ret, APP_ERR_OK);
}
TEST_F(MxOmModelDescTest, Test_GetDynamicSize_Should_Return_Fail_When_aclmdlGetDynamicHW_Fail)
{
MOCKER_CPP(&aclmdlGetDynamicHW).times(1).will(returnValue(1));
MxOmModelDesc mockModelDesc;
APP_ERROR ret = mockModelDesc.GetDynamicSize();
EXPECT_EQ(ret, APP_ERR_ACL_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_GetDynamicDims_Should_Return_Fail_When_aclmdlGetInputDynamicGearCount_Fail)
{
MOCKER_CPP(&aclmdlGetInputDynamicGearCount).times(1).will(returnValue(1));
MxOmModelDesc mockModelDesc;
APP_ERROR ret = mockModelDesc.GetDynamicDims();
EXPECT_EQ(ret, APP_ERR_ACL_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_GetDynamicShapeType_Should_Return_Success_When_Type_Is_Not_STATIC_BATCH)
{
MxOmModelDesc *mockModelDesc = DefineDynamicType(VisionDynamicType::DYNAMIC_SHAPE);
APP_ERROR ret = mockModelDesc->GetDynamicShapeType();
delete mockModelDesc;
EXPECT_EQ(ret, APP_ERR_OK);
}
TEST_F(MxOmModelDescTest, Test_GetDynamicIndex_Should_Return_Fail_When_Type_Not_Both_And_GetName_Fail)
{
MxOmModelDesc *mockModelDesc = DefineDynamicType(VisionDynamicType::DYNAMIC_HW);
APP_ERROR ret = mockModelDesc->GetDynamicIndex();
delete mockModelDesc;
EXPECT_EQ(ret, APP_ERR_COMM_CONNECTION_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_GetDynamicIndex_Should_Return_Success_When_Type_Not_Both_And_GetName_Success)
{
MOCKER_CPP(&aclmdlGetInputIndexByName).times(1).will(returnValue(0));
MxOmModelDesc *mockModelDesc = DefineDynamicType(VisionDynamicType::DYNAMIC_HW);
APP_ERROR ret = mockModelDesc->GetDynamicIndex();
delete mockModelDesc;
EXPECT_EQ(ret, APP_ERR_OK);
}
TEST_F(MxOmModelDescTest, Test_CreatOutputTensors_Should_Return_Fail_When_OutShape_Size_Is_Zero)
{
VisionTensorDesc emptyTensor;
std::vector<VisionTensorDesc> outputTD = {emptyTensor, emptyTensor};
MxOmModelDesc mockModelDesc;
mockModelDesc.outputTensorDesc_ = outputTD;
std::vector<Tensor> outputs;
const std::vector<Tensor> inputTensors;
APP_ERROR ret = mockModelDesc.CreatOutputTensors(outputs, inputTensors);
EXPECT_EQ(ret, APP_ERR_COMM_FAILURE);
}
TEST_F(MxOmModelDescTest, DISABLED_Test_DynamicOutputsCrop_Should_Return_Fail_When_Malloc_Fail)
{
MOCKER_CPP(&Tensor::Malloc).times(1).will(returnValue(1));
std::vector<int64_t> modelOutShape;
MxBase::TensorDType tensorDType;
MxBase::Tensor output;
std::vector<MxBase::Tensor> outputs;
MxOmModelDesc mockModelDesc;
APP_ERROR ret = mockModelDesc.DynamicOutputsCrop(modelOutShape, tensorDType, output, outputs);
EXPECT_EQ(ret, 1);
}
TEST_F(MxOmModelDescTest, Test_CheckInputShape_Should_Return_Fail_When_ShapeSize_Not_Equal)
{
std::vector<std::vector<uint32_t>> inputTensorShape(TWO, g_tensor1);
VisionTensorDesc visionTensor;
std::vector<VisionTensorDesc> inputTensorDesc = {visionTensor, visionTensor};
MxOmModelDesc mockModelDesc;
mockModelDesc.inputTensorDesc_ = inputTensorDesc;
AscendStream Stream;
APP_ERROR ret = mockModelDesc.CheckInputShape(inputTensorShape, Stream);
EXPECT_EQ(ret, APP_ERR_COMM_INVALID_PARAM);
}
TEST_F(MxOmModelDescTest, Test_CheckInputDType_Should_Return_Fail_When_Type_Is_Not_Equal)
{
MOCKER_CPP(&aclmdlGetInputDataType).times(1).will(returnValue(0));
Tensor emptyTensor;
std::vector<Tensor> inputTensors = {emptyTensor, emptyTensor};
AscendStream Stream;
MxOmModelDesc mockModelDesc;
APP_ERROR ret = mockModelDesc.CheckInputDType(inputTensors, Stream);
EXPECT_EQ(ret, APP_ERR_COMM_INVALID_PARAM);
}
TEST_F(MxOmModelDescTest, Test_CreateOutputs_Process_With_Type_Is_DYNAMIC_SHAPE)
{
MxOmModelDesc *mockModelDesc = DefineDynamicType(VisionDynamicType::DYNAMIC_SHAPE);
VisionTensorBase tensorBase;
std::vector<VisionTensorBase> outputTensor = {tensorBase, tensorBase};
mockModelDesc->outputTensor_ = outputTensor;
std::vector<uint32_t> modelOutShape;
MxBase::TensorDType tensorDType = TensorDType::UINT8;
std::vector<MxBase::Tensor> outputs;
uint32_t index = 0;
try {
APP_ERROR ret = mockModelDesc->CreateOutputs(modelOutShape, tensorDType, outputs, index);
delete mockModelDesc;
} catch (const std::runtime_error &e) {
EXPECT_EQ(e.what(), std::string("[1007][memory allocation error] "));
}
}
TEST_F(MxOmModelDescTest, Test_ModelInference_Should_Return_Fail_When_InputDataset_Is_Nullptr)
{
aclmdlDataset *emptyPtr = nullptr;
MOCKER_CPP(&aclmdlCreateDataset).times(1).will(returnValue(emptyPtr));
std::vector<Tensor> outputTensors;
std::vector<std::vector<uint32_t>> inputShape;
AscendStream stream;
MxOmModelDesc mockModelDesc;
APP_ERROR ret = mockModelDesc.ModelInference(outputTensors, inputShape, stream);
EXPECT_EQ(ret, APP_ERR_COMM_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_SyncAndFree_Should_Return_Fail_When_aclrtSynchronizeStream_Fail)
{
MOCKER_CPP(&aclrtSynchronizeStream).times(1).will(returnValue(1));
MxOmModelDesc mockModelDesc;
AscendStream stream;
APP_ERROR ret = mockModelDesc.SyncAndFree(nullptr, nullptr, stream);
EXPECT_EQ(ret, 1);
}
TEST_F(MxOmModelDescTest, Test_CreateAndFillDataset_Should_Return_Nullptr_When_aclmdlCreateDataset_Fail)
{
aclmdlDataset *retPtr = nullptr;
MOCKER_CPP(&aclmdlCreateDataset).times(1).will(returnValue(retPtr));
std::vector<Tensor> emptyTensors;
MxOmModelDesc mockModelDesc;
aclmdlDataset *ret = mockModelDesc.CreateAndFillDataset(emptyTensors);
EXPECT_EQ(ret, nullptr);
}
TEST_F(MxOmModelDescTest, Test_CreateAndFillDataset_TensorBase_Should_Return_Nullptr_When_aclmdlCreateDataset_Fail)
{
aclmdlDataset *retPtr = nullptr;
MOCKER_CPP(&aclmdlCreateDataset).times(1).will(returnValue(retPtr));
std::vector<VisionTensorBase> tensorBase;
MxOmModelDesc mockModelDesc;
aclmdlDataset *ret = mockModelDesc.CreateAndFillDataset(tensorBase);
EXPECT_EQ(ret, nullptr);
}
TEST_F(MxOmModelDescTest, Test_DestroyDataset_Should_Do_Nothing_When_Dataset_Is_Nullptr)
{
aclmdlDataset *emptyPtr = nullptr;
MxOmModelDesc mockModelDesc;
mockModelDesc.DestroyDataset(emptyPtr);
EXPECT_EQ(emptyPtr, nullptr);
}
TEST_F(MxOmModelDescTest, Test_GetOutputShapeInDynamicShapeMode_Should_Fail_When_numDims_Is_ACL_UNKNOWN_RANK)
{
MOCKER_CPP(&aclGetTensorDescNumDims).times(1).will(returnValue(0xFFFFFFFFFFFFFFFE));
VisionTensorDesc emptyTensor;
std::vector<VisionTensorDesc> outputTD = {emptyTensor, emptyTensor};
MxOmModelDesc mockModelDesc;
mockModelDesc.outputTensorDesc_ = outputTD;
AscendStream Stream;
APP_ERROR ret = mockModelDesc.GetOutputShapeInDynamicShapeMode(nullptr, Stream);
EXPECT_EQ(ret, APP_ERR_ACL_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_ModelSetDynamicInfo_Process_With_dynamicType_Is_STATIC_BATCH)
{
MxOmModelDesc *mockModelDesc = DefineDynamicType(VisionDynamicType::STATIC_BATCH);
std::vector<std::vector<uint32_t>> modelShape;
AscendStream Stream;
APP_ERROR ret = mockModelDesc->ModelSetDynamicInfo(nullptr, modelShape, Stream);
delete mockModelDesc;
EXPECT_EQ(ret, APP_ERR_OK);
}
TEST_F(MxOmModelDescTest, Test_ModelSetDynamicInfo_Process_Fail_With_dynamicType_Is_DYNAMIC_BATCH)
{
MxOmModelDesc *mockModelDesc = DefineDynamicType(VisionDynamicType::DYNAMIC_BATCH);
std::vector<std::vector<uint32_t>> modelShape(TWO, g_tensor1);
AscendStream Stream;
APP_ERROR ret = mockModelDesc->ModelSetDynamicInfo(nullptr, modelShape, Stream);
delete mockModelDesc;
EXPECT_EQ(ret, APP_ERR_ACL_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_ModelSetDynamicInfo_Process_With_Type_Is_DYNAMIC_BATCH_SetDynamicBatch_Fail)
{
MOCKER_CPP(&MxOmModelDesc::SetDynamicBatch).times(1).will(returnValue(1));
MxOmModelDesc *mockModelDesc = DefineDynamicType(VisionDynamicType::DYNAMIC_BATCH);
std::vector<std::vector<uint32_t>> modelShape(TWO, g_tensor1);
AscendStream Stream;
APP_ERROR ret = mockModelDesc->ModelSetDynamicInfo(nullptr, modelShape, Stream);
delete mockModelDesc;
EXPECT_EQ(ret, 1);
}
TEST_F(MxOmModelDescTest, Test_ModelSetDynamicInfo_Process_Fail_With_dynamicType_Is_DYNAMIC_DIMS)
{
MOCKER_CPP(&aclmdlSetInputDynamicDims).times(1).will(returnValue(1));
MxOmModelDesc *mockModelDesc = DefineDynamicType(VisionDynamicType::DYNAMIC_DIMS);
std::vector<std::vector<uint32_t>> modelShape(TWO, g_tensor1);
AscendStream Stream;
APP_ERROR ret = mockModelDesc->ModelSetDynamicInfo(nullptr, modelShape, Stream);
delete mockModelDesc;
EXPECT_EQ(ret, APP_ERR_ACL_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_ModelSetDynamicInfo_Process_Fail_With_Default)
{
MxOmModelDesc *mockModelDesc = DefineDynamicType(static_cast<VisionDynamicType>(-1));
std::vector<std::vector<uint32_t>> modelShape;
AscendStream Stream;
APP_ERROR ret = mockModelDesc->ModelSetDynamicInfo(nullptr, modelShape, Stream);
delete mockModelDesc;
EXPECT_EQ(ret, APP_ERR_COMM_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_SetDynamicSize_Should_Return_Fail_Process_With_Format_Is_NCHW)
{
MxOmModelDesc mockModelDesc;
std::vector<std::vector<uint32_t>> modelShape(FOUR, g_tensor2);
AscendStream Stream;
APP_ERROR ret = mockModelDesc.SetDynamicSize(nullptr, modelShape, Stream);
EXPECT_EQ(ret, APP_ERR_ACL_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_SetDynamicSize_Should_Return_Fail_Process_Fail_With_Format_Is_NHWC)
{
MxOmModelDesc mockModelDesc;
VisionDataFormat dataFormat = VisionDataFormat::NHWC;
mockModelDesc.dataFormat_ = dataFormat;
std::vector<std::vector<uint32_t>> modelShape(FOUR, g_tensor3);
AscendStream Stream;
APP_ERROR ret = mockModelDesc.SetDynamicSize(nullptr, modelShape, Stream);
EXPECT_EQ(ret, APP_ERR_ACL_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_SetDynamicShape_Should_Return_Success_When_modelShape_Is_Zero)
{
MxOmModelDesc mockModelDesc;
std::vector<std::vector<uint32_t>> modelShape;
AscendStream Stream;
APP_ERROR ret = mockModelDesc.SetDynamicShape(nullptr, modelShape, Stream);
EXPECT_EQ(ret, APP_ERR_OK);
}
TEST_F(MxOmModelDescTest, Test_IsYUVData_Only_Type_Wrong)
{
MxOmModelDesc mockModelDesc;
VisionDataFormat dataFormat = VisionDataFormat::NCHW;
mockModelDesc.dataFormat_ = dataFormat;
AscendStream Stream;
APP_ERROR ret = mockModelDesc.IsYUVData(g_tensor3);
EXPECT_EQ(ret, false);
}
TEST_F(MxOmModelDescTest, Test_IsYUVData_Only_Size_Wrong)
{
MxOmModelDesc mockModelDesc;
VisionDataFormat dataFormat = VisionDataFormat::NHWC;
mockModelDesc.dataFormat_ = dataFormat;
AscendStream Stream;
APP_ERROR ret = mockModelDesc.IsYUVData(g_tensor4);
EXPECT_EQ(ret, false);
}
TEST_F(MxOmModelDescTest, Test_IsYUVData_Only_channelIdx_Value_Wrong)
{
MxOmModelDesc mockModelDesc;
VisionDataFormat dataFormat = VisionDataFormat::NHWC;
mockModelDesc.dataFormat_ = dataFormat;
AscendStream Stream;
APP_ERROR ret = mockModelDesc.IsYUVData(g_tensor2);
EXPECT_EQ(ret, false);
}
TEST_F(MxOmModelDescTest, Test_CheckInputTensors_Should_Return_Fail_When_Tensor_Size_Is_More_Than_Count)
{
void *usrData = malloc(8);
Tensor tmpTensor1(usrData, {8}, TensorDType::INT8);
const std::vector<Tensor> tensors(3, tmpTensor1);
MxOmModelDesc mockModelDesc;
const uint32_t count = 1;
AscendStream Stream;
APP_ERROR ret = mockModelDesc.CheckInputTensors(tensors, count, Stream);
free(usrData);
EXPECT_EQ(ret, APP_ERR_COMM_INVALID_PARAM);
}
TEST_F(MxOmModelDescTest, Test_CheckInputTensors_Should_Return_Success_When_Tensor_Size_Is_Less_Than_Count)
{
void *usrData = malloc(8);
Tensor tmpTensor1(usrData, {8}, TensorDType::INT8);
const std::vector<Tensor> tensors(3, tmpTensor1);
MxOmModelDesc mockModelDesc;
const uint32_t count = 100;
AscendStream Stream;
APP_ERROR ret = mockModelDesc.CheckInputTensors(tensors, count, Stream);
free(usrData);
EXPECT_EQ(ret, APP_ERR_OK);
}
TEST_F(MxOmModelDescTest, Test_CheckOutputTensors_Should_Return_Fail_When_Tensors_Is_Empty)
{
MxOmModelDesc mockModelDesc;
const std::vector<Tensor> tensors;
const uint32_t count = 100;
AscendStream Stream;
APP_ERROR ret = mockModelDesc.CheckOutputTensors(tensors, count, Stream);
EXPECT_EQ(ret, APP_ERR_COMM_INVALID_PARAM);
}
TEST_F(MxOmModelDescTest, Test_CheckOutputTensors_Should_Return_Fail_When_First_Tensor_Is_Empty)
{
MxOmModelDesc mockModelDesc;
Tensor emptyTensor;
const std::vector<Tensor> tensors = {emptyTensor};
const uint32_t count = 100;
AscendStream Stream;
APP_ERROR ret = mockModelDesc.CheckOutputTensors(tensors, count, Stream);
EXPECT_EQ(ret, APP_ERR_COMM_INVALID_PARAM);
}
TEST_F(MxOmModelDescTest, Test_CheckOutputTensors_Should_Return_Fail_When_Tensors_Size_Not_Equal)
{
void *usrData = malloc(8);
Tensor tmpTensor1(usrData, {8}, TensorDType::INT8);
const std::vector<Tensor> tensors(FOUR, tmpTensor1);
MxOmModelDesc mockModelDesc;
const uint32_t count = 1;
AscendStream Stream;
APP_ERROR ret = mockModelDesc.CheckOutputTensors(tensors, count, Stream);
free(usrData);
EXPECT_EQ(ret, APP_ERR_COMM_INVALID_PARAM);
}
TEST_F(MxOmModelDescTest, Test_CheckOutputTensors_Should_Return_Success_When_Tensors_Size_Is_Equal)
{
void *usrData = malloc(8);
Tensor tmpTensor1(usrData, {8}, TensorDType::INT8);
const std::vector<Tensor> tensors(FOUR, tmpTensor1);
MxOmModelDesc mockModelDesc;
const uint32_t count = 4;
AscendStream Stream;
APP_ERROR ret = mockModelDesc.CheckOutputTensors(tensors, count, Stream);
free(usrData);
EXPECT_EQ(ret, APP_ERR_OK);
}
TEST_F(MxOmModelDescTest, Test_SetModelLoadOpt_Should_Return_Fail_With_LOAD_MODEL_FROM_FILE_WITH_MEM)
{
MOCKER_CPP(&aclmdlQuerySize).times(1).will(returnValue(1));
ModelLoadOptV2 opt;
opt.loadType = ModelLoadOptV2::ModelLoadType::LOAD_MODEL_FROM_FILE_WITH_MEM;
MxOmModelDesc mockModelDesc;
APP_ERROR ret = mockModelDesc.SetModelLoadOpt(nullptr, opt);
EXPECT_EQ(ret, APP_ERR_ACL_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_SetModelLoadOpt_Should_Return_Fail_With_LOAD_MODEL_FROM_FILE)
{
MOCKER_CPP(&aclmdlSetConfigOpt).times(1).will(returnValue(1));
ModelLoadOptV2 opt;
opt.loadType = ModelLoadOptV2::ModelLoadType::LOAD_MODEL_FROM_FILE;
MxOmModelDesc mockModelDesc;
APP_ERROR ret = mockModelDesc.SetModelLoadOpt(nullptr, opt);
EXPECT_EQ(ret, APP_ERR_ACL_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_SetModelLoadOpt_Should_Return_Fail_With_LOAD_MODEL_FROM_MEM_WITH_MEM)
{
MOCKER_CPP(&aclmdlQuerySizeFromMem).times(1).will(returnValue(1));
ModelLoadOptV2 opt;
opt.loadType = ModelLoadOptV2::ModelLoadType::LOAD_MODEL_FROM_MEM_WITH_MEM;
MxOmModelDesc mockModelDesc;
APP_ERROR ret = mockModelDesc.SetModelLoadOpt(nullptr, opt);
EXPECT_EQ(ret, APP_ERR_ACL_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_SetModelLoadOpt_Should_Return_Fail_With_LOAD_MODEL_FROM_MEM)
{
MOCKER_CPP(&aclmdlSetConfigOpt).times(1).will(returnValue(1));
ModelLoadOptV2 opt;
opt.loadType = ModelLoadOptV2::ModelLoadType::LOAD_MODEL_FROM_MEM;
MxOmModelDesc mockModelDesc;
APP_ERROR ret = mockModelDesc.SetModelLoadOpt(nullptr, opt);
EXPECT_EQ(ret, APP_ERR_ACL_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_SetModelLoadOpt_Should_Return_Fail_With_Default)
{
ModelLoadOptV2 opt;
opt.loadType = static_cast<ModelLoadOptV2::ModelLoadType>(-1);
MxOmModelDesc mockModelDesc;
APP_ERROR ret = mockModelDesc.SetModelLoadOpt(nullptr, opt);
EXPECT_EQ(ret, APP_ERR_COMM_INVALID_PARAM);
}
TEST_F(MxOmModelDescTest, Test_SetModelMemOpt_Should_Return_Success_When_Ptr_All_Nullptr)
{
ModelLoadOptV2 opt;
MxOmModelDesc mockModelDesc;
APP_ERROR ret = mockModelDesc.SetModelMemOpt(nullptr, opt);
EXPECT_EQ(ret, APP_ERR_OK);
}
TEST_F(MxOmModelDescTest, Test_SetModelMemOpt_Should_Return_Fail_When_WorkSize_Is_Not_Enough)
{
MxOmModelDesc mockModelDesc;
ModelLoadOptV2 opt;
aclmdlDataset *myPtr = (aclmdlDataset *)&g_tensor1;
opt.modelWorkPtr = myPtr;
mockModelDesc.workSize_ = FAKE_SIZE;
APP_ERROR ret = mockModelDesc.SetModelMemOpt(nullptr, opt);
EXPECT_EQ(ret, APP_ERR_COMM_INVALID_PARAM);
}
TEST_F(MxOmModelDescTest, Test_SetModelMemOpt_Should_Return_Fail_When_aclmdlSetConfigOpt_Fail)
{
MxOmModelDesc mockModelDesc;
ModelLoadOptV2 opt;
aclmdlDataset *myPtr = (aclmdlDataset *)&g_tensor1;
opt.modelWorkPtr = myPtr;
opt.workSize = FAKE_SIZE;
APP_ERROR ret = mockModelDesc.SetModelMemOpt(nullptr, opt);
EXPECT_EQ(ret, APP_ERR_ACL_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_SetModelMemOpt_Should_Return_Fail_When_weightSize_Is_Not_Enough)
{
MxOmModelDesc mockModelDesc;
ModelLoadOptV2 opt;
aclmdlDataset *myPtr = (aclmdlDataset *)&g_tensor1;
opt.modelWeightPtr = myPtr;
mockModelDesc.weightSize_ = FAKE_SIZE;
APP_ERROR ret = mockModelDesc.SetModelMemOpt(nullptr, opt);
EXPECT_EQ(ret, APP_ERR_COMM_INVALID_PARAM);
}
TEST_F(MxOmModelDescTest, Test_SetModelMemOpt_Should_Return_Fail_When_Second_aclmdlSetConfigOpt_Fail)
{
MxOmModelDesc mockModelDesc;
ModelLoadOptV2 opt;
aclmdlDataset *myPtr = (aclmdlDataset *)&g_tensor1;
opt.modelWeightPtr = myPtr;
opt.workSize = FAKE_SIZE;
APP_ERROR ret = mockModelDesc.SetModelMemOpt(nullptr, opt);
EXPECT_EQ(ret, APP_ERR_ACL_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_LoadModel_Should_Return_Fail_When_configHandle_Is_Nullptr)
{
aclmdlConfigHandle *emptyPtr = nullptr;
MOCKER_CPP(&aclmdlCreateConfigHandle).times(1).will(returnValue(emptyPtr));
MxOmModelDesc mockModelDesc;
ModelLoadOptV2 mdlLoadOpt;
APP_ERROR ret = mockModelDesc.LoadModel(mdlLoadOpt);
EXPECT_EQ(ret, APP_ERR_ACL_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_InitModel_Should_Return_Fail_When_LoadModel_Fail)
{
aclrtStream *emptyPtr = (aclrtStream *)&g_tensor1;
MOCKER_CPP(&MxOmModelDesc::LoadModel).times(1).will(returnValue(1));
MOCKER_CPP(&aclrtDestroyStream).times(1).will(returnValue(1));
MxOmModelDesc mockModelDesc;
ModelLoadOptV2 mdlLoadOpt;
APP_ERROR ret = mockModelDesc.InitModel(mdlLoadOpt);
EXPECT_EQ(ret, APP_ERR_ACL_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_Infer_Should_Return_Fail_When_CheckOutputTensors_Fail)
{
std::vector<Tensor> inputTensor;
std::vector<Tensor> outputTensors;
AscendStream stream;
MxOmModelDesc mockModelDesc;
MOCKER_CPP(&MxOmModelDesc::CheckInputTensors).times(1).will(returnValue(0));
APP_ERROR retValue = APP_ERR_COMM_INVALID_PARAM;
MOCKER_CPP(&MxOmModelDesc::CheckOutputTensors).times(1).will(returnValue(retValue));
APP_ERROR ret = mockModelDesc.Infer(inputTensor, outputTensors, stream);
EXPECT_EQ(ret, APP_ERR_COMM_INVALID_PARAM);
}
TEST_F(MxOmModelDescTest, Test_Infer_Should_Return_Fail_When_SetDevice_Fail)
{
std::vector<Tensor> inputTensor;
std::vector<Tensor> outputTensors;
AscendStream stream;
MxOmModelDesc mockModelDesc;
MOCKER_CPP(&MxOmModelDesc::CheckInputTensors).times(1).will(returnValue(0));
MOCKER_CPP(&MxOmModelDesc::CheckOutputTensors).times(1).will(returnValue(0));
APP_ERROR retValue = APP_ERR_COMM_INVALID_PARAM;
MOCKER_CPP_VIRTUAL(mockModelDesc, &MxOmModelDesc::SetDevice).times(1).will(returnValue(retValue));
APP_ERROR ret = mockModelDesc.Infer(inputTensor, outputTensors, stream);
EXPECT_EQ(ret, APP_ERR_COMM_INVALID_PARAM);
}
TEST_F(MxOmModelDescTest, Test_Infer_Should_Return_Fail_When_SetInputTensor_Fail)
{
std::vector<Tensor> inputTensor;
std::vector<Tensor> outputTensors;
AscendStream stream;
MxOmModelDesc mockModelDesc;
MOCKER_CPP(&MxOmModelDesc::CheckInputTensors).times(1).will(returnValue(0));
MOCKER_CPP(&MxOmModelDesc::CheckOutputTensors).times(1).will(returnValue(0));
MOCKER_CPP_VIRTUAL(mockModelDesc, &MxOmModelDesc::SetDevice).times(1).will(returnValue(0));
APP_ERROR retValue = APP_ERR_COMM_INVALID_PARAM;
MOCKER_CPP(&MxOmModelDesc::SetInputTensor).times(1).will(returnValue(retValue));
APP_ERROR ret = mockModelDesc.Infer(inputTensor, outputTensors, stream);
EXPECT_EQ(ret, APP_ERR_COMM_INVALID_PARAM);
}
TEST_F(MxOmModelDescTest, Test_Infer_Should_Return_Fail_When_CheckInputDType_Fail)
{
std::vector<Tensor> inputTensor;
std::vector<Tensor> outputTensors;
AscendStream stream;
MxOmModelDesc mockModelDesc;
MOCKER_CPP(&MxOmModelDesc::CheckInputTensors).times(1).will(returnValue(0));
MOCKER_CPP(&MxOmModelDesc::CheckOutputTensors).times(1).will(returnValue(0));
MOCKER_CPP_VIRTUAL(mockModelDesc, &MxOmModelDesc::SetDevice).times(1).will(returnValue(0));
MOCKER_CPP(&MxOmModelDesc::SetInputTensor).times(1).will(returnValue(0));
APP_ERROR retValue = APP_ERR_COMM_INVALID_PARAM;
MOCKER_CPP(&MxOmModelDesc::CheckInputDType).times(1).will(returnValue(retValue));
APP_ERROR ret = mockModelDesc.Infer(inputTensor, outputTensors, stream);
EXPECT_EQ(ret, APP_ERR_COMM_INVALID_PARAM);
}
TEST_F(MxOmModelDescTest, Test_Infer_Should_Return_Fail_When_CheckInputShape_Fail)
{
std::vector<Tensor> inputTensor;
std::vector<Tensor> outputTensors;
AscendStream stream;
MxOmModelDesc mockModelDesc;
MOCKER_CPP(&MxOmModelDesc::CheckInputTensors).times(1).will(returnValue(0));
MOCKER_CPP(&MxOmModelDesc::CheckOutputTensors).times(1).will(returnValue(0));
MOCKER_CPP_VIRTUAL(mockModelDesc, &MxOmModelDesc::SetDevice).times(1).will(returnValue(0));
MOCKER_CPP(&MxOmModelDesc::SetInputTensor).times(1).will(returnValue(0));
MOCKER_CPP(&MxOmModelDesc::CheckInputDType).times(1).will(returnValue(0));
APP_ERROR retValue = APP_ERR_COMM_INVALID_PARAM;
MOCKER_CPP(&MxOmModelDesc::CheckInputShape).times(1).will(returnValue(retValue));
APP_ERROR ret = mockModelDesc.Infer(inputTensor, outputTensors, stream);
EXPECT_EQ(ret, APP_ERR_COMM_INVALID_PARAM);
}
TEST_F(MxOmModelDescTest, Test_Infer_Should_Return_Fail_When_ModelInference_Fail)
{
std::vector<Tensor> inputTensor;
std::vector<Tensor> outputTensors;
AscendStream stream;
MxOmModelDesc mockModelDesc;
MOCKER_CPP(&MxOmModelDesc::CheckInputTensors).times(1).will(returnValue(0));
MOCKER_CPP(&MxOmModelDesc::CheckOutputTensors).times(1).will(returnValue(0));
MOCKER_CPP_VIRTUAL(mockModelDesc, &MxOmModelDesc::SetDevice).times(1).will(returnValue(0));
MOCKER_CPP(&MxOmModelDesc::SetInputTensor).times(1).will(returnValue(0));
MOCKER_CPP(&MxOmModelDesc::CheckInputDType).times(1).will(returnValue(0));
MOCKER_CPP(&MxOmModelDesc::CheckInputShape).times(1).will(returnValue(0));
APP_ERROR retValue = APP_ERR_COMM_INVALID_PARAM;
MOCKER_CPP(&MxOmModelDesc::ModelInference).times(1).will(returnValue(retValue));
APP_ERROR ret = mockModelDesc.Infer(inputTensor, outputTensors, stream);
EXPECT_EQ(ret, APP_ERR_COMM_INVALID_PARAM);
}
TEST_F(MxOmModelDescTest, Test_Infer_With_Vec_Should_Return_Fail_When_CreatOutputTensors_Fail)
{
std::vector<Tensor> inputTensor;
MxOmModelDesc mockModelDesc;
MOCKER_CPP(&MxOmModelDesc::CheckInputTensors).times(1).will(returnValue(0));
APP_ERROR retValue = APP_ERR_COMM_INVALID_PARAM;
MOCKER_CPP(&MxOmModelDesc::CreatOutputTensors).times(1).will(returnValue(retValue));
std::vector<Tensor> ret = mockModelDesc.Infer(inputTensor);
EXPECT_EQ(ret.size(), 0);
}
TEST_F(MxOmModelDescTest, Test_Infer_With_Vec_Should_Return_Fail_When_Infer_Fail)
{
std::vector<Tensor> inputTensor;
MxOmModelDesc mockModelDesc;
MOCKER_CPP(&MxOmModelDesc::CheckInputTensors).times(1).will(returnValue(0));
MOCKER_CPP(&MxOmModelDesc::CreatOutputTensors).times(1).will(returnValue(0));
APP_ERROR retValue = APP_ERR_COMM_INVALID_PARAM;
MOCKER_CPP_VIRTUAL(mockModelDesc,
&MxOmModelDesc::Infer,
APP_ERROR(MxOmModelDesc::*)(std::vector<Tensor> &, std::vector<Tensor> &, AscendStream & stream))
.times(1)
.will(returnValue(retValue));
std::vector<Tensor> ret = mockModelDesc.Infer(inputTensor);
EXPECT_EQ(ret.size(), 0);
}
TEST_F(MxOmModelDescTest, Test_Infer_With_Vec_Should_Return_Fail_When_DynamicOutputsCrop_Fail)
{
std::vector<Tensor> inputTensor;
MxOmModelDesc mockModelDesc;
mockModelDesc.dynamicInfo_.dynamicType = VisionDynamicType::DYNAMIC_BATCH;
VisionTensorDesc desc = VisionTensorDesc();
mockModelDesc.curOutputTensorDesc_ = {desc};
MOCKER_CPP(&MxOmModelDesc::CheckInputTensors).times(1).will(returnValue(0));
MOCKER_CPP(&MxOmModelDesc::CreatOutputTensors).times(1).will(returnValue(0));
MOCKER_CPP_VIRTUAL(mockModelDesc,
&MxOmModelDesc::Infer,
APP_ERROR(MxOmModelDesc::*)(std::vector<Tensor> &, std::vector<Tensor> &, AscendStream & stream))
.times(1)
.will(returnValue(0));
MOCKER_CPP(&MxOmModelDesc::DynamicOutputsCrop).times(1).will(returnValue(1));
std::vector<Tensor> ret = mockModelDesc.Infer(inputTensor);
EXPECT_EQ(ret.size(), 0);
}
TEST_F(MxOmModelDescTest, Test_GetDynamicGearInfo_Should_Return_Vec_When_DYNAMIC_BATCH)
{
MxOmModelDesc mockModelDesc;
mockModelDesc.dynamicInfo_.dynamicType = VisionDynamicType::DYNAMIC_BATCH;
mockModelDesc.dynamicInfo_.dynamicBatch = {1, 1};
std::vector<std::vector<uint64_t>> ret = mockModelDesc.GetDynamicGearInfo();
EXPECT_NE(ret.size(), 0);
}
TEST_F(MxOmModelDescTest, Test_GetDynamicGearInfo_Should_Return_Vec_When_DYNAMIC_HW)
{
MxOmModelDesc mockModelDesc;
mockModelDesc.dynamicInfo_.dynamicType = VisionDynamicType::DYNAMIC_HW;
mockModelDesc.dynamicInfo_.dynamicSize = {{1, 1}, {1, 1}};
std::vector<std::vector<uint64_t>> ret = mockModelDesc.GetDynamicGearInfo();
EXPECT_NE(ret.size(), 0);
}
TEST_F(MxOmModelDescTest, Test_GetDynamicGearInfo_Should_Return_Vec_When_DYNAMIC_DIMS)
{
MxOmModelDesc mockModelDesc;
mockModelDesc.dynamicInfo_.dynamicType = VisionDynamicType::DYNAMIC_DIMS;
mockModelDesc.dynamicInfo_.dynamicDims = {{1, 1}, {1, 1}};
std::vector<std::vector<uint64_t>> ret = mockModelDesc.GetDynamicGearInfo();
EXPECT_NE(ret.size(), 0);
}
static aclError MockAclmdlGetNumOutputs(const aclmdlDesc *modelDesc, size_t index, aclmdlIODims *dims)
{
dims->dimCount = 1;
dims->dims[0] = 1;
return APP_ERR_OK;
}
TEST_F(MxOmModelDescTest, Test_GetModelCurOutputDesc_Should_Return_Success_When_Valid_Input)
{
MOCKER_CPP(&aclmdlGetNumOutputs).times(1).will(returnValue(1));
MOCKER_CPP(&aclmdlGetCurOutputDims).times(1).will(invoke(MockAclmdlGetNumOutputs));
MxOmModelDesc mockModelDesc;
VisionTensorDesc outputTensorDesc = VisionTensorDesc();
mockModelDesc.outputTensorDesc_ = {outputTensorDesc};
APP_ERROR ret = mockModelDesc.GetModelCurOutputDesc();
EXPECT_EQ(ret, APP_ERR_OK);
}
static aclError MockAclmdlGetDynamicBatch(const aclmdlDesc *modelDesc, aclmdlBatch *batch)
{
batch->batchCount = 1;
batch->batch[0] = 1;
return APP_ERR_OK;
}
TEST_F(MxOmModelDescTest, Test_GetDynamicBatch_Should_Return_Success_When_Valid_Input)
{
MOCKER_CPP(&aclmdlGetDynamicBatch).times(1).will(invoke(MockAclmdlGetDynamicBatch));
MxOmModelDesc mockModelDesc;
APP_ERROR ret = mockModelDesc.GetDynamicBatch();
EXPECT_EQ(ret, APP_ERR_OK);
}
static aclError MockAclmdlGetDynamicHW(const aclmdlDesc *modelDesc, size_t index, aclmdlHW *hw)
{
hw->hwCount = 1;
hw->hw[0][0x1] = 1;
hw->hw[0][0x0] = 1;
return APP_ERR_OK;
}
TEST_F(MxOmModelDescTest, Test_GetDynamicSize_Should_Return_Success_When_Valid_Input)
{
MOCKER_CPP(&aclmdlGetDynamicHW).times(1).will(invoke(MockAclmdlGetDynamicHW));
MxOmModelDesc mockModelDesc;
APP_ERROR ret = mockModelDesc.GetDynamicSize();
EXPECT_EQ(ret, APP_ERR_OK);
}
static aclError MockAclmdlGetInputDynamicGearCount(const aclmdlDesc *modelDesc, size_t index, size_t *gearCount)
{
*gearCount = 1;
return APP_ERR_OK;
}
static aclError MockAclmdlGetInputDynamicDims(
const aclmdlDesc *modelDesc, size_t index, aclmdlIODims *dims, size_t gearCount)
{
dims[0].dimCount = 1;
return APP_ERR_OK;
}
TEST_F(MxOmModelDescTest, Test_GetDynamicDims_Should_Return_Success_When_Valid_Input)
{
MOCKER_CPP(&aclmdlGetInputDynamicGearCount).times(1).will(invoke(MockAclmdlGetInputDynamicGearCount));
MOCKER_CPP(&aclmdlGetInputDynamicDims).times(1).will(invoke(MockAclmdlGetInputDynamicDims));
MxOmModelDesc mockModelDesc;
mockModelDesc.dynamicInfo_.dynamicType = VisionDynamicType::STATIC_BATCH;
APP_ERROR ret = mockModelDesc.GetDynamicDims();
EXPECT_EQ(ret, APP_ERR_OK);
}
TEST_F(MxOmModelDescTest, Test_GetDynamicDims_Should_Return_Fail_When_aclmdlGetInputDynamicDims_Fail)
{
MOCKER_CPP(&aclmdlGetInputDynamicGearCount).times(1).will(invoke(MockAclmdlGetInputDynamicGearCount));
MOCKER_CPP(&aclmdlGetInputDynamicDims).times(1).will(returnValue(1));
MxOmModelDesc mockModelDesc;
mockModelDesc.dynamicInfo_.dynamicType = VisionDynamicType::STATIC_BATCH;
APP_ERROR ret = mockModelDesc.GetDynamicDims();
EXPECT_EQ(ret, APP_ERR_ACL_FAILURE);
}
static aclError MockAclmdlGetInputDimsV2(const aclmdlDesc *modelDesc, size_t index, aclmdlIODims *dims)
{
dims->dimCount = 0;
return APP_ERR_OK;
}
static aclError MockAclmdlGetInputDims(const aclmdlDesc *modelDesc, size_t index, aclmdlIODims *dims)
{
dims->dimCount = 0;
return APP_ERR_OK;
}
TEST_F(MxOmModelDescTest, Test_GetModelInputDesc_Should_Return_Fail_When_Valid_Input)
{
MOCKER_CPP(&aclmdlGetNumInputs).times(1).will(returnValue(1));
MOCKER_CPP(&aclmdlGetInputDimsV2).times(1).will(invoke(MockAclmdlGetInputDimsV2));
MOCKER_CPP(&aclmdlGetInputDims).times(1).will(invoke(MockAclmdlGetInputDims));
MxOmModelDesc mockModelDesc;
mockModelDesc.dynamicInfo_.dynamicType = VisionDynamicType::STATIC_BATCH;
APP_ERROR ret = mockModelDesc.GetModelInputDesc();
EXPECT_EQ(ret, APP_ERR_ACL_API_NOT_SUPPORT);
}
TEST_F(MxOmModelDescTest, Test_DynamicOutputsCrop_Should_Return_Fail_When_aclrtMemcpy_Fail)
{
MOCKER_CPP(&aclrtMemcpy).times(1).will(returnValue(1));
MxOmModelDesc mockModelDesc;
std::vector<int64_t> modelOutShape = {1, 1, 1, 1};
MxBase::TensorDType tensorDType = TensorDType::FLOAT32;
MxBase::Tensor output;
std::vector<MxBase::Tensor> outputs;
APP_ERROR ret = mockModelDesc.DynamicOutputsCrop(modelOutShape, tensorDType, output, outputs);
EXPECT_EQ(ret, APP_ERR_ACL_BAD_COPY);
}
TEST_F(MxOmModelDescTest, Test_CheckInputShape_Should_Return_Fail_When_aclrtMemcpy_Fail)
{
MxOmModelDesc mockModelDesc;
VisionTensorDesc desc = VisionTensorDesc();
desc.tensorShape = {0};
mockModelDesc.inputTensorDesc_ = {desc};
std::vector<std::vector<uint32_t>> inputTensorShape = {{1}};
AscendStream stream;
APP_ERROR ret = mockModelDesc.CheckInputShape(inputTensorShape, stream);
EXPECT_EQ(ret, APP_ERR_COMM_INVALID_PARAM);
}
TEST_F(MxOmModelDescTest, Test_SetInputTensor_Should_Return_Fail_When_Tensor_Empty)
{
MxOmModelDesc mockModelDesc;
MxBase::Tensor input;
std::vector<Tensor> inputTensors = {input};
std::vector<std::vector<uint32_t>> inputTensorShape = {{1}};
AscendStream stream;
APP_ERROR ret = mockModelDesc.SetInputTensor(inputTensors, inputTensorShape, stream);
EXPECT_EQ(ret, APP_ERR_COMM_INVALID_POINTER);
}
TEST_F(MxOmModelDescTest, Test_SetInputTensor_Should_Return_Fail_When_dataSize_Invalid)
{
MxOmModelDesc mockModelDesc;
VisionTensorBase tenorBase = {static_cast<void *>(&mockModelDesc), 1, 1};
mockModelDesc.inputTensor_ = {tenorBase};
MxBase::Tensor input({1, 2}, TensorDType::INT32);
input.Malloc();
std::vector<Tensor> inputTensors = {input};
std::vector<std::vector<uint32_t>> inputTensorShape = {{1}};
AscendStream stream;
APP_ERROR ret = mockModelDesc.SetInputTensor(inputTensors, inputTensorShape, stream);
EXPECT_EQ(ret, APP_ERR_COMM_INVALID_PARAM);
}
TEST_F(MxOmModelDescTest, Test_SetInputTensor_Should_Return_Fail_When_aclrtMemcpy_Invalid)
{
MOCKER_CPP(&aclrtMemcpy).times(1).will(returnValue(1));
MxOmModelDesc mockModelDesc;
const size_t maxSize = 10;
VisionTensorBase tenorBase = {static_cast<void *>(&mockModelDesc), 1, maxSize};
mockModelDesc.inputTensor_ = {tenorBase};
MxBase::Tensor input({1}, TensorDType::INT32);
input.Malloc();
std::vector<Tensor> inputTensors = {input};
std::vector<std::vector<uint32_t>> inputTensorShape = {{1}};
AscendStream stream;
APP_ERROR ret = mockModelDesc.SetInputTensor(inputTensors, inputTensorShape, stream);
EXPECT_EQ(ret, APP_ERR_ACL_BAD_COPY);
}
static void MockDestroyDataset(MxOmModelDesc *obj, aclmdlDataset *dataset)
{}
TEST_F(MxOmModelDescTest, Test_ModelInference_Should_Return_Fail_When_ModelSetDynamicInfo_Fail)
{
aclmdlDataset *retVal = (aclmdlDataset *)1;
MOCKER_CPP(
&MxOmModelDesc::CreateAndFillDataset, aclmdlDataset * (MxOmModelDesc::*)(std::vector<VisionTensorBase> &))
.times(1)
.will(returnValue(retVal));
MOCKER_CPP(&MxOmModelDesc::ModelSetDynamicInfo).times(1).will(returnValue(1));
MOCKER_CPP(&MxOmModelDesc::DestroyDataset).times(1).will(invoke(MockDestroyDataset));
MxOmModelDesc mockModelDesc;
std::vector<Tensor> outputTensors;
std::vector<std::vector<uint32_t>> inputShape;
AscendStream stream;
APP_ERROR ret = mockModelDesc.ModelInference(outputTensors, inputShape, stream);
EXPECT_EQ(ret, 1);
}
TEST_F(MxOmModelDescTest, Test_ModelInference_Should_Return_Fail_When_CreateAndFillDataset_Fail)
{
aclmdlDataset *retVal1 = (aclmdlDataset *)1;
aclmdlDataset *retVal2 = nullptr;
MOCKER_CPP(
&MxOmModelDesc::CreateAndFillDataset, aclmdlDataset * (MxOmModelDesc::*)(std::vector<VisionTensorBase> &))
.times(1)
.will(returnValue(retVal1));
MOCKER_CPP(&MxOmModelDesc::CreateAndFillDataset, aclmdlDataset * (MxOmModelDesc::*)(std::vector<Tensor> &))
.times(1)
.will(returnValue(retVal2));
MOCKER_CPP(&MxOmModelDesc::ModelSetDynamicInfo).times(1).will(returnValue(0));
MOCKER_CPP(&MxOmModelDesc::DestroyDataset).times(1).will(invoke(MockDestroyDataset));
MxOmModelDesc mockModelDesc;
std::vector<Tensor> outputTensors;
std::vector<std::vector<uint32_t>> inputShape;
AscendStream stream;
APP_ERROR ret = mockModelDesc.ModelInference(outputTensors, inputShape, stream);
EXPECT_EQ(ret, APP_ERR_COMM_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_ModelInference_Should_Return_Fail_When_aclmdlExecuteAsync_Fail)
{
aclmdlDataset *retVal = (aclmdlDataset *)1;
MOCKER_CPP(
&MxOmModelDesc::CreateAndFillDataset, aclmdlDataset * (MxOmModelDesc::*)(std::vector<VisionTensorBase> &))
.times(1)
.will(returnValue(retVal));
MOCKER_CPP(&MxOmModelDesc::CreateAndFillDataset, aclmdlDataset * (MxOmModelDesc::*)(std::vector<Tensor> &))
.times(1)
.will(returnValue(retVal));
MOCKER_CPP(&MxOmModelDesc::ModelSetDynamicInfo).times(1).will(returnValue(0));
MOCKER_CPP(&aclmdlExecuteAsync).times(1).will(returnValue(1));
MOCKER_CPP(&MxOmModelDesc::SyncAndFree).times(1).will(returnValue(0));
MxOmModelDesc mockModelDesc;
std::vector<Tensor> outputTensors;
std::vector<std::vector<uint32_t>> inputShape;
AscendStream stream;
APP_ERROR ret = mockModelDesc.ModelInference(outputTensors, inputShape, stream);
EXPECT_EQ(ret, APP_ERR_ACL_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_ModelInference_Should_Return_Fail_When_GetOutputShapeInDynamicShapeMode_Fail)
{
aclmdlDataset *retVal = (aclmdlDataset *)1;
MOCKER_CPP(
&MxOmModelDesc::CreateAndFillDataset, aclmdlDataset * (MxOmModelDesc::*)(std::vector<VisionTensorBase> &))
.times(1)
.will(returnValue(retVal));
MOCKER_CPP(&MxOmModelDesc::CreateAndFillDataset, aclmdlDataset * (MxOmModelDesc::*)(std::vector<Tensor> &))
.times(1)
.will(returnValue(retVal));
MOCKER_CPP(&MxOmModelDesc::ModelSetDynamicInfo).times(1).will(returnValue(0));
MOCKER_CPP(&aclmdlExecuteAsync).times(1).will(returnValue(0));
MOCKER_CPP(&MxOmModelDesc::SyncAndFree).times(1).will(returnValue(0));
MOCKER_CPP(&MxOmModelDesc::GetOutputShapeInDynamicShapeMode).times(1).will(returnValue(1));
MxOmModelDesc mockModelDesc;
mockModelDesc.dynamicInfo_.dynamicType = VisionDynamicType::DYNAMIC_SHAPE;
std::vector<Tensor> outputTensors;
std::vector<std::vector<uint32_t>> inputShape;
AscendStream stream;
APP_ERROR ret = mockModelDesc.ModelInference(outputTensors, inputShape, stream);
EXPECT_EQ(ret, APP_ERR_ACL_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_CreateAndFillDataset_Should_Return_Nullptr_When_aclCreateDataBuffer_Fail)
{
aclmdlDataset *retVal1 = (aclmdlDataset *)1;
MOCKER_CPP(&aclmdlCreateDataset).times(1).will(returnValue(retVal1));
aclDataBuffer *retVal2 = nullptr;
MOCKER_CPP(&aclCreateDataBuffer).times(1).will(returnValue(retVal2));
MOCKER_CPP(&MxOmModelDesc::DestroyDataset).times(1).will(invoke(MockDestroyDataset));
MxOmModelDesc mockModelDesc;
Tensor input;
std::vector<Tensor> tensors = {input};
aclmdlDataset *ret = mockModelDesc.CreateAndFillDataset(tensors);
EXPECT_EQ(ret, nullptr);
}
TEST_F(MxOmModelDescTest, Test_CreateAndFillDataset_Should_Return_Nullptr_When_aclmdlAddDatasetBuffer_Fail)
{
aclmdlDataset *retVal1 = (aclmdlDataset *)1;
MOCKER_CPP(&aclmdlCreateDataset).times(1).will(returnValue(retVal1));
aclDataBuffer *retVal2 = (aclDataBuffer *)1;
MOCKER_CPP(&aclCreateDataBuffer).times(1).will(returnValue(retVal2));
MOCKER_CPP(&aclmdlAddDatasetBuffer).times(1).will(returnValue(1));
MOCKER_CPP(&aclDestroyDataBuffer).times(1).will(returnValue(0));
MOCKER_CPP(&MxOmModelDesc::DestroyDataset).times(1).will(invoke(MockDestroyDataset));
MxOmModelDesc mockModelDesc;
Tensor input;
std::vector<Tensor> tensors = {input};
aclmdlDataset *ret = mockModelDesc.CreateAndFillDataset(tensors);
EXPECT_EQ(ret, nullptr);
}
TEST_F(MxOmModelDescTest, Test_CreateAndFillDataset_Base_Should_Return_Nullptr_When_aclCreateDataBuffer_Fail)
{
aclmdlDataset *retVal1 = (aclmdlDataset *)1;
MOCKER_CPP(&aclmdlCreateDataset).times(1).will(returnValue(retVal1));
aclDataBuffer *retVal2 = nullptr;
MOCKER_CPP(&aclCreateDataBuffer).times(1).will(returnValue(retVal2));
MOCKER_CPP(&MxOmModelDesc::DestroyDataset).times(1).will(invoke(MockDestroyDataset));
MxOmModelDesc mockModelDesc;
VisionTensorBase input;
std::vector<VisionTensorBase> tensors = {input};
aclmdlDataset *ret = mockModelDesc.CreateAndFillDataset(tensors);
EXPECT_EQ(ret, nullptr);
}
TEST_F(MxOmModelDescTest, Test_CreateAndFillDataset_Base_Should_Return_Nullptr_When_aclmdlAddDatasetBuffer_Fail)
{
aclmdlDataset *retVal1 = (aclmdlDataset *)1;
MOCKER_CPP(&aclmdlCreateDataset).times(1).will(returnValue(retVal1));
aclDataBuffer *retVal2 = (aclDataBuffer *)1;
MOCKER_CPP(&aclCreateDataBuffer).times(1).will(returnValue(retVal2));
MOCKER_CPP(&aclmdlAddDatasetBuffer).times(1).will(returnValue(1));
MOCKER_CPP(&aclDestroyDataBuffer).times(1).will(returnValue(0));
MOCKER_CPP(&MxOmModelDesc::DestroyDataset).times(1).will(invoke(MockDestroyDataset));
MxOmModelDesc mockModelDesc;
VisionTensorBase input;
std::vector<VisionTensorBase> tensors = {input};
aclmdlDataset *ret = mockModelDesc.CreateAndFillDataset(tensors);
EXPECT_EQ(ret, nullptr);
}
TEST_F(MxOmModelDescTest, Test_GetOutputShapeInDynamicShapeMode_Should_Return_Success_When_Valid_Input)
{
aclTensorDesc *retVal = (aclTensorDesc *)1;
MOCKER_CPP(&aclmdlGetDatasetTensorDesc).times(1).will(returnValue(retVal));
MOCKER_CPP(&aclGetTensorDescNumDims).times(1).will(returnValue(1));
MOCKER_CPP(&aclGetTensorDescDimV2).times(1).will(returnValue(0));
MxOmModelDesc mockModelDesc;
VisionTensorDesc desc;
mockModelDesc.outputTensorDesc_ = {desc};
AscendStream stream;
APP_ERROR ret = mockModelDesc.GetOutputShapeInDynamicShapeMode(nullptr, stream);
EXPECT_EQ(ret, APP_ERR_OK);
}
TEST_F(MxOmModelDescTest, Test_ModelSetDynamicInfo_Should_Return_Success_When_DYNAMIC_HW)
{
MOCKER_CPP(&MxOmModelDesc::SetDynamicSize).times(1).will(returnValue(1));
MxOmModelDesc mockModelDesc;
mockModelDesc.dynamicInfo_.dynamicType = VisionDynamicType::DYNAMIC_HW;
std::vector<std::vector<uint32_t>> modelShape = {};
AscendStream stream;
APP_ERROR ret = mockModelDesc.ModelSetDynamicInfo(nullptr, modelShape, stream);
EXPECT_EQ(ret, 1);
}
TEST_F(MxOmModelDescTest, Test_ModelSetDynamicInfo_Should_Return_Success_When_DYNAMIC_SHAPE)
{
MOCKER_CPP(&MxOmModelDesc::SetDynamicShape).times(1).will(returnValue(1));
MxOmModelDesc mockModelDesc;
mockModelDesc.dynamicInfo_.dynamicType = VisionDynamicType::DYNAMIC_SHAPE;
std::vector<std::vector<uint32_t>> modelShape = {};
AscendStream stream;
APP_ERROR ret = mockModelDesc.ModelSetDynamicInfo(nullptr, modelShape, stream);
EXPECT_EQ(ret, 1);
}
TEST_F(MxOmModelDescTest, Test_SetDynamicShape_Should_Return_Fail_When_aclmdlSetDatasetTensorDesc_Fail)
{
MOCKER_CPP(&aclmdlGetInputFormat).times(1).will(returnValue(0));
aclTensorDesc *retPtr = nullptr;
MOCKER_CPP(&aclCreateTensorDesc).times(1).will(returnValue(retPtr));
MOCKER_CPP(&aclmdlSetDatasetTensorDesc).times(1).will(returnValue(1));
MOCKER_CPP(&aclDestroyTensorDesc).times(1).will(returnValue(0));
MxOmModelDesc mockModelDesc;
VisionTensorDesc desc;
mockModelDesc.inputTensorDesc_ = {desc};
mockModelDesc.dynamicInfo_.dynamicType = VisionDynamicType::DYNAMIC_SHAPE;
std::vector<std::vector<uint32_t>> modelShape = {{1}};
AscendStream stream;
APP_ERROR ret = mockModelDesc.SetDynamicShape(nullptr, modelShape, stream);
EXPECT_EQ(ret, APP_ERR_ACL_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_LoadModel_Should_Return_Fail_When_aclmdlSetConfigOpt_Fail)
{
aclmdlConfigHandle *retPtr = (aclmdlConfigHandle *)1;
MOCKER_CPP(&aclmdlCreateConfigHandle).times(1).will(returnValue(retPtr));
MOCKER_CPP(&aclmdlSetConfigOpt).times(1).will(returnValue(1));
MOCKER_CPP(&aclmdlDestroyConfigHandle).times(1).will(returnValue(1));
MxOmModelDesc mockModelDesc;
ModelLoadOptV2 mdlLoadOpt;
APP_ERROR ret = mockModelDesc.LoadModel(mdlLoadOpt);
EXPECT_EQ(ret, APP_ERR_ACL_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_LoadModel_Should_Return_Fail_When_SetModelLoadOpt_Fail)
{
aclmdlConfigHandle *retPtr = (aclmdlConfigHandle *)1;
MOCKER_CPP(&aclmdlCreateConfigHandle).times(1).will(returnValue(retPtr));
MOCKER_CPP(&aclmdlSetConfigOpt).times(1).will(returnValue(0));
MOCKER_CPP(&MxOmModelDesc::SetModelLoadOpt).times(1).will(returnValue(1));
MOCKER_CPP(&aclmdlDestroyConfigHandle).times(1).will(returnValue(1));
MxOmModelDesc mockModelDesc;
ModelLoadOptV2 mdlLoadOpt;
APP_ERROR ret = mockModelDesc.LoadModel(mdlLoadOpt);
EXPECT_EQ(ret, APP_ERR_COMM_FAILURE);
}
TEST_F(MxOmModelDescTest, Test_LoadModel_Should_Return_Fail_When_aclmdlLoadWithConfig_Fail)
{
aclmdlConfigHandle *retPtr = (aclmdlConfigHandle *)1;
MOCKER_CPP(&aclmdlCreateConfigHandle).times(1).will(returnValue(retPtr));
MOCKER_CPP(&aclmdlSetConfigOpt).times(1).will(returnValue(0));
MOCKER_CPP(&MxOmModelDesc::SetModelLoadOpt).times(1).will(returnValue(0));
MOCKER_CPP(&aclmdlLoadWithConfig).times(1).will(returnValue(1));
MOCKER_CPP(&aclmdlDestroyConfigHandle).times(1).will(returnValue(1));
MxOmModelDesc mockModelDesc;
ModelLoadOptV2 mdlLoadOpt;
APP_ERROR ret = mockModelDesc.LoadModel(mdlLoadOpt);
EXPECT_EQ(ret, APP_ERR_ACL_FAILURE);
}
}
int main(int argc, char *argv[])
{
MxInit();
testing::InitGoogleTest(&argc, argv);
int ret = RUN_ALL_TESTS();
MxDeInit();
return ret;
}