/**
 * 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 "gtest/gtest.h"
#include "mockcpp/mockcpp.hpp"
#include "mockcpp/ChainingMockHelper.h"
#include <iostream>
#include "driver/ascend_hal.h"
#include "securec.h"
#include <dlfcn.h>
#include "qs_tsd.h"
#define private public
#define protected public
#include "bind_relation.h"
#include "subscribe_manager.h"
#include "queue_manager.h"
#include "router_server.h"
#include "bqs_msg.h"
#include "bqs_status.h"
#include "qs_interface_process.h"
#include "queue_schedule_interface.h"
#include "common/bqs_util.h"
#include "msprof_manager.h"
#include "common/bqs_feature_ctrl.h"
#undef private
#undef protected

using namespace std;
using namespace bqs;

static bool g_product_device_side = true;
RunContext GetRunContextFake()
{
    if (g_product_device_side) {
        return bqs::RunContext::DEVICE;
    } else {
        return bqs::RunContext::HOST;
    }
}

class QsInterfaceStest : public testing::Test {
protected:
    virtual void SetUp()
    {
        backUpVariable();
        MOCKER(bqs::GetRunContext)
            .stubs()
            .will(invoke(GetRunContextFake));
    }

    virtual void TearDown()
    {
        recoverVariable();
        GlobalMockObject::verify();
    }

    static void SetUpTestCase()
    {
        std::cout << "QsInterfaceStest SetUpTestCase" << std::endl;
    }

    static void TearDownTestCase()
    {
        std::cout << "QsInterfaceStest TearDownTestCase" << std::endl;
    }

public:
    void backUpVariable()
    {
        is_product_device_ = g_product_device_side;
    }

    void recoverVariable()
    {
        g_product_device_side = is_product_device_;
    }

private:
    bool is_product_device_;
};

extern int32_t QueueScheduleMain(int32_t argc, char* argv[]);

TEST_F(QsInterfaceStest, MainTestSucc) {
   char processName[] = "queue_schedule";
    char paramDeviceIdOk[] = "--deviceId=1";
    char paramPidOk[] = "--pid=2";
    char paramPidSignOk[] = "--pidSign=12345A";
    char paramLogLevelOk[] = "--logLevelInPid=103";
    char paramReschedOk[] = "--reschedInterval=100";
    char paramModeOk[] = "--deployMode=2";
    char paraVfIdOk[] = "--vfId=0";
    char paraGrpNameOk[] = "--qsInitGroupName=DEAFAULT";
    char schedPolicy[] = "--schedPolicy=18446744073709551615";
    char paramStarter[] = "--starter=1";
    char paramAbnormalInterval[] = "--abnormalInterval=0";
    char paramResIdOk[] = "--resIds=1,2";
    g_product_device_side = false;

    MOCKER(system)
        .stubs()
        .will(returnValue(0));
    MOCKER(dlopen).stubs().will(returnValue((void *)(nullptr)));

    char* argv[] = {processName, paramDeviceIdOk, paramPidOk, paramPidSignOk, paramLogLevelOk,
                    paramReschedOk, paramModeOk, paraVfIdOk, paraGrpNameOk, schedPolicy, paramStarter,
                    paramAbnormalInterval, paramResIdOk};
    int32_t argc = 13;

    MOCKER(halEschedDettachDevice)
        .stubs()
        .will(returnValue(0));
    MOCKER_CPP(&QueueSchedule::StartQueueSchedule)
    .stubs()
    .will(returnValue(0));
    MOCKER_CPP(&QueueSchedule::WaitForStop)
    .stubs()
    .will(ignoreReturnValue());
    int32_t ret = QueueScheduleMain(argc, argv);
    EXPECT_EQ(ret, 0);
}


TEST_F(QsInterfaceStest, MainTestSuccess02) {
    char processName[] = "queue_schedule";
    char paramDeviceIdOk[] = "--deviceId=1";
    char paramPidOk[] = "--pid=2";
    char paramPidSignOk[] = "--pidSign=12345A";
    char paramReschedOk[] = "--reschedInterval=100";
    char paramModeOk[] = "--deployMode=2";
    char paraVfIdOk[] = "--vfId=0";
    char paraGrpNameOk[] = "--qsInitGroupName=DEAFAULT";
    char paramStarter[] = "--starter=1";
    char paramAbnormalInterval[] = "--abnormalInterval=20";
    char paramResIdOk[] = "--resIds=1,2";

    MOCKER(system)
        .stubs()
        .will(returnValue(0));
    MOCKER(dlopen).stubs().will(returnValue((void *)(nullptr)));

    setenv("ASCEND_GLOBAL_LOG_LEVEL", "3", 1);

    char* argv[] = {processName, paramDeviceIdOk, paramPidOk, paramPidSignOk,
                    paramReschedOk, paramModeOk, paraVfIdOk, paraGrpNameOk, paramStarter, paramAbnormalInterval,
                    paramResIdOk};
    int32_t argc = 11;
    MOCKER_CPP(&QueueScheduleInterface::InitQueueScheduler)
        .stubs()
        .will(returnValue(0));
    int32_t ret = QueueScheduleMain(argc, argv);
    EXPECT_EQ(ret, 0);
}

TEST_F(QsInterfaceStest, MainTestSuccess03) {
    char processName[] = "queue_schedule";
    char paramDeviceIdOk[] = "--deviceId=1";
    char paramPidOk[] = "--pid=2";
    char paramPidSignOk[] = "--pidSign=12345A";
    char paramReschedOk[] = "--reschedInterval=100";
    char paramModeOk[] = "--deployMode=2";
    char paraVfIdOk[] = "--vfId=0";
    char paraGrpNameOk[] = "--qsInitGroupName=DEAFAULT";
    char paramStarter[] = "--starter=1";
    char paramAbnormalInterval[] = "--abnormalInterval=20";
    char paramResIdOk[] = "--resIds=1,2";

    MOCKER(system)
        .stubs()
        .will(returnValue(0));
    MOCKER(dlopen).stubs().will(returnValue((void *)(nullptr)));

    char* argv[] = {processName, paramDeviceIdOk, paramPidOk, paramPidSignOk,
                    paramReschedOk, paramModeOk, paraVfIdOk, paraGrpNameOk, paramStarter, paramAbnormalInterval,
                    paramResIdOk};
    int32_t argc = 11;
    MOCKER_CPP(&QueueScheduleInterface::InitQueueScheduler)
        .stubs()
        .will(returnValue(0));
    int32_t ret = QueueScheduleMain(argc, argv);
    EXPECT_EQ(ret, 0);

    setenv("ASCEND_GLOBAL_LOG_LEVEL", "a", 1);
    ret = QueueScheduleMain(argc, argv);
    EXPECT_EQ(ret, 0);
}

TEST_F(QsInterfaceStest, InitQueueSchedulerWithProf)
{
    MOCKER_CPP(&QueueSchedule::WaitForStop)
    .stubs()
    .will(ignoreReturnValue());
    MOCKER_CPP(&QueueSchedule::StartQueueSchedule)
    .stubs()
    .will(returnValue(0));
    MOCKER(drvHdcGetCapacity)
    .stubs()
    .will(returnValue(0));

    InitQsParams initQsParams = {};
    initQsParams.reschedInterval = 100U;
    initQsParams.runMode = bqs::QueueSchedulerRunMode::MULTI_PROCESS;
    initQsParams.pid = 1000;
    initQsParams.pidSign = "test\0";
    initQsParams.qsInitGrpName = "DEFAULT_NAME";
    initQsParams.profCfgData = "{}";
    initQsParams.profFlag = false;
    MOCKER_CPP(&BqsMsprofManager::InitBqsMsprofManager)
    .stubs()
    .will(ignoreReturnValue());
    MOCKER_CPP(&QueueScheduleInterface::CheckBindHostPid)
        .stubs()
        .will(returnValue(0));
    EXPECT_EQ(QueueScheduleInterface::GetInstance().InitQueueScheduler(initQsParams), 0);
    QueueScheduleInterface::GetInstance().WaitForStop();
}


TEST_F(QsInterfaceStest, MainTestFailDeviceId01) {
    char processName[] = "queue_schedule";
    char paramDeviceIdOk[] = "--deviceId=a";
    char paramPidErr[] = "--pid=b";
    char paramPidSignOk[] = "--pidSign=12345A";
    char paramReschedOk[] = "--reschedInterval=c";
    char paramModeOk[] = "--deployMode=d";
    char paraVfIdOk[] = "--vfId=0";
    char paraGrpNameOk[] = "--qsInitGroupName=DEAFAULT";
    char paramStarter[] = "--starter=a";

    char* argv[] = {processName, paramDeviceIdOk, paramPidErr, paramPidSignOk,
                    paramReschedOk, paramModeOk, paraVfIdOk, paraGrpNameOk, paramStarter};
    int32_t argc = 9;
    int32_t ret = QueueScheduleMain(argc, argv);
    EXPECT_EQ(ret, -1);
}

TEST_F(QsInterfaceStest, MainTestFailPid02) {
    char processName[] = "queue_schedule";
    char paramDeviceIdOk[] = "--deviceId=0";
    char paramPidOk[] = "--pid=-10";
    char paramPidSignOk[] = "--pidSign=12345A";
    char paramReschedErr[] = "--reschedInterval=c";
    char paramModeOk[] = "--deployMode=d";
    char paraVfIdOk[] = "--vfId=0";
    char paraGrpNameOk[] = "--qsInitGroupName=";

    char* argv[] = {processName, paramDeviceIdOk, paramPidOk, paramPidSignOk,
                    paramReschedErr, paramModeOk, paraVfIdOk, paraGrpNameOk};
    int32_t argc = 8;
    int32_t ret = QueueScheduleMain(argc, argv);
    EXPECT_EQ(ret, -1);
}

TEST_F(QsInterfaceStest, MainTestFailReshced03) {
    char processName[] = "queue_schedule";
    char paramDeviceIdOk[] = "--deviceId=0";
    char paramPidOk[] = "--pid=10";
    char paramPidSignOk[] = "--pidSign=12345A";
    char paramReschedErr[] = "--reschedInterval=-100";
    char paramModeOk[] = "--deployMode=d";
    char paraVfIdOk[] = "--vfId=0";
    char paraGrpNameOk[] = "--qsInitGroupName=";

    char* argv[] = {processName, paramDeviceIdOk, paramPidOk, paramPidSignOk,
                    paramReschedErr, paramModeOk, paraVfIdOk, paraGrpNameOk};
    int32_t argc = 8;
    int32_t ret = QueueScheduleMain(argc, argv);
    EXPECT_EQ(ret, -1);
}

TEST_F(QsInterfaceStest, MainTestFailDeployMode04) {
    char processName[] = "queue_schedule";
    char paramDeviceIdOk[] = "--deviceId=0";
    char paramPidOk[] = "--pid=10";
    char paramPidSignOk[] = "--pidSign=12345A";
    char paramReschedOk[] = "--reschedInterval=100";
    char paramModeErr[] = "--deployMode=d";
    char paraVfIdOk[] = "--vfId=0";
    char paraGrpNameOk[] = "--qsInitGroupName=";

    char* argv[] = {processName, paramDeviceIdOk, paramPidOk, paramPidSignOk,
                    paramReschedOk, paramModeErr, paraVfIdOk, paraGrpNameOk};
    int32_t argc = 8;
    int32_t ret = QueueScheduleMain(argc, argv);
    EXPECT_EQ(ret, -1);
}

TEST_F(QsInterfaceStest, MainTestFailVfId05) {
    char processName[] = "queue_schedule";
    char paramDeviceIdOk[] = "--deviceId=0";
    char paramPidOk[] = "--pid=10";
    char paramPidSignOk[] = "--pidSign=12345A";
    char paramReschedOk[] = "--reschedInterval=100";
    char paramModeOk[] = "--deployMode=2";
    char paraVfIdErr[] = "--vfId=e";
    char paraGrpNameOk[] = "--qsInitGroupName=";

    char* argv[] = {processName, paramDeviceIdOk, paramPidOk, paramPidSignOk,
                    paramReschedOk, paramModeOk, paraVfIdErr, paraGrpNameOk};
    int32_t argc = 8;
    int32_t ret = QueueScheduleMain(argc, argv);
    EXPECT_EQ(ret, -1);
}

TEST_F(QsInterfaceStest, MainTestFailResched06) {
    char processName[] = "queue_schedule";
    char paramDeviceIdOk[] = "--deviceId=0";
    char paramPidOk[] = "--pid=10";
    char paramPidSignOk[] = "--pidSign=12345A";
    char paramReschedErr[] = "--reschedInterval=c";
    char paramModeOk[] = "--deployMode=d";
    char paraVfIdOk[] = "--vfId=0";
    char paraGrpNameOk[] = "--qsInitGroupName=";

    char* argv[] = {processName, paramDeviceIdOk, paramPidOk, paramPidSignOk,
                    paramReschedErr, paramModeOk, paraVfIdOk, paraGrpNameOk};
    int32_t argc = 8;
    int32_t ret = QueueScheduleMain(argc, argv);
    EXPECT_EQ(ret, -1);
}

TEST_F(QsInterfaceStest, MainTestFailDeployMode07) {
    char processName[] = "queue_schedule";
    char paramDeviceIdOk[] = "--deviceId=0";
    char paramPidOk[] = "--pid=10000";
    char paramPidSignOk[] = "--pidSign=12345A";
    char paramReschedOk[] = "--reschedInterval=1";
    char paramModeErr[] = "--deployMode=-1";
    char paraVfIdOk[] = "--vfId=0";
    char paraGrpNameOk[] = "--qsInitGroupName=";

    char* argv[] = {processName, paramDeviceIdOk, paramPidOk, paramPidSignOk,
                    paramReschedOk, paramModeErr, paraVfIdOk, paraGrpNameOk};
    int32_t argc = 8;
    int32_t ret = QueueScheduleMain(argc, argv);
    EXPECT_EQ(ret, -1);
}

TEST_F(QsInterfaceStest, MainTestFailschedPolicy) {
    char processName[] = "queue_schedule";
    char paramDeviceIdOk[] = "--deviceId=1";
    char paramPidOk[] = "--pid=2";
    char paramPidSignOk[] = "--pidSign=12345A";
    char paramReschedOk[] = "--reschedInterval=100";
    char paramModeOk[] = "--deployMode=2";
    char paraVfIdOk[] = "--vfId=0";
    char paraGrpNameOk[] = "--qsInitGroupName=";
    char schedPolicy[] = "--schedPolicy=184467440737095516XX";

    char* argv[] = {processName, paramDeviceIdOk, paramPidOk, paramPidSignOk,
                    paramReschedOk, paramModeOk, paraVfIdOk, paraGrpNameOk, schedPolicy};
    int32_t argc = 9;
    int32_t ret = QueueScheduleMain(argc, argv);
    EXPECT_EQ(ret, -1);
}

TEST_F(QsInterfaceStest, ParseArgs_resIds_succ) {
    char processName[] = "queue_schedule";
    char paramDeviceIdOk[] = "--deviceId=1";
    char paramPidOk[] = "--pid=2";
    char paramPidSignOk[] = "--pidSign=12345A";
    char paramReschedOk[] = "--reschedInterval=100";
    char paramModeOk[] = "--deployMode=2";
    char paraGrpNameOk[] = "--qsInitGroupName=DEAFAULT";
    char paraResIdsOk[] = "--resIds=0";
    char paraDevIdsOk[] = "--devIds=0,1";
 
    MOCKER(system)
        .stubs()
        .will(returnValue(0));
    MOCKER(dlopen).stubs().will(returnValue((void *)(nullptr)));
    g_product_device_side = true;
 
    char* argv[] = {processName, paramDeviceIdOk, paramPidOk, paramPidSignOk,
                    paramReschedOk, paramModeOk, paraGrpNameOk, paraResIdsOk, paraDevIdsOk};
    int32_t argc = 9;
    MOCKER_CPP(&QueueScheduleInterface::InitQueueScheduler)
        .stubs()
        .will(returnValue(0));
    int32_t ret = QueueScheduleMain(argc, argv);
    EXPECT_EQ(ret, 0);
}
 
TEST_F(QsInterfaceStest, ParseArgs_resIds_deviceIds_succ) {
    char processName[] = "queue_schedule";
    char paramDeviceIdOk[] = "--deviceId=1";
    char paramPidOk[] = "--pid=2";
    char paramPidSignOk[] = "--pidSign=12345A";
    char paramReschedOk[] = "--reschedInterval=100";
    char paramModeOk[] = "--deployMode=2";
    char paraGrpNameOk[] = "--qsInitGroupName=DEAFAULT";
    char paraResIdsOk[] = "--resIds=0,1";
    char paraDevIdsOk[] = "--devIds=0,2,3";
 
    MOCKER(system)
        .stubs()
        .will(returnValue(0));
    MOCKER(dlopen).stubs().will(returnValue((void *)(nullptr)));
    g_product_device_side = true;
 
    char* argv[] = {processName, paramDeviceIdOk, paramPidOk, paramPidSignOk,
                    paramReschedOk, paramModeOk, paraGrpNameOk, paraResIdsOk, paraDevIdsOk};
    int32_t argc = 9;
    MOCKER_CPP(&QueueScheduleInterface::InitQueueScheduler)
        .stubs()
        .will(returnValue(0));
    int32_t ret = QueueScheduleMain(argc, argv);
    EXPECT_EQ(ret, 0);
}

TEST_F(QsInterfaceStest, ParseArgs_resIds_deviceIds_failed) {
    char processName[] = "queue_schedule";
    char paramDeviceIdOk[] = "--deviceId=1";
    char paramPidOk[] = "--pid=2";
    char paramPidSignOk[] = "--pidSign=12345A";
    char paramReschedOk[] = "--reschedInterval=100";
    char paramModeOk[] = "--deployMode=2";
    char paraGrpNameOk[] = "--qsInitGroupName=DEAFAULT";
    char paraResIdsOk[] = "--resIds=0,1";
    char paraDevIdsOk[] = "--devIds=0,11111111111111111111111111111111";
 
    MOCKER(system)
        .stubs()
        .will(returnValue(0));
    MOCKER(dlopen).stubs().will(returnValue((void *)(nullptr)));
    g_product_device_side = true;
 
    char* argv[] = {processName, paramDeviceIdOk, paramPidOk, paramPidSignOk,
                    paramReschedOk, paramModeOk, paraGrpNameOk, paraResIdsOk, paraDevIdsOk};
    int32_t argc = 9;
    MOCKER_CPP(&QueueScheduleInterface::InitQueueScheduler)
        .stubs()
        .will(returnValue(0));
    int32_t ret = QueueScheduleMain(argc, argv);
    EXPECT_EQ(ret, 0);
}

TEST_F(QsInterfaceStest, ThreadModeQsInterfaceSucc) {
    MOCKER(system)
        .stubs()
        .will(returnValue(0));
    MOCKER_CPP(&QueueScheduleInterface::InitQueueScheduler)
        .stubs()
        .will(returnValue(0));
    EXPECT_EQ(InitQueueScheduler(0, 100), 0);
}

TEST_F(QsInterfaceStest, error_report_02) {
    char processName[] = "queue_schedule";
    char paramDeviceIdOk[] = "--deviceId=1";
    char paramPidOk[] = "--pid=2";
    char paramPidSignOk[] = "--pidSign=12345A";
    char paramReschedOk[] = "--reschedInterval=100";
    char paramModeOk[] = "--deployMode=2";
    char paraVfIdOk[] = "--vfId=0";
    char paraGrpNameOk[] = "--qsInitGroupName=DEAFAULT";

    MOCKER(system)
        .stubs()
        .will(returnValue(0));
    g_product_device_side = false;
    MOCKER(halGrpAttach).stubs().will(returnValue(0));
    char* argv[] = {processName, paramDeviceIdOk, paramPidOk, paramPidSignOk,
                    paramReschedOk, paramModeOk, paraVfIdOk, paraGrpNameOk};
    int32_t argc = 8;
    MOCKER_CPP(&QueueScheduleInterface::InitQueueScheduler)
        .stubs()
        .will(returnValue(3));
    int32_t ret = QueueScheduleMain(argc, argv);
    EXPECT_EQ(ret, -1);
}

int32_t QsSubModuleProcessFake(const struct TsdSubEventInfo * const eventInfo)
{
    std::cout << "enter AicpuSchedulerSubModuleProcessFake" << std::endl;
    return 0;
}

void *dlsymStubQsMain(void *const soHandle, const char_t * const funcName)
{
    std::cout << "enter dlsymStub" << std::endl;
    return (reinterpret_cast<void *>(QsSubModuleProcessFake));
}

TEST_F(QsInterfaceStest, RegAicpuSchedulerModuleCallBack_01) {
    char processName[] = "queue_schedule";
    char paramDeviceIdOk[] = "--deviceId=1";
    char paramPidOk[] = "--pid=2";
    char paramPidSignOk[] = "--pidSign=12345A";
    char paramReschedOk[] = "--reschedInterval=100";
    char paramModeOk[] = "--deployMode=2";
    char paraVfIdOk[] = "--vfId=0";
    char paraGrpNameOk[] = "--qsInitGroupName=DEAFAULT";
    uint64_t rest = 0;
    MOCKER(system).stubs().will(returnValue(0));
    MOCKER(halGrpAttach).stubs().will(returnValue(1));
    MOCKER(dlopen).stubs().will(returnValue((void *)(&rest)));
    MOCKER(dlclose).stubs().will(returnValue(0));
    MOCKER(RegEventMsgCallBackFunc).stubs().will(returnValue(0));
    MOCKER(dlsym).stubs().will(invoke(dlsymStubQsMain));
    MOCKER(dlclose).stubs().will(returnValue(0));
    char* argv[] = {processName, paramDeviceIdOk, paramPidOk, paramPidSignOk,
                    paramReschedOk, paramModeOk, paraVfIdOk, paraGrpNameOk};
    int32_t argc = 8;
    RouterServer::GetInstance().manageThreadStatus_ = ThreadStatus::NOT_INIT;
    int32_t ret = QueueScheduleMain(argc, argv);
    EXPECT_EQ(ret, -1);
}

TEST_F(QsInterfaceStest, InitQueueSchedulerFailWithStartQueueScheduleFail) {
    MOCKER_CPP(&QueueSchedule::StartQueueSchedule).stubs().will(returnValue(1));
    InitQsParams initQsParams = {};
    initQsParams.reschedInterval = 100U;
    initQsParams.runMode = bqs::QueueSchedulerRunMode::SINGLE_PROCESS;
    initQsParams.pid = 1000;
    initQsParams.starter = bqs::QsStartType::START_BY_TSD;
    int32_t ret = QueueScheduleInterface::GetInstance().InitQueueScheduler(initQsParams);
    EXPECT_NE(ret, 0);
}

drvError_t drvQueryProcessHostPidFake1(int pid, unsigned int *chip_id, unsigned int *vfid,
                                       unsigned int *host_pid, unsigned int *cp_type)
{
    *host_pid = 1;
    *cp_type = DEVDRV_PROCESS_QS;
    return DRV_ERROR_NONE;
}

drvError_t drvQueryProcessHostPidFake2(int pid, unsigned int *chip_id, unsigned int *vfid,
                                       unsigned int *host_pid, unsigned int *cp_type)
{
    return DRV_ERROR_NO_PROCESS;
}

drvError_t drvQueryProcessHostPidFake3(int pid, unsigned int *chip_id, unsigned int *vfid,
                                       unsigned int *host_pid, unsigned int *cp_type)
{
    return DRV_ERROR_INNER_ERR;
}

TEST_F(QsInterfaceStest, CheckBindHostPid001) {
    QueueScheduleInterface &qsInterface = QueueScheduleInterface::GetInstance();
    MOCKER(drvQueryProcessHostPid)
        .stubs()
        .will(invoke(drvQueryProcessHostPidFake1));
    int32_t bindPidRet = qsInterface.CheckBindHostPid(1);
    EXPECT_EQ(bindPidRet, bqs::BQS_STATUS_OK);
}

TEST_F(QsInterfaceStest, CheckBindHostPid002) {
    QueueScheduleInterface &qsInterface = QueueScheduleInterface::GetInstance();
    MOCKER(drvQueryProcessHostPid)
        .stubs()
        .will(invoke(drvQueryProcessHostPidFake2));
    int32_t bindPidRet = qsInterface.CheckBindHostPid(1);
    EXPECT_EQ(bindPidRet, bqs::BQS_STATUS_DRIVER_ERROR);
}

TEST_F(QsInterfaceStest, CheckBindHostPid003) {
    QueueScheduleInterface &qsInterface = QueueScheduleInterface::GetInstance();
    MOCKER(drvQueryProcessHostPid)
        .stubs()
        .will(invoke(drvQueryProcessHostPidFake3));
    int32_t bindPidRet = qsInterface.CheckBindHostPid(1);
    EXPECT_EQ(bindPidRet, bqs::BQS_STATUS_DRIVER_ERROR);
}

TEST_F(QsInterfaceStest, InitQueueSchedulerFailWithBindHostPidFail) {
    g_product_device_side = true;
    InitQsParams initQsParams = {};
    initQsParams.reschedInterval = 100U;
    initQsParams.runMode = bqs::QueueSchedulerRunMode::SINGLE_PROCESS;
    initQsParams.pid = 1000;
    initQsParams.starter = bqs::QsStartType::START_BY_TSD;
    int32_t ret = QueueScheduleInterface::GetInstance().InitQueueScheduler(initQsParams);
    EXPECT_NE(ret, 0);
}

TEST_F(QsInterfaceStest, InitQueueSchedulerFailWithGetDevCpuInfoFail) {
    g_product_device_side = true;
    InitQsParams initQsParams = {};
    initQsParams.reschedInterval = 100U;
    initQsParams.runMode = bqs::QueueSchedulerRunMode::SINGLE_PROCESS;
    initQsParams.pid = 1000;
    initQsParams.starter = bqs::QsStartType::START_BY_TSD;
    initQsParams.numaFlag = true;
    MOCKER_CPP(&BindCpuUtils::GetDevCpuInfo)
    .stubs()
    .will(returnValue(bqs::BQS_STATUS_PARAM_INVALID));
    int32_t ret = QueueScheduleInterface::GetInstance().InitQueueScheduler(initQsParams);
    EXPECT_EQ(ret, 1);
    g_product_device_side = false;
    ret = QueueScheduleInterface::GetInstance().InitQueueScheduler(initQsParams);
    EXPECT_EQ(ret, 1);
}

TEST_F(QsInterfaceStest, GetAicpuPhysIndex001) {
    QueueScheduleInterface &qsInterface = QueueScheduleInterface::GetInstance();
    qsInterface.aiCpuIds_ = {12, 34};
    uint32_t getResult = qsInterface.GetAicpuPhysIndexInVfMode(3, 0);
    EXPECT_EQ(getResult, 0);
    getResult = qsInterface.GetAicpuPhysIndexInVfMode(1, 0);
    EXPECT_EQ(getResult, 34);
}

TEST_F(QsInterfaceStest, GetAicpuPhysIndex002) {
    QueueScheduleInterface &qsInterface = QueueScheduleInterface::GetInstance();
    qsInterface.aiCpuIdsExtra_ = {56, 78};
    uint32_t getResult = qsInterface.GetExtraAicpuPhysIndexInVfMode(4, 0);
    EXPECT_EQ(getResult, 0);
    getResult = qsInterface.GetExtraAicpuPhysIndexInVfMode(0, 0);
    EXPECT_EQ(getResult, 56);
    qsInterface.aicpuNumExtra_ = 99;
    getResult = qsInterface.GetExtraAiCpuNum();
    EXPECT_EQ(getResult, 99);
}

TEST_F(QsInterfaceStest, GetAicpuPhysIndex003) {
    QueueScheduleInterface &qsInterface = QueueScheduleInterface::GetInstance();
    qsInterface.aiCpuIdsExtra_ = {89, 91};
    uint32_t getResult = qsInterface.GetExtraAicpuPhysIndex(0, 4);
    EXPECT_EQ(getResult, 0);
    getResult = qsInterface.GetExtraAicpuPhysIndex(0, 1);
    EXPECT_EQ(getResult, 91);
}

TEST_F(QsInterfaceStest, ReportAbnormal001) {
    QueueScheduleInterface &qsInterface = QueueScheduleInterface::GetInstance();
    MOCKER_CPP(&QueueSchedule::ReportAbnormal)
    .stubs()
    .will(returnValue(1));
    qsInterface.ReportAbnormal();
    EXPECT_NE(qsInterface.queueSchedule_, nullptr);
}

TEST_F(QsInterfaceStest, GetAicpuPhysIndex_001) {
    QueueScheduleInterface &qsInterface = QueueScheduleInterface::GetInstance();
    MOCKER_CPP(&FeatureCtrl::IsAosCore).stubs().will(returnValue(true));
    uint32_t ret = qsInterface.GetAicpuPhysIndex(0, 1);
    EXPECT_EQ(ret, 1); 
}
 
TEST_F(QsInterfaceStest, GetAicpuPhysIndex_002) {
    QueueScheduleInterface &qsInterface = QueueScheduleInterface::GetInstance();
    MOCKER_CPP(&FeatureCtrl::BindCpuOnlyOneDevice).stubs().will(returnValue(true));
    uint32_t ret = qsInterface.GetAicpuPhysIndex(0, 1);
    EXPECT_EQ(ret, 34); 
}

TEST_F(QsInterfaceStest, StopAiCpuSubModuleInQs_01) {
    char processName[] = "queue_schedule";
    char paramDeviceIdOk[] = "--deviceId=1";
    char paramPidOk[] = "--pid=2";
    char paramPidSignOk[] = "--pidSign=12345A";
    char paramReschedOk[] = "--reschedInterval=100";
    char paramModeOk[] = "--deployMode=2";
    char paraVfIdOk[] = "--vfId=0";
    char paraGrpNameOk[] = "--qsInitGroupName=DEAFAULT";
    uint64_t rest = 0;
    MOCKER(system).stubs().will(returnValue(0));
    MOCKER(halGrpAttach).stubs().will(returnValue(1));
    MOCKER(dlopen).stubs().will(returnValue((void *)(&rest)));
    MOCKER(dlclose).stubs().will(returnValue(0));
    MOCKER(RegEventMsgCallBackFunc).stubs().will(returnValue(0));
    MOCKER(dlsym).stubs().will(invoke(dlsymStubQsMain));
    MOCKER(dlclose).stubs().will(returnValue(0));
    char* argv[] = {processName, paramDeviceIdOk, paramPidOk, paramPidSignOk,
                    paramReschedOk, paramModeOk, paraVfIdOk, paraGrpNameOk};
    int32_t argc = 8;
    MOCKER_CPP(&QueueScheduleInterface::InitQueueScheduler).stubs().will(returnValue(0));

    int32_t ret = QueueScheduleMain(argc, argv);
    EXPECT_EQ(ret, 0);
}