tcp_server_posix_test.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2015 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 
21 
22 // This test won't work except with posix sockets enabled
23 #ifdef GRPC_POSIX_SOCKET_TCP_SERVER
24 
25 #include <errno.h>
26 #include <ifaddrs.h>
27 #include <netinet/in.h>
28 #include <stdio.h>
29 #include <string.h>
30 #include <sys/socket.h>
31 #include <sys/types.h>
32 #include <unistd.h>
33 
34 #include <string>
35 
36 #include <grpc/grpc.h>
37 #include <grpc/support/alloc.h>
38 #include <grpc/support/log.h>
39 #include <grpc/support/sync.h>
40 #include <grpc/support/time.h>
41 
49 #include "test/core/util/port.h"
51 
52 #define LOG_TEST(x) gpr_log(GPR_INFO, "%s", #x)
53 
54 static gpr_mu* g_mu;
55 static grpc_pollset* g_pollset;
56 static int g_nconnects = 0;
57 
58 typedef struct {
59  /* Owns a ref to server. */
61  unsigned port_index;
62  unsigned fd_index;
63  int server_fd;
64 } on_connect_result;
65 
66 typedef struct {
68 
69  /* arg is this server_weak_ref. */
70  grpc_closure server_shutdown;
71 } server_weak_ref;
72 
73 #define MAX_URI 1024
74 typedef struct {
76  char str[MAX_URI];
77 } test_addr;
78 
79 #define MAX_ADDRS 100
80 typedef struct {
81  size_t naddrs;
82  test_addr addrs[MAX_ADDRS];
83 } test_addrs;
84 
85 static on_connect_result g_result = {nullptr, 0, 0, -1};
86 
87 static char family_name_buf[1024];
88 static const char* sock_family_name(int family) {
89  if (family == AF_INET) {
90  return "AF_INET";
91  } else if (family == AF_INET6) {
92  return "AF_INET6";
93  } else if (family == AF_UNSPEC) {
94  return "AF_UNSPEC";
95  } else {
96  sprintf(family_name_buf, "%d", family);
97  return family_name_buf;
98  }
99 }
100 
101 static void on_connect_result_init(on_connect_result* result) {
102  result->server = nullptr;
103  result->port_index = 0;
104  result->fd_index = 0;
105  result->server_fd = -1;
106 }
107 
108 static void on_connect_result_set(on_connect_result* result,
109  const grpc_tcp_server_acceptor* acceptor) {
110  result->server = grpc_tcp_server_ref(acceptor->from_server);
111  result->port_index = acceptor->port_index;
112  result->fd_index = acceptor->fd_index;
113  result->server_fd = grpc_tcp_server_port_fd(
114  result->server, acceptor->port_index, acceptor->fd_index);
115 }
116 
117 static void server_weak_ref_shutdown(void* arg, grpc_error_handle /*error*/) {
118  server_weak_ref* weak_ref = static_cast<server_weak_ref*>(arg);
119  weak_ref->server = nullptr;
120 }
121 
122 static void server_weak_ref_init(server_weak_ref* weak_ref) {
123  weak_ref->server = nullptr;
124  GRPC_CLOSURE_INIT(&weak_ref->server_shutdown, server_weak_ref_shutdown,
125  weak_ref, grpc_schedule_on_exec_ctx);
126 }
127 
128 /* Make weak_ref->server_shutdown a shutdown_starting cb on server.
129  grpc_tcp_server promises that the server object will live until
130  weak_ref->server_shutdown has returned. A strong ref on grpc_tcp_server
131  should be held until server_weak_ref_set() returns to avoid a race where the
132  server is deleted before the shutdown_starting cb is added. */
133 static void server_weak_ref_set(server_weak_ref* weak_ref,
135  grpc_tcp_server_shutdown_starting_add(server, &weak_ref->server_shutdown);
136  weak_ref->server = server;
137 }
138 
139 static void test_addr_init_str(test_addr* addr) {
140  std::string str = grpc_sockaddr_to_string(&addr->addr, false).value();
141  size_t str_len = std::min(str.size(), sizeof(addr->str) - 1);
142  memcpy(addr->str, str.c_str(), str_len);
143  addr->str[str_len] = '\0';
144 }
145 
146 static void on_connect(void* /*arg*/, grpc_endpoint* tcp,
147  grpc_pollset* /*pollset*/,
148  grpc_tcp_server_acceptor* acceptor) {
152 
153  on_connect_result temp_result;
154  on_connect_result_set(&temp_result, acceptor);
155  gpr_free(acceptor);
156 
157  gpr_mu_lock(g_mu);
158  g_result = temp_result;
159  g_nconnects++;
160  GPR_ASSERT(
161  GRPC_LOG_IF_ERROR("pollset_kick", grpc_pollset_kick(g_pollset, nullptr)));
163 }
164 
165 static void test_no_op(void) {
170  .PreconditionChannelArgs(nullptr)
171  .ToC();
175 }
176 
177 static void test_no_op_with_start(void) {
182  .PreconditionChannelArgs(nullptr)
183  .ToC();
186  LOG_TEST("test_no_op_with_start");
187  std::vector<grpc_pollset*> empty_pollset;
188  grpc_tcp_server_start(s, &empty_pollset, on_connect, nullptr);
190 }
191 
192 static void test_no_op_with_port(void) {
194  grpc_resolved_address resolved_addr;
195  struct sockaddr_in* addr =
196  reinterpret_cast<struct sockaddr_in*>(resolved_addr.addr);
200  .PreconditionChannelArgs(nullptr)
201  .ToC();
204  LOG_TEST("test_no_op_with_port");
205 
206  memset(&resolved_addr, 0, sizeof(resolved_addr));
207  resolved_addr.len = static_cast<socklen_t>(sizeof(struct sockaddr_in));
208  addr->sin_family = AF_INET;
209  int port = -1;
210  GPR_ASSERT(grpc_tcp_server_add_port(s, &resolved_addr, &port) ==
211  GRPC_ERROR_NONE &&
212  port > 0);
213 
215 }
216 
217 static void test_no_op_with_port_and_start(void) {
219  grpc_resolved_address resolved_addr;
220  struct sockaddr_in* addr =
221  reinterpret_cast<struct sockaddr_in*>(resolved_addr.addr);
225  .PreconditionChannelArgs(nullptr)
226  .ToC();
229  LOG_TEST("test_no_op_with_port_and_start");
230  int port = -1;
231 
232  memset(&resolved_addr, 0, sizeof(resolved_addr));
233  resolved_addr.len = static_cast<socklen_t>(sizeof(struct sockaddr_in));
234  addr->sin_family = AF_INET;
235  GPR_ASSERT(grpc_tcp_server_add_port(s, &resolved_addr, &port) ==
236  GRPC_ERROR_NONE &&
237  port > 0);
238 
239  std::vector<grpc_pollset*> empty_pollset;
240  grpc_tcp_server_start(s, &empty_pollset, on_connect, nullptr);
241 
243 }
244 
245 static grpc_error_handle tcp_connect(const test_addr* remote,
246  on_connect_result* result) {
249  int clifd;
250  int nconnects_before;
251  const struct sockaddr* remote_addr =
252  reinterpret_cast<const struct sockaddr*>(remote->addr.addr);
253 
254  gpr_log(GPR_INFO, "Connecting to %s", remote->str);
255  gpr_mu_lock(g_mu);
256  nconnects_before = g_nconnects;
257  on_connect_result_init(&g_result);
258  clifd = socket(remote_addr->sa_family, SOCK_STREAM, 0);
259  if (clifd < 0) {
261  return GRPC_OS_ERROR(errno, "Failed to create socket");
262  }
263  gpr_log(GPR_DEBUG, "start connect to %s", remote->str);
264  if (connect(clifd, remote_addr, static_cast<socklen_t>(remote->addr.len)) !=
265  0) {
267  close(clifd);
268  return GRPC_OS_ERROR(errno, "connect");
269  }
270  gpr_log(GPR_DEBUG, "wait");
271  while (g_nconnects == nconnects_before &&
272  deadline > grpc_core::ExecCtx::Get()->Now()) {
273  grpc_pollset_worker* worker = nullptr;
275  if ((err = grpc_pollset_work(g_pollset, &worker, deadline)) !=
276  GRPC_ERROR_NONE) {
278  close(clifd);
279  return err;
280  }
282 
283  gpr_mu_lock(g_mu);
284  }
285  gpr_log(GPR_DEBUG, "wait done");
286  if (g_nconnects != nconnects_before + 1) {
288  close(clifd);
289  return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Didn't connect");
290  }
291  close(clifd);
292  *result = g_result;
293 
295  gpr_log(GPR_INFO, "Result (%d, %d) fd %d", result->port_index,
296  result->fd_index, result->server_fd);
297  grpc_tcp_server_unref(result->server);
298  return GRPC_ERROR_NONE;
299 }
300 
301 /* Tests a tcp server on "::" listeners with multiple ports. If channel_args is
302  non-NULL, pass them to the server. If dst_addrs is non-NULL, use valid addrs
303  as destination addrs (port is not set). If dst_addrs is NULL, use listener
304  addrs as destination addrs. If test_dst_addrs is true, test connectivity with
305  each destination address, set grpc_resolved_address::len=0 for failures, but
306  don't fail the overall unitest. */
307 static void test_connect(size_t num_connects,
308  const grpc_channel_args* channel_args,
309  test_addrs* dst_addrs, bool test_dst_addrs) {
311  grpc_resolved_address resolved_addr;
312  grpc_resolved_address resolved_addr1;
313  struct sockaddr_storage* const addr =
314  reinterpret_cast<struct sockaddr_storage*>(resolved_addr.addr);
315  struct sockaddr_storage* const addr1 =
316  reinterpret_cast<struct sockaddr_storage*>(resolved_addr1.addr);
317  unsigned svr_fd_count;
318  int port;
319  int svr_port;
320  unsigned svr1_fd_count;
321  int svr1_port;
323  const unsigned num_ports = 2;
324  const grpc_channel_args* new_channel_args =
327  .PreconditionChannelArgs(channel_args)
328  .ToC();
330  grpc_tcp_server_create(nullptr, new_channel_args, &s));
331  grpc_channel_args_destroy(new_channel_args);
332  unsigned port_num;
333  server_weak_ref weak_ref;
334  server_weak_ref_init(&weak_ref);
335  server_weak_ref_set(&weak_ref, s);
336  LOG_TEST("test_connect");
338  "clients=%lu, num chan args=%lu, remote IP=%s, test_dst_addrs=%d",
339  static_cast<unsigned long>(num_connects),
340  static_cast<unsigned long>(
341  channel_args != nullptr ? channel_args->num_args : 0),
342  dst_addrs != nullptr ? "<specific>" : "::", test_dst_addrs);
343  memset(&resolved_addr, 0, sizeof(resolved_addr));
344  memset(&resolved_addr1, 0, sizeof(resolved_addr1));
345  resolved_addr.len = static_cast<socklen_t>(sizeof(struct sockaddr_storage));
346  resolved_addr1.len = static_cast<socklen_t>(sizeof(struct sockaddr_storage));
347  addr->ss_family = addr1->ss_family = AF_INET;
349  "grpc_tcp_server_add_port",
350  grpc_tcp_server_add_port(s, &resolved_addr, &svr_port)));
351  gpr_log(GPR_INFO, "Allocated port %d", svr_port);
352  GPR_ASSERT(svr_port > 0);
353  /* Cannot use wildcard (port==0), because add_port() will try to reuse the
354  same port as a previous add_port(). */
355  svr1_port = grpc_pick_unused_port_or_die();
356  GPR_ASSERT(svr1_port > 0);
357  gpr_log(GPR_INFO, "Picked unused port %d", svr1_port);
358  grpc_sockaddr_set_port(&resolved_addr1, svr1_port);
359  GPR_ASSERT(grpc_tcp_server_add_port(s, &resolved_addr1, &port) ==
360  GRPC_ERROR_NONE &&
361  port == svr1_port);
362 
363  /* Bad port_index. */
365  GPR_ASSERT(grpc_tcp_server_port_fd(s, 2, 0) < 0);
366 
367  /* Bad fd_index. */
368  GPR_ASSERT(grpc_tcp_server_port_fd(s, 0, 100) < 0);
369  GPR_ASSERT(grpc_tcp_server_port_fd(s, 1, 100) < 0);
370 
371  /* Got at least one fd per port. */
372  svr_fd_count = grpc_tcp_server_port_fd_count(s, 0);
373  GPR_ASSERT(svr_fd_count >= 1);
374  svr1_fd_count = grpc_tcp_server_port_fd_count(s, 1);
375  GPR_ASSERT(svr1_fd_count >= 1);
376 
377  std::vector<grpc_pollset*> test_pollset;
378  test_pollset.push_back(g_pollset);
379  grpc_tcp_server_start(s, &test_pollset, on_connect, nullptr);
380 
381  if (dst_addrs != nullptr) {
382  int ports[] = {svr_port, svr1_port};
383  for (port_num = 0; port_num < num_ports; ++port_num) {
384  size_t dst_idx;
385  size_t num_tested = 0;
386  for (dst_idx = 0; dst_idx < dst_addrs->naddrs; ++dst_idx) {
387  test_addr dst = dst_addrs->addrs[dst_idx];
388  on_connect_result result;
390  if (dst.addr.len == 0) {
391  gpr_log(GPR_DEBUG, "Skipping test of non-functional local IP %s",
392  dst.str);
393  continue;
394  }
395  GPR_ASSERT(grpc_sockaddr_set_port(&dst.addr, ports[port_num]));
396  test_addr_init_str(&dst);
397  ++num_tested;
398  on_connect_result_init(&result);
399  if ((err = tcp_connect(&dst, &result)) == GRPC_ERROR_NONE &&
400  result.server_fd >= 0 && result.server == s) {
401  continue;
402  }
403  gpr_log(GPR_ERROR, "Failed to connect to %s: %s", dst.str,
405  GPR_ASSERT(test_dst_addrs);
406  dst_addrs->addrs[dst_idx].addr.len = 0;
408  }
409  GPR_ASSERT(num_tested > 0);
410  }
411  } else {
412  for (port_num = 0; port_num < num_ports; ++port_num) {
413  const unsigned num_fds = grpc_tcp_server_port_fd_count(s, port_num);
414  unsigned fd_num;
415  for (fd_num = 0; fd_num < num_fds; ++fd_num) {
416  int fd = grpc_tcp_server_port_fd(s, port_num, fd_num);
417  size_t connect_num;
418  test_addr dst;
419  GPR_ASSERT(fd >= 0);
420  dst.addr.len = static_cast<socklen_t>(sizeof(dst.addr.addr));
421  GPR_ASSERT(getsockname(fd, (struct sockaddr*)dst.addr.addr,
422  (socklen_t*)&dst.addr.len) == 0);
423  GPR_ASSERT(dst.addr.len <= sizeof(dst.addr.addr));
424  test_addr_init_str(&dst);
425  gpr_log(GPR_INFO, "(%d, %d) fd %d family %s listening on %s", port_num,
426  fd_num, fd, sock_family_name(addr->ss_family), dst.str);
427  for (connect_num = 0; connect_num < num_connects; ++connect_num) {
428  on_connect_result result;
429  on_connect_result_init(&result);
430  GPR_ASSERT(
431  GRPC_LOG_IF_ERROR("tcp_connect", tcp_connect(&dst, &result)));
432  GPR_ASSERT(result.server_fd == fd);
433  GPR_ASSERT(result.port_index == port_num);
434  GPR_ASSERT(result.fd_index == fd_num);
435  GPR_ASSERT(result.server == s);
436  GPR_ASSERT(
437  grpc_tcp_server_port_fd(s, result.port_index, result.fd_index) ==
438  result.server_fd);
439  }
440  }
441  }
442  }
443  /* Weak ref to server valid until final unref. */
444  GPR_ASSERT(weak_ref.server != nullptr);
445  GPR_ASSERT(grpc_tcp_server_port_fd(s, 0, 0) >= 0);
446 
449 
450  /* Weak ref lost. */
451  GPR_ASSERT(weak_ref.server == nullptr);
452 }
453 
454 static void destroy_pollset(void* p, grpc_error_handle /*error*/) {
455  grpc_pollset_destroy(static_cast<grpc_pollset*>(p));
456 }
457 
458 int main(int argc, char** argv) {
459  grpc_closure destroyed;
460  grpc_arg chan_args[1];
461  chan_args[0].type = GRPC_ARG_INTEGER;
462  chan_args[0].key = const_cast<char*>(GRPC_ARG_EXPAND_WILDCARD_ADDRS);
463  chan_args[0].value.integer = 1;
464  const grpc_channel_args channel_args = {1, chan_args};
465  struct ifaddrs* ifa = nullptr;
466  struct ifaddrs* ifa_it;
467  // Zalloc dst_addrs to avoid oversized frames.
468  test_addrs* dst_addrs = grpc_core::Zalloc<test_addrs>();
469  grpc::testing::TestEnvironment env(&argc, argv);
470  grpc_init();
471  // wait a few seconds to make sure IPv6 link-local addresses can be bound
472  // if we are running under docker container that has just started.
473  // See https://github.com/moby/moby/issues/38491
474  // See https://github.com/grpc/grpc/issues/15610
476  {
480 
481  test_no_op();
482  test_no_op_with_start();
483  test_no_op_with_port();
484  test_no_op_with_port_and_start();
485 
486  if (getifaddrs(&ifa) != 0 || ifa == nullptr) {
487  gpr_log(GPR_ERROR, "getifaddrs: %s", strerror(errno));
488  return EXIT_FAILURE;
489  }
490  dst_addrs->naddrs = 0;
491  for (ifa_it = ifa; ifa_it != nullptr && dst_addrs->naddrs < MAX_ADDRS;
492  ifa_it = ifa_it->ifa_next) {
493  if (ifa_it->ifa_addr == nullptr) {
494  continue;
495  } else if (ifa_it->ifa_addr->sa_family == AF_INET) {
496  dst_addrs->addrs[dst_addrs->naddrs].addr.len =
497  static_cast<socklen_t>(sizeof(struct sockaddr_in));
498  } else if (ifa_it->ifa_addr->sa_family == AF_INET6) {
499  dst_addrs->addrs[dst_addrs->naddrs].addr.len =
500  static_cast<socklen_t>(sizeof(struct sockaddr_in6));
501  } else {
502  continue;
503  }
504  memcpy(dst_addrs->addrs[dst_addrs->naddrs].addr.addr, ifa_it->ifa_addr,
505  dst_addrs->addrs[dst_addrs->naddrs].addr.len);
506  GPR_ASSERT(
507  grpc_sockaddr_set_port(&dst_addrs->addrs[dst_addrs->naddrs].addr, 0));
508  test_addr_init_str(&dst_addrs->addrs[dst_addrs->naddrs]);
509  ++dst_addrs->naddrs;
510  }
511  freeifaddrs(ifa);
512  ifa = nullptr;
513 
514  /* Connect to same addresses as listeners. */
515  test_connect(1, nullptr, nullptr, false);
516  test_connect(10, nullptr, nullptr, false);
517 
518  /* Set dst_addrs->addrs[i].len=0 for dst_addrs that are unreachable with a
519  "::" listener. */
520  test_connect(1, nullptr, dst_addrs, true);
521 
522  /* Test connect(2) with dst_addrs. */
523  test_connect(1, &channel_args, dst_addrs, false);
524  /* Test connect(2) with dst_addrs. */
525  test_connect(10, &channel_args, dst_addrs, false);
526 
528  grpc_schedule_on_exec_ctx);
529  grpc_pollset_shutdown(g_pollset, &destroyed);
530  }
531  grpc_shutdown();
532  gpr_free(dst_addrs);
534  return EXIT_SUCCESS;
535 }
536 
537 #else /* GRPC_POSIX_SOCKET_SERVER */
538 
539 int main(int argc, char** argv) { return 1; }
540 
541 #endif /* GRPC_POSIX_SOCKET_SERVER */
grpc_pollset_worker
struct grpc_pollset_worker grpc_pollset_worker
Definition: pollset.h:39
GRPC_CLOSURE_INIT
#define GRPC_CLOSURE_INIT(closure, cb, cb_arg, scheduler)
Definition: closure.h:115
grpc_arg
Definition: grpc_types.h:103
xds_interop_client.str
str
Definition: xds_interop_client.py:487
_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_pollset_size
size_t grpc_pollset_size(void)
Definition: pollset.cc:56
iomgr.h
dst
static const char dst[]
Definition: test-fs-copyfile.c:37
gpr_mu_unlock
GPRAPI void gpr_mu_unlock(gpr_mu *mu)
GRPC_ERROR_NONE
#define GRPC_ERROR_NONE
Definition: error.h:234
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
sockaddr_utils.h
AF_INET6
#define AF_INET6
Definition: ares_setup.h:208
generate.env
env
Definition: generate.py:37
GRPC_ARG_INTEGER
@ GRPC_ARG_INTEGER
Definition: grpc_types.h:81
grpc_arg::value
union grpc_arg::grpc_arg_value value
memset
return memset(p, 0, total)
GRPC_ARG_EXPAND_WILDCARD_ADDRS
#define GRPC_ARG_EXPAND_WILDCARD_ADDRS
Definition: grpc_types.h:301
server_fd
static uv_os_fd_t server_fd
Definition: test-poll-oob.c:39
grpc_tcp_server_port_fd_count
unsigned grpc_tcp_server_port_fd_count(grpc_tcp_server *s, unsigned port_index)
Definition: tcp_server.cc:48
string.h
grpc_core::Timestamp
Definition: src/core/lib/gprpp/time.h:62
gpr_free
GPRAPI void gpr_free(void *ptr)
Definition: alloc.cc:51
resolve_address.h
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
error_ref_leak.err
err
Definition: error_ref_leak.py:35
grpc_resolved_address
Definition: resolved_address.h:34
tcp
static uv_tcp_t tcp
Definition: test-connection-fail.c:29
grpc_tcp_server_acceptor::fd_index
unsigned fd_index
Definition: tcp_server.h:42
grpc_tcp_server
Definition: tcp_server_utils_posix.h:53
grpc_pollset_work
grpc_error_handle grpc_pollset_work(grpc_pollset *pollset, grpc_pollset_worker **worker, grpc_core::Timestamp deadline)
Definition: pollset.cc:45
absl::FormatConversionChar::s
@ s
GRPC_LOG_IF_ERROR
#define GRPC_LOG_IF_ERROR(what, error)
Definition: error.h:398
time.h
xds_manager.p
p
Definition: xds_manager.py:60
grpc_sockaddr_to_string
absl::StatusOr< std::string > grpc_sockaddr_to_string(const grpc_resolved_address *resolved_addr, bool normalize)
Definition: sockaddr_utils.cc:194
grpc_tcp_server_unref
void grpc_tcp_server_unref(grpc_tcp_server *s)
Definition: tcp_server.cc:67
g_pollset
static grpc_pollset * g_pollset
Definition: endpoint_pair_test.cc:31
grpc_channel_args
Definition: grpc_types.h:132
gen_build_yaml.struct
def struct(**kwargs)
Definition: test/core/end2end/gen_build_yaml.py:30
grpc_pollset_init
void grpc_pollset_init(grpc_pollset *pollset, gpr_mu **mu)
Definition: pollset.cc:33
grpc_tcp_server_ref
grpc_tcp_server * grpc_tcp_server_ref(grpc_tcp_server *s)
Definition: tcp_server.cc:58
grpc_tcp_server_start
void grpc_tcp_server_start(grpc_tcp_server *server, const std::vector< grpc_pollset * > *pollsets, grpc_tcp_server_cb on_accept_cb, void *cb_arg)
Definition: tcp_server.cc:31
gpr_zalloc
GPRAPI void * gpr_zalloc(size_t size)
Definition: alloc.cc:40
memory.h
server
std::unique_ptr< Server > server
Definition: channelz_service_test.cc:330
memcpy
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
grpc_tcp_server_add_port
grpc_error_handle grpc_tcp_server_add_port(grpc_tcp_server *s, const grpc_resolved_address *addr, int *out_port)
Definition: tcp_server.cc:37
GRPC_OS_ERROR
#define GRPC_OS_ERROR(err, call_name)
create an error associated with errno!=0 (an 'operating system' error)
Definition: error.h:352
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
sockaddr_in6
Definition: ares_ipv6.h:25
grpc_core::CoreConfiguration::Get
static const CoreConfiguration & Get()
Definition: core_configuration.h:82
gen_stats_data.c_str
def c_str(s, encoding='ascii')
Definition: gen_stats_data.py:38
grpc_core::ExecCtx::Flush
bool Flush()
Definition: exec_ctx.cc:69
ifaddrs::ifa_addr
struct sockaddr * ifa_addr
Definition: android-ifaddrs.h:33
grpc_sockaddr_set_port
int grpc_sockaddr_set_port(grpc_resolved_address *resolved_addr, int port)
Definition: sockaddr_utils.cc:324
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
worker
Definition: worker.py:1
gpr_sleep_until
GPRAPI void gpr_sleep_until(gpr_timespec until)
grpc.h
grpc_core::ChannelArgs::ToC
const grpc_channel_args * ToC() const
Definition: channel_args.cc:94
grpc_channel_args_destroy
void grpc_channel_args_destroy(grpc_channel_args *a)
Definition: channel_args.cc:360
grpc_channel_args::num_args
size_t num_args
Definition: grpc_types.h:133
arg
Definition: cmdline.cc:40
time.h
close
#define close
Definition: test-fs.c:48
gpr_mu_lock
GPRAPI void gpr_mu_lock(gpr_mu *mu)
grpc_resolved_address::len
socklen_t len
Definition: resolved_address.h:36
error.h
grpc_endpoint_shutdown
void grpc_endpoint_shutdown(grpc_endpoint *ep, grpc_error_handle why)
Definition: endpoint.cc:49
grpc_tcp_server_port_fd
int grpc_tcp_server_port_fd(grpc_tcp_server *s, unsigned port_index, unsigned fd_index)
Definition: tcp_server.cc:53
test_no_op
static void test_no_op(grpc_end2end_test_config config)
Definition: no_op.cc:86
grpc_tcp_server_acceptor::from_server
grpc_tcp_server * from_server
Definition: tcp_server.h:39
GPR_ERROR
#define GPR_ERROR
Definition: include/grpc/impl/codegen/log.h:57
min
#define min(a, b)
Definition: qsort.h:83
grpc_pick_unused_port_or_die
int grpc_pick_unused_port_or_die(void)
grpc_endpoint_destroy
void grpc_endpoint_destroy(grpc_endpoint *ep)
Definition: endpoint.cc:53
grpc_pollset_kick
grpc_error_handle grpc_pollset_kick(grpc_pollset *pollset, grpc_pollset_worker *specific_worker)
Definition: pollset.cc:51
grpc_core::CoreConfiguration::channel_args_preconditioning
const ChannelArgsPreconditioning & channel_args_preconditioning() const
Definition: core_configuration.h:139
grpc_core::ExecCtx
Definition: exec_ctx.h:97
on_connect
void on_connect(uv_connect_t *req, int status)
Definition: libuv/docs/code/dns/main.c:32
GRPC_ERROR_CREATE_FROM_STATIC_STRING
#define GRPC_ERROR_CREATE_FROM_STATIC_STRING(desc)
Definition: error.h:291
tests.unit._exit_scenarios.port
port
Definition: _exit_scenarios.py:179
test_config.h
grpc_tcp_server_acceptor::port_index
unsigned port_index
Definition: tcp_server.h:41
g_mu
static gpr_mu g_mu
Definition: iomgr.cc:55
absl::Now
ABSL_NAMESPACE_BEGIN Time Now()
Definition: abseil-cpp/absl/time/clock.cc:39
destroy_pollset
static void destroy_pollset(void *p, grpc_error_handle)
Definition: google_default_credentials.cc:199
server
Definition: examples/python/async_streaming/server.py:1
gpr_mu
pthread_mutex_t gpr_mu
Definition: impl/codegen/sync_posix.h:47
grpc_tcp_server_acceptor
Definition: tcp_server.h:36
port.h
exec_ctx
grpc_core::ExecCtx exec_ctx
Definition: end2end_binder_transport_test.cc:75
grpc_error_std_string
std::string grpc_error_std_string(grpc_error_handle error)
Definition: error.cc:944
grpc_pollset_shutdown
void grpc_pollset_shutdown(grpc_pollset *pollset, grpc_closure *closure)
Definition: pollset.cc:37
alloc.h
grpc::testing::TestEnvironment
Definition: test/core/util/test_config.h:54
grpc_arg::key
char * key
Definition: grpc_types.h:105
arg
struct arg arg
grpc_tcp_server_shutdown_starting_add
void grpc_tcp_server_shutdown_starting_add(grpc_tcp_server *s, grpc_closure *shutdown_starting)
Definition: tcp_server.cc:62
grpc_tcp_server_create
grpc_error_handle grpc_tcp_server_create(grpc_closure *shutdown_complete, const grpc_channel_args *args, grpc_tcp_server **server)
Definition: tcp_server.cc:25
GRPC_ERROR_UNREF
#define GRPC_ERROR_UNREF(err)
Definition: error.h:262
LOG_TEST
#define LOG_TEST(x)
Definition: byte_buffer_reader_test.cc:33
ifaddrs
Definition: android-ifaddrs.h:29
GPR_DEBUG
#define GPR_DEBUG
Definition: include/grpc/impl/codegen/log.h:55
test_server.socket
socket
Definition: test_server.py:65
main
int main(int argc, char **argv)
Definition: tcp_server_posix_test.cc:539
ifaddrs::ifa_next
struct ifaddrs * ifa_next
Definition: android-ifaddrs.h:30
absl::StatusOr::value
const T & value() const &ABSL_ATTRIBUTE_LIFETIME_BOUND
Definition: abseil-cpp/absl/status/statusor.h:687
freeifaddrs
void freeifaddrs(struct ifaddrs *ifa)
Definition: android-ifaddrs.c:704
getifaddrs
__BEGIN_DECLS int getifaddrs(struct ifaddrs **ifap)
Definition: android-ifaddrs.c:655
grpc_arg::grpc_arg_value::integer
int integer
Definition: grpc_types.h:108
grpc_init
GRPCAPI void grpc_init(void)
Definition: init.cc:146
grpc_error
Definition: error_internal.h:42
grpc_core::Timestamp::FromTimespecRoundUp
static Timestamp FromTimespecRoundUp(gpr_timespec t)
Definition: src/core/lib/gprpp/time.cc:136
grpc_arg::type
grpc_arg_type type
Definition: grpc_types.h:104
tcp_server.h
grpc_pollset
Definition: bm_cq_multiple_threads.cc:37
grpc_pollset_destroy
void grpc_pollset_destroy(grpc_pollset *pollset)
Definition: pollset.cc:41
sync.h
grpc_closure
Definition: closure.h:56
grpc_resolved_address::addr
char addr[GRPC_MAX_SOCKADDR_SIZE]
Definition: resolved_address.h:35
grpc_endpoint
Definition: endpoint.h:105
grpc_shutdown
GRPCAPI void grpc_shutdown(void)
Definition: init.cc:209
addr
struct sockaddr_in addr
Definition: libuv/docs/code/tcp-echo-server/main.c:10
grpc_core::ChannelArgsPreconditioning::PreconditionChannelArgs
ChannelArgs PreconditionChannelArgs(const grpc_channel_args *args) const
Definition: channel_args_preconditioning.cc:34
errno.h
grpc_core::ExecCtx::Get
static ExecCtx * Get()
Definition: exec_ctx.h:205
tcp_connect
Definition: tcp_connect.py:1
api.h


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