server_builder_plugin_test.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2016 gRPC authors.
4  *
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
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
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.
16  *
17  */
18 
19 #include <thread>
20 
21 #include <gtest/gtest.h>
22 
23 #include "absl/memory/memory.h"
24 
25 #include <grpc/grpc.h>
26 #include <grpcpp/channel.h>
27 #include <grpcpp/client_context.h>
28 #include <grpcpp/create_channel.h>
34 #include <grpcpp/server.h>
35 #include <grpcpp/server_builder.h>
36 #include <grpcpp/server_context.h>
37 
38 #include "src/proto/grpc/testing/echo.grpc.pb.h"
39 #include "test/core/util/port.h"
42 
43 #define PLUGIN_NAME "TestServerBuilderPlugin"
44 
45 namespace grpc {
46 namespace testing {
47 
49  public:
51  init_server_is_called_ = false;
52  finish_is_called_ = false;
54  register_service_ = false;
55  }
56 
57  std::string name() override { return PLUGIN_NAME; }
58 
59  void InitServer(ServerInitializer* si) override {
61  if (register_service_) {
63  }
64  }
65 
66  void Finish(ServerInitializer* /*si*/) override { finish_is_called_ = true; }
67 
68  void ChangeArguments(const std::string& /*name*/, void* /*value*/) override {
70  }
71 
72  bool has_async_methods() const override {
73  if (register_service_) {
74  return service_->has_async_methods();
75  }
76  return false;
77  }
78 
79  bool has_sync_methods() const override {
80  if (register_service_) {
81  return service_->has_synchronous_methods();
82  }
83  return false;
84  }
85 
87 
91 
92  private:
97  std::shared_ptr<TestServiceImpl> service_;
98 };
99 
101  public:
103 
104  void UpdateArguments(ChannelArguments* /*arg*/) override {}
105 
107  std::vector<std::unique_ptr<ServerBuilderPlugin>>* plugins) override {
108  plugins->clear();
109 
110  std::unique_ptr<TestServerBuilderPlugin> plugin(
112  if (register_service_) plugin->SetRegisterService();
113  plugins->emplace_back(std::move(plugin));
114  }
115 
117 
118  private:
120 };
121 
122 std::unique_ptr<ServerBuilderPlugin> CreateTestServerBuilderPlugin() {
123  return std::unique_ptr<ServerBuilderPlugin>(new TestServerBuilderPlugin());
124 }
125 
126 // Force AddServerBuilderPlugin() to be called at static initialization time.
131  }
133 
134 // When the param boolean is true, the ServerBuilder plugin will be added at the
135 // time of static initialization. When it's false, the ServerBuilder plugin will
136 // be added using ServerBuilder::SetOption().
138  public:
140 
141  void SetUp() override {
143  builder_ = absl::make_unique<ServerBuilder>();
144  }
145 
146  void InsertPlugin() {
147  if (GetParam()) {
148  // Add ServerBuilder plugin in static initialization
149  CheckPresent();
150  } else {
151  // Add ServerBuilder plugin using ServerBuilder::SetOption()
152  builder_->SetOption(std::unique_ptr<ServerBuilderOption>(
154  }
155  }
156 
158  if (GetParam()) {
159  // Add ServerBuilder plugin in static initialization
160  auto plugin = CheckPresent();
161  EXPECT_TRUE(plugin);
162  plugin->SetRegisterService();
163  } else {
164  // Add ServerBuilder plugin using ServerBuilder::SetOption()
165  std::unique_ptr<InsertPluginServerBuilderOption> option(
167  option->SetRegisterService();
168  builder_->SetOption(std::move(option));
169  }
170  }
171 
172  void StartServer() {
173  std::string server_address = "localhost:" + to_string(port_);
174  builder_->AddListeningPort(server_address, InsecureServerCredentials());
175  // we run some tests without a service, and for those we need to supply a
176  // frequently polled completion queue
177  cq_ = builder_->AddCompletionQueue();
179  server_ = builder_->BuildAndStart();
181  }
182 
183  void ResetStub() {
184  string target = "dns:localhost:" + to_string(port_);
186  stub_ = grpc::testing::EchoTestService::NewStub(channel_);
187  }
188 
189  void TearDown() override {
190  auto plugin = CheckPresent();
191  EXPECT_TRUE(plugin);
192  EXPECT_TRUE(plugin->init_server_is_called());
193  EXPECT_TRUE(plugin->finish_is_called());
194  server_->Shutdown();
195  cq_->Shutdown();
196  cq_thread_->join();
197  delete cq_thread_;
198  }
199 
200  string to_string(const int number) {
201  std::stringstream strs;
202  strs << number;
203  return strs.str();
204  }
205 
206  protected:
207  std::shared_ptr<Channel> channel_;
208  std::unique_ptr<ServerBuilder> builder_;
209  std::unique_ptr<grpc::testing::EchoTestService::Stub> stub_;
210  std::unique_ptr<ServerCompletionQueue> cq_;
211  std::unique_ptr<Server> server_;
214  int port_;
215 
216  private:
218  auto it = builder_->plugins_.begin();
219  for (; it != builder_->plugins_.end(); it++) {
220  if ((*it)->name() == PLUGIN_NAME) break;
221  }
222  if (it != builder_->plugins_.end()) {
223  return static_cast<TestServerBuilderPlugin*>(it->get());
224  } else {
225  return nullptr;
226  }
227  }
228 
229  void RunCQ() {
230  void* tag;
231  bool ok;
232  while (cq_->Next(&tag, &ok)) {
233  }
234  }
235 };
236 
237 TEST_P(ServerBuilderPluginTest, PluginWithoutServiceTest) {
238  InsertPlugin();
239  StartServer();
240 }
241 
242 TEST_P(ServerBuilderPluginTest, PluginWithServiceTest) {
243  InsertPluginWithTestService();
244  StartServer();
245  ResetStub();
246 
247  EchoRequest request;
248  EchoResponse response;
249  request.set_message("Hello hello hello hello");
252  Status s = stub_->Echo(&context, request, &response);
253  EXPECT_EQ(response.message(), request.message());
254  EXPECT_TRUE(s.ok());
255 }
256 
257 INSTANTIATE_TEST_SUITE_P(ServerBuilderPluginTest, ServerBuilderPluginTest,
258  ::testing::Values(false, true));
259 
260 } // namespace testing
261 } // namespace grpc
262 
263 int main(int argc, char** argv) {
264  grpc::testing::TestEnvironment env(&argc, argv);
265  ::testing::InitGoogleTest(&argc, argv);
266  return RUN_ALL_TESTS();
267 }
testing
Definition: aws_request_signer_test.cc:25
PLUGIN_NAME
#define PLUGIN_NAME
Definition: server_builder_plugin_test.cc:43
regen-readme.it
it
Definition: regen-readme.py:15
stub_
std::unique_ptr< grpc::testing::EchoTestService::Stub > stub_
Definition: client_channel_stress_test.cc:331
port.h
server_initializer.h
generate.env
env
Definition: generate.py:37
grpc
Definition: grpcpp/alarm.h:33
grpc::testing::TestServerBuilderPlugin::ChangeArguments
void ChangeArguments(const std::string &, void *) override
Definition: server_builder_plugin_test.cc:68
grpc::testing::ServerBuilderPluginTest
Definition: server_builder_plugin_test.cc:137
grpc::testing::CreateTestServerBuilderPlugin
std::unique_ptr< ServerBuilderPlugin > CreateTestServerBuilderPlugin()
Definition: server_builder_plugin_test.cc:122
grpc::testing::ServerBuilderPluginTest::to_string
string to_string(const int number)
Definition: server_builder_plugin_test.cc:200
benchmark.request
request
Definition: benchmark.py:77
grpc::testing::TestServerBuilderPlugin::change_arguments_is_called_
bool change_arguments_is_called_
Definition: server_builder_plugin_test.cc:95
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
grpc::testing::ServerBuilderPluginTest::channel_
std::shared_ptr< Channel > channel_
Definition: server_builder_plugin_test.cc:207
grpc::testing::ServerBuilderPluginTest::StartServer
void StartServer()
Definition: server_builder_plugin_test.cc:172
grpc::testing::InsertPluginServerBuilderOption::UpdatePlugins
void UpdatePlugins(std::vector< std::unique_ptr< ServerBuilderPlugin >> *plugins) override
Definition: server_builder_plugin_test.cc:106
env.new
def new
Definition: env.py:51
grpc::testing::ServerBuilderPluginTest::cq_thread_
std::thread * cq_thread_
Definition: server_builder_plugin_test.cc:212
grpc::testing::TestServerBuilderPlugin::TestServerBuilderPlugin
TestServerBuilderPlugin()
Definition: server_builder_plugin_test.cc:50
grpc::testing::TestServiceImpl
TestMultipleServiceImpl< grpc::testing::EchoTestService::Service > TestServiceImpl
Definition: test_service_impl.h:498
server_address
std::string server_address("0.0.0.0:10000")
test_service_impl.h
testing::TestWithParam
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1883
main
int main(int argc, char **argv)
Definition: server_builder_plugin_test.cc:263
grpc::testing::ServerBuilderPluginTest::service_
TestServiceImpl service_
Definition: server_builder_plugin_test.cc:213
server_builder_plugin.h
grpc::testing::TestServerBuilderPlugin::Finish
void Finish(ServerInitializer *) override
Finish will be called at the end of ServerBuilder::BuildAndStart().
Definition: server_builder_plugin_test.cc:66
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
grpc::testing::InsertPluginServerBuilderOption::InsertPluginServerBuilderOption
InsertPluginServerBuilderOption()
Definition: server_builder_plugin_test.cc:102
grpc::testing::TestServerBuilderPlugin::has_async_methods
bool has_async_methods() const override
Definition: server_builder_plugin_test.cc:72
grpc::testing::ServerBuilderPluginTest::ServerBuilderPluginTest
ServerBuilderPluginTest()
Definition: server_builder_plugin_test.cc:139
grpc::testing::TestServerBuilderPlugin::finish_is_called
bool finish_is_called()
Definition: server_builder_plugin_test.cc:89
grpc.h
channel.h
number
int32_t number
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/protobuf.h:850
grpc::testing::TestServerBuilderPlugin::SetRegisterService
void SetRegisterService()
Definition: server_builder_plugin_test.cc:86
grpc::testing::INSTANTIATE_TEST_SUITE_P
INSTANTIATE_TEST_SUITE_P(HistogramTestCases, HistogramTest, ::testing::Range< int >(0, GRPC_STATS_HISTOGRAM_COUNT))
grpc::testing::TestServerBuilderPlugin::change_arguments_is_called
bool change_arguments_is_called()
Definition: server_builder_plugin_test.cc:90
grpc::testing::ServerBuilderPluginTest::server_
std::unique_ptr< Server > server_
Definition: server_builder_plugin_test.cc:211
grpc::testing::ServerBuilderPluginTest::cq_
std::unique_ptr< ServerCompletionQueue > cq_
Definition: server_builder_plugin_test.cc:210
grpc::CreateChannel
std::shared_ptr< Channel > CreateChannel(const grpc::string &target, const std::shared_ptr< ChannelCredentials > &creds)
RUN_ALL_TESTS
int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2471
grpc::ServerBuilderOption
Interface to pass an option to a ServerBuilder.
Definition: grpcpp/impl/server_builder_option.h:31
server_builder_option.h
grpc_pick_unused_port_or_die
int grpc_pick_unused_port_or_die(void)
grpc::testing::ServerBuilderPluginTest::port_
int port_
Definition: server_builder_plugin_test.cc:214
grpc::testing::TestServerBuilderPlugin
Definition: server_builder_plugin_test.cc:48
server_credentials.h
grpc::testing::tag
static void * tag(intptr_t t)
Definition: h2_ssl_cert_test.cc:263
grpc::ClientContext
Definition: grpcpp/impl/codegen/client_context.h:195
test_config.h
grpc::testing::ServerBuilderPluginTest::builder_
std::unique_ptr< ServerBuilder > builder_
Definition: server_builder_plugin_test.cc:208
grpc::testing::static_plugin_initializer_test_
struct grpc::testing::StaticTestPluginInitializer static_plugin_initializer_test_
grpc::testing::ServerBuilderPluginTest::stub_
std::unique_ptr< grpc::testing::EchoTestService::Stub > stub_
Definition: server_builder_plugin_test.cc:209
grpc::testing::TestServerBuilderPlugin::init_server_is_called_
bool init_server_is_called_
Definition: server_builder_plugin_test.cc:93
grpc::ChannelArguments
Definition: grpcpp/support/channel_arguments.h:39
grpc::testing::InsertPluginServerBuilderOption::register_service_
bool register_service_
Definition: server_builder_plugin_test.cc:119
client_context.h
testing::InitGoogleTest
GTEST_API_ void InitGoogleTest(int *argc, char **argv)
Definition: bloaty/third_party/googletest/googletest/src/gtest.cc:6106
credentials.h
testing::Values
internal::ValueArray< T... > Values(T... v)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest-param-test.h:335
grpc::testing::TestServerBuilderPlugin::service_
std::shared_ptr< TestServiceImpl > service_
Definition: server_builder_plugin_test.cc:97
grpc::testing::InsertPluginServerBuilderOption::SetRegisterService
void SetRegisterService()
Definition: server_builder_plugin_test.cc:116
grpc::testing::InsertPluginServerBuilderOption::UpdateArguments
void UpdateArguments(ChannelArguments *) override
Alter the ChannelArguments used to create the gRPC server.
Definition: server_builder_plugin_test.cc:104
grpc::testing::TestServerBuilderPlugin::register_service_
bool register_service_
Definition: server_builder_plugin_test.cc:96
StartServer
void StartServer(JNIEnv *env, jobject obj, jmethodID is_cancelled_mid, int port)
Definition: grpc-helloworld.cc:48
grpc::testing::StaticTestPluginInitializer
Definition: server_builder_plugin_test.cc:127
grpc::testing::TestServerBuilderPlugin::init_server_is_called
bool init_server_is_called()
Definition: server_builder_plugin_test.cc:88
server_context.h
asyncio_get_stats.response
response
Definition: asyncio_get_stats.py:28
grpc::testing::ServerBuilderPluginTest::InsertPlugin
void InsertPlugin()
Definition: server_builder_plugin_test.cc:146
grpc::testing::TestEnvironment
Definition: test/core/util/test_config.h:54
GRPC_COMPRESS_GZIP
@ GRPC_COMPRESS_GZIP
Definition: compression_types.h:63
grpc::testing::ServerBuilderPluginTest::RunCQ
void RunCQ()
Definition: server_builder_plugin_test.cc:229
grpc::testing::TestServerBuilderPlugin::has_sync_methods
bool has_sync_methods() const override
Definition: server_builder_plugin_test.cc:79
testing::WithParamInterface< bool >::GetParam
static const ParamType & GetParam()
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1855
grpc::Status
Definition: include/grpcpp/impl/codegen/status.h:35
ok
bool ok
Definition: async_end2end_test.cc:197
grpc::testing::TestServerBuilderPlugin::finish_is_called_
bool finish_is_called_
Definition: server_builder_plugin_test.cc:94
grpc::testing::EXPECT_EQ
EXPECT_EQ(options.token_exchange_service_uri, "https://foo/exchange")
grpc::testing::ServerBuilderPluginTest::InsertPluginWithTestService
void InsertPluginWithTestService()
Definition: server_builder_plugin_test.cc:157
grpc::InsecureServerCredentials
std::shared_ptr< ServerCredentials > InsecureServerCredentials()
Definition: insecure_server_credentials.cc:52
context
grpc::ClientContext context
Definition: istio_echo_server_lib.cc:61
grpc::testing::TEST_P
TEST_P(HistogramTest, IncHistogram)
Definition: stats_test.cc:87
grpc::testing::ServerBuilderPluginTest::ResetStub
void ResetStub()
Definition: server_builder_plugin_test.cc:183
grpc::testing::TestServerBuilderPlugin::name
std::string name() override
Definition: server_builder_plugin_test.cc:57
grpc::testing::EXPECT_TRUE
EXPECT_TRUE(grpc::experimental::StsCredentialsOptionsFromJson(minimum_valid_json, &options) .ok())
grpc::testing::TestServerBuilderPlugin::InitServer
void InitServer(ServerInitializer *si) override
Definition: server_builder_plugin_test.cc:59
server.h
grpc::InsecureChannelCredentials
std::shared_ptr< ChannelCredentials > InsecureChannelCredentials()
Credentials for an unencrypted, unauthenticated channel.
Definition: cpp/client/insecure_credentials.cc:69
grpc::testing::ServerBuilderPluginTest::SetUp
void SetUp() override
Definition: server_builder_plugin_test.cc:141
grpc::ServerInitializer::RegisterService
bool RegisterService(std::shared_ptr< grpc::Service > service)
Definition: grpcpp/impl/server_initializer.h:35
grpc::ServerBuilder::InternalAddPluginFactory
static void InternalAddPluginFactory(std::unique_ptr< grpc::ServerBuilderPlugin >(*CreatePlugin)())
For internal use only: Register a ServerBuilderPlugin factory function.
Definition: server_builder.cc:458
grpc::ServerBuilderPlugin
Definition: grpcpp/impl/server_builder_plugin.h:35
grpc::ServerInitializer
Definition: grpcpp/impl/server_initializer.h:31
grpc::ClientContext::set_compression_algorithm
void set_compression_algorithm(grpc_compression_algorithm algorithm)
Definition: client_context.cc:144
grpc::testing::StaticTestPluginInitializer::StaticTestPluginInitializer
StaticTestPluginInitializer()
Definition: server_builder_plugin_test.cc:128
google_benchmark.option
option
Definition: third_party/benchmark/bindings/python/google_benchmark/__init__.py:115
grpc::testing::ServerBuilderPluginTest::TearDown
void TearDown() override
Definition: server_builder_plugin_test.cc:189
setup.target
target
Definition: third_party/bloaty/third_party/protobuf/python/setup.py:179
thread
static uv_thread_t thread
Definition: test-async-null-cb.c:29
server_builder.h
grpc::testing::ServerBuilderPluginTest::CheckPresent
TestServerBuilderPlugin * CheckPresent()
Definition: server_builder_plugin_test.cc:217
create_channel.h
grpc::testing::InsertPluginServerBuilderOption
Definition: server_builder_plugin_test.cc:100


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:01:16