CppGenerate/tests/test_alert_manager.cpp

289 lines
12 KiB
C++
Raw 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 for deterministic testing
static uint32_t mock_timestamp = 1640995200; // 2022-01-01 00:00:00 UTC
// Mock function to replace std::time
uint32_t get_mock_time() {
return mock_timestamp;
}
// Override the global time function in AlertManager
namespace {
uint32_t mock_time() { return 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 advance_time(uint32_t seconds) {
mock_timestamp += seconds;
}
};
// Test case: AlertManager constructor initializes thresholds and clears lists
TEST_F(AlertManagerTest, testAlertManagerInitialization) {
EXPECT_FLOAT_EQ(alert_manager.getAltitudeThresholds().first, 100.0f);
EXPECT_FLOAT_EQ(alert_manager.getAltitudeThresholds().second, -50.0f);
EXPECT_TRUE(alert_manager.getActiveAlerts().empty());
EXPECT_TRUE(alert_manager.getAlertHistory(10).empty());
}
// Test case: Destructor does not require explicit cleanup
TEST_F(AlertManagerTest, testAlertManagerDestructor) {
// No assertion needed as destructor is empty
// This ensures no memory leaks or crashes
}
// Test case: initialize outputs correct messages
TEST_F(AlertManagerTest, testInitializeOutput) {
// We cannot directly capture stdout in gtest without external tools,
// but we can verify that initialization logic runs without crash.
// The actual output is tested via integration.
EXPECT_NO_FATAL_FAILURE(alert_manager.initialize());
}
// Test case: checkAltitudeAlert triggers upper threshold alert
TEST_F(AlertManagerTest, testCheckAltitudeAlertUpperThreshold) {
float altitude = 101.0f;
alert_manager.checkAltitudeAlert(altitude, mock_timestamp);
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_FALSE(active_alerts.empty());
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 resolves upper threshold when altitude normalizes
TEST_F(AlertManagerTest, testCheckAltitudeAlertResolveUpper) {
float altitude = 101.0f;
alert_manager.checkAltitudeAlert(altitude, mock_timestamp);
EXPECT_TRUE(alert_manager.hasActiveAlerts());
altitude = 99.0f;
alert_manager.checkAltitudeAlert(altitude, mock_timestamp + 1);
EXPECT_FALSE(alert_manager.hasActiveAlerts());
}
// Test case: checkAltitudeAlert triggers lower threshold alert
TEST_F(AlertManagerTest, testCheckAltitudeAlertLowerThreshold) {
float altitude = -51.0f;
alert_manager.checkAltitudeAlert(altitude, mock_timestamp);
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_FALSE(active_alerts.empty());
EXPECT_EQ(active_alerts[0].type, AlertType::ALTITUDE_LOWER);
EXPECT_EQ(active_alerts[0].status, AlertStatus::ACTIVE);
}
// Test case: checkAltitudeAlert resolves lower threshold when altitude normalizes
TEST_F(AlertManagerTest, testCheckAltitudeAlertResolveLower) {
float altitude = -51.0f;
alert_manager.checkAltitudeAlert(altitude, mock_timestamp);
EXPECT_TRUE(alert_manager.hasActiveAlerts());
altitude = -49.0f;
alert_manager.checkAltitudeAlert(altitude, mock_timestamp + 1);
EXPECT_FALSE(alert_manager.hasActiveAlerts());
}
// Test case: setAltitudeThresholds validates input
TEST_F(AlertManagerTest, testSetAltitudeThresholdsInvalidInput) {
EXPECT_NO_FATAL_FAILURE(alert_manager.setAltitudeThresholds(50.0f, 100.0f));
EXPECT_FLOAT_EQ(alert_manager.getAltitudeThresholds().first, 100.0f);
EXPECT_FLOAT_EQ(alert_manager.getAltitudeThresholds().second, -50.0f);
}
// Test case: setAltitudeThresholds updates valid thresholds
TEST_F(AlertManagerTest, testSetAltitudeThresholdsValidInput) {
alert_manager.setAltitudeThresholds(200.0f, -100.0f);
EXPECT_FLOAT_EQ(alert_manager.getAltitudeThresholds().first, 200.0f);
EXPECT_FLOAT_EQ(alert_manager.getAltitudeThresholds().second, -100.0f);
}
// Test case: triggerSensorFailure creates correct alert
TEST_F(AlertManagerTest, testTriggerSensorFailure) {
alert_manager.triggerSensorFailure(mock_timestamp);
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_FALSE(active_alerts.empty());
EXPECT_EQ(active_alerts[0].type, AlertType::SENSOR_FAILURE);
EXPECT_EQ(active_alerts[0].description, "传感器故障");
}
// Test case: triggerLowBattery creates correct alert with battery level
TEST_F(AlertManagerTest, testTriggerLowBattery) {
alert_manager.triggerLowBattery(mock_timestamp, 15.5f);
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_FALSE(active_alerts.empty());
EXPECT_EQ(active_alerts[0].type, AlertType::LOW_BATTERY);
EXPECT_EQ(active_alerts[0].description, "低电量警告当前电量15.5%");
}
// Test case: triggerCommunicationError creates correct alert
TEST_F(AlertManagerTest, testTriggerCommunicationError) {
alert_manager.triggerCommunicationError(mock_timestamp);
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_FALSE(active_alerts.empty());
EXPECT_EQ(active_alerts[0].type, AlertType::COMMUNICATION_ERROR);
EXPECT_EQ(active_alerts[0].description, "通信错误");
}
// Test case: acknowledgeAllAlerts marks all active alerts as acknowledged
TEST_F(AlertManagerTest, testAcknowledgeAllAlerts) {
alert_manager.triggerSensorFailure(mock_timestamp);
alert_manager.triggerLowBattery(mock_timestamp + 1, 10.0f);
EXPECT_TRUE(alert_manager.hasActiveAlerts());
alert_manager.acknowledgeAllAlerts(mock_timestamp + 2);
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_TRUE(active_alerts.empty());
EXPECT_FALSE(alert_manager.hasUnacknowledgedAlerts());
}
// Test case: acknowledgeAlert acknowledges specific alert
TEST_F(AlertManagerTest, testAcknowledgeAlert) {
alert_manager.triggerSensorFailure(mock_timestamp);
EXPECT_TRUE(alert_manager.hasActiveAlerts());
alert_manager.acknowledgeAlert(AlertType::SENSOR_FAILURE, mock_timestamp + 1);
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_TRUE(active_alerts.empty());
}
// Test case: resetAlert removes specified alert
TEST_F(AlertManagerTest, testResetAlert) {
alert_manager.triggerSensorFailure(mock_timestamp);
EXPECT_TRUE(alert_manager.hasActiveAlerts());
alert_manager.resetAlert(AlertType::SENSOR_FAILURE);
EXPECT_FALSE(alert_manager.hasActiveAlerts());
}
// Test case: resetAllAlerts clears all alerts
TEST_F(AlertManagerTest, testResetAllAlerts) {
alert_manager.triggerSensorFailure(mock_timestamp);
alert_manager.triggerLowBattery(mock_timestamp + 1, 10.0f);
EXPECT_TRUE(alert_manager.hasActiveAlerts());
alert_manager.resetAllAlerts();
EXPECT_FALSE(alert_manager.hasActiveAlerts());
}
// Test case: hasActiveAlerts returns true if any alert is active
TEST_F(AlertManagerTest, testHasActiveAlertsTrue) {
alert_manager.triggerSensorFailure(mock_timestamp);
EXPECT_TRUE(alert_manager.hasActiveAlerts());
}
// Test case: hasActiveAlerts returns false if no alert is active
TEST_F(AlertManagerTest, testHasActiveAlertsFalse) {
EXPECT_FALSE(alert_manager.hasActiveAlerts());
}
// Test case: hasUnacknowledgedAlerts returns true if any active alert exists
TEST_F(AlertManagerTest, testHasUnacknowledgedAlertsTrue) {
alert_manager.triggerSensorFailure(mock_timestamp);
EXPECT_TRUE(alert_manager.hasUnacknowledgedAlerts());
}
// Test case: hasUnacknowledgedAlerts returns false after acknowledgment
TEST_F(AlertManagerTest, testHasUnacknowledgedAlertsFalseAfterAck) {
alert_manager.triggerSensorFailure(mock_timestamp);
alert_manager.acknowledgeAllAlerts(mock_timestamp + 1);
EXPECT_FALSE(alert_manager.hasUnacknowledgedAlerts());
}
// Test case: getActiveAlerts returns correct list of active alerts
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 returns recent entries
TEST_F(AlertManagerTest, testGetAlertHistory) {
alert_manager.triggerSensorFailure(mock_timestamp);
alert_manager.triggerLowBattery(mock_timestamp + 1, 10.0f);
alert_manager.triggerCommunicationError(mock_timestamp + 2);
auto history = alert_manager.getAlertHistory(2);
EXPECT_EQ(history.size(), 2);
EXPECT_EQ(history[0].type, AlertType::LOW_BATTERY);
EXPECT_EQ(history[1].type, AlertType::COMMUNICATION_ERROR);
}
// Test case: getStatusDescription generates correct string for active alerts
TEST_F(AlertManagerTest, testGetStatusDescriptionWithActiveAlerts) {
alert_manager.triggerSensorFailure(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: getStatusDescription returns normal state when no alerts
TEST_F(AlertManagerTest, testGetStatusDescriptionNormalState) {
std::string status_desc = alert_manager.getStatusDescription();
EXPECT_EQ(status_desc, "系统状态:正常");
}
// Test case: clearHistory clears all history
TEST_F(AlertManagerTest, testClearHistory) {
alert_manager.triggerSensorFailure(mock_timestamp);
alert_manager.clearHistory();
EXPECT_TRUE(alert_manager.getAlertHistory(10).empty());
}
// Test case: addToHistory limits history size
TEST_F(AlertManagerTest, testAddToHistoryLimit) {
const size_t MAX_HISTORY = 5;
for (int i = 0; i < MAX_HISTORY + 1; ++i) {
alert_manager.triggerSensorFailure(mock_timestamp + i);
}
auto history = alert_manager.getAlertHistory(MAX_HISTORY);
EXPECT_EQ(history.size(), MAX_HISTORY);
EXPECT_EQ(history[0].type, AlertType::SENSOR_FAILURE);
}
// Test case: triggerAlert creates new alert and adds to history
TEST_F(AlertManagerTest, testTriggerAlert) {
alert_manager.triggerAlert(AlertType::ALTITUDE_UPPER, mock_timestamp, "Test alert");
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_FALSE(active_alerts.empty());
EXPECT_EQ(active_alerts[0].description, "Test alert");
}
// Test case: updateAlertStatus changes status correctly
TEST_F(AlertManagerTest, testUpdateAlertStatus) {
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());
}
// Test case: getAlertTypeName returns correct string
TEST_F(AlertManagerTest, testGetAlertTypeName) {
EXPECT_EQ(alert_manager.getAlertTypeName(AlertType::ALTITUDE_UPPER), "高度上限预警");
EXPECT_EQ(alert_manager.getAlertTypeName(AlertType::NONE), "");
EXPECT_EQ(alert_manager.getAlertTypeName(static_cast<AlertType>(99)), "未知预警");
}
// Test case: getAlertStatusName returns correct string
TEST_F(AlertManagerTest, testGetAlertStatusName) {
EXPECT_EQ(alert_manager.getAlertStatusName(AlertStatus::ACTIVE), "预警中");
EXPECT_EQ(alert_manager.getAlertStatusName(AlertStatus::RESOLVED), "已解决");
EXPECT_EQ(alert_manager.getAlertStatusName(static_cast<AlertStatus>(99)), "未知状态");
}