* Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. 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_com_base.h"
#include "ubse_com_module.h"
#include "test_ubse_com_mock.h"
#include "ubse_com_base.cpp"
using namespace ubse::com;
namespace ubse::ut::com {
std::string g_msg = "data";
TestBaseMessagePtr g_reqMsgPtr = nullptr;
TestBaseMessagePtr g_respMsgPtr = nullptr;
void TestUbseComBase::SetUp()
{
Test::SetUp();
}
void TestUbseComBase::TearDown()
{
Test::TearDown();
GlobalMockObject::verify();
}
class UbseTestMessage : public UbseBaseMessage {
public:
UbseTestMessage(){};
explicit UbseTestMessage(std::string dataRaw){};
UbseResult Serialize() override
{
return UBSE_OK;
};
UbseResult Deserialize() override
{
return UBSE_OK;
};
std::string data;
};
UbseResult TestComBaseMessage::Serialize()
{
if (SerializeRet == UBSE_OK) {
mOutputRawData = std::make_unique<uint8_t[]>(g_msg.size());
if (auto ret = memcpy_s(mOutputRawData.get(), mOutputRawDataSize, g_msg.data(), mOutputRawDataSize); ret != 0) {
return UBSE_ERROR;
}
return UBSE_OK;
}
return SerializeRet;
}
UbseResult TestComBaseMessage::Deserialize()
{
return DeserializeRet;
}
UbseResult TestUbseComBaseMessage::Handle(const UbseBaseMessage& req, const UbseBaseMessage& rsp)
{
return handRet;
}
uint16_t TestUbseComBaseMessage::GetModuleCode()
{
return 0;
}
uint16_t TestUbseComBaseMessage::GetOpCode()
{
return 0;
}
void TestReply(UbseComMessageCtx& message, const UbseComDataDesc& data, const UbseComCallback& usrCb) {}
uint32_t MockUbsePubEvent(ubse::event::UbseEventModule* eventModule, const std::string& eventId,
std::string& eventMessage)
{
return 0;
}
* 用例描述:
* 回复消息
* 测试步骤:
* 1.reponse为空
* 2.序列化失败
* 3.成功
* 预期结果:
* 1.打印null日志,不抛出异常
* 2.打印序列化失败日志,不抛出异常
* 3.成功,不抛出异常
*/
TEST_F(TestUbseComBase, Reply)
{
UbseComMessageCtx ctx{};
EXPECT_NO_FATAL_FAILURE(Reply(ctx, nullptr));
g_reqMsgPtr.Set(new TestComBaseMessage(UBSE_ERROR, UBSE_OK));
EXPECT_NO_FATAL_FAILURE(Reply(ctx, UbseBaseMessage::Convert<TestComBaseMessage>(g_reqMsgPtr)));
MOCKER(UbseCommunication::UbseComMsgReply).stubs().will(invoke(TestReply));
g_reqMsgPtr.Set(new TestComBaseMessage(UBSE_OK, UBSE_OK));
EXPECT_NO_FATAL_FAILURE(Reply(ctx, UbseBaseMessage::Convert<TestComBaseMessage>(g_reqMsgPtr)));
}
UbseResult TestAsyncCall(const std::string& engineName, UbseComMessageCtx& message, const UbseComCallback& usrCb)
{
return UBSE_OK;
}
TEST_F(TestUbseComBase, TestSetRemoteId)
{
SendParam param("0", 1, 1);
EXPECT_EQ("0", param.GetRemoteId());
param.SetRemoteId("1");
EXPECT_EQ("1", param.GetRemoteId());
}
* 用例描述:
* 测试设置发送参数
* 测试步骤:
* 1.设置操作符
* 2.设置模块Id
* 3.设置通道类型
* 预期结果:
* 1.不抛出异常
* 2.不抛出异常
* 3.不抛出异常
*/
TEST_F(TestUbseComBase, TestComSet)
{
SendParam sendParam("test", 1, 1);
uint16_t testCode = 1;
UbseChannelType testType = UbseChannelType::NORMAL;
EXPECT_NO_THROW(sendParam.SetOpCode(testCode));
EXPECT_NO_THROW(sendParam.SetModuleCode(testCode));
EXPECT_NO_THROW(sendParam.SetChannelType(testType));
}
* 用例描述:
* 添加空句柄失败
* 测试步骤:
* 1.添加空句柄
* 预期结果:
* 1.不抛出异常
* 2.返回空句柄
*/
TEST_F(TestUbseComBase, TestAddHandlerFailed)
{
uint16_t testCode = 0;
UbseComBaseMessageHandlerManager handlerManager;
handlerManager.AddHandler(nullptr, MASTER_RPC_SERVER_NAME);
EXPECT_EQ((UbseComBaseMessageHandlerPtr) nullptr,
handlerManager.GetHandler(testCode, testCode, MASTER_RPC_SERVER_NAME));
}
* 用例描述:
* 移除句柄、获取句柄失败
* 测试步骤:
* 1.移除不存在的句柄
* 2.获取不存在的句柄
* 预期结果:
* 1.不抛出异常
* 2.返回空句柄
*/
TEST_F(TestUbseComBase, TestRemoveGetHandlerFailed)
{
uint16_t testCode = 1;
UbseComBaseMessageHandlerManager handlerManager;
EXPECT_NO_THROW(handlerManager.RemoveHandler(testCode, testCode, MASTER_RPC_SERVER_NAME));
EXPECT_EQ((UbseComBaseMessageHandlerPtr) nullptr,
handlerManager.GetHandler(testCode, testCode, MASTER_RPC_SERVER_NAME));
}
* 用例描述:
* 移除句柄、获取句柄成功
* 测试步骤:
* 1.获取新添加的句柄
* 2.移除新添加的句柄
* 3.获取已移除的句柄
* 预期结果:
* 1.返回句柄
* 2.不抛出异常
* 3.返回空句柄
*/
TEST_F(TestUbseComBase, TestRemoveGetHandlerSuccess)
{
uint16_t testCode = 0;
UbseComBaseMessageHandlerManager handlerManager;
UbseComBaseMessageHandlerPtr handlerPtr = new TestUbseComBaseMessage(testCode);
handlerManager.AddHandler(handlerPtr, MASTER_RPC_SERVER_NAME);
EXPECT_NE((UbseComBaseMessageHandlerPtr) nullptr,
handlerManager.GetHandler(testCode, testCode, MASTER_RPC_SERVER_NAME));
EXPECT_NO_THROW(handlerManager.RemoveHandler(testCode, testCode, MASTER_RPC_SERVER_NAME));
EXPECT_EQ((UbseComBaseMessageHandlerPtr) nullptr,
handlerManager.GetHandler(testCode, testCode, MASTER_RPC_SERVER_NAME));
}
* 用例描述:
* 测试打印日志等级
* 测试步骤:
* 1.日志等级为DEBUG
* 2.日志等级为INFO
* 3.日志等级为WARN
* 4.日志等级为ERROR
* 预期结果:
* 1.不抛出异常
* 2.不抛出异常
* 3.不抛出异常
* 4.不抛出异常
*/
TEST_F(TestUbseComBase, TestLog)
{
EXPECT_NO_THROW(Log(static_cast<uint32_t>(UbseComLogLevel::DEBUG), nullptr));
EXPECT_NO_THROW(Log(static_cast<uint32_t>(UbseComLogLevel::INFO), nullptr));
EXPECT_NO_THROW(Log(static_cast<uint32_t>(UbseComLogLevel::WARN), nullptr));
EXPECT_NO_THROW(Log(static_cast<uint32_t>(UbseComLogLevel::ERROR), nullptr));
}
* 用例描述:
* 获取channel类型失败
* 测试步骤:
* 1.channel指针设为空
* 2.调用接口获取channel类型
* 预期结果:
* 1.返回NoChannel
*/
TEST_F(TestUbseComBase, TestGetChannelTypeFailed)
{
UBSHcomChannelPtr chPtr = nullptr;
std::string type = GetChannelType(chPtr);
EXPECT_EQ("NoChannel", type);
}
* 用例描述:
* 获取channel类型成功
* 测试步骤:
* 1.创建一个channel
* 2.调用接口获取channel类型
* 预期结果:
* 1.返回Normal
*/
TEST_F(TestUbseComBase, TestGetChannelTypeSuccess)
{
UBSHcomChannelPtr chPtr = new TestChannel();
std::string type = GetChannelType(chPtr);
EXPECT_EQ("Normal", type);
}
* 用例描述:
* 测试获取链接信息
* 测试步骤:
* 1.获取全部链接个数
* 预期结果:
* 1.链接个数为0
*/
TEST_F(TestUbseComBase, TestGetLinkInfoFromMapNull)
{
std::string testName;
MockUbseComBase mockUbseComBase(testName, testName);
std::vector<UbseLinkInfo> result = mockUbseComBase.GetAllLinkInfo();
EXPECT_EQ(0, result.size());
}
* 用例描述:
* 测试获取链接信息
* 测试步骤:
* 1.添加LINK_UP和LINK_DOWN信息
* 2.获取全部链接个数
* 预期结果:
* 1.链接个数为2
*/
TEST_F(TestUbseComBase, TestGetLinkInfoFromMap)
{
std::string testName = "TestGetLinkInfoFromMap";
MockUbseComBase mockUbseComBase(testName, testName);
UbseComEngineInfo engineInfo;
engineInfo.name_ = "TestGetLinkInfoFromMap";
std::string curNodeId1 = "1";
std::string curNodeId2 = "2";
UBSHcomChannelPtr ch;
mockUbseComBase.LinkNotify(engineInfo, curNodeId1, ch, UbseLinkState::LINK_UP);
mockUbseComBase.LinkNotify(engineInfo, curNodeId2, ch, UbseLinkState::LINK_DOWN);
std::vector<UbseLinkInfo> result = mockUbseComBase.GetAllLinkInfo();
EXPECT_EQ(2, result.size());
}
* 用例描述:
* 测试获取链接信息
* 测试步骤:
* 1.获取全部链接个数
* 预期结果:
* 1.链接个数为0
*/
TEST_F(TestUbseComBase, TestQueryLinkInfoNull)
{
std::string testName;
MockUbseComBase mockUbseComBase(testName, testName);
std::string engineName = "rpc";
std::string changeNodeId = "1";
UBSHcomChannelPtr ch;
std::vector<UbseLinkInfo> result = mockUbseComBase.QueryLinkInfo(engineName, changeNodeId, ch);
EXPECT_EQ(0, result.size());
}
* 用例描述:
* 测试获取链接信息
* 测试步骤:
* 1.添加LINK_UP信息
* 2.获取全部链接个数
* 3.添加LINK_DOWN信息
* 4.获取全部链接个数
* 预期结果:
* 1.链接个数为1
* 2.链接个数为1
*/
TEST_F(TestUbseComBase, TestQueryLinkInfo)
{
std::string testName = "TestQueryLinkInfo";
MockUbseComBase mockUbseComBase(testName, testName);
UbseComEngineInfo engineInfo;
engineInfo.name_ = "TestQueryLinkInfo";
std::string curNodeId = "1";
UBSHcomChannelPtr ch;
std::string engineName = "TestQueryLinkInfo";
std::string changeNodeId = "1";
mockUbseComBase.LinkNotify(engineInfo, curNodeId, ch, UbseLinkState::LINK_UP);
std::vector<UbseLinkInfo> result = mockUbseComBase.QueryLinkInfo(engineName, changeNodeId, ch);
EXPECT_EQ(1, result.size());
mockUbseComBase.LinkNotify(engineInfo, curNodeId, ch, UbseLinkState::LINK_DOWN);
result = mockUbseComBase.QueryLinkInfo(engineName, changeNodeId, ch);
EXPECT_EQ(1, result.size());
}
TEST_F(TestUbseComBase, TestCheckSdkEventAndNotify)
{
std::string testName = "TestCheckSdkEventAndNotify";
MockUbseComBase mockUbseComBase(testName, testName);
std::string curNodeId = FAKE_CUR_NODE_ID + "_";
UBSHcomChannelPtr ch = new TestChannel();
EXPECT_NO_THROW(mockUbseComBase.CheckSdkEventAndNotify(testName, curNodeId, ch, UbseLinkState::LINK_DOWN));
}
* 用例描述:
* 测试链接通知
* 测试步骤:
* 1.链接状态为UP
* 2.链接状态为DOWN
* 3.链接状态为UNKNOWN
* 预期结果:
* 1.不抛出异常
* 2.不抛出异常
* 3.不抛出异常
*/
TEST_F(TestUbseComBase, TestLinkNotify)
{
std::string testName = "TestLinkNotify";
UbseComEngineInfo info;
info.name_ = testName;
std::string curNodeId = "1";
UbseLinkState state1 = UbseLinkState::LINK_UP;
UbseLinkState state2 = UbseLinkState::LINK_DOWN;
UbseLinkState state3 = UbseLinkState::LINK_STATE_UNKNOWN;
MockUbseComBase mockUbseComBase(testName, testName);
UBSHcomChannelPtr ch;
LinkNotifyFunction func = [](const std::vector<UbseLinkInfo>& linkInfoList) {
};
mockUbseComBase.AddLinkNotifyFunc(func);
mockUbseComBase.gLinkEventHandler_ = [](const std::vector<UbseLinkInfo>& linkInfoList) {
};
EXPECT_NO_THROW(mockUbseComBase.LinkNotify(info, curNodeId, ch, UbseLinkState::LINK_UP));
EXPECT_NO_THROW(mockUbseComBase.LinkNotify(info, curNodeId, ch, UbseLinkState::LINK_DOWN));
EXPECT_NO_THROW(mockUbseComBase.LinkNotify(info, curNodeId, ch, UbseLinkState::LINK_STATE_UNKNOWN));
}
TEST_F(TestUbseComBase, TestReplyCallback)
{
EXPECT_NO_THROW(ReplyCallback(nullptr, nullptr, 0, UBSE_ERROR));
}
TEST_F(TestUbseComBase, TestReplyMsg)
{
std::string testName = "test";
MockUbseComBase mockUbseComBase(testName, testName);
MOCKER(&UbseCommunication::UbseComMsgReply).stubs();
UbseComMessageCtx message;
UbseComDataDesc response;
EXPECT_EQ(UBSE_OK, mockUbseComBase.ReplyMsg(message, response));
}
* 用例描述:
* 测试Reply
* 测试步骤:
* 1.response的data设为空
* 2.调用Reply回复
* 3.response的data设为非空
* 4.调用Reply回复
* 预期结果:
* 1.不抛出异常
* 2.不抛出异常
*/
TEST_F(TestUbseComBase, TestReply)
{
std::string testName = "test";
MockUbseComBase mockUbseComBase(testName, testName);
uintptr_t rspCtx;
uint64_t channelId;
std::string dstId;
UbseComMessageCtx msgCtx(testName, rspCtx, channelId, dstId);
UbseBaseMessagePtr response = new (std::nothrow) UbseTestMessage();
EXPECT_NO_THROW(Reply(msgCtx, response));
response->mOutputRawData = std::make_unique<uint8_t[]>({1});
response->mOutputRawDataSize = 1;
EXPECT_NO_THROW(Reply(msgCtx, response));
}
* 用例描述:
* 测试获取channel类型
* 测试步骤:
* 1.初始化ubseLinkInfo的channel类型为Heartbeat
* 2.调用GetChType获取channel类型
* 预期结果:
* 1.获取到的channel类型为Heartbeat
*/
TEST_F(TestUbseComBase, TestGetChType)
{
std::string nodeId = "1";
std::string chType = "Heartbeat";
UbseLinkInfo ubseLinkInfo(nodeId, UbseLinkState::LINK_UP, 1, chType);
EXPECT_EQ(chType, ubseLinkInfo.GetChType());
}
* 用例描述:
* 测试注册RPC的handler执行器
* 测试步骤:
* 1.调用SetHandlerExecutor进行注册
* 预期结果:
* 1.无异常
*/
TEST_F(TestUbseComBase, TestSetHandlerExecutor)
{
std::string testName = "test";
MockUbseComBase mockUbseComBase(testName, testName);
HandlerExecutor handlerExecutor;
EXPECT_NO_THROW(mockUbseComBase.SetHandlerExecutor(handlerExecutor));
}
* 用例描述:
* 测试注册链接up down事件函数
* 测试步骤:
* 1.调用SetLinkEventHandler进行注册
* 预期结果:
* 1.无异常
*/
TEST_F(TestUbseComBase, TestSetLinkEventHandler)
{
std::string testName = "test";
MockUbseComBase mockUbseComBase(testName, testName);
LinkEventHandler handler;
EXPECT_NO_THROW(mockUbseComBase.SetLinkEventHandler(handler));
}
* 用例描述:
* 获取句柄信息
* 测试步骤:
* 1.获取引擎名称
* 2.获取通道Id
* 3.获取回复上下文
* 4.测试设置uds
* 5.获取uds信息
* 预期结果:
* 1.返回引擎名称
* 2.返回通道Id
* 3.返回回复上下文
* 4.不抛出异常
* 5.获取uds信息
*/
TEST_F(TestUbseComBase, TestGetHandlerInfo)
{
std::string testStr = "test";
uint16_t testNum = 0;
UbseComBaseMessageHandlerCtx ubseCtx(testStr, testNum, testNum, "");
EXPECT_EQ(testStr, ubseCtx.GetEngineName());
EXPECT_EQ(testNum, ubseCtx.GetChannelId());
EXPECT_EQ(testNum, ubseCtx.GetResponseCtx());
UbseUdsIdInfo uds{};
uds.pid = testNum;
EXPECT_NO_THROW(ubseCtx.SetUdsIdInfo(uds));
EXPECT_EQ(testNum, ubseCtx.GetUdsIdInfo().pid);
ubseCtx.SetCrc(NO_1);
EXPECT_EQ(NO_1, ubseCtx.GetCrc());
}
* 用例描述:
* 获取链接信息
* 测试步骤:
* 1.获取链接节点id
* 2.获取链接状态
* 预期结果:
* 1.返回链接节点id
* 2.返回链接状态
*/
TEST_F(TestUbseComBase, TestGetUbseLinkInfo)
{
std::string testStr = "test";
UbseLinkInfo ubseLink(testStr, UbseLinkState::LINK_UP);
EXPECT_EQ(testStr, ubseLink.GetNodeId());
EXPECT_EQ(UbseLinkState::LINK_UP, ubseLink.GetState());
}
* 用例描述:
* 设置和获取链接信息中的时间戳
* 测试步骤:
* 1.设置时间戳
* 2.获取时间戳
* 预期结果:
* 1.设置时间戳无异常
* 2.获取时间戳成功
*/
TEST_F(TestUbseComBase, TestSetGetTimeStamp)
{
std::string testStr = "test";
UbseLinkInfo ubseLink(testStr, UbseLinkState::LINK_UP);
EXPECT_NO_THROW(ubseLink.SetTimeStamp(1));
EXPECT_EQ(1, ubseLink.GetTimeStamp());
}
* 用例描述:
* 执行RPC默认handler执行器
* 测试步骤:
* 1.调用DefaultHandlerExecutor执行
* 预期结果:
* 1.无异常
*/
TEST_F(TestUbseComBase, TestDefaultHandlerExecutor)
{
std::function<void()> task = []() {
};
EXPECT_NO_THROW(DefaultHandlerExecutor(task, executorType::COM));
}
* 用例描述:
* 执行IPC默认handler执行器
* 测试步骤:
* 1.调用DefaultSdkLinkDownEventHandler执行
* 预期结果:
* 1.无异常
*/
TEST_F(TestUbseComBase, TestDefaultSdkLinkDownEventHandler)
{
UBSHcomNetUdsIdInfo idInfo;
UbseLinkState state = UbseLinkState::LINK_UP;
EXPECT_NO_THROW(DefaultSdkLinkDownEventHandler(idInfo, state));
}
* 用例描述:
* 设置和获取同步调用、心跳超时时间
* 测试步骤:
* 1.调用SetTimeOut设置超时时间
* 2.调用GetTimeOut获取同步调用超时时间
* 3.调用GetHeartBeatTimeOut获取心跳超时时间
* 预期结果:
* 1.无异常
* 2.同步调用超时时间为1
* 3.心跳超时时间为1
*/
TEST_F(TestUbseComBase, TestSetGetTimeOut)
{
std::string testName = "test";
MockUbseComBase mockUbseComBase(testName, testName);
EXPECT_NO_THROW(mockUbseComBase.SetTimeOut(1, 1));
EXPECT_EQ(1, mockUbseComBase.GetTimeOut());
EXPECT_EQ(1, mockUbseComBase.GetHeartBeatTimeOut());
}
* 用例描述:
* 设置和获取查询节点eid回调函数
* 测试步骤:
* 1.调用SetQueryEidByNodeIdCb设置回调函数cb1
* 2.调用GetQueryEidByNodeIdCb获取回调函数cb2
* 3.调用回调函数cb1和cb2观察结果是否一致
* 预期结果:
* 1.无异常
* 2.结果一致
*/
TEST_F(TestUbseComBase, TestSetGetQueryEidByNodeIdCb)
{
std::string testName = "test";
MockUbseComBase mockUbseComBase(testName, testName);
QueryEidByNodeIdCb cb1 = [](std::string nodeId, std::string& eid) {
if (nodeId == "TestSetGetQueryEidByNodeIdCb") {
return true;
} else {
return false;
}
};
EXPECT_NO_THROW(mockUbseComBase.SetQueryEidByNodeIdCb(cb1));
std::string nodeId = "TestSetGetQueryEidByNodeIdCb";
QueryEidByNodeIdCb cb2 = mockUbseComBase.GetQueryEidByNodeIdCb();
std::string eid;
EXPECT_EQ(cb1(nodeId, eid), cb2(nodeId, eid));
}
* 用例描述:
* 测试序列化
* 测试步骤:
* 1.对数据序列化
* 2.对非空数据反序列化
* 预期结果:
* 1.返回UBSE_OK
* 2.返回UBSE_OK
*/
TEST_F(TestUbseComBase, TestBufferSerialize)
{
uint16_t testNum = 0;
uint16_t testLen = 3;
uint16_t* data = new uint16_t[testLen];
UbseComBaseBufferMessage ubseBMNull(nullptr, testNum);
UbseComBaseBufferMessage ubseBM(reinterpret_cast<uint8_t*>(data), testLen);
EXPECT_EQ(UBSE_OK, ubseBMNull.Serialize());
EXPECT_EQ(UBSE_OK, ubseBM.Serialize());
SafeDeleteArray(data);
}
* 用例描述:
* 测试反序列化
* 测试步骤:
* 1.对数据反序列化
* 预期结果:
* 1.返回UBSE_OK
*/
TEST_F(TestUbseComBase, TestBufferDeserialize)
{
uint16_t testLen = 3;
auto* data = new uint8_t[testLen];
UbseComBaseBufferMessage ubseBM(data, testLen);
ubseBM.SetInputRawData(data, testLen);
EXPECT_EQ(UBSE_OK, ubseBM.Deserialize());
SafeDeleteArray(data);
}
}