2
0
mirror of https://gitlab.isc.org/isc-projects/kea synced 2025-08-31 14:05:33 +00:00

[#3270] Make Perfmon addSampleAndClear UT reliable

src/hooks/dhcp/perfmon/tests/monitored_duration_unittests.cc
    TEST(MonitoredDuration, addSampleAndClear) - reworked to remove
    timing sensitivity
This commit is contained in:
Thomas Markwalder
2024-02-27 11:50:13 -05:00
parent c25bc2b72b
commit c3bbf66a14

View File

@@ -334,55 +334,64 @@ TEST(MonitoredDuration, addSampleAndClear) {
EXPECT_FALSE(mond->getCurrentInterval());
EXPECT_FALSE(mond->getPreviousInterval());
// Iterate over a 60ms period, adding a 10ms sample to a duration
// on each pass. Sleep for 10ms in between iterations.
DurationDataIntervalPtr original_interval;
DurationDataIntervalPtr current_interval;
auto two_ms = milliseconds(2);
bool should_report = false;
// Add a sample and verify nothing to report and that it creates a
// current interval.
ASSERT_NO_THROW(should_report = mond->addSample(two_ms));
EXPECT_FALSE(should_report);
DurationDataIntervalPtr current_interval = mond->getCurrentInterval();
ASSERT_TRUE(current_interval);
// First pass, we should only have a current interval,
// nothing to report, one occurrence and a total duration of 10ms.
EXPECT_FALSE(mond->getPreviousInterval());
EXPECT_FALSE(should_report);
EXPECT_EQ(current_interval->getOccurrences(), 1);
EXPECT_EQ(current_interval->getTotalDuration(), two_ms);
// Save a copy of the current interval pointer.
DurationDataIntervalPtr original_interval = current_interval;
// Add 4 two ms samples during the current interval.
DurationDataIntervalPtr previous_interval;
auto ten_ms = milliseconds(10);
bool should_report;
for (int i = 0; i < 6; ++i) {
ASSERT_NO_THROW(should_report = mond->addSample(ten_ms));
for (int i = 1; i < 5; ++i) {
// Add a two ms sample, it should return false as its not
// time to report.
ASSERT_NO_THROW(should_report = mond->addSample(two_ms));
EXPECT_FALSE(should_report);
current_interval = mond->getCurrentInterval();
ASSERT_TRUE(current_interval);
switch(i) {
case 0:
// First pass, we should only have a current interval,
// nothing to report, one occurrence and a total duration of 10ms.
original_interval = current_interval;
EXPECT_FALSE(mond->getPreviousInterval());
EXPECT_FALSE(should_report);
EXPECT_EQ(current_interval->getOccurrences(), 1);
EXPECT_EQ(current_interval->getTotalDuration(), ten_ms);
break;
default:
// On passes that occur during the duration interval, we should
// still only have a current interval and nothing to report.
// Current interval occurrences and total duration should be increasing.
EXPECT_EQ(current_interval, original_interval);
EXPECT_FALSE(mond->getPreviousInterval());
EXPECT_FALSE(should_report);
EXPECT_EQ(current_interval->getOccurrences(), (i + 1));
EXPECT_EQ(current_interval->getTotalDuration(), (ten_ms * (i + 1)));
break;
case 5:
// On the last pass we should have crossed the interval boundary.
// Previous interval should be equal to the original interval and
// should_report should be true. The new current interval should
// have 1 occurrence and a total of 10ms.
previous_interval = mond->getPreviousInterval();
EXPECT_TRUE(previous_interval);
EXPECT_EQ(previous_interval, original_interval);
EXPECT_TRUE(should_report);
EXPECT_EQ(current_interval->getOccurrences(), 1);
EXPECT_EQ(current_interval->getTotalDuration(), ten_ms);
break;
}
// Sleep for 10ms.
usleep(10000);
// Make sure the current interval hasn't been replaced and we
// have no previous interval.
EXPECT_EQ(current_interval, original_interval);
EXPECT_FALSE(mond->getPreviousInterval());
// Verify the sample was added.
EXPECT_EQ(current_interval->getOccurrences(), (i + 1));
EXPECT_EQ(current_interval->getTotalDuration(), (two_ms * (i + 1)));
}
// Sleep til past the end of interval
usleep(60 * 1000);
// Add another sample.
ASSERT_NO_THROW(should_report = mond->addSample(two_ms));
current_interval = mond->getCurrentInterval();
ASSERT_TRUE(current_interval);
// We should have crossed the interval boundary.
// Previous interval should be equal to the original interval and
// should_report should be true. The new current interval should
// have 1 occurrence and a total of 10ms.
previous_interval = mond->getPreviousInterval();
EXPECT_TRUE(previous_interval);
EXPECT_EQ(previous_interval, original_interval);
EXPECT_TRUE(should_report);
EXPECT_EQ(current_interval->getOccurrences(), 1);
EXPECT_EQ(current_interval->getTotalDuration(), two_ms);
// Verify that clear wipes the intervals.
ASSERT_NO_THROW_LOG(mond->clear());
EXPECT_FALSE(mond->getCurrentInterval());