diff --git a/api/icsneocpp/eventmanager.cpp b/api/icsneocpp/eventmanager.cpp index 928b7f8..f6b9443 100644 --- a/api/icsneocpp/eventmanager.cpp +++ b/api/icsneocpp/eventmanager.cpp @@ -86,59 +86,19 @@ bool EventManager::enforceLimit() { size_t amountToRemove = events.size() + 1 - eventLimit; - discardLeastSevere(amountToRemove); + discardOldest(amountToRemove); return true; } -APIEvent::Severity EventManager::lowestCurrentSeverity() const { - if(events.empty()) - return APIEvent::Severity(0); - - APIEvent::Severity lowest = APIEvent::Severity::Error; - auto it = events.begin(); - while(it != events.end()) { - if((*it).getSeverity() < lowest) - lowest = (*it).getSeverity(); - it++; - - if(lowest == APIEvent::Severity::EventInfo) - return lowest; - } - return lowest; -} - -void EventManager::discardLeastSevere(size_t count) { +void EventManager::discardOldest(size_t count) { if(count == 0) return; - // Erase needed Info level events, starting from the beginning - EventFilter infoFilter(APIEvent::Severity::EventInfo); auto it = events.begin(); while(it != events.end()) { - if(infoFilter.match(*it)) { - it = events.erase(it); - if(--count == 0) - break; - } else { - it++; - } + it = events.erase(it); + if(--count == 0) + break; } - - // Erase needed Warning level events, starting from the beginning - if(count != 0) { - EventFilter warningFilter(APIEvent::Severity::EventWarning); - it = events.begin(); - while(it != events.end()) { - if(warningFilter.match(*it)) { - it = events.erase(it); - if(--count == 0) - break; - } else { - it++; - } - } - } - - // No need to check for Error level events, as they are not stored in the list of events. } \ No newline at end of file diff --git a/include/icsneo/api/eventmanager.h b/include/icsneo/api/eventmanager.h index 73170cd..4f15d81 100644 --- a/include/icsneo/api/eventmanager.h +++ b/include/icsneo/api/eventmanager.h @@ -112,8 +112,8 @@ private: // We are exactly full, either because the list was truncated or because we were simply full before if(events.size() == eventLimit - 1) { // If the event is worth adding - if(event.getType() != APIEvent::Type::TooManyEvents && event.getSeverity() >= lowestCurrentSeverity()) { - discardLeastSevere(1); + if(event.getType() != APIEvent::Type::TooManyEvents) { + discardOldest(1); events.push_back(event); } @@ -126,8 +126,7 @@ private: bool enforceLimit(); // Returns whether the limit enforcement resulted in an overflow - APIEvent::Severity lowestCurrentSeverity() const; - void discardLeastSevere(size_t count = 1); + void discardOldest(size_t count = 1); }; } diff --git a/include/icsneo/icsneoc.h b/include/icsneo/icsneoc.h index f26e17e..be4a892 100644 --- a/include/icsneo/icsneoc.h +++ b/include/icsneo/icsneoc.h @@ -629,7 +629,7 @@ extern void DLLExport icsneo_discardDeviceEvents(const neodevice_t* device); * If the error limit is reached, an icsneo::APIEvent::TooManyEvents will be flagged. * * If the `newLimit` is smaller than the current error count, - * errors will be removed in order of increasing severity and decreasing age. + * errors will be removed in order of decreasing age. * This will also flag an icsneo::APIEvent::TooManyEvents. */ extern void DLLExport icsneo_setEventLimit(size_t newLimit); diff --git a/test/eventmanagertest.cpp b/test/eventmanagertest.cpp index 1d16183..927d859 100644 --- a/test/eventmanagertest.cpp +++ b/test/eventmanagertest.cpp @@ -318,15 +318,25 @@ TEST_F(EventManagerTest, TestAddWarningsOverflow) { for(int i = 0; i < 3; i++) EventManager::GetInstance().add(APIEvent(APIEvent::Type::OutputTruncated, APIEvent::Severity::EventWarning)); - // 49 of these - for(int i = 0; i < 49; i++) + // 1 info + EventManager::GetInstance().add(APIEvent(APIEvent::Type::SWCANSettingsNotAvailable, APIEvent::Severity::EventInfo)); + + // 48 of these + for(int i = 0; i < 48; i++) EventManager::GetInstance().add(APIEvent(APIEvent::Type::ParameterOutOfRange, APIEvent::Severity::EventWarning)); auto events = GetEvents(); - for(int i = 0; i < 49; i++) + + EXPECT_EQ(events.at(0).getType(), APIEvent::Type::SWCANSettingsNotAvailable); + EXPECT_EQ(events.at(0).getSeverity(), APIEvent::Severity::EventInfo); + + for(int i = 1; i < 49; i++) { EXPECT_EQ(events.at(i).getType(), APIEvent::Type::ParameterOutOfRange); - + EXPECT_EQ(events.at(i).getSeverity(), APIEvent::Severity::EventWarning); + } + EXPECT_EQ(events.at(49).getType(), APIEvent::Type::TooManyEvents); + EXPECT_EQ(events.at(49).getSeverity(), APIEvent::Severity::EventWarning); } // Tests the case where too many warnings and info are added @@ -336,7 +346,7 @@ TEST_F(EventManagerTest, TestAddWarningsInfoOverflow) { SetEventLimit(50); // Event list filling: 1 warning, 3 info, 47 warning. - // Expect to see: 1 warning, 1 info, 47 warning, 1 TooManyEvents + // Expect to see: 2 info, 47 warning, 1 TooManyEvents EventManager::GetInstance().add(APIEvent(APIEvent::Type::SettingsVersionError, APIEvent::Severity::EventWarning)); @@ -350,9 +360,9 @@ TEST_F(EventManagerTest, TestAddWarningsInfoOverflow) { auto events = GetEvents(); - EXPECT_EQ(events.at(0).getType(), APIEvent::Type::SettingsVersionError); - - EXPECT_EQ(events.at(1).getType(), APIEvent::Type::OutputTruncated); + for(int i = 0; i < 2; i++) { + EXPECT_EQ(events.at(i).getType(), APIEvent::Type::OutputTruncated); + } for(int i = 2; i < 49; i++) EXPECT_EQ(events.at(i).getType(), APIEvent::Type::ParameterOutOfRange); @@ -383,14 +393,13 @@ TEST_F(EventManagerTest, SetEventLimitTest) { EXPECT_EQ(GetEventLimit(), 9001); EXPECT_EQ(EventCount(), 9001); - // auto events = GetEvents(); - // for(int i = 0; i < 4998; i++) { - // EXPECT_EQ(events.at(i).getType(), APIEvent::Type::OutputTruncated); - // } - // EXPECT_EQ(events.at(4999).getType(), APIEvent::Type::TooManyEvents); -} - -// Tests that setting the event limit when already overflowing works -TEST_F(EventManagerTest, SetEventLimitOverflowTest) { + SetEventLimit(5000); + EXPECT_EQ(GetEventLimit(), 5000); + EXPECT_EQ(EventCount(), 5000); + auto events = GetEvents(); + for(int i = 0; i < 4998; i++) { + EXPECT_EQ(events.at(i).getType(), APIEvent::Type::OutputTruncated); + } + EXPECT_EQ(events.at(4999).getType(), APIEvent::Type::TooManyEvents); } \ No newline at end of file