/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2026-2026. All rights reserved.
 * ubs-engine is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *          http://license.coscl.org.cn/MulanPSL2
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 */

#include "test_ubse_cli_urma_cmd_reg.h"
#include <securec.h>
#include <mockcpp/mockcpp.hpp>
#include "ubse_cli_urma_cmd_reg.h"
#include "ubse_common_def.h"
#include "ubse_error.h"
#include "ubse_ipc_client.h"
#include "ubse_serial_util.h"
#include "test_mock_invoke.h"

namespace ubse::ut::cli {
using namespace ubse::cli::reg;
using namespace ubse::common::def;
using namespace ubse::serial;

void TestUbseCliUrmaCmdReg::SetUp() {}

void TestUbseCliUrmaCmdReg::TearDown() {}

/*
 * 用例描述:
 * 注册URMA模块测试
 * 测试步骤:
 * 1. 注册CLI_URMA_MODULE模块
 * 2. 验证注册成功
 * 预期结果:
 * 1. 模块注册成功,creators大小正确
 * 2. 模块签入成功,creators清空
 */
TEST_F(TestUbseCliUrmaCmdReg, RegisterUrmaModule)
{
    UbseCliModuleRegistry::GetInstance().UbseCliReset();
    UBSE_CLI_REGISTER_MODULE("CLI_URMA_MODULE", UbseCliRegUrmaModule);
    EXPECT_EQ(UbseCliModuleRegistry::GetInstance().creators_.size(), 1);
    UbseCliModuleRegistry::GetInstance().UbseCliCallAllModuleSignUp();
    EXPECT_EQ(UbseCliModuleRegistry::GetInstance().creators_.size(), 0);
    UbseCliModuleRegistry::GetInstance().UbseCliReset();
}

/*
 * 用例描述:
 * ParseCommaSeparatedDeviceList解析逗号分隔设备列表测试
 * 测试步骤:
 * 1. 测试空字符串
 * 2. 测试单个设备
 * 3. 测试多个设备
 * 4. 测试带空格的设备
 * 5. 测试只有空格的字符串
 * 预期结果:
 * 1. 空字符串返回空列表
 * 2. 单个设备正确解析
 * 3. 多个设备正确解析
 * 4. 带空格的设备正确去除空格
 * 5. 只有空格的字符串返回空列表
 */
TEST_F(TestUbseCliUrmaCmdReg, ParseCommaSeparatedDeviceList)
{
    std::vector<std::string> result;

    result = UbseCliRegUrmaModule::ParseCommaSeparatedDeviceList("");
    EXPECT_TRUE(result.empty());

    result = UbseCliRegUrmaModule::ParseCommaSeparatedDeviceList("dev1");
    EXPECT_EQ(result.size(), 1);
    EXPECT_EQ(result[0], "dev1");

    result = UbseCliRegUrmaModule::ParseCommaSeparatedDeviceList("dev1,dev2,dev3");
    EXPECT_EQ(result.size(), 3);
    EXPECT_EQ(result[0], "dev1");
    EXPECT_EQ(result[1], "dev2");
    EXPECT_EQ(result[2], "dev3");

    result = UbseCliRegUrmaModule::ParseCommaSeparatedDeviceList(" dev1 , dev2 , dev3 ");
    EXPECT_EQ(result.size(), 3);
    EXPECT_EQ(result[0], "dev1");
    EXPECT_EQ(result[1], "dev2");
    EXPECT_EQ(result[2], "dev3");

    result = UbseCliRegUrmaModule::ParseCommaSeparatedDeviceList("   ");
    EXPECT_TRUE(result.empty());

    result = UbseCliRegUrmaModule::ParseCommaSeparatedDeviceList(" , , ");
    EXPECT_TRUE(result.empty());
}

/*
 * 用例描述:
 * ParseAndValidateUrmaParams参数验证测试
 * 测试步骤:
 * 1. 测试无参数(使用默认值)
 * 2. 测试有效的node参数
 * 3. 测试无效的node参数(非数字)
 * 4. 测试有效的node和device参数
 * 5. 测试无效的device参数(空设备列表)
 * 6. 测试UINT32_MAX的node参数
 * 预期结果:
 * 1. 无参数时nodeId为UINT32_MAX,deviceNameList为空,返回nullptr
 * 2. 有效node参数正确解析,返回nullptr
 * 3. 无效node参数返回错误信息
 * 4. 有效node和device参数正确解析,返回nullptr
 * 5. 空device参数返回错误信息
 * 6. UINT32_MAX的node参数返回错误信息
 */
TEST_F(TestUbseCliUrmaCmdReg, ParseAndValidateUrmaParams)
{
    uint32_t nodeId = 0;
    std::vector<std::string> deviceNameList;
    std::map<std::string, std::string> params;
    std::shared_ptr<UbseCliResultEcho> result;

    params.clear();
    result = UbseCliRegUrmaModule::ParseAndValidateUrmaParams(params, nodeId, deviceNameList);
    EXPECT_EQ(result, nullptr);
    EXPECT_EQ(nodeId, UINT32_MAX);
    EXPECT_TRUE(deviceNameList.empty());

    params.clear();
    params["node"] = "1";
    result = UbseCliRegUrmaModule::ParseAndValidateUrmaParams(params, nodeId, deviceNameList);
    EXPECT_EQ(result, nullptr);
    EXPECT_EQ(nodeId, 1);

    params.clear();
    params["node"] = "invalid";
    result = UbseCliRegUrmaModule::ParseAndValidateUrmaParams(params, nodeId, deviceNameList);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("Invalid request param"), std::string::npos);

