Events are now removed purely in chronological order if overflowing
parent
70d5b4f5b5
commit
e3517767cb
|
|
@ -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.
|
|
||||||
}
|
}
|
||||||
|
|
@ -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);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue