Events are now removed purely in chronological order if overflowing

checksum-failure-logging
EricLiu2000 2019-06-27 18:04:59 -04:00
parent 70d5b4f5b5
commit e3517767cb
4 changed files with 35 additions and 67 deletions

View File

@ -86,59 +86,19 @@ bool EventManager::enforceLimit() {
size_t amountToRemove = events.size() + 1 - eventLimit; size_t amountToRemove = events.size() + 1 - eventLimit;
discardLeastSevere(amountToRemove); discardOldest(amountToRemove);
return true; return true;
} }
APIEvent::Severity EventManager::lowestCurrentSeverity() const { void EventManager::discardOldest(size_t count) {
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) {
if(count == 0) if(count == 0)
return; return;
// Erase needed Info level events, starting from the beginning
EventFilter infoFilter(APIEvent::Severity::EventInfo);
auto it = events.begin(); auto it = events.begin();
while(it != events.end()) { while(it != events.end()) {
if(infoFilter.match(*it)) { it = events.erase(it);
it = events.erase(it); if(--count == 0)
if(--count == 0) break;
break;
} else {
it++;
}
} }
// 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.
} }

View File

@ -112,8 +112,8 @@ private:
// We are exactly full, either because the list was truncated or because we were simply full before // We are exactly full, either because the list was truncated or because we were simply full before
if(events.size() == eventLimit - 1) { if(events.size() == eventLimit - 1) {
// If the event is worth adding // If the event is worth adding
if(event.getType() != APIEvent::Type::TooManyEvents && event.getSeverity() >= lowestCurrentSeverity()) { if(event.getType() != APIEvent::Type::TooManyEvents) {
discardLeastSevere(1); discardOldest(1);
events.push_back(event); events.push_back(event);
} }
@ -126,8 +126,7 @@ private:
bool enforceLimit(); // Returns whether the limit enforcement resulted in an overflow bool enforceLimit(); // Returns whether the limit enforcement resulted in an overflow
APIEvent::Severity lowestCurrentSeverity() const; void discardOldest(size_t count = 1);
void discardLeastSevere(size_t count = 1);
}; };
} }

View File

@ -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 error limit is reached, an icsneo::APIEvent::TooManyEvents will be flagged.
* *
* If the `newLimit` is smaller than the current error count, * 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. * This will also flag an icsneo::APIEvent::TooManyEvents.
*/ */
extern void DLLExport icsneo_setEventLimit(size_t newLimit); extern void DLLExport icsneo_setEventLimit(size_t newLimit);

View File

@ -318,15 +318,25 @@ TEST_F(EventManagerTest, TestAddWarningsOverflow) {
for(int i = 0; i < 3; i++) for(int i = 0; i < 3; i++)
EventManager::GetInstance().add(APIEvent(APIEvent::Type::OutputTruncated, APIEvent::Severity::EventWarning)); EventManager::GetInstance().add(APIEvent(APIEvent::Type::OutputTruncated, APIEvent::Severity::EventWarning));
// 49 of these // 1 info
for(int i = 0; i < 49; i++) 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)); EventManager::GetInstance().add(APIEvent(APIEvent::Type::ParameterOutOfRange, APIEvent::Severity::EventWarning));
auto events = GetEvents(); 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).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).getType(), APIEvent::Type::TooManyEvents);
EXPECT_EQ(events.at(49).getSeverity(), APIEvent::Severity::EventWarning);
} }
// Tests the case where too many warnings and info are added // Tests the case where too many warnings and info are added
@ -336,7 +346,7 @@ TEST_F(EventManagerTest, TestAddWarningsInfoOverflow) {
SetEventLimit(50); SetEventLimit(50);
// Event list filling: 1 warning, 3 info, 47 warning. // 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)); EventManager::GetInstance().add(APIEvent(APIEvent::Type::SettingsVersionError, APIEvent::Severity::EventWarning));
@ -350,9 +360,9 @@ TEST_F(EventManagerTest, TestAddWarningsInfoOverflow) {
auto events = GetEvents(); auto events = GetEvents();
EXPECT_EQ(events.at(0).getType(), APIEvent::Type::SettingsVersionError); for(int i = 0; i < 2; i++) {
EXPECT_EQ(events.at(i).getType(), APIEvent::Type::OutputTruncated);
EXPECT_EQ(events.at(1).getType(), APIEvent::Type::OutputTruncated); }
for(int i = 2; i < 49; i++) for(int i = 2; i < 49; i++)
EXPECT_EQ(events.at(i).getType(), APIEvent::Type::ParameterOutOfRange); EXPECT_EQ(events.at(i).getType(), APIEvent::Type::ParameterOutOfRange);
@ -383,14 +393,13 @@ TEST_F(EventManagerTest, SetEventLimitTest) {
EXPECT_EQ(GetEventLimit(), 9001); EXPECT_EQ(GetEventLimit(), 9001);
EXPECT_EQ(EventCount(), 9001); EXPECT_EQ(EventCount(), 9001);
// auto events = GetEvents(); SetEventLimit(5000);
// for(int i = 0; i < 4998; i++) { EXPECT_EQ(GetEventLimit(), 5000);
// EXPECT_EQ(events.at(i).getType(), APIEvent::Type::OutputTruncated); EXPECT_EQ(EventCount(), 5000);
// }
// EXPECT_EQ(events.at(4999).getType(), APIEvent::Type::TooManyEvents);
}
// Tests that setting the event limit when already overflowing works
TEST_F(EventManagerTest, SetEventLimitOverflowTest) {
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);
} }