xref: /aosp_15_r20/external/grpc-grpc/test/cpp/end2end/exception_test.cc (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
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