    params.clear();
    params["node"] = "1";
    params["dev"] = "dev1,dev2";
    result = UbseCliRegUrmaModule::ParseAndValidateUrmaParams(params, nodeId, deviceNameList);
    EXPECT_EQ(result, nullptr);
    EXPECT_EQ(nodeId, 1);
    EXPECT_EQ(deviceNameList.size(), 2);
    EXPECT_EQ(deviceNameList[0], "dev1");
    EXPECT_EQ(deviceNameList[1], "dev2");

    params.clear();
    params["dev"] = " , , ";
    result = UbseCliRegUrmaModule::ParseAndValidateUrmaParams(params, nodeId, deviceNameList);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("Invalid device name list format"), std::string::npos);

    params.clear();
    params["node"] = "4294967295";
    result = UbseCliRegUrmaModule::ParseAndValidateUrmaParams(params, nodeId, deviceNameList);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("Invalid request param"), std::string::npos);
}

/*
 * 用例描述:
 * UbseQueryUrmaDevInfoFunc查询URMA设备信息测试
 * 测试步骤:
 * 1. 测试无效参数(缺少node和dev)
 * 2. 测试序列化失败
 * 3. 测试IPC调用失败(UBSE_ERROR)
 * 4. 测试IPC调用返回节点不存在(UBSE_ERR_NOT_EXIST)
 * 5. 测试IPC调用返回节点状态异常(UBSE_ERROR_INVAL)
 * 6. 测试IPC调用返回空列表
 * 7. 测试反序列化失败
 * 8. 测试正常查询
 * 预期结果:
 * 1. 无效参数返回错误信息
 * 2. 序列化失败返回错误信息
 * 3. IPC调用失败返回错误信息
 * 4. 返回节点不存在错误信息
 * 5. 返回节点状态异常错误信息
 * 6. 返回空列表错误信息
 * 7. 返回反序列化失败错误信息
 * 8. 正常返回设备信息表格
 */
TEST_F(TestUbseCliUrmaCmdReg, UbseQueryUrmaDevInfoFunc)
{
    std::map<std::string, std::string> params;
    std::shared_ptr<UbseCliResultEcho> result;

    params.clear();
    params["node"] = "invalid";
    result = UbseCliRegUrmaModule::UbseQueryUrmaDevInfoFunc(params);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("Invalid request param"), std::string::npos);

    MOCKER(&ubse_invoke_call).stubs().will(returnValue(UBSE_ERROR));
    params.clear();
    params["node"] = "1";
    result = UbseCliRegUrmaModule::UbseQueryUrmaDevInfoFunc(params);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("Internal error"), std::string::npos);
    GlobalMockObject::verify();

    MOCKER(&ubse_invoke_call).stubs().will(returnValue(UBSE_ERR_NOT_EXIST));
    params.clear();
    params["node"] = "1";
    result = UbseCliRegUrmaModule::UbseQueryUrmaDevInfoFunc(params);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("Invalid request param"), std::string::npos);
    GlobalMockObject::verify();

    MOCKER(&ubse_invoke_call).stubs().will(returnValue(UBSE_ERROR_INVAL));
    params.clear();
    params["node"] = "1";
    result = UbseCliRegUrmaModule::UbseQueryUrmaDevInfoFunc(params);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("Node state is abnormal"), std::string::npos);
    GlobalMockObject::verify();

    MOCKER(&ubse_invoke_call).stubs().will(invoke(mock_urma_dev_info_invoke_call_empty));
    params.clear();
    params["node"] = "1";
    result = UbseCliRegUrmaModule::UbseQueryUrmaDevInfoFunc(params);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("urma List is empty"), std::string::npos);
    GlobalMockObject::verify();

    MOCKER(&ubse_invoke_call).stubs().will(invoke(mock_urma_dev_info_invoke_call_deserialize_failed));
    params.clear();
    params["node"] = "1";
    result = UbseCliRegUrmaModule::UbseQueryUrmaDevInfoFunc(params);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("Deserialization failed"), std::string::npos);
    GlobalMockObject::verify();

    MOCKER(&ubse_invoke_call).stubs().will(invoke(mock_urma_dev_info_invoke_call_normal));
    params.clear();
    params["node"] = "1";
    result = UbseCliRegUrmaModule::UbseQueryUrmaDevInfoFunc(params);
    EXPECT_NE(result, nullptr);
    GlobalMockObject::verify();
}

/*
*/

/*
 * 用例描述:
 * UbseDisplayUrmaQosFunc查询URMA QoS信息测试
 * 测试步骤:
 * 1. 测试缺少node参数
 * 2. 测试无效的node参数
 * 3. 测试IPC调用失败
 * 4. 测试IPC调用返回空列表
 * 5. 测试反序列化失败
 * 6. 测试正常查询
 * 预期结果:
 * 1. 缺少node参数返回错误信息
 * 2. 无效node参数返回错误信息
 * 3. IPC调用失败返回错误信息
 * 4. 返回空列表错误信息
 * 5. 返回反序列化失败错误信息
 * 6. 正常返回QoS信息表格
 */
TEST_F(TestUbseCliUrmaCmdReg, UbseDisplayUrmaQosFunc)
{
    std::map<std::string, std::string> params;
    std::shared_ptr<UbseCliResultEcho> result;

    params.clear();
    result = UbseCliRegUrmaModule::UbseDisplayUrmaQosFunc(params);
    EXPECT_NE(result, nullptr);

    params.clear();
    params["node"] = "invalid";
    result = UbseCliRegUrmaModule::UbseDisplayUrmaQosFunc(params);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("not support"), std::string::npos);

    MOCKER(&ubse_invoke_call).stubs().will(returnValue(UBSE_ERROR));
    params.clear();
    result = UbseCliRegUrmaModule::UbseDisplayUrmaQosFunc(params);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("Internal error with error code"), std::string::npos);
    GlobalMockObject::verify();

    MOCKER(&ubse_invoke_call).stubs().will(invoke(mock_urma_qos_invoke_call_empty));
    params.clear();
    result = UbseCliRegUrmaModule::UbseDisplayUrmaQosFunc(params);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("No ETS QoS priority groups has been created"), std::string::npos);
    GlobalMockObject::verify();

    MOCKER(&ubse_invoke_call).stubs().will(invoke(mock_urma_qos_invoke_call_deserialize_failed));
    params.clear();
    result = UbseCliRegUrmaModule::UbseDisplayUrmaQosFunc(params);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("Deserialization failed"), std::string::npos);
    GlobalMockObject::verify();

    MOCKER(&ubse_invoke_call).stubs().will(invoke(mock_urma_qos_invoke_call_normal));
    params.clear();
    result = UbseCliRegUrmaModule::UbseDisplayUrmaQosFunc(params);
    EXPECT_NE(result, nullptr);
    GlobalMockObject::verify();
}

/*
 * 用例描述:
 * UbseCliProcessUrmaDevInfoTable处理URMA设备信息表格测试
 * 测试步骤:
 * 1. 测试反序列化失败
 * 2. 测试状态值超出范围
 * 3. 测试正常处理
 * 预期结果:
 * 1. 反序列化失败返回错误信息
 * 2. 状态值超出范围返回错误信息
 * 3. 正常返回表格信息
 */
