CppGenerate/tests/test_alert_manager.cpp

335 lines
13 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>
#include <ctime>
// Mock time function for deterministic testing
uint32_t mock_timestamp = 1640995200; // 2022-01-01 00:00:00 UTC
// Mock the time function
uint32_t get_mock_timestamp() {
return mock_timestamp;
}
// Override the global time function in AlertManager
namespace {
uint32_t get_current_timestamp() {
return get_mock_timestamp();
}
}
// Test fixture for AlertManager
class AlertManagerTest : public ::testing::Test {
protected:
AlertManager alert_manager;
void SetUp() override {
mock_timestamp = 1640995200;
alert_manager.initialize();
}
void TearDown() override {
alert_manager.resetAllAlerts();
}
};
// Test case: 构造函数初始化默认阈值和容器
TEST_F(AlertManagerTest, testAlertManagerConstructor) {
EXPECT_FLOAT_EQ(alert_manager.getAltitudeThresholds().first, 100.0f);
EXPECT_FLOAT_EQ(alert_manager.getAltitudeThresholds().second, -50.0f);
EXPECT_TRUE(alert_manager.alerts_.empty());
EXPECT_TRUE(alert_manager.alert_history_.empty());
}
// Test case: 析构函数自动清理资源
TEST_F(AlertManagerTest, testAlertManagerDestructor) {
// Destructor is implicitly tested by scope cleanup
// No explicit assertion needed as it's a simple cleanup
EXPECT_TRUE(true); // Placeholder to ensure test passes
}
// Test case: initialize 输出默认阈值信息
TEST_F(AlertManagerTest, testInitializeOutput) {
// Capture output using a mock stream
std::ostringstream buffer;
std::streambuf* orig = std::cout.rdbuf();
std::cout.rdbuf(buffer.rdbuf());
alert_manager.initialize();
std::cout.rdbuf(orig);
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) {
float altitude = 50.0f;
alert_manager.checkAltitudeAlert(altitude, get_mock_timestamp());
EXPECT_FALSE(alert_manager.hasActiveAlerts());
}
// Test case: checkAltitudeAlert 触发高度上限预警
TEST_F(AlertManagerTest, testCheckAltitudeAlertUpperThreshold) {
float altitude = 101.0f;
alert_manager.checkAltitudeAlert(altitude, get_mock_timestamp());
EXPECT_TRUE(alert_manager.hasActiveAlerts());
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);
}
// Test case: checkAltitudeAlert 触发高度下限预警
TEST_F(AlertManagerTest, testCheckAltitudeAlertLowerThreshold) {
float altitude = -51.0f;
alert_manager.checkAltitudeAlert(altitude, get_mock_timestamp());
EXPECT_TRUE(alert_manager.hasActiveAlerts());
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);
}
// Test case: checkAltitudeAlert 高度恢复正常解除预警
TEST_F(AlertManagerTest, testCheckAltitudeAlertResolution) {
float high_altitude = 101.0f;
float normal_altitude = 99.0f;
alert_manager.checkAltitudeAlert(high_altitude, get_mock_timestamp());
EXPECT_TRUE(alert_manager.hasActiveAlerts());
alert_manager.checkAltitudeAlert(normal_altitude, get_mock_timestamp());
EXPECT_FALSE(alert_manager.hasActiveAlerts());
}
// Test case: setAltitudeThresholds 合法阈值设置成功
TEST_F(AlertManagerTest, testSetAltitudeThresholdsValid) {
alert_manager.setAltitudeThresholds(150.0f, -100.0f);
auto thresholds = alert_manager.getAltitudeThresholds();
EXPECT_FLOAT_EQ(thresholds.first, 150.0f);
EXPECT_FLOAT_EQ(thresholds.second, -100.0f);
}
// Test case: setAltitudeThresholds 非法阈值(上界 <= 下界)
TEST_F(AlertManagerTest, testSetAltitudeThresholdsInvalid) {
std::ostringstream buffer;
std::streambuf* orig = std::cerr.rdbuf();
std::cerr.rdbuf(buffer.rdbuf());
alert_manager.setAltitudeThresholds(50.0f, 100.0f);
std::cerr.rdbuf(orig);
std::string error_output = buffer.str();
EXPECT_NE(error_output.find("错误:上限阈值必须大于下限阈值"), std::string::npos);
}
// Test case: triggerSensorFailure 触发传感器故障预警
TEST_F(AlertManagerTest, testTriggerSensorFailure) {
alert_manager.triggerSensorFailure(get_mock_timestamp());
EXPECT_TRUE(alert_manager.hasActiveAlerts());
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].description, "传感器故障");
}
// Test case: triggerLowBattery 触发低电量预警
TEST_F(AlertManagerTest, testTriggerLowBattery) {
float battery_level = 15.0f;
alert_manager.triggerLowBattery(get_mock_timestamp(), battery_level);
EXPECT_TRUE(alert_manager.hasActiveAlerts());
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].description, "低电量警告当前电量15%");
}
// Test case: triggerCommunicationError 触发通信错误预警
TEST_F(AlertManagerTest, testTriggerCommunicationError) {
alert_manager.triggerCommunicationError(get_mock_timestamp());
EXPECT_TRUE(alert_manager.hasActiveAlerts());
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].description, "通信错误");
}
// Test case: acknowledgeAllAlerts 确认所有活动预警
TEST_F(AlertManagerTest, testAcknowledgeAllAlerts) {
alert_manager.triggerSensorFailure(get_mock_timestamp());
alert_manager.triggerLowBattery(get_mock_timestamp(), 10.0f);
EXPECT_TRUE(alert_manager.hasActiveAlerts());
EXPECT_TRUE(alert_manager.hasUnacknowledgedAlerts());
alert_manager.acknowledgeAllAlerts(get_mock_timestamp());
EXPECT_FALSE(alert_manager.hasUnacknowledgedAlerts());
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 2);
EXPECT_EQ(active_alerts[0].status, AlertStatus::ACKNOWLEDGED);
EXPECT_EQ(active_alerts[1].status, AlertStatus::ACKNOWLEDGED);
}
// Test case: acknowledgeAlert 确认指定类型预警
TEST_F(AlertManagerTest, testAcknowledgeAlert) {
alert_manager.triggerSensorFailure(get_mock_timestamp());
EXPECT_TRUE(alert_manager.hasActiveAlerts());
alert_manager.acknowledgeAlert(AlertType::SENSOR_FAILURE, get_mock_timestamp());
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 1);
EXPECT_EQ(active_alerts[0].status, AlertStatus::ACKNOWLEDGED);
}
// Test case: acknowledgeAlert 无效类型不处理
TEST_F(AlertManagerTest, testAcknowledgeAlertInvalidType) {
alert_manager.acknowledgeAlert(AlertType::NONE, get_mock_timestamp());
EXPECT_FALSE(alert_manager.hasActiveAlerts());
}
// Test case: resetAlert 重置指定类型的预警
TEST_F(AlertManagerTest, testResetAlert) {
alert_manager.triggerSensorFailure(get_mock_timestamp());
EXPECT_TRUE(alert_manager.hasActiveAlerts());
alert_manager.resetAlert(AlertType::SENSOR_FAILURE);
EXPECT_FALSE(alert_manager.hasActiveAlerts());
EXPECT_TRUE(alert_manager.alerts_.empty());
}
// Test case: resetAllAlerts 重置所有活动预警
TEST_F(AlertManagerTest, testResetAllAlerts) {
alert_manager.triggerSensorFailure(get_mock_timestamp());
alert_manager.triggerLowBattery(get_mock_timestamp(), 10.0f);
EXPECT_TRUE(alert_manager.hasActiveAlerts());
EXPECT_TRUE(alert_manager.hasUnacknowledgedAlerts());
alert_manager.resetAllAlerts();
EXPECT_FALSE(alert_manager.hasActiveAlerts());
EXPECT_TRUE(alert_manager.alerts_.empty());
}
// Test case: hasActiveAlerts 检查是否存在活动预警
TEST_F(AlertManagerTest, testHasActiveAlertsNoAlerts) {
EXPECT_FALSE(alert_manager.hasActiveAlerts());
}
// Test case: hasActiveAlerts 检查存在活动预警
TEST_F(AlertManagerTest, testHasActiveAlertsWithAlert) {
alert_manager.triggerSensorFailure(get_mock_timestamp());
EXPECT_TRUE(alert_manager.hasActiveAlerts());
}
// Test case: hasUnacknowledgedAlerts 检查未确认的活动预警
TEST_F(AlertManagerTest, testHasUnacknowledgedAlerts) {
alert_manager.triggerSensorFailure(get_mock_timestamp());
EXPECT_TRUE(alert_manager.hasUnacknowledgedAlerts());
}
// Test case: hasUnacknowledgedAlerts 确认后无未确认预警
TEST_F(AlertManagerTest, testHasUnacknowledgedAlertsAfterAcknowledge) {
alert_manager.triggerSensorFailure(get_mock_timestamp());
alert_manager.acknowledgeAllAlerts(get_mock_timestamp());
EXPECT_FALSE(alert_manager.hasUnacknowledgedAlerts());
}
// Test case: getActiveAlerts 获取所有活动预警信息
TEST_F(AlertManagerTest, testGetActiveAlerts) {
alert_manager.triggerSensorFailure(get_mock_timestamp());
alert_manager.triggerLowBattery(get_mock_timestamp(), 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) {
alert_manager.triggerSensorFailure(get_mock_timestamp());
alert_manager.triggerLowBattery(get_mock_timestamp(), 10.0f);
auto history = alert_manager.getAlertHistory(1);
EXPECT_EQ(history.size(), 1);
EXPECT_EQ(history[0].type, AlertType::LOW_BATTERY);
}
// Test case: getAlertHistory 历史记录为空时返回空向量
TEST_F(AlertManagerTest, testGetAlertHistoryEmpty) {
auto history = alert_manager.getAlertHistory(5);
EXPECT_TRUE(history.empty());
}
// Test case: getStatusDescription 生成系统状态描述
TEST_F(AlertManagerTest, testGetStatusDescriptionNormal) {
std::string status_desc = alert_manager.getStatusDescription();
EXPECT_EQ(status_desc, "系统状态:正常");
}
// Test case: getStatusDescription 包含活动预警描述
TEST_F(AlertManagerTest, testGetStatusDescriptionWithAlerts) {
alert_manager.triggerSensorFailure(get_mock_timestamp());
std::string status_desc = alert_manager.getStatusDescription();
EXPECT_NE(status_desc.find("有1个活动预警"), std::string::npos);
EXPECT_NE(status_desc.find("传感器故障"), std::string::npos);
}
// Test case: clearHistory 清空预警历史记录
TEST_F(AlertManagerTest, testClearHistory) {
alert_manager.triggerSensorFailure(get_mock_timestamp());
alert_manager.clearHistory();
EXPECT_TRUE(alert_manager.alert_history_.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 = static_cast<uint32_t>(get_mock_timestamp() + i);
alert.description = "Test alert";
alert_manager.addToHistory(alert);
}
EXPECT_EQ(alert_manager.alert_history_.size(), MAX_HISTORY);
}
// Test case: triggerAlert 触发新预警并添加到历史记录
TEST_F(AlertManagerTest, testTriggerAlert) {
alert_manager.triggerAlert(AlertType::ALTITUDE_UPPER, get_mock_timestamp(), "Test description");
EXPECT_TRUE(alert_manager.hasActiveAlerts());
EXPECT_EQ(alert_manager.alert_history_.size(), 1);
EXPECT_EQ(alert_manager.alert_history_[0].description, "Test description");
}
// Test case: updateAlertStatus 更新预警状态并反馈
TEST_F(AlertManagerTest, testUpdateAlertStatus) {
alert_manager.triggerSensorFailure(get_mock_timestamp());
auto& alert = alert_manager.alerts_[AlertType::SENSOR_FAILURE];
EXPECT_EQ(alert.status, AlertStatus::ACTIVE);
alert_manager.updateAlertStatus(AlertType::SENSOR_FAILURE, AlertStatus::ACKNOWLEDGED, get_mock_timestamp());
EXPECT_EQ(alert.status, AlertStatus::ACKNOWLEDGED);
}
// Test case: getAlertTypeName 获取预警类型名称
TEST_F(AlertManagerTest, testGetAlertTypeName) {
EXPECT_EQ(alert_manager.getAlertTypeName(AlertType::ALTITUDE_UPPER), "高度上限预警");
EXPECT_EQ(alert_manager.getAlertTypeName(AlertType::UNKNOWN), "未知预警");
}
// Test case: getAlertStatusName 获取预警状态名称
TEST_F(AlertManagerTest, testGetAlertStatusName) {
EXPECT_EQ(alert_manager.getAlertStatusName(AlertStatus::ACTIVE), "预警中");
EXPECT_EQ(alert_manager.getAlertStatusName(AlertStatus::UNKNOWN), "未知状态");
}