#include #include #include #include #include #include #include #include #include "communication/messaging/distributed.hpp" #include "gtest/gtest.h" using namespace communication::messaging; using namespace std::literals::chrono_literals; struct MessageInt : public Message { MessageInt() {} // cereal needs this MessageInt(int x) : x(x) {} int x; template void serialize(Archive &ar) { ar(cereal::virtual_base_class(this), x); } }; CEREAL_REGISTER_TYPE(MessageInt); #define GET_X(p) dynamic_cast((p).get())->x /** * Test do the services start up without crashes. */ TEST(SimpleTests, StartAndShutdown) { System system("127.0.0.1", 0); // do nothing std::this_thread::sleep_for(500ms); system.Shutdown(); } TEST(Messaging, Pop) { System master_system("127.0.0.1", 0); System slave_system("127.0.0.1", 0); auto stream = master_system.Open("main"); Writer writer(slave_system, "127.0.0.1", master_system.endpoint().port(), "main"); std::this_thread::sleep_for(100ms); EXPECT_EQ(stream->Poll(), nullptr); writer.Send(10); EXPECT_EQ(GET_X(stream->Await()), 10); master_system.Shutdown(); slave_system.Shutdown(); } TEST(Messaging, Await) { System master_system("127.0.0.1", 0); System slave_system("127.0.0.1", 0); auto stream = master_system.Open("main"); Writer writer(slave_system, "127.0.0.1", master_system.endpoint().port(), "main"); std::this_thread::sleep_for(100ms); std::thread t([&] { std::this_thread::sleep_for(100ms); stream->Shutdown(); std::this_thread::sleep_for(100ms); writer.Send(20); }); EXPECT_EQ(stream->Poll(), nullptr); EXPECT_EQ(stream->Await(), nullptr); t.join(); master_system.Shutdown(); slave_system.Shutdown(); } TEST(Messaging, RecreateChannelAfterClosing) { System master_system("127.0.0.1", 0); System slave_system("127.0.0.1", 0); auto stream = master_system.Open("main"); Writer writer(slave_system, "127.0.0.1", master_system.endpoint().port(), "main"); std::this_thread::sleep_for(100ms); writer.Send(10); EXPECT_EQ(GET_X(stream->Await()), 10); stream = nullptr; writer.Send(20); std::this_thread::sleep_for(100ms); stream = master_system.Open("main"); std::this_thread::sleep_for(100ms); EXPECT_EQ(stream->Poll(), nullptr); writer.Send(30); EXPECT_EQ(GET_X(stream->Await()), 30); master_system.Shutdown(); slave_system.Shutdown(); }