* 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_logger.h"
namespace ubse::ut::log {
using namespace ubse::ut;
using namespace ubse::log;
TestUbseLogger::TestUbseLogger() {}
void TestUbseLogger::SetUp(void)
{
Test::SetUp();
}
void TestUbseLogger::TearDown(void)
{
Test::TearDown();
}
std::string DeleteOther(std::string str)
{
std::regex pattern("\\[[^\\[\\]]*\\]");
int count = 0;
while (count < 6 && std::regex_search(str, pattern)) {
str = std::regex_replace(str, pattern, "", std::regex_constants::format_first_only);
count++;
}
if (!str.empty() && str[0] == ' ') {
str.erase(0, 1);
}
return str;
}
* 用例描述:
* 测试LogLevelToString方法
*/
TEST_F(TestUbseLogger, TestLogLevelToString)
{
EXPECT_EQ(LogLevelToString(UbseLogLevel::DEBUG), "DEBUG");
EXPECT_EQ(LogLevelToString(UbseLogLevel::INFO), "INFO");
EXPECT_EQ(LogLevelToString(UbseLogLevel::WARN), "WARN");
EXPECT_EQ(LogLevelToString(UbseLogLevel::ERROR), "ERROR");
EXPECT_EQ(LogLevelToString(UbseLogLevel::CRIT), "CRIT");
EXPECT_EQ(LogLevelToString(static_cast<UbseLogLevel>(999)), "UNKNOWN");
}
* 用例描述:
* 测试运算符重载
*/
TEST_F(TestUbseLogger, TestoperatorChar)
{
UbseLoggerEntry UbseLoggerEntry("test_log", UbseLogLevel::INFO, "Test.log", "TestFunction", 1);
char data = 'a';
UbseLoggerEntry << data;
std::ostringstream os;
UbseLoggerEntry.OutPutLog(os);
std::string str = os.str();
str = DeleteOther(str);
EXPECT_EQ(str, "a\n");
}
TEST_F(TestUbseLogger, TestoperatorInt)
{
UbseLoggerEntry UbseLoggerEntry("test_log", UbseLogLevel::INFO, "Test.log", "TestFunction", 1);
int32_t data = -12345;
UbseLoggerEntry << data;
std::ostringstream os;
UbseLoggerEntry.OutPutLog(os);
std::string str = os.str();
str = DeleteOther(str);
EXPECT_EQ(str, "-12345\n");
}
TEST_F(TestUbseLogger, TestoperatorUint32)
{
UbseLoggerEntry UbseLoggerEntry("test_log", UbseLogLevel::INFO, "Test.log", "TestFunction", 1);
uint32_t data = 12345;
UbseLoggerEntry << data;
std::ostringstream os;
UbseLoggerEntry.OutPutLog(os);
std::string str = os.str();
str = DeleteOther(str);
EXPECT_EQ(str, "12345\n");
}
TEST_F(TestUbseLogger, TestoperatorInt64)
{
UbseLoggerEntry UbseLoggerEntry("test_log", UbseLogLevel::INFO, "Test.log", "TestFunction", 1);
int64_t data = -123456789012345;
UbseLoggerEntry << data;
std::ostringstream os;
UbseLoggerEntry.OutPutLog(os);
std::string str = os.str();
str = DeleteOther(str);
EXPECT_EQ(str, "-123456789012345\n");
}
TEST_F(TestUbseLogger, TestoperatorUint64)
{
UbseLoggerEntry UbseLoggerEntry("test_log", UbseLogLevel::INFO, "Test.log", "TestFunction", 1);
uint64_t data = 123456789012345;
UbseLoggerEntry << data;
std::ostringstream os;
UbseLoggerEntry.OutPutLog(os);
std::string str = os.str();
str = DeleteOther(str);
EXPECT_EQ(str, "123456789012345\n");
EXPECT_NO_THROW(UbseLoggerEntry << data);
}
TEST_F(TestUbseLogger, TestoperatorDouble)
{
UbseLoggerEntry UbseLoggerEntry("test_log", UbseLogLevel::INFO, "Test.log", "TestFunction", 1);
double data = 3.14;
UbseLoggerEntry << data;
std::ostringstream os;
UbseLoggerEntry.OutPutLog(os);
std::string str = os.str();
str = DeleteOther(str);
EXPECT_EQ(str, "3.14\n");
}
TEST_F(TestUbseLogger, TestoperatorString)
{
UbseLoggerEntry ubseLoggerEntry("test_log", UbseLogLevel::INFO, "Test.log", "TestFunction", 1);
std::string data =
"This is a long string that exceeds 512 bytes. It is designed to serve as a placeholder for various testing ";
int count = 5;
while (count--) {
data += data;
}
ubseLoggerEntry << data;
std::ostringstream os;
ubseLoggerEntry.OutPutLog(os);
std::string str = os.str();
str = DeleteOther(str);
EXPECT_EQ(str, data + "\n");
}
* 用例描述:
* 测试ResizeBuffer方法
*/
TEST_F(TestUbseLogger, TestResizeBuffer)
{
UbseLoggerEntry ubseLoggerEntry(nullptr, UbseLogLevel::INFO, nullptr, nullptr, 0);
ubseLoggerEntry.currentSize = 1;
ubseLoggerEntry.maxSize = 2;
size_t addSize = 1;
EXPECT_NO_THROW(ubseLoggerEntry.ResizeBuffer(addSize));
}
TEST_F(TestUbseLogger, TestResizeBuffer1)
{
UbseLoggerEntry ubseLoggerEntry(nullptr, UbseLogLevel::INFO, nullptr, nullptr, 0);
ubseLoggerEntry.heapBuffer = std::make_unique<char[]>(10);
ubseLoggerEntry.currentSize = 1;
ubseLoggerEntry.maxSize = 1;
size_t addSize = 1;
ubseLoggerEntry.ResizeBuffer(addSize);
EXPECT_EQ(ubseLoggerEntry.maxSize, 2);
}
TEST_F(TestUbseLogger, TestResizeBuffer2)
{
UbseLoggerEntry ubseLoggerEntry(nullptr, UbseLogLevel::INFO, nullptr, nullptr, 0);
ubseLoggerEntry.heapBuffer = std::make_unique<char[]>(10);
ubseLoggerEntry.currentSize = 1;
ubseLoggerEntry.maxSize = 1;
size_t addSize = 1;
ubseLoggerEntry.ResizeBuffer(addSize);
size_t testSize = ubseLoggerEntry.maxSize;
EXPECT_EQ(ubseLoggerEntry.maxSize, std::max(testSize, static_cast<size_t>(2)));
}
* 用例描述:
* 测试EncodeString方法
*/
TEST_F(TestUbseLogger, TestEncodeString)
{
UbseLoggerEntry ubseLoggerEntry(nullptr, UbseLogLevel::INFO, nullptr, nullptr, 0);
char data[512];
size_t length = 0;
EXPECT_NO_THROW(ubseLoggerEntry.EncodeString(data, length));
}
* 用例描述:
* 测试Encodedata方法
*/
TEST_F(TestUbseLogger, testEncodeData)
{
UbseLoggerEntry ubseLoggerEntry(nullptr, UbseLogLevel::INFO, nullptr, nullptr, 0);
char* data = "test";
EXPECT_NO_THROW(ubseLoggerEntry.EncodeData(data));
}
* 用例描述:
* 测试DecodeChar方法
*/
TEST_F(TestUbseLogger, TestDecodeChar)
{
UbseLoggerEntry ubseLoggerEntry(nullptr, UbseLogLevel::INFO, nullptr, nullptr, 0);
char value = 'A';
char buffer[512];
std::copy_n(&value, sizeof(char), buffer);
std::ostringstream oss;
const char* nextBuffer = ubseLoggerEntry.DecodeChar(oss, buffer);
EXPECT_EQ(nextBuffer, buffer + sizeof(char));
}
* 用例描述:
* 测试DecodeUint方法
*/
TEST_F(TestUbseLogger, TestDecodeUint)
{
UbseLoggerEntry ubseLoggerEntry(nullptr, UbseLogLevel::INFO, nullptr, nullptr, 0);
uint32_t value = 123456;
std::ostringstream oss;
char buffer[512];
std::copy_n(&value, sizeof(uint32_t), buffer);
const char* nextBuffer = ubseLoggerEntry.DecodeUint(oss, buffer);
EXPECT_EQ(nextBuffer, buffer + sizeof(uint32_t));
value = 0;
std::copy_n(&value, sizeof(uint32_t), buffer);
nextBuffer = ubseLoggerEntry.DecodeUint(oss, buffer);
EXPECT_EQ(nextBuffer, buffer + sizeof(uint32_t));
value = 4294967295;
std::copy_n(&value, sizeof(uint32_t), buffer);
nextBuffer = ubseLoggerEntry.DecodeUint(oss, buffer);
EXPECT_EQ(nextBuffer, buffer + sizeof(uint32_t));
}
* 用例描述:
* 测试DecodeUlong方法
*/
TEST_F(TestUbseLogger, TestDecodeUlong)
{
UbseLoggerEntry ubseLoggerEntry(nullptr, UbseLogLevel::INFO, nullptr, nullptr, 0);
uint64_t value = 123456789012345;
std::ostringstream oss;
char buffer[512];
std::copy_n(&value, sizeof(uint64_t), buffer);
const char* nextBuffer = ubseLoggerEntry.DecodeUlong(oss, buffer);
EXPECT_EQ(nextBuffer, buffer + sizeof(uint64_t));
value = 0;
std::copy_n(&value, sizeof(uint64_t), buffer);
nextBuffer = ubseLoggerEntry.DecodeUlong(oss, buffer);
EXPECT_EQ(nextBuffer, buffer + sizeof(uint64_t));
value = UINT64_MAX;
std::copy_n(&value, sizeof(uint64_t), buffer);
nextBuffer = ubseLoggerEntry.DecodeUlong(oss, buffer);
EXPECT_EQ(nextBuffer, buffer + sizeof(uint64_t));
}
* 用例描述:
* 测试DecodeInt方法
*/
TEST_F(TestUbseLogger, TestDecodeInt)
{
UbseLoggerEntry ubseLoggerEntry(nullptr, UbseLogLevel::INFO, nullptr, nullptr, 0);
int32_t value = -123456;
char buffer[512];
std::copy_n(&value, sizeof(int32_t), buffer);
std::ostringstream oss;
const char* nextBuffer = ubseLoggerEntry.DecodeInt(oss, buffer);
EXPECT_EQ(nextBuffer, buffer + sizeof(int32_t));
value = INT32_MIN;
std::copy_n(&value, sizeof(int32_t), buffer);
nextBuffer = ubseLoggerEntry.DecodeInt(oss, buffer);
EXPECT_EQ(nextBuffer, buffer + sizeof(int32_t));
value = INT32_MAX;
std::copy_n(&value, sizeof(int32_t), buffer);
nextBuffer = ubseLoggerEntry.DecodeInt(oss, buffer);
EXPECT_EQ(nextBuffer, buffer + sizeof(int32_t));
}
* 用例描述:
* 测试DecodeLong方法
*/
TEST_F(TestUbseLogger, TestDecodeLong)
{
UbseLoggerEntry ubseLoggerEntry(nullptr, UbseLogLevel::INFO, nullptr, nullptr, 0);
int64_t value = -123456789012345;
char buffer[512];
std::copy_n(&value, sizeof(int64_t), buffer);
std::ostringstream oss;
const char* nextBuffer = ubseLoggerEntry.DecodeLong(oss, buffer);
EXPECT_EQ(nextBuffer, buffer + sizeof(int64_t));
value = INT64_MIN;
std::copy_n(&value, sizeof(int64_t), buffer);
nextBuffer = ubseLoggerEntry.DecodeLong(oss, buffer);
EXPECT_EQ(nextBuffer, buffer + sizeof(int64_t));
value = INT64_MAX;
std::copy_n(&value, sizeof(int64_t), buffer);
nextBuffer = ubseLoggerEntry.DecodeLong(oss, buffer);
EXPECT_EQ(nextBuffer, buffer + sizeof(int64_t));
}
* 用例描述:
* 测试DecodeDouble方法
*/
TEST_F(TestUbseLogger, TestDecodeDouble)
{
UbseLoggerEntry ubseLoggerEntry(nullptr, UbseLogLevel::INFO, nullptr, nullptr, 0);
double value = 3.14;
char buffer[512];
std::copy_n(&value, sizeof(double), buffer);
std::ostringstream oss;
const char* nextBuffer = ubseLoggerEntry.DecodeDouble(oss, buffer);
EXPECT_EQ(nextBuffer, buffer + sizeof(double));
value = DBL_MAX;
std::copy_n(&value, sizeof(double), buffer);
nextBuffer = ubseLoggerEntry.DecodeDouble(oss, buffer);
EXPECT_EQ(nextBuffer, buffer + sizeof(double));
value = DBL_MIN;
std::copy_n(&value, sizeof(double), buffer);
nextBuffer = ubseLoggerEntry.DecodeDouble(oss, buffer);
EXPECT_EQ(nextBuffer, buffer + sizeof(double));
value = DBL_TRUE_MIN;
std::copy_n(&value, sizeof(double), buffer);
nextBuffer = ubseLoggerEntry.DecodeDouble(oss, buffer);
EXPECT_EQ(nextBuffer, buffer + sizeof(double));
value = -DBL_MAX;
std::copy_n(&value, sizeof(double), buffer);
nextBuffer = ubseLoggerEntry.DecodeDouble(oss, buffer);
EXPECT_EQ(nextBuffer, buffer + sizeof(double));
value = -DBL_MIN;
std::copy_n(&value, sizeof(double), buffer);
nextBuffer = ubseLoggerEntry.DecodeDouble(oss, buffer);
EXPECT_EQ(nextBuffer, buffer + sizeof(double));
value = -0.0;
std::copy_n(&value, sizeof(double), buffer);
nextBuffer = ubseLoggerEntry.DecodeDouble(oss, buffer);
EXPECT_EQ(nextBuffer, buffer + sizeof(double));
value = +0.0;
std::copy_n(&value, sizeof(double), buffer);
nextBuffer = ubseLoggerEntry.DecodeDouble(oss, buffer);
EXPECT_EQ(nextBuffer, buffer + sizeof(double));
}
* 用例描述:
* 测试DecodeData方法
*/
TEST_F(TestUbseLogger, TestDecodeData)
{
UbseLoggerEntry ubseLoggerEntry(nullptr, UbseLogLevel::INFO, nullptr, nullptr, 0);
std::ostringstream oss;
char buffer[512];
std::vector<char> vec(buffer, buffer + sizeof(buffer));
uint32_t size = 0;
char c = 'A';
int32_t i = -123456;
int64_t v = -123456789012345;
uint32_t s = 123456;
uint64_t value = 123456789012345;
double d = 3.14;
const char* str = "test1";
const std::string data = "test2";
*reinterpret_cast<UbseLoggerTypeId*>(&buffer[size]) = UbseLoggerTypeId::CHAR;
size += sizeof(UbseLoggerTypeId);
*reinterpret_cast<char*>(&buffer[size]) = c;
size += sizeof(char);
*reinterpret_cast<UbseLoggerTypeId*>(&buffer[size]) = UbseLoggerTypeId::INT32;
size += sizeof(UbseLoggerTypeId);
*reinterpret_cast<int32_t*>(&buffer[size]) = i;
size += sizeof(int32_t);
*reinterpret_cast<UbseLoggerTypeId*>(&buffer[size]) = UbseLoggerTypeId::INT64;
size += sizeof(UbseLoggerTypeId);
*reinterpret_cast<int64_t*>(&buffer[size]) = v;
size += sizeof(int64_t);
*reinterpret_cast<UbseLoggerTypeId*>(&buffer[size]) = UbseLoggerTypeId::UINT32;
size += sizeof(UbseLoggerTypeId);
*reinterpret_cast<uint32_t*>(&buffer[size]) = s;
size += sizeof(uint32_t);
*reinterpret_cast<UbseLoggerTypeId*>(&buffer[size]) = UbseLoggerTypeId::UINT64;
size += sizeof(UbseLoggerTypeId);
*reinterpret_cast<uint64_t*>(&buffer[size]) = value;
size += sizeof(uint64_t);
*reinterpret_cast<UbseLoggerTypeId*>(&buffer[size]) = UbseLoggerTypeId::DOUBLE;
size += sizeof(UbseLoggerTypeId);
*reinterpret_cast<double*>(&buffer[size]) = d;
size += sizeof(double);
ubseLoggerEntry.DecodeData(oss, &buffer[0], (&buffer[0]) + size);
EXPECT_EQ(oss.str(), "A-123456-1234567890123451234561234567890123453.14");
}
* 用例描述:
* 测试UbseIsLog方法
*/
TEST_F(TestUbseLogger, TestUbseIsLog)
{
UbseLogLevel level = UbseLogLevel::INFO;
LoggerOptions options{UbseLoggerManager::StringToLogLevel("INFO"), 30, 20,
1024};
UbseLoggerManager::gInstance = UbseLoggerManager::Instance();
UbseLoggerManager::gInstance->SetLogLevel(options.minLogLevel);
EXPECT_TRUE(UbseIsLog(level));
UbseLoggerManager::gInstance->Destroy();
EXPECT_FALSE(UbseIsLog(level));
}
* 用例描述:
* 测试UbseLog方法
*/
TEST_F(TestUbseLogger, TestUbseLog)
{
UbseLoggerEntry ubseLoggerEntry(nullptr, UbseLogLevel::INFO, nullptr, nullptr, 0);
EXPECT_NO_THROW(UbseLog(ubseLoggerEntry));
}
* 用例描述:
* 测试拷贝构造函数
*/
TEST_F(TestUbseLogger, TestCopyConstructor)
{
UbseLoggerEntry ubseLoggerEntry1(nullptr, UbseLogLevel::INFO, "test.cpp", "testFunc", 111);
UbseLoggerEntry ubseLoggerEntry2(ubseLoggerEntry1);
ubseLoggerEntry2.GetEntryTimeStamp();
EXPECT_EQ(ubseLoggerEntry2.GetFile(), "test.cpp");
EXPECT_EQ(ubseLoggerEntry2.GetLine(), 111);
UbseLoggerEntry ubseLoggerEntry3(nullptr, UbseLogLevel::INFO, "test.cpp", "testFunc", 111);
std::string str =
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
ubseLoggerEntry3 << str << str << str << str << str << str;
UbseLoggerEntry ubseLoggerEntry4(ubseLoggerEntry3);
EXPECT_EQ(ubseLoggerEntry4.GetFile(), "test.cpp");
EXPECT_EQ(ubseLoggerEntry4.GetLine(), 111);
}
* 用例描述:
* 测试UbseLoggerEntry赋值
*/
TEST_F(TestUbseLogger, TestAssignmentOperatorOverload)
{
UbseLoggerEntry ubseLoggerEntry1(nullptr, UbseLogLevel::INFO, "test.cpp", "testFunc", 111);
UbseLoggerEntry ubseLoggerEntry2 = ubseLoggerEntry1;
EXPECT_EQ(ubseLoggerEntry2.GetFile(), "test.cpp");
EXPECT_EQ(ubseLoggerEntry2.GetLine(), 111);
UbseLoggerEntry ubseLoggerEntry3(nullptr, UbseLogLevel::INFO, "test.cpp", "testFunc", 111);
std::string str =
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
ubseLoggerEntry3 << str << str << str << str << str << str;
UbseLoggerEntry ubseLoggerEntry4 = ubseLoggerEntry3;
EXPECT_EQ(ubseLoggerEntry4.GetFile(), "test.cpp");
EXPECT_EQ(ubseLoggerEntry4.GetLine(), 111);
}
* 用例描述:
* 测试格式化返回值
* 测试步骤:
* 1. 格式化retCode
* 预期结果:
* 1. 返回retCode格式化后的字符串。
*/
TEST_F(TestUbseLogger, TestParseRetCode)
{
uint32_t retCode = 10001;
std::string str = FormatRetCode(retCode);
EXPECT_STREQ(str.c_str(), "ErrorCode=10001");
}
* 用例描述:
* 测试FormatSyslog
* 测试步骤:
* 1. 通过FormatSyslog获取流
* 预期结果:
* 1. 得到的字符串与预期一致
*/
TEST_F(TestUbseLogger, TestFormatSyslog)
{
UbseLoggerEntry ubseLoggerEntry("test_log", UbseLogLevel::INFO, "Test.log", "TestFunction", 1);
int64_t data = -123456789012345;
ubseLoggerEntry << data;
std::ostringstream os;
ubseLoggerEntry.FormatSyslog(os);
std::string str = os.str();
str = DeleteOther(str);
EXPECT_EQ(str, "-123456789012345\n");
}
}