TEST_F(TestUbseCliUrmaCmdReg, UbseCliProcessUrmaDevInfoTable)
{
    uint8_t buffer[1024];
    uint32_t length = 0;

    UbseSerialization ser;
    uint32_t urmaSize = 1;
    ser << urmaSize;
    std::string urmaName = "urma1";
    uint32_t urmaType = 0;
    std::string devEid = "eid1";
    std::vector<std::string> feNames = {"dev1", "dev2"};
    std::vector<std::string> feEids = {"eid1", "eid2"};
    uint32_t urmaStatus = 0;
    ser << urmaName << urmaType << devEid << feNames << feEids << urmaStatus;

    length = static_cast<uint32_t>(ser.GetLength());
    if (memcpy_s(buffer, sizeof(buffer), ser.GetBuffer(), length) != EOK) {
        FAIL() << "memcpy_s failed";
    }

    UbseDeSerialization deser(buffer, length);
    auto result = UbseCliRegUrmaModule::UbseCliProcessUrmaDevInfoTable(deser, urmaSize);
    EXPECT_NE(result, nullptr);
}

/*
 * 用例描述:
 * UbseCliProcessUrmaQosTable处理URMA QoS表格测试
 * 测试步骤:
 * 1. 测试反序列化失败
 * 2. 测试正常处理
 * 预期结果:
 * 1. 反序列化失败返回错误信息
 * 2. 正常返回表格信息
 */
TEST_F(TestUbseCliUrmaCmdReg, UbseCliProcessUrmaQosTable)
{
    uint8_t buffer[1024];
    uint32_t length = 0;

    UbseSerialization ser;
    uint32_t urmaSize = 1;
    ser << urmaSize;
    std::string urmaName = "urma1";
    std::vector<std::string> feNames = {"dev1", "dev2"};
    uint32_t minBandWidth = 100;
    uint32_t maxBandWidth = 1000;
    ser << urmaName << feNames << minBandWidth << maxBandWidth;

    length = static_cast<uint32_t>(ser.GetLength());
    if (memcpy_s(buffer, sizeof(buffer), ser.GetBuffer(), length) != EOK) {
        FAIL() << "memcpy_s failed";
    }

    UbseDeSerialization deser(buffer, length);
    auto result = UbseCliRegUrmaModule::UbseCliProcessUrmaQosTable(deser, urmaSize);
    EXPECT_NE(result, nullptr);
}

/*
 * 用例描述:
 * UbseCliProcessUrmaQosTable反序列化失败测试
 * 测试步骤:
 * 1. 传入空数据
 * 预期结果:
 * 1. 反序列化失败返回错误信息
 */
TEST_F(TestUbseCliUrmaCmdReg, UbseCliProcessUrmaQosTableDeserFailed)
{
    uint8_t buffer[1] = {0};
    UbseDeSerialization deser(buffer, 0);
    auto result = UbseCliRegUrmaModule::UbseCliProcessUrmaQosTable(deser, 1);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("Deserialization failed"), std::string::npos);
}

/*
 * 用例描述:
 * IsPositiveInteger函数测试
 * 测试步骤:
 * 1. 空字符串
 * 2. 非数字字符
 * 3. 有效数字
 * 预期结果:
 * 1. 空字符串返回false
 * 2. 非数字字符返回false
 * 3. 有效数字返回true
 */
TEST_F(TestUbseCliUrmaCmdReg, IsPositiveIntegerEmpty)
{
    EXPECT_FALSE(UbseCliRegUrmaModule::IsPositiveInteger(""));
}

TEST_F(TestUbseCliUrmaCmdReg, IsPositiveIntegerNonDigit)
{
    EXPECT_FALSE(UbseCliRegUrmaModule::IsPositiveInteger("abc"));
    EXPECT_FALSE(UbseCliRegUrmaModule::IsPositiveInteger("12a"));
}

