#include "gtest/gtest.h" #include "alert_manager.hpp" #include #include 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(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(999); // When: Get status name string name = alert_manager.getAlertStatusName(status); // Then: Should return "未知状态" EXPECT_EQ(name, "未知状态"); }