22 #include <gtest/gtest.h>
24 #include "absl/memory/memory.h"
39 #include "src/proto/grpc/testing/echo.grpc.pb.h"
44 using grpc::testing::EchoRequest;
45 using grpc::testing::EchoResponse;
51 void*
tag(
int i) {
return reinterpret_cast<void*
>(
i); }
53 void verify_ok(CompletionQueue*
cq,
int i,
bool expect_ok) {
65 void SetUp()
override {
82 void ShutDownServerAndCQs() {
89 while (
cli_cq_.Next(&ignored_tag, &ignored_ok)) {
91 while (
srv_cq_->Next(&ignored_tag, &ignored_ok)) {
96 void TearDown()
override { ShutDownServerAndCQs(); }
101 stub_ = grpc::testing::EchoTestService::NewStub(
channel);
105 void server_ok(
int i) { verify_ok(
srv_cq_.get(), i,
true); }
106 void client_ok(
int i) { verify_ok(&
cli_cq_, i,
true); }
107 void server_fail(
int i) { verify_ok(
srv_cq_.get(), i,
false); }
108 void client_fail(
int i) { verify_ok(&
cli_cq_, i,
false); }
115 const std::string kMethodName(
"/grpc.cpp.test.util.EchoTestService/Echo");
116 for (
int i = 0;
i < num_rpcs;
i++) {
118 EchoRequest recv_request;
119 EchoResponse send_response;
120 EchoResponse recv_response;
123 ClientContext cli_ctx;
124 GenericServerContext srv_ctx;
128 send_request.set_message(
"Hello world. Hello world. Hello world.");
130 if (check_deadline) {
131 cli_ctx.set_deadline(deadline);
139 std::unique_ptr<GenericClientAsyncReaderWriter>
call =
161 EXPECT_EQ(kMethodName, srv_ctx.method());
163 if (check_deadline) {
168 ByteBuffer recv_buffer;
174 send_response.set_message(recv_request.message());
184 call->Read(&recv_buffer,
tag(8));
188 call->Finish(&recv_status,
tag(9));
191 EXPECT_EQ(send_response.message(), recv_response.message());
199 void DriveCompletionQueue() {
214 reinterpret_cast<void*
>(Event::kCallReceived));
221 while (
srv_cq_->Next(
reinterpret_cast<void**
>(&event), &
ok)) {
230 case Event::kCallReceived:
231 reader_writer.Finish(
233 reinterpret_cast<void*
>(Event::kResponseSent));
236 case Event::kResponseSent:
245 std::unique_ptr<ServerCompletionQueue>
srv_cq_;
246 std::unique_ptr<grpc::testing::EchoTestService::Stub>
stub_;
257 TEST_F(GenericEnd2endTest, SimpleRpc) {
262 TEST_F(GenericEnd2endTest, SequentialRpcs) {
267 TEST_F(GenericEnd2endTest, SequentialUnaryRpcs) {
269 const int num_rpcs = 10;
270 const std::string kMethodName(
"/grpc.cpp.test.util.EchoTestService/Echo");
271 for (
int i = 0;
i < num_rpcs;
i++) {
273 EchoRequest recv_request;
274 EchoResponse send_response;
275 EchoResponse recv_response;
278 ClientContext cli_ctx;
279 GenericServerContext srv_ctx;
283 send_request.set_message(
"Hello world. Hello world. Hello world.");
285 std::unique_ptr<ByteBuffer> cli_send_buffer =
288 std::unique_ptr<GenericClientAsyncResponseReader>
call =
289 generic_stub_->PrepareUnaryCall(&cli_ctx, kMethodName, *cli_send_buffer,
292 ByteBuffer cli_recv_buffer;
293 call->Finish(&cli_recv_buffer, &recv_status,
tag(1));
294 std::thread client_check([
this] { client_ok(1); });
300 EXPECT_EQ(kMethodName, srv_ctx.method());
302 ByteBuffer srv_recv_buffer;
308 send_response.set_message(recv_request.message());
309 std::unique_ptr<ByteBuffer> srv_send_buffer =
319 EXPECT_EQ(send_response.message(), recv_response.message());
325 TEST_F(GenericEnd2endTest, SimpleBidiStreaming) {
329 "/grpc.cpp.test.util.EchoTestService/BidiStream");
331 EchoRequest recv_request;
332 EchoResponse send_response;
333 EchoResponse recv_response;
335 ClientContext cli_ctx;
336 GenericServerContext srv_ctx;
342 std::unique_ptr<GenericClientAsyncReaderWriter> cli_stream =
344 cli_stream->StartCall(
tag(1));
352 EXPECT_EQ(kMethodName, srv_ctx.method());
360 ByteBuffer recv_buffer;
361 srv_stream.Read(&recv_buffer,
tag(4));
366 send_response.set_message(recv_request.message());
372 cli_stream->Read(&recv_buffer,
tag(6));
375 EXPECT_EQ(send_response.message(), recv_response.message());
377 cli_stream->WritesDone(
tag(7));
380 srv_stream.Read(&recv_buffer,
tag(8));
386 cli_stream->Finish(&recv_status,
tag(10));
389 EXPECT_EQ(send_response.message(), recv_response.message());
393 TEST_F(GenericEnd2endTest, Deadline) {
400 TEST_F(GenericEnd2endTest, ShortDeadline) {
403 ClientContext cli_ctx;
408 std::thread driver([
this] { DriveCompletionQueue(); });
419 ShutDownServerAndCQs();
427 int main(
int argc,
char** argv) {