TEST_F(TestUbseCliUrmaCmdReg, IsPositiveIntegerValid)
{
    EXPECT_TRUE(UbseCliRegUrmaModule::IsPositiveInteger("0"));
    EXPECT_TRUE(UbseCliRegUrmaModule::IsPositiveInteger("123"));
    EXPECT_TRUE(UbseCliRegUrmaModule::IsPositiveInteger("4294967295"));
}

/*
 * 用例描述:
 * ValidateSingleQosParam参数验证测试
 * 测试步骤:
 * 1. 非数字priority
 * 2. 非数字bandwidth
 * 3. priority > 1
 * 4. bandwidth == 0
 * 5. 有效参数
 * 预期结果:
 * 1-4. 返回错误信息
 * 5. 返回nullptr且参数正确解析
 */
TEST_F(TestUbseCliUrmaCmdReg, ValidateSingleQosParamInvalidPri)
{
    uint32_t priority = 0;
    uint32_t bandwidth = 0;
    auto result = UbseCliRegUrmaModule::ValidateSingleQosParam("abc", "100", priority, bandwidth);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("Invalid priority or bandwidth"), std::string::npos);
}

TEST_F(TestUbseCliUrmaCmdReg, ValidateSingleQosParamInvalidCir)
{
    uint32_t priority = 0;
    uint32_t bandwidth = 0;
    auto result = UbseCliRegUrmaModule::ValidateSingleQosParam("0", "abc", priority, bandwidth);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("Invalid priority or bandwidth"), std::string::npos);
}

TEST_F(TestUbseCliUrmaCmdReg, ValidateSingleQosParamPriOutOfRange)
{
    uint32_t priority = 0;
    uint32_t bandwidth = 0;
    auto result = UbseCliRegUrmaModule::ValidateSingleQosParam("2", "100", priority, bandwidth);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("Priority must be 0 or 1"), std::string::npos);
}

TEST_F(TestUbseCliUrmaCmdReg, ValidateSingleQosParamCirZero)
{
    uint32_t priority = 0;
    uint32_t bandwidth = 0;
    auto result = UbseCliRegUrmaModule::ValidateSingleQosParam("0", "0", priority, bandwidth);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("Invalid priority or bandwidth"), std::string::npos);
}

TEST_F(TestUbseCliUrmaCmdReg, ValidateSingleQosParamValid)
{
    uint32_t priority = 0;
    uint32_t bandwidth = 0;
    auto result = UbseCliRegUrmaModule::ValidateSingleQosParam("1", "100", priority, bandwidth);
    EXPECT_EQ(result, nullptr);
    EXPECT_EQ(priority, 1);
    EXPECT_EQ(bandwidth, 100);
}

/*
 * 用例描述:
 * ParseAndValidateQosParams多参数验证测试
 * 测试步骤:
 * 1. 数量不匹配
 * 2. 数量超过2
 * 3. 重复priority
 * 4. 有效参数
 * 预期结果:
 * 1-3. 返回错误信息
 * 4. 返回nullptr
 */
TEST_F(TestUbseCliUrmaCmdReg, ParseAndValidateQosParamsMismatch)
{
    std::vector<uint32_t> priorities;
    std::vector<uint32_t> bandwidths;
    auto result = UbseCliRegUrmaModule::ParseAndValidateQosParams("0,1", "100", priorities, bandwidths);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("--pri and --cir count mismatch"), std::string::npos);
}

TEST_F(TestUbseCliUrmaCmdReg, ParseAndValidateQosParamsCountExceed)
{
    std::vector<uint32_t> priorities;
    std::vector<uint32_t> bandwidths;
    auto result = UbseCliRegUrmaModule::ParseAndValidateQosParams("0,1,2", "100,200,300", priorities, bandwidths);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("QoS config count exceeds limit"), std::string::npos);
}

TEST_F(TestUbseCliUrmaCmdReg, ParseAndValidateQosParamsDuplicatePri)
{
    std::vector<uint32_t> priorities;
    std::vector<uint32_t> bandwidths;
    auto result = UbseCliRegUrmaModule::ParseAndValidateQosParams("0,0", "100,200", priorities, bandwidths);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("Duplicate priorities"), std::string::npos);
}

