* 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_mem_controller_common.h"
#include <ubse_com_module.h>
#include <ubse_error.h>
#include <string>
#include "ubse_election.h"
#include "ubse_init_ledger_state.h"
#include "ubse_mem_account.h"
#include "ubse_mem_controller.h"
#include "ubse_mem_controller_api_common.h"
#include "ubse_mem_controller_helper.h"
#include "ubse_mmi_def.h"
#include "message/ubse_mem_operation_resp_simpo.h"
namespace ubse::mem_controller::ut {
using namespace mem::controller;
using namespace ubse::adapter_plugins::mmi;
using namespace ubse::mem::decoder::utils;
using namespace ubse::election;
static constexpr uint32_t UBSE_MAX_USR_INFO_LEN = 32;
const std::string TEST_NODE_ID = "1";
void BuildOperationMockSet()
{
std::shared_ptr<com::UbseComModule> module = std::make_shared<com::UbseComModule>();
MOCKER_CPP(&context::UbseContext::GetModule<com::UbseComModule>).stubs().will(returnValue(module));
const auto func =
&com::UbseComModule::RpcSend<mem::controller::message::UbseMemOperationRespSimpoPtr, UbseBaseMessagePtr>;
MOCKER_CPP(func).stubs().will(returnValue(UBSE_OK));
}
void TestUbseMemControllerCommonHelper::SetUp()
{
Test::SetUp();
UbseInitLedgerState::GetInstance().SetInitLedgerDone(TEST_NODE_ID, false);
}
void TestUbseMemControllerCommonHelper::TearDown()
{
UbseInitLedgerState::GetInstance().SetInitLedgerDone(TEST_NODE_ID, false);
Test::TearDown();
GlobalMockObject::verify();
}
TEST_F(TestUbseMemControllerCommonHelper, SendParamSwitcherTest)
{
UbseMemOperationResp resp;
auto errorCode = UBSE_OK;
MOCKER_CPP(&IsSdkRequest).stubs().will(returnValue(true));
UbseRoleInfo currentNode;
currentNode.nodeRole = election::ELECTION_ROLE_MASTER;
MOCKER_CPP(&UbseGetCurrentNodeInfo).stubs().with(outBound(currentNode)).will(returnValue(UBSE_OK));
BuildOperationMockSet();
EXPECT_EQ(UBSE_OK, BuildOperationRespWhenSuccess(resp, errorCode, MemOperationType::SHARED_BORROW));
EXPECT_EQ(UBSE_OK, BuildOperationRespWhenSuccess(resp, errorCode, MemOperationType::SHARED_ATTACH));
EXPECT_EQ(UBSE_OK, BuildOperationRespWhenSuccess(resp, errorCode, MemOperationType::SHARED_DETACH));
EXPECT_EQ(UBSE_OK, BuildOperationRespWhenSuccess(resp, errorCode, MemOperationType::FD_BORROW));
EXPECT_EQ(UBSE_OK, BuildOperationRespWhenSuccess(resp, errorCode, MemOperationType::SHARED_RETURN));
EXPECT_EQ(UBSE_OK, BuildOperationRespWhenSuccess(resp, errorCode, MemOperationType::NUMA_BORROW));
EXPECT_EQ(UBSE_OK, BuildOperationRespWhenSuccess(resp, errorCode, MemOperationType::NUMA_RETURN));
EXPECT_EQ(UBSE_OK, BuildOperationRespWhenSuccess(resp, errorCode, MemOperationType::FD_RETURN));
EXPECT_EQ(UBSE_OK, BuildOperationRespWhenSuccess(resp, errorCode, MemOperationType::COMMON_RETURN));
EXPECT_EQ(UBSE_OK, BuildOperationRespWhenSuccess(resp, errorCode, MemOperationType::COMMON_RETURN));
}
TEST_F(TestUbseMemControllerCommonHelper, InitializeResponseTest)
{
UbseMemReturnReq req;
UbseMemOperationResp resp;
InitializeResponse(req, resp);
EXPECT_EQ(req.name, resp.name);
EXPECT_EQ(req.requestNodeId, resp.requestNodeId);
EXPECT_EQ(req.requestId, resp.requestId);
}
TEST_F(TestUbseMemControllerCommonHelper, ImportToAddDecoderEntryTest)
{
std::pair<uint32_t, uint32_t> chipDiePair;
UbseMemNumaBorrowImportObj importObj;
UbseMemObmmInfo ubseMemObmmInfo;
ubseMemObmmInfo.memId = 1;
importObj.exportObmmInfo.push_back(ubseMemObmmInfo);
ImportDecoderParam importParam;
chipDiePair = std::make_pair(0x1234, 0x5678);
importParam = {.importType = 0x01,
.decoderIdx = 0x02,
.portSet = 0x12345678,
.flag = 0x87654321,
.handle = 0xABCDEF0123456789};
auto res = ImportToAddDecoderEntry(chipDiePair, importObj.exportObmmInfo, importParam, importObj.status);
EXPECT_EQ(UBSE_ERROR, res);
}
TEST_F(TestUbseMemControllerCommonHelper, ImportToAddDecoderEntryNotPreOnlineTest)
{
std::pair<uint32_t, uint32_t> chipDiePair;
UbseMemNumaBorrowImportObj importObj;
UbseMemObmmInfo ubseMemObmmInfo;
ubseMemObmmInfo.memId = 1;
importObj.exportObmmInfo.push_back(ubseMemObmmInfo);
ImportDecoderParam importParam;
chipDiePair = std::make_pair(0x1234, 0x5678);
importParam = {.importType = 0x01,
.decoderIdx = 0x02,
.portSet = 0x12345678,
.flag = 0x87654321,
.handle = 0xABCDEF0123456789};
auto res = ImportToAddDecoderEntry(chipDiePair, importObj.exportObmmInfo, importParam, importObj.status);
EXPECT_EQ(UBSE_ERROR, res);
}
TEST_F(TestUbseMemControllerCommonHelper, UnImportToAddDecoderEntryTest)
{
std::pair<uint32_t, uint32_t> chipDiePair;
UbseMemNumaBorrowImportObj importObj;
UbseMemObmmInfo ubseMemObmmInfo;
ubseMemObmmInfo.memId = 1;
importObj.exportObmmInfo.push_back(ubseMemObmmInfo);
UbseMamiMemImportResult importResult;
importResult.marId = 0;
importObj.status.decoderResult.push_back(importResult);
UnimportToDelDecoderEntry(chipDiePair, importObj.status, 0);
EXPECT_EQ(0, importObj.status.importResults.size());
}
TEST_F(TestUbseMemControllerCommonHelper, UbseMemCreateWithLenderReqIsValidTest)
{
UbseMemBorrower borrower = {"node1"};
std::string name = "valid_name";
uint64_t size = 4 * 1024 * 1024;
UbseMemNumaLender lender{.slotId = 1, .socketId = 1, .numaId = 0, .size = size};
std::vector<UbseMemNumaLender> lenders;
lenders.push_back(lender);
{
EXPECT_EQ(UBSE_OK, UbseMemCreateWithLenderReqIsValid(name, borrower, lenders));
}
{
std::string invalidName = "invalid_name!";
EXPECT_EQ(UBSE_ERR_INVALID_ARG, UbseMemCreateWithLenderReqIsValid(invalidName, borrower, lenders));
}
{
UbseMemBorrower emptyBorrower = {""};
EXPECT_EQ(UBSE_ERR_INVALID_ARG, UbseMemCreateWithLenderReqIsValid(name, emptyBorrower, lenders));
}
{
std::vector<UbseMemNumaLender> emptyLenders;
EXPECT_EQ(UBSE_ERR_INVALID_ARG, UbseMemCreateWithLenderReqIsValid(name, borrower, emptyLenders));
}
{
std::vector<UbseMemNumaLender> tooManyLenders(5, {.slotId = 1, .socketId = 1, .numaId = 0, .size = size});
EXPECT_EQ(UBSE_ERR_INVALID_ARG, UbseMemCreateWithLenderReqIsValid(name, borrower, tooManyLenders));
}
{
std::vector<UbseMemNumaLender> smallLender{{.slotId = 1, .socketId = 1, .numaId = 0, .size = 0}};
EXPECT_EQ(UBSE_ERR_INVALID_ARG, UbseMemCreateWithLenderReqIsValid(name, borrower, smallLender));
}
}
TEST_F(TestUbseMemControllerCommonHelper, ConvertUbseMemNumaCreateWithLenderReqTest)
{
std::string name = "test_numa";
uint64_t size = 4 * 1024 * 1024;
;
UbseMemBorrower borrower = {"1", 0, 0, name};
std::vector<UbseMemNumaLender> lenders = {{0, 1, 0, size}, {1, 2, 1, size}};
uint8_t usrInfo[UBSE_MAX_USR_INFO_LEN] = {0};
UbseRoleInfo currentRoleInfo;
currentRoleInfo.nodeId = "1";
MOCKER_CPP(&UbseGetCurrentNodeInfo).stubs().with(outBound(currentRoleInfo)).will(returnValue(UBSE_OK));
UbseMemNumaBorrowReq numaBorrowReq;
auto ret = ConvertUbseMemNumaCreateWithLenderReq(name, borrower, lenders, usrInfo, numaBorrowReq);
EXPECT_EQ(ret, UBSE_OK);
EXPECT_EQ(numaBorrowReq.name, name);
EXPECT_EQ(numaBorrowReq.requestNodeId, currentRoleInfo.nodeId);
EXPECT_EQ(numaBorrowReq.importNodeId, borrower.nodeId);
EXPECT_EQ(numaBorrowReq.srcSocket, borrower.affinitySocketId);
EXPECT_EQ(numaBorrowReq.udsInfo.uid, borrower.uid);
EXPECT_EQ(numaBorrowReq.udsInfo.username, borrower.username);
EXPECT_EQ(numaBorrowReq.size, lenders.size() * size);
EXPECT_EQ(numaBorrowReq.lenderLocs.size(), lenders.size());
EXPECT_EQ(numaBorrowReq.lenderSizes.size(), lenders.size());
for (size_t i = 0; i < lenders.size(); ++i) {
EXPECT_EQ(numaBorrowReq.lenderLocs[i].nodeId, std::to_string(lenders[i].slotId));
EXPECT_EQ(numaBorrowReq.lenderLocs[i].numaId, static_cast<uint32_t>(lenders[i].numaId));
EXPECT_EQ(numaBorrowReq.lenderSizes[i], lenders[i].size);
}
EXPECT_EQ(memcmp(numaBorrowReq.usrInfo, usrInfo, UBSE_MAX_USR_INFO_LEN), 0);
}
TEST_F(TestUbseMemControllerCommonHelper, UbseMemCreateReqIsValidTest)
{
std::string validName = "valid_name";
std::string invalidName = "!invalid@name";
std::string emptyNodeId = "";
std::string validNodeId = "1";
const size_t minMemSize = 4 * 1024 * 1024;
{
UbseMemBorrower borrower{validNodeId};
UbseMemNumaCreateOpt opt{minMemSize};
ASSERT_EQ(UbseMemCreateReqIsValid(validName, borrower, opt), UBSE_OK);
}
{
UbseMemBorrower borrower{validNodeId};
UbseMemNumaCreateOpt opt{minMemSize};
ASSERT_EQ(UbseMemCreateReqIsValid(invalidName, borrower, opt), UBSE_ERR_INVALID_ARG);
}
{
UbseMemBorrower borrower{emptyNodeId};
UbseMemNumaCreateOpt opt{minMemSize};
ASSERT_EQ(UbseMemCreateReqIsValid(validName, borrower, opt), UBSE_ERR_INVALID_ARG);
}
{
UbseMemBorrower borrower{validNodeId};
UbseMemNumaCreateOpt opt{minMemSize - 1};
ASSERT_EQ(UbseMemCreateReqIsValid(validName, borrower, opt), UBSE_ERR_INVALID_ARG);
}
}
TEST_F(TestUbseMemControllerCommonHelper, ConvertUbseMemNumaCreateReqTest)
{
std::string validName = "test_numa";
std::string longName(100, 'a');
uint64_t validSize = 4 * 1024 * 1024;
uint64_t invalidSize = 0;
UbseMemBorrower validBorrower;
validBorrower.nodeId = "1";
validBorrower.affinitySocketId = 0;
validBorrower.uid = 1000;
validBorrower.username = "test_user";
UbseMemBorrower invalidBorrower;
invalidBorrower.nodeId = "";
UbseMemNumaCreateOpt validOpt;
validOpt.size = validSize;
validOpt.highWatermark = 80;
for (auto& byte : validOpt.usrInfo) {
byte = 'A';
}
UbseMemNumaCreateOpt invalidOpt;
invalidOpt.size = invalidSize;
UbseRoleInfo currentRoleInfo;
currentRoleInfo.nodeId = "1";
MOCKER_CPP(&UbseGetCurrentNodeInfo).stubs().with(outBound(currentRoleInfo)).will(returnValue(UBSE_OK));
{
UbseMemNumaBorrowReq req;
EXPECT_EQ(ConvertUbseMemNumaCreateReq(validName, validBorrower, validOpt, req), UBSE_OK);
EXPECT_EQ(req.name, validName);
EXPECT_EQ(req.importNodeId, validBorrower.nodeId);
EXPECT_EQ(req.size, validOpt.size);
EXPECT_EQ(memcmp(req.usrInfo, validOpt.usrInfo, UBSE_MAX_USR_INFO_LEN), 0);
EXPECT_EQ(req.requestNodeId, currentRoleInfo.nodeId);
EXPECT_EQ(req.srcSocket, validBorrower.affinitySocketId);
EXPECT_EQ(req.udsInfo.uid, validBorrower.uid);
EXPECT_EQ(req.udsInfo.username, validBorrower.username);
EXPECT_EQ(req.distance, static_cast<ubse::adapter_plugins::mmi::UbseMemDistance>(validOpt.distance));
EXPECT_EQ(req.highWatermark, validOpt.highWatermark);
}
{
MOCKER_CPP(&memcpy_s).stubs().will(returnValue(1));
UbseMemNumaBorrowReq req;
EXPECT_EQ(ConvertUbseMemNumaCreateReq(validName, validBorrower, validOpt, req), UBSE_ERR_INVALID_ARG);
}
}
TEST_F(TestUbseMemControllerCommonHelper, UbseMemCreateWithCandidateReqIsValid)
{
const std::string validName = "valid_name";
const std::string invalidName = "!invalid@name";
const std::string validNodeId = "1";
const size_t minMemSize = 4 * 1024 * 1024;
const std::vector<std::string> validSlotIds = {"1", "2", "3"};
const std::vector<uint32_t> emptySlotIds = {};
UbseMemNumaCandidateOpt validOpt;
validOpt.slotIds = validSlotIds;
validOpt.size = minMemSize;
UbseMemBorrower validBorrower{validNodeId};
{
ASSERT_EQ(UbseMemCreateWithCandidateReqIsValid(validName, validBorrower, validOpt), UBSE_OK);
}
{
ASSERT_EQ(UbseMemCreateWithCandidateReqIsValid(invalidName, validBorrower, validOpt), UBSE_ERR_INVALID_ARG);
}
{
UbseMemBorrower borrower;
ASSERT_EQ(UbseMemCreateWithCandidateReqIsValid(validName, borrower, validOpt), UBSE_ERR_INVALID_ARG);
}
{
UbseMemNumaCandidateOpt opt;
opt.size = minMemSize - 1;
opt.slotIds = validSlotIds;
ASSERT_EQ(UbseMemCreateWithCandidateReqIsValid(validName, validBorrower, opt), UBSE_ERR_INVALID_ARG);
}
{
UbseMemNumaCandidateOpt opt;
opt.size = minMemSize;
ASSERT_EQ(UbseMemCreateWithCandidateReqIsValid(validName, validBorrower, opt), UBSE_ERR_INVALID_ARG);
}
{
UbseMemBorrower borrower;
UbseMemNumaCandidateOpt opt;
opt.size = minMemSize - 1;
ASSERT_EQ(UbseMemCreateWithCandidateReqIsValid(invalidName, borrower, opt), UBSE_ERR_INVALID_ARG);
}
}
TEST_F(TestUbseMemControllerCommonHelper, ConvertUbseMemNumaCreateWithCandidateReq)
{
std::string name = "test_numa";
uint64_t size = 4 * 1024 * 1024;
UbseMemBorrower borrower = {"1", 0, 0, "test_user"};
std::vector<std::string> slotIds = {"1", "2", "3"};
uint8_t usrInfo[UBSE_MAX_USR_INFO_LEN] = {0};
for (size_t i = 0; i < UBSE_MAX_USR_INFO_LEN; ++i) {
usrInfo[i] = 'A';
}
UbseRoleInfo currentRoleInfo;
currentRoleInfo.nodeId = "1";
MOCKER_CPP(&UbseGetCurrentNodeInfo).stubs().with(outBound(currentRoleInfo)).will(returnValue(UBSE_OK));
UbseMemNumaCandidateOpt opt;
opt.size = size;
opt.highWatermark = 80;
opt.slotIds = slotIds;
for (size_t i = 0; i < UBSE_MAX_USR_INFO_LEN; ++i) {
opt.usrInfo[i] = usrInfo[i];
}
UbseMemNumaBorrowReq numaBorrowReq;
auto ret = ConvertUbseMemNumaCreateWithCandidateReq(name, borrower, opt, numaBorrowReq);
EXPECT_EQ(ret, UBSE_OK);
EXPECT_EQ(numaBorrowReq.name, name);
EXPECT_EQ(numaBorrowReq.requestNodeId, currentRoleInfo.nodeId);
EXPECT_EQ(numaBorrowReq.importNodeId, borrower.nodeId);
EXPECT_EQ(numaBorrowReq.size, opt.size);
EXPECT_EQ(numaBorrowReq.distance, static_cast<ubse::adapter_plugins::mmi::UbseMemDistance>(opt.distance));
EXPECT_EQ(numaBorrowReq.srcSocket, borrower.affinitySocketId);
EXPECT_EQ(numaBorrowReq.highWatermark, opt.highWatermark);
EXPECT_EQ(memcmp(numaBorrowReq.usrInfo, usrInfo, UBSE_MAX_USR_INFO_LEN), 0);
EXPECT_EQ(numaBorrowReq.udsInfo.uid, borrower.uid);
EXPECT_EQ(numaBorrowReq.udsInfo.username, borrower.username);
EXPECT_EQ(numaBorrowReq.candidateNodeList.size(), slotIds.size());
for (size_t i = 0; i < slotIds.size(); ++i) {
EXPECT_EQ(numaBorrowReq.candidateNodeList[i], slotIds[i]);
}
{
MOCKER_CPP(&memcpy_s).stubs().will(returnValue(1));
UbseMemNumaBorrowReq req;
EXPECT_EQ(ConvertUbseMemNumaCreateWithCandidateReq(name, borrower, opt, req), UBSE_ERR_INVALID_ARG);
}
}
TEST_F(TestUbseMemControllerCommonHelper, UbseMemDeleteReqIsValidTest)
{
{
std::string validName = "valid_name";
UbseMemBorrower validBorrower = {"node1"};
EXPECT_EQ(UBSE_OK, UbseMemDeleteReqIsValid(validName, validBorrower));
}
{
std::string invalidName = "!invalid@name";
UbseMemBorrower validBorrower = {"node1"};
EXPECT_EQ(UBSE_ERR_INVALID_ARG, UbseMemDeleteReqIsValid(invalidName, validBorrower));
}
{
std::string validName = "valid_name";
UbseMemBorrower emptyBorrower = {""};
EXPECT_EQ(UBSE_ERR_INVALID_ARG, UbseMemDeleteReqIsValid(validName, emptyBorrower));
}
{
std::string invalidName = "!invalid@name";
UbseMemBorrower emptyBorrower = {""};
EXPECT_EQ(UBSE_ERR_INVALID_ARG, UbseMemDeleteReqIsValid(invalidName, emptyBorrower));
}
{
std::string emptyName = "";
UbseMemBorrower validBorrower = {"node1"};
EXPECT_EQ(UBSE_ERR_INVALID_ARG, UbseMemDeleteReqIsValid(emptyName, validBorrower));
}
}
TEST_F(TestUbseMemControllerCommonHelper, UbseMemAddrCreateReqIsValidTest)
{
{
std::string validName = "valid_name";
UbseMemBorrower validBorrower = {"node1"};
UbseMemProcessLender validLender;
validLender.pid = 1234;
validLender.vaLists = {{.size = 4 * 1024 * 1024}};
EXPECT_EQ(UBSE_OK, UbseMemAddrCreateReqIsValid(validName, validBorrower, validLender));
}
{
std::string invalidName = "!invalid@name";
UbseMemBorrower validBorrower = {"node1"};
UbseMemProcessLender validLender;
validLender.pid = 1234;
validLender.vaLists = {{.size = 4 * 1024 * 1024}};
EXPECT_EQ(UBSE_ERR_INVALID_ARG, UbseMemAddrCreateReqIsValid(invalidName, validBorrower, validLender));
}
{
std::string validName = "valid_name";
UbseMemBorrower emptyBorrower = {""};
UbseMemProcessLender validLender;
validLender.pid = 1234;
validLender.vaLists = {{.size = 4 * 1024 * 1024}};
EXPECT_EQ(UBSE_ERR_INVALID_ARG, UbseMemAddrCreateReqIsValid(validName, emptyBorrower, validLender));
}
{
std::string validName = "valid_name";
UbseMemBorrower validBorrower = {"node1"};
UbseMemProcessLender invalidLender;
invalidLender.pid = 0;
invalidLender.vaLists = {{.size = 4 * 1024 * 1024}};
EXPECT_EQ(UBSE_ERR_INVALID_ARG, UbseMemAddrCreateReqIsValid(validName, validBorrower, invalidLender));
}
{
std::string validName = "valid_name";
UbseMemBorrower validBorrower = {"node1"};
UbseMemProcessLender invalidLender;
invalidLender.pid = 1234;
invalidLender.vaLists = {};
EXPECT_EQ(UBSE_OK, UbseMemAddrCreateReqIsValid(validName, validBorrower, invalidLender));
}
{
std::string validName = "valid_name";
UbseMemBorrower validBorrower = {"node1"};
UbseMemProcessLender invalidLender;
invalidLender.pid = 1234;
invalidLender.vaLists = {{.size = 0}};
EXPECT_EQ(UBSE_ERR_INVALID_ARG, UbseMemAddrCreateReqIsValid(validName, validBorrower, invalidLender));
}
{
std::string invalidName = "!invalid@name";
UbseMemBorrower emptyBorrower = {""};
UbseMemProcessLender invalidLender;
invalidLender.pid = 0;
invalidLender.vaLists = {{.size = 0}};
EXPECT_EQ(UBSE_ERR_INVALID_ARG, UbseMemAddrCreateReqIsValid(invalidName, emptyBorrower, invalidLender));
}
}
TEST_F(TestUbseMemControllerCommonHelper, ConvertUbseMemAddrCreateReqTest)
{
{
std::string name = "valid_name";
UbseMemBorrower borrower = {"node1", 0, 0, ""};
UbseMemProcessLender lender;
lender.pid = 1234;
lender.socketId = 1;
lender.slotId = 1;
lender.vaLists = {{.addr = 0x1000, .size = 4 * 1024 * 1024}};
uint32_t flag = 0;
UbseMemAddrBorrowReq addrBorrowReq;
UbseRoleInfo currentRoleInfo;
currentRoleInfo.nodeId = "1";
MOCKER_CPP(&UbseGetCurrentNodeInfo).stubs().with(outBound(currentRoleInfo)).will(returnValue(UBSE_OK));
ConvertUbseMemAddrCreateReq(name, borrower, lender, flag, addrBorrowReq);
EXPECT_EQ(addrBorrowReq.name, name);
EXPECT_EQ(addrBorrowReq.requestNodeId, currentRoleInfo.nodeId);
EXPECT_EQ(addrBorrowReq.importNodeId, borrower.nodeId);
EXPECT_EQ(addrBorrowReq.srcSocket, borrower.affinitySocketId);
EXPECT_EQ(addrBorrowReq.exportNodeId, std::to_string(lender.slotId));
EXPECT_EQ(addrBorrowReq.dstSocket, lender.socketId);
EXPECT_EQ(addrBorrowReq.exportPid, lender.pid);
EXPECT_EQ(addrBorrowReq.ubseMemPrivData.wrDelayComp, flag);
ASSERT_EQ(addrBorrowReq.exportAddrList.size(), 1);
EXPECT_EQ(addrBorrowReq.exportAddrList[0].addr, 0x1000);
EXPECT_EQ(addrBorrowReq.exportAddrList[0].size, 4 * 1024 * 1024);
}
{
std::string name = "";
UbseMemBorrower borrower = {"node1", 0, 0, ""};
UbseMemProcessLender lender;
lender.pid = 1234;
lender.vaLists = {{.size = 4 * 1024 * 1024}};
uint32_t flag = 0;
UbseMemAddrBorrowReq addrBorrowReq;
ConvertUbseMemAddrCreateReq(name, borrower, lender, flag, addrBorrowReq);
EXPECT_EQ(addrBorrowReq.name, name);
}
{
std::string name = "valid_name";
UbseMemBorrower borrower = {"node1", 0, 0, ""};
UbseMemProcessLender lender;
lender.pid = 1234;
lender.vaLists = {};
uint32_t flag = 0;
UbseMemAddrBorrowReq addrBorrowReq;
ConvertUbseMemAddrCreateReq(name, borrower, lender, flag, addrBorrowReq);
EXPECT_TRUE(addrBorrowReq.exportAddrList.empty());
}
{
std::string name = "multi_addr";
UbseMemBorrower borrower = {"node1", 0, 0, ""};
UbseMemProcessLender lender;
lender.pid = 1234;
lender.vaLists = {{.addr = 0x1000, .size = 4 * 1024 * 1024}, {.addr = 0x2000, .size = 8 * 1024 * 1024}};
uint32_t flag = 0;
UbseMemAddrBorrowReq addrBorrowReq;
ConvertUbseMemAddrCreateReq(name, borrower, lender, flag, addrBorrowReq);
ASSERT_EQ(addrBorrowReq.exportAddrList.size(), 2);
EXPECT_EQ(addrBorrowReq.exportAddrList[0].addr, 0x1000);
EXPECT_EQ(addrBorrowReq.exportAddrList[0].size, 4 * 1024 * 1024);
EXPECT_EQ(addrBorrowReq.exportAddrList[1].addr, 0x2000);
EXPECT_EQ(addrBorrowReq.exportAddrList[1].size, 8 * 1024 * 1024);
}
}
TEST_F(TestUbseMemControllerCommonHelper, ConvertUbseMemDeleteReqTest)
{
{
std::string name = "valid_name";
UbseMemBorrower borrower = {"node1", 0, 0, ""};
UbseMemReturnReq returnReq;
UbseRoleInfo currentRoleInfo;
currentRoleInfo.nodeId = "1";
MOCKER_CPP(&UbseGetCurrentNodeInfo).stubs().with(outBound(currentRoleInfo)).will(returnValue(UBSE_OK));
ConvertUbseMemDeleteReq(name, borrower, returnReq);
EXPECT_EQ(returnReq.name, name);
EXPECT_EQ(returnReq.requestNodeId, currentRoleInfo.nodeId);
EXPECT_EQ(returnReq.importNodeId, borrower.nodeId);
EXPECT_NE(returnReq.requestId, 0);
}
{
std::string name = "";
UbseMemBorrower borrower = {"node1", 0, 0, ""};
UbseMemReturnReq returnReq;
UbseRoleInfo currentRoleInfo;
currentRoleInfo.nodeId = "1";
MOCKER_CPP(&UbseGetCurrentNodeInfo).stubs().with(outBound(currentRoleInfo)).will(returnValue(UBSE_OK));
ConvertUbseMemDeleteReq(name, borrower, returnReq);
EXPECT_EQ(returnReq.name, name);
EXPECT_EQ(returnReq.requestNodeId, currentRoleInfo.nodeId);
EXPECT_EQ(returnReq.importNodeId, borrower.nodeId);
EXPECT_NE(returnReq.requestId, 0);
}
{
std::string name = "valid_name";
UbseMemBorrower borrower = {"", 0, 0, ""};
UbseMemReturnReq returnReq;
UbseRoleInfo currentRoleInfo;
currentRoleInfo.nodeId = "1";
MOCKER_CPP(&UbseGetCurrentNodeInfo).stubs().with(outBound(currentRoleInfo)).will(returnValue(UBSE_OK));
ConvertUbseMemDeleteReq(name, borrower, returnReq);
EXPECT_EQ(returnReq.name, name);
EXPECT_EQ(returnReq.requestNodeId, currentRoleInfo.nodeId);
EXPECT_EQ(returnReq.importNodeId, borrower.nodeId);
EXPECT_NE(returnReq.requestId, 0);
}
}
ubse::nodeController::UbseNodeInfo CreateTestNode(ubse::nodeController::UbseNodeClusterState state)
{
ubse::nodeController::UbseNodeInfo node;
node.nodeId = "1";
node.clusterState = state;
return node;
}
TEST_F(TestUbseMemControllerCommonHelper, WaitInitLedgerSuccessNotExistTest)
{
MOCKER_CPP(&UbseNodeController::GetNodeById).stubs().will(returnValue(ubse::nodeController::UbseNodeInfo()));
EXPECT_EQ(WaitInitLedgerSuccess(TEST_NODE_ID), UBSE_ERR_NODE_NOT_EXIST);
}
TEST_F(TestUbseMemControllerCommonHelper, WaitInitLedgerSuccessSuccessTest)
{
UbseInitLedgerState::GetInstance().SetInitLedgerDone(TEST_NODE_ID, true);
auto node = CreateTestNode(ubse::nodeController::UbseNodeClusterState::UBSE_NODE_WORKING);
MOCKER_CPP(&UbseNodeController::GetNodeById).stubs().will(returnValue(node));
EXPECT_EQ(WaitInitLedgerSuccess(TEST_NODE_ID), UBSE_OK);
}
TEST_F(TestUbseMemControllerCommonHelper, WaitInitLedgerSuccessFailedTest)
{
MOCKER_CPP(&UbseInitLedgerState::WaitInitLedgerDone).stubs().will(returnValue(false));
auto node = CreateTestNode(ubse::nodeController::UbseNodeClusterState::UBSE_NODE_SMOOTHING);
MOCKER_CPP(&UbseNodeController::GetNodeById).stubs().will(returnValue(node));
EXPECT_EQ(WaitInitLedgerSuccess(TEST_NODE_ID), UBSE_MEMCONTROLLER_ERROR_PAR_SUCCESS);
}
TEST_F(TestUbseMemControllerCommonHelper, WaitInitLedgerSuccessNodeFaultTest)
{
MOCKER_CPP(&UbseInitLedgerState::WaitInitLedgerDone).stubs().will(returnValue(false));
auto node = CreateTestNode(ubse::nodeController::UbseNodeClusterState::UBSE_NODE_FAULT);
MOCKER_CPP(&UbseNodeController::GetNodeById).stubs().will(returnValue(node));
EXPECT_EQ(WaitInitLedgerSuccess(TEST_NODE_ID), UBSE_MEMCONTROLLER_ERROR_PAR_SUCCESS);
}
}