CppGenerate/tests/test_alert_manager.cpp

582 lines
20 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>
using namespace std;
// 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 getMockTime() {
return mock_timestamp;
}
// Override the global time function in AlertManager
void setMockTime(uint32_t time) {
mock_timestamp = time;
}
// Test fixture for AlertManager
class AlertManagerTest : public ::testing::Test {
protected:
AlertManager alert_manager;
void SetUp() override {
// Reset mock timestamp before each test
mock_timestamp = 1640995200;
alert_manager.initialize();
}
void TearDown() override {
// Clear any remaining alerts
alert_manager.resetAllAlerts();
}
};
// Test checkAltitudeAlert - Normal Input
TEST_F(AlertManagerTest, testCheckAltitudeAlertNormalInput) {
// Given: Altitude within normal range
float altitude = 80.0f;
uint32_t timestamp = getMockTime();
// When: Check altitude alert
alert_manager.checkAltitudeAlert(altitude, timestamp);
// Then: No alert should be triggered
EXPECT_FALSE(alert_manager.hasActiveAlerts());
}
// Test checkAltitudeAlert - Upper Threshold Exceeded
TEST_F(AlertManagerTest, testCheckAltitudeAlertUpperThresholdExceeded) {
// Given: Altitude exceeds upper threshold
float altitude = 101.0f; // Above default 100.0f
uint32_t timestamp = getMockTime();
// When: Check altitude alert
alert_manager.checkAltitudeAlert(altitude, timestamp);
// Then: Upper altitude alert should be active
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 checkAltitudeAlert - Lower Threshold Exceeded
TEST_F(AlertManagerTest, testCheckAltitudeAlertLowerThresholdExceeded) {
// Given: Altitude below lower threshold
float altitude = -51.0f; // Below default -50.0f
uint32_t timestamp = getMockTime();
// When: Check altitude alert
alert_manager.checkAltitudeAlert(altitude, timestamp);
// Then: Lower altitude alert should be active
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 checkAltitudeAlert - Recovery from Upper Threshold
TEST_F(AlertManagerTest, testCheckAltitudeAlertRecoveryFromUpperThreshold) {
// Given: Initially exceed upper threshold
float altitude = 101.0f;
uint32_t timestamp = getMockTime();
alert_manager.checkAltitudeAlert(altitude, timestamp);
// When: Return to normal range
altitude = 99.0f;
alert_manager.checkAltitudeAlert(altitude, timestamp + 1);
// Then: Alert should be resolved
EXPECT_FALSE(alert_manager.hasActiveAlerts());
EXPECT_FALSE(alert_manager.hasUnacknowledgedAlerts());
}
// Test checkAltitudeAlert - Recovery from Lower Threshold
TEST_F(AlertManagerTest, testCheckAltitudeAlertRecoveryFromLowerThreshold) {
// Given: Initially below lower threshold
float altitude = -51.0f;
uint32_t timestamp = getMockTime();
alert_manager.checkAltitudeAlert(altitude, timestamp);
// When: Return to normal range
altitude = -49.0f;
alert_manager.checkAltitudeAlert(altitude, timestamp + 1);
// Then: Alert should be resolved
EXPECT_FALSE(alert_manager.hasActiveAlerts());
EXPECT_FALSE(alert_manager.hasUnacknowledgedAlerts());
}
// Test setAltitudeThresholds - Valid Thresholds
TEST_F(AlertManagerTest, testSetAltitudeThresholdsValidThresholds) {
// Given: Valid upper and lower thresholds
float upper = 150.0f;
float lower = -100.0f;
// When: Set thresholds
alert_manager.setAltitudeThresholds(upper, lower);
// Then: Thresholds should be updated
EXPECT_EQ(alert_manager.getAltitudeThresholds().first, upper);
EXPECT_EQ(alert_manager.getAltitudeThresholds().second, lower);
}
// Test setAltitudeThresholds - Invalid Thresholds (upper <= lower)
TEST_F(AlertManagerTest, testSetAltitudeThresholdsInvalidThresholds) {
// Given: Invalid thresholds
float upper = 50.0f;
float lower = 100.0f;
// When: Set thresholds
alert_manager.setAltitudeThresholds(upper, lower);
// Then: Should not update and print error
EXPECT_EQ(alert_manager.getAltitudeThresholds().first, 100.0f);
EXPECT_EQ(alert_manager.getAltitudeThresholds().second, -50.0f);
}
// Test triggerSensorFailure - Normal Trigger
TEST_F(AlertManagerTest, testTriggerSensorFailureNormalTrigger) {
// Given: Timestamp
uint32_t timestamp = getMockTime();
// When: Trigger sensor failure
alert_manager.triggerSensorFailure(timestamp);
// Then: Sensor failure alert should be active
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].status, AlertStatus::ACTIVE);
EXPECT_EQ(active_alerts[0].description, "传感器故障");
}
// Test triggerLowBattery - Normal Trigger
TEST_F(AlertManagerTest, testTriggerLowBatteryNormalTrigger) {
// Given: Timestamp and battery level
uint32_t timestamp = getMockTime();
float battery_level = 15.0f;
// When: Trigger low battery
alert_manager.triggerLowBattery(timestamp, battery_level);
// Then: Low battery alert should be active
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].status, AlertStatus::ACTIVE);
EXPECT_EQ(active_alerts[0].description, "低电量警告当前电量15%") << "Description mismatch";
}
// Test triggerCommunicationError - Normal Trigger
TEST_F(AlertManagerTest, testTriggerCommunicationErrorNormalTrigger) {
// Given: Timestamp
uint32_t timestamp = getMockTime();
// When: Trigger communication error
alert_manager.triggerCommunicationError(timestamp);
// Then: Communication error alert should be active
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].status, AlertStatus::ACTIVE);
EXPECT_EQ(active_alerts[0].description, "通信错误");
}
// Test acknowledgeAllAlerts - Acknowledge All Active Alerts
TEST_F(AlertManagerTest, testAcknowledgeAllAlertsAcknowledgeAllActiveAlerts) {
// Given: Multiple active alerts
uint32_t timestamp = getMockTime();
alert_manager.triggerSensorFailure(timestamp);
alert_manager.triggerLowBattery(timestamp + 1, 10.0f);
// When: Acknowledge all alerts
alert_manager.acknowledgeAllAlerts(timestamp + 2);
// Then: All alerts should be acknowledged
EXPECT_FALSE(alert_manager.hasActiveAlerts());
EXPECT_FALSE(alert_manager.hasUnacknowledgedAlerts());
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 0);
}
// Test acknowledgeAlert - Acknowledge Specific Alert
TEST_F(AlertManagerTest, testAcknowledgeAlertAcknowledgeSpecificAlert) {
// Given: One active alert
uint32_t timestamp = getMockTime();
alert_manager.triggerSensorFailure(timestamp);
// When: Acknowledge specific alert
alert_manager.acknowledgeAlert(AlertType::SENSOR_FAILURE, timestamp + 1);
// Then: Alert should be acknowledged
EXPECT_FALSE(alert_manager.hasActiveAlerts());
EXPECT_FALSE(alert_manager.hasUnacknowledgedAlerts());
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 0);
}
// Test acknowledgeAlert - Try to Acknowledge Non-Existing Alert
TEST_F(AlertManagerTest, testAcknowledgeAlertTryToAcknowledgeNonExistingAlert) {
// Given: No existing alert
uint32_t timestamp = getMockTime();
// When: Acknowledge non-existing alert
alert_manager.acknowledgeAlert(AlertType::ALTITUDE_UPPER, timestamp);
// Then: No change in state
EXPECT_FALSE(alert_manager.hasActiveAlerts());
EXPECT_FALSE(alert_manager.hasUnacknowledgedAlerts());
}
// Test resetAlert - Reset Existing Alert
TEST_F(AlertManagerTest, testResetAlertResetExistingAlert) {
// Given: An active alert
uint32_t timestamp = getMockTime();
alert_manager.triggerSensorFailure(timestamp);
// When: Reset the alert
alert_manager.resetAlert(AlertType::SENSOR_FAILURE);
// Then: Alert should be gone
EXPECT_FALSE(alert_manager.hasActiveAlerts());
EXPECT_FALSE(alert_manager.hasUnacknowledgedAlerts());
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 0);
}
// Test resetAlert - Reset Non-Existing Alert
TEST_F(AlertManagerTest, testResetAlertResetNonExistingAlert) {
// Given: No existing alert
// When: Reset non-existing alert
alert_manager.resetAlert(AlertType::ALTITUDE_UPPER);
// Then: No effect
EXPECT_FALSE(alert_manager.hasActiveAlerts());
EXPECT_FALSE(alert_manager.hasUnacknowledgedAlerts());
}
// Test resetAllAlerts - Reset All Alerts
TEST_F(AlertManagerTest, testResetAllAlertsResetAllAlerts) {
// Given: Multiple active alerts
uint32_t timestamp = getMockTime();
alert_manager.triggerSensorFailure(timestamp);
alert_manager.triggerLowBattery(timestamp + 1, 10.0f);
// When: Reset all alerts
alert_manager.resetAllAlerts();
// Then: All alerts should be cleared
EXPECT_FALSE(alert_manager.hasActiveAlerts());
EXPECT_FALSE(alert_manager.hasUnacknowledgedAlerts());
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 0);
}
// Test hasActiveAlerts - No Active Alerts
TEST_F(AlertManagerTest, testHasActiveAlertsNoActiveAlerts) {
// Given: No active alerts
// When: Check for active alerts
bool result = alert_manager.hasActiveAlerts();
// Then: Should return false
EXPECT_FALSE(result);
}
// Test hasActiveAlerts - With Active Alerts
TEST_F(AlertManagerTest, testHasActiveAlertsWithActiveAlerts) {
// Given: One active alert
uint32_t timestamp = getMockTime();
alert_manager.triggerSensorFailure(timestamp);
// When: Check for active alerts
bool result = alert_manager.hasActiveAlerts();
// Then: Should return true
EXPECT_TRUE(result);
}
// Test hasUnacknowledgedAlerts - No Unacknowledged Alerts
TEST_F(AlertManagerTest, testHasUnacknowledgedAlertsNoUnacknowledgedAlerts) {
// Given: No unacknowledged alerts
// When: Check for unacknowledged alerts
bool result = alert_manager.hasUnacknowledgedAlerts();
// Then: Should return false
EXPECT_FALSE(result);
}
// Test hasUnacknowledgedAlerts - With Unacknowledged Alerts
TEST_F(AlertManagerTest, testHasUnacknowledgedAlertsWithUnacknowledgedAlerts) {
// Given: One active alert
uint32_t timestamp = getMockTime();
alert_manager.triggerSensorFailure(timestamp);
// When: Check for unacknowledged alerts
bool result = alert_manager.hasUnacknowledgedAlerts();
// Then: Should return true
EXPECT_TRUE(result);
}
// Test getActiveAlerts - Empty List
TEST_F(AlertManagerTest, testGetActiveAlertsEmptyList) {
// Given: No active alerts
// When: Get active alerts
auto alerts = alert_manager.getActiveAlerts();
// Then: Should return empty vector
EXPECT_EQ(alerts.size(), 0);
}
// Test getActiveAlerts - With Active Alerts
TEST_F(AlertManagerTest, testGetActiveAlertsWithActiveAlerts) {
// Given: One active alert
uint32_t timestamp = getMockTime();
alert_manager.triggerSensorFailure(timestamp);
// When: Get active alerts
auto alerts = alert_manager.getActiveAlerts();
// Then: Should return one alert
EXPECT_EQ(alerts.size(), 1);
EXPECT_EQ(alerts[0].type, AlertType::SENSOR_FAILURE);
EXPECT_EQ(alerts[0].status, AlertStatus::ACTIVE);
}
// Test getAlertHistory - Max Count Greater Than History Size
TEST_F(AlertManagerTest, testGetAlertHistoryMaxCountGreaterThanHistorySize) {
// Given: Add multiple alerts
uint32_t timestamp = getMockTime();
alert_manager.triggerSensorFailure(timestamp);
alert_manager.triggerLowBattery(timestamp + 1, 10.0f);
alert_manager.triggerCommunicationError(timestamp + 2);
// When: Get history with max count larger than size
auto history = alert_manager.getAlertHistory(10);
// Then: Should return all history entries
EXPECT_EQ(history.size(), 3);
}
// Test getAlertHistory - Max Count Less Than History Size
TEST_F(AlertManagerTest, testGetAlertHistoryMaxCountLessThanHistorySize) {
// Given: Add more alerts than max count
uint32_t timestamp = getMockTime();
alert_manager.triggerSensorFailure(timestamp);
alert_manager.triggerLowBattery(timestamp + 1, 10.0f);
alert_manager.triggerCommunicationError(timestamp + 2);
// When: Get history with smaller max count
auto history = alert_manager.getAlertHistory(2);
// Then: Should return only last 2 entries
EXPECT_EQ(history.size(), 2);
EXPECT_EQ(history[0].type, AlertType::LOW_BATTERY);
EXPECT_EQ(history[1].type, AlertType::COMMUNICATION_ERROR);
}
// Test getAlertHistory - Empty History
TEST_F(AlertManagerTest, testGetAlertHistoryEmptyHistory) {
// Given: No history entries
// When: Get history
auto history = alert_manager.getAlertHistory(5);
// Then: Should return empty vector
EXPECT_EQ(history.size(), 0);
}
// Test getStatusDescription - No Active Alerts
TEST_F(AlertManagerTest, testGetStatusDescriptionNoActiveAlerts) {
// Given: No active alerts
// When: Get status description
string description = alert_manager.getStatusDescription();
// Then: Should indicate system is normal
EXPECT_EQ(description, "系统状态:正常");
}
// Test getStatusDescription - With Active Alerts
TEST_F(AlertManagerTest, testGetStatusDescriptionWithActiveAlerts) {
// Given: One active alert
uint32_t timestamp = getMockTime();
alert_manager.triggerSensorFailure(timestamp);
// When: Get status description
string description = alert_manager.getStatusDescription();
// Then: Should include alert details
EXPECT_NE(description.find("系统状态有1个活动预警"), string::npos);
EXPECT_NE(description.find("传感器故障"), string::npos);
}
// Test clearHistory - Clear All History
TEST_F(AlertManagerTest, testClearHistoryClearAllHistory) {
// Given: Add some history entries
uint32_t timestamp = getMockTime();
alert_manager.triggerSensorFailure(timestamp);
alert_manager.triggerLowBattery(timestamp + 1, 10.0f);
// When: Clear history
alert_manager.clearHistory();
// Then: History should be empty
EXPECT_EQ(alert_manager.getAlertHistory(10).size(), 0);
}
// Test addToHistory - Add Entry
TEST_F(AlertManagerTest, testAddToHistoryAddEntry) {
// Given: Create a new alert
AlertInfo alert;
alert.type = AlertType::SENSOR_FAILURE;
alert.status = AlertStatus::ACTIVE;
alert.trigger_time = getMockTime();
alert.description = "Test alert";
// When: Add to history
alert_manager.addToHistory(alert);
// Then: History should contain the entry
auto history = alert_manager.getAlertHistory(1);
EXPECT_EQ(history.size(), 1);
EXPECT_EQ(history[0].type, AlertType::SENSOR_FAILURE);
}
// Test addToHistory - Limit History Size
TEST_F(AlertManagerTest, testAddToHistoryLimitHistorySize) {
// Given: Add more entries than MAX_HISTORY
const int 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 = getMockTime() + i;
alert.description = "Test alert";
alert_manager.addToHistory(alert);
}
// When: Check history size
auto history = alert_manager.getAlertHistory(10);
// Then: Only MAX_HISTORY entries should remain
EXPECT_EQ(history.size(), MAX_HISTORY);
}
// Test triggerAlert - Normal Trigger
TEST_F(AlertManagerTest, testTriggerAlertNormalTrigger) {
// Given: Valid parameters
uint32_t timestamp = getMockTime();
string description = "Test alert";
// When: Trigger alert
alert_manager.triggerAlert(AlertType::SENSOR_FAILURE, timestamp, description);
// Then: Alert should be active
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, description);
}
// Test updateAlertStatus - Acknowledge Alert
TEST_F(AlertManagerTest, testUpdateAlertStatusAcknowledgeAlert) {
// Given: An active alert
uint32_t timestamp = getMockTime();
alert_manager.triggerSensorFailure(timestamp);
// When: Update status to acknowledged
alert_manager.updateAlertStatus(AlertType::SENSOR_FAILURE, AlertStatus::ACKNOWLEDGED, timestamp + 1);
// Then: Alert should be acknowledged
EXPECT_FALSE(alert_manager.hasActiveAlerts());
EXPECT_FALSE(alert_manager.hasUnacknowledgedAlerts());
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 0);
}
// Test updateAlertStatus - Resolve Alert
TEST_F(AlertManagerTest, testUpdateAlertStatusResolveAlert) {
// Given: An active alert
uint32_t timestamp = getMockTime();
alert_manager.triggerSensorFailure(timestamp);
// When: Update status to resolved
alert_manager.updateAlertStatus(AlertType::SENSOR_FAILURE, AlertStatus::RESOLVED, timestamp + 1);
// Then: Alert should be resolved
EXPECT_FALSE(alert_manager.hasActiveAlerts());
EXPECT_FALSE(alert_manager.hasUnacknowledgedAlerts());
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 0);
}
// Test updateAlertStatus - Update Non-Existing Alert
TEST_F(AlertManagerTest, testUpdateAlertStatusUpdateNonExistingAlert) {
// Given: No existing alert
// When: Update non-existing alert
alert_manager.updateAlertStatus(AlertType::SENSOR_FAILURE, AlertStatus::ACTIVE, getMockTime());
// Then: No change
EXPECT_FALSE(alert_manager.hasActiveAlerts());
}
// Test getAlertTypeName - Valid Type
TEST_F(AlertManagerTest, testGetAlertTypeNameValidType) {
// Given: Valid alert type
AlertType type = AlertType::ALTITUDE_UPPER;
// When: Get type name
string name = alert_manager.getAlertTypeName(type);
// Then: Should return correct name
EXPECT_EQ(name, "高度上限预警");
}
// Test getAlertTypeName - Unknown Type
TEST_F(AlertManagerTest, testGetAlertTypeNameUnknownType) {
// Given: Unknown alert type
AlertType type = static_cast<AlertType>(999);
// When: Get type name
string name = alert_manager.getAlertTypeName(type);
// Then: Should return "未知预警"
EXPECT_EQ(name, "未知预警");
}
// Test getAlertStatusName - Valid Status
TEST_F(AlertManagerTest, testGetAlertStatusNameValidStatus) {
// Given: Valid alert status
AlertStatus status = AlertStatus::ACTIVE;
// When: Get status name
string name = alert_manager.getAlertStatusName(status);
// Then: Should return correct name
EXPECT_EQ(name, "预警中");
}
// Test getAlertStatusName - Unknown Status
TEST_F(AlertManagerTest, testGetAlertStatusNameUnknownStatus) {
// Given: Unknown alert status
AlertStatus status = static_cast<AlertStatus>(999);
// When: Get status name
string name = alert_manager.getAlertStatusName(status);
// Then: Should return "未知状态"
EXPECT_EQ(name, "未知状态");
}