/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #include #include #include #include #include #include #include #include #include #include #include #include "src/proto/grpc/testing/echo.grpc.pb.h" #include "test/core/util/test_config.h" #include "test/cpp/end2end/test_service_impl.h" #include "test/cpp/util/byte_buffer_proto_helper.h" #include namespace grpc { namespace testing { namespace { class ClientCallbackEnd2endTest : public ::testing::Test { protected: ClientCallbackEnd2endTest() {} void SetUp() override { ServerBuilder builder; builder.RegisterService(&service_); server_ = builder.BuildAndStart(); is_server_started_ = true; } void ResetStub() { ChannelArguments args; channel_ = server_->InProcessChannel(args); stub_.reset(new GenericStub(channel_)); } void TearDown() override { if (is_server_started_) { server_->Shutdown(); } } void SendRpcs(int num_rpcs, bool maybe_except) { const grpc::string kMethodName("/grpc.testing.EchoTestService/Echo"); grpc::string test_string(""); for (int i = 0; i < num_rpcs; i++) { EchoRequest request; std::unique_ptr send_buf; ByteBuffer recv_buf; ClientContext cli_ctx; test_string += "Hello world. "; request.set_message(test_string); send_buf = SerializeToByteBuffer(&request); std::mutex mu; std::condition_variable cv; bool done = false; stub_->experimental().UnaryCall( &cli_ctx, kMethodName, send_buf.get(), &recv_buf, [&request, &recv_buf, &done, &mu, &cv, maybe_except](Status s) { GPR_ASSERT(s.ok()); EchoResponse response; EXPECT_TRUE(ParseFromByteBuffer(&recv_buf, &response)); EXPECT_EQ(request.message(), response.message()); std::lock_guard l(mu); done = true; cv.notify_one(); #if GRPC_ALLOW_EXCEPTIONS if (maybe_except) { throw - 1; } #endif }); std::unique_lock l(mu); while (!done) { cv.wait(l); } } } bool is_server_started_; std::shared_ptr channel_; std::unique_ptr stub_; TestServiceImpl service_; std::unique_ptr server_; }; TEST_F(ClientCallbackEnd2endTest, SimpleRpc) { ResetStub(); SendRpcs(1, false); } TEST_F(ClientCallbackEnd2endTest, SequentialRpcs) { ResetStub(); SendRpcs(10, false); } #if GRPC_ALLOW_EXCEPTIONS TEST_F(ClientCallbackEnd2endTest, ExceptingRpc) { ResetStub(); SendRpcs(10, true); } #endif } // namespace } // namespace testing } // namespace grpc int main(int argc, char** argv) { grpc_test_init(argc, argv); ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }