Compare commits

..

No commits in common. "test_20260618_132608" and "main" have entirely different histories.

4 changed files with 0 additions and 569 deletions

View File

@ -1,25 +0,0 @@
cmake_minimum_required(VERSION 3.10.0)
project(test_net_env_project)
include(FetchContent)
if (MSVC)
add_compile_options(/utf-8)
endif()
FetchContent_Declare(
googletest
URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip
)
# For Windows: Prevent overriding the parent project's compiler/linker settings
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../include)
include(CTest)
enable_testing()
add_executable(test_net_env_project test_dau.cpp ../src/dau.cpp test_app.cpp ../src/dsu.cpp test_ppu.cpp ../src/ppu.cpp)
target_link_libraries(test_net_env_project gtest gmock gtest_main)
include(GoogleTest)
gtest_discover_tests(test_net_env_project)

View File

@ -1,304 +0,0 @@
#include <gtest/gtest.h>
#include <vector>
#include <string>
#include <cstdint>
#include <ctime>
#include "app.hpp"
/**
* : test_app.cpp
* : app.cpp (dsu namespace)
* : s_storage为静态全局变量
* 使channelId以避免数据干扰
* StorageStatus QueryCondition
*/
// ==================== DSU_Write 测试 ====================
class DSUWriteTest : public ::testing::Test {
protected:
uint32_t channelId = 0;
time_t timestamp = 1000000;
void SetUp() override {
static uint32_t channelCounter = 2000;
channelId = channelCounter++;
}
};
// 测试正常写入数据流
TEST_F(DSUWriteTest, testDSUWriteNormalInput) {
std::vector<uint8_t> data = {0x01, 0x02, 0x03, 0x04};
bool result = dsu::DSU_Write(data, channelId, timestamp);
EXPECT_TRUE(result);
}
// 测试空数据写入应返回false
TEST_F(DSUWriteTest, testDSUWriteEmptyData) {
std::vector<uint8_t> data;
bool result = dsu::DSU_Write(data, channelId, timestamp);
EXPECT_FALSE(result);
}
// 测试channelId和timestamp为0的边界值
TEST_F(DSUWriteTest, testDSUWriteBoundaryZeroValues) {
std::vector<uint8_t> data = {0xFF};
bool result = dsu::DSU_Write(data, 0, 0);
EXPECT_TRUE(result);
}
// 测试channelId和timestamp为最大值
TEST_F(DSUWriteTest, testDSUWriteMaxValues) {
std::vector<uint8_t> data = {0xAB, 0xCD};
bool result = dsu::DSU_Write(data, UINT32_MAX, static_cast<time_t>(UINT32_MAX));
EXPECT_TRUE(result);
}
// 测试单字节数据写入
TEST_F(DSUWriteTest, testDSUWriteSingleByte) {
std::vector<uint8_t> data = {0x42};
bool result = dsu::DSU_Write(data, channelId, timestamp);
EXPECT_TRUE(result);
}
// 测试大数据块写入
TEST_F(DSUWriteTest, testDSUWriteLargeData) {
std::vector<uint8_t> data(1024, 0xAA);
bool result = dsu::DSU_Write(data, channelId, timestamp);
EXPECT_TRUE(result);
}
// ==================== DSU_CheckDisk 测试 ====================
// 测试磁盘健康状态检查(正常状态)
TEST(DSUCheckDiskTest, testDSUCheckDiskHealthy) {
StorageStatus status = dsu::DSU_CheckDisk();
EXPECT_TRUE(status == StorageStatus::Healthy ||
status == StorageStatus::Full);
}
// 测试磁盘存储满告警写入超过1000条触发Full
TEST(DSUCheckDiskTest, testDSUCheckDiskFull) {
uint32_t fillChannel = 9000;
for (int i = 0; i < 1005; ++i) {
std::vector<uint8_t> data = {static_cast<uint8_t>(i & 0xFF)};
dsu::DSU_Write(data, fillChannel, static_cast<time_t>(i));
}
StorageStatus status = dsu::DSU_CheckDisk();
EXPECT_EQ(status, StorageStatus::Full);
}
// ==================== DSU_Query 测试 ====================
class DSUQueryTest : public ::testing::Test {
protected:
uint32_t channelId = 0;
void SetUp() override {
static uint32_t channelCounter = 5000;
channelId = channelCounter++;
}
};
// 测试正常查询返回匹配数据
TEST_F(DSUQueryTest, testDSUQueryNormalInput) {
std::vector<uint8_t> data1 = {0x01, 0x02};
std::vector<uint8_t> data2 = {0x03, 0x04};
dsu::DSU_Write(data1, channelId, 100);
dsu::DSU_Write(data2, channelId, 200);
QueryCondition condition;
condition.channelId = channelId;
condition.startTime = 100;
condition.endTime = 200;
condition.maxResults = 10;
std::vector<std::vector<uint8_t>> results;
std::string log;
bool ret = dsu::DSU_Query(condition, results, log);
EXPECT_TRUE(ret);
EXPECT_EQ(results.size(), 2u);
EXPECT_EQ(results[0], data1);
EXPECT_EQ(results[1], data2);
}
// 测试无匹配数据时返回false
TEST_F(DSUQueryTest, testDSUQueryNoMatch) {
QueryCondition condition;
condition.channelId = 99999;
condition.startTime = 0;
condition.endTime = 100;
condition.maxResults = 10;
std::vector<std::vector<uint8_t>> results;
std::string log;
bool ret = dsu::DSU_Query(condition, results, log);
EXPECT_FALSE(ret);
EXPECT_TRUE(results.empty());
}
// 测试maxResults限制查询结果数量
TEST_F(DSUQueryTest, testDSUQueryMaxResultsLimit) {
for (int i = 0; i < 5; ++i) {
std::vector<uint8_t> data = {static_cast<uint8_t>(i)};
dsu::DSU_Write(data, channelId, static_cast<time_t>(300 + i));
}
QueryCondition condition;
condition.channelId = channelId;
condition.startTime = 300;
condition.endTime = 400;
condition.maxResults = 3;
std::vector<std::vector<uint8_t>> results;
std::string log;
bool ret = dsu::DSU_Query(condition, results, log);
EXPECT_TRUE(ret);
EXPECT_LE(results.size(), 3u);
}
// 测试时间范围精确查询
TEST_F(DSUQueryTest, testDSUQueryTimeRange) {
std::vector<uint8_t> data1 = {0x10};
std::vector<uint8_t> data2 = {0x20};
std::vector<uint8_t> data3 = {0x30};
dsu::DSU_Write(data1, channelId, 500);
dsu::DSU_Write(data2, channelId, 600);
dsu::DSU_Write(data3, channelId, 700);
QueryCondition condition;
condition.channelId = channelId;
condition.startTime = 550;
condition.endTime = 650;
condition.maxResults = 10;
std::vector<std::vector<uint8_t>> results;
std::string log;
bool ret = dsu::DSU_Query(condition, results, log);
EXPECT_TRUE(ret);
EXPECT_EQ(results.size(), 1u);
EXPECT_EQ(results[0], data2);
}
// 测试查询日志包含结果数量信息
TEST_F(DSUQueryTest, testDSUQueryLogOutput) {
std::vector<uint8_t> data = {0x01};
dsu::DSU_Write(data, channelId, 100);
QueryCondition condition;
condition.channelId = channelId;
condition.startTime = 100;
condition.endTime = 100;
condition.maxResults = 10;
std::vector<std::vector<uint8_t>> results;
std::string log;
dsu::DSU_Query(condition, results, log);
EXPECT_FALSE(log.empty());
EXPECT_NE(log.find("Query returned"), std::string::npos);
}
// ==================== DSU_Replay 测试 ====================
class DSUReplayTest : public ::testing::Test {
protected:
uint32_t channelId = 0;
void SetUp() override {
static uint32_t channelCounter = 7000;
channelId = channelCounter++;
}
};
// 测试正常回放数据
TEST_F(DSUReplayTest, testDSUReplayNormalInput) {
std::vector<uint8_t> data1 = {0x01, 0x02};
std::vector<uint8_t> data2 = {0x03, 0x04};
dsu::DSU_Write(data1, channelId, 100);
dsu::DSU_Write(data2, channelId, 200);
QueryCondition condition;
condition.channelId = channelId;
condition.startTime = 100;
condition.endTime = 200;
condition.maxResults = 10;
std::vector<uint8_t> replayOutput;
std::string log;
bool ret = dsu::DSU_Replay(condition, replayOutput, log);
EXPECT_TRUE(ret);
EXPECT_EQ(replayOutput.size(), 4u);
EXPECT_EQ(replayOutput[0], 0x01);
EXPECT_EQ(replayOutput[1], 0x02);
EXPECT_EQ(replayOutput[2], 0x03);
EXPECT_EQ(replayOutput[3], 0x04);
}
// 测试无数据时回放返回false
TEST_F(DSUReplayTest, testDSUReplayNoData) {
QueryCondition condition;
condition.channelId = 88888;
condition.startTime = 0;
condition.endTime = 100;
condition.maxResults = 10;
std::vector<uint8_t> replayOutput;
std::string log;
bool ret = dsu::DSU_Replay(condition, replayOutput, log);
EXPECT_FALSE(ret);
}
// 测试多数据块按序拼接回放
TEST_F(DSUReplayTest, testDSUReplayMultipleBlocks) {
std::vector<uint8_t> data1 = {0xAA};
std::vector<uint8_t> data2 = {0xBB, 0xCC};
std::vector<uint8_t> data3 = {0xDD, 0xEE, 0xFF};
dsu::DSU_Write(data1, channelId, 100);
dsu::DSU_Write(data2, channelId, 200);
dsu::DSU_Write(data3, channelId, 300);
QueryCondition condition;
condition.channelId = channelId;
condition.startTime = 100;
condition.endTime = 300;
condition.maxResults = 10;
std::vector<uint8_t> replayOutput;
std::string log;
bool ret = dsu::DSU_Replay(condition, replayOutput, log);
EXPECT_TRUE(ret);
EXPECT_EQ(replayOutput.size(), 6u);
EXPECT_EQ(replayOutput[0], 0xAA);
EXPECT_EQ(replayOutput[1], 0xBB);
EXPECT_EQ(replayOutput[2], 0xCC);
EXPECT_EQ(replayOutput[3], 0xDD);
EXPECT_EQ(replayOutput[4], 0xEE);
EXPECT_EQ(replayOutput[5], 0xFF);
}
// 测试回放日志包含完成信息
TEST_F(DSUReplayTest, testDSUReplayLogContainsInfo) {
std::vector<uint8_t> data = {0x01};
dsu::DSU_Write(data, channelId, 100);
QueryCondition condition;
condition.channelId = channelId;
condition.startTime = 100;
condition.endTime = 100;
condition.maxResults = 10;
std::vector<uint8_t> replayOutput;
std::string log;
dsu::DSU_Replay(condition, replayOutput, log);
EXPECT_FALSE(log.empty());
EXPECT_NE(log.find("Replay completed"), std::string::npos);
}

