1*cc02d7e2SAndroid Build Coastguard Worker //
2*cc02d7e2SAndroid Build Coastguard Worker //
3*cc02d7e2SAndroid Build Coastguard Worker // Copyright 2017 gRPC authors.
4*cc02d7e2SAndroid Build Coastguard Worker //
5*cc02d7e2SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
6*cc02d7e2SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
7*cc02d7e2SAndroid Build Coastguard Worker // You may obtain a copy of the License at
8*cc02d7e2SAndroid Build Coastguard Worker //
9*cc02d7e2SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0
10*cc02d7e2SAndroid Build Coastguard Worker //
11*cc02d7e2SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
12*cc02d7e2SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
13*cc02d7e2SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*cc02d7e2SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
15*cc02d7e2SAndroid Build Coastguard Worker // limitations under the License.
16*cc02d7e2SAndroid Build Coastguard Worker //
17*cc02d7e2SAndroid Build Coastguard Worker //
18*cc02d7e2SAndroid Build Coastguard Worker
19*cc02d7e2SAndroid Build Coastguard Worker #include <exception>
20*cc02d7e2SAndroid Build Coastguard Worker #include <memory>
21*cc02d7e2SAndroid Build Coastguard Worker
22*cc02d7e2SAndroid Build Coastguard Worker #include <gtest/gtest.h>
23*cc02d7e2SAndroid Build Coastguard Worker
24*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/port_platform.h>
25*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/channel.h>
26*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/client_context.h>
27*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/server.h>
28*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/server_builder.h>
29*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/server_context.h>
30*cc02d7e2SAndroid Build Coastguard Worker
31*cc02d7e2SAndroid Build Coastguard Worker #include "src/proto/grpc/testing/echo.grpc.pb.h"
32*cc02d7e2SAndroid Build Coastguard Worker #include "test/core/util/test_config.h"
33*cc02d7e2SAndroid Build Coastguard Worker
34*cc02d7e2SAndroid Build Coastguard Worker namespace grpc {
35*cc02d7e2SAndroid Build Coastguard Worker namespace testing {
36*cc02d7e2SAndroid Build Coastguard Worker
37*cc02d7e2SAndroid Build Coastguard Worker const char* kErrorMessage = "This service caused an exception";
38*cc02d7e2SAndroid Build Coastguard Worker
39*cc02d7e2SAndroid Build Coastguard Worker #if GRPC_ALLOW_EXCEPTIONS
40*cc02d7e2SAndroid Build Coastguard Worker class ExceptingServiceImpl : public grpc::testing::EchoTestService::Service {
41*cc02d7e2SAndroid Build Coastguard Worker public:
Echo(ServerContext *,const EchoRequest *,EchoResponse *)42*cc02d7e2SAndroid Build Coastguard Worker Status Echo(ServerContext* /*server_context*/, const EchoRequest* /*request*/,
43*cc02d7e2SAndroid Build Coastguard Worker EchoResponse* /*response*/) override {
44*cc02d7e2SAndroid Build Coastguard Worker throw -1;
45*cc02d7e2SAndroid Build Coastguard Worker }
RequestStream(ServerContext *,ServerReader<EchoRequest> *,EchoResponse *)46*cc02d7e2SAndroid Build Coastguard Worker Status RequestStream(ServerContext* /*context*/,
47*cc02d7e2SAndroid Build Coastguard Worker ServerReader<EchoRequest>* /*reader*/,
48*cc02d7e2SAndroid Build Coastguard Worker EchoResponse* /*response*/) override {
49*cc02d7e2SAndroid Build Coastguard Worker throw ServiceException();
50*cc02d7e2SAndroid Build Coastguard Worker }
51*cc02d7e2SAndroid Build Coastguard Worker
52*cc02d7e2SAndroid Build Coastguard Worker private:
53*cc02d7e2SAndroid Build Coastguard Worker class ServiceException final : public std::exception {
54*cc02d7e2SAndroid Build Coastguard Worker public:
ServiceException()55*cc02d7e2SAndroid Build Coastguard Worker ServiceException() {}
56*cc02d7e2SAndroid Build Coastguard Worker
57*cc02d7e2SAndroid Build Coastguard Worker private:
what() const58*cc02d7e2SAndroid Build Coastguard Worker const char* what() const noexcept override { return kErrorMessage; }
59*cc02d7e2SAndroid Build Coastguard Worker };
60*cc02d7e2SAndroid Build Coastguard Worker };
61*cc02d7e2SAndroid Build Coastguard Worker
62*cc02d7e2SAndroid Build Coastguard Worker class ExceptionTest : public ::testing::Test {
63*cc02d7e2SAndroid Build Coastguard Worker protected:
ExceptionTest()64*cc02d7e2SAndroid Build Coastguard Worker ExceptionTest() {}
65*cc02d7e2SAndroid Build Coastguard Worker
SetUp()66*cc02d7e2SAndroid Build Coastguard Worker void SetUp() override {
67*cc02d7e2SAndroid Build Coastguard Worker ServerBuilder builder;
68*cc02d7e2SAndroid Build Coastguard Worker builder.RegisterService(&service_);
69*cc02d7e2SAndroid Build Coastguard Worker server_ = builder.BuildAndStart();
70*cc02d7e2SAndroid Build Coastguard Worker }
71*cc02d7e2SAndroid Build Coastguard Worker
TearDown()72*cc02d7e2SAndroid Build Coastguard Worker void TearDown() override { server_->Shutdown(); }
73*cc02d7e2SAndroid Build Coastguard Worker
ResetStub()74*cc02d7e2SAndroid Build Coastguard Worker void ResetStub() {
75*cc02d7e2SAndroid Build Coastguard Worker channel_ = server_->InProcessChannel(ChannelArguments());
76*cc02d7e2SAndroid Build Coastguard Worker stub_ = grpc::testing::EchoTestService::NewStub(channel_);
77*cc02d7e2SAndroid Build Coastguard Worker }
78*cc02d7e2SAndroid Build Coastguard Worker
79*cc02d7e2SAndroid Build Coastguard Worker std::shared_ptr<Channel> channel_;
80*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<grpc::testing::EchoTestService::Stub> stub_;
81*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<Server> server_;
82*cc02d7e2SAndroid Build Coastguard Worker ExceptingServiceImpl service_;
83*cc02d7e2SAndroid Build Coastguard Worker };
84*cc02d7e2SAndroid Build Coastguard Worker
TEST_F(ExceptionTest,Unary)85*cc02d7e2SAndroid Build Coastguard Worker TEST_F(ExceptionTest, Unary) {
86*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
87*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
88*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
89*cc02d7e2SAndroid Build Coastguard Worker request.set_message("test");
90*cc02d7e2SAndroid Build Coastguard Worker
91*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < 10; i++) {
92*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
93*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
94*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(s.ok());
95*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(s.error_code(), StatusCode::UNKNOWN);
96*cc02d7e2SAndroid Build Coastguard Worker }
97*cc02d7e2SAndroid Build Coastguard Worker }
98*cc02d7e2SAndroid Build Coastguard Worker
TEST_F(ExceptionTest,RequestStream)99*cc02d7e2SAndroid Build Coastguard Worker TEST_F(ExceptionTest, RequestStream) {
100*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
101*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
102*cc02d7e2SAndroid Build Coastguard Worker
103*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < 10; i++) {
104*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
105*cc02d7e2SAndroid Build Coastguard Worker auto stream = stub_->RequestStream(&context, &response);
106*cc02d7e2SAndroid Build Coastguard Worker stream->WritesDone();
107*cc02d7e2SAndroid Build Coastguard Worker Status s = stream->Finish();
108*cc02d7e2SAndroid Build Coastguard Worker
109*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(s.ok());
110*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(s.error_code(), StatusCode::UNKNOWN);
111*cc02d7e2SAndroid Build Coastguard Worker }
112*cc02d7e2SAndroid Build Coastguard Worker }
113*cc02d7e2SAndroid Build Coastguard Worker
114*cc02d7e2SAndroid Build Coastguard Worker #endif // GRPC_ALLOW_EXCEPTIONS
115*cc02d7e2SAndroid Build Coastguard Worker
116*cc02d7e2SAndroid Build Coastguard Worker } // namespace testing
117*cc02d7e2SAndroid Build Coastguard Worker } // namespace grpc
118*cc02d7e2SAndroid Build Coastguard Worker
main(int argc,char ** argv)119*cc02d7e2SAndroid Build Coastguard Worker int main(int argc, char** argv) {
120*cc02d7e2SAndroid Build Coastguard Worker grpc::testing::TestEnvironment env(&argc, argv);
121*cc02d7e2SAndroid Build Coastguard Worker ::testing::InitGoogleTest(&argc, argv);
122*cc02d7e2SAndroid Build Coastguard Worker return RUN_ALL_TESTS();
123*cc02d7e2SAndroid Build Coastguard Worker }
124