TEST_F(TestUbseCliUrmaCmdReg, ParseAndValidateQosParamsValid)
{
    std::vector<uint32_t> priorities;
    std::vector<uint32_t> bandwidths;
    auto result = UbseCliRegUrmaModule::ParseAndValidateQosParams("0,1", "100,200", priorities, bandwidths);
    EXPECT_EQ(result, nullptr);
    ASSERT_EQ(priorities.size(), 2);
    EXPECT_EQ(priorities[0], 0);
    EXPECT_EQ(priorities[1], 1);
    ASSERT_EQ(bandwidths.size(), 2);
    EXPECT_EQ(bandwidths[0], 100);
    EXPECT_EQ(bandwidths[1], 200);
}

/*
 * 用例描述:
 * MapQosErrorToMessage错误码映射测试
 * 测试步骤:
 * 1. UBSE_ERROR_NULLPTR
 * 2. UBSE_ERROR_INVAL
 * 3. UBSE_URMACONTRL_ERROR_ACCESS_MTI_FAILED
 * 4. UBSE_URMACONTRL_ERROR_PRIO_GROUP_EXIST
 * 5. UBSE_URMACONTRL_ERROR_ETS_TEMPLATE_NOT_EXISTED
 * 6. 未知错误码
 * 预期结果:
 * 1-5. 返回对应的错误信息
 * 6. 返回通用错误信息
 */
TEST_F(TestUbseCliUrmaCmdReg, MapQosErrorToMessageNullptr)
{
    auto result = UbseCliRegUrmaModule::MapQosErrorToMessage(UBSE_ERROR_NULLPTR);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("QoS template not initialized"), std::string::npos);
}

TEST_F(TestUbseCliUrmaCmdReg, MapQosErrorToMessageInval)
{
    auto result = UbseCliRegUrmaModule::MapQosErrorToMessage(UBSE_ERROR_INVAL);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("Invalid priority or bandwidth"), std::string::npos);
}

TEST_F(TestUbseCliUrmaCmdReg, MapQosErrorToMessageMtiFailed)
{
    auto result = UbseCliRegUrmaModule::MapQosErrorToMessage(UBSE_URMACONTRL_ERROR_ACCESS_MTI_FAILED);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("Failed to access UBM interface"), std::string::npos);
}

TEST_F(TestUbseCliUrmaCmdReg, MapQosErrorToMessagePrioGroupExist)
{
    auto result = UbseCliRegUrmaModule::MapQosErrorToMessage(UBSE_URMACONTRL_ERROR_PRIO_GROUP_EXIST);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("already exists"), std::string::npos);
}

TEST_F(TestUbseCliUrmaCmdReg, MapQosErrorToMessageTemplateNotExisted)
{
    auto result = UbseCliRegUrmaModule::MapQosErrorToMessage(UBSE_URMACONTRL_ERROR_ETS_TEMPLATE_NOT_EXISTED);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("No ETS QoS template exists"), std::string::npos);
}

TEST_F(TestUbseCliUrmaCmdReg, MapQosErrorToMessageUnknown)
{
    auto result = UbseCliRegUrmaModule::MapQosErrorToMessage(9999);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("Internal error with error code 9999"), std::string::npos);
}

/*
 * 用例描述:
 * UbseCreateUrmaQosFunc创建URMA QoS测试
 * 测试步骤:
 * 1. 传入node参数
 * 2. 缺少--pri参数
 * 3. 缺少--cir参数
 * 4. IPC调用成功
 * 5. IPC调用失败
 * 预期结果:
 * 1. 返回CLOS不支持的提示
 * 2-3. 返回缺少必选参数的提示
 * 4. 返回创建成功的提示
 * 5. 返回对应错误码的错误信息
 */
TEST_F(TestUbseCliUrmaCmdReg, UbseCreateUrmaQosFuncNodeParam)
{
    std::map<std::string, std::string> params;
    params["node"] = "1";
    auto result = UbseCliRegUrmaModule::UbseCreateUrmaQosFunc(params);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("not support"), std::string::npos);
}

TEST_F(TestUbseCliUrmaCmdReg, UbseCreateUrmaQosFuncMissingPri)
{
    std::map<std::string, std::string> params;
    params["cir"] = "100";
    auto result = UbseCliRegUrmaModule::UbseCreateUrmaQosFunc(params);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("Both --pri and --cir are required"), std::string::npos);
}