View File

@ -1,109 +0,0 @@
#include <gtest/gtest.h>
#include "app.hpp"
#include <string>
#include <cstring>
using namespace dau;
class DAUTest : public ::testing::Test {
protected:
void SetUp() override {
DAU_SetSleep(false);
}
};
TEST_F(DAUTest, testDAU_Process_NormalInput) {
RawDataFrame input{};
ValidData output{};
std::string errorLog;
input.len = 8;
for (int i = 0; i < 8; ++i) input.data[i] = i;
input.timestamp = 12345;
input.busType = static_cast<BusType>(1);
bool result = DAU_Process(input, output, errorLog);
EXPECT_TRUE(result);
EXPECT_EQ(output.dataLen, 8);
EXPECT_EQ(output.timestamp, 12345);
EXPECT_EQ(output.sourceBus, static_cast<BusType>(1));
EXPECT_EQ(errorLog, "");
}
TEST_F(DAUTest, testDAU_Process_SleepMode) {
DAU_SetSleep(true);
RawDataFrame input{};
ValidData output{};
std::string errorLog;
input.len = 8;
input.data[0] = 0x01;
bool result = DAU_Process(input, output, errorLog);
EXPECT_FALSE(result);
EXPECT_NE(errorLog.find("Sleep mode"), std::string::npos);
}
TEST_F(DAUTest, testDAU_Process_InvalidLengthZero) {
RawDataFrame input{};
ValidData output{};
std::string errorLog;
input.len = 0;
bool result = DAU_Process(input, output, errorLog);
EXPECT_FALSE(result);
EXPECT_NE(errorLog.find("Invalid data length"), std::string::npos);
}
TEST_F(DAUTest, testDAU_Process_InvalidLengthMax) {
RawDataFrame input{};
ValidData output{};
std::string errorLog;
input.len = 65;
bool result = DAU_Process(input, output, errorLog);
EXPECT_FALSE(result);
EXPECT_NE(errorLog.find("Invalid data length"), std::string::npos);
}
TEST_F(DAUTest, testDAU_Process_ErrorFrame) {
RawDataFrame input{};
ValidData output{};
std::string errorLog;
input.len = 8;
memset(input.data, 0xFF, 8);
bool result = DAU_Process(input, output, errorLog);
EXPECT_FALSE(result);
EXPECT_NE(errorLog.find("Error frame detected"), std::string::npos);
}
TEST_F(DAUTest, testDAU_SetSleep_EnableDisable) {
DAU_SetSleep(true);
RawDataFrame input{};
ValidData output{};
std::string errorLog;
input.len = 1;
input.data[0] = 0x01;
EXPECT_FALSE(DAU_Process(input, output, errorLog));
DAU_SetSleep(false);
EXPECT_TRUE(DAU_Process(input, output, errorLog));
}
TEST_F(DAUTest, testDAU_GetBusLoad_InitialAndIncrement) {
uint32_t initialLoad = DAU_GetBusLoad();
RawDataFrame input{};
ValidData output{};
std::string errorLog;
input.len = 1;
input.data[0] = 0x01;
DAU_Process(input, output, errorLog);
EXPECT_EQ(DAU_GetBusLoad(), initialLoad + 5);
}

