too_many_pings_test.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2020 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 <stdlib.h>
22 #include <string.h>
23 
24 #include <functional>
25 #include <set>
26 #include <thread>
27 
28 #include <gmock/gmock.h>
29 
30 #include "absl/strings/str_cat.h"
31 
32 #include <grpc/grpc.h>
33 #include <grpc/grpc_security.h>
35 #include <grpc/slice.h>
36 #include <grpc/support/alloc.h>
37 #include <grpc/support/log.h>
39 #include <grpc/support/time.h>
41 #include <grpcpp/server_builder.h>
42 
48 #include "src/core/lib/gprpp/thd.h"
56 #include "test/core/util/port.h"
58 
59 namespace {
60 
61 class TransportCounter {
62  public:
63  static void CounterInitCallback() {
64  grpc_core::MutexLock lock(&mu());
65  ++count_;
66  }
67 
68  static void CounterDestructCallback() {
69  grpc_core::MutexLock lock(&mu());
70  if (--count_ == 0) {
71  cv().SignalAll();
72  }
73  }
74 
75  static void WaitForTransportsToBeDestroyed() {
76  grpc_core::MutexLock lock(&mu());
77  while (count_ != 0) {
78  ASSERT_FALSE(cv().WaitWithTimeout(&mu(), absl::Seconds(10)));
79  }
80  }
81 
82  static int count() {
83  grpc_core::MutexLock lock(&mu());
84  return count_;
85  }
86 
87  static grpc_core::Mutex& mu() {
88  static grpc_core::Mutex* mu = new grpc_core::Mutex();
89  return *mu;
90  }
91 
92  static grpc_core::CondVar& cv() {
94  return *cv;
95  }
96 
97  private:
98  static int count_;
99 };
100 
102 
103 void* tag(intptr_t t) { return reinterpret_cast<void*>(t); }
104 
105 // Perform a simple RPC where the server cancels the request with
106 // grpc_call_cancel_with_status
109  grpc_call* c;
110  grpc_call* s;
112  grpc_op ops[6];
113  grpc_op* op;
121  // Start a call
123  grpc_slice_from_static_string("/foo"), nullptr,
124  deadline, nullptr);
125  GPR_ASSERT(c);
129  memset(ops, 0, sizeof(ops));
130  op = ops;
133  op->flags = 0;
134  op->reserved = nullptr;
135  op++;
140  op->flags = 0;
141  op->reserved = nullptr;
142  op++;
143  error = grpc_call_start_batch(c, ops, static_cast<size_t>(op - ops), tag(1),
144  nullptr);
146  // Request a call on the server
148  &request_metadata_recv, cq, cq, tag(101));
150  CQ_EXPECT_COMPLETION(cqv, tag(101), 1);
151  cq_verify(cqv);
153  nullptr);
154  CQ_EXPECT_COMPLETION(cqv, tag(1), 1);
155  cq_verify(cqv);
156  // cleanup
162  grpc_call_unref(s);
163  cq_verifier_destroy(cqv);
164  return status;
165 }
166 
167 // Test that sending a lot of RPCs that are cancelled by the server doesn't
168 // result in too many pings due to the pings sent by BDP.
169 TEST(TooManyPings, TestLotsOfServerCancelledRpcsDoesntGiveTooManyPings) {
171  // create the server
172  grpc_server* server = grpc_server_create(nullptr, nullptr);
176  grpc_server_credentials* server_creds =
178  GPR_ASSERT(
179  grpc_server_add_http2_port(server, server_address.c_str(), server_creds));
180  grpc_server_credentials_release(server_creds);
182  // create the channel (bdp pings are enabled by default)
185  nullptr /* channel args */);
187  std::map<grpc_status_code, int> statuses_and_counts;
188  const int kNumTotalRpcs = 1e5;
189  // perform an RPC
191  "Performing %d total RPCs and expecting them all to receive status "
192  "PERMISSION_DENIED (%d)",
193  kNumTotalRpcs, GRPC_STATUS_PERMISSION_DENIED);
194  for (int i = 0; i < kNumTotalRpcs; i++) {
195  grpc_status_code status = PerformCall(channel, server, cq);
196  statuses_and_counts[status] += 1;
197  }
198  int num_not_cancelled = 0;
199  for (auto itr = statuses_and_counts.begin(); itr != statuses_and_counts.end();
200  itr++) {
201  if (itr->first != GRPC_STATUS_PERMISSION_DENIED) {
202  num_not_cancelled += itr->second;
203  }
204  gpr_log(GPR_INFO, "%d / %d RPCs received status code: %d", itr->second,
205  kNumTotalRpcs, itr->first);
206  }
207  if (num_not_cancelled > 0) {
209  "Expected all RPCs to receive status PERMISSION_DENIED (%d) but %d "
210  "received other status codes",
211  GRPC_STATUS_PERMISSION_DENIED, num_not_cancelled);
212  FAIL();
213  }
214  // shutdown and destroy the client and server
219  nullptr)
221  }
224 }
225 
226 // Perform a simple RPC where the client makes a request, and both the client
227 // and server continue reading so that gRPC can send and receive keepalive
228 // pings.
231  grpc_call* c;
232  grpc_call* s;
234  grpc_op ops[6];
235  grpc_op* op;
243  // Start a call
245  grpc_slice_from_static_string("/foo"), nullptr,
246  deadline, nullptr);
247  GPR_ASSERT(c);
251  memset(ops, 0, sizeof(ops));
252  op = ops;
255  op->flags = 0;
256  op->reserved = nullptr;
257  op++;
262  op->flags = 0;
263  op->reserved = nullptr;
264  op++;
265  error = grpc_call_start_batch(c, ops, static_cast<size_t>(op - ops), tag(1),
266  nullptr);
268  // Request a call on the server
270  &request_metadata_recv, cq, cq, tag(101));
272  CQ_EXPECT_COMPLETION(cqv, tag(101), 1);
273  cq_verify(cqv);
274  // Since the server is configured to allow only a single ping strike, it would
275  // take 3 pings to trigger the GOAWAY frame with "too_many_pings" from the
276  // server. (The second ping from the client would be the first bad ping sent
277  // too quickly leading to a ping strike and the third ping would lead to the
278  // GOAWAY.) If the client settings match with the server's settings, there
279  // won't be a bad ping, and the call will end due to the deadline expiring
280  // instead.
281  CQ_EXPECT_COMPLETION(cqv, tag(1), 1);
282  // The call will end after this
283  cq_verify(cqv, 60);
284  // cleanup
290  grpc_call_unref(s);
291  cq_verifier_destroy(cqv);
292  return status;
293 }
294 
295 // Shuts down and destroys the server.
296 void ServerShutdownAndDestroy(grpc_server* server, grpc_completion_queue* cq) {
297  // Shutdown and destroy server
298  grpc_server_shutdown_and_notify(server, cq, reinterpret_cast<void*>(1000));
300  nullptr)
301  .tag != reinterpret_cast<void*>(1000)) {
302  }
304 }
305 
306 void VerifyChannelReady(grpc_channel* channel, grpc_completion_queue* cq) {
308  grpc_channel_check_connectivity_state(channel, 1 /* try_to_connect */);
309  while (state != GRPC_CHANNEL_READY) {
313  nullptr);
315  }
316 }
317 
318 void VerifyChannelDisconnected(grpc_channel* channel,
320  // Verify channel gets disconnected. Use a ping to make sure that clients
321  // tries sending/receiving bytes if the channel is connected.
322  grpc_channel_ping(channel, cq, reinterpret_cast<void*>(2000), nullptr);
324  cq, grpc_timeout_seconds_to_deadline(5), nullptr);
326  GPR_ASSERT(ev.tag == reinterpret_cast<void*>(2000));
327  GPR_ASSERT(ev.success == 0);
330 }
331 
332 class KeepaliveThrottlingTest : public ::testing::Test {
333  protected:
334  // Starts the server and makes sure that the channel is able to get connected.
335  grpc_server* ServerStart(const char* addr, grpc_completion_queue* cq) {
336  // Set up server channel args to expect pings at an interval of 5 seconds
337  // and use a single ping strike
338  grpc_arg server_args[] = {
340  const_cast<char*>(
342  5 * 1000),
344  const_cast<char*>(GRPC_ARG_HTTP2_MAX_PING_STRIKES), 1)};
345  grpc_channel_args server_channel_args = {GPR_ARRAY_SIZE(server_args),
346  server_args};
347  // Create server
348  grpc_server* server = grpc_server_create(&server_channel_args, nullptr);
350  grpc_server_credentials* server_creds =
353  grpc_server_credentials_release(server_creds);
355  return server;
356  }
357 };
358 
359 TEST_F(KeepaliveThrottlingTest, KeepaliveThrottlingMultipleChannels) {
363  grpc_server* server = ServerStart(server_address.c_str(), cq);
364  // create two channel with a keepalive ping interval of 1 second.
365  grpc_arg client_args[] = {
367  const_cast<char*>(GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA), 0),
369  const_cast<char*>(GRPC_ARG_KEEPALIVE_TIME_MS), 1 * 1000),
371  const_cast<char*>(GRPC_ARG_HTTP2_BDP_PROBE), 0)};
372  grpc_channel_args client_channel_args = {GPR_ARRAY_SIZE(client_args),
373  client_args};
376  grpc_channel_create(server_address.c_str(), creds, &client_channel_args);
377  grpc_channel* channel_dup =
378  grpc_channel_create(server_address.c_str(), creds, &client_channel_args);
380  int expected_keepalive_time_sec = 1;
381  // We need 3 GOAWAY frames to throttle the keepalive time from 1 second to 8
382  // seconds (> 5sec).
383  for (int i = 0; i < 3; i++) {
384  gpr_log(GPR_INFO, "Expected keepalive time : %d",
385  expected_keepalive_time_sec);
386  EXPECT_EQ(PerformWaitingCall(channel, server, cq), GRPC_STATUS_UNAVAILABLE);
387  expected_keepalive_time_sec *= 2;
388  }
389  gpr_log(
390  GPR_INFO,
391  "Client keepalive time %d should now be in sync with the server settings",
392  expected_keepalive_time_sec);
393  EXPECT_EQ(PerformWaitingCall(channel, server, cq),
395  // Since the subchannel is shared, the second channel should also have
396  // keepalive settings in sync with the server.
397  gpr_log(GPR_INFO, "Now testing second channel sharing the same subchannel");
398  EXPECT_EQ(PerformWaitingCall(channel_dup, server, cq),
400  // shutdown and destroy the client and server
402  grpc_channel_destroy(channel_dup);
403  ServerShutdownAndDestroy(server, cq);
406  nullptr)
408  }
410 }
411 
412 grpc_core::Resolver::Result BuildResolverResult(
413  const std::vector<std::string>& addresses) {
415  result.addresses = grpc_core::ServerAddressList();
416  for (const auto& address_str : addresses) {
418  if (!uri.ok()) {
419  gpr_log(GPR_ERROR, "Failed to parse uri. Error: %s",
420  uri.status().ToString().c_str());
421  GPR_ASSERT(uri.ok());
422  }
423  grpc_resolved_address address;
424  GPR_ASSERT(grpc_parse_uri(*uri, &address));
425  result.addresses->emplace_back(address.addr, address.len, nullptr);
426  }
427  return result;
428 }
429 
430 // Tests that when new subchannels are created due to a change in resolved
431 // addresses, the new subchannels use the updated keepalive time.
432 TEST_F(KeepaliveThrottlingTest, NewSubchannelsUseUpdatedKeepaliveTime) {
435  std::string server_address1 =
437  std::string server_address2 =
439  grpc_server* server1 = ServerStart(server_address1.c_str(), cq);
440  grpc_server* server2 = ServerStart(server_address2.c_str(), cq);
441  // create a single channel with multiple subchannels with a keepalive ping
442  // interval of 1 second. To get finer control on subchannel connection times,
443  // we are using pick_first instead of round_robin and using the fake resolver
444  // response generator to switch between the two.
445  auto response_generator =
446  grpc_core::MakeRefCounted<grpc_core::FakeResolverResponseGenerator>();
447  grpc_arg client_args[] = {
449  const_cast<char*>(GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA), 0),
451  const_cast<char*>(GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS), 0),
453  const_cast<char*>(GRPC_ARG_KEEPALIVE_TIME_MS), 1 * 1000),
455  const_cast<char*>(GRPC_ARG_HTTP2_BDP_PROBE), 0),
457  response_generator.get())};
458  grpc_channel_args client_channel_args = {GPR_ARRAY_SIZE(client_args),
459  client_args};
462  grpc_channel_create("fake:///", creds, &client_channel_args);
464  // For a single subchannel 3 GOAWAYs would be sufficient to increase the
465  // keepalive time from 1 second to beyond 5 seconds. Even though we are
466  // alternating between two subchannels, 3 GOAWAYs should still be enough since
467  // the channel should start all new transports with the new keepalive value
468  // (even those from a different subchannel).
469  int expected_keepalive_time_sec = 1;
470  for (int i = 0; i < 3; i++) {
471  gpr_log(GPR_INFO, "Expected keepalive time : %d",
472  expected_keepalive_time_sec);
473  response_generator->SetResponse(BuildResolverResult({absl::StrCat(
474  "ipv4:", i % 2 == 0 ? server_address1 : server_address2)}));
475  // ExecCtx::Flush() might not be enough to make sure that the resolver
476  // result has been propagated, so sleep for a bit.
479  EXPECT_EQ(PerformWaitingCall(channel, i % 2 == 0 ? server1 : server2, cq),
481  expected_keepalive_time_sec *= 2;
482  }
483  gpr_log(
484  GPR_INFO,
485  "Client keepalive time %d should now be in sync with the server settings",
486  expected_keepalive_time_sec);
487  response_generator->SetResponse(
488  BuildResolverResult({absl::StrCat("ipv4:", server_address2)}));
491  EXPECT_EQ(PerformWaitingCall(channel, server2, cq),
493  // shutdown and destroy the client and server
495  ServerShutdownAndDestroy(server1, cq);
496  ServerShutdownAndDestroy(server2, cq);
499  nullptr)
501  }
503 }
504 
505 // Tests that when a channel has multiple subchannels and receives a GOAWAY with
506 // "too_many_pings" on one of them, all subchannels start any new transports
507 // with an updated keepalive time.
508 TEST_F(KeepaliveThrottlingTest,
509  ExistingSubchannelsUseNewKeepaliveTimeWhenReconnecting) {
511  std::string server_address1 =
513  std::string server_address2 =
515  // create a single channel with round robin load balancing policy.
516  auto response_generator =
517  grpc_core::MakeRefCounted<grpc_core::FakeResolverResponseGenerator>();
518  grpc_arg client_args[] = {
520  const_cast<char*>(GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA), 0),
522  const_cast<char*>(GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS), 0),
524  const_cast<char*>(GRPC_ARG_KEEPALIVE_TIME_MS), 1 * 1000),
526  const_cast<char*>(GRPC_ARG_HTTP2_BDP_PROBE), 0),
528  response_generator.get())};
529  grpc_channel_args client_channel_args = {GPR_ARRAY_SIZE(client_args),
530  client_args};
533  grpc_channel_create("fake:///", creds, &client_channel_args);
535  response_generator->SetResponse(
536  BuildResolverResult({absl::StrCat("ipv4:", server_address1),
537  absl::StrCat("ipv4:", server_address2)}));
538  // For a single subchannel 3 GOAWAYs would be sufficient to increase the
539  // keepalive time from 1 second to beyond 5 seconds. Even though we are
540  // alternating between two subchannels, 3 GOAWAYs should still be enough since
541  // the channel should start all new transports with the new keepalive value
542  // (even those from a different subchannel).
543  int expected_keepalive_time_sec = 1;
544  for (int i = 0; i < 3; i++) {
545  gpr_log(GPR_ERROR, "Expected keepalive time : %d",
546  expected_keepalive_time_sec);
547  grpc_server* server = ServerStart(
548  i % 2 == 0 ? server_address1.c_str() : server_address2.c_str(), cq);
549  VerifyChannelReady(channel, cq);
550  EXPECT_EQ(PerformWaitingCall(channel, server, cq), GRPC_STATUS_UNAVAILABLE);
551  ServerShutdownAndDestroy(server, cq);
552  VerifyChannelDisconnected(channel, cq);
553  expected_keepalive_time_sec *= 2;
554  }
555  gpr_log(
556  GPR_INFO,
557  "Client keepalive time %d should now be in sync with the server settings",
558  expected_keepalive_time_sec);
559  grpc_server* server = ServerStart(server_address1.c_str(), cq);
560  VerifyChannelReady(channel, cq);
561  EXPECT_EQ(PerformWaitingCall(channel, server, cq),
563  ServerShutdownAndDestroy(server, cq);
564  // shutdown and destroy the client
568  nullptr)
570  }
572 }
573 
574 // Perform a simple RPC where the client makes a request expecting a response
575 // with payload.
576 void PerformCallWithResponsePayload(grpc_channel* channel, grpc_server* server,
578  grpc_slice response_payload_slice = grpc_slice_from_static_string("hello");
579 
580  grpc_call* c;
581  grpc_call* s;
582  grpc_byte_buffer* response_payload =
583  grpc_raw_byte_buffer_create(&response_payload_slice, 1);
585  grpc_op ops[6];
586  grpc_op* op;
595  int was_cancelled = 2;
596 
599  grpc_slice_from_static_string("/foo"), nullptr,
600  deadline, nullptr);
601  GPR_ASSERT(c);
602 
607 
608  memset(ops, 0, sizeof(ops));
609  op = ops;
612  op->flags = 0;
613  op->reserved = nullptr;
614  op++;
616  op->flags = 0;
617  op->reserved = nullptr;
618  op++;
621  op->flags = 0;
622  op->reserved = nullptr;
623  op++;
626  op->flags = 0;
627  op->reserved = nullptr;
628  op++;
633  op->flags = 0;
634  op->reserved = nullptr;
635  op++;
636  error = grpc_call_start_batch(c, ops, static_cast<size_t>(op - ops), tag(1),
637  nullptr);
639 
641  &request_metadata_recv, cq, cq, tag(101));
643  CQ_EXPECT_COMPLETION(cqv, tag(101), 1);
644  cq_verify(cqv);
645 
646  memset(ops, 0, sizeof(ops));
647  op = ops;
650  op->flags = 0;
651  op->reserved = nullptr;
652  op++;
653  error = grpc_call_start_batch(s, ops, static_cast<size_t>(op - ops), tag(102),
654  nullptr);
656 
657  CQ_EXPECT_COMPLETION(cqv, tag(102), 1);
658  cq_verify(cqv);
659 
660  memset(ops, 0, sizeof(ops));
661  op = ops;
664  op->flags = 0;
665  op->reserved = nullptr;
666  op++;
668  op->data.send_message.send_message = response_payload;
669  op->flags = 0;
670  op->reserved = nullptr;
671  op++;
675  grpc_slice status_details = grpc_slice_from_static_string("xyz");
676  op->data.send_status_from_server.status_details = &status_details;
677  op->flags = 0;
678  op->reserved = nullptr;
679  op++;
680  error = grpc_call_start_batch(s, ops, static_cast<size_t>(op - ops), tag(103),
681  nullptr);
683 
684  CQ_EXPECT_COMPLETION(cqv, tag(103), 1);
685  CQ_EXPECT_COMPLETION(cqv, tag(1), 1);
686  cq_verify(cqv);
687 
689  GPR_ASSERT(0 == grpc_slice_str_cmp(details, "xyz"));
692  GPR_ASSERT(
693  byte_buffer_eq_slice(response_payload_recv, response_payload_slice));
694 
700 
702  grpc_call_unref(s);
703 
704  cq_verifier_destroy(cqv);
705 
706  grpc_byte_buffer_destroy(response_payload);
708 }
709 
710 TEST(TooManyPings, BdpPingNotSentWithoutReceiveSideActivity) {
712  // create the server
715  grpc_arg server_args[] = {
717  const_cast<char*>(
719  60 * 1000),
721  const_cast<char*>(GRPC_ARG_HTTP2_MAX_PING_STRIKES), 1)};
722  grpc_channel_args server_channel_args = {GPR_ARRAY_SIZE(server_args),
723  server_args};
724  grpc_server* server = grpc_server_create(&server_channel_args, nullptr);
726  grpc_server_credentials* server_creds =
728  GPR_ASSERT(
729  grpc_server_add_http2_port(server, server_address.c_str(), server_creds));
730  grpc_server_credentials_release(server_creds);
732  // create the channel (bdp pings are enabled by default)
733  grpc_arg client_args[] = {
735  const_cast<char*>(GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA), 0),
737  const_cast<char*>(GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS), 1)};
738  grpc_channel_args client_channel_args = {GPR_ARRAY_SIZE(client_args),
739  client_args};
742  grpc_channel_create(server_address.c_str(), creds, &client_channel_args);
744  VerifyChannelReady(channel, cq);
745  EXPECT_EQ(TransportCounter::count(), 2 /* one each for server and client */);
747  // Channel should be able to send two pings without disconnect if there was no
748  // BDP sent.
749  grpc_channel_ping(channel, cq, tag(1), nullptr);
750  CQ_EXPECT_COMPLETION(cqv, tag(1), 1);
751  cq_verify(cqv, 5);
752  // Second ping
753  grpc_channel_ping(channel, cq, tag(2), nullptr);
754  CQ_EXPECT_COMPLETION(cqv, tag(2), 1);
755  cq_verify(cqv, 5);
758  PerformCallWithResponsePayload(channel, server, cq);
759  // Wait a bit to make sure that the BDP ping goes out.
760  cq_verify_empty_timeout(cqv, 1);
761  // The call with a response payload should have triggered a BDP ping.
762  // Send two more pings to verify. The second ping should cause a disconnect.
763  // If BDP was not sent, the second ping would not cause a disconnect.
764  grpc_channel_ping(channel, cq, tag(3), nullptr);
765  CQ_EXPECT_COMPLETION(cqv, tag(3), 1);
766  cq_verify(cqv, 5);
767  // Second ping
768  grpc_channel_ping(channel, cq, tag(4), nullptr);
769  CQ_EXPECT_COMPLETION(cqv, tag(4), 1);
770  cq_verify(cqv, 5);
771  // Make sure that the transports have been destroyed
772  VerifyChannelDisconnected(channel, cq);
773  TransportCounter::WaitForTransportsToBeDestroyed();
774  cq_verifier_destroy(cqv);
775  // shutdown and destroy the client and server
776  ServerShutdownAndDestroy(server, cq);
780  nullptr)
782  }
784 }
785 
786 TEST(TooManyPings, TransportsGetCleanedUpOnDisconnect) {
788  // create the client and server
791  grpc_arg server_args[] = {
793  const_cast<char*>(
795  60 * 1000),
797  const_cast<char*>(GRPC_ARG_HTTP2_MAX_PING_STRIKES), 1)};
798  grpc_channel_args server_channel_args = {GPR_ARRAY_SIZE(server_args),
799  server_args};
800  grpc_server* server = grpc_server_create(&server_channel_args, nullptr);
802  grpc_server_credentials* server_creds =
804  GPR_ASSERT(
805  grpc_server_add_http2_port(server, server_address.c_str(), server_creds));
806  grpc_server_credentials_release(server_creds);
808  grpc_arg client_args[] = {
810  const_cast<char*>(GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA), 0),
812  const_cast<char*>(GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS), 1)};
813  grpc_channel_args client_channel_args = {GPR_ARRAY_SIZE(client_args),
814  client_args};
817  grpc_channel_create(server_address.c_str(), creds, &client_channel_args);
819  VerifyChannelReady(channel, cq);
820  EXPECT_EQ(TransportCounter::count(), 2 /* one each for server and client */);
822  // First ping
823  grpc_channel_ping(channel, cq, tag(1), nullptr);
824  CQ_EXPECT_COMPLETION(cqv, tag(1), 1);
825  cq_verify(cqv, 5);
826  // Second ping
827  grpc_channel_ping(channel, cq, tag(2), nullptr);
828  CQ_EXPECT_COMPLETION(cqv, tag(2), 1);
829  cq_verify(cqv, 5);
830  // Third ping caused disconnect
831  grpc_channel_ping(channel, cq, tag(2), nullptr);
832  CQ_EXPECT_COMPLETION(cqv, tag(2), 1);
833  cq_verify(cqv, 5);
834  // Make sure that the transports have been destroyed
835  VerifyChannelDisconnected(channel, cq);
836  TransportCounter::WaitForTransportsToBeDestroyed();
837  cq_verifier_destroy(cqv);
838  // shutdown and destroy the client and server
839  ServerShutdownAndDestroy(server, cq);
843  nullptr)
845  }
847 }
848 
849 } // namespace
850 
851 int main(int argc, char** argv) {
852  ::testing::InitGoogleTest(&argc, argv);
853  grpc::testing::TestEnvironment env(&argc, argv);
855  TransportCounter::CounterInitCallback);
857  TransportCounter::CounterDestructCallback);
858  grpc_init();
859  auto result = RUN_ALL_TESTS();
860  grpc_shutdown();
861  return result;
862 }
grpc_arg
Definition: grpc_types.h:103
grpc_slice_unref
GPRAPI void grpc_slice_unref(grpc_slice s)
Definition: slice_api.cc:32
_gevent_test_main.result
result
Definition: _gevent_test_main.py:96
GPR_INFO
#define GPR_INFO
Definition: include/grpc/impl/codegen/log.h:56
grpc_op::grpc_op_data::grpc_op_send_message::send_message
struct grpc_byte_buffer * send_message
Definition: grpc_types.h:668
grpc_op::flags
uint32_t flags
Definition: grpc_types.h:644
grpc_call_error
grpc_call_error
Definition: grpc_types.h:464
GRPC_CHANNEL_READY
@ GRPC_CHANNEL_READY
Definition: include/grpc/impl/codegen/connectivity_state.h:36
grpc_call_details_destroy
GRPCAPI void grpc_call_details_destroy(grpc_call_details *details)
Definition: call_details.cc:36
grpc_core::CondVar
Definition: src/core/lib/gprpp/sync.h:126
grpc_call_details_init
GRPCAPI void grpc_call_details_init(grpc_call_details *details)
Definition: call_details.cc:30
grpc_op::grpc_op_data::grpc_op_recv_status_on_client::trailing_metadata
grpc_metadata_array * trailing_metadata
Definition: grpc_types.h:701
grpc_timeout_seconds_to_deadline
gpr_timespec grpc_timeout_seconds_to_deadline(int64_t time_s)
Definition: test/core/util/test_config.cc:81
log.h
port.h
grpc_op::grpc_op_data::grpc_op_recv_status_on_client::status
grpc_status_code * status
Definition: grpc_types.h:702
GRPC_STATUS_UNAVAILABLE
@ GRPC_STATUS_UNAVAILABLE
Definition: include/grpc/impl/codegen/status.h:143
grpc_raw_byte_buffer_create
GRPCAPI grpc_byte_buffer * grpc_raw_byte_buffer_create(grpc_slice *slices, size_t nslices)
Definition: byte_buffer.cc:34
generate.env
env
Definition: generate.py:37
absl::StrCat
std::string StrCat(const AlphaNum &a, const AlphaNum &b)
Definition: abseil-cpp/absl/strings/str_cat.cc:98
GRPC_ARG_HTTP2_MAX_PING_STRIKES
#define GRPC_ARG_HTTP2_MAX_PING_STRIKES
Definition: grpc_types.h:231
memset
return memset(p, 0, total)
grpc_op::grpc_op_data::send_initial_metadata
struct grpc_op::grpc_op_data::grpc_op_send_initial_metadata send_initial_metadata
slice.h
grpc_core::TestOnlySetGlobalHttp2TransportDestructCallback
void TestOnlySetGlobalHttp2TransportDestructCallback(TestOnlyGlobalHttp2TransportDestructCallback callback)
Definition: chttp2_transport.cc:217
grpc_metadata_array
Definition: grpc_types.h:579
grpc_call_details
Definition: grpc_types.h:585
grpc_core::MutexLock
Definition: src/core/lib/gprpp/sync.h:88
grpc_op::reserved
void * reserved
Definition: grpc_types.h:646
service_type.h
string.h
grpc_channel_check_connectivity_state
GRPCAPI grpc_connectivity_state grpc_channel_check_connectivity_state(grpc_channel *channel, int try_to_connect)
Definition: channel_connectivity.cc:56
grpc_channel_ping
void grpc_channel_ping(grpc_channel *channel, grpc_completion_queue *cq, void *tag, void *reserved)
Definition: channel_ping.cc:52
GRPC_STATUS_PERMISSION_DENIED
@ GRPC_STATUS_PERMISSION_DENIED
Definition: include/grpc/impl/codegen/status.h:68
useful.h
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
fake_resolver.h
grpc_status_code
grpc_status_code
Definition: include/grpc/impl/codegen/status.h:28
GRPC_QUEUE_SHUTDOWN
@ GRPC_QUEUE_SHUTDOWN
Definition: grpc_types.h:554
GRPC_OP_COMPLETE
@ GRPC_OP_COMPLETE
Definition: grpc_types.h:558
grpc_resolved_address
Definition: resolved_address.h:34
grpc_server_create
GRPCAPI grpc_server * grpc_server_create(const grpc_channel_args *args, void *reserved)
Definition: src/core/lib/surface/server.cc:1456
GRPC_CALL_OK
@ GRPC_CALL_OK
Definition: grpc_types.h:466
status
absl::Status status
Definition: rls.cc:251
grpc_server_register_completion_queue
GRPCAPI void grpc_server_register_completion_queue(grpc_server *server, grpc_completion_queue *cq, void *reserved)
Definition: src/core/lib/surface/server.cc:1466
gpr_inf_future
GPRAPI gpr_timespec gpr_inf_future(gpr_clock_type type)
Definition: src/core/lib/gpr/time.cc:55
absl::FormatConversionChar::s
@ s
GRPC_STATUS_DEADLINE_EXCEEDED
@ GRPC_STATUS_DEADLINE_EXCEEDED
Definition: include/grpc/impl/codegen/status.h:53
time.h
grpc_security.h
grpc_call_details::method
grpc_slice method
Definition: grpc_types.h:586
grpc_core::URI::Parse
static absl::StatusOr< URI > Parse(absl::string_view uri_text)
Definition: uri_parser.cc:209
grpc_core::TestOnlySetGlobalHttp2TransportInitCallback
void TestOnlySetGlobalHttp2TransportInitCallback(TestOnlyGlobalHttp2TransportInitCallback callback)
Definition: chttp2_transport.cc:212
credentials.h
grpc_channel_args
Definition: grpc_types.h:132
server_address
std::string server_address("0.0.0.0:10000")
grpc_op::grpc_op_data::recv_message
struct grpc_op::grpc_op_data::grpc_op_recv_message recv_message
testing::Test
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:402
grpc_connectivity_state
grpc_connectivity_state
Definition: include/grpc/impl/codegen/connectivity_state.h:30
grpc_op::data
union grpc_op::grpc_op_data data
EXPECT_EQ
#define EXPECT_EQ(a, b)
Definition: iomgr/time_averaged_stats_test.cc:27
grpc_types.h
alts_security_connector.h
grpc_insecure_server_credentials_create
GRPCAPI grpc_server_credentials * grpc_insecure_server_credentials_create()
Definition: core/lib/security/credentials/insecure/insecure_credentials.cc:71
grpc_parse_uri
bool grpc_parse_uri(const grpc_core::URI &uri, grpc_resolved_address *resolved_addr)
Definition: parse_address.cc:293
grpc_metadata_array_destroy
GRPCAPI void grpc_metadata_array_destroy(grpc_metadata_array *array)
Definition: metadata_array.cc:35
grpc_op::grpc_op_data::grpc_op_recv_message::recv_message
struct grpc_byte_buffer ** recv_message
Definition: grpc_types.h:693
string_util.h
grpc_server_request_call
GRPCAPI grpc_call_error grpc_server_request_call(grpc_server *server, grpc_call **call, grpc_call_details *details, grpc_metadata_array *request_metadata, grpc_completion_queue *cq_bound_to_call, grpc_completion_queue *cq_for_notification, void *tag_new)
Definition: src/core/lib/surface/server.cc:1526
trailing_metadata_recv
static grpc_metadata_array trailing_metadata_recv
Definition: test/core/fling/client.cc:43
server
std::unique_ptr< Server > server
Definition: channelz_service_test.cc:330
parse_address.h
c
void c(T a)
Definition: miscompile_with_no_unique_address_test.cc:40
channel
wrapped_grpc_channel * channel
Definition: src/php/ext/grpc/call.h:33
GRPC_STATUS_OK
@ GRPC_STATUS_OK
Definition: include/grpc/impl/codegen/status.h:30
GRPC_OP_RECV_INITIAL_METADATA
@ GRPC_OP_RECV_INITIAL_METADATA
Definition: grpc_types.h:617
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
GRPC_OP_SEND_STATUS_FROM_SERVER
@ GRPC_OP_SEND_STATUS_FROM_SERVER
Definition: grpc_types.h:612
TEST
#define TEST(name, init_size,...)
Definition: arena_test.cc:75
tag
static void * tag(intptr_t t)
Definition: bad_client.cc:318
grpc_server_credentials_release
GRPCAPI void grpc_server_credentials_release(grpc_server_credentials *creds)
Definition: credentials.cc:95
grpc_core::ExecCtx::Flush
bool Flush()
Definition: exec_ctx.cc:69
mu
Mutex mu
Definition: server_config_selector_filter.cc:74
grpc_server_add_http2_port
GRPCAPI int grpc_server_add_http2_port(grpc_server *server, const char *addr, grpc_server_credentials *creds)
Definition: chttp2_server.cc:1029
grpc_call_unref
GRPCAPI void grpc_call_unref(grpc_call *call)
Definition: call.cc:1770
grpc_op::grpc_op_data::grpc_op_send_status_from_server::status
grpc_status_code status
Definition: grpc_types.h:673
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
grpc_event
Definition: grpc_types.h:564
grpc_completion_queue
Definition: completion_queue.cc:347
cq_verifier_destroy
void cq_verifier_destroy(cq_verifier *v)
Definition: cq_verifier.cc:92
grpc_core::Resolver::Result
Results returned by the resolver.
Definition: resolver/resolver.h:56
gpr_sleep_until
GPRAPI void gpr_sleep_until(gpr_timespec until)
grpc.h
grpc_call
struct grpc_call grpc_call
Definition: grpc_types.h:70
response_payload_recv
static grpc_byte_buffer * response_payload_recv
Definition: test/core/fling/client.cc:44
grpc_byte_buffer
Definition: grpc_types.h:43
grpc_core::JoinHostPort
std::string JoinHostPort(absl::string_view host, int port)
Definition: host_port.cc:32
grpc_insecure_credentials_create
GRPCAPI grpc_channel_credentials * grpc_insecure_credentials_create()
Definition: core/lib/security/credentials/insecure/insecure_credentials.cc:64
grpc_op
Definition: grpc_types.h:640
GRPC_OP_SEND_MESSAGE
@ GRPC_OP_SEND_MESSAGE
Definition: grpc_types.h:602
grpc_slice_from_static_string
GPRAPI grpc_slice grpc_slice_from_static_string(const char *source)
Definition: slice/slice.cc:89
cq_verifier_create
cq_verifier * cq_verifier_create(grpc_completion_queue *cq)
Definition: cq_verifier.cc:86
was_cancelled
static int was_cancelled
Definition: test/core/fling/server.cc:58
FAIL
@ FAIL
Definition: call_creds.cc:42
grpc_slice
Definition: include/grpc/impl/codegen/slice.h:65
grpc_server
struct grpc_server grpc_server
Definition: grpc_types.h:65
intptr_t
_W64 signed int intptr_t
Definition: stdint-msvc2008.h:118
GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA
#define GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA
Definition: grpc_types.h:226
cq_verifier
Definition: cq_verifier.cc:76
grpc_resolved_address::len
socklen_t len
Definition: resolved_address.h:36
request_metadata_recv
static grpc_metadata_array request_metadata_recv
Definition: test/core/fling/server.cc:48
error.h
grpc_server_destroy
GRPCAPI void grpc_server_destroy(grpc_server *server)
Definition: src/core/lib/surface/server.cc:1519
host_port.h
CQ_EXPECT_COMPLETION
#define CQ_EXPECT_COMPLETION(v, tag, success)
Definition: cq_verifier.h:58
RUN_ALL_TESTS
int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2471
GPR_ERROR
#define GPR_ERROR
Definition: include/grpc/impl/codegen/log.h:57
grpc_pick_unused_port_or_die
int grpc_pick_unused_port_or_die(void)
grpc_core::ServerAddressList
std::vector< ServerAddress > ServerAddressList
Definition: server_address.h:120
grpc_core::ExecCtx
Definition: exec_ctx.h:97
grpc_op::op
grpc_op_type op
Definition: grpc_types.h:642
grpc_op::grpc_op_data::grpc_op_send_initial_metadata::count
size_t count
Definition: grpc_types.h:653
grpc_op::grpc_op_data::grpc_op_recv_status_on_client::status_details
grpc_slice * status_details
Definition: grpc_types.h:703
details
static grpc_slice details
Definition: test/core/fling/client.cc:46
test_config.h
grpc_channel_credentials_release
GRPCAPI void grpc_channel_credentials_release(grpc_channel_credentials *creds)
Definition: credentials.cc:36
grpc_channel_create_call
GRPCAPI grpc_call * grpc_channel_create_call(grpc_channel *channel, grpc_call *parent_call, uint32_t propagation_mask, grpc_completion_queue *completion_queue, grpc_slice method, const grpc_slice *host, gpr_timespec deadline, void *reserved)
Definition: channel.cc:311
count_
int * count_
Definition: connectivity_state_test.cc:65
grpc_op::grpc_op_data::recv_close_on_server
struct grpc_op::grpc_op_data::grpc_op_recv_close_on_server recv_close_on_server
GRPC_OP_RECV_MESSAGE
@ GRPC_OP_RECV_MESSAGE
Definition: grpc_types.h:621
grpc_server_credentials
Definition: src/core/lib/security/credentials/credentials.h:259
absl::Seconds
constexpr Duration Seconds(T n)
Definition: third_party/abseil-cpp/absl/time/time.h:419
alts_credentials.h
absl::StatusOr::ok
ABSL_MUST_USE_RESULT bool ok() const
Definition: abseil-cpp/absl/status/statusor.h:491
GPR_ARRAY_SIZE
#define GPR_ARRAY_SIZE(array)
Definition: useful.h:129
grpc_core::Mutex
Definition: src/core/lib/gprpp/sync.h:61
grpc_channel_create
GRPCAPI grpc_channel * grpc_channel_create(const char *target, grpc_channel_credentials *creds, const grpc_channel_args *args)
Definition: chttp2_connector.cc:366
testing::InitGoogleTest
GTEST_API_ void InitGoogleTest(int *argc, char **argv)
Definition: bloaty/third_party/googletest/googletest/src/gtest.cc:6106
GRPC_PROPAGATE_DEFAULTS
#define GRPC_PROPAGATE_DEFAULTS
Definition: propagation_bits.h:45
grpc_op::grpc_op_data::send_status_from_server
struct grpc_op::grpc_op_data::grpc_op_send_status_from_server send_status_from_server
grpc_channel_arg_integer_create
grpc_arg grpc_channel_arg_integer_create(char *name, int value)
Definition: channel_args.cc:484
cv
unsigned cv
Definition: cxa_demangle.cpp:4908
cq_verifier.h
server
Definition: examples/python/async_streaming/server.py:1
count
int * count
Definition: bloaty/third_party/googletest/googlemock/test/gmock_stress_test.cc:96
grpc_completion_queue_destroy
GRPCAPI void grpc_completion_queue_destroy(grpc_completion_queue *cq)
Definition: completion_queue.cc:1424
GRPC_OP_SEND_INITIAL_METADATA
@ GRPC_OP_SEND_INITIAL_METADATA
Definition: grpc_types.h:598
main
int main(int argc, char **argv)
Definition: too_many_pings_test.cc:851
exec_ctx
grpc_core::ExecCtx exec_ctx
Definition: end2end_binder_transport_test.cc:75
grpc_op::grpc_op_data::send_message
struct grpc_op::grpc_op_data::grpc_op_send_message send_message
absl::str_format_internal::LengthMod::t
@ t
alloc.h
google::protobuf.internal::Mutex
WrappedMutex Mutex
Definition: bloaty/third_party/protobuf/src/google/protobuf/stubs/mutex.h:113
grpc_op::grpc_op_data::recv_status_on_client
struct grpc_op::grpc_op_data::grpc_op_recv_status_on_client recv_status_on_client
grpc_op::grpc_op_data::grpc_op_send_status_from_server::trailing_metadata_count
size_t trailing_metadata_count
Definition: grpc_types.h:671
grpc::testing::TestEnvironment
Definition: test/core/util/test_config.h:54
chttp2_transport.h
thd.h
grpc_server_shutdown_and_notify
GRPCAPI void grpc_server_shutdown_and_notify(grpc_server *server, grpc_completion_queue *cq, void *tag)
Definition: src/core/lib/surface/server.cc:1503
GRPC_ARG_HTTP2_BDP_PROBE
#define GRPC_ARG_HTTP2_BDP_PROBE
Definition: grpc_types.h:204
grpc_byte_buffer_destroy
GRPCAPI void grpc_byte_buffer_destroy(grpc_byte_buffer *bb)
Definition: byte_buffer.cc:81
grpc_completion_queue_next
GRPCAPI grpc_event grpc_completion_queue_next(grpc_completion_queue *cq, gpr_timespec deadline, void *reserved)
Definition: completion_queue.cc:1133
cq_verify
void cq_verify(cq_verifier *v, int timeout_sec)
Definition: cq_verifier.cc:268
ASSERT_FALSE
#define ASSERT_FALSE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1976
grpc_completion_queue_shutdown
GRPCAPI void grpc_completion_queue_shutdown(grpc_completion_queue *cq)
Definition: completion_queue.cc:1416
grpc_channel_destroy
GRPCAPI void grpc_channel_destroy(grpc_channel *channel)
Definition: channel.cc:437
state
Definition: bloaty/third_party/zlib/contrib/blast/blast.c:41
grpc_channel
struct grpc_channel grpc_channel
Definition: grpc_types.h:62
GRPC_OP_RECV_CLOSE_ON_SERVER
@ GRPC_OP_RECV_CLOSE_ON_SERVER
Definition: grpc_types.h:633
grpc_channel_watch_connectivity_state
GRPCAPI void grpc_channel_watch_connectivity_state(grpc_channel *channel, grpc_connectivity_state last_observed_state, gpr_timespec deadline, grpc_completion_queue *cq, void *tag)
Definition: channel_connectivity.cc:227
GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS
#define GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS
Definition: grpc_types.h:247
grpc_completion_queue_create_for_next
GRPCAPI grpc_completion_queue * grpc_completion_queue_create_for_next(void *reserved)
Definition: completion_queue_factory.cc:62
grpc_core::FakeResolverResponseGenerator::MakeChannelArg
static grpc_arg MakeChannelArg(FakeResolverResponseGenerator *generator)
Definition: fake_resolver.cc:338
grpc_op::grpc_op_data::recv_initial_metadata
struct grpc_op::grpc_op_data::grpc_op_recv_initial_metadata recv_initial_metadata
grpc_op::grpc_op_data::grpc_op_send_status_from_server::status_details
grpc_slice * status_details
Definition: grpc_types.h:677
absl::StatusOr
Definition: abseil-cpp/absl/status/statusor.h:187
asyncio_get_stats.type
type
Definition: asyncio_get_stats.py:37
gpr_timespec
Definition: gpr_types.h:50
GRPC_ARG_KEEPALIVE_TIME_MS
#define GRPC_ARG_KEEPALIVE_TIME_MS
Definition: grpc_types.h:240
grpc_event::type
grpc_completion_type type
Definition: grpc_types.h:566
grpc_init
GRPCAPI void grpc_init(void)
Definition: init.cc:146
grpc_server_start
GRPCAPI void grpc_server_start(grpc_server *server)
Definition: src/core/lib/surface/server.cc:1497
GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS
#define GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS
Definition: grpc_types.h:219
GRPC_OP_RECV_STATUS_ON_CLIENT
@ GRPC_OP_RECV_STATUS_ON_CLIENT
Definition: grpc_types.h:627
grpc_op::grpc_op_data::grpc_op_recv_initial_metadata::recv_initial_metadata
grpc_metadata_array * recv_initial_metadata
Definition: grpc_types.h:685
cq_verify_empty_timeout
void cq_verify_empty_timeout(cq_verifier *v, int timeout_sec)
Definition: cq_verifier.cc:286
GPR_CLOCK_REALTIME
@ GPR_CLOCK_REALTIME
Definition: gpr_types.h:39
grpc_slice_str_cmp
GPRAPI int grpc_slice_str_cmp(grpc_slice a, const char *b)
Definition: slice/slice.cc:426
byte_buffer_eq_slice
int byte_buffer_eq_slice(grpc_byte_buffer *bb, grpc_slice b)
Definition: cq_verifier.cc:168
op
static grpc_op * op
Definition: test/core/fling/client.cc:47
grpc_resolved_address::addr
char addr[GRPC_MAX_SOCKADDR_SIZE]
Definition: resolved_address.h:35
grpc_event::success
int success
Definition: grpc_types.h:572
ops
static grpc_op ops[6]
Definition: test/core/fling/client.cc:39
initial_metadata_recv
static grpc_metadata_array initial_metadata_recv
Definition: test/core/fling/client.cc:42
grpc_call_start_batch
GRPCAPI grpc_call_error grpc_call_start_batch(grpc_call *call, const grpc_op *ops, size_t nops, void *tag, void *reserved)
Definition: call.cc:1831
grpc_shutdown
GRPCAPI void grpc_shutdown(void)
Definition: init.cc:209
grpc_channel_credentials
Definition: src/core/lib/security/credentials/credentials.h:96
grpc_call_cancel_with_status
GRPCAPI grpc_call_error grpc_call_cancel_with_status(grpc_call *call, grpc_status_code status, const char *description, void *reserved)
Definition: call.cc:1791
addr
struct sockaddr_in addr
Definition: libuv/docs/code/tcp-echo-server/main.c:10
grpc_event::tag
void * tag
Definition: grpc_types.h:576
server_builder.h
grpc_op::grpc_op_data::grpc_op_recv_close_on_server::cancelled
int * cancelled
Definition: grpc_types.h:714
cq
static grpc_completion_queue * cq
Definition: test/core/fling/client.cc:37
grpc_core::ExecCtx::Get
static ExecCtx * Get()
Definition: exec_ctx.h:205
GRPC_OP_SEND_CLOSE_FROM_CLIENT
@ GRPC_OP_SEND_CLOSE_FROM_CLIENT
Definition: grpc_types.h:607
slice_string_helpers.h
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
call_details
static grpc_call_details call_details
Definition: test/core/fling/server.cc:47
grpc_metadata_array_init
GRPCAPI void grpc_metadata_array_init(grpc_metadata_array *array)
Definition: metadata_array.cc:30
absl::StatusOr::status
const Status & status() const &
Definition: abseil-cpp/absl/status/statusor.h:678
ASSERT_EQ
#define ASSERT_EQ(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2056
TEST_F
#define TEST_F(test_fixture, test_name)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2367
channel.h
port_platform.h


grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:39