Craig Tiller | fbac5f1 | 2015-05-15 14:20:44 -0700 | [diff] [blame] | 1 | /* |
| 2 | * |
Jan Tattermusch | 7897ae9 | 2017-06-07 22:57:36 +0200 | [diff] [blame] | 3 | * Copyright 2015 gRPC authors. |
Craig Tiller | fbac5f1 | 2015-05-15 14:20:44 -0700 | [diff] [blame] | 4 | * |
Jan Tattermusch | 7897ae9 | 2017-06-07 22:57:36 +0200 | [diff] [blame] | 5 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 6 | * you may not use this file except in compliance with the License. |
| 7 | * You may obtain a copy of the License at |
Craig Tiller | fbac5f1 | 2015-05-15 14:20:44 -0700 | [diff] [blame] | 8 | * |
Jan Tattermusch | 7897ae9 | 2017-06-07 22:57:36 +0200 | [diff] [blame] | 9 | * http://www.apache.org/licenses/LICENSE-2.0 |
Craig Tiller | fbac5f1 | 2015-05-15 14:20:44 -0700 | [diff] [blame] | 10 | * |
Jan Tattermusch | 7897ae9 | 2017-06-07 22:57:36 +0200 | [diff] [blame] | 11 | * Unless required by applicable law or agreed to in writing, software |
| 12 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 14 | * See the License for the specific language governing permissions and |
| 15 | * limitations under the License. |
Craig Tiller | fbac5f1 | 2015-05-15 14:20:44 -0700 | [diff] [blame] | 16 | * |
| 17 | */ |
| 18 | |
Sree Kuchibhotla | 5a05f51 | 2016-01-13 22:43:20 -0800 | [diff] [blame] | 19 | #include <grpc/grpc.h> |
David Garcia Quintas | c79b065 | 2016-07-27 21:11:58 -0700 | [diff] [blame] | 20 | #include <grpc/support/log.h> |
Sree Kuchibhotla | 5a05f51 | 2016-01-13 22:43:20 -0800 | [diff] [blame] | 21 | #include <grpc/support/time.h> |
Vijay Pai | c90a856 | 2018-03-08 21:20:24 -0800 | [diff] [blame] | 22 | #include <grpcpp/channel.h> |
| 23 | #include <grpcpp/client_context.h> |
| 24 | #include <grpcpp/create_channel.h> |
| 25 | #include <grpcpp/server.h> |
| 26 | #include <grpcpp/server_builder.h> |
| 27 | #include <grpcpp/server_context.h> |
Craig Tiller | fbac5f1 | 2015-05-15 14:20:44 -0700 | [diff] [blame] | 28 | |
Sree Kuchibhotla | 5a05f51 | 2016-01-13 22:43:20 -0800 | [diff] [blame] | 29 | #include "src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h" |
| 30 | #include "src/proto/grpc/testing/echo.grpc.pb.h" |
yang-g | 9e2f90c | 2015-08-21 15:35:03 -0700 | [diff] [blame] | 31 | #include "test/core/util/port.h" |
| 32 | #include "test/core/util/test_config.h" |
Craig Tiller | fbac5f1 | 2015-05-15 14:20:44 -0700 | [diff] [blame] | 33 | #include "test/cpp/util/subprocess.h" |
| 34 | |
Nicolas "Pixel" Noble | 3726e3d | 2017-05-10 18:33:12 +0200 | [diff] [blame] | 35 | #include <gtest/gtest.h> |
| 36 | |
Craig Tiller | 1b4e330 | 2015-12-17 16:35:00 -0800 | [diff] [blame] | 37 | using grpc::testing::EchoRequest; |
| 38 | using grpc::testing::EchoResponse; |
Craig Tiller | fbac5f1 | 2015-05-15 14:20:44 -0700 | [diff] [blame] | 39 | using std::chrono::system_clock; |
| 40 | |
| 41 | static std::string g_root; |
| 42 | |
| 43 | namespace grpc { |
| 44 | namespace testing { |
| 45 | |
| 46 | namespace { |
| 47 | |
Vijay Pai | 713c7b8 | 2016-11-01 16:33:18 -0700 | [diff] [blame] | 48 | class ServiceImpl final : public ::grpc::testing::EchoTestService::Service { |
Yang Gao | a9b5de8 | 2015-05-26 23:35:21 -0700 | [diff] [blame] | 49 | public: |
| 50 | ServiceImpl() : bidi_stream_count_(0), response_stream_count_(0) {} |
| 51 | |
Vijay Pai | 713c7b8 | 2016-11-01 16:33:18 -0700 | [diff] [blame] | 52 | Status BidiStream( |
| 53 | ServerContext* context, |
| 54 | ServerReaderWriter<EchoResponse, EchoRequest>* stream) override { |
Yang Gao | a9b5de8 | 2015-05-26 23:35:21 -0700 | [diff] [blame] | 55 | bidi_stream_count_++; |
Craig Tiller | 7a317e5 | 2015-05-19 09:38:29 -0700 | [diff] [blame] | 56 | EchoRequest request; |
| 57 | EchoResponse response; |
| 58 | while (stream->Read(&request)) { |
| 59 | gpr_log(GPR_INFO, "recv msg %s", request.message().c_str()); |
| 60 | response.set_message(request.message()); |
| 61 | stream->Write(response); |
Craig Tiller | 677c50c | 2015-07-13 10:49:06 -0700 | [diff] [blame] | 62 | gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), |
| 63 | gpr_time_from_seconds(1, GPR_TIMESPAN))); |
Craig Tiller | fd7166d | 2015-05-19 10:23:03 -0700 | [diff] [blame] | 64 | } |
| 65 | return Status::OK; |
| 66 | } |
| 67 | |
| 68 | Status ResponseStream(ServerContext* context, const EchoRequest* request, |
Vijay Pai | c0b2acb | 2016-11-01 16:31:56 -0700 | [diff] [blame] | 69 | ServerWriter<EchoResponse>* writer) override { |
Craig Tiller | fd7166d | 2015-05-19 10:23:03 -0700 | [diff] [blame] | 70 | EchoResponse response; |
Yang Gao | a9b5de8 | 2015-05-26 23:35:21 -0700 | [diff] [blame] | 71 | response_stream_count_++; |
Craig Tiller | fd7166d | 2015-05-19 10:23:03 -0700 | [diff] [blame] | 72 | for (int i = 0;; i++) { |
| 73 | std::ostringstream msg; |
| 74 | msg << "Hello " << i; |
| 75 | response.set_message(msg.str()); |
| 76 | if (!writer->Write(response)) break; |
Craig Tiller | 677c50c | 2015-07-13 10:49:06 -0700 | [diff] [blame] | 77 | gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), |
| 78 | gpr_time_from_seconds(1, GPR_TIMESPAN))); |
Craig Tiller | 7a317e5 | 2015-05-19 09:38:29 -0700 | [diff] [blame] | 79 | } |
| 80 | return Status::OK; |
| 81 | } |
Yang Gao | a9b5de8 | 2015-05-26 23:35:21 -0700 | [diff] [blame] | 82 | |
| 83 | int bidi_stream_count() { return bidi_stream_count_; } |
| 84 | |
| 85 | int response_stream_count() { return response_stream_count_; } |
| 86 | |
| 87 | private: |
| 88 | int bidi_stream_count_; |
| 89 | int response_stream_count_; |
Craig Tiller | 7a317e5 | 2015-05-19 09:38:29 -0700 | [diff] [blame] | 90 | }; |
| 91 | |
Craig Tiller | fbac5f1 | 2015-05-15 14:20:44 -0700 | [diff] [blame] | 92 | class CrashTest : public ::testing::Test { |
| 93 | protected: |
| 94 | CrashTest() {} |
| 95 | |
Yang Gao | a9b5de8 | 2015-05-26 23:35:21 -0700 | [diff] [blame] | 96 | std::unique_ptr<Server> CreateServerAndClient(const std::string& mode) { |
Craig Tiller | fbac5f1 | 2015-05-15 14:20:44 -0700 | [diff] [blame] | 97 | auto port = grpc_pick_unused_port_or_die(); |
Craig Tiller | a969d7c | 2015-05-15 15:47:51 -0700 | [diff] [blame] | 98 | std::ostringstream addr_stream; |
| 99 | addr_stream << "localhost:" << port; |
| 100 | auto addr = addr_stream.str(); |
Yang Gao | a9b5de8 | 2015-05-26 23:35:21 -0700 | [diff] [blame] | 101 | client_.reset(new SubProcess({g_root + "/server_crash_test_client", |
| 102 | "--address=" + addr, "--mode=" + mode})); |
Craig Tiller | 7a317e5 | 2015-05-19 09:38:29 -0700 | [diff] [blame] | 103 | GPR_ASSERT(client_); |
| 104 | |
| 105 | ServerBuilder builder; |
| 106 | builder.AddListeningPort(addr, grpc::InsecureServerCredentials()); |
| 107 | builder.RegisterService(&service_); |
| 108 | return builder.BuildAndStart(); |
Craig Tiller | fbac5f1 | 2015-05-15 14:20:44 -0700 | [diff] [blame] | 109 | } |
| 110 | |
Yang Gao | a9b5de8 | 2015-05-26 23:35:21 -0700 | [diff] [blame] | 111 | void KillClient() { client_.reset(); } |
| 112 | |
| 113 | bool HadOneBidiStream() { return service_.bidi_stream_count() == 1; } |
| 114 | |
| 115 | bool HadOneResponseStream() { return service_.response_stream_count() == 1; } |
Craig Tiller | fbac5f1 | 2015-05-15 14:20:44 -0700 | [diff] [blame] | 116 | |
| 117 | private: |
Craig Tiller | 7a317e5 | 2015-05-19 09:38:29 -0700 | [diff] [blame] | 118 | std::unique_ptr<SubProcess> client_; |
| 119 | ServiceImpl service_; |
Craig Tiller | fbac5f1 | 2015-05-15 14:20:44 -0700 | [diff] [blame] | 120 | }; |
| 121 | |
Craig Tiller | fd7166d | 2015-05-19 10:23:03 -0700 | [diff] [blame] | 122 | TEST_F(CrashTest, ResponseStream) { |
| 123 | auto server = CreateServerAndClient("response"); |
| 124 | |
Craig Tiller | 677c50c | 2015-07-13 10:49:06 -0700 | [diff] [blame] | 125 | gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), |
Craig Tiller | fbcd9a7 | 2016-12-05 08:47:02 -0800 | [diff] [blame] | 126 | gpr_time_from_seconds(60, GPR_TIMESPAN))); |
Craig Tiller | fd7166d | 2015-05-19 10:23:03 -0700 | [diff] [blame] | 127 | KillClient(); |
| 128 | server->Shutdown(); |
Yang Gao | a9b5de8 | 2015-05-26 23:35:21 -0700 | [diff] [blame] | 129 | GPR_ASSERT(HadOneResponseStream()); |
Craig Tiller | fd7166d | 2015-05-19 10:23:03 -0700 | [diff] [blame] | 130 | } |
| 131 | |
| 132 | TEST_F(CrashTest, BidiStream) { |
| 133 | auto server = CreateServerAndClient("bidi"); |
Craig Tiller | fbac5f1 | 2015-05-15 14:20:44 -0700 | [diff] [blame] | 134 | |
Craig Tiller | 677c50c | 2015-07-13 10:49:06 -0700 | [diff] [blame] | 135 | gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), |
Craig Tiller | fbcd9a7 | 2016-12-05 08:47:02 -0800 | [diff] [blame] | 136 | gpr_time_from_seconds(60, GPR_TIMESPAN))); |
Craig Tiller | 7a317e5 | 2015-05-19 09:38:29 -0700 | [diff] [blame] | 137 | KillClient(); |
| 138 | server->Shutdown(); |
Yang Gao | a9b5de8 | 2015-05-26 23:35:21 -0700 | [diff] [blame] | 139 | GPR_ASSERT(HadOneBidiStream()); |
Craig Tiller | fbac5f1 | 2015-05-15 14:20:44 -0700 | [diff] [blame] | 140 | } |
| 141 | |
| 142 | } // namespace |
| 143 | |
| 144 | } // namespace testing |
| 145 | } // namespace grpc |
| 146 | |
| 147 | int main(int argc, char** argv) { |
| 148 | std::string me = argv[0]; |
| 149 | auto lslash = me.rfind('/'); |
| 150 | if (lslash != std::string::npos) { |
| 151 | g_root = me.substr(0, lslash); |
| 152 | } else { |
| 153 | g_root = "."; |
| 154 | } |
| 155 | |
| 156 | grpc_test_init(argc, argv); |
| 157 | ::testing::InitGoogleTest(&argc, argv); |
| 158 | return RUN_ALL_TESTS(); |
David Garcia Quintas | 2bf574f | 2016-01-14 15:27:08 -0800 | [diff] [blame] | 159 | } |