channelz_service_test.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2018 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 
20 
21 #include <gtest/gtest.h>
22 
23 #include "absl/memory/memory.h"
24 
25 #include <grpc/grpc.h>
26 #include <grpc/grpc_security.h>
27 #include <grpcpp/channel.h>
28 #include <grpcpp/client_context.h>
29 #include <grpcpp/create_channel.h>
33 #include <grpcpp/server.h>
34 #include <grpcpp/server_builder.h>
35 #include <grpcpp/server_context.h>
36 
37 #include "src/core/lib/gpr/env.h"
43 #include "src/proto/grpc/channelz/channelz.grpc.pb.h"
44 #include "src/proto/grpc/testing/echo.grpc.pb.h"
45 #include "test/core/util/port.h"
49 
51 using grpc::channelz::v1::GetChannelRequest;
52 using grpc::channelz::v1::GetChannelResponse;
53 using grpc::channelz::v1::GetServerRequest;
54 using grpc::channelz::v1::GetServerResponse;
55 using grpc::channelz::v1::GetServerSocketsRequest;
56 using grpc::channelz::v1::GetServerSocketsResponse;
57 using grpc::channelz::v1::GetServersRequest;
58 using grpc::channelz::v1::GetServersResponse;
59 using grpc::channelz::v1::GetSocketRequest;
60 using grpc::channelz::v1::GetSocketResponse;
61 using grpc::channelz::v1::GetSubchannelRequest;
62 using grpc::channelz::v1::GetSubchannelResponse;
63 using grpc::channelz::v1::GetTopChannelsRequest;
64 using grpc::channelz::v1::GetTopChannelsResponse;
65 
66 namespace grpc {
67 namespace testing {
68 namespace {
69 
70 bool ValidateAddress(const Address& address) {
71  if (address.address_case() != Address::kTcpipAddress) {
72  return true;
73  }
74  return address.tcpip_address().ip_address().size() == 4 ||
75  address.tcpip_address().ip_address().size() == 16;
76 }
77 
78 // Proxy service supports N backends. Sends RPC to backend dictated by
79 // request->backend_channel_idx().
80 class Proxy : public grpc::testing::EchoTestService::Service {
81  public:
82  Proxy() {}
83 
84  void AddChannelToBackend(const std::shared_ptr<Channel>& channel) {
85  stubs_.push_back(grpc::testing::EchoTestService::NewStub(channel));
86  }
87 
88  Status Echo(ServerContext* server_context, const EchoRequest* request,
89  EchoResponse* response) override {
90  std::unique_ptr<ClientContext> client_context =
91  ClientContext::FromServerContext(*server_context);
92  size_t idx = request->param().backend_channel_idx();
93  GPR_ASSERT(idx < stubs_.size());
94  return stubs_[idx]->Echo(client_context.get(), *request, response);
95  }
96 
97  Status BidiStream(ServerContext* server_context,
98  ServerReaderWriter<EchoResponse, EchoRequest>*
99  stream_from_client) override {
100  EchoRequest request;
101  EchoResponse response;
102  std::unique_ptr<ClientContext> client_context =
103  ClientContext::FromServerContext(*server_context);
104 
105  // always use the first proxy for streaming
106  auto stream_to_backend = stubs_[0]->BidiStream(client_context.get());
107  while (stream_from_client->Read(&request)) {
108  stream_to_backend->Write(request);
109  stream_to_backend->Read(&response);
110  stream_from_client->Write(response);
111  }
112 
113  stream_to_backend->WritesDone();
114  return stream_to_backend->Finish();
115  }
116 
117  private:
118  std::vector<std::unique_ptr<grpc::testing::EchoTestService::Stub>> stubs_;
119 };
120 
121 enum class CredentialsType {
122  kInsecure = 0,
123  kTls = 1,
124  kMtls = 2,
125 };
126 
127 constexpr char kCaCertPath[] = "src/core/tsi/test_creds/ca.pem";
128 constexpr char kServerCertPath[] = "src/core/tsi/test_creds/server1.pem";
129 constexpr char kServerKeyPath[] = "src/core/tsi/test_creds/server1.key";
130 constexpr char kClientCertPath[] = "src/core/tsi/test_creds/client.pem";
131 constexpr char kClientKeyPath[] = "src/core/tsi/test_creds/client.key";
132 
133 std::string ReadFile(const char* file_path) {
135  GPR_ASSERT(
136  GRPC_LOG_IF_ERROR("load_file", grpc_load_file(file_path, 0, &slice)));
139  return file_contents;
140 }
141 
142 std::shared_ptr<grpc::ChannelCredentials> GetChannelCredentials(
143  CredentialsType type, ChannelArguments* args) {
144  if (type == CredentialsType::kInsecure) {
146  }
147  args->SetSslTargetNameOverride("foo.test.google.fr");
148  std::vector<experimental::IdentityKeyCertPair> identity_key_cert_pairs = {
149  {ReadFile(kClientKeyPath), ReadFile(kClientCertPath)}};
151  options.set_certificate_provider(
152  std::make_shared<grpc::experimental::StaticDataCertificateProvider>(
153  ReadFile(kCaCertPath), identity_key_cert_pairs));
154  if (type == CredentialsType::kMtls) {
155  options.watch_identity_key_cert_pairs();
156  }
157  options.watch_root_certs();
159 }
160 
161 std::shared_ptr<grpc::ServerCredentials> GetServerCredentials(
162  CredentialsType type) {
163  if (type == CredentialsType::kInsecure) {
164  return InsecureServerCredentials();
165  }
166  std::vector<experimental::IdentityKeyCertPair> identity_key_cert_pairs = {
167  {ReadFile(kServerKeyPath), ReadFile(kServerCertPath)}};
168  auto certificate_provider =
169  std::make_shared<grpc::experimental::StaticDataCertificateProvider>(
170  ReadFile(kCaCertPath), identity_key_cert_pairs);
172  options.watch_root_certs();
173  options.watch_identity_key_cert_pairs();
176 }
177 
178 std::string RemoveWhitespaces(std::string input) {
179  input.erase(remove_if(input.begin(), input.end(), isspace), input.end());
180  return input;
181 }
182 
183 class ChannelzServerTest : public ::testing::TestWithParam<CredentialsType> {
184  public:
185  ChannelzServerTest() {}
186  static void SetUpTestCase() {
187 #if TARGET_OS_IPHONE
188  // Workaround Apple CFStream bug
189  gpr_setenv("grpc_cfstream", "0");
190 #endif
191  }
192  void SetUp() override {
193  // ensure channel server is brought up on all severs we build.
195 
196  // We set up a proxy server with channelz enabled.
198  ServerBuilder proxy_builder;
199  std::string proxy_server_address = "localhost:" + to_string(proxy_port_);
200  proxy_builder.AddListeningPort(proxy_server_address,
201  GetServerCredentials(GetParam()));
202  // forces channelz and channel tracing to be enabled.
203  proxy_builder.AddChannelArgument(GRPC_ARG_ENABLE_CHANNELZ, 1);
204  proxy_builder.AddChannelArgument(
206  proxy_builder.RegisterService(&proxy_service_);
207  proxy_server_ = proxy_builder.BuildAndStart();
208  }
209 
210  void TearDown() override {
211  for (auto& backend : backends_) {
212  backend.server->Shutdown(grpc_timeout_milliseconds_to_deadline(0));
213  }
215  }
216 
217  // Sets the proxy up to have an arbitrary number of backends.
218  void ConfigureProxy(size_t num_backends) {
219  backends_.resize(num_backends);
220  for (size_t i = 0; i < num_backends; ++i) {
221  // create a new backend.
223  ServerBuilder backend_builder;
224  std::string backend_server_address =
225  "localhost:" + to_string(backends_[i].port);
226  backend_builder.AddListeningPort(backend_server_address,
227  GetServerCredentials(GetParam()));
228  backends_[i].service = absl::make_unique<TestServiceImpl>();
229  // ensure that the backend itself has channelz disabled.
230  backend_builder.AddChannelArgument(GRPC_ARG_ENABLE_CHANNELZ, 0);
231  backend_builder.RegisterService(backends_[i].service.get());
232  backends_[i].server = backend_builder.BuildAndStart();
233  // set up a channel to the backend. We ensure that this channel has
234  // channelz enabled since these channels (proxy outbound to backends)
235  // are the ones that our test will actually be validating.
236  ChannelArguments args;
237  args.SetInt(GRPC_ARG_ENABLE_CHANNELZ, 1);
239  std::shared_ptr<Channel> channel_to_backend = grpc::CreateCustomChannel(
240  backend_server_address, GetChannelCredentials(GetParam(), &args),
241  args);
242  proxy_service_.AddChannelToBackend(channel_to_backend);
243  }
244  }
245 
246  void ResetStubs() {
247  string target = "dns:localhost:" + to_string(proxy_port_);
248  ChannelArguments args;
249  // disable channelz. We only want to focus on proxy to backend outbound.
250  args.SetInt(GRPC_ARG_ENABLE_CHANNELZ, 0);
251  std::shared_ptr<Channel> channel = grpc::CreateCustomChannel(
252  target, GetChannelCredentials(GetParam(), &args), args);
253  channelz_stub_ = grpc::channelz::v1::Channelz::NewStub(channel);
254  echo_stub_ = grpc::testing::EchoTestService::NewStub(channel);
255  }
256 
257  std::unique_ptr<grpc::testing::EchoTestService::Stub> NewEchoStub() {
258  string target = "dns:localhost:" + to_string(proxy_port_);
259  ChannelArguments args;
260  // disable channelz. We only want to focus on proxy to backend outbound.
261  args.SetInt(GRPC_ARG_ENABLE_CHANNELZ, 0);
262  // This ensures that gRPC will not do connection sharing.
264  std::shared_ptr<Channel> channel = grpc::CreateCustomChannel(
265  target, GetChannelCredentials(GetParam(), &args), args);
266  return grpc::testing::EchoTestService::NewStub(channel);
267  }
268 
269  void SendSuccessfulEcho(int channel_idx) {
270  EchoRequest request;
271  EchoResponse response;
272  request.set_message("Hello channelz");
273  request.mutable_param()->set_backend_channel_idx(channel_idx);
274  ClientContext context;
275  Status s = echo_stub_->Echo(&context, request, &response);
276  EXPECT_EQ(response.message(), request.message());
277  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
278  }
279 
280  void SendSuccessfulStream(int num_messages) {
281  EchoRequest request;
282  EchoResponse response;
283  request.set_message("Hello channelz");
284  ClientContext context;
285  auto stream_to_proxy = echo_stub_->BidiStream(&context);
286  for (int i = 0; i < num_messages; ++i) {
287  EXPECT_TRUE(stream_to_proxy->Write(request));
288  EXPECT_TRUE(stream_to_proxy->Read(&response));
289  }
290  stream_to_proxy->WritesDone();
291  Status s = stream_to_proxy->Finish();
292  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
293  }
294 
295  void SendFailedEcho(int channel_idx) {
296  EchoRequest request;
297  EchoResponse response;
298  request.set_message("Hello channelz");
299  request.mutable_param()->set_backend_channel_idx(channel_idx);
300  auto* error = request.mutable_param()->mutable_expected_error();
301  error->set_code(13); // INTERNAL
302  error->set_error_message("error");
303  ClientContext context;
304  Status s = echo_stub_->Echo(&context, request, &response);
305  EXPECT_FALSE(s.ok());
306  }
307 
308  // Uses GetTopChannels to return the channel_id of a particular channel,
309  // so that the unit tests may test GetChannel call.
310  intptr_t GetChannelId(int channel_idx) {
311  GetTopChannelsRequest request;
312  GetTopChannelsResponse response;
313  request.set_start_channel_id(0);
314  ClientContext context;
315  Status s = channelz_stub_->GetTopChannels(&context, request, &response);
316  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
317  EXPECT_GT(response.channel_size(), channel_idx);
318  return response.channel(channel_idx).ref().channel_id();
319  }
320 
321  static string to_string(const int number) {
322  std::stringstream strs;
323  strs << number;
324  return strs.str();
325  }
326 
327  protected:
328  // package of data needed for each backend server.
329  struct BackendData {
330  std::unique_ptr<Server> server;
331  int port;
332  std::unique_ptr<TestServiceImpl> service;
333  };
334 
335  std::unique_ptr<grpc::channelz::v1::Channelz::Stub> channelz_stub_;
336  std::unique_ptr<grpc::testing::EchoTestService::Stub> echo_stub_;
337 
338  // proxy server to ping with channelz requests.
339  std::unique_ptr<Server> proxy_server_;
342 
343  // backends. All implement the echo service.
344  std::vector<BackendData> backends_;
345 };
346 
347 TEST_P(ChannelzServerTest, BasicTest) {
348  ResetStubs();
349  ConfigureProxy(1);
350  GetTopChannelsRequest request;
351  GetTopChannelsResponse response;
352  request.set_start_channel_id(0);
353  ClientContext context;
354  Status s = channelz_stub_->GetTopChannels(&context, request, &response);
355  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
356  EXPECT_EQ(response.channel_size(), 1);
357 }
358 
359 TEST_P(ChannelzServerTest, HighStartId) {
360  ResetStubs();
361  ConfigureProxy(1);
362  GetTopChannelsRequest request;
363  GetTopChannelsResponse response;
364  request.set_start_channel_id(10000);
365  ClientContext context;
366  Status s = channelz_stub_->GetTopChannels(&context, request, &response);
367  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
368  EXPECT_EQ(response.channel_size(), 0);
369 }
370 
371 TEST_P(ChannelzServerTest, SuccessfulRequestTest) {
372  ResetStubs();
373  ConfigureProxy(1);
374  SendSuccessfulEcho(0);
375  GetChannelRequest request;
376  GetChannelResponse response;
377  request.set_channel_id(GetChannelId(0));
378  ClientContext context;
379  Status s = channelz_stub_->GetChannel(&context, request, &response);
380  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
381  EXPECT_EQ(response.channel().data().calls_started(), 1);
382  EXPECT_EQ(response.channel().data().calls_succeeded(), 1);
383  EXPECT_EQ(response.channel().data().calls_failed(), 0);
384 }
385 
386 TEST_P(ChannelzServerTest, FailedRequestTest) {
387  ResetStubs();
388  ConfigureProxy(1);
389  SendFailedEcho(0);
390  GetChannelRequest request;
391  GetChannelResponse response;
392  request.set_channel_id(GetChannelId(0));
393  ClientContext context;
394  Status s = channelz_stub_->GetChannel(&context, request, &response);
395  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
396  EXPECT_EQ(response.channel().data().calls_started(), 1);
397  EXPECT_EQ(response.channel().data().calls_succeeded(), 0);
398  EXPECT_EQ(response.channel().data().calls_failed(), 1);
399 }
400 
401 TEST_P(ChannelzServerTest, ManyRequestsTest) {
402  ResetStubs();
403  ConfigureProxy(1);
404  // send some RPCs
405  const int kNumSuccess = 10;
406  const int kNumFailed = 11;
407  for (int i = 0; i < kNumSuccess; ++i) {
408  SendSuccessfulEcho(0);
409  }
410  for (int i = 0; i < kNumFailed; ++i) {
411  SendFailedEcho(0);
412  }
413  GetChannelRequest request;
414  GetChannelResponse response;
415  request.set_channel_id(GetChannelId(0));
416  ClientContext context;
417  Status s = channelz_stub_->GetChannel(&context, request, &response);
418  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
419  EXPECT_EQ(response.channel().data().calls_started(),
420  kNumSuccess + kNumFailed);
421  EXPECT_EQ(response.channel().data().calls_succeeded(), kNumSuccess);
422  EXPECT_EQ(response.channel().data().calls_failed(), kNumFailed);
423 }
424 
425 TEST_P(ChannelzServerTest, ManyChannels) {
426  ResetStubs();
427  const int kNumChannels = 4;
428  ConfigureProxy(kNumChannels);
429  GetTopChannelsRequest request;
430  GetTopChannelsResponse response;
431  request.set_start_channel_id(0);
432  ClientContext context;
433  Status s = channelz_stub_->GetTopChannels(&context, request, &response);
434  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
435  EXPECT_EQ(response.channel_size(), kNumChannels);
436 }
437 
438 TEST_P(ChannelzServerTest, ManyRequestsManyChannels) {
439  ResetStubs();
440  const int kNumChannels = 4;
441  ConfigureProxy(kNumChannels);
442  const int kNumSuccess = 10;
443  const int kNumFailed = 11;
444  for (int i = 0; i < kNumSuccess; ++i) {
445  SendSuccessfulEcho(0);
446  SendSuccessfulEcho(2);
447  }
448  for (int i = 0; i < kNumFailed; ++i) {
449  SendFailedEcho(1);
450  SendFailedEcho(2);
451  }
452 
453  // the first channel saw only successes
454  {
455  GetChannelRequest request;
456  GetChannelResponse response;
457  request.set_channel_id(GetChannelId(0));
458  ClientContext context;
459  Status s = channelz_stub_->GetChannel(&context, request, &response);
460  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
461  EXPECT_EQ(response.channel().data().calls_started(), kNumSuccess);
462  EXPECT_EQ(response.channel().data().calls_succeeded(), kNumSuccess);
463  EXPECT_EQ(response.channel().data().calls_failed(), 0);
464  }
465 
466  // the second channel saw only failures
467  {
468  GetChannelRequest request;
469  GetChannelResponse response;
470  request.set_channel_id(GetChannelId(1));
471  ClientContext context;
472  Status s = channelz_stub_->GetChannel(&context, request, &response);
473  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
474  EXPECT_EQ(response.channel().data().calls_started(), kNumFailed);
475  EXPECT_EQ(response.channel().data().calls_succeeded(), 0);
476  EXPECT_EQ(response.channel().data().calls_failed(), kNumFailed);
477  }
478 
479  // the third channel saw both
480  {
481  GetChannelRequest request;
482  GetChannelResponse response;
483  request.set_channel_id(GetChannelId(2));
484  ClientContext context;
485  Status s = channelz_stub_->GetChannel(&context, request, &response);
486  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
487  EXPECT_EQ(response.channel().data().calls_started(),
488  kNumSuccess + kNumFailed);
489  EXPECT_EQ(response.channel().data().calls_succeeded(), kNumSuccess);
490  EXPECT_EQ(response.channel().data().calls_failed(), kNumFailed);
491  }
492 
493  // the fourth channel saw nothing
494  {
495  GetChannelRequest request;
496  GetChannelResponse response;
497  request.set_channel_id(GetChannelId(3));
498  ClientContext context;
499  Status s = channelz_stub_->GetChannel(&context, request, &response);
500  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
501  EXPECT_EQ(response.channel().data().calls_started(), 0);
502  EXPECT_EQ(response.channel().data().calls_succeeded(), 0);
503  EXPECT_EQ(response.channel().data().calls_failed(), 0);
504  }
505 }
506 
507 TEST_P(ChannelzServerTest, ManySubchannels) {
508  ResetStubs();
509  const int kNumChannels = 4;
510  ConfigureProxy(kNumChannels);
511  const int kNumSuccess = 10;
512  const int kNumFailed = 11;
513  for (int i = 0; i < kNumSuccess; ++i) {
514  SendSuccessfulEcho(0);
515  SendSuccessfulEcho(2);
516  }
517  for (int i = 0; i < kNumFailed; ++i) {
518  SendFailedEcho(1);
519  SendFailedEcho(2);
520  }
521  GetTopChannelsRequest gtc_request;
522  GetTopChannelsResponse gtc_response;
523  gtc_request.set_start_channel_id(0);
524  ClientContext context;
525  Status s =
526  channelz_stub_->GetTopChannels(&context, gtc_request, &gtc_response);
527  EXPECT_TRUE(s.ok()) << s.error_message();
528  EXPECT_EQ(gtc_response.channel_size(), kNumChannels);
529  for (int i = 0; i < gtc_response.channel_size(); ++i) {
530  // if the channel sent no RPCs, then expect no subchannels to have been
531  // created.
532  if (gtc_response.channel(i).data().calls_started() == 0) {
533  EXPECT_EQ(gtc_response.channel(i).subchannel_ref_size(), 0);
534  continue;
535  }
536  // The resolver must return at least one address.
537  ASSERT_GT(gtc_response.channel(i).subchannel_ref_size(), 0);
538  GetSubchannelRequest gsc_request;
539  GetSubchannelResponse gsc_response;
540  gsc_request.set_subchannel_id(
541  gtc_response.channel(i).subchannel_ref(0).subchannel_id());
542  ClientContext context;
543  Status s =
544  channelz_stub_->GetSubchannel(&context, gsc_request, &gsc_response);
545  EXPECT_TRUE(s.ok()) << s.error_message();
546  EXPECT_EQ(gtc_response.channel(i).data().calls_started(),
547  gsc_response.subchannel().data().calls_started());
548  EXPECT_EQ(gtc_response.channel(i).data().calls_succeeded(),
549  gsc_response.subchannel().data().calls_succeeded());
550  EXPECT_EQ(gtc_response.channel(i).data().calls_failed(),
551  gsc_response.subchannel().data().calls_failed());
552  }
553 }
554 
555 TEST_P(ChannelzServerTest, BasicServerTest) {
556  ResetStubs();
557  ConfigureProxy(1);
558  GetServersRequest request;
559  GetServersResponse response;
560  request.set_start_server_id(0);
561  ClientContext context;
562  Status s = channelz_stub_->GetServers(&context, request, &response);
563  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
564  EXPECT_EQ(response.server_size(), 1);
565 }
566 
567 TEST_P(ChannelzServerTest, BasicGetServerTest) {
568  ResetStubs();
569  ConfigureProxy(1);
570  GetServersRequest get_servers_request;
571  GetServersResponse get_servers_response;
572  get_servers_request.set_start_server_id(0);
573  ClientContext get_servers_context;
574  Status s = channelz_stub_->GetServers(
575  &get_servers_context, get_servers_request, &get_servers_response);
576  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
577  EXPECT_EQ(get_servers_response.server_size(), 1);
578  GetServerRequest get_server_request;
579  GetServerResponse get_server_response;
580  get_server_request.set_server_id(
581  get_servers_response.server(0).ref().server_id());
582  ClientContext get_server_context;
583  s = channelz_stub_->GetServer(&get_server_context, get_server_request,
584  &get_server_response);
585  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
586  EXPECT_EQ(get_servers_response.server(0).ref().server_id(),
587  get_server_response.server().ref().server_id());
588 }
589 
590 TEST_P(ChannelzServerTest, ServerCallTest) {
591  ResetStubs();
592  ConfigureProxy(1);
593  const int kNumSuccess = 10;
594  const int kNumFailed = 11;
595  for (int i = 0; i < kNumSuccess; ++i) {
596  SendSuccessfulEcho(0);
597  }
598  for (int i = 0; i < kNumFailed; ++i) {
599  SendFailedEcho(0);
600  }
601  GetServersRequest request;
602  GetServersResponse response;
603  request.set_start_server_id(0);
604  ClientContext context;
605  Status s = channelz_stub_->GetServers(&context, request, &response);
606  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
607  EXPECT_EQ(response.server_size(), 1);
608  EXPECT_EQ(response.server(0).data().calls_succeeded(), kNumSuccess);
609  EXPECT_EQ(response.server(0).data().calls_failed(), kNumFailed);
610  // This is success+failure+1 because the call that retrieved this information
611  // will be counted as started. It will not track success/failure until after
612  // it has returned, so that is not included in the response.
613  EXPECT_EQ(response.server(0).data().calls_started(),
614  kNumSuccess + kNumFailed + 1);
615 }
616 
617 TEST_P(ChannelzServerTest, ManySubchannelsAndSockets) {
618  ResetStubs();
619  const int kNumChannels = 4;
620  ConfigureProxy(kNumChannels);
621  const int kNumSuccess = 10;
622  const int kNumFailed = 11;
623  for (int i = 0; i < kNumSuccess; ++i) {
624  SendSuccessfulEcho(0);
625  SendSuccessfulEcho(2);
626  }
627  for (int i = 0; i < kNumFailed; ++i) {
628  SendFailedEcho(1);
629  SendFailedEcho(2);
630  }
631  GetTopChannelsRequest gtc_request;
632  GetTopChannelsResponse gtc_response;
633  gtc_request.set_start_channel_id(0);
634  ClientContext context;
635  Status s =
636  channelz_stub_->GetTopChannels(&context, gtc_request, &gtc_response);
637  EXPECT_TRUE(s.ok()) << s.error_message();
638  EXPECT_EQ(gtc_response.channel_size(), kNumChannels);
639  for (int i = 0; i < gtc_response.channel_size(); ++i) {
640  // if the channel sent no RPCs, then expect no subchannels to have been
641  // created.
642  if (gtc_response.channel(i).data().calls_started() == 0) {
643  EXPECT_EQ(gtc_response.channel(i).subchannel_ref_size(), 0);
644  continue;
645  }
646  // The resolver must return at least one address.
647  ASSERT_GT(gtc_response.channel(i).subchannel_ref_size(), 0);
648  // First grab the subchannel
649  GetSubchannelRequest get_subchannel_req;
650  GetSubchannelResponse get_subchannel_resp;
651  get_subchannel_req.set_subchannel_id(
652  gtc_response.channel(i).subchannel_ref(0).subchannel_id());
653  ClientContext get_subchannel_ctx;
654  Status s = channelz_stub_->GetSubchannel(
655  &get_subchannel_ctx, get_subchannel_req, &get_subchannel_resp);
656  EXPECT_TRUE(s.ok()) << s.error_message();
657  EXPECT_EQ(get_subchannel_resp.subchannel().socket_ref_size(), 1);
658  // Now grab the socket.
659  GetSocketRequest get_socket_req;
660  GetSocketResponse get_socket_resp;
661  ClientContext get_socket_ctx;
662  get_socket_req.set_socket_id(
663  get_subchannel_resp.subchannel().socket_ref(0).socket_id());
664  s = channelz_stub_->GetSocket(&get_socket_ctx, get_socket_req,
665  &get_socket_resp);
666  EXPECT_TRUE(
667  get_subchannel_resp.subchannel().socket_ref(0).name().find("http"));
668  EXPECT_TRUE(s.ok()) << s.error_message();
669  // calls started == streams started AND stream succeeded. Since none of
670  // these RPCs were canceled, all of the streams will succeeded even though
671  // the RPCs they represent might have failed.
672  EXPECT_EQ(get_subchannel_resp.subchannel().data().calls_started(),
673  get_socket_resp.socket().data().streams_started());
674  EXPECT_EQ(get_subchannel_resp.subchannel().data().calls_started(),
675  get_socket_resp.socket().data().streams_succeeded());
676  // All of the calls were unary, so calls started == messages sent.
677  EXPECT_EQ(get_subchannel_resp.subchannel().data().calls_started(),
678  get_socket_resp.socket().data().messages_sent());
679  // We only get responses when the RPC was successful, so
680  // calls succeeded == messages received.
681  EXPECT_EQ(get_subchannel_resp.subchannel().data().calls_succeeded(),
682  get_socket_resp.socket().data().messages_received());
683  switch (GetParam()) {
684  case CredentialsType::kInsecure:
685  EXPECT_FALSE(get_socket_resp.socket().has_security());
686  break;
687  case CredentialsType::kTls:
688  case CredentialsType::kMtls:
689  EXPECT_TRUE(get_socket_resp.socket().has_security());
690  EXPECT_TRUE(get_socket_resp.socket().security().has_tls());
691  EXPECT_EQ(
692  RemoveWhitespaces(
693  get_socket_resp.socket().security().tls().remote_certificate()),
694  RemoveWhitespaces(ReadFile(kServerCertPath)));
695  break;
696  }
697  }
698 }
699 
700 TEST_P(ChannelzServerTest, StreamingRPC) {
701  ResetStubs();
702  ConfigureProxy(1);
703  const int kNumMessages = 5;
704  SendSuccessfulStream(kNumMessages);
705  // Get the channel
706  GetChannelRequest get_channel_request;
707  GetChannelResponse get_channel_response;
708  get_channel_request.set_channel_id(GetChannelId(0));
709  ClientContext get_channel_context;
710  Status s = channelz_stub_->GetChannel(
711  &get_channel_context, get_channel_request, &get_channel_response);
712  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
713  EXPECT_EQ(get_channel_response.channel().data().calls_started(), 1);
714  EXPECT_EQ(get_channel_response.channel().data().calls_succeeded(), 1);
715  EXPECT_EQ(get_channel_response.channel().data().calls_failed(), 0);
716  // Get the subchannel
717  ASSERT_GT(get_channel_response.channel().subchannel_ref_size(), 0);
718  GetSubchannelRequest get_subchannel_request;
719  GetSubchannelResponse get_subchannel_response;
720  ClientContext get_subchannel_context;
721  get_subchannel_request.set_subchannel_id(
722  get_channel_response.channel().subchannel_ref(0).subchannel_id());
723  s = channelz_stub_->GetSubchannel(&get_subchannel_context,
724  get_subchannel_request,
725  &get_subchannel_response);
726  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
727  EXPECT_EQ(get_subchannel_response.subchannel().data().calls_started(), 1);
728  EXPECT_EQ(get_subchannel_response.subchannel().data().calls_succeeded(), 1);
729  EXPECT_EQ(get_subchannel_response.subchannel().data().calls_failed(), 0);
730  // Get the socket
731  ASSERT_GT(get_subchannel_response.subchannel().socket_ref_size(), 0);
732  GetSocketRequest get_socket_request;
733  GetSocketResponse get_socket_response;
734  ClientContext get_socket_context;
735  get_socket_request.set_socket_id(
736  get_subchannel_response.subchannel().socket_ref(0).socket_id());
737  EXPECT_TRUE(
738  get_subchannel_response.subchannel().socket_ref(0).name().find("http"));
739  s = channelz_stub_->GetSocket(&get_socket_context, get_socket_request,
740  &get_socket_response);
741  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
742  EXPECT_EQ(get_socket_response.socket().data().streams_started(), 1);
743  EXPECT_EQ(get_socket_response.socket().data().streams_succeeded(), 1);
744  EXPECT_EQ(get_socket_response.socket().data().streams_failed(), 0);
745  EXPECT_EQ(get_socket_response.socket().data().messages_sent(), kNumMessages);
746  EXPECT_EQ(get_socket_response.socket().data().messages_received(),
747  kNumMessages);
748  switch (GetParam()) {
749  case CredentialsType::kInsecure:
750  EXPECT_FALSE(get_socket_response.socket().has_security());
751  break;
752  case CredentialsType::kTls:
753  case CredentialsType::kMtls:
754  EXPECT_TRUE(get_socket_response.socket().has_security());
755  EXPECT_TRUE(get_socket_response.socket().security().has_tls());
756  EXPECT_EQ(RemoveWhitespaces(get_socket_response.socket()
757  .security()
758  .tls()
759  .remote_certificate()),
760  RemoveWhitespaces(ReadFile(kServerCertPath)));
761  break;
762  }
763 }
764 
765 TEST_P(ChannelzServerTest, GetServerSocketsTest) {
766  ResetStubs();
767  ConfigureProxy(1);
768  GetServersRequest get_server_request;
769  GetServersResponse get_server_response;
770  get_server_request.set_start_server_id(0);
771  ClientContext get_server_context;
772  Status s = channelz_stub_->GetServers(&get_server_context, get_server_request,
773  &get_server_response);
774  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
775  EXPECT_EQ(get_server_response.server_size(), 1);
776  GetServerSocketsRequest get_server_sockets_request;
777  GetServerSocketsResponse get_server_sockets_response;
778  get_server_sockets_request.set_server_id(
779  get_server_response.server(0).ref().server_id());
780  get_server_sockets_request.set_start_socket_id(0);
781  ClientContext get_server_sockets_context;
782  s = channelz_stub_->GetServerSockets(&get_server_sockets_context,
783  get_server_sockets_request,
784  &get_server_sockets_response);
785  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
786  EXPECT_EQ(get_server_sockets_response.socket_ref_size(), 1);
787  EXPECT_TRUE(get_server_sockets_response.socket_ref(0).name().find("http"));
788  // Get the socket to verify security information.
789  GetSocketRequest get_socket_request;
790  GetSocketResponse get_socket_response;
791  ClientContext get_socket_context;
792  get_socket_request.set_socket_id(
793  get_server_sockets_response.socket_ref(0).socket_id());
794  s = channelz_stub_->GetSocket(&get_socket_context, get_socket_request,
795  &get_socket_response);
796  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
797  EXPECT_TRUE(ValidateAddress(get_socket_response.socket().remote()));
798  EXPECT_TRUE(ValidateAddress(get_socket_response.socket().local()));
799  switch (GetParam()) {
800  case CredentialsType::kInsecure:
801  EXPECT_FALSE(get_socket_response.socket().has_security());
802  break;
803  case CredentialsType::kTls:
804  case CredentialsType::kMtls:
805  EXPECT_TRUE(get_socket_response.socket().has_security());
806  EXPECT_TRUE(get_socket_response.socket().security().has_tls());
807  if (GetParam() == CredentialsType::kMtls) {
808  EXPECT_EQ(RemoveWhitespaces(get_socket_response.socket()
809  .security()
810  .tls()
811  .remote_certificate()),
812  RemoveWhitespaces(ReadFile(kClientCertPath)));
813  } else {
814  EXPECT_TRUE(get_socket_response.socket()
815  .security()
816  .tls()
817  .remote_certificate()
818  .empty());
819  }
820  break;
821  }
822 }
823 
824 TEST_P(ChannelzServerTest, GetServerSocketsPaginationTest) {
825  ResetStubs();
826  ConfigureProxy(1);
827  std::vector<std::unique_ptr<grpc::testing::EchoTestService::Stub>> stubs;
828  const int kNumServerSocketsCreated = 20;
829  for (int i = 0; i < kNumServerSocketsCreated; ++i) {
830  stubs.push_back(NewEchoStub());
831  EchoRequest request;
832  EchoResponse response;
833  request.set_message("Hello channelz");
834  request.mutable_param()->set_backend_channel_idx(0);
835  ClientContext context;
836  Status s = stubs.back()->Echo(&context, request, &response);
837  EXPECT_EQ(response.message(), request.message());
838  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
839  }
840  GetServersRequest get_server_request;
841  GetServersResponse get_server_response;
842  get_server_request.set_start_server_id(0);
843  ClientContext get_server_context;
844  Status s = channelz_stub_->GetServers(&get_server_context, get_server_request,
845  &get_server_response);
846  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
847  EXPECT_EQ(get_server_response.server_size(), 1);
848  // Make a request that gets all of the serversockets
849  {
850  GetServerSocketsRequest get_server_sockets_request;
851  GetServerSocketsResponse get_server_sockets_response;
852  get_server_sockets_request.set_server_id(
853  get_server_response.server(0).ref().server_id());
854  get_server_sockets_request.set_start_socket_id(0);
855  ClientContext get_server_sockets_context;
856  s = channelz_stub_->GetServerSockets(&get_server_sockets_context,
857  get_server_sockets_request,
858  &get_server_sockets_response);
859  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
860  // We add one to account the channelz stub that will end up creating
861  // a serversocket.
862  EXPECT_EQ(get_server_sockets_response.socket_ref_size(),
863  kNumServerSocketsCreated + 1);
864  EXPECT_TRUE(get_server_sockets_response.end());
865  }
866  // Now we make a request that exercises pagination.
867  {
868  GetServerSocketsRequest get_server_sockets_request;
869  GetServerSocketsResponse get_server_sockets_response;
870  get_server_sockets_request.set_server_id(
871  get_server_response.server(0).ref().server_id());
872  get_server_sockets_request.set_start_socket_id(0);
873  const int kMaxResults = 10;
874  get_server_sockets_request.set_max_results(kMaxResults);
875  ClientContext get_server_sockets_context;
876  s = channelz_stub_->GetServerSockets(&get_server_sockets_context,
877  get_server_sockets_request,
878  &get_server_sockets_response);
879  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
880  EXPECT_EQ(get_server_sockets_response.socket_ref_size(), kMaxResults);
881  EXPECT_FALSE(get_server_sockets_response.end());
882  }
883 }
884 
885 TEST_P(ChannelzServerTest, GetServerListenSocketsTest) {
886  ResetStubs();
887  ConfigureProxy(1);
888  GetServersRequest get_server_request;
889  GetServersResponse get_server_response;
890  get_server_request.set_start_server_id(0);
891  ClientContext get_server_context;
892  Status s = channelz_stub_->GetServers(&get_server_context, get_server_request,
893  &get_server_response);
894  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
895  EXPECT_EQ(get_server_response.server_size(), 1);
896  // The resolver might return one or two addresses depending on the
897  // configuration, one for ipv4 and one for ipv6.
898  int listen_socket_size = get_server_response.server(0).listen_socket_size();
899  EXPECT_TRUE(listen_socket_size == 1 || listen_socket_size == 2);
900  GetSocketRequest get_socket_request;
901  GetSocketResponse get_socket_response;
902  get_socket_request.set_socket_id(
903  get_server_response.server(0).listen_socket(0).socket_id());
904  EXPECT_TRUE(
905  get_server_response.server(0).listen_socket(0).name().find("http"));
906  ClientContext get_socket_context_1;
907  s = channelz_stub_->GetSocket(&get_socket_context_1, get_socket_request,
908  &get_socket_response);
909  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
910 
911  EXPECT_TRUE(ValidateAddress(get_socket_response.socket().remote()));
912  EXPECT_TRUE(ValidateAddress(get_socket_response.socket().local()));
913  if (listen_socket_size == 2) {
914  get_socket_request.set_socket_id(
915  get_server_response.server(0).listen_socket(1).socket_id());
916  ClientContext get_socket_context_2;
917  EXPECT_TRUE(
918  get_server_response.server(0).listen_socket(1).name().find("http"));
919  s = channelz_stub_->GetSocket(&get_socket_context_2, get_socket_request,
920  &get_socket_response);
921  EXPECT_TRUE(s.ok()) << "s.error_message() = " << s.error_message();
922  }
923 }
924 
925 INSTANTIATE_TEST_SUITE_P(ChannelzServer, ChannelzServerTest,
926  ::testing::ValuesIn(std::vector<CredentialsType>(
927  {CredentialsType::kInsecure, CredentialsType::kTls,
928  CredentialsType::kMtls})));
929 
930 } // namespace
931 } // namespace testing
932 } // namespace grpc
933 
934 int main(int argc, char** argv) {
935  grpc::testing::TestEnvironment env(&argc, argv);
936  ::testing::InitGoogleTest(&argc, argv);
937  return RUN_ALL_TESTS();
938 }
EXPECT_FALSE
#define EXPECT_FALSE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1970
test_credentials_provider.h
grpc_slice_unref
GPRAPI void grpc_slice_unref(grpc_slice s)
Definition: slice_api.cc:32
grpc::gpr_setenv
gpr_setenv("STS_CREDENTIALS", creds_file_name)
testing
Definition: aws_request_signer_test.cc:25
proxy_port_
int proxy_port_
Definition: channelz_service_test.cc:340
port.h
proxy_server_
std::unique_ptr< Server > proxy_server_
Definition: channelz_service_test.cc:339
service
std::unique_ptr< TestServiceImpl > service
Definition: channelz_service_test.cc:332
grpc_load_file
grpc_error_handle grpc_load_file(const char *filename, int add_null_terminator, grpc_slice *output)
Definition: load_file.cc:33
generate.env
env
Definition: generate.py:37
load_file.h
grpc
Definition: grpcpp/alarm.h:33
cpp.utils.ReadFile
def ReadFile(filename, print_error=True)
Definition: bloaty/third_party/googletest/googlemock/scripts/generator/cpp/utils.py:30
options
double_dict options[]
Definition: capstone_test.c:55
benchmark.request
request
Definition: benchmark.py:77
EXPECT_GT
#define EXPECT_GT(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2036
grpc_core::StringViewFromSlice
absl::string_view StringViewFromSlice(const grpc_slice &slice)
Definition: slice_internal.h:93
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
error
grpc_error_handle error
Definition: retry_filter.cc:499
secure_credentials.h
GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY
@ GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY
Definition: grpc_security_constants.h:105
proxy_service_
Proxy proxy_service_
Definition: channelz_service_test.cc:341
backends_
std::vector< BackendData > backends_
Definition: channelz_service_test.cc:344
GRPC_ARG_ENABLE_CHANNELZ
#define GRPC_ARG_ENABLE_CHANNELZ
Definition: grpc_types.h:323
GRPC_ARG_USE_LOCAL_SUBCHANNEL_POOL
#define GRPC_ARG_USE_LOCAL_SUBCHANNEL_POOL
Definition: grpc_types.h:443
env.h
absl::FormatConversionChar::s
@ s
GRPC_LOG_IF_ERROR
#define GRPC_LOG_IF_ERROR(what, error)
Definition: error.h:398
grpc::experimental::TlsServerCredentialsOptions
Definition: tls_credentials_options.h:136
grpc_security.h
echo_stub_
std::unique_ptr< grpc::testing::EchoTestService::Stub > echo_stub_
Definition: channelz_service_test.cc:336
test_service_impl.h
testing::TestWithParam
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1883
channelz_stub_
std::unique_ptr< grpc::channelz::v1::Channelz::Stub > channelz_stub_
Definition: channelz_service_test.cc:335
channelz_service_plugin.h
grpc_tls_certificate_provider.h
channel
wrapped_grpc_channel * channel
Definition: src/php/ext/grpc/call.h:33
asyncio_get_stats.args
args
Definition: asyncio_get_stats.py:40
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
grpc_timeout_milliseconds_to_deadline
gpr_timespec grpc_timeout_milliseconds_to_deadline(int64_t time_ms)
Definition: test/core/util/test_config.cc:89
slice
grpc_slice slice
Definition: src/core/lib/surface/server.cc:467
grpc::experimental::TlsServerCredentials
std::shared_ptr< ServerCredentials > TlsServerCredentials(const experimental::TlsServerCredentialsOptions &options)
Builds TLS ServerCredentials given TLS options.
Definition: secure_server_credentials.cc:153
grpc.h
main
int main(int argc, char **argv)
Definition: channelz_service_test.cc:934
grpc::ClientContext::FromServerContext
static std::unique_ptr< ClientContext > FromServerContext(const grpc::ServerContextBase &server_context, PropagationOptions options=PropagationOptions())
Definition: client_context.cc:110
channel.h
number
int32_t number
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/protobuf.h:850
grpc_slice
Definition: include/grpc/impl/codegen/slice.h:65
grpc::testing::INSTANTIATE_TEST_SUITE_P
INSTANTIATE_TEST_SUITE_P(HistogramTestCases, HistogramTest, ::testing::Range< int >(0, GRPC_STATS_HISTOGRAM_COUNT))
intptr_t
_W64 signed int intptr_t
Definition: stdint-msvc2008.h:118
grpc.server
def server(thread_pool, handlers=None, interceptors=None, options=None, maximum_concurrent_rpcs=None, compression=None, xds=False)
Definition: src/python/grpcio/grpc/__init__.py:2034
slice_internal.h
RUN_ALL_TESTS
int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2471
grpc_pick_unused_port_or_die
int grpc_pick_unused_port_or_die(void)
grpc::experimental::TlsChannelCredentialsOptions
Definition: tls_credentials_options.h:125
setup.idx
idx
Definition: third_party/bloaty/third_party/capstone/bindings/python/setup.py:197
server_credentials.h
framework.rpc.grpc_channelz.Address
Address
Definition: grpc_channelz.py:50
test_config.h
identity_key_cert_pairs
grpc_core::PemKeyCertPairList identity_key_cert_pairs
Definition: xds_end2end_test.cc:143
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
grpc::experimental::TlsCredentials
std::shared_ptr< ChannelCredentials > TlsCredentials(const TlsChannelCredentialsOptions &options)
Builds TLS Credentials given TLS options.
Definition: secure_credentials.cc:316
grpc::channelz::experimental::InitChannelzService
void InitChannelzService()
Definition: channelz_service_plugin.cc:74
GRPC_ARG_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE
#define GRPC_ARG_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE
Definition: grpc_types.h:318
port
int port
Definition: channelz_service_test.cc:331
server_context.h
asyncio_get_stats.response
response
Definition: asyncio_get_stats.py:28
grpc::testing::TestEnvironment
Definition: test/core/util/test_config.h:54
grpc::CreateCustomChannel
std::shared_ptr< Channel > CreateCustomChannel(const grpc::string &target, const std::shared_ptr< ChannelCredentials > &creds, const ChannelArguments &args)
grpc::protobuf::util::Status
GRPC_CUSTOM_UTIL_STATUS Status
Definition: include/grpcpp/impl/codegen/config_protobuf.h:93
grpc::testing::EXPECT_EQ
EXPECT_EQ(options.token_exchange_service_uri, "https://foo/exchange")
input
std::string input
Definition: bloaty/third_party/protobuf/src/google/protobuf/io/tokenizer_unittest.cc:197
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::EXPECT_TRUE
EXPECT_TRUE(grpc::experimental::StsCredentialsOptionsFromJson(minimum_valid_json, &options) .ok())
asyncio_get_stats.type
type
Definition: asyncio_get_stats.py:37
testing::ValuesIn
internal::ParamGenerator< typename std::iterator_traits< ForwardIterator >::value_type > ValuesIn(ForwardIterator begin, ForwardIterator end)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest-param-test.h:297
server.h
grpc::InsecureChannelCredentials
std::shared_ptr< ChannelCredentials > InsecureChannelCredentials()
Credentials for an unencrypted, unauthenticated channel.
Definition: cpp/client/insecure_credentials.cc:69
ASSERT_GT
#define ASSERT_GT(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2076
to_string
static bool to_string(zval *from)
Definition: protobuf/php/ext/google/protobuf/convert.c:333
setup.target
target
Definition: third_party/bloaty/third_party/protobuf/python/setup.py:179
server_builder.h
ssl_utils.h
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
create_channel.h
port_platform.h
stubs_
std::vector< std::unique_ptr< grpc::testing::EchoTestService::Stub > > stubs_
Definition: channelz_service_test.cc:118


grpc
Author(s):
autogenerated on Fri May 16 2025 02:57:53