CppGenerate/tests/test_alert_manager.cpp

355 lines
14 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "gtest/gtest.h"
#include "alert_manager.hpp"
#include <vector>
#include <string>
// Mock time function for deterministic testing
uint32_t mock_timestamp = 1640995200; // 2022-01-01 00:00:00 UTC
// Mock getTimestamp function
uint32_t getTimestamp() {
return mock_timestamp;
}
// Override the global getTimestamp to use mock
extern "C" uint32_t getTimestamp() {
return mock_timestamp;
}
// Test fixture for AlertManager
class AlertManagerTest : public ::testing::Test {
protected:
AlertManager alert_manager;
void SetUp() override {
mock_timestamp = 1640995200; // Reset timestamp
alert_manager.initialize();
}
void TearDown() override {
// Clear any remaining alerts
alert_manager.resetAllAlerts();
}
};
// Test case: AlertManager 构造函数初始化默认阈值
TEST_F(AlertManagerTest, testAlertManagerConstructor) {
EXPECT_FLOAT_EQ(alert_manager.getUpperThreshold(), 100.0f);
EXPECT_FLOAT_EQ(alert_manager.getLowerThreshold(), -50.0f);
EXPECT_TRUE(alert_manager.getActiveAlerts().empty());
EXPECT_TRUE(alert_manager.getAlertHistory(10).empty());
}
// Test case: AlertManager 析构函数无副作用
TEST_F(AlertManagerTest, testAlertManagerDestructor) {
// Destructor should not cause any observable side effects
// Simply verify no crash occurs
// This is implicitly tested by the test framework
EXPECT_TRUE(true);
}
// Test case: initialize 输出初始化信息
TEST_F(AlertManagerTest, testInitializeOutput) {
// Capture output
std::ostringstream buffer;
std::streambuf* old = std::cout.rdbuf(buffer.rdbuf());
alert_manager.initialize();
std::cout.rdbuf(old);
std::string output = buffer.str();
EXPECT_NE(output.find("预警管理器初始化完成。"), std::string::npos);
EXPECT_NE(output.find("默认预警阈值:上限=100米"), std::string::npos);
EXPECT_NE(output.find("下限=-50米"), std::string::npos);
}
// Test case: checkAltitudeAlert 正常高度不触发预警
TEST_F(AlertManagerTest, testCheckAltitudeAlertNormalHeight) {
alert_manager.checkAltitudeAlert(50.0f, mock_timestamp);
EXPECT_FALSE(alert_manager.hasActiveAlerts());
}
// Test case: checkAltitudeAlert 触发上限预警
TEST_F(AlertManagerTest, testCheckAltitudeAlertUpperThreshold) {
alert_manager.checkAltitudeAlert(101.0f, mock_timestamp);
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 1);
EXPECT_EQ(active_alerts[0].type, AlertType::ALTITUDE_UPPER);
EXPECT_EQ(active_alerts[0].status, AlertStatus::ACTIVE);
EXPECT_EQ(active_alerts[0].trigger_time, mock_timestamp);
}
// Test case: checkAltitudeAlert 触发下限预警
TEST_F(AlertManagerTest, testCheckAltitudeAlertLowerThreshold) {
alert_manager.checkAltitudeAlert(-51.0f, mock_timestamp);
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 1);
EXPECT_EQ(active_alerts[0].type, AlertType::ALTITUDE_LOWER);
EXPECT_EQ(active_alerts[0].status, AlertStatus::ACTIVE);
EXPECT_EQ(active_alerts[0].trigger_time, mock_timestamp);
}
// Test case: checkAltitudeAlert 高度恢复正常解除预警
TEST_F(AlertManagerTest, testCheckAltitudeAlertRecovery) {
// Trigger upper threshold
alert_manager.checkAltitudeAlert(101.0f, mock_timestamp);
EXPECT_TRUE(alert_manager.hasActiveAlerts());
// Return to normal
alert_manager.checkAltitudeAlert(99.0f, mock_timestamp + 1);
EXPECT_FALSE(alert_manager.hasActiveAlerts());
}
// Test case: setAltitudeThresholds 合法阈值设置
TEST_F(AlertManagerTest, testSetAltitudeThresholdsValid) {
alert_manager.setAltitudeThresholds(200.0f, -100.0f);
EXPECT_FLOAT_EQ(alert_manager.getUpperThreshold(), 200.0f);
EXPECT_FLOAT_EQ(alert_manager.getLowerThreshold(), -100.0f);
}
// Test case: setAltitudeThresholds 非法阈值设置(上界 <= 下界)
TEST_F(AlertManagerTest, testSetAltitudeThresholdsInvalid) {
std::ostringstream buffer;
std::streambuf* old = std::cerr.rdbuf(buffer.rdbuf());
alert_manager.setAltitudeThresholds(50.0f, 100.0f);
std::cerr.rdbuf(old);
std::string error_output = buffer.str();
EXPECT_NE(error_output.find("错误:上限阈值必须大于下限阈值。"), std::string::npos);
EXPECT_FLOAT_EQ(alert_manager.getUpperThreshold(), 100.0f); // Should remain unchanged
EXPECT_FLOAT_EQ(alert_manager.getLowerThreshold(), -50.0f);
}
// Test case: triggerSensorFailure 触发传感器故障预警
TEST_F(AlertManagerTest, testTriggerSensorFailure) {
alert_manager.triggerSensorFailure(mock_timestamp);
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 1);
EXPECT_EQ(active_alerts[0].type, AlertType::SENSOR_FAILURE);
EXPECT_EQ(active_alerts[0].status, AlertStatus::ACTIVE);
EXPECT_EQ(active_alerts[0].trigger_time, mock_timestamp);
EXPECT_EQ(active_alerts[0].description, "传感器故障");
}
// Test case: triggerLowBattery 触发低电量预警
TEST_F(AlertManagerTest, testTriggerLowBattery) {
alert_manager.triggerLowBattery(mock_timestamp, 15.5f);
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 1);
EXPECT_EQ(active_alerts[0].type, AlertType::LOW_BATTERY);
EXPECT_EQ(active_alerts[0].status, AlertStatus::ACTIVE);
EXPECT_EQ(active_alerts[0].trigger_time, mock_timestamp);
EXPECT_EQ(active_alerts[0].description, "低电量警告当前电量15.5%");
}
// Test case: triggerCommunicationError 触发通信错误预警
TEST_F(AlertManagerTest, testTriggerCommunicationError) {
alert_manager.triggerCommunicationError(mock_timestamp);
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 1);
EXPECT_EQ(active_alerts[0].type, AlertType::COMMUNICATION_ERROR);
EXPECT_EQ(active_alerts[0].status, AlertStatus::ACTIVE);
EXPECT_EQ(active_alerts[0].trigger_time, mock_timestamp);
EXPECT_EQ(active_alerts[0].description, "通信错误");
}
// Test case: acknowledgeAllAlerts 确认所有活动预警
TEST_F(AlertManagerTest, testAcknowledgeAllAlerts) {
// Trigger multiple alerts
alert_manager.triggerSensorFailure(mock_timestamp);
alert_manager.triggerLowBattery(mock_timestamp + 1, 10.0f);
alert_manager.triggerCommunicationError(mock_timestamp + 2);
alert_manager.acknowledgeAllAlerts(mock_timestamp + 3);
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_TRUE(active_alerts.empty());
// Check that all were acknowledged
auto alerts = alert_manager.getAlertHistory(10);
EXPECT_EQ(alerts.size(), 3);
for (const auto& alert : alerts) {
EXPECT_EQ(alert.status, AlertStatus::ACKNOWLEDGED);
}
}
// Test case: acknowledgeAlert 确认指定类型预警
TEST_F(AlertManagerTest, testAcknowledgeAlert) {
alert_manager.triggerSensorFailure(mock_timestamp);
alert_manager.acknowledgeAlert(AlertType::SENSOR_FAILURE, mock_timestamp + 1);
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_TRUE(active_alerts.empty());
auto history = alert_manager.getAlertHistory(10);
EXPECT_EQ(history.size(), 1);
EXPECT_EQ(history[0].status, AlertStatus::ACKNOWLEDGED);
}
// Test case: resetAlert 重置指定类型预警
TEST_F(AlertManagerTest, testResetAlert) {
alert_manager.triggerSensorFailure(mock_timestamp);
alert_manager.resetAlert(AlertType::SENSOR_FAILURE);
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_TRUE(active_alerts.empty());
auto history = alert_manager.getAlertHistory(10);
EXPECT_EQ(history.size(), 1);
EXPECT_EQ(history[0].status, AlertStatus::RESOLVED);
}
// Test case: resetAllAlerts 重置所有预警
TEST_F(AlertManagerTest, testResetAllAlerts) {
alert_manager.triggerSensorFailure(mock_timestamp);
alert_manager.triggerLowBattery(mock_timestamp + 1, 10.0f);
alert_manager.resetAllAlerts();
EXPECT_TRUE(alert_manager.getActiveAlerts().empty());
EXPECT_TRUE(alert_manager.getAlertHistory(10).empty());
}
// Test case: hasActiveAlerts 检查是否存在活动预警
TEST_F(AlertManagerTest, testHasActiveAlerts) {
EXPECT_FALSE(alert_manager.hasActiveAlerts());
alert_manager.triggerSensorFailure(mock_timestamp);
EXPECT_TRUE(alert_manager.hasActiveAlerts());
alert_manager.resetAlert(AlertType::SENSOR_FAILURE);
EXPECT_FALSE(alert_manager.hasActiveAlerts());
}
// Test case: hasUnacknowledgedAlerts 检查是否存在未确认预警
TEST_F(AlertManagerTest, testHasUnacknowledgedAlerts) {
EXPECT_FALSE(alert_manager.hasUnacknowledgedAlerts());
alert_manager.triggerSensorFailure(mock_timestamp);
EXPECT_TRUE(alert_manager.hasUnacknowledgedAlerts());
alert_manager.acknowledgeAlert(AlertType::SENSOR_FAILURE, mock_timestamp + 1);
EXPECT_FALSE(alert_manager.hasUnacknowledgedAlerts());
}
// Test case: getActiveAlerts 获取活动预警列表
TEST_F(AlertManagerTest, testGetActiveAlerts) {
alert_manager.triggerSensorFailure(mock_timestamp);
alert_manager.triggerLowBattery(mock_timestamp + 1, 10.0f);
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 2);
EXPECT_EQ(active_alerts[0].type, AlertType::SENSOR_FAILURE);
EXPECT_EQ(active_alerts[1].type, AlertType::LOW_BATTERY);
}
// Test case: getAlertHistory 获取历史记录(最大数量限制)
TEST_F(AlertManagerTest, testGetAlertHistoryMaxCount) {
// Add more than MAX_HISTORY alerts
for (int i = 0; i < 15; ++i) {
alert_manager.triggerSensorFailure(mock_timestamp + i);
}
auto history = alert_manager.getAlertHistory(10);
EXPECT_EQ(history.size(), 10);
EXPECT_EQ(history[0].trigger_time, mock_timestamp + 5);
EXPECT_EQ(history[9].trigger_time, mock_timestamp + 14);
}
// Test case: getStatusDescription 生成系统状态描述
TEST_F(AlertManagerTest, testGetStatusDescription) {
alert_manager.triggerSensorFailure(mock_timestamp);
alert_manager.triggerLowBattery(mock_timestamp + 1, 10.0f);
std::string status_desc = alert_manager.getStatusDescription();
EXPECT_NE(status_desc.find("有2个活动预警"), std::string::npos);
EXPECT_NE(status_desc.find("传感器故障"), std::string::npos);
EXPECT_NE(status_desc.find("低电量警告"), std::string::npos);
}
// Test case: clearHistory 清空历史记录
TEST_F(AlertManagerTest, testClearHistory) {
alert_manager.triggerSensorFailure(mock_timestamp);
alert_manager.clearHistory();
EXPECT_TRUE(alert_manager.getAlertHistory(10).empty());
}
// Test case: addToHistory 添加历史记录并保持最大数量限制
TEST_F(AlertManagerTest, testAddToHistoryLimit) {
const size_t max_history = 5;
for (int i = 0; i < max_history + 1; ++i) {
AlertInfo alert;
alert.type = AlertType::SENSOR_FAILURE;
alert.status = AlertStatus::ACTIVE;
alert.trigger_time = mock_timestamp + i;
alert.description = "Test alert";
alert_manager.addToHistory(alert);
}
auto history = alert_manager.getAlertHistory(max_history);
EXPECT_EQ(history.size(), max_history);
EXPECT_EQ(history[0].trigger_time, mock_timestamp + 1);
EXPECT_EQ(history[max_history - 1].trigger_time, mock_timestamp + max_history);
}
// Test case: triggerAlert 内部方法触发预警
TEST_F(AlertManagerTest, testTriggerAlertInternal) {
alert_manager.triggerAlert(AlertType::ALTITUDE_UPPER, mock_timestamp, "Test description");
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 1);
EXPECT_EQ(active_alerts[0].type, AlertType::ALTITUDE_UPPER);
EXPECT_EQ(active_alerts[0].description, "Test description");
}
// Test case: updateAlertStatus 更新预警状态为已确认
TEST_F(AlertManagerTest, testUpdateAlertStatusAcknowledged) {
alert_manager.triggerSensorFailure(mock_timestamp);
alert_manager.updateAlertStatus(AlertType::SENSOR_FAILURE, AlertStatus::ACKNOWLEDGED, mock_timestamp + 1);
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_TRUE(active_alerts.empty());
auto history = alert_manager.getAlertHistory(10);
EXPECT_EQ(history.size(), 1);
EXPECT_EQ(history[0].status, AlertStatus::ACKNOWLEDGED);
}
// Test case: updateAlertStatus 更新预警状态为已解决
TEST_F(AlertManagerTest, testUpdateAlertStatusResolved) {
alert_manager.triggerSensorFailure(mock_timestamp);
alert_manager.updateAlertStatus(AlertType::SENSOR_FAILURE, AlertStatus::RESOLVED, mock_timestamp + 1);
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_TRUE(active_alerts.empty());
auto history = alert_manager.getAlertHistory(10);
EXPECT_EQ(history.size(), 1);
EXPECT_EQ(history[0].status, AlertStatus::RESOLVED);
}
// Test case: getAlertTypeName 转换预警类型名称
TEST_F(AlertManagerTest, testGetAlertTypeName) {
EXPECT_EQ(alert_manager.getAlertTypeName(AlertType::ALTITUDE_UPPER), "高度上限预警");
EXPECT_EQ(alert_manager.getAlertTypeName(AlertType::SENSOR_FAILURE), "传感器故障");
EXPECT_EQ(alert_manager.getAlertTypeName(AlertType::NONE), "");
}
// Test case: getAlertStatusName 转换预警状态名称
TEST_F(AlertManagerTest, testGetAlertStatusName) {
EXPECT_EQ(alert_manager.getAlertStatusName(AlertStatus::ACTIVE), "预警中");
EXPECT_EQ(alert_manager.getAlertStatusName(AlertStatus::ACKNOWLEDGED), "已确认");
EXPECT_EQ(alert_manager.getAlertStatusName(AlertStatus::RESOLVED), "已解决");
}
// Test case: getUpperThreshold 获取上限阈值
TEST_F(AlertManagerTest, testGetUpperThreshold) {
EXPECT_FLOAT_EQ(alert_manager.getUpperThreshold(), 100.0f);
alert_manager.setAltitudeThresholds(200.0f, -100.0f);
EXPECT_FLOAT_EQ(alert_manager.getUpperThreshold(), 200.0f);
}
// Test case: getLowerThreshold 获取下限阈值
TEST_F(AlertManagerTest, testGetLowerThreshold) {
EXPECT_FLOAT_EQ(alert_manager.getLowerThreshold(), -50.0f);
alert_manager.setAltitudeThresholds(200.0f, -100.0f);
EXPECT_FLOAT_EQ(alert_manager.getLowerThreshold(), -100.0f);
}