/**
 * Copyright (c) 2025 Huawei Technologies Co., Ltd.
 * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
 * CANN Open Software License Agreement Version 2.0 (the "License").
 * Please refer to the License for details. You may not use this file except in compliance with the License.
 * 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 FITNESS FOR A PARTICULAR PURPOSE.
 * See LICENSE in the root of the software repository for the full text of the License.
 */
#include <string>
#include <cassert>
#include <iostream>
#include <cstdint>
#include "mmpa/mmpa_api.h"

#include "acl/acl.h"
#include "acl/error_codes/rt_error_codes.h"
#include "common/log_inner.h"
#include "acl/acl_rt.h"
#include "acl/acl_rt_api.h"
#include "acl_rt_impl_base.h"
#define private public
#include "common/resource_statistics.h"
#undef private

#include "set_device_vxx.h"
#include "runtime/dev.h"
#include "runtime/stream.h"
#include "runtime/context.h"
#include "runtime/event.h"
#include "runtime/mem.h"
#include "runtime/rts/rts_mem.h"
#include "runtime/kernel.h"
#include "runtime/base.h"
#include "runtime/config.h"
#include "acl/acl_rt_allocator.h"
#include "acl/acl_rt_memory_soma.h"
#include "acl_stub.h"
#define private public
#include "aclrt_impl/init_callback_manager.h"
#undef private

#include <gtest/gtest.h>
#include <gmock/gmock.h>

using namespace testing;
using namespace std;
using namespace acl;

namespace {
uint64_t GetResourceCounterValue(ResourceType resourceType, ApplyReleaseType applyReleaseType)
{
    return ResourceStatistics::GetInstance().counter_[resourceType].appplyReleaseValue[applyReleaseType].load();
}
}

namespace acl {
extern void resetAclJsonHash();
}

class UTEST_ACL_Runtime : public testing::Test
{
protected:
    void SetUp() override
    {
        MockFunctionTest::aclStubInstance().ResetToDefaultMock();
        ON_CALL(MockFunctionTest::aclStubInstance(), GetPlatformResWithLock(_, _))
            .WillByDefault(Return(true));
        resetAclJsonHash();
    }
    void TearDown() override
    {
        Mock::VerifyAndClear((void *)(&MockFunctionTest::aclStubInstance()));
    }
};

extern aclError MemcpyKindTranslate(aclrtMemcpyKind kind, rtMemcpyKind_t &rtKind);

rtError_t rtEventQueryWaitStatus_Invoke(rtEvent_t event, rtEventWaitStatus *status)
{
    (void) event;
    *status = EVENT_STATUS_COMPLETE;
    return RT_ERROR_NONE;
}

rtError_t rtEventQueryWaitStatus_Invoke2(rtEvent_t event, rtEventWaitStatus *status)
{
    (void) event;
    *status = EVENT_STATUS_NOT_READY;
    return RT_ERROR_NONE;
}

rtError_t rtEventQueryStatus_Invoke(rtEvent_t event, rtEventStatus *status)
{
    (void) event;
    *status = RT_EVENT_INIT;
    return RT_ERROR_NONE;
}

rtError_t rtEventQueryStatus_Invoke2(rtEvent_t event, rtEventStatus *status)
{
    (void) event;
    *status = RT_EVENT_RECORDED;
    return RT_ERROR_NONE;
}

rtError_t rtMalloc1g(void **devPtr, uint64_t size, rtMemType_t type, uint16_t moduleId) {
    (void) devPtr;
    (void) moduleId;
    std::cout << "call rtMalloc1g" << std::endl;
    if (size != 1024UL * 1024UL * 1024UL) {
        return -1;
    }
    if (type == 0x10000U || type == 0x20000U) {
        return 0;
    }

    return -1;
}

rtError_t rtMallocPhysical1g(rtDrvMemHandle *handle, size_t size, rtDrvMemProp_t *prop, uint64_t flags) {
    (void) handle;
    (void) flags;
    std::cout << "call rtMallocPhysical1g" << std::endl;
    if (size != 1024UL * 1024UL * 1024UL) {
        return -1;
    }
    if (prop->pg_type == 2) {
        return 0;
    }
    return -1;
}

aclError InitCallback_Success(const char *configStr, size_t len, void *userData) {
    (void)configStr;
    (void)len;
    (void)userData;
    return ACL_SUCCESS;
}

aclError InitCallback_Fail(const char *configStr, size_t len, void *userData) {
    (void)configStr;
    (void)len;
    (void)userData;
    return ACL_ERROR_FAILURE;
}

aclError FinalizeCallback_Success(void *userData) {
    (void)userData;
    return ACL_SUCCESS;
}

aclError FinalizeCallback_Fail(void *userData) {
    (void)userData;
    return ACL_ERROR_FAILURE;
}

namespace {
std::vector<int> g_callbackOrder;

class CallbackMapGuard {
public:
    explicit CallbackMapGuard(InitCallbackManager &cbMgr)
        : cbMgr_(cbMgr), initCallbackMap_(cbMgr.initCallbackMap_), finalizeCallbackMap_(cbMgr.finalizeCallbackMap_)
    {
        cbMgr_.initCallbackMap_.clear();
        cbMgr_.finalizeCallbackMap_.clear();
        g_callbackOrder.clear();
    }

    ~CallbackMapGuard()
    {
        cbMgr_.initCallbackMap_ = initCallbackMap_;
        cbMgr_.finalizeCallbackMap_ = finalizeCallbackMap_;
        g_callbackOrder.clear();
    }

private:
    InitCallbackManager &cbMgr_;
    std::multimap<aclRegisterCallbackType, std::pair<aclInitCallbackFunc, void *>> initCallbackMap_;
    std::multimap<aclRegisterCallbackType, std::pair<aclFinalizeCallbackFunc, void *>> finalizeCallbackMap_;
};
}

aclError InitCallback_RecordOrder(const char *configStr, size_t len, void *userData) {
    (void)configStr;
    (void)len;
    g_callbackOrder.push_back(static_cast<int>(reinterpret_cast<intptr_t>(userData)));
    return ACL_SUCCESS;
}

aclError FinalizeCallback_RecordOrder(void *userData) {
    g_callbackOrder.push_back(static_cast<int>(reinterpret_cast<intptr_t>(userData)));
    return ACL_SUCCESS;
}

TEST_F(UTEST_ACL_Runtime, aclrtSetDeviceFailedTest)
{
    int32_t deviceId = 1;
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSetDevice(_))
        .WillOnce(Return(ACL_ERROR_RT_INVALID_DEVICEID));
    aclError ret = aclrtSetDevice(deviceId);
    EXPECT_EQ(ret, ACL_ERROR_RT_INVALID_DEVICEID);
}

TEST_F(UTEST_ACL_Runtime, UpdatePlatformInfoTest)
{
    int32_t deviceId = 99;
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), InitRuntimePlatformInfos(_))
        .WillOnce(Return(1))
        .WillRepeatedly(Return(0));
    auto ret = aclrtSetDevice(deviceId);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetAiCoreCount(_))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID))
        .WillRepeatedly(Return(RT_ERROR_NONE));
    ret = aclrtSetDevice(deviceId);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetDeviceInfo(_, _, _, _))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID))
        .WillOnce(Return(RT_ERROR_NONE))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID))
        .WillRepeatedly(Return(RT_ERROR_NONE));
    ret = aclrtSetDevice(deviceId); // get vector num fail
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtSetDevice(deviceId); // get cube core num fail
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), GetRuntimePlatformInfosByDevice(_, _))
        .WillOnce(Return(1))
        .WillRepeatedly(Return(0));
    ret = aclrtSetDevice(deviceId);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), GetPlatformResWithLock(_, _))
        .WillOnce(Return(false))
        .WillRepeatedly(Return(true));
    ret = aclrtSetDevice(deviceId);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), UpdateRuntimePlatformInfosByDevice(_, _))
        .WillOnce(Return(1));
    ret = aclrtSetDevice(deviceId);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), InitRuntimePlatformInfos(_))
        .WillOnce(Return(1));
    aclrtContext ctx;
    ret = aclrtCreateContext(&ctx, 98); // 98:special deviceid
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtSetDeviceSuccessTest)
{
    //ensure ut cover two functions below
    string testStr = "test";
    acl::AclErrorLogManager::ReportInnerError("%s", testStr.c_str());
    acl::AclErrorLogManager::ReportCallError("%s", testStr.c_str());

    int32_t deviceId = 0;
    aclError ret = aclrtSetDevice(deviceId);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtResetDeviceTest)
{
    int32_t deviceId = 0;
    aclError ret = aclrtResetDevice(deviceId);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtDeviceReset(_))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtResetDevice(deviceId);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtResetDeviceForceTest)
{
    int32_t deviceId = 0;
    aclError ret = aclrtResetDeviceForce(deviceId);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtDeviceResetForce(_))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID))
        .WillOnce(Return(ACL_SUCCESS));
    ret = aclrtResetDeviceForce(deviceId);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);

    ret = aclrtSetDevice(deviceId);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtSetDevice(deviceId);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtResetDeviceForce(deviceId);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtDeviceReset(_))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtResetDevice(deviceId);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtSetDeviceWithoutTsdVXXTest)
{
    int32_t deviceId = 0;
    aclError ret = aclrtSetDeviceWithoutTsdVXX(deviceId);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSetDeviceWithoutTsd(_))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtSetDeviceWithoutTsdVXX(deviceId);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtResetDeviceWithoutTsdVXXTest)
{
    int32_t deviceId = 0;
    aclError ret = aclrtResetDeviceWithoutTsdVXX(deviceId);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtDeviceResetWithoutTsd(_))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtResetDeviceWithoutTsdVXX(deviceId);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetDeviceTest)
{
    int32_t deviceId = 0;
    aclError ret = aclrtGetDevice(nullptr);
    EXPECT_NE(ret, ACL_SUCCESS);

    ret = aclrtGetDevice(&deviceId);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetDevice(_))
        .WillRepeatedly(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtGetDevice(&deviceId);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetLogicDevIdByUserDevIdTest)
{
    int32_t userDevid = 0;
    int32_t logicDevId;
    aclError ret = aclrtGetLogicDevIdByUserDevId(userDevid, &logicDevId);
    EXPECT_EQ(ret, ACL_SUCCESS);


    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsGetLogicDevIdByUserDevId(_,_))
        .WillRepeatedly(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtGetLogicDevIdByUserDevId(userDevid, &logicDevId);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetUserDevIdByLogicDevIdTest)
{
    int32_t logicDevId = 0;
    int32_t userDevid;
    aclError ret = aclrtGetUserDevIdByLogicDevId(logicDevId, &userDevid);
    EXPECT_EQ(ret, ACL_SUCCESS);


    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsGetUserDevIdByLogicDevId(_,_))
        .WillRepeatedly(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtGetUserDevIdByLogicDevId(logicDevId, &userDevid);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetLogicDevIdByPhyDevIdTest)
{
    int32_t phyDevId = 0;
    int32_t logicDevId;
    aclError ret = aclrtGetLogicDevIdByPhyDevId(phyDevId, &logicDevId);
    EXPECT_EQ(ret, ACL_SUCCESS);


    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsGetLogicDevIdByPhyDevId(_,_))
        .WillRepeatedly(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtGetLogicDevIdByPhyDevId(phyDevId, &logicDevId);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetPhyDevIdByLogicDevIdTest)
{
    int32_t logicDevId = 0;
    int32_t phyDevId;
    aclError ret = aclrtGetPhyDevIdByLogicDevId(logicDevId, &phyDevId);
    EXPECT_EQ(ret, ACL_SUCCESS);


    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsGetPhyDevIdByLogicDevId(_,_))
        .WillRepeatedly(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtGetPhyDevIdByLogicDevId(logicDevId, &phyDevId);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtSynchronizeDeviceTest)
{
    aclError ret =  aclrtSynchronizeDevice();
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtDeviceSynchronize())
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtSynchronizeDevice();
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtSynchronizeDevice_succ)
{
    int32_t timeout = 1;
    aclError ret =  aclrtSynchronizeDeviceWithTimeout(timeout);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtSynchronizeDevice_with_invalid_timeout)
{
    int32_t timeout = -2;
    aclError ret =  aclrtSynchronizeDeviceWithTimeout(timeout);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}


TEST_F(UTEST_ACL_Runtime, aclrtSynchronizeDevice_with_timeout)
{
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtDeviceSynchronizeWithTimeout(_))
        .WillOnce(Return((ACL_ERROR_RT_STREAM_SYNC_TIMEOUT)));
    int32_t timeout = 1;
    aclError ret = aclrtSynchronizeDeviceWithTimeout(timeout);
    EXPECT_EQ(ret, ACL_ERROR_RT_STREAM_SYNC_TIMEOUT);
}

TEST_F(UTEST_ACL_Runtime, aclrtSynchronizeDevice_with_rts_fail)
{
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtDeviceSynchronizeWithTimeout(_))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    int32_t timeout = 1;
    aclError ret = aclrtSynchronizeDeviceWithTimeout(timeout);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetRunModeTest)
{
    aclrtRunMode runMode;
    aclError ret = aclrtGetRunMode(&runMode);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetRunMode(_))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtGetRunMode(&runMode);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtSetTsDeviceTest)
{
    aclrtTsId tsId = ACL_TS_ID_RESERVED;
    aclError ret = aclrtSetTsDevice(tsId);
    EXPECT_NE(ret, ACL_SUCCESS);

    tsId = ACL_TS_ID_AICORE;
    ret = aclrtSetTsDevice(tsId);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSetTSDevice(_))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtSetTsDevice(tsId);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetDeviceCountTest)
{
    uint32_t count = 0;
    aclError ret = aclrtGetDeviceCount(nullptr);
    EXPECT_NE(ret, ACL_SUCCESS);

    ret = aclrtGetDeviceCount(&count);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetDeviceCount(_))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtGetDeviceCount(&count);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtCreateContextTest)
{
    aclrtContext context = (aclrtContext)0x01;
    int32_t deviceId = 0;
    // aclrtCreateContext
    aclError ret = aclrtCreateContext(&context, deviceId);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtCreateContext(nullptr, deviceId);
    EXPECT_NE(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtCtxCreateEx(_, _, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtCreateContext(&context, deviceId);
    EXPECT_NE(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtDestroyContextTest)
{
    // aclrtDestroyContext
    aclrtContext context = (aclrtContext)0x01;
    aclError ret = aclrtDestroyContext(context);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtDestroyContext(nullptr);
    EXPECT_NE(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtCtxDestroyEx(_))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtDestroyContext(context);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtSetCurrentContextTest)
{
    // aclrtSetCurrentContext
    aclrtContext context = (aclrtContext)0x01;
    aclError ret = aclrtSetCurrentContext(context);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtSetCurrentContext(nullptr);
    EXPECT_NE(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtCtxSetCurrent(_))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtSetCurrentContext(context);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetCurrentContextTest)
{
    // aclrtGetCurrentContext
    aclrtContext context = (aclrtContext)0x01;
    aclError ret = aclrtGetCurrentContext(&context);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtGetCurrentContext(nullptr);
    EXPECT_NE(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtCtxGetCurrent(_))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtGetCurrentContext(&context);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtCreateStreamTest)
{
    // test aclrtCreateStream
    aclrtStream stream = (aclrtStream)0x01;
    aclError ret = aclrtCreateStream(&stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtCreateStream(nullptr);
    EXPECT_NE(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtStreamCreate(_, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtCreateStream(&stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtCreateStreamWithConfigTest)
{
    // test aclrtCreateStreamWithConfig
    aclrtStream stream = (aclrtStream)0x01;
    uint32_t priority = 0u;
    uint32_t flag = ACL_STREAM_FAST_LAUNCH;
    aclError ret = aclrtCreateStreamWithConfig(&stream, priority, flag);
    EXPECT_EQ(ret, ACL_SUCCESS);

    flag |= ACL_STREAM_FAST_SYNC;
    ret = aclrtCreateStreamWithConfig(&stream, priority, flag);
    EXPECT_EQ(ret, ACL_SUCCESS);

    flag = ACL_STREAM_PERSISTENT;
    ret = aclrtCreateStreamWithConfig(&stream, priority, flag);
    EXPECT_EQ(ret, ACL_SUCCESS);

    flag = ACL_STREAM_HUGE;
    ret = aclrtCreateStreamWithConfig(&stream, priority, flag);
    EXPECT_EQ(ret, ACL_SUCCESS);

    flag = ACL_STREAM_CPU_SCHEDULE;
    ret = aclrtCreateStreamWithConfig(&stream, priority, flag);
    EXPECT_EQ(ret, ACL_SUCCESS);

    flag = ACL_STREAM_DEVICE_USE_ONLY;
    ret = aclrtCreateStreamWithConfig(&stream, priority, flag);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtCreateStreamWithConfig(nullptr, priority, flag);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    // priority is supported with value(0~7)
    ret = aclrtCreateStreamWithConfig(&stream, 1, flag);
    EXPECT_EQ(ret, ACL_SUCCESS);

    // 8 is out of range, priority will be adjusted to 7
    ret = aclrtCreateStreamWithConfig(&stream, 8, flag);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtDestroyStreamTest)
{
    // test aclrtDestroyStream
    aclrtStream stream = (aclrtStream)0x01;
    aclError ret = aclrtDestroyStream(stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtDestroyStream(nullptr);
    EXPECT_NE(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtStreamDestroy(_))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtDestroyStream(stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtDestroyStreamForceTest)
{
    // test aclrtDestroyStreamForce
    aclrtStream stream = (aclrtStream)0x01;
    aclError ret = aclrtDestroyStreamForce(stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtDestroyStreamForce(nullptr);
    EXPECT_NE(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtStreamDestroyForce(_))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtDestroyStreamForce(stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtSynchronizeStreamTest)
{
    // test aclrtSynchronizeStream
    aclrtStream stream = (aclrtStream)0x01;
    aclError ret = aclrtSynchronizeStream(stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtSynchronizeStream(nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtStreamSynchronize(_))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtSynchronizeStream(stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtStreamSynchronize(_))
        .WillOnce(Return((ACL_ERROR_RT_END_OF_SEQUENCE)));
    ret = aclrtSynchronizeStream(stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_END_OF_SEQUENCE);
}

TEST_F(UTEST_ACL_Runtime, aclrtSynchronizeStreamWithTimeoutTest)
{
    // test aclrtSynchronizeStreamWithTimeout
    aclrtStream stream = (aclrtStream)0x01;
    int32_t timeout = 100;
    aclError ret = aclrtSynchronizeStreamWithTimeout(stream, timeout);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtSynchronizeStreamWithTimeout(nullptr, timeout);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtStreamSynchronizeWithTimeout(_, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtSynchronizeStreamWithTimeout(nullptr, timeout);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtStreamSynchronizeWithTimeout(_, _))
        .WillOnce(Return((ACL_ERROR_RT_STREAM_SYNC_TIMEOUT)));
    ret = aclrtSynchronizeStreamWithTimeout(stream, timeout);
    EXPECT_EQ(ret, ACL_ERROR_RT_STREAM_SYNC_TIMEOUT);

    timeout = -2;
    ret = aclrtSynchronizeStreamWithTimeout(stream, timeout);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);

    timeout = 2; // timeout
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtStreamSynchronizeWithTimeout(_, _))
        .WillOnce(Return((ACL_ERROR_RT_END_OF_SEQUENCE)));
    ret = aclrtSynchronizeStreamWithTimeout(stream, timeout);
    EXPECT_EQ(ret, ACL_ERROR_RT_END_OF_SEQUENCE);
}

TEST_F(UTEST_ACL_Runtime, aclrtStreamQueryTest)
{
    // test aclrtStreamQuery
    aclrtStream stream = (aclrtStream)0x01;
    aclrtStreamStatus status;

    aclError ret = aclrtStreamQuery(stream, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtStreamQuery(_))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtStreamQuery(stream, &status);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtStreamQuery(_))
        .WillOnce(Return((RT_ERROR_NONE)));
    ret = aclrtStreamQuery(stream, &status);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_EQ(status, ACL_STREAM_STATUS_COMPLETE);
    
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtStreamQuery(_))
        .WillOnce(Return((ACL_ERROR_RT_STREAM_NOT_COMPLETE)));
    ret = aclrtStreamQuery(stream, &status);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_EQ(status, ACL_STREAM_STATUS_NOT_READY);
}

TEST_F(UTEST_ACL_Runtime, aclrtStreamGetPriorityTest)
{
    // test aclrtStreamGetPriority
    aclrtStream stream = (aclrtStream)0x01;
    uint32_t priority;

    aclError ret = aclrtStreamGetPriority(nullptr, &priority);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtStreamGetPriority(stream, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtStreamGetPriority(_, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtStreamGetPriority(stream, &priority);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtStreamGetPriority(_, _))
        .WillOnce(DoAll(SetArgPointee<1>(5), Return(RT_ERROR_NONE)));
    ret = aclrtStreamGetPriority(stream, &priority);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_EQ(priority, 5);
}

TEST_F(UTEST_ACL_Runtime, aclrtStreamGetFlagsTest)
{
    // test aclrtStreamGetFlags
    aclrtStream stream = (aclrtStream)0x01;
    uint32_t flags;

    aclError ret = aclrtStreamGetFlags(nullptr, &flags);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtStreamGetFlags(stream, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtStreamGetFlags(_, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtStreamGetFlags(stream, &flags);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtStreamGetFlags(_, _))
        .WillOnce(DoAll(SetArgPointee<1>(RT_STREAM_FAST_LAUNCH), Return(RT_ERROR_NONE)));
    ret = aclrtStreamGetFlags(stream, &flags);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_EQ(flags, ACL_STREAM_FAST_LAUNCH);
}

TEST_F(UTEST_ACL_Runtime, aclrtStreamWaitEventTest)
{
    // test aclrtStreamWaitEvent
    aclrtStream stream = (aclrtStream)0x01;
    aclrtEvent event = (aclrtEvent)0x01;
    aclError ret = aclrtStreamWaitEvent(stream, event);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtStreamWaitEvent(nullptr, event);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtStreamWaitEvent(_, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtStreamWaitEvent(stream, event);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtStreamWaitEventWithTimeoutTest)
{
    aclrtStream stream = (aclrtStream)0x01;
    aclrtEvent event = (aclrtEvent)0x01;
    int32_t timeout = -1;
    
    aclError ret = aclrtStreamWaitEventWithTimeout(stream, event, timeout);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);

    timeout = 1;
    ret = aclrtStreamWaitEventWithTimeout(stream, event, timeout);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtStreamWaitEventWithTimeout(nullptr, event, timeout);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsEventWait(_, _, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtStreamWaitEventWithTimeout(stream, event, timeout);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtStreamWaitEventWithFlagTest)
{
    aclrtStream stream = (aclrtStream)0x01;
    aclrtEvent event = (aclrtEvent)0x01;

    aclError ret = aclrtStreamWaitEventWithFlag(stream, nullptr, 1, ACL_EVENT_WAIT_DEFAULT);
    EXPECT_NE(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsEventWait(_, _, _))
        .WillOnce(Return(RT_ERROR_NONE));
    ret = aclrtStreamWaitEventWithFlag(stream, event, 1, ACL_EVENT_WAIT_DEFAULT);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtStreamWaitEventWithFlag(stream, event, -1, ACL_EVENT_WAIT_DEFAULT);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtStreamWaitEventWithFlag(_, _, _, _))
        .WillOnce(Return(RT_ERROR_NONE));
    ret = aclrtStreamWaitEventWithFlag(stream, event, -1, ACL_EVENT_WAIT_EXTERNAL);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtStreamWaitEventWithFlag(stream, event, -1, ACL_EVENT_WAIT_EXTERNAL + 1U);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtStreamWaitEventWithFlag(stream, event, 1, ACL_EVENT_WAIT_EXTERNAL);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtStreamWaitEventWithFlag(_, _, _, _))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtStreamWaitEventWithFlag(stream, event, -1, ACL_EVENT_WAIT_EXTERNAL);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtIpcGetEventHandleTest)
{
    aclrtIpcEventHandle handle;
    aclrtEvent event = (aclrtEvent)0x01;
    aclError ret = aclrtIpcGetEventHandle(event, &handle);
    EXPECT_EQ(ret, ACL_RT_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtIpcGetEventHandle(_, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtIpcGetEventHandle(event, &handle);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtIpcGetEventHandle(_, _))
        .WillOnce(Return((ACL_ERROR_RT_FEATURE_NOT_SUPPORT)));
    ret = aclrtIpcGetEventHandle(event, &handle);
    EXPECT_EQ(ret, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
}

TEST_F(UTEST_ACL_Runtime, aclrtIpcOpenEventHandleTest)
{
    aclrtIpcEventHandle handle;
    (void)memset_s(handle.reserved, ACL_IPC_EVENT_HANDLE_SIZE, 0, ACL_IPC_EVENT_HANDLE_SIZE);
    aclrtEvent event;
    aclError ret = aclrtIpcOpenEventHandle(handle, &event);
    EXPECT_EQ(ret, ACL_RT_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtIpcOpenEventHandle(_, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtIpcOpenEventHandle(handle, &event);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtIpcOpenEventHandle(_, _))
        .WillOnce(Return((ACL_ERROR_RT_FEATURE_NOT_SUPPORT)));
    ret = aclrtIpcOpenEventHandle(handle, &event);
    EXPECT_EQ(ret, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
}

TEST_F(UTEST_ACL_Runtime, aclrtSetStreamFailureMode_DSTest)
{
  aclError ret = aclrtSetStreamFailureMode(nullptr, ACL_STOP_ON_FAILURE);
  EXPECT_EQ(ret, ACL_SUCCESS);
  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtStreamSetMode(_, _))
  .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
  ret = aclrtSetStreamFailureMode(nullptr, ACL_STOP_ON_FAILURE);
  EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtSetStreamFailureMode_DCTest)
{
  aclError ret = aclrtSetStreamFailureMode(nullptr, ACL_CONTINUE_ON_FAILURE);
  EXPECT_EQ(ret, ACL_SUCCESS);
  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtStreamSetMode(_, _))
  .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
  ret = aclrtSetStreamFailureMode(nullptr, ACL_CONTINUE_ON_FAILURE);
  EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtSetStreamFailureMode_STest)
{
  aclrtStream stream = (aclrtStream)0x01;
  aclError ret = aclrtCreateStream(&stream);
  EXPECT_EQ(ret, ACL_SUCCESS);
  ret = aclrtSetStreamFailureMode(stream, ACL_STOP_ON_FAILURE);
  EXPECT_EQ(ret, ACL_SUCCESS);

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtStreamSetMode(_, _))
  .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
  ret = aclrtSetStreamFailureMode(stream, ACL_STOP_ON_FAILURE);
  EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtSetStreamFailureMode_CTest)
{
  aclrtStream stream = (aclrtStream)0x01;
  aclError ret = aclrtCreateStream(&stream);
  EXPECT_EQ(ret, ACL_SUCCESS);
  ret = aclrtSetStreamFailureMode(stream, ACL_CONTINUE_ON_FAILURE);
  EXPECT_EQ(ret, ACL_SUCCESS);

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtStreamSetMode(_, _))
  .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
  ret = aclrtSetStreamFailureMode(stream, ACL_CONTINUE_ON_FAILURE);
  EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtStreamAbortTest)
{
    aclrtStream stream = (aclrtStream)0x01;
    aclError ret = aclrtStreamAbort(stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtStreamAbort(nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtStreamAbort(_))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtStreamAbort(stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtCreateEventTest)
{
    aclrtEvent event = (aclrtEvent)0x01;
    // aclrtCreateEvent
    aclError ret = aclrtCreateEvent(&event);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtCreateEvent(nullptr);
    EXPECT_NE(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtEventCreate(_))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtCreateEvent(&event);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtDestroyEventTest)
{
    // aclrtDestroyEvent
    aclrtEvent event = (aclrtEvent)0x01;
    aclError ret = aclrtDestroyEvent(event);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtDestroyEvent(nullptr);
    EXPECT_NE(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtEventDestroy(_))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtDestroyEvent(event);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtRecordEventTest)
{
    // aclrtRecordEvent(aclrtEvent event, aclrtStream stream)
    aclrtEvent event = (aclrtEvent)0x01;
    aclrtStream stream = (aclrtStream)0x01;
    aclError ret = aclrtRecordEvent(event, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtRecordEvent(nullptr, stream);
    EXPECT_NE(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtEventRecord(_, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtRecordEvent(event, stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtRecordEventWithFlagTest)
{
    aclrtEvent event = (aclrtEvent)0x01;
    aclrtStream stream = (aclrtStream)0x01;

    aclError ret = aclrtRecordEventWithFlag(nullptr, stream, ACL_EVENT_RECORD_DEFAULT);
    EXPECT_NE(ret, ACL_SUCCESS);

    const uint64_t recordTotalBefore = GetResourceCounterValue(ACL_STATISTICS_RECORD_RESET_EVENT, APPLY_TOTAL);
    const uint64_t recordSuccessBefore = GetResourceCounterValue(ACL_STATISTICS_RECORD_RESET_EVENT, APPLY_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtEventRecord(_, _))
        .WillOnce(Return(RT_ERROR_NONE));
    ret = aclrtRecordEventWithFlag(event, stream, ACL_EVENT_RECORD_DEFAULT);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_EQ(GetResourceCounterValue(ACL_STATISTICS_RECORD_RESET_EVENT, APPLY_TOTAL), recordTotalBefore + 1U);
    EXPECT_EQ(GetResourceCounterValue(ACL_STATISTICS_RECORD_RESET_EVENT, APPLY_SUCCESS), recordSuccessBefore + 1U);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtEventRecordWithFlag(_, _, _))
        .WillOnce(Return(RT_ERROR_NONE));
    ret = aclrtRecordEventWithFlag(event, stream, ACL_EVENT_RECORD_EXTERNAL);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_EQ(GetResourceCounterValue(ACL_STATISTICS_RECORD_RESET_EVENT, APPLY_TOTAL), recordTotalBefore + 1U);
    EXPECT_EQ(GetResourceCounterValue(ACL_STATISTICS_RECORD_RESET_EVENT, APPLY_SUCCESS), recordSuccessBefore + 1U);

    ret = aclrtRecordEventWithFlag(event, stream, ACL_EVENT_RECORD_EXTERNAL + 1U);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtEventRecordWithFlag(_, _, _))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtRecordEventWithFlag(event, stream, ACL_EVENT_RECORD_EXTERNAL);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtResetEventTest)
{
    // aclrtResetEvent
    aclrtEvent event = (aclrtEvent)0x01;
    aclrtStream stream = (aclrtStream)0x01;
    aclError ret = aclrtResetEvent(event, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtResetEvent(nullptr, stream);
    EXPECT_NE(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtEventReset(_, _))
        .WillRepeatedly(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtResetEvent(event, stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtQueryEventWaitStatusTest)
{
    //aclrtQueryEventWaitStatus
    aclrtEvent event = (aclrtEvent)0x01;
    aclrtEventWaitStatus status;
    aclError ret = aclrtQueryEventWaitStatus(nullptr, &status);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtQueryEventWaitStatus(event, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtEventQueryWaitStatus(_,_))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret =  aclrtQueryEventWaitStatus(event, &status);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtEventQueryWaitStatus(_,_))
        .WillOnce(Invoke(rtEventQueryWaitStatus_Invoke));
    ret =  aclrtQueryEventWaitStatus(event, &status);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_EQ(status, ACL_EVENT_WAIT_STATUS_COMPLETE);

   EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtEventQueryWaitStatus(_,_))
        .WillOnce(Invoke(rtEventQueryWaitStatus_Invoke2));
    ret =  aclrtQueryEventWaitStatus(event, &status);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_EQ(status, ACL_EVENT_WAIT_STATUS_NOT_READY);
}

TEST_F(UTEST_ACL_Runtime, aclrtQueryEventStatusTest)
{
    //aclrtQueryEventStatus
    aclrtEvent event = (aclrtEvent)0x01;
    aclrtEventRecordedStatus status;
    aclError ret = aclrtQueryEventStatus(nullptr, &status);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtQueryEventStatus(event, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtEventQueryStatus(_,_))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret =  aclrtQueryEventStatus(event, &status);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtEventQueryStatus(_,_))
        .WillOnce(Invoke(rtEventQueryStatus_Invoke));
    ret =  aclrtQueryEventStatus(event, &status);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_EQ(status, ACL_EVENT_RECORDED_STATUS_NOT_READY);

   EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtEventQueryStatus(_,_))
        .WillOnce(Invoke(rtEventQueryStatus_Invoke2));
    ret =  aclrtQueryEventStatus(event, &status);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_EQ(status, ACL_EVENT_RECORDED_STATUS_COMPLETE);
}

TEST_F(UTEST_ACL_Runtime, aclrtQueryEventTest)
{
    // aclrtQueryEvent
    aclrtEvent event = (aclrtEvent)0x01;
    aclrtEventStatus status;
    aclError ret = aclrtResetEvent(nullptr, &status);
    EXPECT_NE(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtEventReset(_, _))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtResetEvent(event, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);

    ret = aclrtQueryEvent(event, &status);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_EQ(status, ACL_EVENT_STATUS_COMPLETE);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtEventQuery(_))
        .WillOnce(Return((ACL_ERROR_RT_EVENT_NOT_COMPLETE)));
    ret =  aclrtQueryEvent(event, &status);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_EQ(status, ACL_EVENT_STATUS_NOT_READY);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtEventQuery(_))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtQueryEvent(event, &status);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtSynchronizeEventTest)
{
    // aclrtSynchronizeEvent
    aclrtEvent event = (aclrtEvent)0x01;
    aclError ret = aclrtSynchronizeEvent(event);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtSynchronizeEvent(nullptr);
    EXPECT_NE(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtEventSynchronize(_))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtSynchronizeEvent(event);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtSynchronizeEventWithTimeoutTest)
{
    // aclrtSynchronizeEventWithTimeout
    aclrtEvent event = (aclrtEvent)0x01;
    int32_t timeout = 100;
    aclError ret = aclrtSynchronizeEventWithTimeout(event, timeout);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtSynchronizeEventWithTimeout(nullptr, timeout);
    EXPECT_NE(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtEventSynchronizeWithTimeout(_,_))
            .WillOnce(Return((ACL_ERROR_RT_EVENT_SYNC_TIMEOUT)));
    ret = aclrtSynchronizeEventWithTimeout(event, timeout);
    EXPECT_EQ(ret, ACL_ERROR_RT_EVENT_SYNC_TIMEOUT);

    timeout = -2;
    ret = aclrtSynchronizeEventWithTimeout(event, timeout);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtCreateEventWithFlagTest)
{
    uint32_t flag = 0x00000008u;
    aclError ret;
    aclrtEvent event = (aclrtEvent)0x01;

    ret = aclrtCreateEventWithFlag(nullptr, flag);
    EXPECT_NE(ret, ACL_SUCCESS);

    ret = aclrtCreateEventWithFlag(&event, flag);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtEventCreateWithFlag(_, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtCreateEventWithFlag(&event, flag);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtCreateEventExWithFlagTest)
{
    uint32_t flag = 0x00000008u;
    aclError ret;
    aclrtEvent event = (aclrtEvent)0x01;

    ret = aclrtCreateEventExWithFlag(nullptr, flag);
    EXPECT_NE(ret, ACL_SUCCESS);

    ret = aclrtCreateEventExWithFlag(&event, flag);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtEventCreateExWithFlag(_, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtCreateEventExWithFlag(&event, flag);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtEventCreateExWithFlag(_, _))
        .WillOnce(Return((ACL_ERROR_RT_FEATURE_NOT_SUPPORT)));
    ret = aclrtCreateEventExWithFlag(&event, flag);
    EXPECT_EQ(ret, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
}

TEST_F(UTEST_ACL_Runtime, aclrtEventElapsedTimeTest)
{
    // aclrtEventElapsedTime
    float time = 0.0f;
    aclError ret;
    aclrtEvent start = (aclrtEvent)0x01;
    aclrtEvent end = (aclrtEvent)0x01;

    ret = aclrtEventElapsedTime(nullptr, start, end);
    EXPECT_NE(ret, ACL_SUCCESS);
    ret = aclrtEventElapsedTime(&time, nullptr, end);
    EXPECT_NE(ret, ACL_SUCCESS);
    ret = aclrtEventElapsedTime(&time, start, nullptr);
    EXPECT_NE(ret, ACL_SUCCESS);

    ret = aclrtEventElapsedTime(&time, start, end);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtEventElapsedTime(_, _, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtEventElapsedTime(&time, start, end);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtEventGetTimestamp)
{
    uint64_t ts = 0;
    aclrtEvent event = aclrtEvent(&ts);
    EXPECT_EQ(aclrtEventGetTimestamp(event, nullptr), ACL_ERROR_INVALID_PARAM);
    EXPECT_EQ(aclrtEventGetTimestamp(nullptr, &ts), ACL_ERROR_INVALID_PARAM);
    EXPECT_EQ(aclrtEventGetTimestamp(event, &ts), ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtSetOpWaitTimeout)
{
    uint32_t timeout = 3;
    aclError ret = aclrtSetOpWaitTimeout(timeout);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSetOpWaitTimeOut(_))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtSetOpWaitTimeout(timeout);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

void CallBackFuncStub(void *arg)
{
    (void) arg;
    int a = 1;
    a++;
}

TEST_F(UTEST_ACL_Runtime, aclrtSubscribeReportTest)
{
    aclError ret;
    aclrtStream stream = (aclrtStream)0x01;
    ret = aclrtSubscribeReport(1, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtUnSubscribeReportTest)
{
    aclrtStream stream = (aclrtStream)0x01;
    aclError ret = aclrtUnSubscribeReport(1, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtUnSubscribeReport(_, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    EXPECT_EQ(aclrtUnSubscribeReport(1, stream), ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtLaunchCallbackTest)
{
    aclrtStream stream = (aclrtStream)0x01;
    aclError ret = aclrtLaunchCallback(CallBackFuncStub, nullptr, ACL_CALLBACK_BLOCK, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtLaunchCallback(CallBackFuncStub, nullptr, static_cast<aclrtCallbackBlockType>(2), stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtCallbackLaunch(_, _, _, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtLaunchCallback(CallBackFuncStub, nullptr, ACL_CALLBACK_BLOCK, stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtLaunchHostFuncTest)
{
    aclrtStream stream = (aclrtStream)0x01;
    aclError ret = aclrtLaunchHostFunc(stream, CallBackFuncStub, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsLaunchHostFunc(_, _, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtLaunchHostFunc(stream, CallBackFuncStub, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtProcessReportTest)
{
    // timeout value is invalid
    aclError ret = aclrtProcessReport(0);
    EXPECT_NE(ret, ACL_SUCCESS);

    // aclrtProcessReport success
    ret = aclrtProcessReport(1);
    EXPECT_EQ(ret, ACL_SUCCESS);

    // rtProcessReport failed
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtProcessReport(_))
        .WillOnce(Return((ACL_ERROR_RT_THREAD_SUBSCRIBE)));
    EXPECT_EQ(aclrtProcessReport(1), ACL_ERROR_RT_THREAD_SUBSCRIBE);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtProcessReport(_))
        .WillOnce(Return((ACL_ERROR_RT_REPORT_TIMEOUT)));
    EXPECT_EQ(aclrtProcessReport(1), ACL_ERROR_RT_REPORT_TIMEOUT);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtProcessReport(_))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    EXPECT_EQ(aclrtProcessReport(1), ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemAllocManaged_DeviceTest)
{
    void *devPtr = nullptr;
    size_t size = 1;
    uint32_t errorFlag = 0;

    aclError ret = aclrtMemAllocManaged(&devPtr, size, errorFlag);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemAllocManaged(&devPtr, size, 1);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclrtFree(devPtr);
    devPtr = nullptr;
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemManagedAdvise_DeviceTest)
{
    void *ptr = nullptr;
    size_t size = 1;
    aclrtMemManagedLocation location;
    location.type = ACL_MEM_LOCATIONTYPE_HOST;

    aclError ret = aclrtMemAllocManaged(&ptr, size, 1);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemManagedAdvise(ptr, size, ACL_MEM_ADVISE_SET_READ_MOSTLY, location);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtFree(ptr);
    ptr = nullptr;
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemManagedGetAttr_DeviceTest)
{
    void *ptr = nullptr;
    size_t size = 1;
    void *data;
    size_t dataSize = 4;

    aclError ret = aclrtMemAllocManaged(&ptr, size, 1);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemManagedGetAttr(ACL_MEM_RANGE_ATTRIBUTE_READ_MOSTLY, ptr, size, &data, dataSize);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtFree(ptr);
    ptr = nullptr;
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemManagedGetAttrs_DeviceTest)
{
    void *ptr = nullptr;
    size_t size = 1;
    void *data;
    size_t dataSizes = 8;
    size_t numAttributes = 2;
    aclrtMemManagedRangeAttribute attributes[2] = {ACL_MEM_RANGE_ATTRIBUTE_READ_MOSTLY, ACL_MEM_RANGE_ATTRIBUTE_ACCESSED_BY};

    aclError ret = aclrtMemAllocManaged(&ptr, size, 1);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemManagedGetAttrs(attributes, numAttributes, ptr, size, &data, &dataSizes);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtFree(ptr);
    ptr = nullptr;
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtMalloc_DeviceTest)
{
    void *devPtr = nullptr;
    size_t size = 1;

    aclError ret = aclrtMalloc(&devPtr, size, ACL_MEM_MALLOC_HUGE_FIRST);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(devPtr, nullptr);

    ret = aclrtFree(devPtr);
    devPtr = nullptr;
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMalloc(&devPtr, size, ACL_MEM_MALLOC_HUGE_FIRST);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclrtFree(devPtr);
    devPtr = nullptr;
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMalloc(nullptr, size, ACL_MEM_MALLOC_HUGE_FIRST);
    EXPECT_NE(ret, ACL_SUCCESS);

    ret = aclrtMalloc(&devPtr, size, ACL_MEM_MALLOC_HUGE_ONLY);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclrtFree(devPtr);
    devPtr = nullptr;
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMalloc(&devPtr, size, ACL_MEM_MALLOC_NORMAL_ONLY);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclrtFree(devPtr);
    devPtr = nullptr;
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMalloc(&devPtr, size, ACL_MEM_MALLOC_HUGE_FIRST_P2P);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclrtFree(devPtr);
    devPtr = nullptr;
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMalloc(&devPtr, size, ACL_MEM_MALLOC_HUGE_ONLY_P2P);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclrtFree(devPtr);
    devPtr = nullptr;
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMalloc(&devPtr, size, ACL_MEM_MALLOC_NORMAL_ONLY_P2P);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclrtFree(devPtr);
    devPtr = nullptr;
    EXPECT_EQ(ret, ACL_SUCCESS);

    size = static_cast<size_t>(-1);
    ret = aclrtMalloc(&devPtr, size, ACL_MEM_MALLOC_NORMAL_ONLY);
    EXPECT_NE(ret, ACL_SUCCESS);
    
    size = static_cast<size_t>(0);
    ret = aclrtMalloc(&devPtr, size, ACL_MEM_MALLOC_NORMAL_ONLY);
    EXPECT_NE(ret, ACL_SUCCESS);

    size = 1;
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMalloc(_, _, _, _))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtMalloc(&devPtr, size, ACL_MEM_MALLOC_HUGE_ONLY);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclMalloc_1GHuge) {
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMalloc(_, _, _, _))
        .WillRepeatedly(Invoke(rtMalloc1g));
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMallocCached(_, _, _, _))
        .WillRepeatedly(Invoke(rtMalloc1g));
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMallocPhysical(_, _, _, _))
        .WillRepeatedly(Invoke(rtMallocPhysical1g));
    void *devPtr = nullptr;
    size_t size = 1024UL * 1024UL * 1024UL;
    auto ret = aclrtMalloc(&devPtr, size, ACL_MEM_MALLOC_HUGE1G_ONLY);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclrtMalloc(&devPtr, size, ACL_MEM_MALLOC_HUGE1G_ONLY_P2P);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclrtMallocAlign32(&devPtr, size, ACL_MEM_MALLOC_HUGE1G_ONLY);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclrtMallocAlign32(&devPtr, size, ACL_MEM_MALLOC_HUGE1G_ONLY_P2P);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclrtMallocCached(&devPtr, size, ACL_MEM_MALLOC_HUGE1G_ONLY);
    EXPECT_EQ(ret, ACL_SUCCESS);

    aclrtDrvMemHandle handle = nullptr;
    aclrtPhysicalMemProp prop = {};
    prop.handleType = ACL_MEM_HANDLE_TYPE_NONE;
    prop.allocationType = ACL_MEM_ALLOCATION_TYPE_PINNED;
    prop.memAttr = ACL_HBM_MEM_HUGE1G;
    prop.location.type = ACL_MEM_LOCATION_TYPE_DEVICE;
    prop.location.id = 0;

    ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);

    prop.memAttr = ACL_HBM_MEM_P2P_HUGE1G;
    ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_NE(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtMallocCached_DeviceTest)
{
    void *devPtr = nullptr;
    size_t size = 1;

    aclError ret = aclrtMallocCached(&devPtr, size, ACL_MEM_MALLOC_HUGE_FIRST);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclrtFree(devPtr);
    devPtr = nullptr;
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMallocCached(&devPtr, size, ACL_MEM_MALLOC_HUGE_ONLY);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclrtFree(devPtr);
    devPtr = nullptr;
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMallocCached(&devPtr, size, ACL_MEM_MALLOC_NORMAL_ONLY);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(devPtr, nullptr);
    ret = aclrtFree(devPtr);
    devPtr = nullptr;
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMallocCached(_, _, _, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtMallocCached(&devPtr, size, ACL_MEM_MALLOC_HUGE_ONLY);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemFlushTest)
{
    // aclrtMemFlush
    void *devPtr = nullptr;
    size_t size = 1;
    aclError ret = aclrtMemFlush(devPtr, size);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    size = 0;
    devPtr = (void *)0x11;
    ret = aclrtMemFlush(devPtr, size);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    size = 1;
    devPtr = (void *)0x11;
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtFlushCache(_, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtMemFlush(devPtr, size);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemInvalidateTest)
{
    // aclrtMemInvalidate
    void *devPtr = nullptr;
    size_t size = static_cast<size_t>(1);
    aclError ret = aclrtMemInvalidate(devPtr, size);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    size = static_cast<size_t>(0);
    devPtr = (void *)0x11;
    ret = aclrtMemInvalidate(devPtr, size);
    EXPECT_NE(ret, ACL_SUCCESS);

    size = static_cast<size_t>(-1);
    ret = aclrtMallocCached(&devPtr, size, ACL_MEM_MALLOC_NORMAL_ONLY);
    EXPECT_NE(ret, ACL_SUCCESS);

    size = static_cast<size_t>(0);
    ret = aclrtMallocCached(&devPtr, size, ACL_MEM_MALLOC_NORMAL_ONLY);
    EXPECT_NE(ret, ACL_SUCCESS);

    size = static_cast<size_t>(1);
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtInvalidCache(_, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtMemInvalidate(devPtr, size);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, memory_free_device)
{
    aclError ret = aclrtFree(nullptr);
    EXPECT_NE(ret, ACL_SUCCESS);

    void *devPtr = nullptr;
    size_t size = 1;
    aclrtMalloc(&devPtr, size, ACL_MEM_MALLOC_HUGE_ONLY_P2P);
    ret = aclrtFree(devPtr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    aclrtMalloc(&devPtr, size, ACL_MEM_MALLOC_HUGE_ONLY_P2P);
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtFree(_))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)))
        .WillRepeatedly(Invoke([](void *devPtr) {
            return aclStub().rtFree(devPtr);
        }));
    ret = aclrtFree(devPtr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
    EXPECT_EQ(aclrtFree(devPtr), ACL_SUCCESS);
    devPtr = nullptr;
}

TEST_F(UTEST_ACL_Runtime, memory_malloc_host)
{
    void *hostPtr = nullptr;
    size_t size = 0;

    aclError ret = aclrtMallocHost(&hostPtr, size);
    EXPECT_NE(ret, ACL_SUCCESS);

    size = 1;
    ret = aclrtMallocHost(&hostPtr, size);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(hostPtr, nullptr);

    ret = aclrtFreeHost(hostPtr);
    hostPtr = nullptr;
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMallocHost(nullptr, size);
    EXPECT_NE(ret, ACL_SUCCESS);

    ret = aclrtMallocHost(&hostPtr, size);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclrtFreeHost(hostPtr);
    hostPtr = nullptr;
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMallocHost(_, _, _))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtMallocHost(&hostPtr, size);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, memoryFreeHostTest)
{
    void *hostPtr = nullptr;

    aclError ret = aclrtFreeHost(hostPtr);
    EXPECT_NE(ret, ACL_SUCCESS);
    size_t size = 1;
    ret = aclrtMallocHost(&hostPtr, size);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(hostPtr, nullptr);
    ret = aclrtFreeHost(hostPtr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMallocHost(&hostPtr, size);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtFreeHost(_))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)))
        .WillRepeatedly(Invoke([](void *hostPtr) {
            return aclStub().rtFreeHost(hostPtr);
        }));
    ret = aclrtFreeHost(hostPtr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
    EXPECT_EQ(aclrtFreeHost(hostPtr), ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, device_free_with_dev_sync)
{
    aclError ret = aclrtFreeWithDevSync(nullptr);
    EXPECT_NE(ret, ACL_SUCCESS);

    void *devPtr = nullptr;
    size_t size = 1;
    ret = aclrtMalloc(&devPtr, size, ACL_MEM_MALLOC_HUGE_ONLY_P2P);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclrtFreeWithDevSync(devPtr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMalloc(&devPtr, size, ACL_MEM_MALLOC_HUGE_ONLY_P2P);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtFreeWithDevSync(_))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)))
        .WillRepeatedly(Invoke([](void *devPtr) {
            return aclStub().rtFreeWithDevSync(devPtr);
        }));
    ret = aclrtFreeWithDevSync(devPtr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
    EXPECT_EQ(aclrtFreeWithDevSync(devPtr), ACL_SUCCESS);
    devPtr = nullptr;
}

TEST_F(UTEST_ACL_Runtime, host_free_with_dev_sync)
{
    void *hostPtr = nullptr;
    aclError ret = aclrtFreeHostWithDevSync(hostPtr);
    EXPECT_NE(ret, ACL_SUCCESS);

    size_t size = 1;
    ret = aclrtMallocHost(&hostPtr, size);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclrtFreeHostWithDevSync(hostPtr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMallocHost(&hostPtr, size);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtFreeHostWithDevSync(_))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)))
        .WillRepeatedly(Invoke([](void *hostPtr) {
            return aclStub().rtFreeHostWithDevSync(hostPtr);
        }));
    ret = aclrtFreeHostWithDevSync(hostPtr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
    EXPECT_EQ(aclrtFreeHostWithDevSync(hostPtr), ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, memory_memset)
{
    aclError ret = aclrtMemset(nullptr, 1, 1, 1);
    EXPECT_NE(ret, ACL_SUCCESS);

    ret = aclrtMemset(nullptr, 0, 1, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);

    void *src = (void *)malloc(5);
    ret = aclrtMemset(src, 1, 1, 1);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemset(_, _, _, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtMemset(src, 1, 1, 1);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
    free(src);
}

TEST_F(UTEST_ACL_Runtime, memory_memcpy)
{
    char src[5] = {};
    char dst[5] = {};
    aclError ret = aclrtMemcpy(dst, 1, src, 1, ACL_MEMCPY_HOST_TO_HOST);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpy(nullptr, 0, nullptr, 0, ACL_MEMCPY_HOST_TO_HOST);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpy(nullptr, 0, nullptr, 0, (aclrtMemcpyKind)0x7FFFFFFF);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpy(nullptr, 1, src, 1, ACL_MEMCPY_HOST_TO_HOST);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpy(dst, 1, nullptr, 1, ACL_MEMCPY_HOST_TO_HOST);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpy(dst, 1, src, 1, ACL_MEMCPY_HOST_TO_DEVICE);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpy(dst, 1, src, 1, ACL_MEMCPY_DEVICE_TO_HOST);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpy(dst, 1, src, 1, ACL_MEMCPY_DEVICE_TO_DEVICE);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpy(dst, 1, src, 1, ACL_MEMCPY_DEFAULT);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpy(dst, 1, src, 1, ACL_MEMCPY_HOST_TO_BUF_TO_DEVICE);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpy(dst, 1, src, 1, (aclrtMemcpyKind)0x7FFFFFFF);
    
    EXPECT_NE(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemcpy(_, _, _, _, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtMemcpy(dst, 1, src, 1, ACL_MEMCPY_DEVICE_TO_DEVICE);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, memory_memcpyAsync)
{
    void *dst = (void *)0x01;
    void *src = (void *)0x02;
    aclrtStream stream = (aclrtStream)0x10;
    aclError ret = aclrtMemcpyAsync(dst, 1, src, 1, ACL_MEMCPY_HOST_TO_HOST, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpyAsync(nullptr, 0, nullptr, 0, ACL_MEMCPY_HOST_TO_HOST, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpyAsync(nullptr, 0, nullptr, 0, (aclrtMemcpyKind)0x7FFFFFFF, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpyAsync(nullptr, 1, src, 1, ACL_MEMCPY_HOST_TO_HOST, stream);
    EXPECT_NE(ret, ACL_SUCCESS);

    ret = aclrtMemcpyAsync(dst, 1, nullptr, 1, ACL_MEMCPY_HOST_TO_HOST, stream);
    EXPECT_NE(ret, ACL_SUCCESS);

    ret = aclrtMemcpyAsync(dst, 1, src, 1, ACL_MEMCPY_HOST_TO_DEVICE, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpyAsync(dst, 1, src, 1, ACL_MEMCPY_HOST_TO_DEVICE, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpyAsync(dst, 1, src, 1, ACL_MEMCPY_DEVICE_TO_HOST, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpyAsync(dst, 1, src, 1, ACL_MEMCPY_DEVICE_TO_DEVICE, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpyAsync(dst, 1, src, 1, ACL_MEMCPY_DEFAULT, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpyAsync(dst, 1, src, 1, ACL_MEMCPY_HOST_TO_BUF_TO_DEVICE, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpyAsync(dst, 1, src, 1, (aclrtMemcpyKind)0x7FFFFFFF, stream);
    EXPECT_NE(ret, ACL_SUCCESS);

    // aclrtMemcpyAsync failed
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemcpyAsync(_, _, _, _, _, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtMemcpyAsync(dst, 1, src, 1, ACL_MEMCPY_DEVICE_TO_DEVICE, stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, zero_size_memory_ops_return_before_runtime_call)
{
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemcpy(_, _, _, _, _)).Times(0);
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemcpyAsync(_, _, _, _, _, _)).Times(0);
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemcpyAsyncEx(_, _, _, _, _, _, _)).Times(0);
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemset(_, _, _, _)).Times(0);
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemsetAsync(_, _, _, _, _)).Times(0);

    EXPECT_EQ(aclrtMemcpy(nullptr, 1, nullptr, 0, static_cast<aclrtMemcpyKind>(0x7FFFFFFF)), ACL_SUCCESS);
    EXPECT_EQ(aclrtMemcpyAsync(nullptr, 1, nullptr, 0, static_cast<aclrtMemcpyKind>(0x7FFFFFFF),
        reinterpret_cast<aclrtStream>(0x10)), ACL_SUCCESS);
    EXPECT_EQ(aclrtMemcpyAsyncWithCondition(nullptr, 1, nullptr, 0,
        static_cast<aclrtMemcpyKind>(0x7FFFFFFF), reinterpret_cast<aclrtStream>(0x10)), ACL_SUCCESS);
    EXPECT_EQ(aclrtMemset(nullptr, 1, 0, 0), ACL_SUCCESS);
    EXPECT_EQ(aclrtMemsetAsync(nullptr, 1, 0, 0, reinterpret_cast<aclrtStream>(0x10)), ACL_SUCCESS);
}

static rtError_t rtsPointerGetAttributesToHost(const void *ptr, rtPtrAttributes_t *attributes)
{
    (void)ptr;
    attributes->location.type = RT_MEMORY_LOC_HOST;  // 0
    return RT_ERROR_NONE;
}
static rtError_t rtsPointerGetAttributesToDevice(const void *ptr, rtPtrAttributes_t *attributes)\
{
    (void)ptr;
    attributes->location.type = RT_MEMORY_LOC_DEVICE; // 1
    return RT_ERROR_NONE;
}
static rtError_t rtsPointerGetAttributesToUnregistered(const void *ptr, rtPtrAttributes_t *attributes)
{
    (void)ptr;
    attributes->location.type = RT_MEMORY_LOC_UNREGISTERED;
    return RT_ERROR_NONE;
}

// ==================== 同步接口测试 ====================
TEST_F(UTEST_ACL_Runtime, aclrtMemsetD32_failed_with_nullptr)
{
    aclError ret = aclrtMemsetD32(nullptr, 16, 0xDEADBEEF, 4);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemsetD32_success_with_zero_N)
{
    void *ptr = nullptr;
    size_t N = 0;
    size_t memSize = 16;
    aclError ret = aclrtMemsetD32(ptr, memSize, 0xDEADBEEF, N);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemsetD32_failed_with_insufficient_memSize)
{
    void *ptr = nullptr;
    size_t N = 4;
    size_t memSize = N * sizeof(uint32_t) - 1;
    aclrtMallocHost(&ptr, memSize);
    ASSERT_NE(ptr, nullptr);
    aclError ret = aclrtMemsetD32(ptr, memSize, 0xDEADBEEF, N);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
    aclrtFreeHost(ptr);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemsetD32_rt_error)
{
    void *ptr = nullptr;
    size_t N = 4;
    size_t memSize = N * sizeof(uint32_t);
    aclrtMallocHost(&ptr, memSize);
    ASSERT_NE(ptr, nullptr);

    // 先 mock 内存属性为 Host,再 mock 底层函数返回错误
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsPointerGetAttributes(_, _))
        .WillOnce(Invoke(rtsPointerGetAttributesToHost));
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemsetD32(_, _, _, _))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    aclError ret = aclrtMemsetD32(ptr, memSize, 0xDEADBEEF, N);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
    aclrtFreeHost(ptr);
}

// ==================== 异步接口测试 ====================
TEST_F(UTEST_ACL_Runtime, aclrtMemsetD32Async_failed_with_nullptr)
{
    aclrtStream stream = (aclrtStream)0x10;
    aclError ret = aclrtMemsetD32Async(nullptr, 16, 0xDEADBEEF, 4, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemsetD32Async_success_with_zero_N)
{
    void *ptr = nullptr;
    aclrtStream stream = (aclrtStream)0x10;
    size_t N = 0;
    size_t memSize = 16;
    aclError ret = aclrtMemsetD32Async(ptr, memSize, 0xDEADBEEF, N, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemsetD32Async_failed_with_insufficient_memSize)
{
    void *ptr = nullptr;
    size_t N = 4;
    size_t memSize = N * sizeof(uint32_t) - 1;
    aclrtStream stream = (aclrtStream)0x10;
    aclrtMallocHost(&ptr, memSize);
    ASSERT_NE(ptr, nullptr);
    aclError ret = aclrtMemsetD32Async(ptr, memSize, 0xDEADBEEF, N, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
    aclrtFreeHost(ptr);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemsetD32Async_rt_error)
{
    void *ptr = nullptr;
    size_t N = 4;
    size_t memSize = N * sizeof(uint32_t);
    aclrtStream stream = (aclrtStream)0x10;
    aclrtMallocHost(&ptr, memSize);
    ASSERT_NE(ptr, nullptr);

    // mock 内存属性为 Host
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsPointerGetAttributes(_, _))
        .WillRepeatedly(Invoke(rtsPointerGetAttributesToHost));
    // mock 底层异步函数返回错误
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemsetD32Async(_, _, _, _, _))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    aclError ret = aclrtMemsetD32Async(ptr, memSize, 0xDEADBEEF, N, stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
    aclrtFreeHost(ptr);
}

// ==================== 大 N 值测试 ====================
TEST_F(UTEST_ACL_Runtime, aclrtMemsetD32_large_N_success)
{
    void *ptr = nullptr;
    size_t N = 1024 * 1024;  // 1M 个元素
    size_t memSize = N * sizeof(uint32_t);
    aclrtMallocHost(&ptr, memSize);
    ASSERT_NE(ptr, nullptr);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsPointerGetAttributes(_, _))
        .WillOnce(Invoke(rtsPointerGetAttributesToHost));

    aclError ret = aclrtMemsetD32(ptr, memSize, 0xDEADBEEF, N);
    EXPECT_EQ(ret, ACL_SUCCESS);
    aclrtFreeHost(ptr);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemsetD32_large_N_insufficient_memSize)
{
    void *ptr = nullptr;
    size_t N = 1024 * 1024;
    size_t memSize = N * sizeof(uint32_t) - 1;
    aclrtMallocHost(&ptr, memSize);
    ASSERT_NE(ptr, nullptr);
    aclError ret = aclrtMemsetD32(ptr, memSize, 0xDEADBEEF, N);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
    aclrtFreeHost(ptr);
}

// ==================== 精确大小测试 ====================
TEST_F(UTEST_ACL_Runtime, aclrtMemsetD32_exact_memSize_success)
{
    void *ptr = nullptr;
    size_t N = 1024;
    size_t memSize = N * sizeof(uint32_t);
    aclrtMallocHost(&ptr, memSize);
    ASSERT_NE(ptr, nullptr);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsPointerGetAttributes(_, _))
        .WillOnce(Invoke(rtsPointerGetAttributesToHost));

    aclError ret = aclrtMemsetD32(ptr, memSize, 0x12345678, N);
    EXPECT_EQ(ret, ACL_SUCCESS);
    aclrtFreeHost(ptr);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemsetD32_async_exact_memSize_success)
{
    void *ptr = nullptr;
    aclrtStream stream = (aclrtStream)0x10;
    size_t N = 1024;
    size_t memSize = N * sizeof(uint32_t);
    aclrtMallocHost(&ptr, memSize);
    ASSERT_NE(ptr, nullptr);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsPointerGetAttributes(_, _))
        .WillRepeatedly(Invoke(rtsPointerGetAttributesToHost));

    aclError ret = aclrtMemsetD32Async(ptr, memSize, 0x12345678, N, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);
    aclrtFreeHost(ptr);
}

// ==================== 异步大值 + null stream ====================
TEST_F(UTEST_ACL_Runtime, aclrtMemsetD32Async_large_N_null_stream)
{
    void *ptr = nullptr;
    size_t N = 1024 * 1024;
    size_t memSize = N * sizeof(uint32_t);
    aclrtMallocHost(&ptr, memSize);
    ASSERT_NE(ptr, nullptr);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsPointerGetAttributes(_, _))
        .WillRepeatedly(Invoke(rtsPointerGetAttributesToHost));

    aclError ret = aclrtMemsetD32Async(ptr, memSize, 0xDEADBEEF, N, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    aclrtFreeHost(ptr);
}

// ==================== 1GB 测试 ====================
TEST_F(UTEST_ACL_Runtime, aclrtMemsetD32_1GB_N_success)
{
    void *ptr = (void *)0x01;
    const size_t N = 268435456;
    const size_t memSize = N * sizeof(uint32_t);
    aclError ret = aclrtMemsetD32(ptr, memSize, 0xDEADBEEF, N);
    // 虚拟地址会被 IsAclPinnedMemory 拒绝,预期错误
    EXPECT_TRUE(ret == ACL_ERROR_RT_FEATURE_NOT_SUPPORT || ret == ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemsetD32_1GB_insufficient_memSize)
{
    void *ptr = nullptr;
    const size_t N = 268435456;
    const size_t memSize = N * sizeof(uint32_t) - 1;
    aclError ret = aclrtMemsetD32(ptr, memSize, 0xDEADBEEF, N);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

// ==================== malloc 内存 ====================
TEST_F(UTEST_ACL_Runtime, aclrtMemsetD32_failed_with_malloc_memory)
{
    size_t N = 1024;
    size_t memSize = N * sizeof(uint32_t);
    void *ptr = malloc(memSize);
    ASSERT_NE(ptr, nullptr);
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsPointerGetAttributes(_, _))
        .WillOnce(Invoke(rtsPointerGetAttributesToUnregistered));
    aclError ret = aclrtMemsetD32(ptr, memSize, 0xDEADBEEF, N);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
    free(ptr);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemsetD32Async_failed_with_malloc_memory)
{
    size_t N = 1024;
    size_t memSize = N * sizeof(uint32_t);
    void *ptr = malloc(memSize);
    ASSERT_NE(ptr, nullptr);
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsPointerGetAttributes(_, _))
        .WillOnce(Invoke(rtsPointerGetAttributesToUnregistered));
    aclrtStream stream = (aclrtStream)0x10;
    aclError ret = aclrtMemsetD32Async(ptr, memSize, 0xDEADBEEF, N, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
    free(ptr);
}

// ==================== ACL 分配的内存应成功 ====================
TEST_F(UTEST_ACL_Runtime, aclrtMemsetD32Async_success_with_aclrtMalloc_memory)
{
    void *ptr = nullptr;
    size_t N = 1024;
    size_t memSize = N * sizeof(uint32_t);
    aclError allocRet = aclrtMalloc(&ptr, memSize, ACL_MEM_MALLOC_NORMAL_ONLY);
    if (allocRet != ACL_SUCCESS) {
        GTEST_SKIP() << "Device memory allocation failed, skip test.";
    }
    ASSERT_NE(ptr, nullptr);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsPointerGetAttributes(_, _))
        .WillRepeatedly(Invoke(rtsPointerGetAttributesToDevice));

    aclrtStream stream = (aclrtStream)0x10;
    aclError ret = aclrtMemsetD32Async(ptr, memSize, 0xDEADBEEF, N, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);
    aclrtFree(ptr);
}

// ==================== 非 4 字节对齐地址应失败 ====================
TEST_F(UTEST_ACL_Runtime, aclrtMemsetD32_failed_with_unaligned_ptr)
{
    void *alignedPtr = nullptr;
    size_t N = 4;
    size_t memSize = N * sizeof(uint32_t) + 4;
    aclrtMallocHost(&alignedPtr, memSize);
    ASSERT_NE(alignedPtr, nullptr);
    uint8_t *bytePtr = static_cast<uint8_t*>(alignedPtr);
    void *unalignedPtr = bytePtr + 2;
    size_t availableSize = memSize - 2;
    aclError ret = aclrtMemsetD32(unalignedPtr, availableSize, 0xDEADBEEF, N);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
    aclrtFreeHost(alignedPtr);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemsetD32Async_failed_with_unaligned_ptr)
{
    void *alignedPtr = nullptr;
    size_t N = 4;
    size_t memSize = N * sizeof(uint32_t) + 4;
    aclrtMallocHost(&alignedPtr, memSize);
    ASSERT_NE(alignedPtr, nullptr);
    uint8_t *bytePtr = static_cast<uint8_t*>(alignedPtr);
    void *unalignedPtr = bytePtr + 2;
    size_t availableSize = memSize - 2;
    aclrtStream stream = (aclrtStream)0x10;
    aclError ret = aclrtMemsetD32Async(unalignedPtr, availableSize, 0xDEADBEEF, N, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
    aclrtFreeHost(alignedPtr);
}

TEST_F(UTEST_ACL_Runtime, memory_memcpyAsyncWithCondition)
{
    void *dst = (void *)0x01;
    void *src = (void *)0x02;
    aclrtStream stream = (aclrtStream)0x10;

    aclError ret = aclrtMemcpyAsyncWithCondition(dst, 1, src, 1, ACL_MEMCPY_HOST_TO_HOST, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpyAsyncWithCondition(nullptr, 0, nullptr, 0, ACL_MEMCPY_HOST_TO_HOST, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpyAsyncWithCondition(nullptr, 0, nullptr, 0, ACL_MEMCPY_HOST_TO_DEVICE, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpyAsyncWithCondition(nullptr, 0, nullptr, 0, (aclrtMemcpyKind)0x7FFFFFFF, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpyAsyncWithCondition(dst, 1, src, 1, ACL_MEMCPY_HOST_TO_DEVICE, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpyAsyncWithCondition(nullptr, 1, src, 1, ACL_MEMCPY_HOST_TO_DEVICE, stream);
    EXPECT_NE(ret, ACL_SUCCESS);

    ret = aclrtMemcpyAsyncWithCondition(dst, 1, nullptr, 1, ACL_MEMCPY_HOST_TO_DEVICE, stream);
    EXPECT_NE(ret, ACL_SUCCESS);

    ret = aclrtMemcpyAsyncWithCondition(dst, 1, src, 1, ACL_MEMCPY_HOST_TO_DEVICE, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpyAsyncWithCondition(dst, 1, src, 1, ACL_MEMCPY_DEVICE_TO_HOST, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpyAsyncWithCondition(dst, 1, src, 1, ACL_MEMCPY_DEVICE_TO_DEVICE, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpyAsyncWithCondition(dst, 1, src, 1, ACL_MEMCPY_DEFAULT, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpyAsyncWithCondition(dst, 1, src, 1, ACL_MEMCPY_HOST_TO_BUF_TO_DEVICE, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpyAsyncWithCondition(dst, 1, src, 1, (aclrtMemcpyKind)0x7FFFFFFF, stream);
    EXPECT_NE(ret, ACL_SUCCESS);

    // aclrtMemcpyAsync failed
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemcpyAsyncEx(_, _, _, _, _, _, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtMemcpyAsyncWithCondition(dst, 1, src, 1, ACL_MEMCPY_DEVICE_TO_DEVICE, stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, memory_getMemInfo)
{
    size_t free = 0x01;
    size_t total = 0x02;
    aclError ret = aclrtGetMemInfo(ACL_DDR_MEM_HUGE, &free, &total);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtGetMemInfo(ACL_DDR_MEM_HUGE, &free, &total);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtGetMemInfo(ACL_HBM_MEM, &free, &total);
    EXPECT_EQ(ret, ACL_SUCCESS);

    // aclrtGetMemInfo failed
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemGetInfoEx(_, _, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtGetMemInfo(ACL_DDR_MEM_HUGE, &free, &total);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetMemUsageInfo)
{
    int32_t deviceId = 0;
    aclrtMemUsageInfo memUsageInfo[10];
    size_t numInput = 10;
    size_t numOutput = 0;
    aclError ret = aclrtGetMemUsageInfo(deviceId, memUsageInfo, numInput, &numOutput);
    EXPECT_EQ(ret, ACL_SUCCESS);

    // aclrtGetMemUsageInfo failed
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetMemUsageInfo(_, _, _, _))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtGetMemUsageInfo(deviceId, memUsageInfo, numInput, &numOutput);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemsetAsyncFailedTest)
{
    void *devPtr = (void *)0x01;
    aclrtStream stream = (aclrtStream)0x10;
    aclError ret = aclrtMemsetAsync(nullptr, 1, 1, 1, stream);
    EXPECT_NE(ret, ACL_SUCCESS);

    ret = aclrtMemsetAsync(nullptr, 0, 1, 0, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    // aclrtMemsetAsync failed
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemsetAsync(_, _, _, _, _))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtMemsetAsync(devPtr, 1, 1, 1, stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}


TEST_F(UTEST_ACL_Runtime, aclrtCheckMemTypeTest)
{
    void *devPtr = nullptr;
    size_t size = 1;

    aclError ret = aclrtMalloc(&devPtr, size, ACL_MEM_MALLOC_HUGE_FIRST);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(devPtr, nullptr);
    uint32_t checkResult = 0;
    ret = aclrtCheckMemType(&devPtr, size, ACL_RT_MEM_TYPE_DEV, &checkResult, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_EQ(checkResult, 0);
    ret = aclrtFree(devPtr);
    devPtr = nullptr;
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemsetAsyncSuccessTest)
{
    void *devPtr = (void *)0x01;
    aclrtStream stream = (aclrtStream)0x10;
    aclError ret = aclrtMemsetAsync(devPtr, 1, 1, 1, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetGroupCountTest)
{
    // aclrtGetGroupCount success
    uint32_t count = 0;
    EXPECT_EQ(aclrtGetGroupCount(&count), ACL_SUCCESS);

    // aclrtGetGroupCount failed
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetGroupCount(_))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    EXPECT_EQ(aclrtGetGroupCount(&count), ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtCreateGroupInfoTest)
{
    // aclrtCreateGroupInfo success
    aclrtGroupInfo *groupInfo = aclrtCreateGroupInfo();
    EXPECT_NE(groupInfo, nullptr);
    EXPECT_EQ(aclrtDestroyGroupInfo(groupInfo), ACL_SUCCESS);

    // aclrtCreateGroupInfo failed
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetGroupCount(_))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    EXPECT_EQ(aclrtCreateGroupInfo(), nullptr);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetGroupInfoDetailTest)
{
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetGroupCount(_))
        .WillOnce(Return(RT_ERROR_NONE))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID))
        .WillRepeatedly(Return(RT_ERROR_NONE));

    aclrtGroupInfo *groupInfo = aclrtCreateGroupInfo();
    uint32_t aicoreNum = 0;
    size_t param_ret_size = 0;
    EXPECT_EQ(aclrtGetGroupInfoDetail(groupInfo, 1, ACL_GROUP_AICORE_INT,
        (void *)(&aicoreNum), 4, &param_ret_size), ACL_ERROR_RT_PARAM_INVALID);
    EXPECT_EQ(aicoreNum, 0);
    EXPECT_EQ(param_ret_size, 0);

    uint32_t aicpuNum = 0;
    EXPECT_EQ(aclrtGetGroupInfoDetail(groupInfo, 1, ACL_GROUP_AIC_INT,
        (void *)(&aicpuNum), 4, &param_ret_size), ACL_SUCCESS);
    EXPECT_NE(aicpuNum, 0);

    uint32_t aivectorNum = 0;
    EXPECT_EQ(aclrtGetGroupInfoDetail(groupInfo, 1, ACL_GROUP_AIV_INT,
        (void *)(&aivectorNum), 4, &param_ret_size), ACL_SUCCESS);
    EXPECT_NE(aivectorNum, 0);

    uint32_t sdmaNum = 0;
    EXPECT_EQ(aclrtGetGroupInfoDetail(groupInfo, 1, ACL_GROUP_SDMANUM_INT,
        (void *)(&sdmaNum), 4, &param_ret_size), ACL_SUCCESS);
    EXPECT_NE(sdmaNum, 0);

    uint32_t activeStreamNum = 0;
    EXPECT_EQ(aclrtGetGroupInfoDetail(groupInfo, 1, ACL_GROUP_ASQNUM_INT,
        (void *)(&activeStreamNum), 4, &param_ret_size), ACL_SUCCESS);
    EXPECT_NE(activeStreamNum, 0);

    uint32_t groupId = 0;
    EXPECT_EQ(aclrtGetGroupInfoDetail(groupInfo, 1, ACL_GROUP_GROUPID_INT,
        (void *)(&groupId), 4, &param_ret_size), ACL_SUCCESS);

    EXPECT_EQ(aclrtGetGroupInfoDetail(groupInfo, 2, ACL_GROUP_ASQNUM_INT,
        (void *)(&activeStreamNum), 4, &param_ret_size), ACL_ERROR_INVALID_PARAM);

    EXPECT_EQ(aclrtGetGroupInfoDetail(groupInfo, 1, static_cast<aclrtGroupAttr>(6),
        (void *)(&activeStreamNum), 4, &param_ret_size), ACL_ERROR_INVALID_PARAM);

    EXPECT_EQ(aclrtDestroyGroupInfo(groupInfo), ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetGroupInfoDetail_Fail_ValueLenTooSmall)
{
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetGroupCount(_))
        .WillRepeatedly(Return(RT_ERROR_NONE));

    aclrtGroupInfo *groupInfo = aclrtCreateGroupInfo();
    uint32_t value = 0;
    size_t param_ret_size = 0;

    // case: valueLen = 1 is smaller than required size (sizeof(uint32_t) = 4)
    EXPECT_EQ(aclrtGetGroupInfoDetail(groupInfo, 0, ACL_GROUP_AICORE_INT,
        (void *)(&value), 1, &param_ret_size), ACL_ERROR_INVALID_PARAM);

    // case: valueLen = 2 is smaller than required size (sizeof(uint32_t) = 4)
    EXPECT_EQ(aclrtGetGroupInfoDetail(groupInfo, 0, ACL_GROUP_AIV_INT,
        (void *)(&value), 2, &param_ret_size), ACL_ERROR_INVALID_PARAM);

    EXPECT_EQ(aclrtDestroyGroupInfo(groupInfo), ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetGroupInfoDetail_Fail_MemcpySecurecRange)
{
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetGroupCount(_))
        .WillRepeatedly(Return(RT_ERROR_NONE));

    aclrtGroupInfo *groupInfo = aclrtCreateGroupInfo();
    uint32_t value = 0U;
    size_t paramRetSize = 0U;
    const size_t invalidValueLen = 0x80000000UL;

    EXPECT_EQ(aclrtGetGroupInfoDetail(groupInfo, 0, ACL_GROUP_AICORE_INT,
        static_cast<void *>(&value), invalidValueLen, &paramRetSize), ACL_ERROR_FAILURE);
    EXPECT_EQ(paramRetSize, 0U);

    EXPECT_EQ(aclrtDestroyGroupInfo(groupInfo), ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetAllGroupInfoTest)
{
    aclrtGroupInfo *groupInfo = aclrtCreateGroupInfo();

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetGroupCount(_))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)))
        .WillRepeatedly(Return(RT_ERROR_NONE));
    EXPECT_EQ(aclrtGetAllGroupInfo(groupInfo), ACL_ERROR_RT_PARAM_INVALID);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetGroupInfo(_, _, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)))
        .WillOnce(Return(RT_ERROR_NONE));
    EXPECT_EQ(aclrtGetAllGroupInfo(groupInfo), ACL_ERROR_RT_PARAM_INVALID);

    // successfull execute aclrtGetAllGroupInfo
    EXPECT_EQ(aclrtGetAllGroupInfo(groupInfo), ACL_SUCCESS);
    EXPECT_EQ(aclrtDestroyGroupInfo(groupInfo), ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtSetGroupFailedTest)
{
    int32_t groupId = 1;
    EXPECT_EQ(aclrtSetGroup(groupId), ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSetGroup(_))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    EXPECT_EQ(aclrtSetGroup(groupId), ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclDeviceCanAccessPeerTest)
{
    int32_t canAccessPeer = 0;
    EXPECT_EQ(aclrtDeviceCanAccessPeer(&canAccessPeer, 0, 0), ACL_ERROR_INVALID_PARAM);
    EXPECT_EQ(aclrtDeviceCanAccessPeer(&canAccessPeer, 0, 1), ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetDevicePhyIdByIndex(_, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)))
        .WillRepeatedly(Return(RT_ERROR_NONE));
    EXPECT_EQ(aclrtDeviceCanAccessPeer(&canAccessPeer, 0, 1), ACL_ERROR_RT_PARAM_INVALID);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtDeviceCanAccessPeer(_, _, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)))
        .WillRepeatedly(Return(RT_ERROR_NONE));
    EXPECT_EQ(aclrtDeviceCanAccessPeer(&canAccessPeer, 0, 1), ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclEnablePeerAccessTest)
{
    int32_t peerDeviceId = 1;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetDevice(_))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)))
        .WillRepeatedly(Return(RT_ERROR_NONE));
    EXPECT_EQ(aclrtDeviceEnablePeerAccess(peerDeviceId, 0), ACL_ERROR_RT_PARAM_INVALID);
    EXPECT_EQ(aclrtDeviceEnablePeerAccess(0, 1), ACL_ERROR_FEATURE_UNSUPPORTED);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetDevicePhyIdByIndex(_, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)))
        .WillRepeatedly(Return(RT_ERROR_NONE));
    EXPECT_EQ(aclrtDeviceEnablePeerAccess(peerDeviceId, 0), ACL_ERROR_RT_PARAM_INVALID);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtEnableP2P(_, _, _))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    EXPECT_EQ(aclrtDeviceEnablePeerAccess(peerDeviceId, 0), ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclDisablePeerAccessTest)
{
    int32_t peerDeviceId = 1;
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetDevice(_))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)))
        .WillRepeatedly(Return(RT_ERROR_NONE));
    EXPECT_EQ(aclrtDeviceDisablePeerAccess(peerDeviceId), ACL_ERROR_RT_PARAM_INVALID);
    EXPECT_EQ(aclrtDeviceDisablePeerAccess(0), ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetDevicePhyIdByIndex(_, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)))
        .WillRepeatedly(Return(RT_ERROR_NONE));
    EXPECT_EQ(aclrtDeviceDisablePeerAccess(peerDeviceId), ACL_ERROR_RT_PARAM_INVALID);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtDisableP2P(_, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    EXPECT_EQ(aclrtDeviceDisablePeerAccess(peerDeviceId), ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtSubscribeReportFailedTest)
{
    uint64_t threadId = 1;
    aclrtStream stream = nullptr;
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSubscribeReport(_,_))
        .WillOnce(Return((1)));
    aclError ret = aclrtSubscribeReport(threadId, stream);
    EXPECT_EQ(ret, 1);
}

TEST_F(UTEST_ACL_Runtime, aclrtSetExceptionInfoCallbackFailedTest)
{
    aclrtExceptionInfoCallback callback = nullptr;
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtRegTaskFailCallbackByModule(_, _))
        .WillOnce(Return((1)));
    aclError ret = aclrtSetExceptionInfoCallback(callback);
    EXPECT_EQ(ret, 1);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemcpy2dTest)
{
    int32_t temp = 1;
    void *dst = reinterpret_cast<void *>(&temp);
    void *src = reinterpret_cast<void *>(&temp);
    size_t dpitch = 2;
    size_t spitch = 2;
    size_t width = 3;
    size_t height = 1;
    aclrtMemcpyKind kind = ACL_MEMCPY_HOST_TO_DEVICE;
    aclError ret = aclrtMemcpy2d(dst, dpitch, src, spitch, width, height, kind);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    width = 2;
    height = 0;
    ret = aclrtMemcpy2d(dst, dpitch, src, spitch, width, height, kind);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpy2d(nullptr, 0, nullptr, 0, 0, 1, kind);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpy2d(nullptr, 0, nullptr, 0, 0, 1, ACL_MEMCPY_HOST_TO_HOST);
    EXPECT_EQ(ret, ACL_SUCCESS);

    width = 1;
    height = 2;
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemcpy2d(_, _, _, _, _, _, _))
        .WillOnce(Return(1))
        .WillOnce(Return(0))
        .WillOnce(Return(0));
    ret = aclrtMemcpy2d(dst, dpitch, src, spitch, width, height, kind);
    EXPECT_EQ(ret, 1);

    width = 1;
    height = 2;
    kind = ACL_MEMCPY_HOST_TO_HOST;
    ret = aclrtMemcpy2d(dst, dpitch, src, spitch, width, height, kind);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    width = 1;
    height = 2;
    kind = ACL_MEMCPY_HOST_TO_DEVICE;
    ret = aclrtMemcpy2d(dst, dpitch, src, spitch, width, height, kind);
    EXPECT_EQ(ret, ACL_SUCCESS);

    width = 1;
    height = 2;
    kind = ACL_MEMCPY_DEFAULT;
    ret = aclrtMemcpy2d(dst, dpitch, src, spitch, width, height, kind);
    EXPECT_EQ(ret, ACL_SUCCESS);

    width = 1;
    height = 2;
    kind = ACL_MEMCPY_HOST_TO_BUF_TO_DEVICE;
    ret = aclrtMemcpy2d(dst, dpitch, src, spitch, width, height, kind);
    EXPECT_NE(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemcpy2d_zero_size_return_before_param_check)
{
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemcpy2d(_, _, _, _, _, _, RT_MEMCPY_RESERVED))
        .Times(2)
        .WillRepeatedly(Return(RT_ERROR_NONE));
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemcpy2dAsync(_, _, _, _, _, _, RT_MEMCPY_RESERVED, _))
        .Times(2)
        .WillRepeatedly(Return(RT_ERROR_NONE));

    EXPECT_EQ(aclrtMemcpy2d(nullptr, 0, nullptr, 0, 0, 1, static_cast<aclrtMemcpyKind>(0x7FFFFFFF)),
        ACL_SUCCESS);
    EXPECT_EQ(aclrtMemcpy2d(nullptr, 0, nullptr, 0, 1, 0, ACL_MEMCPY_HOST_TO_HOST), ACL_SUCCESS);
    EXPECT_EQ(aclrtMemcpy2dAsync(nullptr, 0, nullptr, 0, 0, 1,
        static_cast<aclrtMemcpyKind>(0x7FFFFFFF), reinterpret_cast<aclrtStream>(0x10)), ACL_SUCCESS);
    EXPECT_EQ(aclrtMemcpy2dAsync(nullptr, 0, nullptr, 0, 1, 0, ACL_MEMCPY_HOST_TO_HOST,
        reinterpret_cast<aclrtStream>(0x10)), ACL_SUCCESS);

    int32_t temp = 0;
    void *addr = reinterpret_cast<void *>(&temp);
    auto stream = reinterpret_cast<aclrtStream>(0x10);
    EXPECT_EQ(aclrtMemcpy2d(nullptr, 1, addr, 1, 1, 1, ACL_MEMCPY_HOST_TO_DEVICE),
        ACL_ERROR_INVALID_PARAM);
    EXPECT_EQ(aclrtMemcpy2d(addr, 1, nullptr, 1, 1, 1, ACL_MEMCPY_HOST_TO_DEVICE),
        ACL_ERROR_INVALID_PARAM);
    EXPECT_EQ(aclrtMemcpy2dAsync(nullptr, 1, addr, 1, 1, 1, ACL_MEMCPY_HOST_TO_DEVICE, stream),
        ACL_ERROR_INVALID_PARAM);
    EXPECT_EQ(aclrtMemcpy2dAsync(addr, 1, nullptr, 1, 1, 1, ACL_MEMCPY_HOST_TO_DEVICE, stream),
        ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemcpy2dAsyncTest)
{
    int32_t temp = 1;
    void *dst = reinterpret_cast<void *>(&temp);
    void *src = reinterpret_cast<void *>(&temp);
    size_t dpitch = 2;
    size_t spitch = 2;
    size_t width = 3;
    size_t height = 1;
    aclrtStream stream;
    aclrtMemcpyKind kind = ACL_MEMCPY_HOST_TO_DEVICE;
    aclError ret = aclrtMemcpy2dAsync(dst, dpitch, src, spitch, width, height, kind, &stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    width = 2;
    height = 0;
    ret = aclrtMemcpy2dAsync(dst, dpitch, src, spitch, width, height, kind, &stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpy2dAsync(nullptr, 0, nullptr, 0, 0, 1, kind, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpy2dAsync(nullptr, 0, nullptr, 0, 0, 1, ACL_MEMCPY_HOST_TO_HOST, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    width = 1;
    height = 2;
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemcpy2dAsync(_, _, _, _, _, _, _, _))
        .WillOnce(Return(1))
        .WillOnce(Return(0))
        .WillOnce(Return(0))
        .WillOnce(Return(0));
    ret = aclrtMemcpy2dAsync(dst, dpitch, src, spitch, width, height, kind, stream);
    EXPECT_EQ(ret, 1);

    width = 1;
    height = 2;
    kind = ACL_MEMCPY_HOST_TO_HOST;
    ret = aclrtMemcpy2dAsync(dst, dpitch, src, spitch, width, height, kind, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    width = 1;
    height = 2;
    kind = ACL_MEMCPY_HOST_TO_DEVICE;
    ret = aclrtMemcpy2dAsync(dst, dpitch, src, spitch, width, height, kind, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    width = 1;
    height = 2;
    kind = ACL_MEMCPY_DEVICE_TO_DEVICE;
    ret = aclrtMemcpy2dAsync(dst, dpitch, src, spitch, width, height, kind, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    width = 1;
    height = 2;
    kind = ACL_MEMCPY_DEFAULT;
    ret = aclrtMemcpy2dAsync(dst, dpitch, src, spitch, width, height, kind, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    width = 1;
    height = 2;
    kind = ACL_MEMCPY_HOST_TO_BUF_TO_DEVICE;
    ret = aclrtMemcpy2dAsync(dst, dpitch, src, spitch, width, height, kind, stream);
    EXPECT_NE(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtSetStreamOverflowSwitch)
{
    aclrtStream stream = nullptr;
    aclError ret = aclrtSetStreamOverflowSwitch(stream, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSetStreamOverflowSwitch(_, _))
        .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
    ret = aclrtSetStreamOverflowSwitch(stream, 0);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetStreamOverflowSwitch)
{
    aclrtStream stream = nullptr;
    uint32_t flag;
    aclError ret = aclrtGetStreamOverflowSwitch(stream, &flag);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetStreamOverflowSwitch(_, _))
        .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
    ret = aclrtGetStreamOverflowSwitch(stream, &flag);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtSetDeviceSatMode)
{
    aclError ret = aclrtSetDeviceSatMode(ACL_RT_OVERFLOW_MODE_SATURATION);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSetDeviceSatMode(_))
        .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
    ret = aclrtSetDeviceSatMode(ACL_RT_OVERFLOW_MODE_SATURATION);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetDeviceSatMode)
{
    aclrtFloatOverflowMode mode = ACL_RT_OVERFLOW_MODE_UNDEF;
    aclError ret = aclrtGetDeviceSatMode(&mode);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetDeviceSatMode(_))
        .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
    ret = aclrtGetDeviceSatMode(&mode);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

class ExternalAllocatorDesc {
public:
    ExternalAllocatorDesc(): obj(nullptr), allocFunc(nullptr), freeFunc(nullptr), allocAdviseFunc(nullptr), getAddrFromBlockFunc(nullptr) {}
    ExternalAllocatorDesc(aclrtAllocator allocator,
                     aclrtAllocatorAllocFunc allocFunc,
                     aclrtAllocatorFreeFunc freeFunc,
                     aclrtAllocatorAllocAdviseFunc allocAdviseFunc,
                     aclrtAllocatorGetAddrFromBlockFunc getAddrFromBlockFunc)
    {
        this->obj = allocator;
        this->allocFunc = allocFunc;
        this->freeFunc = freeFunc;
        this->allocAdviseFunc = allocAdviseFunc;
        this->getAddrFromBlockFunc = getAddrFromBlockFunc;
    }
    ~ExternalAllocatorDesc() {}
    bool operator==(const ExternalAllocatorDesc &allocatorDesc) {
        return obj == allocatorDesc.obj &&
                allocFunc == allocatorDesc.allocFunc &&
                freeFunc == allocatorDesc.freeFunc &&
                allocAdviseFunc == allocatorDesc.allocAdviseFunc &&
                getAddrFromBlockFunc == allocatorDesc.getAddrFromBlockFunc;
    }
    aclrtAllocator obj;
    aclrtAllocatorAllocFunc allocFunc;
    aclrtAllocatorFreeFunc freeFunc;
    aclrtAllocatorAllocAdviseFunc allocAdviseFunc;
    aclrtAllocatorGetAddrFromBlockFunc getAddrFromBlockFunc;
};

TEST_F(UTEST_ACL_Runtime, aclrtAllocatorGetByStream_Fail_StreamNotRegistered)
{
    aclrtStream stream = (aclrtStream)0x01;
    auto allocatorDesc = aclrtAllocatorCreateDesc();
    EXPECT_NE(allocatorDesc, nullptr);
    void *obj = (void *)0x10;
    aclError ret = aclrtAllocatorSetObjToDesc(allocatorDesc, obj);
    EXPECT_EQ(ret, ACL_SUCCESS);
    aclrtAllocatorAllocFunc alloc_func = (aclrtAllocatorAllocFunc)0x20;
    ret = aclrtAllocatorSetAllocFuncToDesc(allocatorDesc, alloc_func);
    EXPECT_EQ(ret, ACL_SUCCESS);
    aclrtAllocatorFreeFunc free_func = (aclrtAllocatorFreeFunc)0x30;
    ret = aclrtAllocatorSetFreeFuncToDesc(allocatorDesc, free_func);
    EXPECT_EQ(ret, ACL_SUCCESS);
    aclrtAllocatorAllocAdviseFunc alloc_advise_func = (aclrtAllocatorAllocAdviseFunc)0x40;
    ret = aclrtAllocatorSetAllocAdviseFuncToDesc(allocatorDesc, alloc_advise_func);
    EXPECT_EQ(ret, ACL_SUCCESS);
    aclrtAllocatorGetAddrFromBlockFunc get_addr_from_block_func = (aclrtAllocatorGetAddrFromBlockFunc)0x50;
    ret = aclrtAllocatorSetGetAddrFromBlockFuncToDesc(allocatorDesc, get_addr_from_block_func);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclrtAllocatorRegister(stream, static_cast<ExternalAllocatorDesc *>(allocatorDesc));
    EXPECT_EQ(ret, ACL_SUCCESS);
    aclrtAllocatorDesc aclrt_desc;
    ret = aclrtAllocatorGetByStream(stream, &aclrt_desc, nullptr, nullptr, nullptr, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclrtAllocatorUnregister(stream);
    EXPECT_EQ(ret, ACL_SUCCESS);
    // case: stream not found in allocator map after unregister
    ret = aclrtAllocatorGetByStream(stream, &aclrt_desc, nullptr, nullptr, nullptr, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
    ret = aclrtAllocatorDestroyDesc(allocatorDesc);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetArgsFromExceptionInfo_failed_with_invalid_exception_type)
{
    void *devArgs = nullptr;
    uint32_t devArgsLen = 0;
    aclrtExceptionInfo exceptionInfo;
    (void)memset_s(&exceptionInfo, sizeof(aclrtExceptionInfo), 0, sizeof(aclrtExceptionInfo));

    // 测试 RT_EXCEPTION_INVALID (0) 类型
    exceptionInfo.expandInfo.type = RT_EXCEPTION_INVALID;
    auto ret = aclrtGetArgsFromExceptionInfo(&exceptionInfo, &devArgs, &devArgsLen);
    EXPECT_EQ(ret, static_cast<aclError>(0xFFFFFFFFU));  // ACL_ERROR_INVALID_EXCEPTION_INFO

    // 测试 RT_EXCEPTION_UB 类型
    exceptionInfo.expandInfo.type = RT_EXCEPTION_UB;
    ret = aclrtGetArgsFromExceptionInfo(&exceptionInfo, &devArgs, &devArgsLen);
    EXPECT_EQ(ret, static_cast<aclError>(0xFFFFFFFFU));

    // 测试 RT_EXCEPTION_CCU 类型
    exceptionInfo.expandInfo.type = RT_EXCEPTION_CCU;
    ret = aclrtGetArgsFromExceptionInfo(&exceptionInfo, &devArgs, &devArgsLen);
    EXPECT_EQ(ret, static_cast<aclError>(0xFFFFFFFFU));

    // 测试 RT_EXCEPTION_FUSION 但 fusionInfo.type 不是 RT_FUSION_AICORE_CCU
    exceptionInfo.expandInfo.type = RT_EXCEPTION_FUSION;
    exceptionInfo.expandInfo.u.fusionInfo.type = RT_FUSION_AICORE_AICPU;  // 不是 RT_FUSION_AICORE_CCU
    ret = aclrtGetArgsFromExceptionInfo(&exceptionInfo, &devArgs, &devArgsLen);
    EXPECT_EQ(ret, static_cast<aclError>(0xFFFFFFFFU));
}

TEST_F(UTEST_ACL_Runtime, aclrtAllocatorCreateDescTest)
{
    aclrtStream stream = (aclrtStream)0x01;
    auto allocatorDesc = aclrtAllocatorCreateDesc();
    EXPECT_NE(allocatorDesc, nullptr);
    static_cast<ExternalAllocatorDesc *>(allocatorDesc)->obj = nullptr;
    static_cast<ExternalAllocatorDesc *>(allocatorDesc)->allocFunc = nullptr;
    static_cast<ExternalAllocatorDesc *>(allocatorDesc)->freeFunc = nullptr;
    static_cast<ExternalAllocatorDesc *>(allocatorDesc)->getAddrFromBlockFunc = nullptr;

    aclError ret = aclrtAllocatorRegister(stream, allocatorDesc);
    EXPECT_NE(ret, ACL_SUCCESS);

    void *obj = (void *)0x10;
    ret = aclrtAllocatorSetObjToDesc(allocatorDesc, obj);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_EQ(static_cast<ExternalAllocatorDesc *>(allocatorDesc)->obj, obj);

    ret = aclrtAllocatorRegister(stream, allocatorDesc);
    EXPECT_NE(ret, ACL_SUCCESS);

    aclrtAllocatorAllocFunc alloc_func = (aclrtAllocatorAllocFunc)0x20;
    ret = aclrtAllocatorSetAllocFuncToDesc(allocatorDesc, alloc_func);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_EQ(static_cast<ExternalAllocatorDesc *>(allocatorDesc)->allocFunc, alloc_func);

    ret = aclrtAllocatorRegister(stream, allocatorDesc);
    EXPECT_NE(ret, ACL_SUCCESS);

    aclrtAllocatorFreeFunc free_func = (aclrtAllocatorFreeFunc)0x30;
    ret = aclrtAllocatorSetFreeFuncToDesc(allocatorDesc, free_func);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_EQ(static_cast<ExternalAllocatorDesc *>(allocatorDesc)->freeFunc, free_func);

    aclrtAllocatorAllocAdviseFunc alloc_advise_func = (aclrtAllocatorAllocAdviseFunc)0x40;
    ret = aclrtAllocatorSetAllocAdviseFuncToDesc(allocatorDesc, alloc_advise_func);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_EQ(static_cast<ExternalAllocatorDesc *>(allocatorDesc)->allocAdviseFunc, alloc_advise_func);

    ret = aclrtAllocatorRegister(stream, static_cast<ExternalAllocatorDesc *>(allocatorDesc));
    EXPECT_NE(ret, ACL_SUCCESS);

    aclrtAllocatorGetAddrFromBlockFunc get_addr_from_block_func = (aclrtAllocatorGetAddrFromBlockFunc)0x50;
    ret = aclrtAllocatorSetGetAddrFromBlockFuncToDesc(allocatorDesc, get_addr_from_block_func);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_EQ(static_cast<ExternalAllocatorDesc *>(allocatorDesc)->getAddrFromBlockFunc, get_addr_from_block_func);

    ret = aclrtAllocatorRegister(stream, static_cast<ExternalAllocatorDesc *>(allocatorDesc));
    EXPECT_EQ(ret, ACL_SUCCESS);

    aclrtAllocatorDesc aclrt_desc;
    ExternalAllocatorDesc desc;
    ret = aclrtAllocatorGetByStream(stream, &aclrt_desc, nullptr, nullptr, nullptr, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclrtAllocatorGetByStream(stream, &aclrt_desc, &desc.obj, &desc.allocFunc, &desc.freeFunc,
         &desc.allocAdviseFunc, &desc.getAddrFromBlockFunc);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_EQ(allocatorDesc, aclrt_desc);
    ret = aclrtAllocatorDestroyDesc(allocatorDesc);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclrtAllocatorGetByStream(stream, &aclrt_desc, &desc.obj, &desc.allocFunc, &desc.freeFunc,
         &desc.allocAdviseFunc, &desc.getAddrFromBlockFunc);
    EXPECT_EQ(allocatorDesc, aclrt_desc);
    EXPECT_EQ(desc.obj, obj);
    EXPECT_EQ(desc.allocFunc, alloc_func);
    EXPECT_EQ(desc.freeFunc, free_func);
    EXPECT_EQ(desc.allocAdviseFunc, alloc_advise_func);
    EXPECT_EQ(desc.getAddrFromBlockFunc, get_addr_from_block_func);

    ret = aclrtAllocatorRegister(nullptr, static_cast<ExternalAllocatorDesc *>(allocatorDesc));
    EXPECT_NE(ret, ACL_SUCCESS);

    ret = aclrtAllocatorUnregister(stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtAllocatorUnregister(nullptr);
    EXPECT_NE(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetDeviceUtilizationRate)
{
    const int32_t devId = 1;
    aclrtUtilizationInfo utilInfo;
    aclrtUtilizationExtendInfo utilizationExtend;
    utilInfo.utilizationExtend = &utilizationExtend;
    aclError ret = aclrtGetDeviceUtilizationRate(devId, &utilInfo);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    utilInfo.utilizationExtend = nullptr;
    ret = aclrtGetDeviceUtilizationRate(devId, &utilInfo);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetAllUtilizations(_,_,_))
        .WillOnce(Return(ACL_ERROR_INVALID_PARAM))
        .WillOnce(Return(ACL_ERROR_RT_FEATURE_NOT_SUPPORT))
        .WillRepeatedly(Return(RT_ERROR_NONE));
    ret = aclrtGetDeviceUtilizationRate(devId, &utilInfo);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, virtual_memory_address_reserve_release)
{
    void *virPtr = nullptr;
    size_t size = 1;

    aclError ret = aclrtReserveMemAddress(&virPtr, size, 0, nullptr, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(virPtr, nullptr);

    ret = aclrtReleaseMemAddress(virPtr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtReserveMemAddress(&virPtr, 0, 0, nullptr, 0);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtReserveMemAddress(&virPtr, size, 0, nullptr, 2);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtReserveMemAddress(_,_,_,_,_))
        .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
    ret = aclrtReserveMemAddress(&virPtr, size, 0, nullptr, 0);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtReserveMemAddress(_,_,_,_,_))
        .WillOnce(Return(ACL_ERROR_RT_FEATURE_NOT_SUPPORT));
    ret = aclrtReserveMemAddress(&virPtr, size, 0, nullptr, 0);
    EXPECT_EQ(ret, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtReleaseMemAddress(_))
        .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
    ret = aclrtReleaseMemAddress(virPtr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, physical_memory_malloc_free)
{
    aclrtDrvMemHandle handle = nullptr;
    size_t size = 1;
    aclrtPhysicalMemProp prop = {};
    prop.handleType = ACL_MEM_HANDLE_TYPE_NONE;
    prop.allocationType = ACL_MEM_ALLOCATION_TYPE_PINNED;
    prop.memAttr = ACL_HBM_MEM_HUGE;
    prop.location.type = ACL_MEM_LOCATION_TYPE_DEVICE;
    prop.location.id = 0;

    aclError ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(handle, nullptr);

    prop.memAttr = ACL_HBM_MEM_NORMAL;
    ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(handle, nullptr);

    prop.memAttr = ACL_DDR_MEM;
    ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    prop.memAttr = ACL_HBM_MEM_HUGE;

    prop.handleType = (aclrtMemHandleType)100;
    ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
    prop.handleType = ACL_MEM_HANDLE_TYPE_NONE;

    prop.allocationType = (aclrtMemAllocationType)100;
    ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    prop.location.type = ACL_MEM_LOCATION_TYPE_UNREGISTERED;
    ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    prop.allocationType = ACL_MEM_ALLOCATION_TYPE_PINNED;

    ret = aclrtFreePhysical(handle);
    EXPECT_EQ(ret, ACL_SUCCESS);

    prop.location.type = ACL_MEM_LOCATION_TYPE_DEVICE;
    ret = aclrtMallocPhysical(&handle, 0, &prop, 0);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMallocPhysical(&handle, size, &prop, 1);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMallocPhysical(_,_,_,_))
        .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
    ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtFreePhysical(_))
        .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
    ret = aclrtFreePhysical(handle);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, physical_memory_malloc_host)
{
    aclrtDrvMemHandle handle = nullptr;
    size_t size = 1;
    aclrtPhysicalMemProp prop = {};
    prop.handleType = ACL_MEM_HANDLE_TYPE_NONE;
    prop.allocationType = ACL_MEM_ALLOCATION_TYPE_PINNED;
    prop.location.type = ACL_MEM_LOCATION_TYPE_HOST_NUMA;
    prop.location.id = 0;
    
    prop.memAttr = ACL_DDR_MEM_HUGE;
    aclError ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(handle, nullptr);

    prop.memAttr = ACL_DDR_MEM_NORMAL;
    ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(handle, nullptr);

    prop.memAttr = ACL_DDR_MEM_P2P_HUGE;
    ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(handle, nullptr);

    prop.memAttr = ACL_DDR_MEM_P2P_NORMAL;
    ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(handle, nullptr);

    prop.memAttr = ACL_MEM_NORMAL;
    ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(handle, nullptr);

    prop.memAttr = ACL_MEM_HUGE;
    ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(handle, nullptr);

    prop.memAttr = ACL_MEM_HUGE1G;
    ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(handle, nullptr);

    prop.memAttr = ACL_MEM_P2P_NORMAL;
    ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(handle, nullptr);

    prop.memAttr = ACL_MEM_P2P_HUGE;
    ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(handle, nullptr);

    prop.memAttr = ACL_MEM_P2P_HUGE1G;
    ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(handle, nullptr);
}

TEST_F(UTEST_ACL_Runtime, physical_memory_malloc_device)
{
    aclrtDrvMemHandle handle = nullptr;
    size_t size = 1;
    aclrtPhysicalMemProp prop = {};
    prop.handleType = ACL_MEM_HANDLE_TYPE_NONE;
    prop.allocationType = ACL_MEM_ALLOCATION_TYPE_PINNED;
    prop.location.type = ACL_MEM_LOCATION_TYPE_DEVICE;
    prop.location.id = 0;

    prop.memAttr = ACL_MEM_NORMAL;
    aclError ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(handle, nullptr);

    prop.memAttr = ACL_MEM_HUGE;
    ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(handle, nullptr);

    prop.memAttr = ACL_MEM_HUGE1G;
    ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(handle, nullptr);

    prop.memAttr = ACL_MEM_P2P_NORMAL;
    ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(handle, nullptr);

    prop.memAttr = ACL_MEM_P2P_HUGE;
    ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(handle, nullptr);

    prop.memAttr = ACL_MEM_P2P_HUGE1G;
    ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(handle, nullptr);

    prop.memAttr = ACL_DDR_MEM_NORMAL;
    ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
    EXPECT_NE(handle, nullptr);

}

TEST_F(UTEST_ACL_Runtime, virtual_physical_memory_map_unmap)
{
    void *virPtr = nullptr;
    size_t size = 1;

    aclError ret = aclrtReserveMemAddress(&virPtr, size, 0, nullptr, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(virPtr, nullptr);    

    aclrtDrvMemHandle handle = nullptr;
    aclrtPhysicalMemProp prop = {};
    prop.allocationType = ACL_MEM_ALLOCATION_TYPE_PINNED;
    prop.memAttr = ACL_HBM_MEM_HUGE;
    prop.location.type = ACL_MEM_LOCATION_TYPE_DEVICE;
    prop.location.id = 0;

    ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(handle, nullptr);

    ret = aclrtMapMem(virPtr, size, 0, handle, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtUnmapMem(virPtr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMapMem(virPtr, 0, 0, handle, 0);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMapMem(virPtr, size, 0, handle, 1);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtReleaseMemAddress(virPtr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtFreePhysical(handle);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMapMem(_,_,_,_,_))
        .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
    ret = aclrtMapMem(virPtr, size, 0, handle, 0);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtUnmapMem(_))
        .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
    ret = aclrtUnmapMem(virPtr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, create_binary_failed_with_nullptr_input)
{
  aclrtBinary binary = nullptr;
  binary = aclrtCreateBinary(nullptr, 0);
  EXPECT_EQ(binary, nullptr);
}

TEST_F(UTEST_ACL_Runtime, create_binary_successful)
{
  aclrtBinary binary = nullptr;
  char *data = new char[100];
  size_t dataLen = 0x333;
  binary = aclrtCreateBinary(static_cast<void *>(data), dataLen);
  EXPECT_NE(binary, nullptr);

  (void)aclrtDestroyBinary(binary);
  delete [] data;
}

TEST_F(UTEST_ACL_Runtime, destroy_binary_failed_with_nullptr_input)
{
  aclrtBinary binary = nullptr;
  aclError ret = aclrtDestroyBinary(binary);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, destroy_binary_successful)
{
  char *data = reinterpret_cast<char *>(0x01);
  size_t dataLen = 0x333;
  aclrtBinary binary = aclrtCreateBinary(static_cast<void *>(data), dataLen);
  EXPECT_NE(binary, nullptr);

  aclError ret = aclrtDestroyBinary(binary);
  EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, load_binary_failed_with_nullptr_input)
{
  aclrtBinary binary = nullptr;
  aclrtBinHandle *binHandle = nullptr;
  aclError ret = aclrtBinaryLoad(binary, binHandle);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

  char *data = reinterpret_cast<char *>(0x01);
  size_t dataLen = 0x333;
  binary = aclrtCreateBinary(static_cast<void *>(data), dataLen);
  EXPECT_NE(binary, nullptr);

  ret = aclrtBinaryLoad(binary, binHandle);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

  (void)aclrtDestroyBinary(binary);
}

TEST_F(UTEST_ACL_Runtime, load_binary_successful)
{
  char *data = reinterpret_cast<char *>(0x01);
  size_t dataLen = 0x333;
  aclrtBinary binary = aclrtCreateBinary(static_cast<void *>(data), dataLen);
  EXPECT_NE(binary, nullptr);

  aclrtBinHandle binHandle = nullptr;
  aclError ret = aclrtBinaryLoad(binary, &binHandle);
  EXPECT_EQ(ret, ACL_SUCCESS);
  EXPECT_NE(binHandle, nullptr);

  (void)aclrtDestroyBinary(binary);
}

TEST_F(UTEST_ACL_Runtime, load_binary_failed_with_rt_func_failed)
{
  char *data = reinterpret_cast<char *>(0x01);
  size_t dataLen = 0x333;
  aclrtBinary binary = aclrtCreateBinary(static_cast<void *>(data), dataLen);
  EXPECT_NE(binary, nullptr);

  aclrtBinHandle binHandle = nullptr;

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtBinaryLoadWithoutTilingKey(_, _, _))
          .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
  aclError ret = aclrtBinaryLoad(binary, &binHandle);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

  (void)aclrtDestroyBinary(binary);
}

TEST_F(UTEST_ACL_Runtime, unload_binary_failed_with_nullptr_input)
{
  aclrtBinHandle *binHandle = nullptr;
  aclError ret = aclrtBinaryUnLoad(binHandle);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, unload_binary_successful)
{
  aclrtBinHandle binHandlePtr;
  aclrtBinHandle *binHandle = &binHandlePtr;

  aclError ret = aclrtBinaryUnLoad(binHandle);
  EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, unload_binary_failed_with_rt_func_failed)
{
  aclrtBinHandle binHandlePtr;
  aclrtBinHandle *binHandle = &binHandlePtr;

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtBinaryUnLoad(_))
          .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
  aclError ret = aclrtBinaryUnLoad(binHandle);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, binary_get_func_failed_with_nullptr_input)
{
  aclrtBinHandle binHandle = nullptr;
  const char *kernelName = nullptr;
  aclrtFuncHandle *funcHandle = nullptr;
  aclError ret = aclrtBinaryGetFunction(binHandle, kernelName, funcHandle);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

  binHandle = (aclrtBinHandle)0x01U;
  ret = aclrtBinaryGetFunction(binHandle, kernelName, funcHandle);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

  kernelName = "add_0";
  ret = aclrtBinaryGetFunction(binHandle, kernelName, funcHandle);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, binary_get_func_successful)
{
  aclrtBinHandle binHandle = (aclrtBinHandle)0x01U;
  const char *kernelName = "add_0";
  aclrtFuncHandle funcHandle = nullptr;
  aclError ret = aclrtBinaryGetFunction(binHandle, kernelName, &funcHandle);
  EXPECT_EQ(ret, ACL_SUCCESS);
  EXPECT_NE(funcHandle, nullptr);
}

TEST_F(UTEST_ACL_Runtime, binary_get_func_failed_with_rt_func_failed)
{
  aclrtBinHandle binHandle = (aclrtBinHandle)0x01U;
  const char *kernelName = "add_0";
  aclrtFuncHandle funcHandle = nullptr;

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsFuncGetByName(_, _, _))
          .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
  aclError ret = aclrtBinaryGetFunction(binHandle, kernelName, &funcHandle);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, launch_kernel_failed_with_nullptr_input)
{
  aclrtFuncHandle funcHandle = nullptr;
  void *argsData = nullptr;
  aclrtStream stream = nullptr;
  aclError ret = aclrtLaunchKernel(funcHandle, 0, argsData, 0, stream);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

  funcHandle = (aclrtFuncHandle)0x01U;
  ret = aclrtLaunchKernel(funcHandle, 0, argsData, 0, stream);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

  argsData = reinterpret_cast<void *>(0x01U);
  ret = aclrtLaunchKernel(funcHandle, 0, argsData, 0, stream);
  EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, launch_kernel_successful)
{
  aclrtFuncHandle funcHandle = (aclrtFuncHandle)0x01U;
  void *argsData = reinterpret_cast<void *>(0x01U);
  aclrtStream stream = (aclrtStream)0x01U;
  uint32_t blockDim = 24;
  size_t argsSize = 100;
  aclError ret = aclrtLaunchKernel(funcHandle, blockDim, argsData, argsSize, stream);
  EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, launch_kernel_failed_with_rt_launch_kernel_func_failed)
{
  aclrtFuncHandle funcHandle = (aclrtFuncHandle)0x01U;
  void *argsData = reinterpret_cast<void *>(0x01U);
  aclrtStream stream = (aclrtStream)0x01U;
  uint32_t blockDim = 24;
  size_t argsSize = 100;

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtLaunchKernelByFuncHandleV3(_, _, _, _, _))
          .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
  aclError ret = aclrtLaunchKernel(funcHandle, blockDim, argsData, argsSize, stream);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, launch_kernel_failed_with_rt_launch_kernel_func_failed_2)
{
    aclrtFuncHandle funcHandle = (aclrtFuncHandle)0x01U;
    void *argsData = reinterpret_cast<void *>(0x01U);
    aclrtStream stream = (aclrtStream)0x01U;
    uint32_t blockDim = 24;
    size_t argsSize = 100;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtLaunchKernelByFuncHandleV3(_, _, _, _, _))
            .WillOnce(Return(ACL_ERROR_RT_INVALID_HANDLE));
    aclError ret = aclrtLaunchKernel(funcHandle, blockDim, argsData, argsSize, stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_INVALID_HANDLE);
}

TEST_F(UTEST_ACL_Runtime, launch_simt_kernel_with_args_array_failed_with_nullptr)
{
    void *func = nullptr;
    aclrtDim3 gridDim = {1, 1, 1};
    aclrtDim3 blockDim = {1, 1, 1};
    size_t dynUbufSize = 0;
    aclrtStream stream = nullptr;
    aclrtLaunchKernelCfg *cfg = nullptr;
    void *args[2] = {(void *)0x10, (void *)0x20};

    aclError ret = aclrtLaunchSIMTKernelWithArgsArray(func, gridDim, blockDim, dynUbufSize, stream, cfg, args);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, launch_simt_kernel_with_args_array_successful)
{
    void *func = (void *)0x01U;
    aclrtDim3 gridDim = {2, 2, 2};
    aclrtDim3 blockDim = {4, 4, 4};
    size_t dynUbufSize = 1024;
    aclrtStream stream = (aclrtStream)0x01U;
    aclrtLaunchKernelCfg *cfg = nullptr;
    void *args[2] = {(void *)0x10, (void *)0x20};

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtLaunchSIMTKernelWithArgsArray(_, _, _, _, _, _, _))
            .WillOnce(Return(RT_ERROR_NONE));
    aclError ret = aclrtLaunchSIMTKernelWithArgsArray(func, gridDim, blockDim, dynUbufSize, stream, cfg, args);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, launch_simt_kernel_with_args_array_failed_with_invalid_handle)
{
    void *func = (void *)0x01U;
    aclrtDim3 gridDim = {1, 1, 1};
    aclrtDim3 blockDim = {1, 1, 1};
    size_t dynUbufSize = 0;
    aclrtStream stream = nullptr;
    aclrtLaunchKernelCfg *cfg = nullptr;
    void *args[2] = {(void *)0x10, (void *)0x20};

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtLaunchSIMTKernelWithArgsArray(_, _, _, _, _, _, _))
            .WillOnce(Return(ACL_ERROR_RT_INVALID_HANDLE));
    aclError ret = aclrtLaunchSIMTKernelWithArgsArray(func, gridDim, blockDim, dynUbufSize, stream, cfg, args);
    EXPECT_EQ(ret, ACL_ERROR_RT_INVALID_HANDLE);
}

TEST_F(UTEST_ACL_Runtime, launch_simt_kernel_with_args_array_failed_with_feature_not_support)
{
    void *func = (void *)0x01U;
    aclrtDim3 gridDim = {1, 1, 1};
    aclrtDim3 blockDim = {1, 1, 1};
    size_t dynUbufSize = 0;
    aclrtStream stream = nullptr;
    aclrtLaunchKernelCfg *cfg = nullptr;
    void *args[2] = {(void *)0x10, (void *)0x20};

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtLaunchSIMTKernelWithArgsArray(_, _, _, _, _, _, _))
            .WillOnce(Return(ACL_ERROR_RT_FEATURE_NOT_SUPPORT));
    aclError ret = aclrtLaunchSIMTKernelWithArgsArray(func, gridDim, blockDim, dynUbufSize, stream, cfg, args);
    EXPECT_EQ(ret, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
}

TEST_F(UTEST_ACL_Runtime, launch_simt_kernel_with_args_array_failed_with_other_error)
{
    void *func = (void *)0x01U;
    aclrtDim3 gridDim = {1, 1, 1};
    aclrtDim3 blockDim = {1, 1, 1};
    size_t dynUbufSize = 0;
    aclrtStream stream = nullptr;
    aclrtLaunchKernelCfg *cfg = nullptr;
    void *args[2] = {(void *)0x10, (void *)0x20};

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtLaunchSIMTKernelWithArgsArray(_, _, _, _, _, _, _))
            .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    aclError ret = aclrtLaunchSIMTKernelWithArgsArray(func, gridDim, blockDim, dynUbufSize, stream, cfg, args);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, launch_simt_kernel_with_host_args_failed_with_nullptr_func)
{
    void *func = nullptr;
    aclrtDim3 gridDim = {1, 1, 1};
    aclrtDim3 blockDim = {1, 1, 1};
    size_t dynUbufSize = 0;
    aclrtStream stream = nullptr;
    aclrtLaunchKernelCfg *cfg = nullptr;
    char hostArgs[128];
    aclrtPlaceHolderInfo placeHolders[2];

    aclError ret = aclrtLaunchSIMTKernelWithHostArgs(func, gridDim, blockDim, dynUbufSize, stream, cfg,
                                                      hostArgs, 128, placeHolders, 2);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, launch_simt_kernel_with_host_args_failed_with_nullptr_hostargs)
{
    void *func = (void *)0x01U;
    aclrtDim3 gridDim = {1, 1, 1};
    aclrtDim3 blockDim = {1, 1, 1};
    size_t dynUbufSize = 0;
    aclrtStream stream = nullptr;
    aclrtLaunchKernelCfg *cfg = nullptr;
    void *hostArgs = nullptr;
    aclrtPlaceHolderInfo placeHolders[2];

    aclError ret = aclrtLaunchSIMTKernelWithHostArgs(func, gridDim, blockDim, dynUbufSize, stream, cfg,
                                                      hostArgs, 128, placeHolders, 2);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, launch_simt_kernel_with_host_args_failed_with_args_size_zero)
{
    void *func = (void *)0x01U;
    aclrtDim3 gridDim = {1, 1, 1};
    aclrtDim3 blockDim = {1, 1, 1};
    size_t dynUbufSize = 0;
    aclrtStream stream = nullptr;
    aclrtLaunchKernelCfg *cfg = nullptr;
    char hostArgs[128];
    aclrtPlaceHolderInfo placeHolders[2];

    aclError ret = aclrtLaunchSIMTKernelWithHostArgs(func, gridDim, blockDim, dynUbufSize, stream, cfg,
                                                      hostArgs, 0, placeHolders, 2);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, launch_simt_kernel_with_host_args_successful)
{
    void *func = (void *)0x01U;
    aclrtDim3 gridDim = {2, 2, 2};
    aclrtDim3 blockDim = {4, 4, 4};
    size_t dynUbufSize = 2048;
    aclrtStream stream = (aclrtStream)0x01U;
    aclrtLaunchKernelCfg *cfg = nullptr;
    char hostArgs[128];
    aclrtPlaceHolderInfo placeHolders[2];

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtLaunchSIMTKernelWithHostArgs(_, _, _, _, _, _, _, _, _, _))
            .WillOnce(Return(RT_ERROR_NONE));
    aclError ret = aclrtLaunchSIMTKernelWithHostArgs(func, gridDim, blockDim, dynUbufSize, stream, cfg,
                                                      hostArgs, 128, placeHolders, 2);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, launch_simt_kernel_with_host_args_failed_with_invalid_handle)
{
    void *func = (void *)0x01U;
    aclrtDim3 gridDim = {1, 1, 1};
    aclrtDim3 blockDim = {1, 1, 1};
    size_t dynUbufSize = 0;
    aclrtStream stream = nullptr;
    aclrtLaunchKernelCfg *cfg = nullptr;
    char hostArgs[128];
    aclrtPlaceHolderInfo placeHolders[2];

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtLaunchSIMTKernelWithHostArgs(_, _, _, _, _, _, _, _, _, _))
            .WillOnce(Return(ACL_ERROR_RT_INVALID_HANDLE));
    aclError ret = aclrtLaunchSIMTKernelWithHostArgs(func, gridDim, blockDim, dynUbufSize, stream, cfg,
                                                      hostArgs, 128, placeHolders, 2);
    EXPECT_EQ(ret, ACL_ERROR_RT_INVALID_HANDLE);
}

TEST_F(UTEST_ACL_Runtime, launch_simt_kernel_with_host_args_failed_with_feature_not_support)
{
    void *func = (void *)0x01U;
    aclrtDim3 gridDim = {1, 1, 1};
    aclrtDim3 blockDim = {1, 1, 1};
    size_t dynUbufSize = 0;
    aclrtStream stream = nullptr;
    aclrtLaunchKernelCfg *cfg = nullptr;
    char hostArgs[128];
    aclrtPlaceHolderInfo placeHolders[2];

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtLaunchSIMTKernelWithHostArgs(_, _, _, _, _, _, _, _, _, _))
            .WillOnce(Return(ACL_ERROR_RT_FEATURE_NOT_SUPPORT));
    aclError ret = aclrtLaunchSIMTKernelWithHostArgs(func, gridDim, blockDim, dynUbufSize, stream, cfg,
                                                      hostArgs, 128, placeHolders, 2);
    EXPECT_EQ(ret, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
}

TEST_F(UTEST_ACL_Runtime, launch_simt_kernel_with_host_args_failed_with_other_error)
{
    void *func = (void *)0x01U;
    aclrtDim3 gridDim = {1, 1, 1};
    aclrtDim3 blockDim = {1, 1, 1};
    size_t dynUbufSize = 0;
    aclrtStream stream = nullptr;
    aclrtLaunchKernelCfg *cfg = nullptr;
    char hostArgs[128];
    aclrtPlaceHolderInfo placeHolders[2];

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtLaunchSIMTKernelWithHostArgs(_, _, _, _, _, _, _, _, _, _))
            .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    aclError ret = aclrtLaunchSIMTKernelWithHostArgs(func, gridDim, blockDim, dynUbufSize, stream, cfg,
                                                      hostArgs, 128, placeHolders, 2);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, export_to_shareablehandle_failed_with_rt_func_failed)
{
  aclrtDrvMemHandle handle = (aclrtDrvMemHandle)0x01U;
  aclrtMemHandleType handleType = ACL_MEM_HANDLE_TYPE_NONE;
  uint64_t flag = 0ULL;
  uint64_t shareableHandle;

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsMemExportToShareableHandle(_, _, _, _))
          .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
  aclError ret = aclrtMemExportToShareableHandle(handle, handleType, flag, &shareableHandle);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, export_to_shareablehandle_succ_with_rt_func_succ)
{
  aclrtDrvMemHandle handle = (aclrtDrvMemHandle)0x01U;
  aclrtMemHandleType handleType = ACL_MEM_HANDLE_TYPE_NONE;
  uint64_t flag = 0ULL;
  uint64_t shareableHandle;

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsMemExportToShareableHandle(_, _, _, _))
          .WillOnce(Return(RT_ERROR_NONE));
  aclError ret = aclrtMemExportToShareableHandle(handle, handleType, flag, &shareableHandle);
  EXPECT_EQ(ret, ACL_SUCCESS);
  EXPECT_EQ(shareableHandle, 0x1111);
}

TEST_F(UTEST_ACL_Runtime, export_to_shareablehandle_failed_with_handle_nullptr)
{
  aclrtDrvMemHandle handle = nullptr;
  aclrtMemHandleType handleType = ACL_MEM_HANDLE_TYPE_NONE;
  uint64_t flag = 0ULL;
  uint64_t shareableHandle;

  aclError ret = aclrtMemExportToShareableHandle(handle, handleType, flag, &shareableHandle);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, export_to_shareablehandle_failed_with_invalid_handleType)
{
  aclrtDrvMemHandle handle = (aclrtDrvMemHandle)0x01U;
  aclrtMemHandleType handleType = static_cast<aclrtMemHandleType>(0xFFFFFFFF);
  uint64_t flag = 0ULL;
  uint64_t shareableHandle;

  aclError ret = aclrtMemExportToShareableHandle(handle, handleType, flag, &shareableHandle);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, export_to_shareablehandle_V2_failed_with_rt_func_failed)
{
  aclrtDrvMemHandle handle = (aclrtDrvMemHandle)0x01U;
  aclrtMemSharedHandleType shareType = ACL_MEM_SHARE_HANDLE_TYPE_DEFAULT;
  uint64_t flag = 0ULL;
  uint64_t shareableHandle;

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemExportToShareableHandleV2(_, _, _, _))
    .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
  aclError ret = aclrtMemExportToShareableHandleV2(handle, flag, shareType, static_cast<void*>(&shareableHandle));
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, export_to_shareablehandle_V2_succ_with_rt_func_succ)
{
  aclrtDrvMemHandle handle = (aclrtDrvMemHandle)0x01U;
  aclrtMemSharedHandleType shareType = ACL_MEM_SHARE_HANDLE_TYPE_DEFAULT;
  uint64_t flag = 0ULL;
  uint64_t shareableHandle;

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemExportToShareableHandleV2(_, _, _, _))
    .WillOnce(Return(ACL_RT_SUCCESS));
  aclError ret = aclrtMemExportToShareableHandleV2(handle, flag, shareType, static_cast<void*>(&shareableHandle));
  EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, export_to_shareablehandle_V2_failed_with_handle_nullptr)
{
  aclrtDrvMemHandle handle = nullptr;
  aclrtMemSharedHandleType shareType = ACL_MEM_SHARE_HANDLE_TYPE_DEFAULT;
  uint64_t flag = 0ULL;
  uint64_t shareableHandle;

  aclError ret = aclrtMemExportToShareableHandleV2(handle, flag, shareType, static_cast<void*>(&shareableHandle));
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, import_from_shareablehandle_succ_with_rt_func_succ)
{
  aclrtDrvMemHandle handle = nullptr;
  uint64_t shareableHandle = 0ULL;

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemImportFromShareableHandle(_, _, _))
          .WillOnce(Return(RT_ERROR_NONE));
  aclError ret = aclrtMemImportFromShareableHandle(shareableHandle, 0, &handle);
  EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, import_from_shareablehandle_failed_with_rt_func_failed)
{
  aclrtDrvMemHandle handle = nullptr;
  uint64_t shareableHandle = 0ULL;

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemImportFromShareableHandle(_, _, _))
          .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
  aclError ret = aclrtMemImportFromShareableHandle(shareableHandle, 0, &handle);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, import_from_shareablehandle_failed_with_handle_nullptr)
{
  uint64_t shareableHandle = 0ULL;
  aclError ret = aclrtMemImportFromShareableHandle(shareableHandle, 0, nullptr);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, import_from_shareablehandle_V2_succ_with_rts_func_succ)
{
  aclrtDrvMemHandle handle = (aclrtDrvMemHandle)0x01U;
  uint64_t shareableHandle = 0ULL;
  aclrtMemSharedHandleType shareType = ACL_MEM_SHARE_HANDLE_TYPE_DEFAULT;
  uint64_t flag = 0ULL;

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemImportFromShareableHandleV2(_, _, _, _, _))
    .WillOnce(Return(ACL_RT_SUCCESS));
  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsGetDevice(_))
    .WillOnce(Return(ACL_RT_SUCCESS));
  aclError ret = aclrtMemImportFromShareableHandleV2(static_cast<void*>(&shareableHandle), shareType, flag, &handle);
  EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, import_from_shareablehandle_V2_failed_with_rts_func_failed)
{
  aclrtDrvMemHandle handle = (aclrtDrvMemHandle)0x01U;
  uint64_t shareableHandle = 0ULL;
  aclrtMemSharedHandleType shareType = ACL_MEM_SHARE_HANDLE_TYPE_DEFAULT;
  uint64_t flag = 0ULL;

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsGetDevice(_))
    .WillOnce(Return(ACL_RT_SUCCESS));
  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemImportFromShareableHandleV2(_, _, _, _, _))
    .WillOnce(Return(ACL_ERROR_INVALID_PARAM));

  aclError ret = aclrtMemImportFromShareableHandleV2(static_cast<void*>(&shareableHandle), shareType, flag, &handle);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, import_from_shareablehandle_V2_failed_with_handle_nullptr)
{
  uint64_t shareableHandle = 0ULL;
  aclrtMemSharedHandleType shareType = ACL_MEM_SHARE_HANDLE_TYPE_DEFAULT;
  uint64_t flag = 0ULL;

  aclError ret = aclrtMemImportFromShareableHandleV2(static_cast<void*>(&shareableHandle), shareType, flag, nullptr);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, import_from_shareablehandle_V2_failed_with_invalid_flags)
{
  aclrtDrvMemHandle handle = (aclrtDrvMemHandle)0x01U;
  uint64_t shareableHandle = 1ULL;
  aclrtMemSharedHandleType shareType = ACL_MEM_SHARE_HANDLE_TYPE_DEFAULT;
  uint64_t flag = 1ULL;

  aclError ret = aclrtMemImportFromShareableHandleV2(static_cast<void*>(&shareableHandle), shareType, flag, &handle);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, set_pid_to_shareablehandle_succ_with_rt_func_succ)
{
  uint64_t shareableHandle = 0ULL;
  int32_t pid[1] = {0};

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemSetPidToShareableHandle(_, _, _))
    .WillOnce(Return(RT_ERROR_NONE));
  aclError ret = aclrtMemSetPidToShareableHandle(shareableHandle, pid, sizeof(pid)/sizeof(pid[0]));
  EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, set_pid_to_shareablehandle_failed_with_rt_func_failed)
{
  uint64_t shareableHandle = 0ULL;
  int32_t pid[1] = {0};

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemSetPidToShareableHandle(_, _, _))
          .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
  aclError ret = aclrtMemSetPidToShareableHandle(shareableHandle, pid, sizeof(pid)/sizeof(pid[0]));
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, set_pid_to_shareablehandle_failed_with_pid_nullptr)
{
  uint64_t shareableHandle = 0ULL;

  aclError ret = aclrtMemSetPidToShareableHandle(shareableHandle, nullptr, 1);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, set_pid_to_shareablehandle_failed_with_invalid_pidNum)
{
  uint64_t shareableHandle = 0ULL;
  int32_t pid[1] = {0};

  aclError ret = aclrtMemSetPidToShareableHandle(shareableHandle, pid, 0);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, set_pid_to_shareablehandle_V2_succ_with_rts_func_succ)
{
  uint64_t shareableHandle = 0ULL;
  int32_t pid[1] = {0};
  aclrtMemSharedHandleType shareType = ACL_MEM_SHARE_HANDLE_TYPE_DEFAULT;

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemSetPidToShareableHandleV2(_, _, _, _))
    .WillOnce(Return(ACL_RT_SUCCESS)); 
  aclError ret = aclrtMemSetPidToShareableHandleV2(static_cast<void*>(&shareableHandle), shareType, pid, sizeof(pid)/sizeof(pid[0]));
  EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, set_pid_to_shareablehandle_V2_failed_with_rts_func_failed)
{
  uint64_t shareableHandle = 0ULL;
  int32_t pid[1] = {0};
  aclrtMemSharedHandleType shareType = ACL_MEM_SHARE_HANDLE_TYPE_DEFAULT;

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemSetPidToShareableHandleV2(_, _, _, _))
    .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
  aclError ret = aclrtMemSetPidToShareableHandleV2(static_cast<void*>(&shareableHandle), shareType, pid, sizeof(pid)/sizeof(pid[0]));
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, set_pid_to_shareablehandle_V2_failed_with_pid_nullptr)
{
  uint64_t shareableHandle = 0ULL;
  aclrtMemSharedHandleType shareType = ACL_MEM_SHARE_HANDLE_TYPE_DEFAULT;

  aclError ret = aclrtMemSetPidToShareableHandleV2(static_cast<void*>(&shareableHandle), shareType, nullptr, 1);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, set_pid_to_shareablehandle_V2_failed_with_invalid_pidNum)
{
  uint64_t shareableHandle = 0ULL;
  int32_t pid[1] = {0};
  aclrtMemSharedHandleType shareType = ACL_MEM_SHARE_HANDLE_TYPE_DEFAULT;

  aclError ret = aclrtMemSetPidToShareableHandleV2(static_cast<void*>(&shareableHandle), shareType, pid, 0);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, get_allocation_granularity_succ_with_rt_func_succ_hbm)
{
  aclrtPhysicalMemProp prop = {};
  prop.memAttr = ACL_HBM_MEM_HUGE;
  aclrtMemGranularityOptions option = ACL_RT_MEM_ALLOC_GRANULARITY_MINIMUM;
  size_t granularity = 0UL;

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemGetAllocationGranularity(_, _, _))
          .WillOnce(Return(RT_ERROR_NONE));
  aclError ret = aclrtMemGetAllocationGranularity(&prop, option, &granularity);
  EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, get_allocation_granularity_succ_with_rt_func_succ_hbm1g)
{
  aclrtPhysicalMemProp prop = {};
  prop.memAttr = ACL_HBM_MEM_HUGE1G;
  aclrtMemGranularityOptions option = ACL_RT_MEM_ALLOC_GRANULARITY_MINIMUM;
  size_t granularity = 0UL;

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemGetAllocationGranularity(_, _, _))
          .WillOnce(Return(RT_ERROR_NONE));
  aclError ret = aclrtMemGetAllocationGranularity(&prop, option, &granularity);
  EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, get_allocation_granularity_succ_with_rt_func_succ_normal)
{
  aclrtPhysicalMemProp prop = {};
  prop.memAttr = ACL_HBM_MEM_NORMAL;
  aclrtMemGranularityOptions option = ACL_RT_MEM_ALLOC_GRANULARITY_MINIMUM;
  size_t granularity = 0UL;

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemGetAllocationGranularity(_, _, _))
          .WillOnce(Return(RT_ERROR_NONE));
  aclError ret = aclrtMemGetAllocationGranularity(&prop, option, &granularity);
  EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, get_allocation_granularity_failed_with_unsupport_memAttr)
{
  aclrtPhysicalMemProp prop = {};
  prop.memAttr = ACL_HBM_MEM_P2P_NORMAL;
  aclrtMemGranularityOptions option = ACL_RT_MEM_ALLOC_GRANULARITY_MINIMUM;
  size_t granularity = 0UL;

  aclError ret = aclrtMemGetAllocationGranularity(&prop, option, &granularity);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, get_allocation_granularity_failed_with_rt_func_failed)
{
  aclrtPhysicalMemProp prop = {};
  prop.memAttr = ACL_HBM_MEM_NORMAL;
  aclrtMemGranularityOptions option = ACL_RT_MEM_ALLOC_GRANULARITY_MINIMUM;
  size_t granularity = 0UL;

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemGetAllocationGranularity(_, _, _))
          .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
  aclError ret = aclrtMemGetAllocationGranularity(&prop, option, &granularity);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, get_allocation_granularity_failed_with_prop_nullptr)
{
  aclrtMemGranularityOptions option = ACL_RT_MEM_ALLOC_GRANULARITY_MINIMUM;
  size_t granularity = 0UL;

  aclError ret = aclrtMemGetAllocationGranularity(nullptr, option, &granularity);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, get_allocation_granularity_failed_with_granularity_nullptr)
{
  aclrtPhysicalMemProp prop = {};
  prop.memAttr = ACL_HBM_MEM_NORMAL;
  aclrtMemGranularityOptions option = ACL_RT_MEM_ALLOC_GRANULARITY_MINIMUM;

  aclError ret = aclrtMemGetAllocationGranularity(&prop, option, nullptr);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, get_allocation_granularity_failed_with_device_alloc_ddr_mem_huge)
{
  aclrtPhysicalMemProp prop = {};
  prop.location.type = ACL_MEM_LOCATION_TYPE_DEVICE;
  prop.memAttr = ACL_DDR_MEM_HUGE;
  aclrtMemGranularityOptions option = ACL_RT_MEM_ALLOC_GRANULARITY_MINIMUM;
  size_t granularity = 0UL;

  aclError ret = aclrtMemGetAllocationGranularity(&prop, option, &granularity);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, get_allocation_granularity_failed_with_device_alloc_ddr_mem_normal)
{
  aclrtPhysicalMemProp prop = {};
  prop.location.type = ACL_MEM_LOCATION_TYPE_DEVICE;
  prop.memAttr = ACL_DDR_MEM_NORMAL;
  aclrtMemGranularityOptions option = ACL_RT_MEM_ALLOC_GRANULARITY_MINIMUM;
  size_t granularity = 0UL;

  aclError ret = aclrtMemGetAllocationGranularity(&prop, option, &granularity);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, get_allocation_granularity_failed_with_device_alloc_ddr_mem_p2p_huge)
{
  aclrtPhysicalMemProp prop = {};
  prop.location.type = ACL_MEM_LOCATION_TYPE_DEVICE;
  prop.memAttr = ACL_DDR_MEM_P2P_HUGE;
  aclrtMemGranularityOptions option = ACL_RT_MEM_ALLOC_GRANULARITY_MINIMUM;
  size_t granularity = 0UL;

  aclError ret = aclrtMemGetAllocationGranularity(&prop, option, &granularity);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, get_allocation_granularity_failed_with_device_alloc_ddr_mem_p2p_normal)
{
  aclrtPhysicalMemProp prop = {};
  prop.location.type = ACL_MEM_LOCATION_TYPE_DEVICE;
  prop.memAttr = ACL_DDR_MEM_P2P_NORMAL;
  aclrtMemGranularityOptions option = ACL_RT_MEM_ALLOC_GRANULARITY_MINIMUM;
  size_t granularity = 0UL;

  aclError ret = aclrtMemGetAllocationGranularity(&prop, option, &granularity);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, get_tgid_succ_with_rt_func_succ)
{
  int32_t pid = 0;

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtDeviceGetBareTgid(_))
          .WillOnce(Return(RT_ERROR_NONE));
  aclError ret = aclrtDeviceGetBareTgid(&pid);
  EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, get_tgid_failed_with_rt_func_failed)
{
  int32_t pid = 0;

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtDeviceGetBareTgid(_))
          .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
  aclError ret = aclrtDeviceGetBareTgid(&pid);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, get_tgid_failed_with_pid_nullptr)
{
  aclError ret = aclrtDeviceGetBareTgid(nullptr);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, get_mem_uce_info_success)
{
  int32_t deviceId = 0;
  aclrtMemUceInfo memUceInfoArray[RT_MAX_RECORD_PA_NUM_PER_DEV];
  size_t arraySize = RT_MAX_RECORD_PA_NUM_PER_DEV;
  size_t retSize = 0;

  aclError ret = aclrtGetMemUceInfo(deviceId, memUceInfoArray, arraySize, &retSize);
  EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, get_error_verbose_success)
{
    int32_t deviceId = 0;
    aclrtErrorInfo errorInfo;

    aclError ret = aclrtGetErrorVerbose(deviceId, &errorInfo);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, repair_error_success)
{
    int32_t deviceId = 0;
    aclrtErrorInfo errorInfo{};

    aclError ret = aclrtRepairError(deviceId, &errorInfo);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, SnapShotProcessLock_success)
{
    aclError ret = aclrtSnapShotProcessLock(static_cast<int>(mmGetPid()), nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, SnapShotProcessLock_failed)
{
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSnapShotProcessLock())
        .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
    aclError ret = aclrtSnapShotProcessLock(static_cast<int>(mmGetPid()), nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, SnapShotProcessUnlock_success)
{
    aclError ret = aclrtSnapShotProcessUnlock(static_cast<int>(mmGetPid()), nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, SnapShotProcessUnlock_failed)
{
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSnapShotProcessUnlock())
        .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
    aclError ret = aclrtSnapShotProcessUnlock(static_cast<int>(mmGetPid()), nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, SnapShotProcessBackup_success)
{
    aclError ret = aclrtSnapShotProcessBackup(static_cast<int>(mmGetPid()), nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, SnapShotProcessBackup_failed)
{
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSnapShotProcessBackup())
        .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
    aclError ret = aclrtSnapShotProcessBackup(static_cast<int>(mmGetPid()), nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, SnapShotProcessRestore_success)
{
    aclError ret = aclrtSnapShotProcessRestore(static_cast<int>(mmGetPid()), nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, SnapShotProcessRestore_failed)
{
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSnapShotProcessRestore())
        .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
    aclError ret = aclrtSnapShotProcessRestore(static_cast<int>(mmGetPid()), nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, SnapShotCallbackRegister_failed)
{
    aclError ret = aclrtSnapShotCallbackRegister(ACL_RT_SNAPSHOT_LOCK_PRE, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, SnapShotCallbackUnregister_failed)
{
    aclError ret = aclrtSnapShotCallbackUnregister(ACL_RT_SNAPSHOT_LOCK_PRE, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, SnapShotProcessLock_invalid_pid)
{
    aclError ret = aclrtSnapShotProcessLock(9999, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, SnapShotProcessLock_invalid_reserve)
{
    int dummy = 0;
    aclError ret = aclrtSnapShotProcessLock(static_cast<int>(mmGetPid()), &dummy);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, SnapShotProcessBackup_invalid_args)
{
    aclrtSnapShotBackupArgs args = {};
    aclError ret = aclrtSnapShotProcessBackup(static_cast<int>(mmGetPid()), &args);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, SnapShotProcessRestore_invalid_args)
{
    aclrtSnapShotRestoreArgs args = {};
    aclError ret = aclrtSnapShotProcessRestore(static_cast<int>(mmGetPid()), &args);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, get_mem_uce_info__failedwith_invalid_array)
{
  int32_t deviceId = 0;
  size_t arraySize = RT_MAX_RECORD_PA_NUM_PER_DEV - 1;
  size_t retSize = 0;

  aclError ret = aclrtGetMemUceInfo(deviceId, nullptr, arraySize, &retSize);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, get_mem_uce_info_failed_with_invalid_ret_size)
{
  int32_t deviceId = 0;
  aclrtMemUceInfo memUceInfoArray[RT_MAX_RECORD_PA_NUM_PER_DEV];
  size_t arraySize = RT_MAX_RECORD_PA_NUM_PER_DEV;

  aclError ret = aclrtGetMemUceInfo(deviceId, memUceInfoArray, arraySize, nullptr);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

static rtError_t rtGetMemUceInfo_invoke(int32_t deviceId, rtMemUceInfo* rtUceInfo){
  rtUceInfo->devid = deviceId;
  rtUceInfo->count = RT_MAX_RECORD_PA_NUM_PER_DEV + 1;
  return RT_ERROR_NONE;
}

TEST_F(UTEST_ACL_Runtime, get_mem_uce_info_failed_with_space_not_enough)
{
  int32_t deviceId = 0;
  aclrtMemUceInfo memUceInfoArray[RT_MAX_RECORD_PA_NUM_PER_DEV];
  size_t arraySize = RT_MAX_RECORD_PA_NUM_PER_DEV;

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetMemUceInfo(_,_))
        .WillOnce(Invoke(rtGetMemUceInfo_invoke));
  aclError ret = aclrtGetMemUceInfo(deviceId, memUceInfoArray, arraySize, &arraySize);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, get_mem_uce_info_succ_with_valid_addr)
{
  int32_t deviceId = 0;
  aclrtMemUceInfo memUceInfoArray[RT_MAX_RECORD_PA_NUM_PER_DEV + 1];
  size_t arraySize = RT_MAX_RECORD_PA_NUM_PER_DEV + 1;

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetMemUceInfo(_,_))
        .WillOnce(Invoke(rtGetMemUceInfo_invoke));
  aclError ret = aclrtGetMemUceInfo(deviceId, memUceInfoArray, arraySize, &arraySize);
  EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, get_mem_uce_info_failed_with_rts_error)
{
  int32_t deviceId = 0;
  aclrtMemUceInfo memUceInfoArray[RT_MAX_RECORD_PA_NUM_PER_DEV];
  size_t arraySize = RT_MAX_RECORD_PA_NUM_PER_DEV;

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetMemUceInfo(_,_))
        .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
  aclError ret = aclrtGetMemUceInfo(deviceId, memUceInfoArray, arraySize, &arraySize);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, set_device_task_abort_success)
{
  int32_t deviceId = 0;
  uint32_t timeOut = 100;

  aclError ret = aclrtDeviceTaskAbort(deviceId, timeOut);
  EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, set_device_task_abort_failed_with_rts_error)
{
  int32_t deviceId = 0;
  uint32_t timeOut = 100;
  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtDeviceTaskAbort(_,_))
    .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
  aclError ret = aclrtDeviceTaskAbort(deviceId, timeOut);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, mem_uce_repair_success)
{
  int32_t deviceId = 0;
  aclrtMemUceInfo memUceInfoArray[8];
  size_t arraySize = 8;

  for (size_t i = 0; i < arraySize; ++i) {
    (void)memset_s(memUceInfoArray[i].reserved, UCE_INFO_RESERVED_SIZE, 0, UCE_INFO_RESERVED_SIZE);
  }

  aclError ret = aclrtMemUceRepair(deviceId, memUceInfoArray, arraySize);
  EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, mem_uce_repair_failed_with_array_nullptr)
{
  int32_t deviceId = 0;
  size_t arraySize = 8;

  aclError ret = aclrtMemUceRepair(deviceId, nullptr, arraySize);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, mem_uce_repair_failed_with_nonzero_reserved_value)
{
  int32_t deviceId = 0;
  aclrtMemUceInfo memUceInfoArray[8];
  size_t arraySize = 8;

  for (size_t i = 0; i < arraySize; ++i) {
    (void)memset_s(memUceInfoArray[i].reserved, UCE_INFO_RESERVED_SIZE, 0, UCE_INFO_RESERVED_SIZE);
    memUceInfoArray[i].reserved[0] = 1;
  }

  aclError ret = aclrtMemUceRepair(deviceId, memUceInfoArray, arraySize);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, mem_uce_repair_failed_with_invalid_array_size)
{
  int32_t deviceId = 0;
  aclrtMemUceInfo memUceInfoArray[RT_MAX_RECORD_PA_NUM_PER_DEV + 1];
  size_t arraySize = RT_MAX_RECORD_PA_NUM_PER_DEV + 1;

  aclError ret = aclrtMemUceRepair(deviceId, memUceInfoArray, arraySize);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, mem_uce_repair_failed_with_rts_error)
{
  int32_t deviceId = 0;
  aclrtMemUceInfo memUceInfoArray[8] = {};
  size_t arraySize = 8;

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemUceRepair(_,_))
    .WillOnce(Return(ACL_ERROR_INVALID_PARAM));

  aclError ret = aclrtMemUceRepair(deviceId, memUceInfoArray, arraySize);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, cmo_success)
{
  void *devPtr = reinterpret_cast<void *>(0x01U);
  size_t size = 1024UL;
  aclrtStream stream = nullptr;
  aclrtCmoType cmoType = ACL_RT_CMO_TYPE_PREFETCH;

  aclError ret = aclrtCmoAsync(devPtr, size, cmoType, stream);
  EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, cmo_failed_with_null_address)
{
  void *devPtr = nullptr;
  size_t size = 1024UL;
  aclrtStream stream = nullptr;
  aclrtCmoType cmoType = ACL_RT_CMO_TYPE_PREFETCH;

  aclError ret = aclrtCmoAsync(devPtr, size, cmoType, stream);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, cmo_failed_with_zero_size)
{
  void *devPtr = reinterpret_cast<void *>(0x01U);
  size_t size = 0UL;
  aclrtStream stream = nullptr;
  aclrtCmoType cmoType = ACL_RT_CMO_TYPE_PREFETCH;

  aclError ret = aclrtCmoAsync(devPtr, size, cmoType, stream);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, cmo_failed_with_rts_error)
{
  void *devPtr = reinterpret_cast<void *>(0x01U);
  size_t size = 1024UL;
  aclrtStream stream = nullptr;
  aclrtCmoType cmoType = ACL_RT_CMO_TYPE_PREFETCH;

  EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtCmoAsync(_,_,_,_))
    .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
  aclError ret = aclrtCmoAsync(devPtr, size, cmoType, stream);
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtPeekAtLastError)
{
  int32_t level_invalid = 1;
  auto ret = aclrtPeekAtLastError(static_cast<aclrtLastErrLevel>(level_invalid));
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
  aclrtLastErrLevel level = ACL_RT_THREAD_LEVEL;
  ret = aclrtPeekAtLastError(level);
  EXPECT_EQ(ret, ACL_ERROR_RT_FAILURE);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetLastError)
{
  int32_t level_invalid = 1;
  auto ret = aclrtGetLastError(static_cast<aclrtLastErrLevel>(level_invalid));
  EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
  aclrtLastErrLevel level = ACL_RT_THREAD_LEVEL;
  ret = aclrtGetLastError(level);
  EXPECT_EQ(ret, ACL_ERROR_RT_FAILURE);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemcpyAsyncWithDesc_failed_with_invalid_args)
{
    auto ret = aclrtMemcpyAsyncWithDesc(nullptr, ACL_MEMCPY_HOST_TO_HOST, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    auto desc = reinterpret_cast<void *>(0x1000U);
    ret = aclrtMemcpyAsyncWithDesc(desc, ACL_MEMCPY_HOST_TO_HOST, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsMemcpyAsyncWithDesc(_,_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    auto stream = reinterpret_cast<aclrtStream>(0x4000U);;
    ret = aclrtMemcpyAsyncWithDesc(desc, ACL_MEMCPY_HOST_TO_HOST, stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
    desc = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtMemcpyAsyncWithOffset)
{
    auto ret = aclrtMemcpyAsyncWithOffset(nullptr, 0, 0, nullptr, 0, 0, ACL_MEMCPY_INNER_DEVICE_TO_DEVICE, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemcpyAsyncWithOffset(nullptr, 0, 0, nullptr, 0, 0, ACL_MEMCPY_HOST_TO_HOST, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemcpyAsyncWithOffset(_,_,_,_,_,_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtMemcpyAsyncWithOffset(nullptr, 0, 0, nullptr, 1, 0, ACL_MEMCPY_INNER_DEVICE_TO_DEVICE, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemcpyAsyncWithOffset(_,_,_,_,_,_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_FEATURE_NOT_SUPPORT));
    ret = aclrtMemcpyAsyncWithOffset(nullptr, 0, 0, nullptr, 1, 0, ACL_MEMCPY_INNER_DEVICE_TO_DEVICE, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemcpyAsyncWithOffset(_,_,_,_,_,_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtMemcpyAsyncWithOffset(nullptr, 0, 0, nullptr, 1, 0, ACL_MEMCPY_HOST_TO_HOST, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemcpyAsyncWithOffset(_,_,_,_,_,_,_,_))
                    .WillOnce(Return(RT_ERROR_NONE));
    ret = aclrtMemcpyAsyncWithOffset(nullptr, 0, 0, nullptr, 1, 0, ACL_MEMCPY_HOST_TO_HOST, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemcpyAsyncWithDesc_success)
{
    auto desc = reinterpret_cast<void *>(0x1000U);
    auto stream = reinterpret_cast<aclrtStream>(0x4000U);;
    const auto ret = aclrtMemcpyAsyncWithDesc(desc, ACL_MEMCPY_HOST_TO_HOST, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);
    desc = nullptr;
    stream = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtGetMemcpyDescSize_failed_with_invalid_args)
{
    size_t descSize = 0U;
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsGetMemcpyDescSize(_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    const auto ret = aclrtGetMemcpyDescSize(ACL_MEMCPY_HOST_TO_HOST, &descSize);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetMemcpyDescSize_success)
{
    size_t descSize = 0U;
    auto ret = aclrtGetMemcpyDescSize(ACL_MEMCPY_HOST_TO_HOST, &descSize);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtSetMemcpyDesc_failed_with_invalid_args)
{
    auto ret = aclrtSetMemcpyDesc(nullptr, ACL_MEMCPY_HOST_TO_HOST, nullptr, nullptr, 0U, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    auto desc = reinterpret_cast<void *>(0x1000U);
    ret = aclrtSetMemcpyDesc(desc, ACL_MEMCPY_HOST_TO_HOST, nullptr, nullptr, 0U, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    auto srcAddr = reinterpret_cast<uint32_t *>(0x2000U);
    ret = aclrtSetMemcpyDesc(desc, ACL_MEMCPY_HOST_TO_HOST, srcAddr, nullptr, 0U, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    auto *dstAddr = reinterpret_cast<uint32_t *>(0x3000U);
    ret = aclrtSetMemcpyDesc(desc, ACL_MEMCPY_HOST_TO_HOST, srcAddr, dstAddr, 0U, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsSetMemcpyDesc(_,_,_,_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtSetMemcpyDesc(desc, ACL_MEMCPY_HOST_TO_HOST, srcAddr, dstAddr, 0x10U, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtSetMemcpyDesc_success)
{
    auto desc = reinterpret_cast<void *>(0x1000U);
    auto *srcAddr = reinterpret_cast<uint32_t *>(0x2000U);
    auto *dstAddr = reinterpret_cast<uint32_t *>(0x3000U);
    uint64_t count = 0x10U;
    const auto ret = aclrtSetMemcpyDesc(desc, ACL_MEMCPY_HOST_TO_HOST, srcAddr, dstAddr, count, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    desc = srcAddr = dstAddr = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtBinaryLoadFromFile_failed_with_invalid_args)
{
    aclrtBinHandle binHandle = nullptr;
    auto ret = aclrtBinaryLoadFromFile(nullptr, nullptr, &binHandle);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsBinaryLoadFromFile(_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    const char *binPath = "./binary/add.json";
    ret = aclrtBinaryLoadFromFile(binPath, nullptr, &binHandle);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtBinaryLoadFromFile_success)
{
   const char *binPath = "./binary/add.json";
   auto *options = reinterpret_cast<aclrtBinaryLoadOptions *>(0x1000U);
   aclrtBinHandle binHandle = nullptr;
   const auto ret = aclrtBinaryLoadFromFile(binPath, options, &binHandle);
   EXPECT_EQ(ret, ACL_SUCCESS);
   options = nullptr;
}

TEST_F(UTEST_ACL_Runtime, binary_get_dev_address_failed)
{
    void *binAddr = nullptr;
    size_t binSize = 0U;
    auto ret = aclrtBinaryGetDevAddress(nullptr, &binAddr, &binSize);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsBinaryGetDevAddress(_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    auto binHandle = reinterpret_cast<aclrtBinHandle>(0x1000U);
    ret = aclrtBinaryGetDevAddress(binHandle, &binAddr, &binSize);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
    binHandle = nullptr;
}

TEST_F(UTEST_ACL_Runtime, binary_get_dev_address_success)
{
    auto binHandle = reinterpret_cast<aclrtBinHandle>(0x1000U);
    size_t binSize = 0U;
    void *binAddr = nullptr;
    auto ret = aclrtBinaryGetDevAddress(binHandle, &binAddr, &binSize);
    
    EXPECT_EQ(ret, ACL_SUCCESS);
    binHandle = nullptr;
}

TEST_F(UTEST_ACL_Runtime, mem_set_access_failed)
{
    void *virPtr = nullptr;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemSetAccess(_,_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID))
                    .WillOnce(Return(ACL_ERROR_RT_FEATURE_NOT_SUPPORT));
    auto ret = aclrtMemSetAccess(virPtr, 0, nullptr, 0);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);

    ret = aclrtMemSetAccess(virPtr, 0, nullptr, 0);
    EXPECT_EQ(ret, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
}

TEST_F(UTEST_ACL_Runtime, mem_get_access_failed)
{
    void *virPtr = nullptr;
    size_t size = 1;
    aclError ret = aclrtReserveMemAddress(&virPtr, size, 0, nullptr, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(virPtr, nullptr); 
    aclrtMemLocation location;
    location.type = ACL_MEM_LOCATION_TYPE_DEVICE;
    location.id = 1U;
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemGetAccess(_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    uint64_t flag = 0U;
    ret = aclrtMemGetAccess(virPtr, &location, &flag);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, mem_set_access_success)
{
    void *virPtr = nullptr;
    size_t size = 1;

    aclError ret = aclrtReserveMemAddress(&virPtr, size, 0, nullptr, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(virPtr, nullptr);   

    aclrtDrvMemHandle handle = nullptr;
    aclrtPhysicalMemProp prop = {};
    prop.allocationType = ACL_MEM_ALLOCATION_TYPE_PINNED;
    prop.memAttr = ACL_HBM_MEM_HUGE;
    prop.location.type = ACL_MEM_LOCATION_TYPE_DEVICE;
    prop.location.id = 0;

    ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(handle, nullptr);

    ret = aclrtMapMem(virPtr, size, 0, handle, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);

    aclrtMemAccessFlags flags = ACL_RT_MEM_ACCESS_FLAGS_NONE;
    aclrtMemLocation location;
    location.type = ACL_MEM_LOCATION_TYPE_DEVICE;
    location.id = 1U;
    aclrtMemAccessDesc desc[1];
    desc[0].flags = flags;
    desc[0].location = location;
    constexpr uint32_t rsvMaxSize = sizeof(aclrtMemAccessDesc::rsv) / sizeof(uint8_t);
    for (uint32_t i = 0U; i < rsvMaxSize; i++) {
        desc[0].rsv[i] = 0U;
    }

    ret = aclrtMemSetAccess(virPtr, size, desc, 1);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtUnmapMem(virPtr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtFreePhysical(handle);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtReleaseMemAddress(virPtr);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, mem_set_get_access_success)
{
    void *virPtr = nullptr;
    size_t size = 1;

    aclError ret = aclrtReserveMemAddress(&virPtr, size, 0, nullptr, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(virPtr, nullptr);   

    aclrtMemAccessFlags flags = ACL_RT_MEM_ACCESS_FLAGS_NONE;
    aclrtMemLocation location;
    location.type = ACL_MEM_LOCATION_TYPE_DEVICE;
    location.id = 1U;
    aclrtMemAccessDesc desc[1];
    desc[0].flags = flags;
    desc[0].location = location;
    constexpr uint32_t rsvMaxSize = sizeof(aclrtMemAccessDesc::rsv) / sizeof(uint8_t);
    for (uint32_t i = 0U; i < rsvMaxSize; i++) {
        desc[0].rsv[i] = 0U;
    }

    ret = aclrtMemSetAccess(virPtr, size, desc, 1);
    EXPECT_EQ(ret, ACL_SUCCESS);

    uint64_t flag = 0U;
    ret = aclrtMemGetAccess(virPtr, &location, &flag);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtReleaseMemAddress(virPtr);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtBinaryGetFunctionByEntry_failed_with_invalid_args)
{
    aclrtFuncHandle funcHandle = nullptr;
    auto ret = aclrtBinaryGetFunctionByEntry(nullptr, 0U, &funcHandle);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsFuncGetByEntry(_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    auto binHandle = reinterpret_cast<aclrtBinHandle>(0x1000U);
    ret = aclrtBinaryGetFunctionByEntry(binHandle, 0U, &funcHandle);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
    binHandle = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtBinaryGetFunctionByEntry_success)
{
    auto binHandle = reinterpret_cast<aclrtBinHandle>(0x1000U);
    aclrtFuncHandle funcHandle = nullptr;
    auto ret = aclrtBinaryGetFunctionByEntry(binHandle, 0U, &funcHandle);
    EXPECT_EQ(ret, ACL_SUCCESS);
    binHandle = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtGetFunctionAddr_failed_with_invalid_args)
{
    void *aicAddr = nullptr;
    void *aivAddr = nullptr;
    auto ret = aclrtGetFunctionAddr(nullptr, &aicAddr, &aivAddr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsFuncGetAddr(_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    auto funcHandle = reinterpret_cast<aclrtFuncHandle>(0x1000U);
    ret = aclrtGetFunctionAddr(funcHandle, &aicAddr, &aivAddr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
    funcHandle = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtGetFunctionAddr_success)
{
    auto funcHandle = reinterpret_cast<aclrtFuncHandle>(0x1000U);
    void *aicAddr = nullptr;
    void *aivAddr = nullptr;
    const auto ret = aclrtGetFunctionAddr(funcHandle, &aicAddr, &aivAddr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    funcHandle = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtGetFunctionSize_failed_with_invalid_args)
{
    size_t aicSize = 0;
    size_t aivSize = 0;
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtFuncGetSize(_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    auto funcHandle = reinterpret_cast<aclrtFuncHandle>(0x1000U);
    const auto ret = aclrtGetFunctionSize(funcHandle, &aicSize, &aivSize);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
    funcHandle = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtGetFunctionSize_success)
{
    auto funcHandle = reinterpret_cast<aclrtFuncHandle>(0x1000U);
    size_t aicSize = 0;
    size_t aivSize = 0;
    const auto ret = aclrtGetFunctionSize(funcHandle, &aicSize, &aivSize);
    EXPECT_EQ(ret, ACL_SUCCESS);
    funcHandle = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtLaunchKernelWithConfig_failed_with_invalid_args)
{
    auto ret = aclrtLaunchKernelWithConfig(nullptr, 0U, nullptr, nullptr, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    auto funcHandle = reinterpret_cast<aclrtFuncHandle>(0x1000U);
    ret = aclrtLaunchKernelWithConfig(funcHandle, 0U, nullptr, nullptr, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtLaunchKernelWithConfig(funcHandle, 0x10U, nullptr, nullptr, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsLaunchKernelWithConfig(_,_,_,_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    auto argsHandle = reinterpret_cast<aclrtArgsHandle>(0x3000U);
    ret = aclrtLaunchKernelWithConfig(funcHandle, 0x10U, nullptr, nullptr, argsHandle, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
    funcHandle = argsHandle = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtLaunchKernelWithConfig_failed_with_invalid_func)
{
    auto funcHandle = reinterpret_cast<aclrtFuncHandle>(0x1000U);
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsLaunchKernelWithConfig(_,_,_,_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_INVALID_HANDLE));

    auto argsHandle = reinterpret_cast<aclrtArgsHandle>(0x3000U);
    auto ret = aclrtLaunchKernelWithConfig(funcHandle, 0x10U, nullptr, nullptr, argsHandle, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_INVALID_HANDLE);
    funcHandle = argsHandle = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtLaunchKernelWithConfig_success)
{
    auto funcHandle = reinterpret_cast<aclrtFuncHandle>(0x1000U);
    aclrtLaunchKernelCfg cfg;
    cfg.numAttrs = 1U;

    aclrtLaunchKernelAttr attrs[cfg.numAttrs];
    attrs[0U].id = ACL_RT_LAUNCH_KERNEL_ATTR_SCHEM_MODE;

    aclrtLaunchKernelAttrValue value;
    value.schemMode = 1U;
    attrs[0U].value = value;
    cfg.attrs = attrs;

    auto argsHandle = reinterpret_cast<aclrtArgsHandle>(0x4000U);
    const auto ret = aclrtLaunchKernelWithConfig(funcHandle, 0x10U, nullptr, &cfg, argsHandle, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    funcHandle = argsHandle = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtKernelArgsInit_failed_with_invalid_args)
{
    aclrtArgsHandle argsHandle = nullptr;
    auto ret = aclrtKernelArgsInit(nullptr, &argsHandle);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsKernelArgsInit(_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    auto funcHandle = reinterpret_cast<aclrtFuncHandle>(0x1000U);
    ret = aclrtKernelArgsInit(funcHandle, &argsHandle);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
    funcHandle = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtKernelArgsInit_success) {
    auto funcHandle = reinterpret_cast<aclrtFuncHandle>(0x1000U);
    aclrtArgsHandle argsHandle = nullptr;
    const auto ret = aclrtKernelArgsInit(funcHandle, &argsHandle);
    EXPECT_EQ(ret, ACL_SUCCESS);
    funcHandle = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtKernelArgsInitByUserMem_failed_with_invalid_args)
{
    auto ret = aclrtKernelArgsInitByUserMem(nullptr, nullptr, nullptr, 0U);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    auto funcHandle = reinterpret_cast<aclrtFuncHandle>(0x1000U);
    ret = aclrtKernelArgsInitByUserMem(funcHandle, nullptr, nullptr, 0U);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    auto argsHandle = reinterpret_cast<aclrtArgsHandle>(0x2000U);
    ret = aclrtKernelArgsInitByUserMem(funcHandle, argsHandle, nullptr, 0U);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    auto *userHostMem = reinterpret_cast<void *>(0x3000U);
    ret = aclrtKernelArgsInitByUserMem(funcHandle, argsHandle, userHostMem, 0U);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsKernelArgsInitByUserMem(_,_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtKernelArgsInitByUserMem(funcHandle, argsHandle, userHostMem, 0x10U);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
    funcHandle = argsHandle = userHostMem = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtKernelArgsInitByUserMem_success)
{
    auto funcHandle = reinterpret_cast<aclrtFuncHandle>(0x1000U);
    auto argsHandle = reinterpret_cast<aclrtArgsHandle>(0x2000U);
    auto *userHostMem = reinterpret_cast<void *>(0x3000U);
    const auto ret = aclrtKernelArgsInitByUserMem(funcHandle, argsHandle, userHostMem, 0x10U);
    EXPECT_EQ(ret, ACL_SUCCESS);
    funcHandle = argsHandle = userHostMem = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtKernelArgsFinalize_failed_with_invalid_args)
{
    auto argsHandle = reinterpret_cast<aclrtArgsHandle>(0x1000U);
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsKernelArgsFinalize(_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    const auto ret = aclrtKernelArgsFinalize(argsHandle);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
    argsHandle = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtKernelArgsFinalize_success) {
    auto argsHandle = reinterpret_cast<aclrtArgsHandle>(0x1000U);
    const auto ret = aclrtKernelArgsFinalize(argsHandle);
    EXPECT_EQ(ret, ACL_SUCCESS);
    argsHandle = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtKernelArgsAppend_failed_with_invalid_args)
{
    aclrtParamHandle paramHandle = nullptr;
    auto ret = aclrtKernelArgsAppend(nullptr, nullptr, 0U, &paramHandle);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    auto argsHandle = reinterpret_cast<aclrtArgsHandle>(0x1000U);
    ret = aclrtKernelArgsAppend(argsHandle, nullptr, 0U, &paramHandle);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    auto *para = reinterpret_cast<void *>(0x2000U);
    ret = aclrtKernelArgsAppend(argsHandle, para, 0U, &paramHandle);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsKernelArgsAppend(_,_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtKernelArgsAppend(argsHandle, para, 0x10U, &paramHandle);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
    argsHandle = para = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtKernelArgsAppend_success)
{
    auto argsHandle = reinterpret_cast<aclrtArgsHandle>(0x1000U);
    auto *para = reinterpret_cast<void *>(0x2000U);
    aclrtParamHandle paramHandle = nullptr;
    const auto ret = aclrtKernelArgsAppend(argsHandle, para, 1U, &paramHandle);
    EXPECT_EQ(ret, ACL_SUCCESS);
    argsHandle = para = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtKernelArgsAppendPlaceHolder_failed_with_invalid_args)
{
    aclrtParamHandle paramHandle = nullptr;
    auto ret = aclrtKernelArgsAppendPlaceHolder(nullptr, &paramHandle);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsKernelArgsAppendPlaceHolder(_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    auto argsHandle = reinterpret_cast<aclrtArgsHandle>(0x1000U);
    ret = aclrtKernelArgsAppendPlaceHolder(argsHandle, &paramHandle);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
    argsHandle = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtKernelArgsAppendPlaceHolder_success)
{
    auto argsHandle = reinterpret_cast<aclrtArgsHandle>(0x1000U);
    aclrtParamHandle paramHandle = nullptr;
    const auto ret = aclrtKernelArgsAppendPlaceHolder(argsHandle, &paramHandle);
    EXPECT_EQ(ret, ACL_SUCCESS);
    argsHandle = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtKernelArgsGetPlaceHolderBuffer_failed_with_invalid_args)
{
    void *bufferAddr = nullptr;
    auto ret = aclrtKernelArgsGetPlaceHolderBuffer(nullptr, nullptr, 0U, &bufferAddr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    auto argsHandle = reinterpret_cast<aclrtArgsHandle>(0x1000U);
    ret = aclrtKernelArgsGetPlaceHolderBuffer(argsHandle, nullptr, 0U, &bufferAddr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    auto paramHandle = reinterpret_cast<aclrtArgsHandle>(0x2000U);
    ret = aclrtKernelArgsGetPlaceHolderBuffer(argsHandle, paramHandle, 0U, &bufferAddr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsKernelArgsGetPlaceHolderBuffer(_,_,_,_))
            .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtKernelArgsGetPlaceHolderBuffer(argsHandle, paramHandle, 0x10U, &bufferAddr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
    argsHandle = paramHandle = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtKernelArgsGetPlaceHolderBuffer_success)
{
    auto argsHandle = reinterpret_cast<aclrtArgsHandle>(0x1000U);
    auto paramHandle = reinterpret_cast<aclrtArgsHandle>(0x2000U);
    void *bufferAddr = nullptr;
    auto ret = aclrtKernelArgsGetPlaceHolderBuffer(argsHandle, paramHandle, 0x10U, &bufferAddr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    argsHandle = paramHandle = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtKernelArgsGetHandleMemSize_failed_with_invalid_args)
{
    size_t memSize = 0U;
    auto ret = aclrtKernelArgsGetHandleMemSize(nullptr, &memSize);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsKernelArgsGetHandleMemSize(_,_))
                        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    auto funcHandle = reinterpret_cast<aclrtFuncHandle>(0x1000U);
    ret = aclrtKernelArgsGetHandleMemSize(funcHandle, &memSize);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
    funcHandle = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtKernelArgsGetHandleMemSize_success)
{
    auto funcHandle = reinterpret_cast<aclrtFuncHandle>(0x1000U);
    size_t memSize = 0U;
    const auto ret = aclrtKernelArgsGetHandleMemSize(funcHandle, &memSize);
    EXPECT_EQ(ret, ACL_SUCCESS);
    funcHandle = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtKernelArgsGetMemSize_Failed_invalid_args)
{
    size_t actualArgsSize = 0U;
    auto ret = aclrtKernelArgsGetMemSize(nullptr, 0U, &actualArgsSize);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsKernelArgsGetMemSize(_,_,_))
                        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    auto funcHandle = reinterpret_cast<aclrtFuncHandle>(0x1000U);
    ret = aclrtKernelArgsGetMemSize(funcHandle, 0x10U, &actualArgsSize);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
    funcHandle = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtKernelArgsGetMemSize_success)
{
    auto funcHandle = reinterpret_cast<aclrtFuncHandle>(0x1000U);
    size_t actualArgsSize = 0U;
    const auto ret = aclrtKernelArgsGetMemSize(funcHandle, 0x10U, &actualArgsSize);
    EXPECT_EQ(ret, ACL_SUCCESS);
    funcHandle = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtKernelArgsParaUpdate_failed_with_invalid_args)
{
    auto ret = aclrtKernelArgsParaUpdate(nullptr, nullptr, nullptr, 0U);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    auto argsHandle = reinterpret_cast<aclrtArgsHandle>(0x1000U);
    ret = aclrtKernelArgsParaUpdate(argsHandle, nullptr, nullptr, 0U);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    auto paramHandle = reinterpret_cast<aclrtParamHandle>(0x2000U);
    ret = aclrtKernelArgsParaUpdate(argsHandle, paramHandle, nullptr, 0U);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    auto *para = reinterpret_cast<void *>(0x3000U);
    ret = aclrtKernelArgsParaUpdate(argsHandle, paramHandle, para, 0U);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsKernelArgsParaUpdate(_,_,_,_))
                        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtKernelArgsParaUpdate(argsHandle, paramHandle, para, 0x10U);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
    argsHandle = paramHandle = para = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtKernelArgsParaUpdate_success)
{
    auto argsHandle = reinterpret_cast<aclrtArgsHandle>(0x1000U);
    auto paramHandle = reinterpret_cast<aclrtParamHandle>(0x2000U);
    auto *para = reinterpret_cast<void *>(0x3000U);
    auto ret = aclrtKernelArgsParaUpdate(argsHandle, paramHandle, para, 0x10U);
    EXPECT_EQ(ret, ACL_SUCCESS);
    argsHandle = paramHandle = para = nullptr;
}

TEST_F(UTEST_ACL_Runtime, aclrtMallocWithCfg_with_null_addr)
{
    size_t size = 1024U;
    aclrtMemMallocPolicy policy = ACL_MEM_MALLOC_HUGE_FIRST;

    auto ret = aclrtMallocWithCfg(nullptr, size, policy, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtMallocWithCfg_with_invalid_size_0)
{
    void *devPtr = nullptr;
    size_t size = 0U;
    aclrtMemMallocPolicy policy = ACL_MEM_MALLOC_HUGE_FIRST;

    auto ret = aclrtMallocWithCfg(&devPtr, size, policy, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtMallocWithCfg_succ_without_cfg)
{
    void *devPtr = nullptr;
    size_t size = 1024U;
    aclrtMemMallocPolicy policy = ACL_MEM_MALLOC_HUGE_FIRST;

    auto ret = aclrtMallocWithCfg(&devPtr, size, policy, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    aclrtMallocConfig cfg = {nullptr, 0U};
    ret = aclrtMallocWithCfg(&devPtr, size, policy, &cfg);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtMallocWithCfg_succ_without_advise)
{
    void *devPtr = nullptr;
    size_t size = 1024U;
    aclrtMemMallocPolicy policy = ACL_MEM_MALLOC_HUGE_FIRST;

    aclrtMallocAttribute attrs;
    attrs.attr = ACL_RT_MEM_ATTR_MODULE_ID;
    attrs.value.moduleId = APP_MODE_ID;
    aclrtMallocConfig cfg = {&attrs, 1U};
    auto ret = aclrtMallocWithCfg(&devPtr, size, policy, &cfg);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtMallocWithCfg_fail_with_rts_error)
{
    void *devPtr = nullptr;
    size_t size = 1024U;
    aclrtMemMallocPolicy policy = ACL_MEM_MALLOC_HUGE_FIRST;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsMalloc(_,_,_,_,_))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID))
        .WillRepeatedly(Return(RT_ERROR_NONE));
    auto ret = aclrtMallocWithCfg(&devPtr, size, policy, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtMallocWithCfg_with_invalid_cfg_num)
{
    void *devPtr = nullptr;
    size_t size = 1024U;
    aclrtMemMallocPolicy policy = ACL_MEM_MALLOC_HUGE_FIRST;
    aclrtMallocConfig cfg = {nullptr, 1U};
    auto ret = aclrtMallocWithCfg(&devPtr, size, policy, &cfg);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtMallocForTaskScheduler_succ_without_cfg)
{
    void *devPtr = nullptr;
    size_t size = 1024U;
    aclrtMemMallocPolicy policy = ACL_MEM_MALLOC_HUGE_FIRST;

    auto ret = aclrtMallocForTaskScheduler(&devPtr, size, policy, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtMallocForTaskScheduler_succ_whith_cfg02)
{
    void *devPtr = nullptr;
    size_t size = 1024U;
    aclrtMemMallocPolicy policy = ACL_MEM_MALLOC_HUGE_FIRST;

    aclrtMallocAttribute attrs;
    attrs.attr = ACL_RT_MEM_ATTR_MODULE_ID;
    attrs.value.moduleId = APP_MODE_ID;
    aclrtMallocConfig cfg = {&attrs, 1U};
    auto ret = aclrtMallocForTaskScheduler(&devPtr, size, policy, &cfg);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtMallocForTaskScheduler_fail_with_rts_error)
{
    void *devPtr = nullptr;
    size_t size = 1024U;
    aclrtMemMallocPolicy policy = ACL_MEM_MALLOC_HUGE_FIRST;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsMalloc(_,_,_,_,_))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID))
        .WillRepeatedly(Return(RT_ERROR_NONE));
    auto ret = aclrtMallocForTaskScheduler(&devPtr, size, policy, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtMallocHostWithCfg_succ_without_cfg)
{
    void *hostPtr;
    uint64_t size = 1024U;
    auto ret = aclrtMallocHostWithCfg(&hostPtr, size, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtMallocHostWithCfg_succ_with_cfg)
{
    void *hostPtr;
    uint64_t size = 1024U;
    aclrtMallocAttribute attrs;
    attrs.attr = ACL_RT_MEM_ATTR_MODULE_ID;
    attrs.value.moduleId = APP_MODE_ID;
    aclrtMallocConfig cfg = {&attrs, 1U};
    auto ret = aclrtMallocHostWithCfg(&hostPtr, size, &cfg);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtMallocHostWithCfg_fail_with_invalid_addr)
{
    uint64_t size = 1024U;
    auto ret = aclrtMallocHostWithCfg(nullptr, size, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtMallocHostWithCfg_fail_with_invalid_0_size)
{
    void *hostPtr;
    uint64_t size = 0U;
    auto ret = aclrtMallocHostWithCfg(&hostPtr, size, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtMallocHostWithCfg_fail_with_rts_error)
{
    void *hostPtr;
    uint64_t size = 1024U;
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsMallocHost(_,_,_))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID))
        .WillRepeatedly(Return(RT_ERROR_NONE));
    auto ret = aclrtMallocHostWithCfg(&hostPtr, size, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtPointerGetAttributes_succ)
{
    void *ptr = (void*)0xff;
    aclrtPtrAttributes attributes;
    auto ret = aclrtPointerGetAttributes(ptr, &attributes);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtPointerGetAttributes_failed01)
{
    void *ptr = nullptr;
    aclrtPtrAttributes attributes;
    auto ret = aclrtPointerGetAttributes(ptr, &attributes);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtPointerGetAttributes_failed02)
{
    void *ptr = (void*)0xff;
    aclrtPtrAttributes attributes;
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsPointerGetAttributes(_,_))
        .WillOnce(Return(ACL_ERROR_RT_FAILURE));
    auto ret = aclrtPointerGetAttributes(ptr, &attributes);
    EXPECT_EQ(ret, ACL_ERROR_RT_FAILURE);
}

TEST_F(UTEST_ACL_Runtime, aclrtHostRegister_succ)
{
    void *ptr = (void*)0xff;
    uint64_t size = 1024UL;
    aclrtHostRegisterType type = {};
    void *devPtr = nullptr;
    auto ret = aclrtHostRegister(ptr, size, type, &devPtr);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtHostRegister_failed01)
{
    void *ptr = nullptr;
    uint64_t size = 1024UL;
    aclrtHostRegisterType type = {};
    void *devPtr = nullptr;
    auto ret = aclrtHostRegister(ptr, size, type, &devPtr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtHostRegister_failed02)
{
    void *ptr = (void*)0xff;
    uint64_t size = 0UL;
    aclrtHostRegisterType type = {};
    void *devPtr = nullptr;
    auto ret = aclrtHostRegister(ptr, size, type, &devPtr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtHostRegister_failed03)
{
    void *ptr = (void*)0xff;
    uint64_t size = 1024UL;
    aclrtHostRegisterType type = {};
    void *devPtr = nullptr;
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsHostRegister(_,_,_,_))
        .WillOnce(Return(ACL_ERROR_RT_FAILURE));
    auto ret = aclrtHostRegister(ptr, size, type, &devPtr);
    EXPECT_EQ(ret, ACL_ERROR_RT_FAILURE);
}

TEST_F(UTEST_ACL_Runtime, aclrtHostUnregister_succ)
{
    void *ptr = (void*)0xff;
    auto ret = aclrtHostUnregister(ptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtHostUnregister_failed01)
{
    void *ptr = nullptr;
    auto ret = aclrtHostUnregister(ptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtHostUnregister_failed02)
{
    void *ptr = (void*)0xff;
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsHostUnregister(_))
        .WillOnce(Return(ACL_ERROR_RT_FAILURE));
    auto ret = aclrtHostUnregister(ptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_FAILURE);
}

TEST_F(UTEST_ACL_Runtime, aclrtHostRegisterV2_succ)
{
    void *ptr = (void*)0xff;
    uint64_t size = 1024UL;
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtHostRegisterV2(ptr, size, ACL_HOST_REG_MAPPED))
        .WillOnce(Return(ACL_SUCCESS));
    uint32_t flag = ACL_HOST_REG_MAPPED;
    auto ret = aclrtHostRegisterV2(ptr, size, flag);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtHostRegisterV2(ptr, size, ACL_HOST_REG_PINNED))
        .WillOnce(Return(ACL_SUCCESS));
    flag = ACL_HOST_REG_PINNED;
    ret = aclrtHostRegisterV2(ptr, size, flag);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtHostRegisterV2(ptr, size, ACL_HOST_REG_IOMEMORY))
        .WillOnce(Return(ACL_SUCCESS));
    flag = ACL_HOST_REG_IOMEMORY;
    ret = aclrtHostRegisterV2(ptr, size, flag);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtHostRegisterV2(ptr, size, ACL_HOST_REG_READONLY))
        .WillOnce(Return(ACL_SUCCESS));
    flag = ACL_HOST_REG_READONLY;
    ret = aclrtHostRegisterV2(ptr, size, flag);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(),
        rtHostRegisterV2(ptr, size, ACL_HOST_REG_IOMEMORY | ACL_HOST_REG_READONLY))
        .WillOnce(Return(ACL_SUCCESS));
    flag = ACL_HOST_REG_IOMEMORY | ACL_HOST_REG_READONLY;
    ret = aclrtHostRegisterV2(ptr, size, flag);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtHostRegisterV2_failed01)
{
    void *ptr = nullptr;
    uint64_t size = 1024UL;
    uint32_t flag = ACL_HOST_REG_MAPPED;
    auto ret = aclrtHostRegisterV2(ptr, size, flag);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtHostRegisterV2_failed02)
{
    void *ptr = (void*)0xff;
    uint64_t size = 0UL;
    uint32_t flag = ACL_HOST_REG_MAPPED;
    auto ret = aclrtHostRegisterV2(ptr, size, flag);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtHostRegisterV2_failed03)
{
    void *ptr = (void*)0xff;
    uint64_t size = 1024UL;
    uint32_t flag = ACL_HOST_REG_MAPPED;
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtHostRegisterV2(_,_,_))
        .WillOnce(Return(ACL_ERROR_RT_FAILURE));
    auto ret = aclrtHostRegisterV2(ptr, size, flag);
    EXPECT_EQ(ret, ACL_ERROR_RT_FAILURE);
}

TEST_F(UTEST_ACL_Runtime, aclrtHostGetDevicePointer_succ)
{
    void *pHost = (void*)0xff;
    void *pDevice = nullptr;
    uint32_t flag = 0U;
    auto ret = aclrtHostGetDevicePointer(pHost, &pDevice, flag);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtHostGetDevicePointer_failed01)
{
    void *pHost = nullptr;
    void *pDevice = nullptr;
    uint32_t flag = 0U;
    auto ret = aclrtHostGetDevicePointer(pHost, &pDevice, flag);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtHostGetDevicePointer_failed02)
{
    void *pHost = (void*)0xff;
    void *pDevice = nullptr;
    uint32_t flag = 1U;
    auto ret = aclrtHostGetDevicePointer(pHost, &pDevice, flag);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtHostGetDevicePointer_failed03)
{
    void *pHost = (void*)0xff;
    void *pDevice = nullptr;
    uint32_t flag = 0U;
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtHostGetDevicePointer(_,_,_))
        .WillOnce(Return(ACL_ERROR_RT_FAILURE));
    auto ret = aclrtHostGetDevicePointer(pHost, &pDevice, flag);
    EXPECT_EQ(ret, ACL_ERROR_RT_FAILURE);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetDeviceInfo_hd_connect_type)
{
    uint32_t deviceId = 0;
    int64_t value = 0;
    auto ret = aclrtGetDeviceInfo(deviceId, ACL_DEV_ATTR_HD_CONNECT_TYPE, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtGetDeviceInfo(deviceId, ACL_DEV_ATTR_HD_CONNECT_TYPE, &value);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_TRUE(value >= ACL_HOST_DEVICE_CONNECT_TYPE_PCIE && value <= ACL_HOST_DEVICE_CONNECT_TYPE_UB);
}

TEST_F(UTEST_ACL_Runtime, aclrtHostMemMapCapabilities_succ)
{
    uint32_t deviceId = 0U;
    aclrtHacType hacType = ACL_RT_HAC_TYPE_AIC;
    aclrtHostMemMapCapability capabilities;
    
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtHostMemMapCapabilities(_,_,_))
        .WillOnce(Return(RT_ERROR_NONE));

    auto ret = aclrtHostMemMapCapabilities(deviceId, hacType, &capabilities);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtHostMemMapCapabilities_failed)
{
    uint32_t deviceId = 0U;
    aclrtHacType hacType = ACL_RT_HAC_TYPE_AIC;
    aclrtHostMemMapCapability capabilities;
    
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtHostMemMapCapabilities(_,_,_))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    auto ret = aclrtHostMemMapCapabilities(deviceId, hacType, &capabilities);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}


TEST_F(UTEST_ACL_Runtime, aclrtGetThreadLastTaskId_succ)
{
    uint32_t taskId = 0;
    auto ret = aclrtGetThreadLastTaskId(&taskId);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetThreadLastTaskId_failed)
{
    uint32_t taskId = 0;
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsGetThreadLastTaskId(_))
        .WillOnce(Return(ACL_ERROR_RT_FAILURE));
    auto ret = aclrtGetThreadLastTaskId(&taskId);
    EXPECT_EQ(ret, ACL_ERROR_RT_FAILURE);
}

TEST_F(UTEST_ACL_Runtime, aclrtStreamGetId_succ)
{
    aclrtStream stream = (aclrtStream)0x01;
    int32_t streamId = 0;
    auto ret = aclrtStreamGetId(stream, &streamId);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtStreamGetId_failed)
{
    aclrtStream stream = (aclrtStream)0x01;
    int32_t streamId = 0;
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsStreamGetId(_,_))
        .WillOnce(Return(ACL_ERROR_RT_FAILURE));
    auto ret = aclrtStreamGetId(stream, &streamId);
    EXPECT_EQ(ret, ACL_ERROR_RT_FAILURE);
}

TEST_F(UTEST_ACL_Runtime, aclrtValueWrite_failed_with_invalid_args)
{
    auto ret = aclrtValueWrite(nullptr, 100, 0, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsValueWrite(_,_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    auto devAddr = reinterpret_cast<void *>(0x1000U);
    ret = aclrtValueWrite(devAddr, 100, 0, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtValueWrite_success)
{
    auto devAddr = reinterpret_cast<void *>(0x1000U);
    const auto ret = aclrtValueWrite(devAddr, 100, 0, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtValueWait_failed_with_invalid_args)
{
    auto ret = aclrtValueWait(nullptr, 100, ACL_STREAM_WAIT_VALUE_GEQ, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsValueWait(_,_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    auto devAddr = reinterpret_cast<void *>(0x1000U);
    ret = aclrtValueWait(devAddr, 100, ACL_STREAM_WAIT_VALUE_GEQ, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtValueWait_success)
{
    auto devAddr = reinterpret_cast<void *>(0x1000U);
    const auto ret = aclrtValueWait(devAddr, 100, ACL_STREAM_WAIT_VALUE_GEQ, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetStreamAvailableNum_failed_with_invalid_args)
{
    auto ret = aclrtGetStreamAvailableNum(nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsStreamGetAvailableNum(_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    uint32_t streamCount = 0;
    ret = aclrtGetStreamAvailableNum(&streamCount);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetStreamAvailableNum_success)
{
    uint32_t streamCount = 0;
    const auto ret = aclrtGetStreamAvailableNum(&streamCount);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtSetStreamAttribute_failed_with_invalid_args)
{
    aclrtStreamAttr stmAttrType = ACL_STREAM_ATTR_FAILURE_MODE;
    auto ret = aclrtSetStreamAttribute(nullptr, stmAttrType, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    aclrtStream stream = (aclrtStream)0x01;
    ret = aclrtSetStreamAttribute(stream, stmAttrType, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsStreamSetAttribute(_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    aclrtStreamAttrValue value;
    ret = aclrtSetStreamAttribute(stream, stmAttrType, &value);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtSetStreamAttribute_success)
{
    aclrtStreamAttr stmAttrType = ACL_STREAM_ATTR_FAILURE_MODE;
    aclrtStream stream = (aclrtStream)0x01;
    aclrtStreamAttrValue value;
    const auto ret = aclrtSetStreamAttribute(stream, stmAttrType, &value);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetStreamAttribute_failed_with_invalid_args)
{
    aclrtStreamAttr stmAttrType = ACL_STREAM_ATTR_FAILURE_MODE;
    auto ret = aclrtGetStreamAttribute(nullptr, stmAttrType, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    aclrtStream stream = (aclrtStream)0x01;
    ret = aclrtGetStreamAttribute(stream, stmAttrType, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsStreamGetAttribute(_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    aclrtStreamAttrValue value;
    ret = aclrtGetStreamAttribute(stream, stmAttrType, &value);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetStreamAttribute_success)
{
    aclrtStreamAttr stmAttrType = ACL_STREAM_ATTR_FAILURE_MODE;
    aclrtStream stream = (aclrtStream)0x01;
    aclrtStreamAttrValue value;
    const auto ret = aclrtGetStreamAttribute(stream, stmAttrType, &value);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtCreateNotify_failed_with_invalid_args)
{
    auto ret = aclrtCreateNotify(nullptr, 0);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsNotifyCreate(_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    aclrtNotify notify = (aclrtNotify)0x01;
    ret = aclrtCreateNotify(&notify, 0);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtCreateNotify_success)
{
    aclrtNotify notify = (aclrtNotify)0x01;
    const auto ret = aclrtCreateNotify(&notify, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtDestroyNotify_failed_with_invalid_args)
{
    auto ret = aclrtDestroyNotify(nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsNotifyDestroy(_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    aclrtNotify notify = (aclrtNotify)0x01;
    ret = aclrtDestroyNotify(notify);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtDestroyNotify_success)
{
    aclrtNotify notify = (aclrtNotify)0x01;
    const auto ret = aclrtDestroyNotify(notify);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtCntNotifyCreate)
{
    aclrtNotify cntNotify = nullptr;
    auto ret = aclrtCntNotifyCreate(&cntNotify, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtCntNotifyCreateServer(_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtCntNotifyCreate(&cntNotify, 0);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtCntNotifyDestroy)
{
    aclrtNotify cntNotify = nullptr;
    auto ret = aclrtCntNotifyDestroy(cntNotify);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtCntNotifyDestroy(_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtCntNotifyDestroy(cntNotify);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtRecordNotify_failed_with_invalid_args)
{
    auto ret = aclrtRecordNotify(nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsNotifyRecord(_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    aclrtNotify notify = (aclrtNotify)0x01;
    ret = aclrtRecordNotify(notify, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtRecordNotify_success)
{
    aclrtNotify notify = (aclrtNotify)0x01;
    const auto ret = aclrtRecordNotify(notify, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtWaitAndResetNotify_failed_with_invalid_args)
{
    auto ret = aclrtWaitAndResetNotify(nullptr, nullptr, 1);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsNotifyWaitAndReset(_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    aclrtNotify notify = (aclrtNotify)0x01;
    ret = aclrtWaitAndResetNotify(notify, nullptr, 1);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtWaitAndResetNotify_success)
{
    aclrtNotify notify = (aclrtNotify)0x01;
    const auto ret = aclrtWaitAndResetNotify(notify, nullptr, 1);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetNotifyId_failed_with_invalid_args)
{
    auto ret = aclrtGetNotifyId(nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    aclrtNotify notify = (aclrtNotify)0x01;
    ret = aclrtGetNotifyId(notify, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsNotifyGetId(_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    uint32_t notifyId = 0;
    ret = aclrtGetNotifyId(notify, &notifyId);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetNotifyId_success)
{
    aclrtNotify notify = (aclrtNotify)0x01;
    uint32_t notifyId = 0;
    const auto ret = aclrtGetNotifyId(notify, &notifyId);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetEventId_failed_with_invalid_args)
{
    auto ret = aclrtGetEventId(nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    aclrtEvent event = (aclrtEvent)0x01;
    ret = aclrtGetEventId(event, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsEventGetId(_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    uint32_t eventId = 0;
    ret = aclrtGetEventId(event, &eventId);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetEventId_success)
{
    aclrtEvent event = (aclrtEvent)0x01;
    uint32_t eventId = 0;
    const auto ret = aclrtGetEventId(event, &eventId);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetEventAvailNum_failed_with_invalid_args)
{
    auto ret = aclrtGetEventAvailNum(nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsEventGetAvailNum(_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    uint32_t eventCount = 0;
    ret = aclrtGetEventAvailNum(&eventCount);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetEventAvailNum_success)
{
    uint32_t eventCount = 0;
    const auto ret = aclrtGetEventAvailNum(&eventCount);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetDeviceInfo_failed_with_invalid_args)
{
    uint32_t deviceId = 0;
    aclrtDevAttr attr = ACL_DEV_ATTR_AICPU_CORE_NUM;
    auto ret = aclrtGetDeviceInfo(deviceId, attr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsDeviceGetInfo(_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    int64_t value = 0;
    ret = aclrtGetDeviceInfo(deviceId, attr, &value);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetDeviceInfo_success)
{
    uint32_t deviceId = 0;
    aclrtDevAttr attr = ACL_DEV_ATTR_AICPU_CORE_NUM;
    int64_t value = 0;
    const auto ret = aclrtGetDeviceInfo(deviceId, attr, &value);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetDeviceInfo_npu_arch_failed_with_invalid_args)
{
    uint32_t deviceId = 0;
    auto ret = aclrtGetDeviceInfo(deviceId, ACL_DEV_ATTR_NPU_ARCH, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsDeviceGetInfo(_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    int64_t value = 0;
    ret = aclrtGetDeviceInfo(deviceId, ACL_DEV_ATTR_NPU_ARCH, &value);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetDeviceInfo_npu_arch_success)
{
    uint32_t deviceId = 0;
    int64_t value = 0;
    const auto ret = aclrtGetDeviceInfo(deviceId, ACL_DEV_ATTR_NPU_ARCH, &value);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtDeviceGetStreamPriorityRange_success)
{
    int32_t leastPriority = 0;
    int32_t greatestPriority = 0;
    auto ret = aclrtDeviceGetStreamPriorityRange(&leastPriority, &greatestPriority);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtDeviceGetStreamPriorityRange(nullptr, &greatestPriority);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtDeviceGetStreamPriorityRange(&leastPriority, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtDeviceGetStreamPriorityRange(nullptr, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetDeviceCapability_failed_with_invalid_args)
{
    int32_t deviceId = 0;
    aclrtDevFeatureType devFeatureType = ACL_FEATURE_TSCPU_TASK_UPDATE_SUPPORT_AIC_AIV;
    auto ret = aclrtGetDeviceCapability(deviceId, devFeatureType, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsDeviceGetCapability(_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    int32_t value = 0;
    ret = aclrtGetDeviceCapability(deviceId, devFeatureType, &value);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetDeviceCapability_success)
{
    int32_t deviceId = 0;
    aclrtDevFeatureType devFeatureType = ACL_FEATURE_TSCPU_TASK_UPDATE_SUPPORT_AIC_AIV;
    int32_t value = 0;
    const auto ret = aclrtGetDeviceCapability(deviceId, devFeatureType, &value);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtDeviceGetUuid_failed_with_invalid_args)
{
    int32_t deviceId = 0;
    aclrtUuid uuid = {0};
    
    auto ret = aclrtDeviceGetUuid(deviceId, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetDeviceUuid(_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtDeviceGetUuid(deviceId, &uuid);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtDeviceGetUuid_feature_not_support)
{
    int32_t deviceId = 0;
    aclrtUuid uuid = {0};

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetDeviceUuid(_, _))
        .WillOnce(Return(ACL_ERROR_RT_FEATURE_NOT_SUPPORT));
    const auto ret = aclrtDeviceGetUuid(deviceId, &uuid);
    EXPECT_EQ(ret, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
}

TEST_F(UTEST_ACL_Runtime, aclrtDeviceGetUuid_success)
{
    int32_t deviceId = 0;
    aclrtUuid uuid = {0};
    const auto ret = aclrtDeviceGetUuid(deviceId, &uuid);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtCtxGetCurrentDefaultStream_failed_with_invalid_args)
{
    auto ret = aclrtCtxGetCurrentDefaultStream(nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsCtxGetCurrentDefaultStream(_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    aclrtStream stream = (aclrtStream)0x01;
    ret = aclrtCtxGetCurrentDefaultStream(&stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtCtxGetCurrentDefaultStream_success)
{
    aclrtStream stream = (aclrtStream)0x01;
    const auto ret = aclrtCtxGetCurrentDefaultStream(&stream);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetPrimaryCtxState_success)
{
    int32_t devId = 0;
    uint32_t *flags = nullptr;
    int active = 0;
    const auto ret = aclrtGetPrimaryCtxState(devId, flags, &active);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtGrimaryCtxState_iled_with_invliad_active)
{
    int32_t devId = 0;
    uint32_t *flags = nullptr;
    const auto ret = aclrtGetPrimaryCtxState(devId, flags, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtGrimaryCtxState_iled_with_invliad_flags)
{
    int32_t devId = 0;
    uint32_t flags;
    int active = 0;
    const auto ret = aclrtGetPrimaryCtxState(devId, &flags, &active);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtGrimaryCtxState_iled_with_rts_error)
{
    int32_t devId = 0;
    uint32_t *flags = nullptr;
    int active = 0;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsGetPrimaryCtxState(_,_,_))
    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    const auto ret = aclrtGetPrimaryCtxState(devId, flags, &active);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclmdlRIBuildBegin_failed_with_invalid_args)
{
    auto ret = aclmdlRIBuildBegin(nullptr, 0);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsModelCreate(_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    aclmdlRI modelRI = (aclmdlRI)0x01;
    ret = aclmdlRIBuildBegin(&modelRI, 0);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclmdlRIBuildBegin_success)
{
    aclmdlRI modelRI = (aclmdlRI)0x01;
    const auto ret = aclmdlRIBuildBegin(&modelRI, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclmdlRIBindStream_failed_with_invalid_args)
{
    aclmdlRI modelRI = (aclmdlRI)0x01;
    auto ret = aclmdlRIBindStream(nullptr, nullptr, 0);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsModelBindStream(_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclmdlRIBindStream(modelRI, nullptr, 0);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclmdlRIBindStream_success)
{
    aclmdlRI modelRI = (aclmdlRI)0x01;
    aclrtStream stream = (aclrtStream)0x01;
    const auto ret = aclmdlRIBindStream(modelRI, stream, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclmdlRIEndTask_failed_with_invalid_args)
{
    aclmdlRI modelRI = (aclmdlRI)0x01;
    auto ret = aclmdlRIEndTask(nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsEndGraph(_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclmdlRIEndTask(modelRI, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclmdlRIEndTask_success)
{
    aclmdlRI modelRI = (aclmdlRI)0x01;
    const auto ret = aclmdlRIEndTask(modelRI, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclmdlRIBuildEnd_failed_with_invalid_args)
{
    aclmdlRI modelRI = (aclmdlRI)0x01;
    void *reserve = (void *)0x01;
    auto ret = aclmdlRIBuildEnd(nullptr, reserve);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclmdlRIBuildEnd(modelRI, reserve);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsModelLoadComplete(_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclmdlRIBuildEnd(modelRI, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclmdlRIBuildEnd_success)
{
    aclmdlRI modelRI = (aclmdlRI)0x01;
    const auto ret = aclmdlRIBuildEnd(modelRI, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclmdlRIUnbindStream_failed_with_invalid_args)
{
    aclmdlRI modelRI = (aclmdlRI)0x01;
    auto ret = aclmdlRIUnbindStream(nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsModelUnbindStream(_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclmdlRIUnbindStream(modelRI, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclmdlRIUnbindStream_success)
{
    aclmdlRI modelRI = (aclmdlRI)0x01;
    const auto ret = aclmdlRIUnbindStream(modelRI, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclmdlRIExecute_failed_with_invalid_args)
{
    aclmdlRI modelRI = (aclmdlRI)0x01;
    int32_t timeout = -1;
    auto ret = aclmdlRIExecute(nullptr, timeout);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsModelExecute(_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclmdlRIExecute(modelRI, timeout);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclmdlRIExecute_success)
{
    aclmdlRI modelRI = (aclmdlRI)0x01;
    int32_t timeout = -1;
    const auto ret = aclmdlRIExecute(modelRI, timeout);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtReduceAsync_failed_with_invalid_args)
{
    void *dst = reinterpret_cast<void *>(0x04);
    void *src = reinterpret_cast<void *>(0x04);
    void *reserve = (void *)0x01;
    uint64_t count = 10;
    aclrtReduceKind kind = ACL_RT_MEMCPY_SDMA_AUTOMATIC_SUM;
    aclDataType type = ACL_INT8;

    auto ret = aclrtReduceAsync(nullptr, nullptr, count, kind, type, nullptr, reserve);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtReduceAsync(dst, nullptr, count, kind, type, nullptr, reserve);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    type = ACL_DT_UNDEFINED;
    ret = aclrtReduceAsync(dst, src, count, kind, type, nullptr, reserve);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsLaunchReduceAsyncTask(_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    type = ACL_INT8;
    ret = aclrtReduceAsync(dst, src, count, kind, type, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtReduceAsync_success)
{
    void *dst = reinterpret_cast<void *>(0x04);
    void *src = reinterpret_cast<void *>(0x04);
    uint64_t count = 10;
    aclrtReduceKind kind = ACL_RT_MEMCPY_SDMA_AUTOMATIC_SUM;
    aclDataType type = ACL_FLOAT;
    auto ret = aclrtReduceAsync(dst, src, count, kind, type, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    type = ACL_FLOAT16;
    ret = aclrtReduceAsync(dst, src, count, kind, type, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    type = ACL_INT16;
    ret = aclrtReduceAsync(dst, src, count, kind, type, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    type = ACL_INT4;
    ret = aclrtReduceAsync(dst, src, count, kind, type, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    type = ACL_INT8;
    ret = aclrtReduceAsync(dst, src, count, kind, type, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    type = ACL_INT32;
    ret = aclrtReduceAsync(dst, src, count, kind, type, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    type = ACL_BF16;
    ret = aclrtReduceAsync(dst, src, count, kind, type, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    type = ACL_UINT8;
    ret = aclrtReduceAsync(dst, src, count, kind, type, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    type = ACL_UINT16;
    ret = aclrtReduceAsync(dst, src, count, kind, type, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    type = ACL_UINT32;
    ret = aclrtReduceAsync(dst, src, count, kind, type, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtReduceAsync_failed_with_unsupported_data_type)
{
    void *dst = reinterpret_cast<void *>(0x04);
    void *src = reinterpret_cast<void *>(0x04);
    uint64_t count = 10;
    aclrtReduceKind kind = ACL_RT_MEMCPY_SDMA_AUTOMATIC_SUM;
    aclDataType type = ACL_INT64;

    auto ret = aclrtReduceAsync(dst, src, count, kind, type, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetDeviceResLimit_failed_with_invalid_args)
{
    const int32_t deviceId = 0x01;
    aclrtDevResLimitType type = ACL_RT_DEV_RES_CUBE_CORE;
    uint32_t value = 0;
    auto ret = aclrtGetDeviceResLimit(deviceId, type, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsGetDeviceResLimit(_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtGetDeviceResLimit(deviceId, type, &value);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetDeviceResLimit_success)
{
    const int32_t deviceId = 0x01;
    aclrtDevResLimitType type = ACL_RT_DEV_RES_CUBE_CORE;
    uint32_t value = 0;
    const auto ret = aclrtGetDeviceResLimit(deviceId, type, &value);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtSetDeviceResLimit_failed_with_invalid_args)
{
    const int32_t deviceId = 0x01;
    aclrtDevResLimitType type = ACL_RT_DEV_RES_CUBE_CORE;
    uint32_t value = 0;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsSetDeviceResLimit(_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    const auto ret = aclrtSetDeviceResLimit(deviceId, type, value);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtSetDeviceResLimit_success)
{
    const int32_t deviceId = 0x01;
    aclrtDevResLimitType type = ACL_RT_DEV_RES_CUBE_CORE;
    uint32_t value = 0;
    const auto ret = aclrtSetDeviceResLimit(deviceId, type, value);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtResetDeviceResLimit_failed_with_invalid_args)
{
    const int32_t deviceId = 0x01;
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsResetDeviceResLimit(_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    const auto ret = aclrtResetDeviceResLimit(deviceId);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtResetDeviceResLimit_success)
{
    const int32_t deviceId = 0x01;
    const auto ret = aclrtResetDeviceResLimit(deviceId);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetStreamResLimit_failed_with_invalid_args)
{
    aclrtDevResLimitType type = ACL_RT_DEV_RES_CUBE_CORE;

    aclrtStream stream = (aclrtStream)0x01;
    auto ret = aclrtGetStreamResLimit(stream, type, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsGetStreamResLimit(_,_,_))
        .WillRepeatedly(Return(ACL_ERROR_RT_PARAM_INVALID));

    uint32_t value = 0;
    ret = aclrtGetStreamResLimit(nullptr, type, &value);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
    stream = (aclrtStream)0x01;
    ret = aclrtGetStreamResLimit(stream, type, &value);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetStreamResLimit_success)
{
    aclrtStream stream = (aclrtStream)0x01;
    aclrtDevResLimitType type = ACL_RT_DEV_RES_CUBE_CORE;
    uint32_t value = 0;
    const auto ret = aclrtGetStreamResLimit(stream, type, &value);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtSetStreamResLimit_failed_with_invalid_args)
{
    aclrtDevResLimitType type = ACL_RT_DEV_RES_CUBE_CORE;
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsSetStreamResLimit(_,_,_))
        .WillRepeatedly(Return(ACL_ERROR_RT_PARAM_INVALID));

    uint32_t value = 0;
    auto ret = aclrtSetStreamResLimit(nullptr, type, value);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);

    aclrtStream stream = (aclrtStream)0x01;
    ret = aclrtSetStreamResLimit(stream, type, value);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtSetStreamResLimit_success)
{
    aclrtStream stream = (aclrtStream)0x01;
    aclrtDevResLimitType type = ACL_RT_DEV_RES_CUBE_CORE;
    uint32_t value = 0;
    const auto ret = aclrtSetStreamResLimit(stream, type, value);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtResetStreamResLimit_failed_with_invalid_args)
{
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsResetStreamResLimit(_))
        .WillRepeatedly(Return(ACL_ERROR_RT_PARAM_INVALID));

    auto ret = aclrtResetStreamResLimit(nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);

    aclrtStream stream = (aclrtStream)0x01;
    ret = aclrtResetStreamResLimit(stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtResetStreamResLimit_success)
{
    aclrtStream stream = (aclrtStream)0x01;
    const auto ret = aclrtResetStreamResLimit(stream);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtUseStreamResInCurrentThread_failed_with_invalid_args)
{
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsUseStreamResInCurrentThread(_))
        .WillRepeatedly(Return(ACL_ERROR_RT_PARAM_INVALID));

    auto ret = aclrtUseStreamResInCurrentThread(nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);

    aclrtStream stream = (aclrtStream)0x01;
    ret = aclrtUseStreamResInCurrentThread(stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtUseStreamResInCurrentThread_success)
{
    aclrtStream stream = (aclrtStream)0x01;
    const auto ret = aclrtUseStreamResInCurrentThread(stream);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtUnuseStreamResInCurrentThread_failed_with_invalid_args)
{
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsNotUseStreamResInCurrentThread(_))
        .WillRepeatedly(Return(ACL_ERROR_RT_PARAM_INVALID));

    auto ret = aclrtUnuseStreamResInCurrentThread(nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);

    aclrtStream stream = (aclrtStream)0x01;
    ret = aclrtUnuseStreamResInCurrentThread(stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtUnuseStreamResInCurrentThread_success)
{
    aclrtStream stream = (aclrtStream)0x01;
    const auto ret = aclrtUnuseStreamResInCurrentThread(stream);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetResInCurrentThread_failed_with_invalid_args)
{
    aclrtDevResLimitType type = ACL_RT_DEV_RES_CUBE_CORE;
    auto ret = aclrtGetResInCurrentThread(type, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsGetResInCurrentThread(_, _))
        .WillRepeatedly(Return(ACL_ERROR_RT_PARAM_INVALID));
    uint32_t value = 0;
    ret = aclrtGetResInCurrentThread(type, &value);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetResInCurrentThread_success)
{
    aclrtDevResLimitType type = ACL_RT_DEV_RES_CUBE_CORE;
    uint32_t value = 0;
    const auto ret = aclrtGetResInCurrentThread(type, &value);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclmdlRISetName_failed_with_invalid_args)
{
    aclmdlRI modelRI = (aclmdlRI)0x01;
    const char *name = "name";
    auto ret = aclmdlRISetName(nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclmdlRISetName(modelRI, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsModelSetName(_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclmdlRISetName(modelRI, name);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclmdlRISetName_success)
{
    aclmdlRI modelRI = (aclmdlRI)0x01;
    const char *name = "name";
    const auto ret = aclmdlRISetName(modelRI, name);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclmdlRIGetName_failed_with_invalid_args)
{
    aclmdlRI modelRI = (aclmdlRI)0x01;
    constexpr uint32_t maxLen = 10;
    char name[maxLen] = {0};
    auto ret = aclmdlRIGetName(nullptr, maxLen, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclmdlRIGetName(modelRI, maxLen, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsModelGetName(_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclmdlRIGetName(modelRI, maxLen, name);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclmdlRIGetName_success)
{
    aclmdlRI modelRI = (aclmdlRI)0x01;
    constexpr uint32_t maxLen = 10;
    char name[maxLen] = {0};
    const auto ret = aclmdlRIGetName(modelRI, maxLen, name);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclmdlRIGetId_failed_with_invalid_args)
{
    aclmdlRI modelRI = (aclmdlRI)0x01;
    uint32_t modelRIId = 0;
    auto ret = aclmdlRIGetId(nullptr, &modelRIId);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclmdlRIGetId(modelRI, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtModelGetId(_, _))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclmdlRIGetId(modelRI, &modelRIId);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclmdlRIGetId_success)
{
    aclmdlRI modelRI = (aclmdlRI)0x01;
    uint32_t modelRIId = 0;
    const auto ret = aclmdlRIGetId(modelRI, &modelRIId);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtCreateLabel_failed_with_invalid_args)
{
    aclrtLabel label = (aclrtLabel)0x01;
    auto ret = aclrtCreateLabel(nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsLabelCreate(_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtCreateLabel(&label);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtCreateLabel_success)
{
    aclrtLabel label = (aclrtLabel)0x01;
    const auto ret = aclrtCreateLabel(&label);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtSetLabel_failed_with_invalid_args)
{
    aclrtLabel label = (aclrtLabel)0x01;
    aclrtStream stream = (aclrtStream)0x01;
    auto ret = aclrtSetLabel(nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtSetLabel(label, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsLabelSet(_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtSetLabel(label, stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtSetLabel_success)
{
    aclrtLabel label = (aclrtLabel)0x01;
    aclrtStream stream = (aclrtStream)0x01;
    const auto ret = aclrtSetLabel(label, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtDestroyLabel_failed_with_invalid_args)
{
    aclrtLabel label = (aclrtLabel)0x01;
    auto ret = aclrtDestroyLabel(nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsLabelDestroy(_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtDestroyLabel(label);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtDestroyLabel_success)
{
    aclrtLabel label = (aclrtLabel)0x01;
    const auto ret = aclrtDestroyLabel(label);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtCreateLabelList_failed_with_invalid_args)
{
    aclrtLabel label = (aclrtLabel)0x01;
    size_t num = 1;
    aclrtLabelList labelList = (aclrtLabelList)0x01;
    auto ret = aclrtCreateLabelList(nullptr, num, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtCreateLabelList(&label, num, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsLabelSwitchListCreate(_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtCreateLabelList(&label, num, &labelList);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtCreateLabelList_success)
{
    aclrtLabel label = (aclrtLabel)0x01;
    size_t num = 1;
    aclrtLabelList labelList = (aclrtLabelList)0x01;
    const auto ret = aclrtCreateLabelList(&label, num, &labelList);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtDestroyLabelList_failed_with_invalid_args)
{
    aclrtLabelList labelList = (aclrtLabelList)0x01;
    auto ret = aclrtDestroyLabelList(nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsLabelSwitchListDestroy(_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtDestroyLabelList(labelList);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtDestroyLabelList_success)
{
    aclrtLabelList labelList = (aclrtLabelList)0x01;
    const auto ret = aclrtDestroyLabelList(labelList);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtSwitchLabelByIndex_failed_with_invalid_args)
{
    void *ptr = (void*)0xff;
    uint32_t maxValue = 1;
    aclrtLabelList labelList = (aclrtLabelList)0x01;
    aclrtStream stream = (aclrtStream)0x01;
    auto ret = aclrtSwitchLabelByIndex(nullptr, maxValue, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtSwitchLabelByIndex(ptr, maxValue, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtSwitchLabelByIndex(ptr, maxValue, labelList, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsLabelSwitchByIndex(_,_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtSwitchLabelByIndex(ptr, maxValue, labelList, stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtSwitchLabelByIndex_success)
{
    void *ptr = (void*)0xff;
    uint32_t maxValue = 1;
    aclrtLabelList labelList = (aclrtLabelList)0x01;
    aclrtStream stream = (aclrtStream)0x01;
    const auto ret = aclrtSwitchLabelByIndex(ptr, maxValue, labelList, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtActiveStream_failed_with_invalid_args)
{
    aclrtStream activeStream = (aclrtStream)0x01;
    aclrtStream stream = (aclrtStream)0x01;
    auto ret = aclrtActiveStream(nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtActiveStream(activeStream, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsActiveStream(_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtActiveStream(activeStream, stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtActiveStream_success)
{
    aclrtStream activeStream = (aclrtStream)0x01;
    aclrtStream stream = (aclrtStream)0x01;
    const auto ret = aclrtActiveStream(activeStream, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtSwitchStream_failed_with_invalid_args)
{
    void *leftValue = (void*)0xff;
    aclrtCondition cond = ACL_RT_EQUAL;
    void *rightValue = (void*)0xff;
    aclrtCompareDataType dataType = ACL_RT_SWITCH_INT32;
    aclrtStream trueStream = (aclrtStream)0x01;
    aclrtStream falseStream = (aclrtStream)0x01;
    aclrtStream stream = (aclrtStream)0x01;
    auto ret = aclrtSwitchStream(nullptr, cond, nullptr, dataType, nullptr, falseStream, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtSwitchStream(leftValue, cond, nullptr, dataType, nullptr, falseStream, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtSwitchStream(leftValue, cond, rightValue, dataType, nullptr, falseStream, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtSwitchStream(leftValue, cond, rightValue, dataType, trueStream, falseStream, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtSwitchStream(leftValue, cond, rightValue, dataType, trueStream, falseStream, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsSwitchStream(_,_,_,_,_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtSwitchStream(leftValue, cond, rightValue, dataType, trueStream, nullptr, stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtSwitchStream_success)
{
    void *leftValue = (void*)0xff;
    aclrtCondition cond = ACL_RT_EQUAL;
    void *rightValue = (void*)0xff;
    aclrtCompareDataType dataType = ACL_RT_SWITCH_INT32;
    aclrtStream trueStream = (aclrtStream)0x01;
    aclrtStream stream = (aclrtStream)0x01;
    const auto ret = aclrtSwitchStream(leftValue, cond, rightValue, dataType, trueStream, nullptr, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetFunctionName_failed_with_invalid_args)
{
    aclrtFuncHandle funcHandle = (aclrtFuncHandle)0x01;
    constexpr uint32_t maxLen = 10;
    char name[maxLen] = {0};
    auto ret = aclrtGetFunctionName(nullptr, maxLen, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtGetFunctionName(funcHandle, maxLen, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsFuncGetName(_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtGetFunctionName(funcHandle, maxLen, name);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetFunctionName_success)
{
    aclrtFuncHandle funcHandle = (aclrtFuncHandle)0x01;
    constexpr uint32_t maxLen = 10;
    char name[maxLen] = {0};
    const auto ret = aclrtGetFunctionName(funcHandle, maxLen, name);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtAllocBuf_failed_with_invalid_args)
{
    aclrtMbuf mbuf = nullptr;
    uint64_t size = 1;
    auto ret = aclrtAllocBuf(nullptr, 0);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtAllocBuf(&mbuf, 0);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMbufAlloc(_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtAllocBuf(&mbuf, size);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
    EXPECT_EQ(aclrtFreeBuf(mbuf), ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtAllocBuf_success)
{
    aclrtMbuf mbuf = nullptr;
    size_t size = 1;
    const auto ret = aclrtAllocBuf(&mbuf, size);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_EQ(aclrtFreeBuf(mbuf), ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetBufUserData_failed_with_size_offset_exceed_max)
{
    aclrtMbuf mbuf = reinterpret_cast<aclrtMbuf>(0x01);
    char data[100] = {0};
    size_t size = 50;
    size_t offset = 50;  // size + offset = 100 > MEM_SIZE_MAX(96)

    auto ret = aclrtGetBufUserData(mbuf, data, size, offset);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtSetBufUserData_failed_with_size_offset_exceed_max)
{
    aclrtMbuf mbuf = reinterpret_cast<aclrtMbuf>(0x01);
    char data[100] = {0};
    size_t size = 50;
    size_t offset = 50;  // size + offset = 100 > MEM_SIZE_MAX(96)

    auto ret = aclrtSetBufUserData(mbuf, data, size, offset);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetBufUserData_failed_when_memcpy_returns_error)
{
    char privateData[96] = {0};
    char data[1] = {0};
    aclrtMbuf mbuf = reinterpret_cast<aclrtMbuf>(privateData);
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMbufGetPrivInfo(_, _, _))
        .WillOnce(DoAll(SetArgPointee<1>(privateData), SetArgPointee<2>(sizeof(privateData)),
            Return(RT_ERROR_NONE)));

    auto ret = aclrtGetBufUserData(mbuf, data, 0U, 0U);
    EXPECT_EQ(ret, ACL_ERROR_FAILURE);
}

TEST_F(UTEST_ACL_Runtime, aclrtSetBufUserData_failed_when_memcpy_returns_error)
{
    char privateData[96] = {0};
    char data[1] = {0};
    aclrtMbuf mbuf = reinterpret_cast<aclrtMbuf>(privateData);
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMbufGetPrivInfo(_, _, _))
        .WillOnce(DoAll(SetArgPointee<1>(privateData), SetArgPointee<2>(sizeof(privateData)),
            Return(RT_ERROR_NONE)));

    auto ret = aclrtSetBufUserData(mbuf, data, 0U, sizeof(privateData));
    EXPECT_EQ(ret, ACL_ERROR_FAILURE);
}

TEST_F(UTEST_ACL_Runtime, aclrtBinaryLoadFromData_failed_with_invalid_args)
{
    void *data = (void*)0x01;
    size_t length = 1;
    aclrtBinHandle *binHandle = (aclrtBinHandle*)0x01;
    auto ret = aclrtBinaryLoadFromData(nullptr, length, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtBinaryLoadFromData(data, length, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsBinaryLoadFromData(_,_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtBinaryLoadFromData(data, length, nullptr, binHandle);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtBinaryLoadFromData_success)
{
    void *data = (void*)0x01;
    size_t length = 1;
    aclrtBinHandle *binHandle = (aclrtBinHandle*)0x01;
    const auto ret = aclrtBinaryLoadFromData(data, length, nullptr, binHandle);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtRegisterCpuFunc_failed_with_invalid_args)
{
    aclrtBinHandle handle = (aclrtBinHandle)0x01;
    const char *funcName = "funcName";
    const char *kernelName = "kernelName";
    aclrtFuncHandle *funcHandle = (aclrtFuncHandle*)0x01;
    auto ret = aclrtRegisterCpuFunc(nullptr, nullptr, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtRegisterCpuFunc(handle, nullptr, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtRegisterCpuFunc(handle, funcName, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtRegisterCpuFunc(handle, funcName, kernelName, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsRegisterCpuFunc(_,_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtRegisterCpuFunc(handle, funcName, kernelName, funcHandle);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtRegisterCpuFunc_success)
{
    aclrtBinHandle handle = (aclrtBinHandle)0x01;
    const char *funcName = "funcName";
    const char *kernelName = "kernelName";
    aclrtFuncHandle *funcHandle = (aclrtFuncHandle*)0x01;
    const auto ret = aclrtRegisterCpuFunc(handle, funcName, kernelName, funcHandle);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtCmoAsyncWithBarrier_failed_with_invalid_args)
{
    void *src = (void*)0xff;
    size_t size = 1;
    aclrtCmoType cmoType = ACL_RT_CMO_TYPE_PREFETCH;
    uint32_t barrierId = 1;
    aclrtStream stream = (aclrtStream)0x01;
    auto ret = aclrtCmoAsyncWithBarrier(nullptr, size, cmoType, barrierId, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsCmoAsyncWithBarrier(_,_,_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtCmoAsyncWithBarrier(src, size, cmoType, barrierId, stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtCmoAsyncWithBarrier_success)
{
    void *src = (void*)0xff;
    size_t size = 1;
    aclrtCmoType cmoType = ACL_RT_CMO_TYPE_PREFETCH;
    uint32_t barrierId = 1;
    aclrtStream stream = (aclrtStream)0x01;
    const auto ret = aclrtCmoAsyncWithBarrier(src, size, cmoType, barrierId, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtCmoWaitBarrier_failed_with_invalid_args)
{
    aclrtBarrierTaskInfo taskInfo;
    aclrtStream stream = (aclrtStream)0x01;
    uint32_t flag = 0;
    auto ret = aclrtCmoWaitBarrier(nullptr, stream, flag);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    taskInfo.barrierNum = 0U;
    ret = aclrtCmoWaitBarrier(&taskInfo, stream, flag);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    taskInfo.barrierNum = 7U;
    ret = aclrtCmoWaitBarrier(&taskInfo, stream, flag);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsLaunchBarrierTask(_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    taskInfo.barrierNum = 1U;
    ret = aclrtCmoWaitBarrier(&taskInfo, stream, flag);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtCmoWaitBarrier_success)
{
    aclrtBarrierTaskInfo taskInfo;
    taskInfo.barrierNum = 1U;
    uint32_t flag = 0;
    aclrtStream stream = (aclrtStream)0x01;
    const auto ret = aclrtCmoWaitBarrier(&taskInfo, stream, flag);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetDevicesTopo_failed_with_invalid_args)
{
    uint32_t deviceId = 1;
    uint32_t otherDeviceId = 2;
    uint64_t value = 0;
    auto ret = aclrtGetDevicesTopo(deviceId, otherDeviceId, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsGetPairDevicesInfo(_,_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtGetDevicesTopo(deviceId, otherDeviceId, &value);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetDevicesTopo_success)
{
    uint32_t deviceId = 1;
    uint32_t otherDeviceId = 2;
    uint64_t value = 0;
    auto ret = aclrtGetDevicesTopo(deviceId, otherDeviceId, &value);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemcpyBatch_failed_with_invalid_args)
{
    constexpr size_t numBatches = 10UL;
    void **dsts = reinterpret_cast<void **>(0x04);
    size_t destMax[numBatches] = {1, 0, 1, 1, 1, 1, 1, 1, 1, 1};
    void **srcs = reinterpret_cast<void **>(0x04);
    size_t sizes[numBatches] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
    aclrtMemcpyBatchAttr attrs;
    size_t attrsIndexes = 0;
    size_t numAttrs = 1;
    size_t failIndex = 0;

    auto ret = aclrtMemcpyBatch(nullptr, nullptr, nullptr, nullptr, 0, nullptr, nullptr, numAttrs, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatch(dsts, nullptr, nullptr, nullptr, 0, nullptr, nullptr, numAttrs, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatch(dsts, destMax, nullptr, nullptr, 0, nullptr, nullptr, numAttrs, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatch(dsts, destMax, srcs, nullptr, 0, nullptr, nullptr, numAttrs, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatch(dsts, destMax, srcs, sizes, 0, nullptr, nullptr, numAttrs, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatch(dsts, destMax, srcs, sizes, 0, &attrs, nullptr, numAttrs, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatch(dsts, destMax, srcs, sizes, 0, &attrs, &attrsIndexes, numAttrs, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatch(dsts, destMax, srcs, sizes, 0, &attrs, &attrsIndexes, numAttrs, &failIndex);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatch(dsts, destMax, srcs, sizes, numBatches, &attrs, &attrsIndexes, numAttrs, &failIndex);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    destMax[1] = 1;
    attrs.rsv[0] = 1;
    ret = aclrtMemcpyBatch(dsts, destMax, srcs, sizes, numBatches, &attrs, &attrsIndexes, numAttrs, &failIndex);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsMemcpyBatch(_,_,_,_,_,_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    constexpr uint32_t rsvMaxSize = sizeof(aclrtMemcpyBatchAttr::rsv) / sizeof(uint8_t);
    for (uint32_t i = 0U; i < rsvMaxSize; i++) {
        attrs.rsv[i] = 0U;
    }
    ret = aclrtMemcpyBatch(dsts, destMax, srcs, sizes, numBatches, &attrs, &attrsIndexes, numAttrs, &failIndex);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemcpyBatch_success)
{
    constexpr size_t numBatches = 10UL;
    void **dsts = reinterpret_cast<void **>(0x04);
    size_t destMax[numBatches] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
    void **srcs = reinterpret_cast<void **>(0x04);
    size_t sizes[numBatches] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
    aclrtMemcpyBatchAttr attrs;
    size_t attrsIndexes = 0;
    size_t numAttrs = 1;
    size_t failIndex = 0;
    constexpr uint32_t rsvMaxSize = sizeof(aclrtMemcpyBatchAttr::rsv) / sizeof(uint8_t);
    for (uint32_t i = 0U; i < rsvMaxSize; i++) {
        attrs.rsv[i] = 0U;
    }
    const auto ret = aclrtMemcpyBatch(dsts, destMax, srcs, sizes, numBatches, &attrs, &attrsIndexes, numAttrs, &failIndex);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemcpyBatch_success_with_all_zero_sizes)
{
    constexpr size_t numBatches = 2UL;
    void *dsts[numBatches] = {nullptr, nullptr};
    size_t destMax[numBatches] = {0, 0};
    void *srcs[numBatches] = {nullptr, nullptr};
    size_t sizes[numBatches] = {0, 0};
    aclrtMemcpyBatchAttr attrs = {};
    size_t attrsIndexes = 0;
    size_t failIndex = 0;

    const auto ret = aclrtMemcpyBatch(dsts, destMax, srcs, sizes, numBatches, &attrs, &attrsIndexes, 1, &failIndex);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_EQ(failIndex, SIZE_MAX);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemcpyBatch_success_with_mixed_zero_sizes)
{
    constexpr size_t numBatches = 2UL;
    void **dsts = reinterpret_cast<void **>(0x04);
    size_t destMax[numBatches] = {0, 1};
    void **srcs = reinterpret_cast<void **>(0x04);
    size_t sizes[numBatches] = {0, 1};
    aclrtMemcpyBatchAttr attrs = {};
    size_t attrsIndexes = 0;
    constexpr size_t numAttrs = 1UL;
    size_t failIndex = 0;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsMemcpyBatch(_,_,_,_,_,_,_,_))
        .WillOnce(Return(ACL_SUCCESS));
    auto ret = aclrtMemcpyBatch(dsts, destMax, srcs, sizes, numBatches, &attrs, &attrsIndexes, numAttrs, &failIndex);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsMemcpyBatch(_,_,_,_,_,_,_,_))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtMemcpyBatch(dsts, destMax, srcs, sizes, numBatches, &attrs, &attrsIndexes, numAttrs, &failIndex);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemcpyBatch_feature_not_support)
{
    constexpr size_t numBatches = 1UL;
    void **dsts = reinterpret_cast<void **>(0x04);
    size_t destMax[numBatches] = {1};
    void **srcs = reinterpret_cast<void **>(0x04);
    size_t sizes[numBatches] = {1};
    aclrtMemcpyBatchAttr attrs = {};
    size_t attrsIndexes = 0;
    constexpr size_t numAttrs = 1UL;
    size_t failIndex = 0;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsMemcpyBatch(_,_,_,_,_,_,_,_))
        .WillOnce(Return(ACL_ERROR_RT_FEATURE_NOT_SUPPORT));
    auto ret = aclrtMemcpyBatch(dsts, destMax, srcs, sizes, numBatches, &attrs, &attrsIndexes, numAttrs, &failIndex);
    EXPECT_EQ(ret, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsMemcpyBatchAsync(_,_,_,_,_,_,_,_,_,_))
        .WillOnce(Return(ACL_ERROR_RT_FEATURE_NOT_SUPPORT));
    ret = aclrtMemcpyBatchAsync(dsts, destMax, srcs, sizes, numBatches, &attrs, &attrsIndexes, numAttrs, &failIndex,
        nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemcpyBatchAsync_failed_with_invalid_args)
{
    constexpr size_t numBatches = 5UL;
    void **dsts = reinterpret_cast<void **>(0x04);
    size_t destMax[numBatches] = {1, 0, 1, 1, 1};
    void **srcs = reinterpret_cast<void **>(0x04);
    size_t sizes[numBatches] = {1, 1, 1, 1, 1};
    aclrtMemcpyBatchAttr attrs;
    size_t attrsIndexes = 0;
    size_t numAttrs = 1;
    size_t failIndex = 0;
    aclrtStream stream = nullptr;

    auto ret = aclrtMemcpyBatchAsync(nullptr, nullptr, nullptr, nullptr, 0,nullptr, nullptr, numAttrs, nullptr,
                                     stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatchAsync(dsts, nullptr, nullptr, nullptr, 0, nullptr, nullptr, numAttrs, nullptr, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatchAsync(dsts, destMax, nullptr, nullptr, 0, nullptr, nullptr, numAttrs, nullptr, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatchAsync(dsts, destMax, srcs, nullptr, 0, nullptr, nullptr, numAttrs, nullptr, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatchAsync(dsts, destMax, srcs, sizes, 0, nullptr, nullptr, numAttrs, nullptr, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatchAsync(dsts, destMax, srcs, sizes, 0, &attrs, nullptr, numAttrs, nullptr, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatchAsync(dsts, destMax, srcs, sizes, 0, &attrs, &attrsIndexes, numAttrs, nullptr, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatchAsync(dsts, destMax, srcs, sizes, 0, &attrs, &attrsIndexes, numAttrs, &failIndex, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatchAsync(dsts, destMax, srcs, sizes, numBatches, &attrs, &attrsIndexes, numAttrs, &failIndex, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    destMax[1] = 1;
    attrs.rsv[0] = 1;
    ret = aclrtMemcpyBatchAsync(dsts, destMax, srcs, sizes, numBatches, &attrs, &attrsIndexes, numAttrs, &failIndex, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsMemcpyBatchAsync(_,_,_,_,_,_,_,_,_,_))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    constexpr uint32_t rsvMaxSize = sizeof(aclrtMemcpyBatchAttr::rsv) / sizeof(uint8_t);
    for (uint32_t i = 0U; i < rsvMaxSize; i++) {
        attrs.rsv[i] = 0U;
    }
    ret = aclrtMemcpyBatchAsync(dsts, destMax, srcs, sizes, numBatches, &attrs, &attrsIndexes, numAttrs, &failIndex, stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemcpyBatchAsync_success)
{
    constexpr size_t numBatches = 5UL;
    void **dsts = reinterpret_cast<void **>(0x04);
    size_t destMax[numBatches] = {1, 1, 1, 1, 1};
    void **srcs = reinterpret_cast<void **>(0x04);
    size_t sizes[numBatches] = {1, 1, 1, 1, 1};
    aclrtMemcpyBatchAttr attrs;
    size_t attrsIndexes = 0;
    size_t numAttrs = 1;
    size_t failIndex = 0;
    attrs.dstLoc.type = ACL_MEM_LOCATION_TYPE_DEVICE;
    attrs.srcLoc.type = ACL_MEM_LOCATION_TYPE_DEVICE;
    constexpr uint32_t rsvMaxSize = sizeof(aclrtMemcpyBatchAttr::rsv) / sizeof(uint8_t);
    for (uint32_t i = 0U; i < rsvMaxSize; i++) {
        attrs.rsv[i] = 0U;
    }
    const auto ret = aclrtMemcpyBatchAsync(dsts, destMax, srcs, sizes, numBatches, &attrs, &attrsIndexes, numAttrs,
                                           &failIndex, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemcpyBatchAsync_success_with_all_zero_sizes)
{
    constexpr size_t numBatches = 2UL;
    void *dsts[numBatches] = {nullptr, nullptr};
    size_t destMax[numBatches] = {0, 0};
    void *srcs[numBatches] = {nullptr, nullptr};
    size_t sizes[numBatches] = {0, 0};
    aclrtMemcpyBatchAttr attrs = {};
    size_t attrsIndexes = 0;
    size_t failIndex = 0;

    const auto ret = aclrtMemcpyBatchAsync(dsts, destMax, srcs, sizes, numBatches, &attrs, &attrsIndexes, 1,
                                           &failIndex, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_EQ(failIndex, SIZE_MAX);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemcpyBatchAsync_success_with_mixed_zero_sizes)
{
    constexpr size_t numBatches = 2UL;
    void **dsts = reinterpret_cast<void **>(0x04);
    size_t destMax[numBatches] = {0, 1};
    void **srcs = reinterpret_cast<void **>(0x04);
    size_t sizes[numBatches] = {0, 1};
    aclrtMemcpyBatchAttr attrs = {};
    size_t attrsIndexes = 0;
    constexpr size_t numAttrs = 1UL;
    size_t failIndex = 0;
    aclrtStream stream = nullptr;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsMemcpyBatchAsync(_,_,_,_,_,_,_,_,_,_))
        .WillOnce(Return(ACL_SUCCESS));
    auto ret = aclrtMemcpyBatchAsync(dsts, destMax, srcs, sizes, numBatches, &attrs, &attrsIndexes, numAttrs,
        &failIndex, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsMemcpyBatchAsync(_,_,_,_,_,_,_,_,_,_))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtMemcpyBatchAsync(dsts, destMax, srcs, sizes, numBatches, &attrs, &attrsIndexes, numAttrs, &failIndex,
        stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemcpyBatchV2_failed_with_invalid_args)
{
    constexpr size_t numBatches = 10UL;
    void **dsts = reinterpret_cast<void **>(0x04);
    size_t destMax[numBatches] = {1, 0, 1, 1, 1, 1, 1, 1, 1, 1};
    void **srcs = reinterpret_cast<void **>(0x04);
    size_t sizes[numBatches] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
    aclrtMemcpyBatchAttr attrs;
    size_t attrsIndexes = 0;
    size_t numAttrs = 1;

    auto ret = aclrtMemcpyBatchV2(nullptr, nullptr, nullptr, nullptr, 0, nullptr, nullptr, numAttrs);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatchV2(dsts, nullptr, nullptr, nullptr, 0, nullptr, nullptr, numAttrs);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatchV2(dsts, destMax, nullptr, nullptr, 0, nullptr, nullptr, numAttrs);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatchV2(dsts, destMax, srcs, nullptr, 0, nullptr, nullptr, numAttrs);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatchV2(dsts, destMax, srcs, sizes, 0, nullptr, nullptr, numAttrs);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatchV2(dsts, destMax, srcs, sizes, 0, &attrs, nullptr, numAttrs);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatchV2(dsts, destMax, srcs, sizes, 0, &attrs, &attrsIndexes, numAttrs);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatchV2(dsts, destMax, srcs, sizes, numBatches, &attrs, &attrsIndexes, numAttrs);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    destMax[1] = 1;
    attrs.rsv[0] = 1;
    ret = aclrtMemcpyBatchV2(dsts, destMax, srcs, sizes, numBatches, &attrs, &attrsIndexes, numAttrs);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsMemcpyBatch(_,_,_,_,_,_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    constexpr uint32_t rsvMaxSize = sizeof(aclrtMemcpyBatchAttr::rsv) / sizeof(uint8_t);
    for (uint32_t i = 0U; i < rsvMaxSize; i++) {
        attrs.rsv[i] = 0U;
    }
    ret = aclrtMemcpyBatchV2(dsts, destMax, srcs, sizes, numBatches, &attrs, &attrsIndexes, numAttrs);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemcpyBatchV2_success)
{
    constexpr size_t numBatches = 10UL;
    void **dsts = reinterpret_cast<void **>(0x04);
    size_t destMax[numBatches] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
    void **srcs = reinterpret_cast<void **>(0x04);
    size_t sizes[numBatches] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
    aclrtMemcpyBatchAttr attrs;
    size_t attrsIndexes = 0;
    size_t numAttrs = 1;
    constexpr uint32_t rsvMaxSize = sizeof(aclrtMemcpyBatchAttr::rsv) / sizeof(uint8_t);
    for (uint32_t i = 0U; i < rsvMaxSize; i++) {
        attrs.rsv[i] = 0U;
    }
    const auto ret = aclrtMemcpyBatchV2(dsts, destMax, srcs, sizes, numBatches, &attrs, &attrsIndexes, numAttrs);
    EXPECT_EQ(ret, ACL_SUCCESS);

    // sizes 全 0, 其他参数异常时,aclrtMemcpyBatchV2 仍然返回 ACL_SUCCESS
    for(size_t i = 0; i < numBatches; ++i) {
        sizes[i] = 0;
    }
    const auto ret_size_zero = aclrtMemcpyBatchV2(nullptr, nullptr, nullptr, sizes, numBatches, &attrs, &attrsIndexes, numAttrs);
    EXPECT_EQ(ret_size_zero, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemcpyBatchAsyncV2_failed_with_invalid_args)
{
    constexpr size_t numBatches = 5UL;
    void **dsts = reinterpret_cast<void **>(0x04);
    size_t destMax[numBatches] = {1, 0, 1, 1, 1};
    void **srcs = reinterpret_cast<void **>(0x04);
    size_t sizes[numBatches] = {1, 1, 1, 1, 1};
    aclrtMemcpyBatchAttr attrs;
    size_t attrsIndexes = 0;
    size_t numAttrs = 1;
    aclrtStream stream = nullptr;

    auto ret = aclrtMemcpyBatchAsyncV2(nullptr, nullptr, nullptr, nullptr, 0, nullptr, nullptr, numAttrs, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatchAsyncV2(dsts, nullptr, nullptr, nullptr, 0, nullptr, nullptr, numAttrs, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatchAsyncV2(dsts, destMax, nullptr, nullptr, 0, nullptr, nullptr, numAttrs, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatchAsyncV2(dsts, destMax, srcs, nullptr, 0, nullptr, nullptr, numAttrs, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatchAsyncV2(dsts, destMax, srcs, sizes, 0, nullptr, nullptr, numAttrs, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatchAsyncV2(dsts, destMax, srcs, sizes, 0, &attrs, nullptr, numAttrs, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatchAsyncV2(dsts, destMax, srcs, sizes, 0, &attrs, &attrsIndexes, numAttrs, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemcpyBatchAsyncV2(dsts, destMax, srcs, sizes, numBatches, &attrs, &attrsIndexes, numAttrs, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    destMax[1] = 1;
    attrs.rsv[0] = 1;
    ret = aclrtMemcpyBatchAsyncV2(dsts, destMax, srcs, sizes, numBatches, &attrs, &attrsIndexes, numAttrs, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsMemcpyBatchAsync(_,_,_,_,_,_,_,_,_,_))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    constexpr uint32_t rsvMaxSize = sizeof(aclrtMemcpyBatchAttr::rsv) / sizeof(uint8_t);
    for (uint32_t i = 0U; i < rsvMaxSize; i++) {
        attrs.rsv[i] = 0U;
    }
    ret = aclrtMemcpyBatchAsyncV2(dsts, destMax, srcs, sizes, numBatches, &attrs, &attrsIndexes, numAttrs, stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemcpyBatchAsyncV2_success)
{
    constexpr size_t numBatches = 5UL;
    void **dsts = reinterpret_cast<void **>(0x04);
    size_t destMax[numBatches] = {1, 1, 1, 1, 1};
    void **srcs = reinterpret_cast<void **>(0x04);
    size_t sizes[numBatches] = {1, 1, 1, 1, 1};
    aclrtMemcpyBatchAttr attrs;
    size_t attrsIndexes = 0;
    size_t numAttrs = 1;
    attrs.dstLoc.type = ACL_MEM_LOCATION_TYPE_DEVICE;
    attrs.srcLoc.type = ACL_MEM_LOCATION_TYPE_DEVICE;
    constexpr uint32_t rsvMaxSize = sizeof(aclrtMemcpyBatchAttr::rsv) / sizeof(uint8_t);
    for (uint32_t i = 0U; i < rsvMaxSize; i++) {
        attrs.rsv[i] = 0U;
    }
    const auto ret = aclrtMemcpyBatchAsyncV2(dsts, destMax, srcs, sizes, numBatches, &attrs, &attrsIndexes,
        numAttrs, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    // sizes 全 0, 其他参数异常时,aclrtMemcpyBatchV2 仍然返回 ACL_SUCCESS
    for(size_t i = 0; i < numBatches; ++i) {
        sizes[i] = 0;
    }
    const auto ret_size_zero = aclrtMemcpyBatchAsyncV2(nullptr, nullptr, nullptr, sizes, numBatches, &attrs, &attrsIndexes, numAttrs, nullptr);
    EXPECT_EQ(ret_size_zero, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtIpcMemGetExportKey_failed_with_invalid_args)
{
    void *devPtr = (void*)0xff;
    size_t size = 1;
    char key[] = "key";
    size_t len = 3;
    uint64_t flags = 1;
    auto ret = aclrtIpcMemGetExportKey(nullptr, size, nullptr, len, flags);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtIpcMemGetExportKey(devPtr, size, nullptr, len, flags);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsIpcMemGetExportKey(_,_,_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtIpcMemGetExportKey(devPtr, size, key, len, flags);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtIpcMemGetExportKey_success)
{
    void *devPtr = (void*)0xff;
    size_t size = 1;
    char key[] = "key";
    size_t len = 3;
    uint64_t flags = 1;
    const auto ret = aclrtIpcMemGetExportKey(devPtr, size, key, len, flags);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtIpcMemClose_failed_with_invalid_args)
{
    const char *key = "key";
    auto ret = aclrtIpcMemClose(nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsIpcMemClose(_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtIpcMemClose(key);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtIpcMemClose_success)
{
    const char *key = "key";
    const auto ret = aclrtIpcMemClose(key);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtIpcMemImportByKey_failed_with_invalid_args)
{
    void *devPtr = nullptr;
    const char *key = "key";
    uint64_t flags = 1;
    auto ret = aclrtIpcMemImportByKey(nullptr, nullptr, flags);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtIpcMemImportByKey(&devPtr, nullptr, flags);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsIpcMemImportByKey(_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtIpcMemImportByKey(&devPtr, key, flags);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtIpcMemImportByKey_success)
{
    void *devPtr = nullptr;
    const char *key = "key";
    uint64_t flags = 1;
    const auto ret = aclrtIpcMemImportByKey(&devPtr, key, flags);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtIpcMemSetImportPid_failed_with_invalid_args)
{
    const char *key = "key";
    int32_t pid[] = {1, 2, 3};
    size_t num = 3;
    auto ret = aclrtIpcMemSetImportPid(nullptr, nullptr, num);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtIpcMemSetImportPid(key, nullptr, num);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsIpcMemSetImportPid(_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtIpcMemSetImportPid(key, pid, num);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtIpcMemSetImportPid_success)
{
    const char *key = "key";
    int32_t pid[] = {1, 2, 3};
    size_t num = 3;
    const auto ret = aclrtIpcMemSetImportPid(key, pid, num);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtIpcMemImportPidInterServer)
{
    const char *key = "key";
    aclrtServerPid serverPids[3] = {};
    size_t num = 3;
    auto ret = aclrtIpcMemImportPidInterServer(key, serverPids, num);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtIpcMemImportPidInterServer(_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtIpcMemImportPidInterServer(key, serverPids, num);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);  
}

TEST_F(UTEST_ACL_Runtime, aclrtIpcSetMemoryAttr)
{
    const char *key = "key";
    aclrtIpcMemAttrType type = ACL_RT_IPC_MEM_ATTR_ACCESS_LINK;
    uint64_t attr = ACL_RT_IPC_MEM_ATTR_ACCESS_LINK_SIO;
    auto ret = aclrtIpcMemSetAttr(key, type, attr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtIpcSetMemoryAttr(_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtIpcMemSetAttr(key, type, attr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);  
}

TEST_F(UTEST_ACL_Runtime, aclrtNotifyBatchReset_failed_with_invalid_args)
{
    aclrtNotify notifies = nullptr;
    size_t num = 3;
    auto ret = aclrtNotifyBatchReset(nullptr, num);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsNotifyBatchReset(_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtNotifyBatchReset(&notifies, num);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtNotifyBatchReset_success)
{
    aclrtNotify notifies = nullptr;
    size_t num = 3;
    const auto ret = aclrtNotifyBatchReset(&notifies, num);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtNotifyGetExportKey_failed_with_invalid_args)
{
    aclrtNotify notify = (aclrtNotify)0x01;
    char key[] = "key";
    size_t len = 3;
    uint64_t flags = 1;
    auto ret = aclrtNotifyGetExportKey(nullptr, nullptr, len, flags);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtNotifyGetExportKey(notify, nullptr, len, flags);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsNotifyGetExportKey(_,_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtNotifyGetExportKey(notify, key, len, flags);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtNotifyGetExportKey_success)
{
    aclrtNotify notify = (aclrtNotify)0x01;
    char key[] = "key";
    size_t len = 3;
    uint64_t flags = 1;
    const auto ret = aclrtNotifyGetExportKey(notify, key, len, flags);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtNotifyImportByKey_failed_with_invalid_args)
{
    aclrtNotify notify = nullptr;
    const char *key = "key";
    uint64_t flags = 1;
    auto ret = aclrtNotifyImportByKey(nullptr, nullptr, flags);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtNotifyImportByKey(&notify, nullptr, flags);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsNotifyImportByKey(_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtNotifyImportByKey(&notify, key, flags);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtNotifyImportByKey_success)
{
    aclrtNotify notify = nullptr;
    const char *key = "key";
    uint64_t flags = 1;
    const auto ret = aclrtNotifyImportByKey(&notify, key, flags);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtNotifySetImportPid_failed_with_invalid_args)
{
    aclrtNotify notify = (aclrtNotify)0x01;
    int32_t pid[] = {1, 2, 3};
    size_t num = 3;
    auto ret = aclrtNotifySetImportPid(nullptr, nullptr, num);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtNotifySetImportPid(notify, nullptr, num);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsNotifySetImportPid(_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtNotifySetImportPid(notify, pid, num);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtNotifySetImportPid_success)
{
    aclrtNotify notify = (aclrtNotify)0x01;
    int32_t pid[] = {1, 2, 3};
    size_t num = 3;
    const auto ret = aclrtNotifySetImportPid(notify, pid, num);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtNotifySetImportPidInterServer)
{
    aclrtNotify notify = (aclrtNotify)0x01;
    aclrtServerPid serverPid[3] = {};
    size_t num = 3;
    auto ret = aclrtNotifySetImportPidInterServer(notify, serverPid, num);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtNotifySetImportPidInterServer(_,_,_))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtNotifySetImportPidInterServer(notify, serverPid, num);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, InitCallbackManager_InitCallbackTest)
{
    auto &cbMgrInstance = InitCallbackManager::GetInstance();
    auto bakInitCbMap = cbMgrInstance.initCallbackMap_;
    cbMgrInstance.initCallbackMap_.clear();
    auto ret = cbMgrInstance.RegInitCallback(ACL_REG_TYPE_ACL_MODEL, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
    ret = cbMgrInstance.RegInitCallback(ACL_REG_TYPE_ACL_MODEL, InitCallback_Success, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = cbMgrInstance.RegInitCallback(ACL_REG_TYPE_ACL_MODEL, InitCallback_Success, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INTERNAL_ERROR);
    ret = cbMgrInstance.RegInitCallback(ACL_REG_TYPE_OTHER, InitCallback_Success, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = cbMgrInstance.RegInitCallback(ACL_REG_TYPE_OTHER, InitCallback_Success, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = cbMgrInstance.UnRegInitCallback(ACL_REG_TYPE_ACL_MODEL, InitCallback_Success);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = cbMgrInstance.UnRegInitCallback(ACL_REG_TYPE_ACL_MODEL, InitCallback_Fail);
    EXPECT_EQ(ret, ACL_ERROR_INTERNAL_ERROR);
    ret = cbMgrInstance.UnRegInitCallback(ACL_REG_TYPE_OTHER, InitCallback_Success);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = cbMgrInstance.UnRegInitCallback(ACL_REG_TYPE_OTHER, InitCallback_Success);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = cbMgrInstance.UnRegInitCallback(ACL_REG_TYPE_OTHER, InitCallback_Success);
    EXPECT_EQ(ret, ACL_ERROR_INTERNAL_ERROR);
    cbMgrInstance.initCallbackMap_ = bakInitCbMap;
}

TEST_F(UTEST_ACL_Runtime, aclCallbackManager_FinalizeCallbackTest)
{
    auto &cbMgrInstance = InitCallbackManager::GetInstance();
    auto bakFinalizeCbMap = cbMgrInstance.finalizeCallbackMap_;
    cbMgrInstance.finalizeCallbackMap_.clear();
    auto ret = cbMgrInstance.RegFinalizeCallback(ACL_REG_TYPE_ACL_MODEL, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
    ret = cbMgrInstance.RegFinalizeCallback(ACL_REG_TYPE_ACL_MODEL, FinalizeCallback_Success, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = cbMgrInstance.RegFinalizeCallback(ACL_REG_TYPE_ACL_MODEL, FinalizeCallback_Success, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INTERNAL_ERROR);
    ret = cbMgrInstance.RegFinalizeCallback(ACL_REG_TYPE_OTHER, FinalizeCallback_Success, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = cbMgrInstance.RegFinalizeCallback(ACL_REG_TYPE_OTHER, FinalizeCallback_Success, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = cbMgrInstance.UnRegFinalizeCallback(ACL_REG_TYPE_ACL_MODEL, FinalizeCallback_Success);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = cbMgrInstance.UnRegFinalizeCallback(ACL_REG_TYPE_ACL_MODEL, FinalizeCallback_Fail);
    EXPECT_EQ(ret, ACL_ERROR_INTERNAL_ERROR);
    ret = cbMgrInstance.UnRegFinalizeCallback(ACL_REG_TYPE_OTHER, FinalizeCallback_Success);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = cbMgrInstance.UnRegFinalizeCallback(ACL_REG_TYPE_OTHER, FinalizeCallback_Success);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = cbMgrInstance.UnRegFinalizeCallback(ACL_REG_TYPE_OTHER, FinalizeCallback_Success);
    EXPECT_EQ(ret, ACL_ERROR_INTERNAL_ERROR);
    cbMgrInstance.finalizeCallbackMap_ = bakFinalizeCbMap;
}

TEST_F(UTEST_ACL_Runtime, InitCallbackManager_NotifyOrderForOtherType)
{
    auto &cbMgrInstance = InitCallbackManager::GetInstance();
    // The singleton has no public reset API, so this test isolates private maps and restores them with RAII.
    CallbackMapGuard callbackMapGuard(cbMgrInstance);

    auto ret = cbMgrInstance.RegInitCallback(ACL_REG_TYPE_OTHER, InitCallback_RecordOrder, reinterpret_cast<void *>(1));
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = cbMgrInstance.RegInitCallback(ACL_REG_TYPE_OTHER, InitCallback_RecordOrder, reinterpret_cast<void *>(2));
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = cbMgrInstance.NotifyInitCallback(ACL_REG_TYPE_OTHER, nullptr, 0U);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ASSERT_EQ(g_callbackOrder.size(), 2U);
    EXPECT_EQ(g_callbackOrder[0], 1);
    EXPECT_EQ(g_callbackOrder[1], 2);
}

TEST_F(UTEST_ACL_Runtime, InitCallbackManager_FinalizeNotifyOrderForOtherType)
{
    auto &cbMgrInstance = InitCallbackManager::GetInstance();
    // The singleton has no public reset API, so this test isolates private maps and restores them with RAII.
    CallbackMapGuard callbackMapGuard(cbMgrInstance);

    auto ret = cbMgrInstance.RegFinalizeCallback(ACL_REG_TYPE_OTHER, FinalizeCallback_RecordOrder,
        reinterpret_cast<void *>(1));
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = cbMgrInstance.RegFinalizeCallback(ACL_REG_TYPE_OTHER, FinalizeCallback_RecordOrder,
        reinterpret_cast<void *>(2));
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = cbMgrInstance.NotifyFinalizeCallback(ACL_REG_TYPE_OTHER);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ASSERT_EQ(g_callbackOrder.size(), 2U);
    EXPECT_EQ(g_callbackOrder[0], 1);
    EXPECT_EQ(g_callbackOrder[1], 2);
}

TEST_F(UTEST_ACL_Runtime, aclInitCallbackApiTest) {
    auto ret = aclInit(nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    auto &cbMgrInstance = InitCallbackManager::GetInstance();
    auto bakInitCbMap = cbMgrInstance.initCallbackMap_;
    cbMgrInstance.initCallbackMap_.clear();
    ret = aclInitCallbackRegister(ACL_REG_TYPE_ACL_MODEL, InitCallback_Success, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclInitCallbackUnRegister(ACL_REG_TYPE_ACL_MODEL, InitCallback_Fail);
    EXPECT_EQ(ret, ACL_ERROR_INTERNAL_ERROR);
    ret = aclInitCallbackRegister(ACL_REG_TYPE_ACL_MODEL, InitCallback_Fail, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INTERNAL_ERROR);
    ret = aclInitCallbackUnRegister(ACL_REG_TYPE_ACL_MODEL, InitCallback_Success);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclInitCallbackUnRegister(ACL_REG_TYPE_ACL_MODEL, InitCallback_Fail);
    EXPECT_EQ(ret, ACL_ERROR_INTERNAL_ERROR);
    ret = aclInitCallbackRegister(ACL_REG_TYPE_ACL_MODEL, InitCallback_Success, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclInitCallbackRegister(ACL_REG_TYPE_OTHER, InitCallback_Success, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclInitCallbackRegister(ACL_REG_TYPE_OTHER, InitCallback_Fail, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclInitCallbackUnRegister(ACL_REG_TYPE_OTHER, InitCallback_Success);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclInitCallbackUnRegister(ACL_REG_TYPE_OTHER, InitCallback_Fail);
    EXPECT_EQ(ret, ACL_SUCCESS);
    cbMgrInstance.initCallbackMap_ = bakInitCbMap;

    ret = aclFinalize();
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclInitCallbackTest) {
    const std::string configPath = ACL_BASE_DIR "/tests/ut/acl/json/handleOpConfig.json";
    auto &cbMgrInstance = InitCallbackManager::GetInstance();
    auto bakInitCbMap = cbMgrInstance.initCallbackMap_;
    auto bakFinalizeCbMap = cbMgrInstance.finalizeCallbackMap_;
    cbMgrInstance.initCallbackMap_.clear();
    cbMgrInstance.finalizeCallbackMap_.clear();

    auto ret = aclInitCallbackRegister(ACL_REG_TYPE_ACL_MODEL, InitCallback_Fail, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclInit(nullptr);
    EXPECT_EQ(ret, ACL_ERROR_FAILURE);
    cbMgrInstance.initCallbackMap_.clear();

    resetAclJsonHash();
    ret = aclInitCallbackRegister(ACL_REG_TYPE_ACL_OP_EXECUTOR, InitCallback_Fail, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclInit(configPath.c_str());
    EXPECT_EQ(ret, ACL_ERROR_FAILURE);
    cbMgrInstance.initCallbackMap_.clear();

    ret = aclInitCallbackRegister(ACL_REG_TYPE_ACL_DVPP, InitCallback_Fail, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclInit(nullptr);
    EXPECT_EQ(ret, ACL_ERROR_FAILURE);
    cbMgrInstance.initCallbackMap_.clear();

    ret = aclInitCallbackRegister(ACL_REG_TYPE_OTHER, InitCallback_Fail, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclInit(nullptr);
    EXPECT_EQ(ret, ACL_ERROR_FAILURE);
    cbMgrInstance.initCallbackMap_.clear();

    ret = aclInit(nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclFinalizeCallbackRegister(ACL_REG_TYPE_ACL_MODEL, FinalizeCallback_Fail, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclFinalize();
    EXPECT_EQ(ret, ACL_ERROR_FAILURE);
    cbMgrInstance.finalizeCallbackMap_.clear();

    ret = aclFinalizeCallbackRegister(ACL_REG_TYPE_ACL_OP_COMPILER, FinalizeCallback_Fail, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclFinalize();
    EXPECT_EQ(ret, ACL_ERROR_FAILURE);
    cbMgrInstance.finalizeCallbackMap_.clear();

    ret = aclFinalizeCallbackRegister(ACL_REG_TYPE_ACL_DVPP, FinalizeCallback_Fail, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclFinalize();
    EXPECT_EQ(ret, ACL_ERROR_FAILURE);
    cbMgrInstance.finalizeCallbackMap_.clear();

    ret = aclFinalizeCallbackRegister(ACL_REG_TYPE_OTHER, FinalizeCallback_Fail, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclFinalize();
    EXPECT_EQ(ret, ACL_ERROR_FAILURE);
    cbMgrInstance.finalizeCallbackMap_.clear();

    ret = aclFinalize();
    EXPECT_EQ(ret, ACL_SUCCESS);

    cbMgrInstance.initCallbackMap_ = bakInitCbMap;
    cbMgrInstance.finalizeCallbackMap_ = bakFinalizeCbMap;
}

TEST_F(UTEST_ACL_Runtime, aclFinalizeCallbackApiTest) {
    auto ret = aclInit(nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    auto &cbMgrInstance = InitCallbackManager::GetInstance();
    auto bakFinalizeCbMap = cbMgrInstance.finalizeCallbackMap_;
    cbMgrInstance.finalizeCallbackMap_.clear();

    ret = aclFinalizeCallbackRegister(ACL_REG_TYPE_ACL_MODEL, FinalizeCallback_Success, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclFinalizeCallbackUnRegister(ACL_REG_TYPE_ACL_MODEL, FinalizeCallback_Fail);
    EXPECT_EQ(ret, ACL_ERROR_INTERNAL_ERROR);
    ret = aclFinalizeCallbackRegister(ACL_REG_TYPE_ACL_MODEL, FinalizeCallback_Fail, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INTERNAL_ERROR);
    ret = aclFinalizeCallbackUnRegister(ACL_REG_TYPE_ACL_MODEL, FinalizeCallback_Success);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclFinalizeCallbackUnRegister(ACL_REG_TYPE_ACL_MODEL, FinalizeCallback_Fail);
    EXPECT_EQ(ret, ACL_ERROR_INTERNAL_ERROR);
    ret = aclFinalizeCallbackRegister(ACL_REG_TYPE_ACL_MODEL, FinalizeCallback_Success, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclFinalizeCallbackRegister(ACL_REG_TYPE_OTHER, FinalizeCallback_Success, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclFinalizeCallbackRegister(ACL_REG_TYPE_OTHER, FinalizeCallback_Fail, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclFinalizeCallbackUnRegister(ACL_REG_TYPE_OTHER, FinalizeCallback_Success);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclFinalizeCallbackUnRegister(ACL_REG_TYPE_OTHER, FinalizeCallback_Fail);
    EXPECT_EQ(ret, ACL_SUCCESS);

    cbMgrInstance.finalizeCallbackMap_ = bakFinalizeCbMap;

    ret = aclFinalize();
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtProfTrace_invalid_userdata)
{
    int32_t length = 18;
    aclrtStream stream = (aclrtStream)0x01;

    const auto ret = aclrtProfTrace(nullptr, length, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtProfTrace_invalid_length)
{
    int32_t length = 20;
    aclrtStream stream = (aclrtStream)0x01;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsProfTrace(_,_,_))
                .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    uint8_t data[length] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
        0x10, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10};
    const auto ret = aclrtProfTrace(&data, length, stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtProfTrace_success_1)
{
    int32_t length = 15;
    aclrtStream stream = (aclrtStream)0x01;
    uint8_t data[length] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
        0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsProfTrace(_,_,_))
                .WillOnce(Return(ACL_SUCCESS));

    const auto ret = aclrtProfTrace(&data, length, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtProfTrace_success_2)
{
    int32_t length = 18;
    aclrtStream stream = (aclrtStream)0x01;
    uint8_t data[length] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
        0x09, 0x10, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsProfTrace(_,_,_))
                .WillOnce(Return(ACL_SUCCESS));

    const auto ret = aclrtProfTrace(&data, length, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, launch_kernel_V2_failed_with_nullptr_input)
{
    aclrtFuncHandle funcHandle = nullptr;
    void *argsData = nullptr;
    aclrtStream stream = nullptr;
    aclError ret = aclrtLaunchKernelV2(funcHandle, 0, argsData, 0, nullptr, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    funcHandle = (aclrtFuncHandle)0x01U;
    ret = aclrtLaunchKernelV2(funcHandle, 0, argsData, 0, nullptr, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, launch_kernel_V2_successful)
{
    aclrtFuncHandle funcHandle = (aclrtFuncHandle)0x01U;
    void *argsData = reinterpret_cast<void *>(0x01U);
    aclrtStream stream = (aclrtStream)0x01U;
    uint32_t blockDim = 24;
    size_t argsSize = 100;

    aclrtLaunchKernelCfg cfg;
    cfg.numAttrs = 1U;

    aclrtLaunchKernelAttr attrs[cfg.numAttrs];
    attrs[0U].id = ACL_RT_LAUNCH_KERNEL_ATTR_SCHEM_MODE;

    aclrtLaunchKernelAttrValue value;
    value.schemMode = 1U;
    attrs[0U].value = value;
    cfg.attrs = attrs;

    aclError ret = aclrtLaunchKernelV2(funcHandle, blockDim, argsData, argsSize, &cfg, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtLaunchKernelV2(funcHandle, blockDim, argsData, argsSize, nullptr, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, launch_kernel_V2_failed_with_rt_launch_kernel_func_failed)
{
    aclrtFuncHandle funcHandle = (aclrtFuncHandle)0x01U;
    void *argsData = reinterpret_cast<void *>(0x01U);
    aclrtStream stream = (aclrtStream)0x01U;
    uint32_t blockDim = 24;
    size_t argsSize = 100;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsLaunchKernelWithDevArgs(_, _, _, _, _, _, _))
          .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
    aclError ret = aclrtLaunchKernelV2(funcHandle, blockDim, argsData, argsSize, nullptr, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, launch_kernel_V2_failed_with_rt_launch_kernel_func_failed_2)
{
    aclrtFuncHandle funcHandle = (aclrtFuncHandle)0x01U;
    void *argsData = reinterpret_cast<void *>(0x01U);
    aclrtStream stream = (aclrtStream)0x01U;
    uint32_t blockDim = 24;
    size_t argsSize = 100;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsLaunchKernelWithDevArgs(_, _, _, _, _, _, _))
          .WillOnce(Return(ACL_ERROR_RT_INVALID_HANDLE));
    aclError ret = aclrtLaunchKernelV2(funcHandle, blockDim, argsData, argsSize, nullptr, stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_INVALID_HANDLE);
}

TEST_F(UTEST_ACL_Runtime, launch_kernel_with_host_args_failed_with_nullptr_input)
{
    aclrtFuncHandle funcHandle = nullptr;
    void *hostArgs = nullptr;
    aclrtStream stream = nullptr;
    aclError ret = aclrtLaunchKernelWithHostArgs(funcHandle, 0, stream, nullptr, hostArgs, 0, nullptr, 0);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    funcHandle = (aclrtFuncHandle)0x01U;
    ret = aclrtLaunchKernelWithHostArgs(funcHandle, 0, stream, nullptr, hostArgs, 0, nullptr, 0);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, launch_kernel_with_host_args_successful)
{
    aclrtFuncHandle funcHandle = (aclrtFuncHandle)0x01U;
    void *hostArgs = reinterpret_cast<void *>(0x01U);
    aclrtStream stream = (aclrtStream)0x01U;
    uint32_t blockDim = 24;
    size_t argsSize = 100;

    aclrtLaunchKernelCfg cfg;
    cfg.numAttrs = 1U;

    aclrtLaunchKernelAttr attrs[cfg.numAttrs];
    attrs[0U].id = ACL_RT_LAUNCH_KERNEL_ATTR_SCHEM_MODE;

    aclrtLaunchKernelAttrValue value;
    value.schemMode = 1U;
    attrs[0U].value = value;
    cfg.attrs = attrs;

    aclrtPlaceHolderInfo placeHolderArray;
    placeHolderArray.addrOffset = 0;
    placeHolderArray.dataOffset = 0;

    aclError ret = aclrtLaunchKernelWithHostArgs(funcHandle, blockDim, stream, &cfg, hostArgs, argsSize, &placeHolderArray, 1);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtLaunchKernelWithHostArgs(funcHandle, blockDim, stream, nullptr, hostArgs, argsSize, nullptr, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, launch_kernel_with_host_args_failed_with_rt_launch_kernel_func_failed)
{
    aclrtFuncHandle funcHandle = (aclrtFuncHandle)0x01U;
    void *hostArgs = reinterpret_cast<void *>(0x01U);
    aclrtStream stream = (aclrtStream)0x01U;
    uint32_t blockDim = 24;
    size_t argsSize = 100;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsLaunchKernelWithHostArgs(_, _, _, _, _, _, _, _))
          .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
    aclError ret = aclrtLaunchKernelWithHostArgs(funcHandle, blockDim, stream, nullptr, hostArgs, argsSize, nullptr, 0);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, launch_kernel_with_host_args_failed_with_rt_launch_kernel_func_failed_2)
{
    aclrtFuncHandle funcHandle = (aclrtFuncHandle)0x01U;
    void *hostArgs = reinterpret_cast<void *>(0x01U);
    aclrtStream stream = (aclrtStream)0x01U;
    uint32_t blockDim = 24;
    size_t argsSize = 100;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsLaunchKernelWithHostArgs(_, _, _, _, _, _, _, _))
          .WillOnce(Return(ACL_ERROR_RT_INVALID_HANDLE));
    aclError ret = aclrtLaunchKernelWithHostArgs(funcHandle, blockDim, stream, nullptr, hostArgs, argsSize, nullptr, 0);
    EXPECT_EQ(ret, ACL_ERROR_RT_INVALID_HANDLE);
}

TEST_F(UTEST_ACL_Runtime, aclrtCtxGetFloatOverflowAddr_success)
{
    aclError ret = aclrtCtxGetFloatOverflowAddr(nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsCtxGetFloatOverflowAddr(_))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtCtxGetFloatOverflowAddr(nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetFloatOverflowStatus_success)
{
    aclError ret = aclrtGetFloatOverflowStatus(0, 0, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsGetFloatOverflowStatus(_,_,_))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtGetFloatOverflowStatus(0, 0, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtResetFloatOverflowStatus_success)
{
    aclError ret = aclrtResetFloatOverflowStatus(nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsResetFloatOverflowStatus(_))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtResetFloatOverflowStatus(nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtNpuGetFloatOverFlowStatus_success)
{
    aclError ret = aclrtNpuGetFloatOverFlowStatus(nullptr, 0, 0, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsNpuGetFloatOverFlowStatus(_,_,_,_))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtNpuGetFloatOverFlowStatus(nullptr, 0, 0, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtNpuClearFloatOverFlowStatus_success)
{
    aclError ret = aclrtNpuClearFloatOverFlowStatus(0, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsNpuClearFloatOverFlowStatus(_,_))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtNpuClearFloatOverFlowStatus(0, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, get_hardware_sync_addr)
{
    void *addr = nullptr;
    aclError ret = aclrtGetHardwareSyncAddr(&addr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsGetHardwareSyncAddr(_))
        .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
    ret = aclrtGetHardwareSyncAddr(&addr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, launch_random_task)
{
    aclrtStream stream = (aclrtStream)0x01U;
    aclrtRandomNumTaskInfo info = {};
    void *resv = reinterpret_cast<void *>(0x01U);
    aclError ret = aclrtRandomNumAsync(nullptr, stream, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    info.dataType = ACL_BOOL;
    ret = aclrtRandomNumAsync(&info, nullptr, resv);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    info.dataType = ACL_FLOAT16;
    ret = aclrtRandomNumAsync(&info, stream, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    info.dataType = ACL_FLOAT16;
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsLaunchRandomNumTask(_, _, _))
        .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
    ret = aclrtRandomNumAsync(&info, stream, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

void taskFailCallback(aclrtExceptionInfo exceptionInfo)
{
    (void)exceptionInfo;
}

void streamStateCallback(aclrtStream stm, aclrtStreamState state, void *args)
{
    (void)stm;
    (void)state;
    (void)args;
}

TEST_F(UTEST_ACL_Runtime, set_stream_state_callback)
{
    const char_t *name = "callback";
    void *resv = reinterpret_cast<void *>(0x01U);
    aclError ret = aclrtRegStreamStateCallback(nullptr, streamStateCallback, resv);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
    ret = aclrtRegStreamStateCallback(name, nullptr, resv);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtRegStreamStateCallback(name, streamStateCallback, resv);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsRegStreamStateCallback(_, _, _))
        .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
    ret = aclrtRegStreamStateCallback(name, streamStateCallback, resv);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

void deviceStateCallback(int32_t deviceId, aclrtDeviceState state, void *args)
{
    (void)deviceId;
    (void)state;
    (void)args;
}

TEST_F(UTEST_ACL_Runtime, set_device_state_callback)
{
    const char_t *name = "callback";
    void *resv = reinterpret_cast<void *>(0x01U);
    aclError ret = aclrtRegDeviceStateCallback(nullptr, deviceStateCallback, resv);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
    ret = aclrtRegDeviceStateCallback(name, nullptr, resv);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtRegDeviceStateCallback(name, deviceStateCallback, resv);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsRegDeviceStateCallback(_, _, _))
        .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
    ret = aclrtRegDeviceStateCallback(name, deviceStateCallback, resv);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

int32_t taskAbortCallback(int32_t deviceId, aclrtDeviceTaskAbortStage stage, uint32_t timeout, void *args)
{
    (void)deviceId;
    (void)stage;
    (void)timeout;
    (void)args;
    return 0;
}

TEST_F(UTEST_ACL_Runtime, set_task_abort_callback)
{
    const char_t *name = "callback";
    aclError ret = aclrtSetDeviceTaskAbortCallback(nullptr, taskAbortCallback, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
    ret = aclrtSetDeviceTaskAbortCallback(name, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtSetDeviceTaskAbortCallback(name, taskAbortCallback, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsSetDeviceTaskAbortCallback(_, _, _))
        .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
    void *resv = reinterpret_cast<void *>(0x01U);
    ret = aclrtSetDeviceTaskAbortCallback(name, taskAbortCallback, resv);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, get_op_execute_timeout)
{
    uint32_t timeout = 0U;
    aclError ret = aclrtGetOpExecuteTimeout(nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtGetOpExecuteTimeout(&timeout);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetOpExecuteTimeoutV2(_))
        .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
    ret = aclrtGetOpExecuteTimeout(&timeout);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, device_peer_access_status)
{
    int32_t devIdDes = 0U;
    int32_t phyIdSrc = 0U;
    int32_t status = 0U;
    aclError ret = aclrtDevicePeerAccessStatus(devIdDes, phyIdSrc, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtDevicePeerAccessStatus(devIdDes, phyIdSrc, &status);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsGetP2PStatus(_, _, _))
        .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
    ret = aclrtDevicePeerAccessStatus(devIdDes, phyIdSrc, &status);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, stream_stop)
{
    aclrtStream stream = (aclrtStream)0x01U;
    aclError ret = aclrtStreamStop(nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtStreamStop(stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsStreamStop(_))
        .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
    ret = aclrtStreamStop(stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, launch_update_task)
{
    aclrtStream stream = (aclrtStream)0x01U;
    uint32_t taskId = 0U;
    aclrtStream execStream = (aclrtStream)0x01U;
    aclrtTaskUpdateInfo info = {};
    
    aclError ret = aclrtTaskUpdateAsync(nullptr, taskId, &info, execStream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtTaskUpdateAsync(stream, UINT32_MAX, &info, execStream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtTaskUpdateAsync(stream, taskId, nullptr, execStream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtTaskUpdateAsync(stream, taskId, &info, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtTaskUpdateAsync(stream, taskId, &info, execStream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    info.id = ACL_RT_UPDATE_RANDOM_TASK;
    ret = aclrtTaskUpdateAsync(stream, taskId, &info, execStream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsLaunchUpdateTask(_, _, _, _))
        .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
    ret = aclrtTaskUpdateAsync(stream, taskId, &info, execStream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclAppLog_success)
{
    const char *strLog = "hello, acl";
    std::string strLogOverflow(1025, 'a');
    std::string strLogNearOverflow(1023, 'a');
    aclAppLog(ACL_INFO, __FUNCTION__, __FILE__, __LINE__, strLog);
    aclAppLog(ACL_INFO, __FUNCTION__, __FILE__, __LINE__, strLogOverflow.c_str());
    aclAppLog(ACL_INFO, __FUNCTION__, __FILE__, __LINE__, strLogNearOverflow.c_str());
}

TEST_F(UTEST_ACL_Runtime, aclrtCheckArchCompatibilityTest)
{
    int32_t canCompatible = 255;
    aclError ret = aclrtCheckArchCompatibility("SOC_ASCEND910", &canCompatible);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtCheckArchCompatibility(_, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    ret = aclrtCheckArchCompatibility("SOC_ASCEND910B1", &canCompatible);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtCmoGetDescSizeTest)
{
    size_t size = 0;
    auto ret = aclrtCmoGetDescSize(&size);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_EQ(size, 0U);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsGetCmoDescSize(_)).WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtCmoGetDescSize(&size);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtCmoSetDescTest)
{
    void *cmodesc = (void *)0x1;
    void *srcAddr = nullptr;
    size_t memLen = 64;
    auto ret = aclrtCmoSetDesc(cmodesc, srcAddr, memLen);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsSetCmoDesc(_, _, _))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtCmoSetDesc(&cmodesc, srcAddr, memLen);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtCmoAsyncWithDescTest)
{
    void *cmodesc = (void *)0x1;
    auto ret = aclrtCmoAsyncWithDesc(cmodesc, ACL_RT_CMO_TYPE_PREFETCH, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsLaunchCmoAddrTask(_, _, _, _))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtCmoAsyncWithDesc(&cmodesc, ACL_RT_CMO_TYPE_PREFETCH, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclmdlRIAbortTest)
{
    aclmdlRI modelRI = (aclmdlRI)0x01;
    auto ret = aclmdlRIAbort(modelRI);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsModelAbort(_)).WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclmdlRIAbort(modelRI);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemRetainAllocationHandletest)
{
    void *virPtr = nullptr;
    size_t size = 1;

    auto ret = aclrtReserveMemAddress(&virPtr, size, 0, nullptr, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(virPtr, nullptr);   

    aclrtDrvMemHandle handle = nullptr;
    aclrtPhysicalMemProp prop = {};
    prop.allocationType = ACL_MEM_ALLOCATION_TYPE_PINNED;
    prop.memAttr = ACL_HBM_MEM_HUGE;
    prop.location.type = ACL_MEM_LOCATION_TYPE_DEVICE;
    prop.location.id = 0;

    ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(handle, nullptr);

    ret = aclrtMapMem(virPtr, size, 0, handle, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);

    aclrtDrvMemHandle handle1 = nullptr;
    ret = aclrtMemRetainAllocationHandle(nullptr, &handle1);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemRetainAllocationHandle(virPtr, &handle1);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtUnmapMem(virPtr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtFreePhysical(handle);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtReleaseMemAddress(virPtr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemRetainAllocationHandle(_,_))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtMemRetainAllocationHandle(virPtr, &handle);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemGetAllocationPropertiesFromHandletest)
{
    size_t size = 1;
    aclrtDrvMemHandle handle = nullptr;
    aclrtPhysicalMemProp prop = {};
    prop.allocationType = ACL_MEM_ALLOCATION_TYPE_PINNED;
    prop.memAttr = ACL_HBM_MEM_HUGE;
    prop.location.type = ACL_MEM_LOCATION_TYPE_DEVICE;
    prop.location.id = 0;

    auto ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);

    aclrtPhysicalMemProp prop1 = {};
    ret = aclrtMemGetAllocationPropertiesFromHandle(nullptr, &prop1);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemGetAllocationPropertiesFromHandle(handle, &prop1);
    EXPECT_EQ(ret, ACL_SUCCESS);

    prop.memAttr = ACL_HBM_MEM_NORMAL;
    ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclrtMemGetAllocationPropertiesFromHandle(handle, &prop1);
    EXPECT_EQ(ret, ACL_SUCCESS);

    prop.memAttr = ACL_HBM_MEM_HUGE1G;
    ret = aclrtMallocPhysical(&handle, size, &prop, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    ret = aclrtMemGetAllocationPropertiesFromHandle(handle, &prop1);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtFreePhysical(handle);
    EXPECT_EQ(ret, ACL_SUCCESS);
  
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemGetAllocationPropertiesFromHandle(_,_))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtMemGetAllocationPropertiesFromHandle(handle, &prop1);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtCntNotifyRecord)
{
    aclrtStream stream = (aclrtStream)0x01U;

    aclrtNotify cntNotify = nullptr;
    aclrtCntNotifyRecordInfo info = {ACL_RT_CNT_NOTIFY_RECORD_SET_VALUE_MODE, 0};
    auto ret = aclrtCntNotifyRecord(&cntNotify, stream, &info);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtCntNotifyRecord(&cntNotify, stream, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsCntNotifyRecord(_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtCntNotifyRecord(&cntNotify, stream, &info);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtCntNotifyWaitWithTimeout)
{
    aclrtStream stream = (aclrtStream)0x01U;

    aclrtNotify cntNotify = nullptr;
    aclrtCntNotifyWaitInfo info = {ACL_RT_CNT_NOTIFY_WAIT_LESS_MODE, 0, 0, true, 0};
    auto ret = aclrtCntNotifyWaitWithTimeout(&cntNotify, stream, &info);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtCntNotifyWaitWithTimeout(&cntNotify, stream, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsCntNotifyWaitWithTimeout(_,_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtCntNotifyWaitWithTimeout(&cntNotify, stream, &info);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtCntNotifyReset)
{
    aclrtStream stream = (aclrtStream)0x01U;

    aclrtNotify cntNotify = nullptr;
    auto ret = aclrtCntNotifyReset(&cntNotify, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsCntNotifyReset(_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtCntNotifyReset(&cntNotify, stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtCntNotifyGetId)
{
    aclrtNotify cntNotify = nullptr;
    auto ret = aclrtCntNotifyGetId(&cntNotify, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsCntNotifyGetId(_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    uint32_t notifyId = 0U;
    ret = aclrtCntNotifyGetId(&cntNotify, &notifyId);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtPersistentTaskClean)
{
    aclrtStream stream = (aclrtStream)0x01U;
    aclError ret = aclrtPersistentTaskClean(nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtPersistentTaskClean(stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsPersistentTaskClean(_))
        .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
    ret = aclrtPersistentTaskClean(stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtCacheLastTaskOpInfo)
{
    char rawInfo[] = "test_op_info_data";
    size_t infoSize = sizeof(rawInfo);

    auto ret = aclrtCacheLastTaskOpInfo(nullptr, infoSize);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtCacheLastTaskOpInfo(rawInfo, 0U);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtCacheLastTaskOpInfo(rawInfo, infoSize);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtCacheLastTaskOpInfo(_,_))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtCacheLastTaskOpInfo(rawInfo, infoSize);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtCacheLastTaskOpInfo(_,_))
                    .WillOnce(Return(ACL_ERROR_RT_FEATURE_NOT_SUPPORT));
    ret = aclrtCacheLastTaskOpInfo(rawInfo, infoSize);
    EXPECT_EQ(ret, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
}

TEST_F(UTEST_ACL_Runtime, aclrtCacheLastTaskExtendInfo)
{
    char extendInfo[] = "test_extend_info_data";
    size_t infoSize = sizeof(extendInfo) - 1U;

    auto ret = aclrtCacheLastTaskExtendInfo(extendInfo, infoSize);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtCacheLastTaskExtendInfo(_, _))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtCacheLastTaskExtendInfo(extendInfo, infoSize);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtCacheLastTaskExtendInfo(_, _))
        .WillOnce(Return(ACL_ERROR_RT_FEATURE_NOT_SUPPORT));
    ret = aclrtCacheLastTaskExtendInfo(extendInfo, infoSize);
    EXPECT_EQ(ret, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetFunctionAttribute)
{
    aclrtFuncAttribute attrType = ACL_FUNC_ATTR_KERNEL_TYPE;
    aclrtFuncHandle funcHandle = (aclrtFuncHandle)0x01;
    int64_t attrValue = 0U;

    auto ret = aclrtGetFunctionAttribute(nullptr, attrType, &attrValue);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtGetFunctionAttribute(funcHandle, attrType, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtFunctionGetAttribute(_, _, _))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtGetFunctionAttribute(funcHandle, attrType, &attrValue);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtFunctionGetBinary)
{
    aclrtFuncHandle funcHandle = (aclrtFuncHandle)0x01;
    aclrtBinHandle binHandle = nullptr;

    auto ret = aclrtFunctionGetBinary(funcHandle, &binHandle);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtFunctionGetBinary(_, _))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtFunctionGetBinary(funcHandle, &binHandle);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtReserveMemAddressNoUCMemory)
{
    void *virPtr = nullptr;
    size_t size = 1;

    aclError ret = aclrtReserveMemAddressNoUCMemory(&virPtr, size, 0, nullptr, 0);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_NE(virPtr, nullptr);

    ret = aclrtReleaseMemAddress(virPtr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtReserveMemAddressNoUCMemory(&virPtr, 0, 0, nullptr, 0);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtReserveMemAddressNoUCMemory(&virPtr, size, 0, nullptr, 2);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtReserveMemAddress(_,_,_,_,_))
        .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
    ret = aclrtReserveMemAddressNoUCMemory(&virPtr, size, 0, nullptr, 0);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtReserveMemAddress(_,_,_,_,_))
        .WillOnce(Return(ACL_ERROR_RT_FEATURE_NOT_SUPPORT));
    ret = aclrtReserveMemAddressNoUCMemory(&virPtr, size, 0, nullptr, 0);
    EXPECT_EQ(ret, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtReleaseMemAddress(_))
        .WillOnce(Return(ACL_ERROR_INVALID_PARAM));
    ret = aclrtReleaseMemAddress(virPtr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemGetAddressRange)
{
    void *ptr = nullptr;
    void *pbase = reinterpret_cast<void *>(0x01U);
    size_t psize = 0;

    aclError ret = aclrtMemGetAddressRange(ptr, &pbase, &psize);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ptr = (void*)0xff;
    ret = aclrtMemGetAddressRange(ptr, &pbase, &psize);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemGetAddressRange_failed_with_rt_error)
{
    void *ptr = (void*)0xff;
    void *pbase = nullptr;
    size_t psize = 0;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemGetAddressRange(_, _, _))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    aclError ret = aclrtMemGetAddressRange(ptr, &pbase, &psize);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemPoolCreate)
{
    aclrtMemPool memPool = 0;
    aclrtMemPoolProps poolProp;
    poolProp.handleType = aclrtMemHandleType::ACL_MEM_HANDLE_TYPE_NONE;
    poolProp.allocType = aclrtMemAllocationType::ACL_MEM_ALLOCATION_TYPE_PINNED;
    poolProp.location.type = aclrtMemLocationType::ACL_MEM_LOCATION_TYPE_DEVICE;
    poolProp.maxSize = 10;
    memset_s(poolProp.reserved, sizeof(poolProp.reserved), 0, sizeof(poolProp.reserved));
    rtError_t error = aclrtMemPoolCreate(&memPool, &poolProp);
    EXPECT_EQ(error, RT_ERROR_NONE);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemPoolCreateInvalidReserved)
{
    aclrtMemPool memPool = 0;
    aclrtMemPoolProps poolProp;
    poolProp.handleType = aclrtMemHandleType::ACL_MEM_HANDLE_TYPE_NONE;
    poolProp.allocType = aclrtMemAllocationType::ACL_MEM_ALLOCATION_TYPE_PINNED;
    poolProp.location.type = aclrtMemLocationType::ACL_MEM_LOCATION_TYPE_DEVICE;
    poolProp.maxSize = 10;
    memset_s(poolProp.reserved, sizeof(poolProp.reserved), 0, sizeof(poolProp.reserved));
    memcpy_s(poolProp.reserved, sizeof(poolProp.reserved), "test", 4);
    rtError_t error = aclrtMemPoolCreate(&memPool, &poolProp);
    EXPECT_NE(error, RT_ERROR_NONE);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemPoolCreateErrorLocationType)
{
    aclrtMemPool memPool = 0;
    aclrtMemPoolProps poolProp;
    poolProp.handleType = aclrtMemHandleType::ACL_MEM_HANDLE_TYPE_NONE;
    poolProp.allocType = aclrtMemAllocationType::ACL_MEM_ALLOCATION_TYPE_PINNED;
    poolProp.location.type = aclrtMemLocationType::ACL_MEM_LOCATION_TYPE_HOST;
    poolProp.maxSize = 10;
    rtError_t error = aclrtMemPoolCreate(&memPool, &poolProp);
    EXPECT_NE(error, RT_ERROR_NONE);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemPoolDestroy)
{
    aclrtMemPool memPool = (void*)0xff;
    rtError_t error = aclrtMemPoolDestroy(memPool);
    EXPECT_EQ(error, RT_ERROR_NONE);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemPoolSetAttr)
{
    aclrtMemPool memPool = (void*)0xff;
    aclrtMemPoolAttr attr = aclrtMemPoolAttr::ACL_RT_MEM_POOL_ATTR_RELEASE_THRESHOLD;
    uint64_t waterMark = (2UL << 30);
    rtError_t error = aclrtMemPoolSetAttr(memPool, attr, (void *)&waterMark);
    EXPECT_EQ(error, RT_ERROR_NONE);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemPoolGetAttr)
{
    aclrtMemPool memPool = (void*)0xff;
    aclrtMemPoolAttr attr = aclrtMemPoolAttr::ACL_RT_MEM_POOL_ATTR_RELEASE_THRESHOLD;
    uint64_t waterMark = (2UL << 30);
    rtError_t error = aclrtMemPoolGetAttr(memPool, attr, (void *)&waterMark);
    EXPECT_EQ(error, RT_ERROR_NONE);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemPoolFreeAsync)
{
    aclrtStream stream = (aclrtStream)0x01U;
    void *ptr = nullptr;

    rtError_t error = aclrtMemPoolFreeAsync(ptr, stream);
    EXPECT_NE(error, RT_ERROR_NONE);

    ptr = (void*)0xff;
    error = aclrtMemPoolFreeAsync(ptr, stream);
    EXPECT_EQ(error, RT_ERROR_NONE);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemPoolMallocAsync)
{
    aclrtStream stream = (aclrtStream)0x01U;
    aclrtMemPool memPool = (void*)0xff;
    size_t size = 10 * 1024;
    void *ptr = nullptr;

    rtError_t error = aclrtMemPoolMallocAsync(&ptr, size, memPool, stream);
    EXPECT_EQ(error, RT_ERROR_NONE);

    size = 0;
    error = aclrtMemPoolMallocAsync(&ptr, size, memPool, stream);
    EXPECT_EQ(error, RT_ERROR_NONE);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemPoolTrimTo)
{
    aclrtMemPool memPool = (void*)0xff;
    rtError_t error = aclrtMemPoolTrimTo(memPool, 0);
    EXPECT_EQ(error, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemPoolTrimTo(_, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)));
    error = aclrtMemPoolTrimTo(memPool, 0);
    EXPECT_NE(error, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetArgsFromExceptionInfo)
{
    void *devArgs = nullptr;
    uint32_t devArgsLen = 0;
    const uint32_t ACL_ERROR_INVALID_EXCEPTION_INFO = 0xFFFFFFFFU;
    auto ret = aclrtGetArgsFromExceptionInfo(nullptr, &devArgs, &devArgsLen);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_EXCEPTION_INFO);

    aclrtExceptionInfo exceptionInfo;
    (void)memset_s(&exceptionInfo, sizeof(aclrtExceptionInfo), 0, sizeof(aclrtExceptionInfo));
    
    exceptionInfo.expandInfo.type = RT_EXCEPTION_AICORE;
    uint32_t args[3] = {1, 2, 3};
    uint32_t argsLen = 3;
    exceptionInfo.expandInfo.u.aicoreInfo.exceptionArgs.argAddr = (void *)(&args);
    exceptionInfo.expandInfo.u.aicoreInfo.exceptionArgs.argsize = argsLen;

    ret = aclrtGetArgsFromExceptionInfo(&exceptionInfo, &devArgs, &devArgsLen);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_EQ(devArgs, (void *)(&args));
    EXPECT_EQ(devArgsLen, argsLen);

    exceptionInfo.expandInfo.type = RT_EXCEPTION_FUSION;
    exceptionInfo.expandInfo.u.fusionInfo.u.aicoreCcuInfo.exceptionArgs.argAddr = (void *)(&args);
    exceptionInfo.expandInfo.u.fusionInfo.u.aicoreCcuInfo.exceptionArgs.argsize = argsLen;
    exceptionInfo.expandInfo.u.fusionInfo.type = RT_FUSION_AICORE_CCU;
    ret = aclrtGetArgsFromExceptionInfo(&exceptionInfo, &devArgs, &devArgsLen);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_EQ(devArgs, (void *)(&args));
    EXPECT_EQ(devArgsLen, argsLen);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetFuncHandleFromExceptionInfo)
{
    aclrtExceptionInfo info;
    aclrtFuncHandle func;
    const uint32_t ACL_ERROR_INVALID_EXCEPTION_INFO = 0xFFFFFFFFU;

    auto ret = aclrtGetFuncHandleFromExceptionInfo(nullptr, &func);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_EXCEPTION_INFO);

    ret = aclrtGetFuncHandleFromExceptionInfo(&info, &func);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetFuncHandleFromExceptionInfo(_, _))
                    .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtGetFuncHandleFromExceptionInfo(&info, &func);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtBinarySetExceptionCallback)
{
    aclrtBinHandle handle = (aclrtBinHandle)0x01;
    aclrtOpExceptionCallback funcHandle = (aclrtOpExceptionCallback)0x01;

    auto ret = aclrtBinarySetExceptionCallback(nullptr, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtBinarySetExceptionCallback(handle, funcHandle, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtBinarySetExceptionCallback(_, _, _))
                .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtBinarySetExceptionCallback(handle, funcHandle, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);            
}

TEST_F(UTEST_ACL_Runtime, aclrtMemP2PMap)
{
    void *devPtr = (void *)0x01;
    size_t size = 1;
    int32_t dstDevId = 0;
    uint64_t flags = 0;

    aclError ret = aclrtMemP2PMap(devPtr, size, dstDevId, flags);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemP2PMap(devPtr, size, dstDevId, 1);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemP2PMap(NULL, size, dstDevId, 0);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemP2PMap(devPtr, 0, dstDevId, flags);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
    
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetDevicePhyIdByIndex(_, _))
        .WillOnce(Return((ACL_ERROR_RT_PARAM_INVALID)))
        .WillRepeatedly(Return(RT_ERROR_NONE));
    ret = aclrtMemP2PMap(devPtr, size, dstDevId, flags);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemP2PMap_failed_with_rtMemPrefetchToDevice_error)
{
    void *devPtr = (void *)0x01;
    size_t size = 1;
    int32_t dstDevId = 0;
    uint64_t flags = 0;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetDevicePhyIdByIndex(_, _))
        .WillRepeatedly(Return(RT_ERROR_NONE));
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemPrefetchToDevice(_, _, _))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    aclError ret = aclrtMemP2PMap(devPtr, size, dstDevId, flags);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclmdlRIDestroyRegisterCallback)
{
    aclmdlRI modelRI = (aclmdlRI)0x01;
    auto ret = aclmdlRIDestroyRegisterCallback(&modelRI, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclmdlRIDestroyUnregisterCallback(&modelRI, nullptr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtModelDestroyRegisterCallback(_, _, _))
                .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclmdlRIDestroyRegisterCallback(&modelRI, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtModelDestroyUnregisterCallback(_, _))
                .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclmdlRIDestroyUnregisterCallback(&modelRI, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemManagedPrefetchAsyncTest)
{
    void *ptr = nullptr;
    size_t size = 1;
    aclrtMemManagedLocation location = { ACL_MEM_LOCATIONTYPE_HOST, 1 };
    uint32_t flags = 0;
    aclrtStream stream = nullptr;

    aclError ret = aclrtMemManagedPrefetchAsync(ptr, size, location, flags, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ptr = (void *)0x01;
    size = 0;
    ret = aclrtMemManagedPrefetchAsync(ptr, size, location, flags, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    size = 1;
    flags = 1;
    ret = aclrtMemManagedPrefetchAsync(ptr, size, location, flags, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    size = 1;
    flags = 0;
    ret = aclrtMemManagedPrefetchAsync(ptr, size, location, flags, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemManagedPrefetchBatchAsyncTest)
{
    constexpr size_t numUvmPtrs = 6UL;
    constexpr size_t numPrefetchLocsArr = 4UL;
    void *ptrs[numUvmPtrs] = { (void *)0x01, (void *)0x10, (void *)0x20, (void *)0x30, (void *)0x40, (void *)0x50 };
    size_t sizes[numUvmPtrs] = { 3, 6, 9, 6, 5, 8 };
    size_t count = numUvmPtrs;
    aclrtMemManagedLocation prefetchLocs[numPrefetchLocsArr] = {
        { ACL_MEM_LOCATIONTYPE_HOST, 1 }, { ACL_MEM_LOCATIONTYPE_DEVICE, 2 },
        { ACL_MEM_LOCATIONTYPE_HOST_NUMA, 3 }, { ACL_MEM_LOCATIONTYPE_HOST_NUMA_CURRENT, 0 },
     };
    size_t prefetchLocIdxs[numPrefetchLocsArr] = { 0, 2, 3, 5 };
    size_t numPrefetchLocs = numPrefetchLocsArr;
    uint64_t flags = 1;
    aclrtStream stream = nullptr;

    aclError ret = aclrtMemManagedPrefetchBatchAsync((const void**)ptrs, sizes, count, prefetchLocs, prefetchLocIdxs,
        numPrefetchLocs, flags, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    flags = 0;
    ret = aclrtMemManagedPrefetchBatchAsync(nullptr, sizes, count, prefetchLocs, prefetchLocIdxs,
        numPrefetchLocs, flags, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemManagedPrefetchBatchAsync((const void**)ptrs, nullptr, count, prefetchLocs, prefetchLocIdxs,
        numPrefetchLocs, flags, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemManagedPrefetchBatchAsync((const void**)ptrs, sizes, count, nullptr, prefetchLocIdxs,
        numPrefetchLocs, flags, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemManagedPrefetchBatchAsync((const void**)ptrs, sizes, 0UL, prefetchLocs, prefetchLocIdxs,
        numPrefetchLocs, flags, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemManagedPrefetchBatchAsync((const void**)ptrs, sizes, count, prefetchLocs, prefetchLocIdxs,
        0UL, flags, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    numPrefetchLocs = numUvmPtrs + 1; // test incorrect numPrefetchLocs which is bigger than count
    ret = aclrtMemManagedPrefetchBatchAsync((const void**)ptrs, sizes, count, prefetchLocs, prefetchLocIdxs,
        numPrefetchLocs, flags, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    numPrefetchLocs = numPrefetchLocsArr;
    count = numPrefetchLocsArr; // test cases when count is equal to numPrefetchLocs
    ret = aclrtMemManagedPrefetchBatchAsync((const void**)ptrs, sizes, count, prefetchLocs, prefetchLocIdxs,
        numPrefetchLocs, flags, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    count = numUvmPtrs;
    ret = aclrtMemManagedPrefetchBatchAsync((const void**)ptrs, sizes, count, prefetchLocs, prefetchLocIdxs,
        numPrefetchLocs, flags, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtDeviceGetHostAtomicCapabilities)
{
    uint32_t capabilities[2] = {0};
    aclrtAtomicOperation operations[2] = {ACL_RT_ATOMIC_OPERATION_INTEGER_ADD, ACL_RT_ATOMIC_OPERATION_SIMD_SCALAR_EXCH};
    uint32_t count = 2;
    int32_t deviceId = 0;

    // Test successful execution
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtDeviceGetHostAtomicCapabilities(_, _, _, _))
        .WillOnce(Return(RT_ERROR_NONE));
    aclError ret = aclrtDeviceGetHostAtomicCapabilities(capabilities, operations, count, deviceId);
    EXPECT_EQ(ret, ACL_SUCCESS);

    // Test failure from runtime
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtDeviceGetHostAtomicCapabilities(_, _, _, _))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtDeviceGetHostAtomicCapabilities(capabilities, operations, count, deviceId);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtDeviceGetHostAtomicCapabilities(_, _, _, _))
        .WillOnce(Return(ACL_ERROR_RT_INVALID_DEVICEID));
    ret = aclrtDeviceGetHostAtomicCapabilities(capabilities, operations, count, deviceId);
    EXPECT_EQ(ret, ACL_ERROR_RT_INVALID_DEVICEID);
}

TEST_F(UTEST_ACL_Runtime, aclrtDeviceGetP2PAtomicCapabilities)
{
    uint32_t capabilities[1] = {0};
    aclrtAtomicOperation operations[1] = {ACL_RT_ATOMIC_OPERATION_DMA_MAX};
    uint32_t count = 1;
    int32_t srcDeviceId = 0;
    int32_t dstDeviceId = 1;

    // Test successful execution
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtDeviceGetP2PAtomicCapabilities(_, _, _, _, _))
        .WillOnce(Return(RT_ERROR_NONE));
    aclError ret = aclrtDeviceGetP2PAtomicCapabilities(capabilities, operations, count, srcDeviceId, dstDeviceId);
    EXPECT_EQ(ret, ACL_SUCCESS);

    // Test failure from runtime
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtDeviceGetP2PAtomicCapabilities(_, _, _, _, _))
        .WillOnce(Return(ACL_ERROR_RT_INVALID_DEVICEID));
    ret = aclrtDeviceGetP2PAtomicCapabilities(capabilities, operations, count, srcDeviceId, dstDeviceId);
    EXPECT_EQ(ret, ACL_ERROR_RT_INVALID_DEVICEID);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtDeviceGetP2PAtomicCapabilities(_, _, _, _, _))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtDeviceGetP2PAtomicCapabilities(capabilities, operations, count, srcDeviceId, dstDeviceId);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemMapSelectedLinkTest)
{
    uint32_t mem1[8];
    uint32_t mem2[8];
    size_t size = 32;
    uint32_t linkIdx = ACL_RT_MEM_LINK_IDX_1;

    aclError ret = aclrtMemMapSelectedLink(nullptr, size, (void *)mem2, linkIdx);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemMapSelectedLink((void *)mem1, 0, (void *)mem2, linkIdx);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemMapSelectedLink((void *)mem1, size, nullptr, linkIdx);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtMemMapSelectedLink((void *)mem1, size, (void *)mem2, linkIdx + 1);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
    
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemMapSelectedLink(_, _, _, _))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtMemMapSelectedLink((void *)mem1, size, (void *)mem2, linkIdx);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemMapSelectedLink(_, _, _, _))
        .WillOnce(Return(ACL_ERROR_RT_FEATURE_NOT_SUPPORT));
    ret = aclrtMemMapSelectedLink((void *)mem1, size, (void *)mem2, linkIdx);
    EXPECT_EQ(ret, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemMapSelectedLink(_, _, _, _))
        .WillOnce(Return(ACL_RT_SUCCESS));
    ret = aclrtMemMapSelectedLink((void *)mem1, size, (void *)mem2, linkIdx);
    EXPECT_EQ(ret, ACL_RT_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtApiHeaderIncludeTest)
{
    // 验证 acl_rt_api.h 头文件包含正确,模板函数可编译
    
    // 测试模板函数签名编译通过
    float *devPtr = nullptr;
    size_t size = 100;
    
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsMalloc(_, _, _, _, _))
        .WillOnce(Return(RT_ERROR_NONE));
    aclError ret = aclrtMalloc(&devPtr, size);
    EXPECT_EQ(ret, ACL_SUCCESS);
    
    // 测试同步接口编译通过
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtDeviceSynchronizeWithTimeout(_))
        .WillOnce(Return(RT_ERROR_NONE));
    ret = aclrtSynchronizeDevice(5000);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtTemplateMallocTest)
{
    float *devPtr = nullptr;
    size_t size = 100;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsMalloc(_, _, _, _, _))
        .WillOnce(Return(RT_ERROR_NONE));
    aclError ret = aclrtMalloc(&devPtr, size);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsMalloc(_, _, _, _, _))
        .WillOnce(Return(RT_ERROR_NONE));
    ret = aclrtMalloc(&devPtr, size, ACL_MEM_MALLOC_HUGE_FIRST);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtTemplateMallocHostTest)
{
    float *hostPtr = nullptr;
    size_t size = 100;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsMallocHost(_, _, _))
        .WillOnce(Return(RT_ERROR_NONE));
    aclError ret = aclrtMallocHost(&hostPtr, size);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtTemplateMemcpyTest)
{
    float src[10] = {1.0f};
    float dst[10] = {0.0f};

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemcpy(_, _, _, _, _))
        .WillOnce(Return(RT_ERROR_NONE));
    aclError ret = aclrtMemcpy(dst, 10 * sizeof(float), src, 10 * sizeof(float), ACL_MEMCPY_HOST_TO_HOST);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtTemplateMemcpyAsyncTest)
{
    float *src = reinterpret_cast<float *>(0x01);
    float *dst = reinterpret_cast<float *>(0x02);
    aclrtStream stream = reinterpret_cast<aclrtStream>(0x03);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemcpyAsync(_, _, _, _, _, _))
        .WillOnce(Return(RT_ERROR_NONE));
    aclError ret = aclrtMemcpyAsync(dst, 10 * sizeof(float), src, 10 * sizeof(float), ACL_MEMCPY_HOST_TO_DEVICE, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtTemplateMemcpy2dTest)
{
    float *src = reinterpret_cast<float *>(0x01);
    float *dst = reinterpret_cast<float *>(0x02);
    size_t dpitch = 2;
    size_t spitch = 2;
    size_t width = 1;
    size_t height = 2;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemcpy2d(_, _, _, _, _, _, _))
        .WillOnce(Return(RT_ERROR_NONE));
    aclError ret = aclrtMemcpy2d(dst, dpitch, src, spitch, width, height, ACL_MEMCPY_HOST_TO_DEVICE);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtTemplateMemcpy2dAsyncTest)
{
    float *src = reinterpret_cast<float *>(0x01);
    float *dst = reinterpret_cast<float *>(0x02);
    aclrtStream stream = reinterpret_cast<aclrtStream>(0x03);
    size_t dpitch = 2;
    size_t spitch = 2;
    size_t width = 1;
    size_t height = 2;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemcpy2dAsync(_, _, _, _, _, _, _, _))
        .WillOnce(Return(RT_ERROR_NONE));
    aclError ret = aclrtMemcpy2dAsync(dst, dpitch, src, spitch, width, height, ACL_MEMCPY_HOST_TO_DEVICE, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtOverloadSynchronizeDeviceTest)
{
    int32_t timeout = 100;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtDeviceSynchronizeWithTimeout(_))
        .WillOnce(Return(RT_ERROR_NONE));
    aclError ret = aclrtSynchronizeDevice(timeout);
    EXPECT_EQ(ret, ACL_SUCCESS);

    timeout = -2;
    ret = aclrtSynchronizeDevice(timeout);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtOverloadSynchronizeStreamTest)
{
    aclrtStream stream = reinterpret_cast<aclrtStream>(0x01);
    int32_t timeout = 100;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtStreamSynchronizeWithTimeout(_, _))
        .WillOnce(Return(RT_ERROR_NONE));
    aclError ret = aclrtSynchronizeStream(stream, timeout);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtOverloadSynchronizeEventTest)
{
    aclrtEvent event = reinterpret_cast<aclrtEvent>(0x01);
    int32_t timeout = 100;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtEventSynchronizeWithTimeout(_, _))
        .WillOnce(Return(RT_ERROR_NONE));
    aclError ret = aclrtSynchronizeEvent(event, timeout);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtOverloadStreamWaitEventTest)
{
    aclrtStream stream = reinterpret_cast<aclrtStream>(0x01);
    aclrtEvent event = reinterpret_cast<aclrtEvent>(0x02);
    int32_t timeout = 100;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsEventWait(_, _, _))
        .WillOnce(Return(RT_ERROR_NONE));
    aclError ret = aclrtStreamWaitEvent(stream, event, timeout);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtOverloadCreateEventTest)
{
    aclrtEvent event = nullptr;
    uint32_t flag = 0x00000008u;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtEventCreateExWithFlag(_, _))
        .WillOnce(Return(RT_ERROR_NONE));
    aclError ret = aclrtCreateEvent(&event, flag);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtTemplatePointerGetAttributesTest)
{
    float *ptr = reinterpret_cast<float *>(0x01);
    aclrtPtrAttributes attributes;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsPointerGetAttributes(_, _))
        .WillOnce(Return(RT_ERROR_NONE));
    aclError ret = aclrtPointerGetAttributes(ptr, &attributes);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtTemplateHostRegisterTest)
{
    float *hostPtr = reinterpret_cast<float *>(0x01);
    float *devPtr = nullptr;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsHostRegister(_, _, _, _))
        .WillOnce(Return(RT_ERROR_NONE));
    aclError ret = aclrtHostRegister(hostPtr, 100, ACL_HOST_REGISTER_MAPPED, &devPtr);
    EXPECT_EQ(ret, ACL_SUCCESS);

    uint32_t flag = 0;
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtHostRegisterV2(_, _, _))
        .WillOnce(Return(RT_ERROR_NONE));
    ret = aclrtHostRegister(hostPtr, 100, flag);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtTemplateHostGetDevicePointerTest)
{
    float *hostPtr = reinterpret_cast<float *>(0x01);
    float *devPtr = nullptr;
    uint32_t flag = 0;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtHostGetDevicePointer(_, _, _))
        .WillOnce(Return(RT_ERROR_NONE));
    aclError ret = aclrtHostGetDevicePointer(hostPtr, &devPtr, flag);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtTemplateHostUnregisterTest)
{
    float *hostPtr = reinterpret_cast<float *>(0x01);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtsHostUnregister(_))
        .WillOnce(Return(RT_ERROR_NONE));
    aclError ret = aclrtHostUnregister(hostPtr);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtTemplateMemAllocManagedTest)
{
    float *devPtr = nullptr;
    size_t size = 100;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemAllocManaged(_, _, _, _))
        .WillRepeatedly(Return(RT_ERROR_NONE));
    aclError ret = aclrtMemAllocManaged(&devPtr, size);
    EXPECT_EQ(ret, ACL_SUCCESS);

    ret = aclrtMemAllocManaged(&devPtr, size, ACL_RT_MEM_ATTACH_GLOBAL);
    EXPECT_EQ(ret, ACL_SUCCESS);
}
TEST_F(UTEST_ACL_Runtime, aclrtBinaryGetGlobal_failed_with_nullptr_binHandle)
{
    aclrtBinHandle binHandle = nullptr;
    const char *name = "global_var";
    void *dptr = nullptr;
    size_t size = 0;
    aclError ret = aclrtBinaryGetGlobal(binHandle, name, &dptr, &size);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtBinaryGetGlobal_failed_with_nullptr_name)
{
    aclrtBinHandle binHandle = (aclrtBinHandle)0x01U;
    const char *name = nullptr;
    void *dptr = nullptr;
    size_t size = 0;
    aclError ret = aclrtBinaryGetGlobal(binHandle, name, &dptr, &size);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtBinaryGetGlobal_failed_with_both_nullptr_output)
{
    aclrtBinHandle binHandle = (aclrtBinHandle)0x01U;
    const char *name = "global_var";
    aclError ret = aclrtBinaryGetGlobal(binHandle, name, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtBinaryGetGlobal_success)
{
    aclrtBinHandle binHandle = (aclrtBinHandle)0x01U;
    const char *name = "global_var";
    void *dptr = nullptr;
    size_t size = 0;
    aclError ret = aclrtBinaryGetGlobal(binHandle, name, &dptr, &size);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtBinaryGetGlobal_feature_not_support)
{
    aclrtBinHandle binHandle = (aclrtBinHandle)0x01U;
    const char *name = "global_var";
    void *dptr = nullptr;
    size_t size = 0;
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtBinaryGetGlobal(_, _, _, _))
        .WillOnce(Return(ACL_ERROR_RT_FEATURE_NOT_SUPPORT));
    aclError ret = aclrtBinaryGetGlobal(binHandle, name, &dptr, &size);
    EXPECT_EQ(ret, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
}

TEST_F(UTEST_ACL_Runtime, aclrtBinaryGetGlobal_global_symbol_not_found)
{
    aclrtBinHandle binHandle = (aclrtBinHandle)0x01U;
    const char *name = "global_var";
    void *dptr = nullptr;
    size_t size = 0;
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtBinaryGetGlobal(_, _, _, _))
        .WillOnce(Return(ACL_ERROR_RT_SYMBOL_NOT_FOUND));
    aclError ret = aclrtBinaryGetGlobal(binHandle, name, &dptr, &size);
    EXPECT_EQ(ret, ACL_ERROR_RT_SYMBOL_NOT_FOUND);
}

TEST_F(UTEST_ACL_Runtime, aclrtBinaryGetGlobal_rt_error)
{
    aclrtBinHandle binHandle = (aclrtBinHandle)0x01U;
    const char *name = "global_var";
    void *dptr = nullptr;
    size_t size = 0;
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtBinaryGetGlobal(_, _, _, _))
        .WillOnce(Return(ACL_ERROR_RT_INVALID_HANDLE));
    aclError ret = aclrtBinaryGetGlobal(binHandle, name, &dptr, &size);
    EXPECT_EQ(ret, ACL_ERROR_RT_INVALID_HANDLE);
}

TEST_F(UTEST_ACL_Runtime, aclrtLaunchKernelWithArgsArrayTest)
{
    void *func = (void *)0x01;
    uint32_t numBlocks = 1;
    aclrtStream stream = nullptr;
    aclrtLaunchKernelCfg cfg = {};
    void *argsArray[2] = {(void *)0x10, (void *)0x20};

    aclError ret = aclrtLaunchKernelWithArgsArray(nullptr, numBlocks, stream, &cfg, argsArray);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtLaunchKernelWithArgsArray(_, _, _, _, _))
        .WillOnce(Return(RT_ERROR_NONE));
    ret = aclrtLaunchKernelWithArgsArray(func, numBlocks, stream, &cfg, argsArray);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtLaunchKernelWithArgsArray(_, _, _, _, _))
        .WillOnce(Return(ACL_ERROR_RT_INVALID_HANDLE));
    ret = aclrtLaunchKernelWithArgsArray(func, numBlocks, stream, &cfg, argsArray);
    EXPECT_EQ(ret, ACL_ERROR_RT_INVALID_HANDLE);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtLaunchKernelWithArgsArray(_, _, _, _, _))
        .WillOnce(Return(ACL_ERROR_RT_FEATURE_NOT_SUPPORT));
    ret = aclrtLaunchKernelWithArgsArray(func, numBlocks, stream, &cfg, argsArray);
    EXPECT_EQ(ret, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtLaunchKernelWithArgsArray(_, _, _, _, _))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtLaunchKernelWithArgsArray(func, numBlocks, stream, &cfg, argsArray);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtFunctionGetParamCountTest)
{
    void *func = (void *)0x01;
    size_t paramCount = 0;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtFunctionGetParamCount(_, _))
        .WillOnce(Return(RT_ERROR_NONE));
    aclError ret = aclrtFunctionGetParamCount(func, &paramCount);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtFunctionGetParamCount(_, _))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtFunctionGetParamCount(func, &paramCount);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtFunctionGetParamInfoTest)
{
    void *func = (void *)0x01;
    size_t paramIndex = 0;
    size_t paramOffset = 0;
    size_t paramSize = 0;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtFunctionGetParamInfo(_, _, _, _))
        .WillOnce(Return(RT_ERROR_NONE));
    aclError ret = aclrtFunctionGetParamInfo(func, paramIndex, &paramOffset, &paramSize);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtFunctionGetParamInfo(_, _, _, _))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtFunctionGetParamInfo(func, paramIndex, &paramOffset, &paramSize);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtFunctionGetAvailDynUbufPerBlockTest)
{
    void *func = (void *)0x01;
    uint32_t flags = 0U;
    size_t dynamicUbufSize = 0U;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtFunctionGetAvailDynUbufPerBlock(_, _, _))
        .WillOnce(Return(RT_ERROR_NONE));
    aclError ret = aclrtFunctionGetAvailDynUbufPerBlock(func, flags, &dynamicUbufSize);
    EXPECT_EQ(ret, ACL_SUCCESS);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtFunctionGetAvailDynUbufPerBlock(_, _, _))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));
    ret = aclrtFunctionGetAvailDynUbufPerBlock(func, flags, &dynamicUbufSize);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtFunctionGetAvailDynUbufPerBlock_ReturnDynamicUbufSizeTest)
{
    void *func = (void *)0x01;
    uint32_t flags = 0U;
    size_t dynamicUbufSize = 0U;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtFunctionGetAvailDynUbufPerBlock(func, flags, _))
        .WillOnce(DoAll(SetArgPointee<2>(4096U), Return(RT_ERROR_NONE)));
    aclError ret = aclrtFunctionGetAvailDynUbufPerBlock(func, flags, &dynamicUbufSize);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_EQ(dynamicUbufSize, 4096U);
}

TEST_F(UTEST_ACL_Runtime, aclrtFunctionGetAvailDynUbufPerBlock_FlagsNotZeroTest)
{
    void *func = (void *)0x01;
    uint32_t flags = 1U;
    size_t dynamicUbufSize = 0U;

    aclError ret = aclrtFunctionGetAvailDynUbufPerBlock(func, flags, &dynamicUbufSize);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtFunctionGetAvailDynUbufPerBlock_InternalErrorTest)
{
    void *func = (void *)0x01;
    uint32_t flags = 0U;
    size_t dynamicUbufSize = 0U;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtFunctionGetAvailDynUbufPerBlock(func, flags, _))
        .WillOnce(Return(ACL_ERROR_RT_INTERNAL_ERROR));
    aclError ret = aclrtFunctionGetAvailDynUbufPerBlock(func, flags, &dynamicUbufSize);
    EXPECT_EQ(ret, ACL_ERROR_RT_INTERNAL_ERROR);
}

TEST_F(UTEST_ACL_Runtime, aclrtFunctionGetAvailDynUbufPerBlock_FeatureNotSupportTest)
{
    void *func = (void *)0x01;
    uint32_t flags = 0U;
    size_t dynamicUbufSize = 0U;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtFunctionGetAvailDynUbufPerBlock(func, flags, _))
        .WillOnce(Return(ACL_ERROR_RT_FEATURE_NOT_SUPPORT));
    aclError ret = aclrtFunctionGetAvailDynUbufPerBlock(func, flags, &dynamicUbufSize);
    EXPECT_EQ(ret, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
}

TEST_F(UTEST_ACL_Runtime, aclrtLaunchKernelWithArgsArray_NumBlocksZeroTest)
{
    void *func = (void *)0x01;
    uint32_t numBlocks = 0;
    aclrtStream stream = nullptr;
    aclrtLaunchKernelCfg cfg = {};
    void *argsArray[2] = {(void *)0x10, (void *)0x20};

    aclError ret = aclrtLaunchKernelWithArgsArray(func, numBlocks, stream, &cfg, argsArray);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtLaunchKernelWithArgsArray_CfgNullptrTest)
{
    void *func = (void *)0x01;
    uint32_t numBlocks = 1;
    aclrtStream stream = nullptr;
    void *argsArray[2] = {(void *)0x10, (void *)0x20};

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtLaunchKernelWithArgsArray(_, _, _, nullptr, _))
        .WillOnce(Return(RT_ERROR_NONE));
    aclError ret = aclrtLaunchKernelWithArgsArray(func, numBlocks, stream, nullptr, argsArray);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtFunctionGetParamCount_FeatureNotSupportTest)
{
    void *func = (void *)0x01;
    size_t paramCount = 0;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtFunctionGetParamCount(_, _))
        .WillOnce(Return(ACL_ERROR_RT_FEATURE_NOT_SUPPORT));
    aclError ret = aclrtFunctionGetParamCount(func, &paramCount);
    EXPECT_EQ(ret, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
}

TEST_F(UTEST_ACL_Runtime, aclrtFunctionGetParamInfo_FeatureNotSupportTest)
{
    void *func = (void *)0x01;
    size_t paramIndex = 0;
    size_t paramOffset = 0;
    size_t paramSize = 0;

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtFunctionGetParamInfo(_, _, _, _))
        .WillOnce(Return(ACL_ERROR_RT_FEATURE_NOT_SUPPORT));
    aclError ret = aclrtFunctionGetParamInfo(func, paramIndex, &paramOffset, &paramSize);
    EXPECT_EQ(ret, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetFuncBySymbol_success)
{
    const void *symbol = (const void *)0x01;
    aclrtFuncHandle funcHandle = nullptr;
    const auto ret = aclrtGetFuncBySymbol(symbol, &funcHandle);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetFuncBySymbol_failed_with_invalid_args)
{
    const void *symbol = (const void *)0x01;
    aclrtFuncHandle funcHandle = nullptr;
    auto ret = aclrtGetFuncBySymbol(nullptr, &funcHandle);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    ret = aclrtGetFuncBySymbol(symbol, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtGetFuncBySymbol(_, _))
        .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID));

    ret = aclrtGetFuncBySymbol(symbol, &funcHandle);
    EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID);
}

TEST_F(UTEST_ACL_Runtime, aclrtFunctionGetParamCount_FuncNullptrTest)
{
    size_t paramCount = 0;
    
    aclError ret = aclrtFunctionGetParamCount(nullptr, &paramCount);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtFunctionGetParamCount_ParamCountNullptrTest)
{
    void *func = (void *)0x01;
    
    aclError ret = aclrtFunctionGetParamCount(func, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtFunctionGetParamInfo_FuncNullptrTest)
{
    size_t paramIndex = 0;
    size_t paramOffset = 0;
    size_t paramSize = 0;
    
    aclError ret = aclrtFunctionGetParamInfo(nullptr, paramIndex, &paramOffset, &paramSize);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtFunctionGetParamInfo_BothOutputNullptrTest)
{
    void *func = (void *)0x01;
    size_t paramIndex = 0;

    aclError ret = aclrtFunctionGetParamInfo(func, paramIndex, nullptr, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtFunctionGetAvailDynUbufPerBlock_FuncNullptrTest)
{
    uint32_t flags = 0U;
    size_t dynamicUbufSize = 0U;

    aclError ret = aclrtFunctionGetAvailDynUbufPerBlock(nullptr, flags, &dynamicUbufSize);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtFunctionGetAvailDynUbufPerBlock_OutputNullptrTest)
{
    void *func = (void *)0x01;
    uint32_t flags = 0U;

    aclError ret = aclrtFunctionGetAvailDynUbufPerBlock(func, flags, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
}

TEST_F(UTEST_ACL_Runtime, aclrtGetSymbolAddressTest)
{
    int hostVar = 0;
    void *devPtr = nullptr;

    // 参数校验:symbol 为 nullptr(显式 cast 避免命中模板重载)
    aclError ret = aclrtGetSymbolAddress(static_cast<const void *>(nullptr), &devPtr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    // 参数校验:devPtr 为 nullptr
    ret = aclrtGetSymbolAddress(hostVar, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    // 符号未找到
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSymbolLookup(_, _, _))
        .WillOnce(Return(ACL_ERROR_RT_INVALID_SYMBOL));
    ret = aclrtGetSymbolAddress(hostVar, &devPtr);
    EXPECT_EQ(ret, ACL_ERROR_RT_INVALID_SYMBOL);

    // 成功场景:校验 devPtr 出参被正确填充
    void *expectedDevPtr = reinterpret_cast<void *>(0x1234);
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSymbolLookup(_, _, _))
        .WillOnce(DoAll(SetArgPointee<1>(expectedDevPtr), Return(RT_ERROR_NONE)));
    ret = aclrtGetSymbolAddress(hostVar, &devPtr);
    EXPECT_EQ(ret, ACL_SUCCESS);
    EXPECT_EQ(devPtr, expectedDevPtr);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemcpyFromSymbolTest)
{
    char dst[10] = {};
    int hostVar = 0;
    size_t symbolSize = 100;

    // 参数校验:dst 为 nullptr
    aclError ret = aclrtMemcpyFromSymbol(nullptr, 10, hostVar, 5, 0, ACL_MEMCPY_DEVICE_TO_HOST);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    // 参数校验:count > dstMax
    ret = aclrtMemcpyFromSymbol(dst, 5, hostVar, 10, 0, ACL_MEMCPY_DEVICE_TO_HOST);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    // 参数校验:kind 非法
    ret = aclrtMemcpyFromSymbol(dst, 10, hostVar, 5, 0, (aclrtMemcpyKind)999);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    // 参数校验:kind 不支持 ACL_MEMCPY_HOST_TO_DEVICE
    ret = aclrtMemcpyFromSymbol(dst, 10, hostVar, 5, 0, ACL_MEMCPY_HOST_TO_DEVICE);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    // 符号未找到
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSymbolLookup(_, _, _))
        .WillOnce(Return(ACL_ERROR_RT_INVALID_SYMBOL));
    ret = aclrtMemcpyFromSymbol(dst, 10, hostVar, 5, 0, ACL_MEMCPY_DEVICE_TO_HOST);
    EXPECT_EQ(ret, ACL_ERROR_RT_INVALID_SYMBOL);

    // 边界检查:offset + count > symbolSize
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSymbolLookup(_, _, _))
        .WillOnce(DoAll(SetArgPointee<2>(5), Return(RT_ERROR_NONE)));
    ret = aclrtMemcpyFromSymbol(dst, 10, hostVar, 5, 3, ACL_MEMCPY_DEVICE_TO_HOST);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    // 溢出保护:offset + count 溢出 size_t(返回 ACL_ERROR_FAILURE)
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSymbolLookup(_, _, _))
        .WillOnce(DoAll(SetArgPointee<2>(symbolSize), Return(RT_ERROR_NONE)));
    ret = aclrtMemcpyFromSymbol(dst, 10, hostVar, 1, SIZE_MAX, ACL_MEMCPY_DEVICE_TO_HOST);
    EXPECT_EQ(ret, ACL_ERROR_FAILURE);

    // 成功场景:ACL_MEMCPY_DEVICE_TO_HOST
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSymbolLookup(_, _, _))
        .WillOnce(DoAll(SetArgPointee<2>(symbolSize), Return(RT_ERROR_NONE)));
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemcpy(_, _, _, _, _))
        .WillOnce(Return(RT_ERROR_NONE));
    ret = aclrtMemcpyFromSymbol(dst, 10, hostVar, 5, 0, ACL_MEMCPY_DEVICE_TO_HOST);
    EXPECT_EQ(ret, ACL_SUCCESS);

    // 成功场景:ACL_MEMCPY_DEFAULT
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSymbolLookup(_, _, _))
        .WillOnce(DoAll(SetArgPointee<2>(symbolSize), Return(RT_ERROR_NONE)));
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemcpy(_, _, _, _, _))
        .WillOnce(Return(RT_ERROR_NONE));
    ret = aclrtMemcpyFromSymbol(dst, 10, hostVar, 5, 0, ACL_MEMCPY_DEFAULT);
    EXPECT_EQ(ret, ACL_SUCCESS);

    // 成功场景:count 为 0 时,虽然 offset + count 不再小于 symbolSize,但仍然合法
    ret = aclrtMemcpyFromSymbol(dst, 10, hostVar, 0, 0, ACL_MEMCPY_DEFAULT);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemcpyFromSymbolAsyncTest)
{
    char dst[10] = {};
    int hostVar = 0;
    aclrtStream stream = (aclrtStream)0x10;
    size_t symbolSize = 100;

    // 参数校验:dst 为 nullptr
    aclError ret = aclrtMemcpyFromSymbolAsync(nullptr, 10, hostVar, 5, 0, ACL_MEMCPY_DEVICE_TO_HOST, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    // 参数校验:count > dstMax
    ret = aclrtMemcpyFromSymbolAsync(dst, 5, hostVar, 10, 0, ACL_MEMCPY_DEVICE_TO_HOST, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    // 参数校验:kind 非法
    ret = aclrtMemcpyFromSymbolAsync(dst, 10, hostVar, 5, 0, (aclrtMemcpyKind)999, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    // 参数校验:kind 不支持 ACL_MEMCPY_HOST_TO_DEVICE
    ret = aclrtMemcpyFromSymbolAsync(dst, 10, hostVar, 5, 0, ACL_MEMCPY_HOST_TO_DEVICE, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    // 参数校验:stream 为 nullptr
    ret = aclrtMemcpyFromSymbolAsync(dst, 10, hostVar, 5, 0, ACL_MEMCPY_DEVICE_TO_HOST, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    // 符号未找到
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSymbolLookup(_, _, _))
        .WillOnce(Return(ACL_ERROR_RT_INVALID_SYMBOL));
    ret = aclrtMemcpyFromSymbolAsync(dst, 10, hostVar, 5, 0, ACL_MEMCPY_DEVICE_TO_HOST, stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_INVALID_SYMBOL);

    // 边界检查:offset + count > symbolSize
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSymbolLookup(_, _, _))
        .WillOnce(DoAll(SetArgPointee<2>(5), Return(RT_ERROR_NONE)));
    ret = aclrtMemcpyFromSymbolAsync(dst, 10, hostVar, 5, 3, ACL_MEMCPY_DEVICE_TO_HOST, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    // 溢出保护:offset + count 溢出 size_t
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSymbolLookup(_, _, _))
        .WillOnce(DoAll(SetArgPointee<2>(symbolSize), Return(RT_ERROR_NONE)));
    ret = aclrtMemcpyFromSymbolAsync(dst, 10, hostVar, 1, SIZE_MAX, ACL_MEMCPY_DEVICE_TO_HOST, stream);
    EXPECT_EQ(ret, ACL_ERROR_FAILURE);

    // 成功场景:ACL_MEMCPY_DEVICE_TO_HOST
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSymbolLookup(_, _, _))
        .WillOnce(DoAll(SetArgPointee<2>(symbolSize), Return(RT_ERROR_NONE)));
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemcpyAsync(_, _, _, _, _, _))
        .WillOnce(Return(RT_ERROR_NONE));
    ret = aclrtMemcpyFromSymbolAsync(dst, 10, hostVar, 5, 0, ACL_MEMCPY_DEVICE_TO_HOST, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    // 成功场景:ACL_MEMCPY_DEFAULT
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSymbolLookup(_, _, _))
        .WillOnce(DoAll(SetArgPointee<2>(symbolSize), Return(RT_ERROR_NONE)));
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemcpyAsync(_, _, _, _, _, _))
        .WillOnce(Return(RT_ERROR_NONE));
    ret = aclrtMemcpyFromSymbolAsync(dst, 10, hostVar, 5, 0, ACL_MEMCPY_DEFAULT, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    // 成功场景:count 为 0 时,虽然 offset + count 不再小于 symbolSize,但仍然合法
    ret = aclrtMemcpyFromSymbolAsync(dst, 10, hostVar, 0, 0, ACL_MEMCPY_DEFAULT, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

}

TEST_F(UTEST_ACL_Runtime, aclrtMemcpyToSymbolTest)
{
    int hostVar = 0;
    char src[10] = {};
    size_t symbolSize = 100;

    // 参数校验:src 为 nullptr
    aclError ret = aclrtMemcpyToSymbol(hostVar, nullptr, 5, 0, ACL_MEMCPY_HOST_TO_DEVICE);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    // 参数校验:kind 非法
    ret = aclrtMemcpyToSymbol(hostVar, src, 5, 0, (aclrtMemcpyKind)999);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    // 参数校验:kind 不支持 ACL_MEMCPY_DEVICE_TO_HOST
    ret = aclrtMemcpyToSymbol(hostVar, src, 5, 0, ACL_MEMCPY_DEVICE_TO_HOST);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    // 符号未找到
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSymbolLookup(_, _, _))
        .WillOnce(Return(ACL_ERROR_RT_INVALID_SYMBOL));
    ret = aclrtMemcpyToSymbol(hostVar, src, 5, 0, ACL_MEMCPY_HOST_TO_DEVICE);
    EXPECT_EQ(ret, ACL_ERROR_RT_INVALID_SYMBOL);

    // 边界检查:offset + count > symbolSize
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSymbolLookup(_, _, _))
        .WillOnce(DoAll(SetArgPointee<2>(5), Return(RT_ERROR_NONE)));
    ret = aclrtMemcpyToSymbol(hostVar, src, 5, 3, ACL_MEMCPY_HOST_TO_DEVICE);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    // 溢出保护:offset + count 溢出 size_t
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSymbolLookup(_, _, _))
        .WillOnce(DoAll(SetArgPointee<2>(symbolSize), Return(RT_ERROR_NONE)));
    ret = aclrtMemcpyToSymbol(hostVar, src, 1, SIZE_MAX, ACL_MEMCPY_HOST_TO_DEVICE);
    EXPECT_EQ(ret, ACL_ERROR_FAILURE);

    // 成功场景:ACL_MEMCPY_HOST_TO_DEVICE
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSymbolLookup(_, _, _))
        .WillOnce(DoAll(SetArgPointee<2>(symbolSize), Return(RT_ERROR_NONE)));
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemcpy(_, _, _, _, _))
        .WillOnce(Return(RT_ERROR_NONE));
    ret = aclrtMemcpyToSymbol(hostVar, src, 5, 0, ACL_MEMCPY_HOST_TO_DEVICE);
    EXPECT_EQ(ret, ACL_SUCCESS);

    // 成功场景:ACL_MEMCPY_DEFAULT
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSymbolLookup(_, _, _))
        .WillOnce(DoAll(SetArgPointee<2>(symbolSize), Return(RT_ERROR_NONE)));
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemcpy(_, _, _, _, _))
        .WillOnce(Return(RT_ERROR_NONE));
    ret = aclrtMemcpyToSymbol(hostVar, src, 5, 0, ACL_MEMCPY_DEFAULT);
    EXPECT_EQ(ret, ACL_SUCCESS);

    // 成功场景:count 为 0 时,虽然 offset + count 不再小于 symbolSize,但仍然合法
    ret = aclrtMemcpyToSymbol(hostVar, src, 0, 0, ACL_MEMCPY_DEFAULT);
    EXPECT_EQ(ret, ACL_SUCCESS);
}

TEST_F(UTEST_ACL_Runtime, aclrtMemcpyToSymbolAsyncTest)
{
    int hostVar = 0;
    char src[10] = {};
    aclrtStream stream = (aclrtStream)0x10;
    size_t symbolSize = 100;

    // 参数校验:src 为 nullptr
    aclError ret = aclrtMemcpyToSymbolAsync(hostVar, nullptr, 5, 0, ACL_MEMCPY_HOST_TO_DEVICE, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    // 参数校验:kind 非法
    ret = aclrtMemcpyToSymbolAsync(hostVar, src, 5, 0, (aclrtMemcpyKind)999, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    // 参数校验:kind 不支持 ACL_MEMCPY_DEVICE_TO_HOST
    ret = aclrtMemcpyToSymbolAsync(hostVar, src, 5, 0, ACL_MEMCPY_DEVICE_TO_HOST, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    // 参数校验:stream 为 nullptr
    ret = aclrtMemcpyToSymbolAsync(hostVar, src, 5, 0, ACL_MEMCPY_HOST_TO_DEVICE, nullptr);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    // 符号未找到
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSymbolLookup(_, _, _))
        .WillOnce(Return(ACL_ERROR_RT_INVALID_SYMBOL));
    ret = aclrtMemcpyToSymbolAsync(hostVar, src, 5, 0, ACL_MEMCPY_HOST_TO_DEVICE, stream);
    EXPECT_EQ(ret, ACL_ERROR_RT_INVALID_SYMBOL);

    // 边界检查:offset + count > symbolSize
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSymbolLookup(_, _, _))
        .WillOnce(DoAll(SetArgPointee<2>(5), Return(RT_ERROR_NONE)));
    ret = aclrtMemcpyToSymbolAsync(hostVar, src, 5, 3, ACL_MEMCPY_HOST_TO_DEVICE, stream);
    EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);

    // 溢出保护:offset + count 溢出 size_t
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSymbolLookup(_, _, _))
        .WillOnce(DoAll(SetArgPointee<2>(symbolSize), Return(RT_ERROR_NONE)));
    ret = aclrtMemcpyToSymbolAsync(hostVar, src, 1, SIZE_MAX, ACL_MEMCPY_HOST_TO_DEVICE, stream);
    EXPECT_EQ(ret, ACL_ERROR_FAILURE);

    // 成功场景:ACL_MEMCPY_HOST_TO_DEVICE
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSymbolLookup(_, _, _))
        .WillOnce(DoAll(SetArgPointee<2>(symbolSize), Return(RT_ERROR_NONE)));
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemcpyAsync(_, _, _, _, _, _))
        .WillOnce(Return(RT_ERROR_NONE));
    ret = aclrtMemcpyToSymbolAsync(hostVar, src, 5, 0, ACL_MEMCPY_HOST_TO_DEVICE, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    // 成功场景:ACL_MEMCPY_DEFAULT
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtSymbolLookup(_, _, _))
        .WillOnce(DoAll(SetArgPointee<2>(symbolSize), Return(RT_ERROR_NONE)));
    EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtMemcpyAsync(_, _, _, _, _, _))
        .WillOnce(Return(RT_ERROR_NONE));
    ret = aclrtMemcpyToSymbolAsync(hostVar, src, 5, 0, ACL_MEMCPY_DEFAULT, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);

    // 成功场景:count 为 0 时,虽然 offset + count 不再小于 symbolSize,但仍然合法
    ret = aclrtMemcpyToSymbolAsync(hostVar, src, 0, 0, ACL_MEMCPY_DEFAULT, stream);
    EXPECT_EQ(ret, ACL_SUCCESS);
}