Reduce flakeness of shm_event_loop_test
On some platforms, we were seeing one of the send too fast tests fail
occasionally. Fix it by giving the scheduler a bit more of a grace
period by sending batches of messages and waking up less often, and
running it on the RT scheduler to reduce impact of other load.
Change-Id: I940dc58e81fed0e7ab8ef4da6b089226bfbc9945
Signed-off-by: James Kuszmaul <james.kuszmaul@bluerivertech.com>
diff --git a/aos/events/event_loop_param_test.cc b/aos/events/event_loop_param_test.cc
index 58bfd9b..3fb9e9a 100644
--- a/aos/events/event_loop_param_test.cc
+++ b/aos/events/event_loop_param_test.cc
@@ -3553,6 +3553,7 @@
// RawSender::Error::kMessagesSentTooFast.
TEST_P(AbstractEventLoopTest, SendingMessagesTooFast) {
auto event_loop = MakePrimary();
+ event_loop->SetRuntimeRealtimePriority(5);
auto sender = event_loop->MakeSender<TestMessage>("/test");
@@ -3567,21 +3568,29 @@
int msgs_sent = 1;
const int queue_size = TestChannelQueueSize(event_loop.get());
+ const int messages_per_ms = 2;
+ const auto kRepeatOffset = std::chrono::milliseconds(10);
+ const auto base_offset =
+ configuration::ChannelStorageDuration(event_loop->configuration(),
+ sender.channel()) -
+ (std::chrono::milliseconds(1) * (queue_size / 2) / messages_per_ms);
+
const auto timer = event_loop->AddTimer([&]() {
- const bool done = (msgs_sent == queue_size + 1);
- ASSERT_EQ(
- SendTestMessage(sender),
- done ? RawSender::Error::kMessagesSentTooFast : RawSender::Error::kOk);
- msgs_sent++;
- if (done) {
- Exit();
+ // Send in bursts to reduce scheduler load to make the test more
+ // reproducible.
+ for (int i = 0; i < messages_per_ms * kRepeatOffset.count(); ++i) {
+ const bool done = (msgs_sent == queue_size + 1);
+ ASSERT_EQ(SendTestMessage(sender),
+ done ? RawSender::Error::kMessagesSentTooFast
+ : RawSender::Error::kOk);
+ msgs_sent++;
+ if (done) {
+ Exit();
+ return;
+ }
}
});
- const auto kRepeatOffset = std::chrono::milliseconds(1);
- const auto base_offset = configuration::ChannelStorageDuration(
- event_loop->configuration(), sender.channel()) -
- (kRepeatOffset * (queue_size / 2));
event_loop->OnRun([&event_loop, &timer, &base_offset, &kRepeatOffset]() {
timer->Schedule(event_loop->monotonic_now() + base_offset, kRepeatOffset);
});
@@ -3595,6 +3604,7 @@
// situation
TEST_P(AbstractEventLoopTest, SendingAfterSendingTooFast) {
auto event_loop = MakePrimary();
+ event_loop->SetRuntimeRealtimePriority(5);
auto sender = event_loop->MakeSender<TestMessage>("/test");