TEST_F(TestUbseCliUrmaCmdReg, UbseCreateUrmaQosFuncMissingCir)
{
    std::map<std::string, std::string> params;
    params["pri"] = "0";
    auto result = UbseCliRegUrmaModule::UbseCreateUrmaQosFunc(params);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("Both --pri and --cir are required"), std::string::npos);
}

TEST_F(TestUbseCliUrmaCmdReg, UbseCreateUrmaQosFuncInvalidParams)
{
    std::map<std::string, std::string> params;
    params["pri"] = "abc";
    params["cir"] = "100";
    auto result = UbseCliRegUrmaModule::UbseCreateUrmaQosFunc(params);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("Invalid priority or bandwidth"), std::string::npos);
}

TEST_F(TestUbseCliUrmaCmdReg, UbseCreateUrmaQosFuncIpcSuccess)
{
    MOCKER(&ubse_invoke_call).stubs().will(returnValue(UBSE_OK));
    std::map<std::string, std::string> params;
    params["pri"] = "0,1";
    params["cir"] = "100,200";
    auto result = UbseCliRegUrmaModule::UbseCreateUrmaQosFunc(params);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("create successfully"), std::string::npos);
    GlobalMockObject::verify();
}

TEST_F(TestUbseCliUrmaCmdReg, UbseCreateUrmaQosFuncIpcFailed)
{
    MOCKER(&ubse_invoke_call).stubs().will(returnValue(UBSE_URMACONTRL_ERROR_PRIO_GROUP_EXIST));
    std::map<std::string, std::string> params;
    params["pri"] = "0";
    params["cir"] = "100";
    auto result = UbseCliRegUrmaModule::UbseCreateUrmaQosFunc(params);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("already exists"), std::string::npos);
    GlobalMockObject::verify();
}

/*
 * 用例描述:
 * UbseDeleteUrmaQosFunc删除URMA QoS测试
 * 测试步骤:
 * 1. 传入node参数
 * 2. IPC调用成功
 * 3. IPC调用失败
 * 预期结果:
 * 1. 返回CLOS不支持的提示
 * 2. 返回删除成功的提示
 * 3. 返回对应错误码的错误信息
 */
TEST_F(TestUbseCliUrmaCmdReg, UbseDeleteUrmaQosFuncNodeParam)
{
    std::map<std::string, std::string> params;
    params["node"] = "1";
    auto result = UbseCliRegUrmaModule::UbseDeleteUrmaQosFunc(params);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("not support"), std::string::npos);
}

TEST_F(TestUbseCliUrmaCmdReg, UbseDeleteUrmaQosFuncIpcSuccess)
{
    MOCKER(&ubse_invoke_call).stubs().will(returnValue(UBSE_OK));
    std::map<std::string, std::string> params;
    auto result = UbseCliRegUrmaModule::UbseDeleteUrmaQosFunc(params);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("delete successfully"), std::string::npos);
    GlobalMockObject::verify();
}

TEST_F(TestUbseCliUrmaCmdReg, UbseDeleteUrmaQosFuncIpcFailed)
{
    MOCKER(&ubse_invoke_call).stubs().will(returnValue(UBSE_ERROR));
    std::map<std::string, std::string> params;
    auto result = UbseCliRegUrmaModule::UbseDeleteUrmaQosFunc(params);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("Internal error with error code"), std::string::npos);
    GlobalMockObject::verify();
}

/*
 * 用例描述:
 * UbseDisplayUrmaQosFunc模板未应用场景测试
 * 测试步骤:
 * 1. IPC调用返回UBSE_URMACONTRL_ERROR_ETS_TEMPLATE_NOT_APPLIED且数据不为空
 * 预期结果:
 * 1. 返回模板存在但未应用的提示
 */
TEST_F(TestUbseCliUrmaCmdReg, UbseDisplayUrmaQosFuncNotApplied)
{
    MOCKER(&ubse_invoke_call).stubs().will(invoke(mock_urma_qos_invoke_call_not_applied));
    std::map<std::string, std::string> params;
    auto result = UbseCliRegUrmaModule::UbseDisplayUrmaQosFunc(params);
    EXPECT_NE(result, nullptr);
    EXPECT_NE(result->UbseCliGetResultStr().find("but apply failed"), std::string::npos);
    GlobalMockObject::verify();
}
} // namespace ubse::ut::cli