View File

@ -1,131 +0,0 @@
#include <gtest/gtest.h>
#include "app.hpp"
#include <string>
#include <cstring>
using namespace ppu;
// 辅助函数:创建 CanFrame
CanFrame CreateCanFrame(uint32_t id, bool isExtended, bool isCanFd, uint8_t dataLen) {
CanFrame frame;
frame.id = id;
frame.isExtended = isExtended;
frame.isCanFd = isCanFd;
frame.dataLen = dataLen;
frame.timestamp = 1000;
std::memset(frame.data, 0, sizeof(frame.data));
for (uint8_t i = 0; i < dataLen && i < 64; ++i) {
frame.data[i] = i;
}
return frame;
}
// ================= PPU_Check 测试用例 =================
TEST(PPU_Check_Test, Normal_Standard_CAN20) {
CanFrame frame = CreateCanFrame(0x100, false, false, 8);
std::string reason;
EXPECT_TRUE(PPU_Check(frame, reason));
}
TEST(PPU_Check_Test, Normal_Extended_CANFD) {
CanFrame frame = CreateCanFrame(0x1FFFFFFF, true, true, 64);
std::string reason;
EXPECT_TRUE(PPU_Check(frame, reason));
}
TEST(PPU_Check_Test, Boundary_Standard_ID_Max) {
CanFrame frame = CreateCanFrame(0x7FF, false, false, 8);
std::string reason;
EXPECT_TRUE(PPU_Check(frame, reason));
}
TEST(PPU_Check_Test, Boundary_Extended_ID_Max) {
CanFrame frame = CreateCanFrame(0x1FFFFFFF, true, false, 8);
std::string reason;
EXPECT_TRUE(PPU_Check(frame, reason));
}
TEST(PPU_Check_Test, Boundary_DataLen_Zero) {
CanFrame frame = CreateCanFrame(0x100, false, false, 0);
std::string reason;
EXPECT_TRUE(PPU_Check(frame, reason));
}
TEST(PPU_Check_Test, Exception_DataLen_Exceeds_64) {
CanFrame frame = CreateCanFrame(0x100, false, true, 65);
std::string reason;
EXPECT_FALSE(PPU_Check(frame, reason));
EXPECT_NE(reason.find("exceeds maximum (64)"), std::string::npos);
}
TEST(PPU_Check_Test, Exception_CAN20_DataLen_Exceeds_8) {
CanFrame frame = CreateCanFrame(0x100, false, false, 9);
std::string reason;
EXPECT_FALSE(PPU_Check(frame, reason));
EXPECT_NE(reason.find("exceeds 8 bytes"), std::string::npos);
}
TEST(PPU_Check_Test, Exception_Standard_ID_Exceeds_11bit) {
CanFrame frame = CreateCanFrame(0x800, false, false, 8);
std::string reason;
EXPECT_FALSE(PPU_Check(frame, reason));
EXPECT_NE(reason.find("exceeds 11-bit range"), std::string::npos);
}
TEST(PPU_Check_Test, Exception_Extended_ID_Exceeds_29bit) {
CanFrame frame = CreateCanFrame(0x20000000, true, false, 8);
std::string reason;
EXPECT_FALSE(PPU_Check(frame, reason));
EXPECT_NE(reason.find("exceeds 29-bit range"), std::string::npos);
}
// ================= PPU_Convert 测试用例 =================
TEST(PPU_Convert_Test, Normal_CAN20_to_CANFD) {
CanFrame input = CreateCanFrame(0x100, false, false, 8);
CompatibleFrame output;
std::string log;
EXPECT_TRUE(PPU_Convert(input, output, log));
EXPECT_EQ(output.dataLen, 8);
EXPECT_NE(log.find("CAN2.0->CANFD"), std::string::npos);
EXPECT_EQ(output.id, input.id);
}
TEST(PPU_Convert_Test, Normal_CANFD_to_CAN20_No_Truncation) {
CanFrame input = CreateCanFrame(0x100, false, true, 8);
CompatibleFrame output;
std::string log;
EXPECT_TRUE(PPU_Convert(input, output, log));
EXPECT_EQ(output.dataLen, 8);
EXPECT_NE(log.find("CANFD->CAN2.0"), std::string::npos);
}
TEST(PPU_Convert_Test, Normal_CANFD_to_CAN20_With_Truncation) {
CanFrame input = CreateCanFrame(0x100, false, true, 64);
CompatibleFrame output;
std::string log;
EXPECT_TRUE(PPU_Convert(input, output, log));
EXPECT_EQ(output.dataLen, 8);
EXPECT_NE(log.find("CANFD->CAN2.0"), std::string::npos);
}
TEST(PPU_Convert_Test, Exception_Check_Failed) {
CanFrame input = CreateCanFrame(0x100, false, false, 9); // CAN2.0 len > 8
CompatibleFrame output;
std::string log;
EXPECT_FALSE(PPU_Convert(input, output, log));
EXPECT_NE(log.find("Convert rejected"), std::string::npos);
}
TEST(PPU_Convert_Test, Special_Data_Copy_Verification) {
CanFrame input = CreateCanFrame(0x123, true, false, 4);
input.data[0] = 0xAA; input.data[1] = 0xBB; input.data[2] = 0xCC; input.data[3] = 0xDD;
CompatibleFrame output;
std::string log;
EXPECT_TRUE(PPU_Convert(input, output, log));
EXPECT_EQ(output.data[0], 0xAA);
EXPECT_EQ(output.data[1], 0xBB);
EXPECT_EQ(output.data[2], 0xCC);
EXPECT_EQ(output.data[3], 0xDD);
}