Add request streaming support to the RPC client

Summary:
This change only adds streaming support to the client request. The client
response, server request and server response are still handled only when all of
the data is received.

Reviewers: buda

Reviewed By: buda

Subscribers: pullbot

Differential Revision: https://phabricator.memgraph.io/D2807
This commit is contained in:
Matej Ferencevic
2020-05-26 12:47:25 +02:00
parent aaf0c1ca08
commit dd9180da32
3 changed files with 212 additions and 53 deletions

View File

@@ -208,3 +208,86 @@ TEST(Rpc, JumboMessage) {
server.Shutdown();
server.AwaitShutdown();
}
TEST(Rpc, Stream) {
communication::ServerContext server_context;
Server server({"127.0.0.1", 0}, &server_context);
server.Register<Echo>([](auto *req_reader, auto *res_builder) {
EchoMessage req;
slk::Load(&req, req_reader);
std::string payload;
slk::Load(&payload, req_reader);
EchoMessage res(req.data + payload);
slk::Save(res, res_builder);
});
ASSERT_TRUE(server.Start());
std::this_thread::sleep_for(100ms);
communication::ClientContext client_context;
Client client(server.endpoint(), &client_context);
auto stream = client.Stream<Echo>("hello");
slk::Save("world", stream.GetBuilder());
auto echo = stream.AwaitResponse();
EXPECT_EQ(echo.data, "helloworld");
server.Shutdown();
server.AwaitShutdown();
}
TEST(Rpc, StreamLarge) {
communication::ServerContext server_context;
Server server({"127.0.0.1", 0}, &server_context);
server.Register<Echo>([](auto *req_reader, auto *res_builder) {
EchoMessage req;
slk::Load(&req, req_reader);
std::string payload;
slk::Load(&payload, req_reader);
EchoMessage res(req.data + payload);
slk::Save(res, res_builder);
});
ASSERT_TRUE(server.Start());
std::this_thread::sleep_for(100ms);
std::string testdata1(50000, 'a');
std::string testdata2(50000, 'b');
communication::ClientContext client_context;
Client client(server.endpoint(), &client_context);
auto stream = client.Stream<Echo>(testdata1);
slk::Save(testdata2, stream.GetBuilder());
auto echo = stream.AwaitResponse();
EXPECT_EQ(echo.data, testdata1 + testdata2);
server.Shutdown();
server.AwaitShutdown();
}
TEST(Rpc, StreamJumbo) {
communication::ServerContext server_context;
Server server({"127.0.0.1", 0}, &server_context);
server.Register<Echo>([](auto *req_reader, auto *res_builder) {
EchoMessage req;
slk::Load(&req, req_reader);
std::string payload;
slk::Load(&payload, req_reader);
EchoMessage res(req.data + payload);
slk::Save(res, res_builder);
});
ASSERT_TRUE(server.Start());
std::this_thread::sleep_for(100ms);
// NOLINTNEXTLINE (bugprone-string-constructor)
std::string testdata1(5000000, 'a');
// NOLINTNEXTLINE (bugprone-string-constructor)
std::string testdata2(5000000, 'b');
communication::ClientContext client_context;
Client client(server.endpoint(), &client_context);
auto stream = client.Stream<Echo>(testdata1);
slk::Save(testdata2, stream.GetBuilder());
auto echo = stream.AwaitResponse();
EXPECT_EQ(echo.data, testdata1 + testdata2);
server.Shutdown();
server.AwaitShutdown();
}