From cf377158823e922f9c09ba3b31554c350c5741b9 Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Sat, 21 Oct 2017 16:59:30 -0400 Subject: [PATCH] test: add unit test for seastar messenger Signed-off-by: Casey Bodley --- src/test/crimson/CMakeLists.txt | 8 +++ src/test/crimson/test_messenger.cc | 79 ++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 src/test/crimson/test_messenger.cc diff --git a/src/test/crimson/CMakeLists.txt b/src/test/crimson/CMakeLists.txt index 285e05c78f993..24ce135a9dfd8 100644 --- a/src/test/crimson/CMakeLists.txt +++ b/src/test/crimson/CMakeLists.txt @@ -11,3 +11,11 @@ add_executable(unittest_seastar_denc $) add_ceph_unittest(unittest_seastar_denc) target_link_libraries(unittest_seastar_denc ceph-common global Seastar::seastar) + +set(test_messenger_srcs + test_messenger.cc + $ + $) +add_executable(unittest_seastar_messenger ${test_messenger_srcs}) +add_ceph_unittest(unittest_seastar_messenger) +target_link_libraries(unittest_seastar_messenger ceph-common Seastar::seastar) diff --git a/src/test/crimson/test_messenger.cc b/src/test/crimson/test_messenger.cc new file mode 100644 index 0000000000000..70b6b29220110 --- /dev/null +++ b/src/test/crimson/test_messenger.cc @@ -0,0 +1,79 @@ +#include "messages/MPing.h" +#include "crimson/net/Connection.h" +#include "crimson/net/Dispatcher.h" +#include "crimson/net/SocketMessenger.h" +#include +#include +#include + +static seastar::future<> test_echo() +{ + struct test_state { + entity_addr_t addr; + + struct { + ceph::net::SocketMessenger messenger{entity_name_t::OSD(1)}; + struct ServerDispatcher : ceph::net::Dispatcher { + seastar::future<> ms_dispatch(ceph::net::ConnectionRef c, + MessageRef m) override { + std::cout << "server got " << *m << std::endl; + // reply with a pong + return c->send(MessageRef{new MPing(), false}); + } + } dispatcher; + } server; + + struct { + ceph::net::SocketMessenger messenger{entity_name_t::OSD(0)}; + struct ClientDispatcher : ceph::net::Dispatcher { + seastar::promise reply; + seastar::future<> ms_dispatch(ceph::net::ConnectionRef c, + MessageRef m) override { + reply.set_value(std::move(m)); + return seastar::now(); + } + } dispatcher; + } client; + }; + return seastar::do_with(test_state{}, + [] (test_state& t) { + // bind the server + t.addr.set_family(AF_INET); + t.addr.set_port(9010); + t.server.messenger.bind(t.addr); + + return t.server.messenger.start(&t.server.dispatcher) + .then([&] { + return t.client.messenger.start(&t.client.dispatcher) + .then([&] { + return t.client.messenger.connect(t.addr); + }).then([] (ceph::net::ConnectionRef conn) { + std::cout << "client connected" << std::endl; + return conn->send(MessageRef{new MPing(), false}); + }).then([&] { + return t.client.dispatcher.reply.get_future(); + }).then([&] (MessageRef msg) { + std::cout << "client got reply " << *msg << std::endl; + }).finally([&] { + std::cout << "client shutting down" << std::endl; + return t.client.messenger.shutdown(); + }); + }).finally([&] { + std::cout << "server shutting down" << std::endl; + return t.server.messenger.shutdown(); + }); + }); +} + +int main(int argc, char** argv) +{ + seastar::app_template app; + return app.run(argc, argv, [] { + return test_echo().then([] { + std::cout << "All tests succeeded" << std::endl; + }).handle_exception([] (auto eptr) { + std::cout << "Test failure" << std::endl; + return seastar::make_exception_future<>(eptr); + }); + }); +} -- 2.39.5