Make raw senders able to send flatbuffers
The senders were placing in the front of the memory region, and the
readers were reading from the end of the memory region. Align the
raw senders with how flatbuffers use the memory.
This was found by trying to implement message_gateway.
Change-Id: I2d8fd5b6faafbbaf268ee036c851417cf5a02c74
diff --git a/aos/events/event_loop_param_test.cc b/aos/events/event_loop_param_test.cc
index 834ca16..cf3b6df 100644
--- a/aos/events/event_loop_param_test.cc
+++ b/aos/events/event_loop_param_test.cc
@@ -1099,5 +1099,51 @@
EXPECT_EQ(primary_report.message().fetchers()->Get(1)->count(), 10);
}
+// Tests that a raw watcher and raw fetcher can receive messages from a raw
+// sender without messing up offsets.
+TEST_P(AbstractEventLoopTest, RawBasic) {
+ auto loop1 = Make();
+ auto loop2 = MakePrimary();
+ auto loop3 = Make();
+
+ const std::string kData("971 is the best");
+
+ std::unique_ptr<aos::RawSender> sender =
+ loop1->MakeRawSender(loop1->configuration()->channels()->Get(1));
+
+ std::unique_ptr<aos::RawFetcher> fetcher =
+ loop3->MakeRawFetcher(loop3->configuration()->channels()->Get(1));
+
+ loop2->OnRun(
+ [&]() { EXPECT_TRUE(sender->Send(kData.data(), kData.size())); });
+
+ bool happened = false;
+ loop2->MakeRawWatcher(
+ loop2->configuration()->channels()->Get(1),
+ [this, &kData, &fetcher, &happened](const Context &context,
+ const void *message) {
+ happened = true;
+ EXPECT_EQ(std::string_view(kData),
+ std::string_view(reinterpret_cast<const char *>(message),
+ context.size));
+ EXPECT_EQ(std::string_view(kData),
+ std::string_view(reinterpret_cast<const char *>(context.data),
+ context.size));
+
+ ASSERT_TRUE(fetcher->Fetch());
+
+ EXPECT_EQ(std::string_view(kData),
+ std::string_view(
+ reinterpret_cast<const char *>(fetcher->context().data),
+ fetcher->context().size));
+
+ this->Exit();
+ });
+
+ EXPECT_FALSE(happened);
+ Run();
+ EXPECT_TRUE(happened);
+}
+
} // namespace testing
} // namespace aos